From bce60a59b1d12a66c38164633f7358b6ca19e78b Mon Sep 17 00:00:00 2001 From: tiampersian Date: Tue, 31 Oct 2023 09:44:42 +0330 Subject: [PATCH 1/4] Update date-input.component.ts --- .../src/lib/components/date-input.component.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/date-input.component.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/date-input.component.ts index df8ba5a..dd994a6 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/date-input.component.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/date-input.component.ts @@ -340,6 +340,8 @@ function setInputValue(localeId: string) { this.renderer.setProperty(this.inputElement, 'value', result.format(format.toMomentDateTimeFormat())); return; } + + this.renderer.setProperty(this.inputElement, 'value', result.format(format.toMomentDateTimeFormat())); } From af5624b3563c51082515f11fc98b9f303b8cf6cc Mon Sep 17 00:00:00 2001 From: tiampersian Date: Tue, 31 Oct 2023 15:50:33 +0330 Subject: [PATCH 2/4] fix with 13.1.0 --- angular.json | 6 +- package.json | 29 +-- .../kendo-jalali-date-inputs/package.json | 17 +- .../lib/components/date-input.component.ts | 13 +- ...alali-header-title-template.component.scss | 6 + ...-jalali-header-title-template.component.ts | 2 +- .../src/lib/dayjs-jalali.ts | 233 ++++++++++++++++++ .../lib/kendo-jalali-date-inputs.module.ts | 23 ++ .../src/lib/providers.ts | 2 +- .../src/lib/services/century-view.service.ts | 11 +- .../src/lib/services/decade-view.service.ts | 10 +- .../lib/services/jalali-month-view.service.ts | 128 ++++++++++ .../src/lib/services/locale.service.ts | 8 + .../src/lib/services/moment-numbers.ts | 15 +- .../src/lib/services/month-view.service.ts | 126 +--------- .../src/lib/services/utils.ts | 45 ++-- .../src/lib/services/year-view.services.ts | 32 +-- src/app/app.component.html | 4 +- src/app/app.component.spec.ts | 6 +- src/app/app.component.ts | 2 +- src/app/app.module.ts | 2 +- src/app/dateinput.component.spec.page.ts | 2 - src/app/dateinput.component.spec.ts | 111 +++++---- src/assets/screenshot.png | Bin 131190 -> 131565 bytes 24 files changed, 567 insertions(+), 266 deletions(-) create mode 100644 projects/tiampersian/kendo-jalali-date-inputs/src/lib/dayjs-jalali.ts create mode 100644 projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-month-view.service.ts diff --git a/angular.json b/angular.json index e13e090..04c356e 100644 --- a/angular.json +++ b/angular.json @@ -33,7 +33,8 @@ ], "scripts": [], "allowedCommonJsDependencies": [ - "jalali-moment" + "jalali-moment", + "dayjs" ] }, "configurations": { @@ -81,7 +82,8 @@ "serve": { "builder": "@angular-devkit/build-angular:dev-server", "options": { - "browserTarget": "tiampersian:build" + "browserTarget": "tiampersian:build", + "disableHostCheck": true }, "configurations": { "production": { diff --git a/package.json b/package.json index 74253ee..3ead29e 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "build:ci": "ng build @tiampersian/kendo-jalali-date-inputs", "test:ci": "ng test tiampersian --browsers=ChromeHeadless --watch=false", "build:app:ci": "ng build", + "start:state": "webpack-bundle-analyzer dist/kendo-jalali-date-inputs/stats.json", "publish": "npm publish dist/tiampersian/kendo-jalali-date-inputs --access public" }, "private": false, @@ -27,23 +28,23 @@ "@angular/platform-browser": "16.1.4", "@angular/platform-browser-dynamic": "16.1.4", "@angular/router": "16.1.4", - "@progress/kendo-angular-buttons": "13.1.0", - "@progress/kendo-angular-common": "13.1.0", - "@progress/kendo-angular-dateinputs": "13.1.0", - "@progress/kendo-angular-dialog": "13.1.0", - "@progress/kendo-angular-icons": "13.1.0", - "@progress/kendo-angular-inputs": "13.1.0", - "@progress/kendo-angular-intl": "13.1.0", - "@progress/kendo-angular-l10n": "13.1.0", - "@progress/kendo-angular-navigation": "13.1.0", - "@progress/kendo-angular-popup": "13.1.0", + "@progress/kendo-angular-buttons": "13.3.0", + "@progress/kendo-angular-common": "13.3.0", + "@progress/kendo-angular-dateinputs": "13.3.0", + "@progress/kendo-angular-dialog": "13.3.0", + "@progress/kendo-angular-icons": "13.3.0", + "@progress/kendo-angular-inputs": "13.3.0", + "@progress/kendo-angular-intl": "13.3.0", + "@progress/kendo-angular-l10n": "13.3.0", + "@progress/kendo-angular-navigation": "13.3.0", + "@progress/kendo-angular-popup": "13.3.0", "@progress/kendo-drawing": "1.17.5", "@progress/kendo-licensing": "1.3.0", "@progress/kendo-svg-icons": "1.6.0", "@progress/kendo-theme-default": "6.5.0", - "dayjs-jalali": "^0.0.2", - "jalali-moment": "3.3.11", - "moment-timezone": "0.5.43", + "dayjs": "*", + "dayjs-jalali": "*", + "jalaliday": "*", "rxjs": "7.8.1", "tslib": "2.6.0", "zone.js": "0.13.1" @@ -70,4 +71,4 @@ "optionalDependencies": { "puppeteer": "14.3.0" } -} +} \ No newline at end of file diff --git a/projects/tiampersian/kendo-jalali-date-inputs/package.json b/projects/tiampersian/kendo-jalali-date-inputs/package.json index 23834dc..3df21b2 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/package.json +++ b/projects/tiampersian/kendo-jalali-date-inputs/package.json @@ -1,12 +1,12 @@ { "name": "@tiampersian/kendo-jalali-date-inputs", - "version": "0.1.343", + "version": "0.1.334", "license": "MIT", "description": "angular jalali ( persian ) date time picker base on kendo-angular-dateinputs ", "homepage": "https://github.com/tiampersian/kendo-jalali-date-inputs", "bugs": "https://github.com/tiampersian/kendo-jalali-date-inputs/issues", "peerDependencies": { - "@progress/kendo-licensing": "1.3.0", + "@progress/kendo-licensing": "*", "@angular/common": "8 - 16", "@angular/localize": "8 - 16", "@angular/core": "8 - 16" @@ -44,12 +44,13 @@ "url": "https://github.com/tiampersian/kendo-jalali-date-inputs" }, "dependencies": { - "@progress/kendo-angular-common": "13.1.0", - "@progress/kendo-angular-dateinputs": "13.1.0", - "@progress/kendo-angular-intl": "13.1.0", - "@progress/kendo-angular-l10n": "13.1.0", - "@progress/kendo-angular-popup": "13.1.0", - "jalali-moment": "3.3.11", + "@progress/kendo-angular-common": "13.3.0", + "@progress/kendo-angular-dateinputs": "13.3.0", + "@progress/kendo-angular-intl": "13.3.0", + "@progress/kendo-angular-l10n": "13.3.0", + "@progress/kendo-angular-popup": "13.3.0", + "dayjs": "1.11.10", + "jalaliday":"2.3.0", "tslib": "^2.4.0" }, "scripts": { diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/date-input.component.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/date-input.component.ts index dd994a6..15ca7f8 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/date-input.component.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/date-input.component.ts @@ -1,5 +1,6 @@ import { DateInputComponent } from '@progress/kendo-angular-dateinputs'; -import moment, { Moment } from 'jalali-moment'; +import dayjs, * as moment from 'dayjs'; +import { Dayjs } from 'dayjs'; import { JalaliCldrIntlService } from '../services/locale.service'; import { reverseString } from '../services/moment-numbers'; import { isPresent } from '../services/utils'; @@ -122,6 +123,7 @@ function dateFormatString(date, format): { format: string, symbol: string } { const partSymbols = []; for (let i = 0; i < dateFormatParts.length; i++) { let partLength = getValue.call(this, date)?.format(dateFormatParts[i].pattern?.toMomentDateTimeFormat()).length || 0; + // let partLength = dayjs(date)?.format(dateFormatParts[i].pattern?.toMomentDateTimeFormat()).length || 0; while (partLength > 0) { parts.push(this.kendoDate.symbols[dateFormatParts[i].pattern[0]] || dateFormatParts[i].pattern[0] || "_"); partSymbols.push(this.kendoDate.symbols[dateFormatParts[i].pattern[0]] || "_"); @@ -225,7 +227,7 @@ function prepareDiffInJalaliMode(intl: JalaliCldrIntlService, diff: any[]) { } }); } -const MIN_JALALI_DATE = moment.from('0000-01-01', 'fa', 'YYYY/MM/DD'); +const MIN_JALALI_DATE = dayjs('0000-01-01', 'YYYY/MM/DD', 'fa'); function prepareYearValue(diff: any[], dt) { diff[2] = false @@ -340,16 +342,13 @@ function setInputValue(localeId: string) { this.renderer.setProperty(this.inputElement, 'value', result.format(format.toMomentDateTimeFormat())); return; } - - this.renderer.setProperty(this.inputElement, 'value', result.format(format.toMomentDateTimeFormat())); } -function getValue(value: Date | string, localeId?: string): Moment { +function getValue(value: Date | string, localeId?: string): Dayjs { if (!value) { return null; } - let formatter = (localeId || this.intl.localeIdByDatePickerType) == 'fa' ? 'doAsJalali' : 'doAsGregorian'; - return moment(value).locale(this.intl.localeId)[formatter](); + return dayjs(value).calendar(this.intl.calendarType).locale(localeId || this.intl.locale); } diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.scss b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.scss index 54e477e..fe0d79a 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.scss +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.scss @@ -1,6 +1,12 @@ ::ng-deep { .k-calendar { direction: ltr; + kendo-virtualization.k-flex.k-content.k-scrollable { + --kendo-scrollbar-width: -15px; + } + kendo-calendar-navigation kendo-virtualization.k-flex.k-content.k-scrollable { + --kendo-scrollbar-width: 0px; + } } .k-calendar-title { diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.ts index bcf54ca..d01b9e9 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.ts @@ -7,7 +7,7 @@ import { DatePickerType, JalaliCldrIntlService } from '../../services/locale.ser template: ` {{title}} - diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/dayjs-jalali.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/dayjs-jalali.ts new file mode 100644 index 0000000..9aed7da --- /dev/null +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/dayjs-jalali.ts @@ -0,0 +1,233 @@ +import * as dayjs from 'dayjs' +import localeData from 'dayjs/plugin/localeData'; +dayjs.extend(localeData); + +import JALALI from 'jalaali-js' + +const jalaliEnLocale = { + name: 'en', + months: ["Farvardin" + , "Ordibehesht" + , "Khordaad" + , "Tir" + , "Mordaad" + , "Shahrivar" + , "Mehr" + , "Aabaan" + , "Aazar" + , "Dey" + , "Bahman" + , "Esfand" + ], + "weekStart": 1, + + + monthsShort: ["Far" + , "Ord" + , "Kho" + , "Tir" + , "Amo" + , "Sha" + , "Meh" + , "Aab" + , "Aaz" + , "Dey" + , "Bah" + , "Esf" + ] +}; + +const gregorianFaLocale = { + "name": "fa", + "weekdays": [ + "یک‌شنبه", + "دوشنبه", + "سه‌شنبه", + "چهارشنبه", + "پنج‌شنبه", + "جمعه", + "شنبه" + ], + "weekdaysShort": [ + "یک‌شنبه", + "دوشنبه", + "سه‌شنبه", + "چهارشنبه", + "پنج‌شنبه", + "جمعه", + "شنبه" + ], + "weekdaysMin": [ + "ی", + "د", + "س", + "چ", + "پ", + "ج", + "ش" + ], + "weekStart": 6, + "months": [ + "ژانویه", + "فوریه", + "مارس", + "آوریل", + "مه", + "ژوئن", + "ژوئیه", + "اوت", + "سپتامبر", + "اکتبر", + "نوامبر", + "دسامبر" + ], + "monthsShort": [ + "ژانویه", + "فوریه", + "مارس", + "آوریل", + "مه", + "ژوئن", + "ژوئیه", + "اوت", + "سپتامبر", + "اکتبر", + "نوامبر", + "دسامبر" + ], + "formats": { + "LT": "HH:mm", + "LTS": "HH:mm:ss", + "L": "DD/MM/YYYY", + "LL": "D MMMM YYYY", + "LLL": "D MMMM YYYY HH:mm", + "LLLL": "dddd, D MMMM YYYY HH:mm" + }, + "relativeTime": { + "future": "در %s", + "past": "%s پیش", + "s": "چند ثانیه", + "m": "یک دقیقه", + "mm": "%d دقیقه", + "h": "یک ساعت", + "hh": "%d ساعت", + "d": "یک روز", + "dd": "%d روز", + "M": "یک ماه", + "MM": "%d ماه", + "y": "یک سال", + "yy": "%d سال" + } +}; + +const jalaliFaLocale = { + name: 'fa', + weekdays: 'یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه'.split('_'), + weekdaysShort: 'یک‌_دو_سه‌_چه_پن_جم_شن'.split('_'), + weekdaysMin: 'ی‌_د_س‌_چ_پ_ج_ش'.split('_'), + months: 'فروردین_اردیبهشت_خرداد_تیر_مرداد_شهریور_مهر_آبان_آذر_دی_بهمن_اسفند'.split('_'), + monthsShort: 'فروردین_اردیبهشت_خرداد_تیر_مرداد_شهریور_مهر_آبان_آذر_دی_بهمن_اسفند'.split('_'), + oridinal: n => `${n}ام`, + relativeTime: { + future: 'در %s', + past: '%s قبل', + s: 'چند ثانیه', + m: 'یک دقیقه', + mm: '%d دقیقه', + h: 'یک ساعت', + hh: '%d ساعت', + d: 'یک روز', + dd: '%d روز', + M: 'یک ماه', + MM: '%d ماه', + y: 'یک سال', + yy: '%d سال' + } +} + +const REGEX_PARSE = /^(\d{4})\D?(0[1-9]|1[0-2])\D?([12]\d|0[1-9]|3[01])(\D?([01]\d|2[0-3])\D?([0-5]\d)\D?([0-5]\d)?\D?(\d{3})?([zZ]|([+-])([01]\d|2[0-3])\D?([0-5]\d)?)?)?$/ +const REGEX_FORMAT = /\[.*?\]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g + +function xxx(options, dayjsClass, dayjsFactory) { + const classProto = dayjsClass.prototype; + + const oldFormat = classProto.format; + const oldParse = classProto.parse; + let isJalali = false; + classProto.doAsJalali = function (name) { + if (name === 'fa') { + dayjsFactory.locale(jalaliFaLocale, null, true); + } else { + dayjsFactory.locale(jalaliEnLocale, null, true); + } + + isJalali = true; + return this; + } + classProto.doAsGregorian = function (name) { + if (name === 'fa') { + dayjsFactory.locale(gregorianFaLocale, null, true); + } + isJalali = false; + return this; + } + + classProto.parse = function (cfg) { + cfg.date = cfg.date || new Date() + const { date, jalali } = cfg + + if (jalali) { + if ((typeof date === 'string') && (/.*$/i.test(date))) { + const reg = date.match(REGEX_PARSE) + if (reg) { + const [, year, month, day, time] = reg + const { gy, gm, gd } = JALALI.toGregorian(Number(year), Number(month), Number(day)) + cfg.date = `${gy}-${String(gm).padStart(2, '0')}-${String(gd).padStart(2, '0')}${time || ''}` + } + } + } + + return oldParse.bind(this)(cfg) + } + + classProto.format = function (formatStr) { + const locale = this.$locale() + const fff = gregorianFaLocale; + if (isJalali || locale.name === 'fa') { + const str = formatStr || 'YYYY-MM-DDTHH:mm:ssZ' + const { jy: year, jm: month, jd: day } = JALALI.toJalaali(this.$y, this.$M + 1, this.$D) + const getShort = (arr, index, full, length) => ( + (arr && arr[index]) || full[index].substr(0, length) + ) + + formatStr = str.replace(REGEX_FORMAT, (match) => { + switch (match) { + case 'YY': + return String(year).slice(-2) + case 'YYYY': + return String(year) + case 'M': + return String(month) + case 'MM': + return String(month).padStart(2, '0') + case 'MMM': + return getShort(locale.monthsShort, month - 1, locale.months, 3) + case 'MMMM': + return locale.months[month - 1] + case 'D': + return String(day) + case 'DD': + return String(day).padStart(2, '0') + default: + return match + } + }); + + // return formatStr; + } + + return oldFormat.bind(this)(formatStr) + } +} + +dayjs.extend(xxx as any); diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/kendo-jalali-date-inputs.module.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/kendo-jalali-date-inputs.module.ts index cfddecb..e051414 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/kendo-jalali-date-inputs.module.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/kendo-jalali-date-inputs.module.ts @@ -8,6 +8,29 @@ import { IConfig } from './models/config.model'; import { NumberPipe } from './pipes/number.pipe'; import { Providers } from './providers'; import { MomentNumberService } from './services/moment-numbers'; +import dayjs, { GlobalLocaleDataReturn } from 'dayjs' +import utc from 'dayjs/plugin/utc'; +import timezone from 'dayjs/plugin/timezone'; +import isBetween from 'dayjs/plugin/isBetween'; +import customParseFormat from 'dayjs/plugin/customParseFormat'; +import localeData from 'dayjs/plugin/localeData'; +import jalaliday from 'jalaliday'; + +dayjs.extend(jalaliday); +dayjs.extend(customParseFormat); +dayjs.extend(utc); +dayjs.extend(timezone); +dayjs.extend(isBetween); +dayjs.extend(localeData); +if (typeof window !== 'undefined') { + window['dayjs'] = dayjs; +} +// debugger +// const oldLocaleData = dayjs.prototype.localeData as () => GlobalLocaleDataReturn; +// dayjs.prototype.localeData = function (a) { +// debugger +// return oldLocaleData.call(this) +// }; setData({ name: "fa", diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/providers.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/providers.ts index 8180259..f63711d 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/providers.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/providers.ts @@ -4,7 +4,7 @@ import { HeaderTitleTemplateFactory } from './HeaderTitleTemplateFactory'; import { JalaliCenturyViewService } from './services/century-view.service'; import { JalaliDecadeViewService } from './services/decade-view.service'; import { JalaliCldrIntlService } from './services/locale.service'; -import { JalaliMonthViewService } from './services/month-view.service'; +import { JalaliMonthViewService } from './services/jalali-month-view.service'; import { JalaliWeekNamesService } from './services/week-names.service'; import { JalaliYearViewService } from './services/year-view.services'; diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/century-view.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/century-view.service.ts index 5513d6b..af1b638 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/century-view.service.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/century-view.service.ts @@ -1,7 +1,7 @@ import { Inject, Injectable } from '@angular/core'; import { IntlService } from '@progress/kendo-angular-intl'; import { addCenturies, addDecades, cloneDate, createDate, durationInCenturies, lastDayOfMonth, lastMonthOfYear, lastYearOfDecade } from '@progress/kendo-date-math'; -import moment from 'jalali-moment'; +import moment from 'dayjs'; import { JalaliCldrIntlService } from './locale.service'; import { Action, EMPTY_SELECTIONRANGE, firstDecadeOfCentury, firstYearOfDecade, getToday, isInRange, isInSelectionRange, isPresent, lastDecadeOfCentury, range } from './utils'; const EMPTY_DATA = [[]]; @@ -176,11 +176,12 @@ export class JalaliCenturyViewService extends CenturyViewService { return ''; } - const temp = moment(lastDecadeOfCentury(current, this.intlService.localeIdByDatePickerType)).locale(this.intlService.localeIdByDatePickerType).format('YYYY'); - return `${moment(firstDecadeOfCentury(current, this.intlService.localeIdByDatePickerType)).locale(this.intlService.localeIdByDatePickerType).format('YYYY')} - ${temp}`; + const temp = moment(lastDecadeOfCentury(current, this.intlService.localeIdByDatePickerType)).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY'); + return `${moment(firstDecadeOfCentury(current, this.intlService.localeIdByDatePickerType)).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY')} - ${temp}`; } + navigationTitle(value) { - return `${moment(firstDecadeOfCentury(value, this.intlService.localeIdByDatePickerType)).locale(this.intlService.localeIdByDatePickerType).format('YYYY')}`; + return `${moment(firstDecadeOfCentury(value, this.intlService.localeIdByDatePickerType)).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY')}`; } @@ -205,7 +206,7 @@ export class JalaliCenturyViewService extends CenturyViewService { const isRangeEnd = this.isEqual(cellDate, selectionRange.end); const isInMiddle = !isRangeStart && !isRangeEnd; const isRangeMid = isInMiddle && isInSelectionRange(cellDate, selectionRange); - const title = moment(cellDate).locale(this.intlService.localeIdByDatePickerType).format('YYYY'); + const title = moment(cellDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY'); return { formattedValue: title, diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/decade-view.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/decade-view.service.ts index d51eb4a..01e090d 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/decade-view.service.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/decade-view.service.ts @@ -1,7 +1,7 @@ import { Inject, Injectable } from '@angular/core'; import { CldrIntlService, IntlService } from '@progress/kendo-angular-intl'; import { addDecades, addYears, cloneDate, durationInDecades, createDate, lastMonthOfYear, lastDayOfMonth } from '@progress/kendo-date-math'; -import moment from 'jalali-moment'; +import moment from 'dayjs'; import { JalaliCldrIntlService } from './locale.service'; import { Action, EMPTY_SELECTIONRANGE, firstYearOfDecade, getToday, isInRange, isInSelectionRange, isPresent, lastYearOfDecade, range } from './utils'; @@ -175,8 +175,8 @@ export class JalaliDecadeViewService extends DecadeViewService { if (!value) { return ''; } - const firstYear = moment(firstYearOfDecade(value, this.intlService.localeIdByDatePickerType)).locale(this.intlService.localeIdByDatePickerType).format('YYYY'); - const lastYear = moment(lastYearOfDecade(value, this.intlService.localeIdByDatePickerType)).locale(this.intlService.localeIdByDatePickerType).format('YYYY'); + const firstYear = moment(firstYearOfDecade(value, this.intlService.localeIdByDatePickerType)).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY'); + const lastYear = moment(lastYearOfDecade(value, this.intlService.localeIdByDatePickerType)).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY'); if (this.intlService.isLocaleIran) { return `${lastYear} - ${firstYear}`; } @@ -187,7 +187,7 @@ export class JalaliDecadeViewService extends DecadeViewService { if (!value) { return ''; } - return `${moment(firstYearOfDecade(value, this.intlService.localeIdByDatePickerType)).locale(this.intlService.localeIdByDatePickerType).format('YYYY')}`; + return `${moment(firstYearOfDecade(value, this.intlService.localeIdByDatePickerType)).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY')}`; } data(options) { const { cellUID, focusedDate, isActiveView, max, min, selectedDates, selectionRange = EMPTY_SELECTIONRANGE, viewDate } = options; @@ -212,7 +212,7 @@ export class JalaliDecadeViewService extends DecadeViewService { const isRangeEnd = this.isEqual(cellDate, selectionRange.end); const isInMiddle = !isRangeStart && !isRangeEnd; const isRangeMid = isInMiddle && isInSelectionRange(cellDate, selectionRange); - const title = moment(cellDate).locale(this.intlService.localeIdByDatePickerType).format('YYYY'); + const title = moment(cellDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY'); return { formattedValue: title, id: `${cellUID}${cellDate.getTime()}`, diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-month-view.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-month-view.service.ts new file mode 100644 index 0000000..4643b4e --- /dev/null +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-month-view.service.ts @@ -0,0 +1,128 @@ +import { Inject, Injectable } from '@angular/core'; +import { IntlService } from '@progress/kendo-angular-intl'; +import { addDays, addMonths, dayOfWeek, getDate } from '@progress/kendo-date-math'; +import dayjs from 'dayjs'; +import { firstDayOfMonth, getToday, isInSelectionRange, range, lastDayOfMonth } from './utils'; +import { JalaliCldrIntlService } from './locale.service'; +import { MonthViewService, CELLS_LENGTH, EMPTY_DATA, ROWS_LENGTH } from './month-view.service'; + + +@Injectable() +export class JalaliMonthViewService extends MonthViewService { + constructor( + @Inject(IntlService) protected intlService: JalaliCldrIntlService + ) { + super(intlService); + } + + value(current) { + if (!current) { + return ''; + } + const res = dayjs(current).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('DD').toString(); + return res; + } + + abbrMonthNames2() { + if (this.intlService.isJalali) { + return Array.from(Array(12).keys()).map((x, i) => { + return dayjs('' + i, 'M').calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('MMMM'); + }); + } + return dayjs().calendar(this.intlService.calendarType).locale(this.intlService.localeId).localeData().monthsShort(); + } + + navigationTitle(value) { + if (!value) { + return ''; + } + + if (this.isRangeStart(value)) { + return dayjs(value).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY'); + } + + return this.abbrMonthNames2()[dayjs(value).calendar(this.intlService.calendarType).locale(this.intlService.localeId).month()]; + } + + isRangeStart(value) { + if (!value) { return false; } + return dayjs(value).calendar(this.intlService.calendarType).locale(this.intlService.localeId).month() === 0; + } + + title(current) { + return `${this.abbrMonthNames2()[dayjs(current).calendar(this.intlService.calendarType).locale(this.intlService.localeId).month()]} ${dayjs(current).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY')}`; + } + + skip(value, min) { + const diff = dayjs(value).calendar(this.intlService.calendarType).locale(this.intlService.localeId).endOf('month').diff( + dayjs(min).calendar(this.intlService.calendarType).locale(this.intlService.localeId).startOf('month'), 'month' + ); + return diff; + } + rowLength(options = {}) { + return CELLS_LENGTH + (options['prependCell'] ? 1 : 0); + } + total(min, max) { + return dayjs(max).diff(min, 'month') + 1; + } + beginningOfPeriod(date) { + if (!date) { + return date; + } + return dayjs(date).calendar(this.intlService.calendarType).locale(this.intlService.localeId).startOf('month').toDate(); + } + datesList(start, count) { + return range(0, count).map(i => addMonths(start, i)); + } + data(options) { + const { cellUID, focusedDate, isActiveView, max, min, selectedDate, selectionRange = [], viewDate, isDateDisabled = () => false } = options; + if (!viewDate) { + return EMPTY_DATA; + } + const xx = dayjs(viewDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).toDate(); + const firstMonthDate = firstDayOfMonth(xx, this.intlService.localeIdByDatePickerType); + const firstMonthDay = getDate(firstMonthDate); + const lastMonthDate = lastDayOfMonth(xx, this.intlService.localeIdByDatePickerType); + const lastMonthDay = getDate(lastMonthDate); + const backward = -1; + const isSelectedDateInRange = dayjs(selectedDate).isBetween(min, max); + const date = dayOfWeek(firstMonthDate, this.intlService.firstDay(), backward); + const cells = range(0, CELLS_LENGTH); + console.log('console',this.intlService.firstDay()) + const today = getToday(); + return range(0, ROWS_LENGTH).map(rowOffset => { + const baseDate = addDays(date, rowOffset * CELLS_LENGTH); + return cells.map(cellOffset => { + const cellDate = this['normalize'](addDays(baseDate, cellOffset), min, max); + const cellDay = getDate(cellDate); + const otherMonth = cellDay < firstMonthDay || cellDay > lastMonthDay; + const outOfRange = cellDate < min || cellDate > max; + if (outOfRange) { + return null; + } + const isRangeStart = this.isEqual(cellDate, selectionRange.start); + const isRangeEnd = this.isEqual(cellDate, selectionRange.end); + const isInMiddle = !isRangeStart && !isRangeEnd; + const isRangeMid = isInMiddle && isInSelectionRange(cellDate, selectionRange); + return { + formattedValue: this.value(cellDate), + id: `${cellUID}${cellDate.getTime()}`, + isFocused: this.isEqual(cellDate, focusedDate), + isSelected: isActiveView && isSelectedDateInRange && this.isEqual(cellDate, selectedDate), + isWeekend: this.isWeekend(cellDate), + isRangeStart, + isRangeMid, + isRangeEnd, + isRangeSplitStart: isRangeMid && this.isEqual(cellDate, firstMonthDate), + isRangeSplitEnd: isRangeMid && this.isEqual(cellDate, lastMonthDate), + isToday: this.isEqual(cellDate, today), + title: this.cellTitle(cellDate), + value: cellDate, + isDisabled: isDateDisabled(cellDate), + isOtherMonth: otherMonth + }; + }); + }); + } + +} diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/locale.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/locale.service.ts index 1b87bfe..72d6c91 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/locale.service.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/locale.service.ts @@ -5,6 +5,7 @@ import { NumberPipe } from '../pipes/number.pipe'; import { MomentNumberService } from './moment-numbers'; +import dayjs from 'dayjs'; export enum DatePickerType { jalali = 'jalali', gregorian = 'gregorian' @@ -19,6 +20,9 @@ export class JalaliCldrIntlService extends CldrIntlService { get isLocaleIran(): boolean { return this.localeId === 'fa-IR' || this.localeId === 'fa'; } + get calendarType(): any { + return this.localeIdByDatePickerType === 'fa' ? 'jalali' : 'gregory'; + } defaultTitleTemplate: any; $calendarType = new Subject(); isFirst = true; @@ -31,6 +35,10 @@ export class JalaliCldrIntlService extends CldrIntlService { this.changeType(); } + firstDay(localeId?: string): number { + return super.firstDay(this.localeIdByDatePickerType); + } + setTitleTemplate(template): void { this.defaultTitleTemplate = template; } diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/moment-numbers.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/moment-numbers.ts index f80bff8..bc9f899 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/moment-numbers.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/moment-numbers.ts @@ -1,5 +1,5 @@ import { Inject, Injectable, LOCALE_ID } from '@angular/core'; -import moment from 'jalali-moment'; +import dayjs from 'dayjs'; import { IConfig } from '../models/config.model'; declare global { interface String { @@ -21,7 +21,12 @@ String.prototype.toEnNumber = function () { }); }; String.prototype.toMomentDateTimeFormat = function () { - return this.replace(/d/g, 'D').replace(/aa/ig, (m) => m[0]).replace(/_/g, '/'); + let x = this.replace(/d/g, 'D') + .replace(/aa/ig, (m) => m[0]) + .replace(/_/g, '/') + .replace(/[y]{1,}/, 'YYYY'); + + return x; }; String.prototype.revertPersianWord = function () { return this.replace(/(?:(?![٠-٩])[\u0600-\u06FF]){2,}/g, (m) => reverseString(m)); @@ -73,9 +78,9 @@ export class MomentNumberService { return; } const me = this; - moment.localeData().months(); - const te = moment.fn.format; - (moment as any).fn.format = function (format) { + // dayjs.localeData().months(); + const te = dayjs.prototype.format; + dayjs.prototype.format = function (format) { if (!me.usePersianNumber) { return te.call(this, format); diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/month-view.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/month-view.service.ts index 03e36e7..81bdcf7 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/month-view.service.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/month-view.service.ts @@ -1,12 +1,10 @@ -import { Inject, Injectable } from '@angular/core'; -import { CldrIntlService, IntlService } from '@progress/kendo-angular-intl'; +import { CldrIntlService } from '@progress/kendo-angular-intl'; import { addDays, addWeeks, addMonths, cloneDate, dayOfWeek, durationInMonths, getDate, createDate } from '@progress/kendo-date-math'; -import moment from 'jalali-moment'; +import localeData from 'dayjs/plugin/localeData'; import { firstDayOfMonth, getToday, isInSelectionRange, range, lastDayOfMonth, Action, isPresent, EMPTY_SELECTIONRANGE } from './utils'; -import { JalaliCldrIntlService } from './locale.service'; -const EMPTY_DATA = [[]]; -const CELLS_LENGTH = 7; -const ROWS_LENGTH = 6; +export const EMPTY_DATA = [[]]; +export const CELLS_LENGTH = 7; +export const ROWS_LENGTH = 6; const ACTIONS = { [Action.Left]: (date) => addDays(date, -1), [Action.Up]: (date) => addWeeks(date, -1), @@ -182,118 +180,4 @@ export class MonthViewService { } } -@Injectable() -export class JalaliMonthViewService extends MonthViewService { - constructor( - @Inject(IntlService) protected intlService: JalaliCldrIntlService - ) { - super(intlService); - } - - value(current) { - if (!current) { - return ''; - } - const res = moment(current).locale(this.intlService.localeIdByDatePickerType).format('DD').toString(); - return res; - } - - abbrMonthNames2() { - if (this.intlService.isJalali) { - return moment().locale(this.intlService.localeId).localeData().jMonthsShort(); - } - return moment().locale(this.intlService.localeId).localeData().monthsShort(); - } - - navigationTitle(value) { - if (!value) { - return ''; - } - - if (this.isRangeStart(value)) { - return moment(value).locale(this.intlService.localeIdByDatePickerType).format('yyyy'); - } - return this.abbrMonthNames2()[moment(value).locale(this.intlService.localeIdByDatePickerType).month()]; - } - - isRangeStart(value) { - if (!value) { return false; } - return moment(value).locale(this.intlService.localeIdByDatePickerType).month() === 0; - } - title(current) { - return `${this.abbrMonthNames2()[moment(current).locale(this.intlService.localeIdByDatePickerType).month()]} ${moment(current).locale(this.intlService.localeIdByDatePickerType).format('YYYY')}`; - } - - skip(value, min) { - const diff = moment(value).locale(this.intlService.localeIdByDatePickerType).endOf('month').diff( - moment(min).locale(this.intlService.localeIdByDatePickerType).startOf('month'), 'month' - ) - return diff; - } - rowLength(options = {}) { - return CELLS_LENGTH + (options['prependCell'] ? 1 : 0); - } - total(min, max) { - return moment(max).diff(min, 'month') + 1; - } - beginningOfPeriod(date) { - if (!date) { - return date; - } - return moment(date).locale(this.intlService.localeIdByDatePickerType).startOf('month').toDate(); - } - datesList(start, count) { - return range(0, count).map(i => addMonths(start, i)); - } - data(options) { - const { cellUID, focusedDate, isActiveView, max, min, selectedDate, selectionRange = [], viewDate, isDateDisabled = () => false } = options; - if (!viewDate) { - return EMPTY_DATA; - } - const xx = moment(viewDate).locale(this.intlService.localeIdByDatePickerType).toDate(); - const firstMonthDate = firstDayOfMonth(xx, this.intlService.localeIdByDatePickerType); - const firstMonthDay = getDate(firstMonthDate); - const lastMonthDate = lastDayOfMonth(xx, this.intlService.localeIdByDatePickerType); - const lastMonthDay = getDate(lastMonthDate); - const backward = -1; - const isSelectedDateInRange = moment(selectedDate).isBetween(min, max); - const date = dayOfWeek(firstMonthDate, this.intlService.firstDay(), backward); - const cells = range(0, CELLS_LENGTH); - const today = getToday(); - return range(0, ROWS_LENGTH).map(rowOffset => { - const baseDate = addDays(date, rowOffset * CELLS_LENGTH); - return cells.map(cellOffset => { - const cellDate = this['normalize'](addDays(baseDate, cellOffset), min, max); - const cellDay = getDate(cellDate); - const otherMonth = cellDay < firstMonthDay || cellDay > lastMonthDay; - const outOfRange = cellDate < min || cellDate > max; - if (outOfRange) { - return null; - } - const isRangeStart = this.isEqual(cellDate, selectionRange.start); - const isRangeEnd = this.isEqual(cellDate, selectionRange.end); - const isInMiddle = !isRangeStart && !isRangeEnd; - const isRangeMid = isInMiddle && isInSelectionRange(cellDate, selectionRange); - return { - formattedValue: this.value(cellDate), - id: `${cellUID}${cellDate.getTime()}`, - isFocused: this.isEqual(cellDate, focusedDate), - isSelected: isActiveView && isSelectedDateInRange && this.isEqual(cellDate, selectedDate), - isWeekend: this.isWeekend(cellDate), - isRangeStart, - isRangeMid, - isRangeEnd, - isRangeSplitStart: isRangeMid && this.isEqual(cellDate, firstMonthDate), - isRangeSplitEnd: isRangeMid && this.isEqual(cellDate, lastMonthDate), - isToday: this.isEqual(cellDate, today), - title: this.cellTitle(cellDate), - value: cellDate, - isDisabled: isDateDisabled(cellDate), - isOtherMonth: otherMonth - }; - }); - }); - } - -} diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/utils.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/utils.ts index cd64d9e..1aef168 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/utils.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/utils.ts @@ -1,5 +1,5 @@ import { getDate } from '@progress/kendo-date-math'; -import moment from 'jalali-moment'; +import moment from 'dayjs'; export const range = (start, end, step = 1) => { const result = []; @@ -22,18 +22,18 @@ export const isInRange = (dt, min, max) => { return moment(dt).isBetween(min, max); } export const firstYearOfDecade = (dt, localeId?) => { - const year = moment(dt).locale(localeId||'en').year(); - return moment(dt).locale(localeId||'en').add(-(year % 10), 'year').toDate(); + const year = moment(dt).calendar(getCalendarType(localeId)).year(); + return moment(dt).calendar(getCalendarType(localeId)).add(-(year % 10), 'year').toDate(); } export const lastYearOfDecade = (dt, localeId?) => { - const year = moment(dt).locale(localeId||'en').year(); - return moment(dt).locale(localeId||'en').add((9 - (year % 10)), 'year').toDate(); + const year = moment(dt).calendar(getCalendarType(localeId)).year(); + return moment(dt).calendar(getCalendarType(localeId)).add((9 - (year % 10)), 'year').toDate(); } export const firstDayOfMonth = (dt, localeId?) => { - return moment(dt).locale(localeId||'en').startOf('month').toDate(); + return moment(dt).calendar(getCalendarType(localeId)).startOf('month').toDate(); } export const lastDayOfMonth = (dt, localeId?) => { - return moment(dt).locale(localeId||'en').endOf('month').toDate(); + return moment(dt).calendar(getCalendarType(localeId)).endOf('month').toDate(); } // export const addMonths2 = (date, offset) => { // var newDate = moment(date).toDate(); @@ -42,13 +42,16 @@ export const lastDayOfMonth = (dt, localeId?) => { // newDate.setMonth(newDate.getMonth() + offset); // return normalize(adjust_dst_1.adjustDST(newDate, date.getHours()), expectedMonth); // }; +export const getCalendarType = (localeId: string) => { + return (localeId === 'fa' || localeId === 'fa-IR') ? 'jalali' : 'gregory'; +} export const firstDecadeOfCentury = (dt, localeId?) => { - const x = moment(dt).locale(localeId||'en').year(); - return moment(dt).locale(localeId||'en').add((-(x % 100)) , 'year').toDate(); + const x = moment(dt).calendar(getCalendarType(localeId)).year(); + return moment(dt).calendar(getCalendarType(localeId)).add((-(x % 100)), 'year').toDate(); } export const lastDecadeOfCentury = (dt, localeId?) => { - const x = moment(dt).locale(localeId||'en').year(); - return moment(dt).locale(localeId||'en').add((-(x % 100)) + 90, 'year').toDate(); + const x = moment(dt).calendar(getCalendarType(localeId)).year(); + return moment(dt).calendar(getCalendarType(localeId)).add((-(x % 100)) + 90, 'year').toDate(); } @@ -56,15 +59,15 @@ export const shiftWeekNames = (names, offset) => (names.slice(offset).concat(nam export var Action; (function (Action) { - Action[Action["Left"] = 0] = "Left"; - Action[Action["Right"] = 1] = "Right"; - Action[Action["Up"] = 2] = "Up"; - Action[Action["Down"] = 3] = "Down"; - Action[Action["PrevView"] = 4] = "PrevView"; - Action[Action["NextView"] = 5] = "NextView"; - Action[Action["FirstInView"] = 6] = "FirstInView"; - Action[Action["LastInView"] = 7] = "LastInView"; - Action[Action["LowerView"] = 8] = "LowerView"; - Action[Action["UpperView"] = 9] = "UpperView"; + Action[Action["Left"] = 0] = "Left"; + Action[Action["Right"] = 1] = "Right"; + Action[Action["Up"] = 2] = "Up"; + Action[Action["Down"] = 3] = "Down"; + Action[Action["PrevView"] = 4] = "PrevView"; + Action[Action["NextView"] = 5] = "NextView"; + Action[Action["FirstInView"] = 6] = "FirstInView"; + Action[Action["LastInView"] = 7] = "LastInView"; + Action[Action["LowerView"] = 8] = "LowerView"; + Action[Action["UpperView"] = 9] = "UpperView"; })(Action || (Action = {})); export const isPresent = (value) => value !== undefined && value !== null; diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/year-view.services.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/year-view.services.ts index 0bb5e18..cb3444e 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/year-view.services.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/year-view.services.ts @@ -1,6 +1,7 @@ import { Inject, Injectable } from '@angular/core'; import { CldrIntlService, IntlService } from '@progress/kendo-angular-intl'; -import moment from 'jalali-moment'; +import dayjs from 'dayjs'; + import { JalaliCldrIntlService } from './locale.service'; import { Action, EMPTY_SELECTIONRANGE, getToday, isInSelectionRange, isPresent, range } from './utils'; import { addMonths, addYears, cloneDate, createDate, durationInYears, firstMonthOfYear, lastDayOfMonth, lastMonthOfYear } from '@progress/kendo-date-math'; @@ -194,9 +195,12 @@ export class JalaliYearViewService extends YearViewService { abbrMonthNames2() { if (this.intlService.isJalali) { - return moment().locale(this.intlService.localeId).localeData().jMonthsShort(); + return Array.from(Array(12).keys()).map((x, i) => { + return dayjs('' + i, 'M').calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('MMMM'); + }); } - return moment().locale(this.intlService.localeId).localeData().monthsShort(); + + return dayjs().locale(this.intlService.localeId).localeData().monthsShort(); } override data(options) { @@ -206,13 +210,13 @@ export class JalaliYearViewService extends YearViewService { } const months = this.abbrMonthNames2(); - const isSelectedDateInRange = moment(selectedDate).isBetween(min, max); + const isSelectedDateInRange = dayjs(selectedDate).isBetween(min, max); //firstMonthOfYear - const firstDate = moment(viewDate).locale(this.intlService.localeIdByDatePickerType).startOf('year').add(moment(viewDate).locale(this.intlService.localeIdByDatePickerType).date() - 1, 'day').toDate(); - const lastDate = moment(viewDate).locale(this.intlService.localeIdByDatePickerType).endOf('year').add(-1, 'month').add(moment(viewDate).locale(this.intlService.localeIdByDatePickerType).date(), 'day').toDate(); - // const firstDate = moment(viewDate).locale('fa').startOf('month').toDate(); - // const lastDate = moment(viewDate).locale('fa').endOf('month').toDate(); - const currentYear = moment(firstDate).locale(this.intlService.localeIdByDatePickerType).year(); + const firstDate = dayjs(viewDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).startOf('year').add(dayjs(viewDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).date() - 1, 'day').toDate(); + const lastDate = dayjs(viewDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).endOf('year').add(-1, 'month').add(dayjs(viewDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).date(), 'day').toDate(); + // const firstDate = dayjs(viewDate).calendar(this.intlService.calendarType).locale('fa').startOf('month').toDate(); + // const lastDate = dayjs(viewDate).calendar(this.intlService.calendarType).locale('fa').endOf('month').toDate(); + const currentYear = dayjs(firstDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).year(); const cells = range(0, CELLS_LENGTH); const today = getToday(); @@ -220,8 +224,8 @@ export class JalaliYearViewService extends YearViewService { const baseDate = addMonths(firstDate, rowOffset * CELLS_LENGTH); return cells.map(cellOffset => { const cellDate = this['normalize'](addMonths(baseDate, cellOffset), min, max); - const changedYear = currentYear < moment(cellDate).locale(this.intlService.localeIdByDatePickerType).year(); - if (!moment(cellDate).isBetween(min, max)) { + const changedYear = currentYear < dayjs(cellDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).year(); + if (!dayjs(cellDate).isBetween(min, max)) { return null; } if (changedYear) { @@ -232,7 +236,7 @@ export class JalaliYearViewService extends YearViewService { const isInMiddle = !isRangeStart && !isRangeEnd; const isRangeMid = isInMiddle && isInSelectionRange(cellDate, selectionRange); return { - formattedValue: months[moment(cellDate).locale(this.intlService.localeIdByDatePickerType).month()], + formattedValue: months[dayjs(cellDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).month()], id: `${cellUID}${cellDate.getTime()}`, isFocused: this.isEqual(cellDate, focusedDate), isSelected: isActiveView && isSelectedDateInRange && this.isEqual(cellDate, selectedDate), @@ -252,10 +256,10 @@ export class JalaliYearViewService extends YearViewService { return xxx; } override title(current: any) { - return `${moment(current).locale(this.intlService.localeIdByDatePickerType).format('YYYY')}`; + return `${dayjs(current).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY')}`; } override navigationTitle(value: any) { - return `${moment(value).locale(this.intlService.localeIdByDatePickerType).format('YYYY')}`; + return `${dayjs(value).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY')}`; } } diff --git a/src/app/app.component.html b/src/app/app.component.html index 9e02ed0..1277add 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -420,7 +420,7 @@

Basic Usage

Final Value: {{value}}

Basic Usage

Calendar

-
diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index f0d563c..434697e 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -4,7 +4,7 @@ import { FormsModule } from '@angular/forms'; import { BrowserModule, By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { DatePickerType, KendoJalaliDateInputsModule } from '@tiampersian/kendo-jalali-date-inputs'; -import moment from 'jalali-moment'; +import moment from 'dayjs'; import { AppComponent } from './app.component'; import '@progress/kendo-angular-intl/locales/fa/all'; function keyPress(key) { @@ -78,7 +78,7 @@ describe('AppComponent', () => { // expected expect(fixture.componentInstance.calendarType).toBe(DatePickerType.jalali); - expect(input.value).toBe(moment(item.input).locale('fa').format('YYYY/M/D')); + expect(input.value).toBe(moment(item.input).calendar('jalali').locale('fa').format('YYYY/M/D')); }); }); @@ -108,7 +108,7 @@ describe('AppComponent', () => { fixture.detectChanges(); // expected - expect(moment(fixture.componentInstance.value).locale('fa').format('yyyy/M/D')).toEqual('١٣٩٩/٢/٢') + expect(moment(fixture.componentInstance.value).locale('fa').format('YYYY/M/D')).toEqual('١٣٩٩/٢/٢') // expect(input.nativeElement.value/*?*/).not.toBe(moment(testCases[0].input).locale('fa').format('YYYY/M/D')); }); }); diff --git a/src/app/app.component.ts b/src/app/app.component.ts index d2e509f..48bdb08 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -13,7 +13,7 @@ import { DatePickerType, JalaliCldrIntlService } from '@tiampersian/kendo-jalali }) export class AppComponent { title = 'kendo-jalali-date-inputs'; - public value: Date = new Date('2020-11-01T20:30:00.000Z'); + public value: Date = new Date(); rerender = true; locales = ['fa-IR', 'fa', 'en-US', 'en']; calendarTypes = Object.values(DatePickerType); diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 79152c6..5063498 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -33,5 +33,5 @@ export function originalLocaleIdFactory(originalLocalId: string): string { } export function isRtl(): boolean { - return localStorage.getItem('localeId') === 'fa-IR'; + return localStorage.getItem('localeId')?.startsWith('fa'); } diff --git a/src/app/dateinput.component.spec.page.ts b/src/app/dateinput.component.spec.page.ts index ea1cbdc..2e6ce33 100644 --- a/src/app/dateinput.component.spec.page.ts +++ b/src/app/dateinput.component.spec.page.ts @@ -30,8 +30,6 @@ export class DateInputComponentPage { return this; } - - async init() { await TestBed.configureTestingModule({ imports: [ diff --git a/src/app/dateinput.component.spec.ts b/src/app/dateinput.component.spec.ts index 12d436b..69eafe5 100644 --- a/src/app/dateinput.component.spec.ts +++ b/src/app/dateinput.component.spec.ts @@ -1,13 +1,19 @@ import { fakeAsync } from '@angular/core/testing'; import { DatePickerType } from '@tiampersian/kendo-jalali-date-inputs'; -import moment from 'jalali-moment'; +import dayjs from 'dayjs'; import { DateInputComponentPage } from './dateinput.component.spec.page'; +import isBetween from 'dayjs/plugin/isBetween'; +import localeData from 'dayjs/plugin/localeData'; +import 'dayjs/locale/fa'; +dayjs.extend(isBetween); +dayjs.extend(localeData); +window['dayjs'] = dayjs; describe('SUT(integration): DateInputComponent', () => { let sutPage: DateInputComponentPage; const some_value = new Date('2020/11/01'); - const expected_value_jalali = moment(some_value).locale('fa').format('M/D/yyyy')/*?*/; - const expected_value_gregorian = moment(some_value).locale('en').format('M/D/yyyy')/*?*/; + const expected_value_jalali = dayjs(some_value).calendar('jalali').locale('fa').format('M/D/YYYY')/*?*/; + const expected_value_gregorian = dayjs(some_value).locale('en').format('M/D/YYYY')/*?*/; beforeEach(async () => { sutPage = await (await new DateInputComponentPage().init()); @@ -30,7 +36,6 @@ describe('SUT(integration): DateInputComponent', () => { await sutPage.with_payloadValue(some_value).detectChanges().whenStable(); // assert - expect(sutPage.component.inputValue.toPerNumber()).toEqual(expected_value_jalali.toPerNumber()/*?*/); expect(sutPage.component.value.toISOString()).toEqual(some_value.toISOString()/*?*/); }); @@ -45,71 +50,71 @@ describe('SUT(integration): DateInputComponent', () => { }); // current input value 8/12/1399 ([ - { + /*1*/{ case: [ - [moment(some_value).locale('fa').format('5/D/YYYY'), 1] + [dayjs(some_value).calendar('jalali').locale('fa').format('5/D/YYYY'), 1] ], scenario: 'month (1 digit)' }, - { + /*2*/{ case: [ - [moment(some_value).locale('fa').format('1/D/YYYY'), 1], [moment(some_value).locale('fa').format('11/D/YYYY'), 2] + [dayjs(some_value).calendar('jalali').locale('fa').format('1/D/YYYY'), 1], [dayjs(some_value).calendar('jalali').locale('fa').format('11/D/YYYY'), 2] ], scenario: 'month (2 digit)' }, - { + /*3*/{ case: [ - [moment(some_value).locale('fa').format('0/D/YYYY'), 1], [moment(some_value).locale('fa').format('4/D/YYYY'), 1] + [dayjs(some_value).calendar('jalali').locale('fa').format('0/D/YYYY'), 1], [dayjs(some_value).calendar('jalali').locale('fa').format('4/D/YYYY'), 1] ], scenario: 'month (1 digit and start with zero)' }, - { + /*4*/{ case: [ - [moment(some_value).locale('fa').format('1/D/YYYY'), 1], [moment(some_value).locale('fa').format('10/D/YYYY'), 2] + [dayjs(some_value).calendar('jalali').locale('fa').format('1/D/YYYY'), 1], [dayjs(some_value).calendar('jalali').locale('fa').format('10/D/YYYY'), 2] ], scenario: 'month (2 digit and end with zero)' }, - - { case: [[moment(some_value).locale('fa').format('M/3/YYYY'), 3]], scenario: 'day (1 digit)' }, - { + /*5*/{ case: [[dayjs(some_value).calendar('jalali').locale('fa').format('M/3/YYYY'), 3]], scenario: 'day (1 digit)' }, + /*6*/{ case: [ - [moment(some_value).locale('fa').format('M/1/YYYY'), 3], [moment(some_value).locale('fa').format('M/12/YYYY'), 4] + [dayjs(some_value).calendar('jalali').locale('fa').format('M/1/YYYY'), 3], [dayjs(some_value).calendar('jalali').locale('fa').format('M/12/YYYY'), 4] ], scenario: 'day (2 digit)' }, - { + /*7*/{ case: [ - [moment(some_value).locale('fa').format('M/0/YYYY'), 3], [moment(some_value).locale('fa').format('M/1/YYYY'), 3] + [dayjs(some_value).calendar('jalali').locale('fa').format('M/0/YYYY'), 3], [dayjs(some_value).calendar('jalali').locale('fa').format('M/1/YYYY'), 3] ], scenario: 'day (1 digit and start with zero)' }, - { + /*8*/{ case: [ - [moment(some_value).locale('fa').format('M/1/YYYY'), 3], [moment(some_value).locale('fa').format('M/10/YYYY'), 4] + [dayjs(some_value).calendar('jalali').locale('fa').format('M/1/YYYY'), 3], [dayjs(some_value).calendar('jalali').locale('fa').format('M/10/YYYY'), 4] ], scenario: 'day (2 digit and end with zero)' }, - { + /*9*/{ case: [ - [moment(some_value).locale('fa').format('M/D/1'), 6], [moment(some_value).locale('fa').format('M/D/13'), 7], - [moment(some_value).locale('fa').format('M/D/138'), 8], [moment(some_value).locale('fa').format('M/D/1388'), 9] + [dayjs(some_value).calendar('jalali').locale('fa').format('M/D/1'), 6], [dayjs(some_value).calendar('jalali').locale('fa').format('M/D/13'), 7], + [dayjs(some_value).calendar('jalali').locale('fa').format('M/D/138'), 8], [dayjs(some_value).calendar('jalali').locale('fa').format('M/D/1388'), 9] ], scenario: 'year (4 digit)' }, - { + /*10*/{ case: [ - [moment(some_value).locale('fa').format('M/D/0'), 6], [moment(some_value).locale('fa').format('M/D/03'), 7], - [moment(some_value).locale('fa').format('M/D/038'), 8], [moment(some_value).locale('fa').format('M/D/0388'), 9] + [dayjs(some_value).calendar('jalali').locale('fa').format('M/D/1'), 6], [dayjs(some_value).calendar('jalali').locale('fa').format('M/D/13'), 7], + [dayjs(some_value).calendar('jalali').locale('fa').format('M/D/138'), 8], [dayjs(some_value).calendar('jalali').locale('fa').format('M/D/1388'), 9] ], scenario: 'year (3 digit and start with zero)' }, - { + /*11*/{ case: [ - [moment(some_value).locale('fa').format('M/D/0'), 6], [moment(some_value).locale('fa').format('M/D/00'), 7], - [moment(some_value).locale('fa').format('M/D/000'), 8], [moment(some_value).locale('fa').format('M/D/0008'), 9] + [dayjs(some_value).calendar('jalali').locale('fa').format('M/D/1'), 6], + [dayjs(some_value).calendar('jalali').locale('fa').format('M/D/10'), 7], + [dayjs(some_value).calendar('jalali').locale('fa').format('M/D/100'), 8], + [dayjs(some_value).calendar('jalali').locale('fa').format('M/D/1008'), 9] ], scenario: '' }, - ] as { case: [string, number][], scenario: string }[]).forEach((testCase) => { - it(`should set proper value and show proper value when input value has change in ${(testCase.scenario)}`, async () => { - + ] as { case: [string, number][], scenario: string }[]).forEach((testCase, i: number) => { + it(`should set proper value and show proper value when input value has change in #${i + 1}: ${(testCase.scenario)}`, async () => { // arrange await sutPage.with_payloadValue(some_value).detectChanges().whenStable(); await sutPage.with_send_inputValue(testCase.case); // assert - const expectedInputValue = testCase.case[testCase.case.length - 1][0]; + const expectedInputValue = testCase.case.slice(-1)[0][0]; const expectedValue = getJalaliValue(expectedInputValue); expect(sutPage.component.value.toISOString()).toEqual(expectedValue); expect(sutPage.component.inputValue.toPerNumber()).toEqual(expectedInputValue.toPerNumber()); @@ -118,36 +123,35 @@ describe('SUT(integration): DateInputComponent', () => { // current input value 11/2/2020 ([ - { case: [[moment(some_value).format('5/D/YYYY'), 1]], scenario: 'month (1 digit)' }, - { case: [[moment(some_value).format('1/D/YYYY'), 1], [moment(some_value).format('11/D/YYYY'), 2]], scenario: 'month (2 digit)' }, - { case: [[moment(some_value).format('0/D/YYYY'), 1], [moment(some_value).format('4/D/YYYY'), 1]], scenario: 'month (1 digit and start with zero)' }, - { case: [[moment(some_value).format('1/D/YYYY'), 1], [moment(some_value).format('10/D/YYYY'), 2]], scenario: 'month (2 digit and end with zero)' }, - - { case: [[moment(some_value).format('M/3/YYYY'), 4]], scenario: 'day (1 digit)' }, - { case: [[moment(some_value).format('M/1/YYYY'), 4], [moment(some_value).format('M/12/YYYY'), 5]], scenario: 'day (2 digit)' }, - { case: [[moment(some_value).format('M/0/YYYY'), 4], [moment(some_value).format('M/1/YYYY'), 4]], scenario: 'day (1 digit and start with zero)' }, - { case: [[moment(some_value).format('M/1/YYYY'), 4], [moment(some_value).format('M/10/YYYY'), 5]], scenario: 'day (2 digit and end with zero)' }, - + { case: [[dayjs(some_value).format('5/D/YYYY'), 1]], scenario: 'month (1 digit)' }, + { case: [[dayjs(some_value).format('1/D/YYYY'), 1], [dayjs(some_value).format('11/D/YYYY'), 2]], scenario: 'month (2 digit)' }, + { case: [[dayjs(some_value).format('0/D/YYYY'), 1], [dayjs(some_value).format('4/D/YYYY'), 1]], scenario: 'month (1 digit and start with zero)' }, + { case: [[dayjs(some_value).format('1/D/YYYY'), 1], [dayjs(some_value).format('10/D/YYYY'), 2]], scenario: 'month (2 digit and end with zero)' }, + + { case: [[dayjs(some_value).format('M/2/YYYY'), 4]], scenario: 'day (1 digit)' }, + { case: [[dayjs(some_value).format('M/1/YYYY'), 4], [dayjs(some_value).format('M/12/YYYY'), 5]], scenario: 'day (2 digit)' }, + { case: [[dayjs(some_value).format('M/0/YYYY'), 4], [dayjs(some_value).format('M/1/YYYY'), 4]], scenario: 'day (1 digit and start with zero)' }, + { case: [[dayjs(some_value).format('M/1/YYYY'), 4], [dayjs(some_value).format('M/10/YYYY'), 5]], scenario: 'day (2 digit and end with zero)' }, { case: [ - [moment(some_value).format('M/D/2'), 6], [moment(some_value).format('M/D/20'), 7] - , [moment(some_value).format('M/D/203'), 8], [moment(some_value).format('M/D/2031'), 9] + [dayjs(some_value).format('M/D/2'), 6], [dayjs(some_value).format('M/D/20'), 7] + , [dayjs(some_value).format('M/D/203'), 8], [dayjs(some_value).format('M/D/2031'), 9] ], scenario: 'year (4 digit)' }, { case: [ - [moment(some_value).format('M/D/0'), 6], [moment(some_value).format('M/D/03'), 7], - [moment(some_value).format('M/D/038'), 8], [moment(some_value).format('M/D/0388'), 9] + [dayjs(some_value).format('M/D/1'), 6], [dayjs(some_value).format('M/D/13'), 7], + [dayjs(some_value).format('M/D/138'), 8], [dayjs(some_value).format('M/D/1388'), 9] ], scenario: 'year (3 digit and start with zero)' }, { case: [ - [moment(some_value).format('M/D/0'), 6], [moment(some_value).format('M/D/00'), 7], - [moment(some_value).format('M/D/000'), 8], [moment(some_value).format('M/D/0008'), 9] + [dayjs(some_value).format('M/D/1'), 6], [dayjs(some_value).format('M/D/10'), 7], + [dayjs(some_value).format('M/D/100'), 8], [dayjs(some_value).format('M/D/1008'), 9] ], scenario: '' }, - ] as { case: [string, number][], scenario: string }[]).forEach((testCase) => { - it(`should set proper value and show proper value when input value has change in ${(testCase.scenario)}`, async () => { + ] as { case: [string, number][], scenario: string }[]).forEach((testCase, i: number) => { + it(`should set proper value and show proper value when input value has change in #${i + 1}: ${(testCase.scenario)}`, async () => { // arrange await sutPage.with_gregorian_mode().with_payloadValue(some_value).detectChanges().whenStable(); @@ -161,10 +165,11 @@ describe('SUT(integration): DateInputComponent', () => { }); }); }); + function getJalaliValue(value: string) { - return moment.from(value, 'fa', 'M/D/YYYY').toDate().toISOString(); + return dayjs(dayjs(value).format('YYYY/M/D'), { jalali: true } as any).toDate().toISOString(); } function getGregorianValue(value: string) { - return moment.from(value, 'en', 'M/D/YYYY').toDate().toISOString(); + return dayjs(value, 'M/D/YYYY', 'en').toDate().toISOString(); } diff --git a/src/assets/screenshot.png b/src/assets/screenshot.png index f11f25332af117166e6df29ca05529b2c547ec8d..5ebe3f9c143c7b0184c7debfe6f87bd31859c9f4 100644 GIT binary patch delta 97143 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�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

JtRpW1l`{coV36Bq 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 QBfMiZck!IWSxyK3KfPBDkpKVy delta 96719 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 From 80c5e3b04a76382d6846c9a8d3e010e7dbbec106 Mon Sep 17 00:00:00 2001 From: tiampersian Date: Tue, 31 Oct 2023 19:08:55 +0330 Subject: [PATCH 3/4] refactor --- package.json | 20 +- .../src/lib/components/calendar.component.ts | 4 +- .../lib/components/date-input.component.ts | 23 +- ...alali-header-title-template.component.scss | 8 + ...-jalali-header-title-template.component.ts | 5 +- .../lib/components/navigation.directive.ts | 8 +- .../src/lib/dayjs-jalali.ts | 233 ------------------ .../lib/kendo-jalali-date-inputs.module.ts | 29 +-- .../src/lib/models/date-picker-type.ts | 4 + .../src/lib/pipes/number.pipe.ts | 33 --- .../src/lib/providers.ts | 10 +- .../lib/services/date-time-number.service.ts | 40 +++ .../services/jalali-century-view.service.ts | 82 ++++++ ...service.ts => jalali-cldr-intl.service.ts} | 24 +- .../services/jalali-decade-view.service.ts | 80 ++++++ .../lib/services/jalali-month-view.service.ts | 42 ++-- .../lib/services/jalali-week-names.service.ts | 16 ++ .../lib/services/jalali-year-view.service.ts | 85 +++++++ .../century-view.service.ts | 85 +------ .../decade-view.service.ts | 84 +------ .../month-view.service.ts | 14 +- .../kendo-services/week-names.service.ts | 11 + .../year-view.services.ts | 99 +------- .../{utils.ts => kendo-util-overrides.ts} | 50 ++-- .../src/lib/services/moment-numbers.ts | 94 ------- .../src/lib/services/week-names.service.ts | 23 -- .../src/lib/utils/string-prototypes.ts | 51 ++++ .../src/public-api.ts | 6 +- src/app/app.component.html | 12 +- src/app/app.component.spec.ts | 4 +- src/app/app.component.ts | 2 +- src/app/dateinput.component.spec.page.ts | 4 +- src/app/dateinput.component.spec.ts | 17 +- 33 files changed, 527 insertions(+), 775 deletions(-) delete mode 100644 projects/tiampersian/kendo-jalali-date-inputs/src/lib/dayjs-jalali.ts create mode 100644 projects/tiampersian/kendo-jalali-date-inputs/src/lib/models/date-picker-type.ts delete mode 100644 projects/tiampersian/kendo-jalali-date-inputs/src/lib/pipes/number.pipe.ts create mode 100644 projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/date-time-number.service.ts create mode 100644 projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-century-view.service.ts rename projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/{locale.service.ts => jalali-cldr-intl.service.ts} (82%) create mode 100644 projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-decade-view.service.ts create mode 100644 projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-week-names.service.ts create mode 100644 projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-year-view.service.ts rename projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/{ => kendo-services}/century-view.service.ts (60%) rename projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/{ => kendo-services}/decade-view.service.ts (58%) rename projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/{ => kendo-services}/month-view.service.ts (93%) create mode 100644 projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/week-names.service.ts rename projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/{ => kendo-services}/year-view.services.ts (56%) rename projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/{utils.ts => kendo-util-overrides.ts} (57%) delete mode 100644 projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/moment-numbers.ts delete mode 100644 projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/week-names.service.ts create mode 100644 projects/tiampersian/kendo-jalali-date-inputs/src/lib/utils/string-prototypes.ts diff --git a/package.json b/package.json index 3ead29e..67b683f 100644 --- a/package.json +++ b/package.json @@ -28,16 +28,16 @@ "@angular/platform-browser": "16.1.4", "@angular/platform-browser-dynamic": "16.1.4", "@angular/router": "16.1.4", - "@progress/kendo-angular-buttons": "13.3.0", - "@progress/kendo-angular-common": "13.3.0", - "@progress/kendo-angular-dateinputs": "13.3.0", - "@progress/kendo-angular-dialog": "13.3.0", - "@progress/kendo-angular-icons": "13.3.0", - "@progress/kendo-angular-inputs": "13.3.0", - "@progress/kendo-angular-intl": "13.3.0", - "@progress/kendo-angular-l10n": "13.3.0", - "@progress/kendo-angular-navigation": "13.3.0", - "@progress/kendo-angular-popup": "13.3.0", + "@progress/kendo-angular-buttons": "13.1.0", + "@progress/kendo-angular-common": "13.1.0", + "@progress/kendo-angular-dateinputs": "13.1.0", + "@progress/kendo-angular-dialog": "13.1.0", + "@progress/kendo-angular-icons": "13.1.0", + "@progress/kendo-angular-inputs": "13.1.0", + "@progress/kendo-angular-intl": "13.1.0", + "@progress/kendo-angular-l10n": "13.1.0", + "@progress/kendo-angular-navigation": "13.1.0", + "@progress/kendo-angular-popup": "13.1.0", "@progress/kendo-drawing": "1.17.5", "@progress/kendo-licensing": "1.3.0", "@progress/kendo-svg-icons": "1.6.0", diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/calendar.component.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/calendar.component.ts index 86f4571..3e0216e 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/calendar.component.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/calendar.component.ts @@ -1,5 +1,5 @@ import { debounceTime } from 'rxjs/operators'; -import { JalaliCldrIntlService } from './../services/locale.service'; +import { JalaliCldrIntlService } from '../services/jalali-cldr-intl.service'; import { TemplateRef } from '@angular/core'; import { CalendarComponent, MultiViewCalendarComponent } from '@progress/kendo-angular-dateinputs'; import { IntlService } from '@progress/kendo-angular-intl'; @@ -63,7 +63,7 @@ const oldNgOnInit = CalendarComponent.prototype.ngOnInit; CalendarComponent.prototype.ngOnInit = function (): void { const me: CalendarComponent = this; oldNgOnInit.call(this); - const intl: JalaliCldrIntlService = this.bus.service(this.activeViewEnum).intlService; + const intl: JalaliCldrIntlService = this.bus.service(this.activeViewEnum).intl; intl.$calendarType.pipe(debounceTime(10)).subscribe(x => { this.onResize(); }); diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/date-input.component.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/date-input.component.ts index 15ca7f8..26fa262 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/date-input.component.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/date-input.component.ts @@ -1,9 +1,8 @@ import { DateInputComponent } from '@progress/kendo-angular-dateinputs'; -import dayjs, * as moment from 'dayjs'; +import dayjs from 'dayjs'; import { Dayjs } from 'dayjs'; -import { JalaliCldrIntlService } from '../services/locale.service'; -import { reverseString } from '../services/moment-numbers'; -import { isPresent } from '../services/utils'; +import { JalaliCldrIntlService } from '../services/jalali-cldr-intl.service'; +import { isPresent } from '../services/kendo-util-overrides'; const existInputs = { @@ -67,7 +66,7 @@ DateInputComponent.prototype['handleInput'] = function () { let prevValue = this.currentValue; if (intl.isJalali) { // TODO Check me - prevValue = this.value ? getValue.call(this, this.value).format(dateFormatString.call(this, this.value, this.format, 'fa').format.toMomentDateTimeFormat()).toEnNumber() : this.currentValue; + prevValue = this.value ? this.intl.getDayJsValue(this.value).format(dateFormatString.call(this, this.value, this.format, 'fa').format.toMomentDateTimeFormat()).toEnNumber() : this.currentValue; // prevValue = this.value ? getValue.call(this, this.value).format(this.format.toMomentDateTimeFormat()).toEnNumber() : this.currentValue; } @@ -122,7 +121,7 @@ function dateFormatString(date, format): { format: string, symbol: string } { const partMap = []; const partSymbols = []; for (let i = 0; i < dateFormatParts.length; i++) { - let partLength = getValue.call(this, date)?.format(dateFormatParts[i].pattern?.toMomentDateTimeFormat()).length || 0; + let partLength = this.intl.getDayJsValue(date)?.format(dateFormatParts[i].pattern?.toMomentDateTimeFormat()).length || 0; // let partLength = dayjs(date)?.format(dateFormatParts[i].pattern?.toMomentDateTimeFormat()).length || 0; while (partLength > 0) { parts.push(this.kendoDate.symbols[dateFormatParts[i].pattern[0]] || dateFormatParts[i].pattern[0] || "_"); @@ -153,7 +152,7 @@ function prepareDiffInJalaliMode(intl: JalaliCldrIntlService, diff: any[]) { if (!this.inputValue) { return; } - const dt = getValue.call(this, this.kendoDate.value, 'fa'); + const dt = this.intl.getDayJsValue(this.kendoDate.value, 'fa'); if (!dt) { return; } @@ -260,7 +259,7 @@ function prepareYearValue(diff: any[], dt) { } export function getDateFormatString(format: string, localeId: string, value?: Date): string { - const dt = getValue.call(this, (value || this.kendoDate.value), localeId)?.toDate(); + const dt = this.intl.getDayJsValue(value || this.kendoDate.value, localeId)?.toDate(); return dateFormatString.call(this, dt, format, localeId) || ''; }; @@ -337,7 +336,7 @@ function setInputValue(localeId: string) { format = format.replace(/m/gi, '0'); } - const result = getValue.call(this, value, localeId); + const result = this.intl.getDayJsValue(value, localeId); if (this.intl.isLocaleIran) { this.renderer.setProperty(this.inputElement, 'value', result.format(format.toMomentDateTimeFormat())); return; @@ -345,12 +344,6 @@ function setInputValue(localeId: string) { this.renderer.setProperty(this.inputElement, 'value', result.format(format.toMomentDateTimeFormat())); } -function getValue(value: Date | string, localeId?: string): Dayjs { - if (!value) { return null; } - - return dayjs(value).calendar(this.intl.calendarType).locale(localeId || this.intl.locale); -} - function resetExistingInputs() { existInputs.m = false; diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.scss b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.scss index fe0d79a..db41bb3 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.scss +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.scss @@ -1,11 +1,19 @@ ::ng-deep { .k-calendar { direction: ltr; + kendo-virtualization.k-flex.k-content.k-scrollable { --kendo-scrollbar-width: -15px; } + kendo-calendar-navigation kendo-virtualization.k-flex.k-content.k-scrollable { --kendo-scrollbar-width: 0px; + + &>ul { + display: flex; + flex-direction: column; + align-items: center; + } } } diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.ts index d01b9e9..a29d75a 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component.ts @@ -1,7 +1,8 @@ import { AfterViewInit, Component, Inject, TemplateRef, ViewChild, ChangeDetectorRef } from '@angular/core'; import '@angular/localize'; import { IntlService } from '@progress/kendo-angular-intl'; -import { DatePickerType, JalaliCldrIntlService } from '../../services/locale.service'; +import { JalaliCldrIntlService } from '../../services/jalali-cldr-intl.service'; +import { DatePickerType } from '../../models/date-picker-type'; @Component({ template: ` @@ -20,7 +21,7 @@ export class KendoJalaliHeaderTitleTemplateComponent implements AfterViewInit { @ViewChild('template', { read: TemplateRef }) templateRef = TemplateRef; calendarType: DatePickerType; calendarTypes = { - [DatePickerType.gregorian]: $localize`:@@jalali:Jalali`, + [DatePickerType.gregory]: $localize`:@@jalali:Jalali`, [DatePickerType.jalali]: $localize`:@@gregorian:Gregorian`, }; diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/navigation.directive.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/navigation.directive.ts index 5ac2a13..96b9ab5 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/navigation.directive.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/components/navigation.directive.ts @@ -2,7 +2,7 @@ import { ChangeDetectorRef, Directive, Inject, Self, SkipSelf } from '@angular/c import { NavigationComponent } from '@progress/kendo-angular-dateinputs'; import { IntlService } from '@progress/kendo-angular-intl'; import { Providers } from '../providers'; -import { JalaliCldrIntlService } from '../services/locale.service'; +import { JalaliCldrIntlService } from '../services/jalali-cldr-intl.service'; import { debounceTime } from 'rxjs/operators'; // tslint:disable-next-line:no-string-literal @@ -19,14 +19,14 @@ NavigationComponent.prototype['intlChange'] = function(): void { }) export class KendoDatePickerDirective { constructor( - @Inject(IntlService) @Self() intlService: JalaliCldrIntlService, + @Inject(IntlService) @Self() intl: JalaliCldrIntlService, @Inject(IntlService) @SkipSelf() hostIntlService: JalaliCldrIntlService, @Inject('HeaderTitleTemplate') headerTitleTemplate, private cdr: ChangeDetectorRef ) { hostIntlService.changes.pipe(debounceTime(30)).subscribe(x => { - intlService.changeLocaleId(hostIntlService.localeId); - intlService.changeType(hostIntlService.datePickerType); + intl.changeLocaleId(hostIntlService.localeId); + intl.changeType(hostIntlService.datePickerType); this.cdr.detectChanges(); }); } diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/dayjs-jalali.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/dayjs-jalali.ts deleted file mode 100644 index 9aed7da..0000000 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/dayjs-jalali.ts +++ /dev/null @@ -1,233 +0,0 @@ -import * as dayjs from 'dayjs' -import localeData from 'dayjs/plugin/localeData'; -dayjs.extend(localeData); - -import JALALI from 'jalaali-js' - -const jalaliEnLocale = { - name: 'en', - months: ["Farvardin" - , "Ordibehesht" - , "Khordaad" - , "Tir" - , "Mordaad" - , "Shahrivar" - , "Mehr" - , "Aabaan" - , "Aazar" - , "Dey" - , "Bahman" - , "Esfand" - ], - "weekStart": 1, - - - monthsShort: ["Far" - , "Ord" - , "Kho" - , "Tir" - , "Amo" - , "Sha" - , "Meh" - , "Aab" - , "Aaz" - , "Dey" - , "Bah" - , "Esf" - ] -}; - -const gregorianFaLocale = { - "name": "fa", - "weekdays": [ - "یک‌شنبه", - "دوشنبه", - "سه‌شنبه", - "چهارشنبه", - "پنج‌شنبه", - "جمعه", - "شنبه" - ], - "weekdaysShort": [ - "یک‌شنبه", - "دوشنبه", - "سه‌شنبه", - "چهارشنبه", - "پنج‌شنبه", - "جمعه", - "شنبه" - ], - "weekdaysMin": [ - "ی", - "د", - "س", - "چ", - "پ", - "ج", - "ش" - ], - "weekStart": 6, - "months": [ - "ژانویه", - "فوریه", - "مارس", - "آوریل", - "مه", - "ژوئن", - "ژوئیه", - "اوت", - "سپتامبر", - "اکتبر", - "نوامبر", - "دسامبر" - ], - "monthsShort": [ - "ژانویه", - "فوریه", - "مارس", - "آوریل", - "مه", - "ژوئن", - "ژوئیه", - "اوت", - "سپتامبر", - "اکتبر", - "نوامبر", - "دسامبر" - ], - "formats": { - "LT": "HH:mm", - "LTS": "HH:mm:ss", - "L": "DD/MM/YYYY", - "LL": "D MMMM YYYY", - "LLL": "D MMMM YYYY HH:mm", - "LLLL": "dddd, D MMMM YYYY HH:mm" - }, - "relativeTime": { - "future": "در %s", - "past": "%s پیش", - "s": "چند ثانیه", - "m": "یک دقیقه", - "mm": "%d دقیقه", - "h": "یک ساعت", - "hh": "%d ساعت", - "d": "یک روز", - "dd": "%d روز", - "M": "یک ماه", - "MM": "%d ماه", - "y": "یک سال", - "yy": "%d سال" - } -}; - -const jalaliFaLocale = { - name: 'fa', - weekdays: 'یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه'.split('_'), - weekdaysShort: 'یک‌_دو_سه‌_چه_پن_جم_شن'.split('_'), - weekdaysMin: 'ی‌_د_س‌_چ_پ_ج_ش'.split('_'), - months: 'فروردین_اردیبهشت_خرداد_تیر_مرداد_شهریور_مهر_آبان_آذر_دی_بهمن_اسفند'.split('_'), - monthsShort: 'فروردین_اردیبهشت_خرداد_تیر_مرداد_شهریور_مهر_آبان_آذر_دی_بهمن_اسفند'.split('_'), - oridinal: n => `${n}ام`, - relativeTime: { - future: 'در %s', - past: '%s قبل', - s: 'چند ثانیه', - m: 'یک دقیقه', - mm: '%d دقیقه', - h: 'یک ساعت', - hh: '%d ساعت', - d: 'یک روز', - dd: '%d روز', - M: 'یک ماه', - MM: '%d ماه', - y: 'یک سال', - yy: '%d سال' - } -} - -const REGEX_PARSE = /^(\d{4})\D?(0[1-9]|1[0-2])\D?([12]\d|0[1-9]|3[01])(\D?([01]\d|2[0-3])\D?([0-5]\d)\D?([0-5]\d)?\D?(\d{3})?([zZ]|([+-])([01]\d|2[0-3])\D?([0-5]\d)?)?)?$/ -const REGEX_FORMAT = /\[.*?\]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g - -function xxx(options, dayjsClass, dayjsFactory) { - const classProto = dayjsClass.prototype; - - const oldFormat = classProto.format; - const oldParse = classProto.parse; - let isJalali = false; - classProto.doAsJalali = function (name) { - if (name === 'fa') { - dayjsFactory.locale(jalaliFaLocale, null, true); - } else { - dayjsFactory.locale(jalaliEnLocale, null, true); - } - - isJalali = true; - return this; - } - classProto.doAsGregorian = function (name) { - if (name === 'fa') { - dayjsFactory.locale(gregorianFaLocale, null, true); - } - isJalali = false; - return this; - } - - classProto.parse = function (cfg) { - cfg.date = cfg.date || new Date() - const { date, jalali } = cfg - - if (jalali) { - if ((typeof date === 'string') && (/.*$/i.test(date))) { - const reg = date.match(REGEX_PARSE) - if (reg) { - const [, year, month, day, time] = reg - const { gy, gm, gd } = JALALI.toGregorian(Number(year), Number(month), Number(day)) - cfg.date = `${gy}-${String(gm).padStart(2, '0')}-${String(gd).padStart(2, '0')}${time || ''}` - } - } - } - - return oldParse.bind(this)(cfg) - } - - classProto.format = function (formatStr) { - const locale = this.$locale() - const fff = gregorianFaLocale; - if (isJalali || locale.name === 'fa') { - const str = formatStr || 'YYYY-MM-DDTHH:mm:ssZ' - const { jy: year, jm: month, jd: day } = JALALI.toJalaali(this.$y, this.$M + 1, this.$D) - const getShort = (arr, index, full, length) => ( - (arr && arr[index]) || full[index].substr(0, length) - ) - - formatStr = str.replace(REGEX_FORMAT, (match) => { - switch (match) { - case 'YY': - return String(year).slice(-2) - case 'YYYY': - return String(year) - case 'M': - return String(month) - case 'MM': - return String(month).padStart(2, '0') - case 'MMM': - return getShort(locale.monthsShort, month - 1, locale.months, 3) - case 'MMMM': - return locale.months[month - 1] - case 'D': - return String(day) - case 'DD': - return String(day).padStart(2, '0') - default: - return match - } - }); - - // return formatStr; - } - - return oldFormat.bind(this)(formatStr) - } -} - -dayjs.extend(xxx as any); diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/kendo-jalali-date-inputs.module.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/kendo-jalali-date-inputs.module.ts index e051414..0990610 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/kendo-jalali-date-inputs.module.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/kendo-jalali-date-inputs.module.ts @@ -2,35 +2,23 @@ import { ModuleWithProviders, NgModule } from '@angular/core'; import '@angular/localize/init'; import { DateInputsModule } from '@progress/kendo-angular-dateinputs'; import { IntlModule, setData } from '@progress/kendo-angular-intl'; +import dayjs from 'dayjs'; +import isBetween from 'dayjs/plugin/isBetween'; +import localeData from 'dayjs/plugin/localeData'; +import jalaliday from 'jalaliday'; import { KendoJalaliHeaderTitleTemplateComponent } from './components/kendo-jalali-header-title-template/kendo-jalali-header-title-template.component'; import { KendoDatePickerDirective } from './components/navigation.directive'; import { IConfig } from './models/config.model'; -import { NumberPipe } from './pipes/number.pipe'; import { Providers } from './providers'; -import { MomentNumberService } from './services/moment-numbers'; -import dayjs, { GlobalLocaleDataReturn } from 'dayjs' -import utc from 'dayjs/plugin/utc'; -import timezone from 'dayjs/plugin/timezone'; -import isBetween from 'dayjs/plugin/isBetween'; -import customParseFormat from 'dayjs/plugin/customParseFormat'; -import localeData from 'dayjs/plugin/localeData'; -import jalaliday from 'jalaliday'; +import { DateTimeNumberService } from './services/date-time-number.service'; +import './utils/string-prototypes'; dayjs.extend(jalaliday); -dayjs.extend(customParseFormat); -dayjs.extend(utc); -dayjs.extend(timezone); dayjs.extend(isBetween); dayjs.extend(localeData); if (typeof window !== 'undefined') { window['dayjs'] = dayjs; } -// debugger -// const oldLocaleData = dayjs.prototype.localeData as () => GlobalLocaleDataReturn; -// dayjs.prototype.localeData = function (a) { -// debugger -// return oldLocaleData.call(this) -// }; setData({ name: "fa", @@ -514,7 +502,6 @@ setData({ declarations: [ KendoJalaliHeaderTitleTemplateComponent, KendoDatePickerDirective, - NumberPipe ], imports: [ IntlModule, @@ -522,14 +509,12 @@ setData({ ], providers: [ ...Providers, - MomentNumberService, - NumberPipe, + DateTimeNumberService, { provide: 'CONFIGS', useValue: {} } ], exports: [ DateInputsModule, KendoDatePickerDirective, - NumberPipe, ] }) export class KendoJalaliDateInputsModule { diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/models/date-picker-type.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/models/date-picker-type.ts new file mode 100644 index 0000000..8a57b07 --- /dev/null +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/models/date-picker-type.ts @@ -0,0 +1,4 @@ +export enum DatePickerType { + jalali = 'jalali', + gregory = 'gregory' +} diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/pipes/number.pipe.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/pipes/number.pipe.ts deleted file mode 100644 index ff00ba6..0000000 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/pipes/number.pipe.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Inject, LOCALE_ID, Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ name: 'tiNumber' }) -export class NumberPipe implements PipeTransform { - numbers = { - 0: $localize`:@@0:۰`, - 1: $localize`:@@1:۱`, - 2: $localize`:@@2:۲`, - 3: $localize`:@@3:۳`, - 4: $localize`:@@4:۴`, - 5: $localize`:@@5:۵`, - 6: $localize`:@@6:۶`, - 7: $localize`:@@7:۷`, - 8: $localize`:@@8:۸`, - 9: $localize`:@@9:۹`, - } - constructor( - @Inject(LOCALE_ID) localeId: string - ) { - if (localeId.startsWith('fa') || localeId.startsWith('ar')) { - this.transform = this.translatorTransform; - } - } - - transform(value: string) { - return value; - } - translatorTransform(value: any): any { - return value.replace(/[0-9]/g, function (d) { - return this.numbers[d]; - }) - } -} diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/providers.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/providers.ts index f63711d..43dc74c 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/providers.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/providers.ts @@ -1,12 +1,12 @@ import { ComponentFactoryResolver, Injector } from '@angular/core'; import { IntlService } from '@progress/kendo-angular-intl'; import { HeaderTitleTemplateFactory } from './HeaderTitleTemplateFactory'; -import { JalaliCenturyViewService } from './services/century-view.service'; -import { JalaliDecadeViewService } from './services/decade-view.service'; -import { JalaliCldrIntlService } from './services/locale.service'; +import { JalaliCenturyViewService } from './services/jalali-century-view.service'; +import { JalaliDecadeViewService } from './services/jalali-decade-view.service'; +import { JalaliCldrIntlService } from './services/jalali-cldr-intl.service'; import { JalaliMonthViewService } from './services/jalali-month-view.service'; -import { JalaliWeekNamesService } from './services/week-names.service'; -import { JalaliYearViewService } from './services/year-view.services'; +import { JalaliWeekNamesService } from './services/jalali-week-names.service'; +import { JalaliYearViewService } from './services/jalali-year-view.service'; export const Providers = [ JalaliCenturyViewService, diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/date-time-number.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/date-time-number.service.ts new file mode 100644 index 0000000..2548dd7 --- /dev/null +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/date-time-number.service.ts @@ -0,0 +1,40 @@ +import { Inject, Injectable, LOCALE_ID } from '@angular/core'; +import dayjs from 'dayjs'; +import { IConfig } from '../models/config.model'; + + +@Injectable() +export class DateTimeNumberService { + usePersianNumber: boolean; + + constructor( + @Inject(LOCALE_ID) localeId: string, + @Inject('CONFIGS') private configs: IConfig + ) { + this.setLocaleId(localeId); + this.init(); + } + + setLocaleId(value: string) { + this.usePersianNumber = value === 'fa' || value === 'fa-IR'; + } + + init() { + if (this.configs?.usePersianNumber === false) { + return; + } + const me = this; + // dayjs.localeData().months(); + const te = dayjs.prototype.format; + dayjs.prototype.format = function (format) { + + if (!me.usePersianNumber) { + return te.call(this, format); + } + + let result = te.call(this, format); + result = result.toPerNumber().replace(/,/g, '،'); + return result; + }; + } +} diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-century-view.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-century-view.service.ts new file mode 100644 index 0000000..19a032e --- /dev/null +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-century-view.service.ts @@ -0,0 +1,82 @@ +import { Inject, Injectable } from '@angular/core'; +import { IntlService } from '@progress/kendo-angular-intl'; +import { addDecades } from '@progress/kendo-date-math'; +import dayjs from 'dayjs'; +import { JalaliCldrIntlService } from './jalali-cldr-intl.service'; +import { firstDecadeOfCentury, firstYearOfDecade, getToday, isInRange, isInSelectionRange, lastDecadeOfCentury, range } from './kendo-util-overrides'; +import { CenturyViewService, EMPTY_DATA, CELLS_LENGTH, ROWS_LENGTH } from './kendo-services/century-view.service'; + +@Injectable() +export class JalaliCenturyViewService extends CenturyViewService { + + constructor( + @Inject(IntlService) private intl: JalaliCldrIntlService + ) { + super(); + } + + title(current) { + if (!current) { + return ''; + } + + const temp = this.intl.getDayJsValue(lastDecadeOfCentury(current, this.intl.localeIdByDatePickerType)).format('YYYY'); + return `${this.intl.getDayJsValue(firstDecadeOfCentury(current, this.intl.localeIdByDatePickerType)).format('YYYY')} - ${temp}`; + } + + navigationTitle(value) { + return `${this.intl.getDayJsValue(firstDecadeOfCentury(value, this.intl.localeIdByDatePickerType)).format('YYYY')}`; + } + + + data(options) { + const { cellUID, focusedDate, isActiveView, max, min, selectedDate, selectionRange = {}, viewDate } = options; + if (!viewDate) { + return EMPTY_DATA; + } + const cells = range(0, CELLS_LENGTH); + const firstDate = firstDecadeOfCentury(viewDate, this.intl.localeIdByDatePickerType); + const lastDate = lastDecadeOfCentury(viewDate, this.intl.localeIdByDatePickerType); + const isSelectedDateInRange = isInRange(selectedDate, min, max); + const today = getToday(); + const data = range(0, ROWS_LENGTH).map(rowOffset => { + const baseDate = addDecades(firstDate, rowOffset * CELLS_LENGTH); + return cells.map(cellOffset => { + const cellDate = super['normalize'](addDecades(baseDate, cellOffset), min, max); + if (!this.isInRange(cellDate, firstDate, lastDate)) { + return null; + } + const isRangeStart = this.isEqual(cellDate, selectionRange.start); + const isRangeEnd = this.isEqual(cellDate, selectionRange.end); + const isInMiddle = !isRangeStart && !isRangeEnd; + const isRangeMid = isInMiddle && isInSelectionRange(cellDate, selectionRange); + const title = this.intl.getDayJsValue(cellDate).format('YYYY'); + + return { + formattedValue: title, + id: `${cellUID}${cellDate.getTime()}`, + isFocused: this.isEqual(cellDate, focusedDate), + isSelected: isActiveView && isSelectedDateInRange && this.isEqual(cellDate, selectedDate), + isWeekend: false, + isRangeStart, + isRangeMid, + isRangeEnd, + isRangeSplitEnd: isRangeMid && this.isEqual(cellDate, lastDate), + isRangeSplitStart: isRangeMid && this.isEqual(cellDate, firstDate), + isToday: this.isEqual(cellDate, today), + title, + value: cellDate + }; + }); + }); + + return data; + } + + isInRange(candidate, min, max) { + const year = firstYearOfDecade(candidate, this.intl.localeIdByDatePickerType).getFullYear(); + const aboveMin = !min || firstYearOfDecade(min, this.intl.localeIdByDatePickerType).getFullYear() <= year; + const belowMax = !max || year <= firstYearOfDecade(max, this.intl.localeIdByDatePickerType).getFullYear(); + return aboveMin && belowMax; + } +} diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/locale.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-cldr-intl.service.ts similarity index 82% rename from projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/locale.service.ts rename to projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-cldr-intl.service.ts index 72d6c91..820e44a 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/locale.service.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-cldr-intl.service.ts @@ -1,15 +1,9 @@ -import { Inject, Injectable, LOCALE_ID, Optional } from '@angular/core'; +import { Inject, Injectable, LOCALE_ID } from '@angular/core'; import { CldrIntlService, NumberFormatOptions } from '@progress/kendo-angular-intl'; +import dayjs, { Dayjs } from 'dayjs'; import { Subject } from 'rxjs'; -import { NumberPipe } from '../pipes/number.pipe'; -import { - MomentNumberService -} from './moment-numbers'; -import dayjs from 'dayjs'; -export enum DatePickerType { - jalali = 'jalali', - gregorian = 'gregorian' -} +import { DatePickerType } from '../models/date-picker-type'; +import { DateTimeNumberService } from './date-time-number.service'; @Injectable() export class JalaliCldrIntlService extends CldrIntlService { @@ -29,7 +23,7 @@ export class JalaliCldrIntlService extends CldrIntlService { constructor( @Inject(LOCALE_ID) private originalLocaleId: string, - private momentNumberService: MomentNumberService + private momentNumberService: DateTimeNumberService ) { super(originalLocaleId); this.changeType(); @@ -73,7 +67,7 @@ export class JalaliCldrIntlService extends CldrIntlService { } toggleType(): void { - this.changeType(this.datePickerType === DatePickerType.jalali ? DatePickerType.gregorian : DatePickerType.jalali); + this.changeType(this.datePickerType === DatePickerType.jalali ? DatePickerType.gregory : DatePickerType.jalali); if (this.isFirst) { this.isFirst = false; // to fix old version of chrome @@ -93,7 +87,7 @@ export class JalaliCldrIntlService extends CldrIntlService { return DatePickerType.jalali; } - return DatePickerType.gregorian; + return DatePickerType.gregory; } formatNumber(value: number, format: string | NumberFormatOptions, localeId?: string): string { @@ -103,4 +97,8 @@ export class JalaliCldrIntlService extends CldrIntlService { } return super.formatNumber(value, format, localeId); } + + getDayJsValue(value?: Date | string, localeId?: string): Dayjs { + return dayjs(value).calendar(this.calendarType).locale(localeId || this.localeId); + } } diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-decade-view.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-decade-view.service.ts new file mode 100644 index 0000000..9087cac --- /dev/null +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-decade-view.service.ts @@ -0,0 +1,80 @@ +import { Inject, Injectable } from '@angular/core'; +import { IntlService } from '@progress/kendo-angular-intl'; +import { addYears } from '@progress/kendo-date-math'; +import dayjs from 'dayjs'; +import { JalaliCldrIntlService } from './jalali-cldr-intl.service'; +import { EMPTY_SELECTIONRANGE, firstYearOfDecade, getToday, isInSelectionRange, lastYearOfDecade, range } from './kendo-util-overrides'; +import { DecadeViewService, EMPTY_DATA, CELLS_LENGTH, ROWS_LENGTH } from './kendo-services/decade-view.service'; + +@Injectable() +export class JalaliDecadeViewService extends DecadeViewService { + constructor( + @Inject(IntlService) private intl: JalaliCldrIntlService + ) { + super(); + } + + + title(value) { + if (!value) { + return ''; + } + + const firstYear = this.intl.getDayJsValue(firstYearOfDecade(value, this.intl.localeIdByDatePickerType)).format('YYYY'); + const lastYear = this.intl.getDayJsValue(lastYearOfDecade(value, this.intl.localeIdByDatePickerType)).format('YYYY'); + if (this.intl.isLocaleIran) { + return `${lastYear} - ${firstYear}`; + } + return `${firstYear} - ${lastYear}`; + } + + navigationTitle(value) { + if (!value) { + return ''; + } + return `${this.intl.getDayJsValue(firstYearOfDecade(value, this.intl.localeIdByDatePickerType)).format('YYYY')}`; + } + data(options) { + const { cellUID, focusedDate, isActiveView, max, min, selectedDates, selectionRange = EMPTY_SELECTIONRANGE, viewDate } = options; + if (!viewDate) { + return EMPTY_DATA; + } + const cells = range(0, CELLS_LENGTH); + const firstDate = firstYearOfDecade(viewDate, this.intl.localeIdByDatePickerType); + const lastDate = lastYearOfDecade(viewDate, this.intl.localeIdByDatePickerType); + const today = getToday(); + // isInRange(selectedDate, min, max) + const data = range(0, ROWS_LENGTH).map(rowOffset => { + const baseDate = addYears(firstDate, rowOffset * CELLS_LENGTH); + return cells.map(cellOffset => { + const cellDate = super['normalize'](addYears(baseDate, cellOffset), min, max); + const nextDecade = cellDate.getFullYear() > lastDate.getFullYear(); + + if (!this.isInRange(cellDate, min, max) || nextDecade) { + return null; + } + const isRangeStart = this.isEqual(cellDate, selectionRange.start); + const isRangeEnd = this.isEqual(cellDate, selectionRange.end); + const isInMiddle = !isRangeStart && !isRangeEnd; + const isRangeMid = isInMiddle && isInSelectionRange(cellDate, selectionRange); + const title = this.intl.getDayJsValue(cellDate).format('YYYY'); + return { + formattedValue: title, + id: `${cellUID}${cellDate.getTime()}`, + isFocused: this.isEqual(cellDate, focusedDate), + isSelected: isActiveView && selectedDates.some(date => this.isEqual(cellDate, date)), + isWeekend: false, + isRangeStart, + isRangeMid, + isRangeEnd, + isRangeSplitEnd: isRangeMid && this.isEqual(cellDate, lastDate), + isRangeSplitStart: isRangeMid && this.isEqual(cellDate, firstDate), + isToday: this.isEqual(cellDate, today), + title, + value: cellDate + }; + }); + }); + return data; + } +} diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-month-view.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-month-view.service.ts index 4643b4e..a77365c 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-month-view.service.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-month-view.service.ts @@ -2,34 +2,34 @@ import { Inject, Injectable } from '@angular/core'; import { IntlService } from '@progress/kendo-angular-intl'; import { addDays, addMonths, dayOfWeek, getDate } from '@progress/kendo-date-math'; import dayjs from 'dayjs'; -import { firstDayOfMonth, getToday, isInSelectionRange, range, lastDayOfMonth } from './utils'; -import { JalaliCldrIntlService } from './locale.service'; -import { MonthViewService, CELLS_LENGTH, EMPTY_DATA, ROWS_LENGTH } from './month-view.service'; +import { firstDayOfMonth, getToday, isInSelectionRange, range, lastDayOfMonth } from './kendo-util-overrides'; +import { JalaliCldrIntlService } from './jalali-cldr-intl.service'; +import { MonthViewService, CELLS_LENGTH, EMPTY_DATA, ROWS_LENGTH } from './kendo-services/month-view.service'; @Injectable() export class JalaliMonthViewService extends MonthViewService { constructor( - @Inject(IntlService) protected intlService: JalaliCldrIntlService + @Inject(IntlService) protected intl: JalaliCldrIntlService ) { - super(intlService); + super(intl); } value(current) { if (!current) { return ''; } - const res = dayjs(current).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('DD').toString(); + const res = this.intl.getDayJsValue(current).format('DD').toString(); return res; } abbrMonthNames2() { - if (this.intlService.isJalali) { + if (this.intl.isJalali) { return Array.from(Array(12).keys()).map((x, i) => { - return dayjs('' + i, 'M').calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('MMMM'); + return this.intl.getDayJsValue('' + i, 'M').format('MMMM'); }); } - return dayjs().calendar(this.intlService.calendarType).locale(this.intlService.localeId).localeData().monthsShort(); + return this.intl.getDayJsValue().localeData().monthsShort(); } navigationTitle(value) { @@ -38,24 +38,24 @@ export class JalaliMonthViewService extends MonthViewService { } if (this.isRangeStart(value)) { - return dayjs(value).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY'); + return this.intl.getDayJsValue(value).format('YYYY'); } - return this.abbrMonthNames2()[dayjs(value).calendar(this.intlService.calendarType).locale(this.intlService.localeId).month()]; + return this.abbrMonthNames2()[this.intl.getDayJsValue(value).month()]; } isRangeStart(value) { if (!value) { return false; } - return dayjs(value).calendar(this.intlService.calendarType).locale(this.intlService.localeId).month() === 0; + return this.intl.getDayJsValue(value).month() === 0; } title(current) { - return `${this.abbrMonthNames2()[dayjs(current).calendar(this.intlService.calendarType).locale(this.intlService.localeId).month()]} ${dayjs(current).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY')}`; + return `${this.abbrMonthNames2()[this.intl.getDayJsValue(current).month()]} ${this.intl.getDayJsValue(current).format('YYYY')}`; } skip(value, min) { - const diff = dayjs(value).calendar(this.intlService.calendarType).locale(this.intlService.localeId).endOf('month').diff( - dayjs(min).calendar(this.intlService.calendarType).locale(this.intlService.localeId).startOf('month'), 'month' + const diff = this.intl.getDayJsValue(value).endOf('month').diff( + this.intl.getDayJsValue(min).startOf('month'), 'month' ); return diff; } @@ -69,7 +69,7 @@ export class JalaliMonthViewService extends MonthViewService { if (!date) { return date; } - return dayjs(date).calendar(this.intlService.calendarType).locale(this.intlService.localeId).startOf('month').toDate(); + return this.intl.getDayJsValue(date).startOf('month').toDate(); } datesList(start, count) { return range(0, count).map(i => addMonths(start, i)); @@ -79,16 +79,16 @@ export class JalaliMonthViewService extends MonthViewService { if (!viewDate) { return EMPTY_DATA; } - const xx = dayjs(viewDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).toDate(); - const firstMonthDate = firstDayOfMonth(xx, this.intlService.localeIdByDatePickerType); + const dateValue = this.intl.getDayJsValue(viewDate).toDate(); + const firstMonthDate = firstDayOfMonth(dateValue, this.intl.localeIdByDatePickerType); const firstMonthDay = getDate(firstMonthDate); - const lastMonthDate = lastDayOfMonth(xx, this.intlService.localeIdByDatePickerType); + const lastMonthDate = lastDayOfMonth(dateValue, this.intl.localeIdByDatePickerType); const lastMonthDay = getDate(lastMonthDate); const backward = -1; const isSelectedDateInRange = dayjs(selectedDate).isBetween(min, max); - const date = dayOfWeek(firstMonthDate, this.intlService.firstDay(), backward); + const date = dayOfWeek(firstMonthDate, this.intl.firstDay(), backward); const cells = range(0, CELLS_LENGTH); - console.log('console',this.intlService.firstDay()) + console.log('console',this.intl.firstDay()) const today = getToday(); return range(0, ROWS_LENGTH).map(rowOffset => { const baseDate = addDays(date, rowOffset * CELLS_LENGTH); diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-week-names.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-week-names.service.ts new file mode 100644 index 0000000..12472df --- /dev/null +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-week-names.service.ts @@ -0,0 +1,16 @@ +import { Injectable } from "@angular/core"; +import { IntlService } from "@progress/kendo-angular-intl"; +import { WeekNamesService } from './kendo-services/week-names.service'; + + +@Injectable() +export class JalaliWeekNamesService extends WeekNamesService { + constructor(intl: IntlService) { + super(intl); + } + + + getWeekNames(includeWeekNumber?: boolean): string[] { + return super.getWeekNames(includeWeekNumber); + } +} diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-year-view.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-year-view.service.ts new file mode 100644 index 0000000..cf91cf6 --- /dev/null +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/jalali-year-view.service.ts @@ -0,0 +1,85 @@ +import { Inject, Injectable } from '@angular/core'; +import { IntlService } from '@progress/kendo-angular-intl'; +import dayjs from 'dayjs'; +import { JalaliCldrIntlService } from './jalali-cldr-intl.service'; +import { EMPTY_SELECTIONRANGE, getToday, isInSelectionRange, range } from './kendo-util-overrides'; +import { addMonths } from '@progress/kendo-date-math'; +import { YearViewService, EMPTY_DATA, CELLS_LENGTH, ROWS_LENGTH } from './kendo-services/year-view.services'; + + +@Injectable() +export class JalaliYearViewService extends YearViewService { + constructor( + @Inject(IntlService) protected intl: JalaliCldrIntlService + ) { + super(intl); + } + + abbrMonthNames2() { + if (this.intl.isJalali) { + return Array.from(Array(12).keys()).map((x, i) => { + return this.intl.getDayJsValue('' + i, 'M').format('MMMM'); + }); + } + + return this.intl.getDayJsValue().localeData().monthsShort(); + } + + override data(options) { + const { cellUID, focusedDate, isActiveView, max, min, selectedDate, selectionRange = EMPTY_SELECTIONRANGE, viewDate } = options; + if (!viewDate) { + return EMPTY_DATA; + } + + const months = this.abbrMonthNames2(); + const isSelectedDateInRange = dayjs(selectedDate).isBetween(min, max); + //firstMonthOfYear + const firstDate = this.intl.getDayJsValue(viewDate).startOf('year').add(this.intl.getDayJsValue(viewDate).date() - 1, 'day').toDate(); + const lastDate = this.intl.getDayJsValue(viewDate).endOf('year').add(-1, 'month').add(this.intl.getDayJsValue(viewDate).date(), 'day').toDate(); + const currentYear = this.intl.getDayJsValue(firstDate).year() + const cells = range(0, CELLS_LENGTH); + const today = getToday(); + + const xxx = range(0, ROWS_LENGTH).map(rowOffset => { + const baseDate = addMonths(firstDate, rowOffset * CELLS_LENGTH); + return cells.map(cellOffset => { + const cellDate = this['normalize'](addMonths(baseDate, cellOffset), min, max); + const changedYear = currentYear < this.intl.getDayJsValue(cellDate).year() + if (!dayjs(cellDate).isBetween(min, max)) { + return null; + } + if (changedYear) { + return null; + } + const isRangeStart = this.isEqual(cellDate, selectionRange.start); + const isRangeEnd = this.isEqual(cellDate, selectionRange.end); + const isInMiddle = !isRangeStart && !isRangeEnd; + const isRangeMid = isInMiddle && isInSelectionRange(cellDate, selectionRange); + return { + formattedValue: months[this.intl.getDayJsValue(cellDate).month()], + id: `${cellUID}${cellDate.getTime()}`, + isFocused: this.isEqual(cellDate, focusedDate), + isSelected: isActiveView && isSelectedDateInRange && this.isEqual(cellDate, selectedDate), + isWeekend: false, + isRangeStart, + isRangeMid, + isRangeEnd, + isRangeSplitEnd: isRangeMid && this.isEqual(cellDate, lastDate), + isRangeSplitStart: isRangeMid && this.isEqual(cellDate, firstDate), + isToday: this.isEqual(cellDate, today), + title: this.cellTitle(cellDate), + value: cellDate + }; + }); + }); + + return xxx; + } + override title(current: any) { + return `${this.intl.getDayJsValue(current).format('YYYY')}` + } + override navigationTitle(value: any) { + return `${this.intl.getDayJsValue(value).format('YYYY')}` + + } +} diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/century-view.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/century-view.service.ts similarity index 60% rename from projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/century-view.service.ts rename to projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/century-view.service.ts index af1b638..28e8235 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/century-view.service.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/century-view.service.ts @@ -1,12 +1,8 @@ -import { Inject, Injectable } from '@angular/core'; -import { IntlService } from '@progress/kendo-angular-intl'; import { addCenturies, addDecades, cloneDate, createDate, durationInCenturies, lastDayOfMonth, lastMonthOfYear, lastYearOfDecade } from '@progress/kendo-date-math'; -import moment from 'dayjs'; -import { JalaliCldrIntlService } from './locale.service'; -import { Action, EMPTY_SELECTIONRANGE, firstDecadeOfCentury, firstYearOfDecade, getToday, isInRange, isInSelectionRange, isPresent, lastDecadeOfCentury, range } from './utils'; -const EMPTY_DATA = [[]]; -const CELLS_LENGTH = 4; -const ROWS_LENGTH = 3; +import { Action, EMPTY_SELECTIONRANGE, firstDecadeOfCentury, firstYearOfDecade, getToday, isInSelectionRange, isPresent, lastDecadeOfCentury, range } from '../kendo-util-overrides'; +export const EMPTY_DATA = [[]]; +export const CELLS_LENGTH = 4; +export const ROWS_LENGTH = 3; const ACTIONS = { [Action.Left]: (date) => addDecades(date, -1), [Action.Up]: (date) => addDecades(date, -5), @@ -162,77 +158,4 @@ export class CenturyViewService { return cellDate; } } -@Injectable() -export class JalaliCenturyViewService extends CenturyViewService { - constructor( - @Inject(IntlService) private intlService: JalaliCldrIntlService - ) { - super(); - } - - title(current) { - if (!current) { - return ''; - } - - const temp = moment(lastDecadeOfCentury(current, this.intlService.localeIdByDatePickerType)).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY'); - return `${moment(firstDecadeOfCentury(current, this.intlService.localeIdByDatePickerType)).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY')} - ${temp}`; - } - - navigationTitle(value) { - return `${moment(firstDecadeOfCentury(value, this.intlService.localeIdByDatePickerType)).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY')}`; - } - - - data(options) { - const { cellUID, focusedDate, isActiveView, max, min, selectedDate, selectionRange = {}, viewDate } = options; - if (!viewDate) { - return EMPTY_DATA; - } - const cells = range(0, CELLS_LENGTH); - const firstDate = firstDecadeOfCentury(viewDate, this.intlService.localeIdByDatePickerType); - const lastDate = lastDecadeOfCentury(viewDate, this.intlService.localeIdByDatePickerType); - const isSelectedDateInRange = isInRange(selectedDate, min, max); - const today = getToday(); - const data = range(0, ROWS_LENGTH).map(rowOffset => { - const baseDate = addDecades(firstDate, rowOffset * CELLS_LENGTH); - return cells.map(cellOffset => { - const cellDate = super['normalize'](addDecades(baseDate, cellOffset), min, max); - if (!this.isInRange(cellDate, firstDate, lastDate)) { - return null; - } - const isRangeStart = this.isEqual(cellDate, selectionRange.start); - const isRangeEnd = this.isEqual(cellDate, selectionRange.end); - const isInMiddle = !isRangeStart && !isRangeEnd; - const isRangeMid = isInMiddle && isInSelectionRange(cellDate, selectionRange); - const title = moment(cellDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY'); - - return { - formattedValue: title, - id: `${cellUID}${cellDate.getTime()}`, - isFocused: this.isEqual(cellDate, focusedDate), - isSelected: isActiveView && isSelectedDateInRange && this.isEqual(cellDate, selectedDate), - isWeekend: false, - isRangeStart, - isRangeMid, - isRangeEnd, - isRangeSplitEnd: isRangeMid && this.isEqual(cellDate, lastDate), - isRangeSplitStart: isRangeMid && this.isEqual(cellDate, firstDate), - isToday: this.isEqual(cellDate, today), - title, - value: cellDate - }; - }); - }); - - return data; - } - - isInRange(candidate, min, max) { - const year = firstYearOfDecade(candidate, this.intlService.localeIdByDatePickerType).getFullYear(); - const aboveMin = !min || firstYearOfDecade(min, this.intlService.localeIdByDatePickerType).getFullYear() <= year; - const belowMax = !max || year <= firstYearOfDecade(max, this.intlService.localeIdByDatePickerType).getFullYear(); - return aboveMin && belowMax; - } -} diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/decade-view.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/decade-view.service.ts similarity index 58% rename from projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/decade-view.service.ts rename to projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/decade-view.service.ts index 01e090d..4af760a 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/decade-view.service.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/decade-view.service.ts @@ -1,13 +1,9 @@ -import { Inject, Injectable } from '@angular/core'; -import { CldrIntlService, IntlService } from '@progress/kendo-angular-intl'; -import { addDecades, addYears, cloneDate, durationInDecades, createDate, lastMonthOfYear, lastDayOfMonth } from '@progress/kendo-date-math'; -import moment from 'dayjs'; -import { JalaliCldrIntlService } from './locale.service'; -import { Action, EMPTY_SELECTIONRANGE, firstYearOfDecade, getToday, isInRange, isInSelectionRange, isPresent, lastYearOfDecade, range } from './utils'; +import { addDecades, addYears, cloneDate, createDate, durationInDecades, lastDayOfMonth, lastMonthOfYear } from '@progress/kendo-date-math'; +import { Action, EMPTY_SELECTIONRANGE, firstYearOfDecade, getToday, isInSelectionRange, isPresent, lastYearOfDecade, range } from '../kendo-util-overrides'; -const EMPTY_DATA = [[]]; -const CELLS_LENGTH = 4; -const ROWS_LENGTH = 3; +export const EMPTY_DATA = [[]]; +export const CELLS_LENGTH = 4; +export const ROWS_LENGTH = 3; const ACTIONS = { [Action.Left]: (date) => addYears(date, -1), [Action.Up]: (date) => addYears(date, -5), @@ -162,74 +158,4 @@ export class DecadeViewService { return cellDate; } } -@Injectable() -export class JalaliDecadeViewService extends DecadeViewService { - constructor( - @Inject(IntlService) private intlService: JalaliCldrIntlService - ) { - super(); - } - - - title(value) { - if (!value) { - return ''; - } - const firstYear = moment(firstYearOfDecade(value, this.intlService.localeIdByDatePickerType)).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY'); - const lastYear = moment(lastYearOfDecade(value, this.intlService.localeIdByDatePickerType)).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY'); - if (this.intlService.isLocaleIran) { - return `${lastYear} - ${firstYear}`; - } - return `${firstYear} - ${lastYear}`; - } - - navigationTitle(value) { - if (!value) { - return ''; - } - return `${moment(firstYearOfDecade(value, this.intlService.localeIdByDatePickerType)).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY')}`; - } - data(options) { - const { cellUID, focusedDate, isActiveView, max, min, selectedDates, selectionRange = EMPTY_SELECTIONRANGE, viewDate } = options; - if (!viewDate) { - return EMPTY_DATA; - } - const cells = range(0, CELLS_LENGTH); - const firstDate = firstYearOfDecade(viewDate, this.intlService.localeIdByDatePickerType); - const lastDate = lastYearOfDecade(viewDate, this.intlService.localeIdByDatePickerType); - const today = getToday(); - // isInRange(selectedDate, min, max) - const data = range(0, ROWS_LENGTH).map(rowOffset => { - const baseDate = addYears(firstDate, rowOffset * CELLS_LENGTH); - return cells.map(cellOffset => { - const cellDate = super['normalize'](addYears(baseDate, cellOffset), min, max); - const nextDecade = cellDate.getFullYear() > lastDate.getFullYear(); - if (!this.isInRange(cellDate, min, max) || nextDecade) { - return null; - } - const isRangeStart = this.isEqual(cellDate, selectionRange.start); - const isRangeEnd = this.isEqual(cellDate, selectionRange.end); - const isInMiddle = !isRangeStart && !isRangeEnd; - const isRangeMid = isInMiddle && isInSelectionRange(cellDate, selectionRange); - const title = moment(cellDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY'); - return { - formattedValue: title, - id: `${cellUID}${cellDate.getTime()}`, - isFocused: this.isEqual(cellDate, focusedDate), - isSelected: isActiveView && selectedDates.some(date => this.isEqual(cellDate, date)), - isWeekend: false, - isRangeStart, - isRangeMid, - isRangeEnd, - isRangeSplitEnd: isRangeMid && this.isEqual(cellDate, lastDate), - isRangeSplitStart: isRangeMid && this.isEqual(cellDate, firstDate), - isToday: this.isEqual(cellDate, today), - title, - value: cellDate - }; - }); - }); - return data; - } -} diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/month-view.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/month-view.service.ts similarity index 93% rename from projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/month-view.service.ts rename to projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/month-view.service.ts index 81bdcf7..0869297 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/month-view.service.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/month-view.service.ts @@ -1,7 +1,7 @@ import { CldrIntlService } from '@progress/kendo-angular-intl'; import { addDays, addWeeks, addMonths, cloneDate, dayOfWeek, durationInMonths, getDate, createDate } from '@progress/kendo-date-math'; import localeData from 'dayjs/plugin/localeData'; -import { firstDayOfMonth, getToday, isInSelectionRange, range, lastDayOfMonth, Action, isPresent, EMPTY_SELECTIONRANGE } from './utils'; +import { firstDayOfMonth, getToday, isInSelectionRange, range, lastDayOfMonth, Action, isPresent, EMPTY_SELECTIONRANGE } from '../kendo-util-overrides'; export const EMPTY_DATA = [[]]; export const CELLS_LENGTH = 7; export const ROWS_LENGTH = 6; @@ -29,7 +29,7 @@ export class MonthViewService { return result; }; - constructor(private _intlService) { + constructor(private _intl) { } addToDate(min, skip) { return addMonths(min, skip); @@ -47,7 +47,7 @@ export class MonthViewService { const lastMonthDate = lastDayOfMonth(viewDate); const lastMonthDay = getDate(lastMonthDate); const backward = -1; - const date = dayOfWeek(firstMonthDate, this._intlService.firstDay(), backward); + const date = dayOfWeek(firstMonthDate, this._intl.firstDay(), backward); const cells = range(0, CELLS_LENGTH); const today = getToday(); return range(0, ROWS_LENGTH).map(rowOffset => { @@ -124,7 +124,7 @@ export class MonthViewService { return modifier(value); } cellTitle(value) { - return this._intlService.formatDate(value, 'D'); + return this._intl.formatDate(value, 'D'); } navigationTitle(value) { if (!value) { @@ -156,7 +156,7 @@ export class MonthViewService { return date; } isWeekend(date) { - const { start, end } = this._intlService.weekendRange(); + const { start, end } = this._intl.weekendRange(); const day = date.getDay(); if (end < start) { return day <= end || start <= day; @@ -164,7 +164,7 @@ export class MonthViewService { return start <= day && day <= end; } abbrMonthNames() { - return this._intlService.dateFormatNames({ nameType: 'abbreviated', type: 'months' }); + return this._intl.dateFormatNames({ nameType: 'abbreviated', type: 'months' }); } normalize(cellDate, min, max) { if (cellDate < min && this.isEqual(cellDate, min)) { @@ -176,7 +176,7 @@ export class MonthViewService { return cellDate; } wideMonthNames() { - return this._intlService.dateFormatNames({ nameType: 'wide', type: 'months' }); + return this._intl.dateFormatNames({ nameType: 'wide', type: 'months' }); } } diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/week-names.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/week-names.service.ts new file mode 100644 index 0000000..89bf4f4 --- /dev/null +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/week-names.service.ts @@ -0,0 +1,11 @@ +import { shiftWeekNames } from '../kendo-util-overrides'; +export class WeekNamesService { + constructor(private intl) { + } + getWeekNames(includeWeekNumber = false) { + const weekNames = shiftWeekNames(this.intl.dateFormatNames({ nameType: 'short', type: 'days' }), this.intl.firstDay()); + return includeWeekNumber ? [''].concat(weekNames) : weekNames; + } +} + + diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/year-view.services.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/year-view.services.ts similarity index 56% rename from projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/year-view.services.ts rename to projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/year-view.services.ts index cb3444e..05e80d4 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/year-view.services.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-services/year-view.services.ts @@ -1,15 +1,13 @@ -import { Inject, Injectable } from '@angular/core'; -import { CldrIntlService, IntlService } from '@progress/kendo-angular-intl'; -import dayjs from 'dayjs'; +import { CldrIntlService } from '@progress/kendo-angular-intl'; -import { JalaliCldrIntlService } from './locale.service'; -import { Action, EMPTY_SELECTIONRANGE, getToday, isInSelectionRange, isPresent, range } from './utils'; +import { JalaliCldrIntlService } from '../jalali-cldr-intl.service'; +import { Action, EMPTY_SELECTIONRANGE, getToday, isInSelectionRange, isPresent, range } from '../kendo-util-overrides'; import { addMonths, addYears, cloneDate, createDate, durationInYears, firstMonthOfYear, lastDayOfMonth, lastMonthOfYear } from '@progress/kendo-date-math'; -const EMPTY_DATA = [[]]; -const CELLS_LENGTH = 4; -const ROWS_LENGTH = 3; +export const EMPTY_DATA = [[]]; +export const CELLS_LENGTH = 4; +export const ROWS_LENGTH = 3; const upStep = (month) => { if (month > 4) { return -5; @@ -52,8 +50,8 @@ export class YearViewService { } return result; }; - constructor(private _intlService: JalaliCldrIntlService) { - this._intlService = _intlService; + constructor(private _intl: JalaliCldrIntlService) { + this._intl = _intl; } addToDate(min, skip) { return addYears(min, skip); @@ -172,7 +170,7 @@ export class YearViewService { return date; } abbrMonthNames() { - return this._intlService.dateFormatNames({ nameType: 'abbreviated', type: 'months' }); + return this._intl.dateFormatNames({ nameType: 'abbreviated', type: 'months' }); } normalize(cellDate, min, max) { if (cellDate < min && this.isEqual(cellDate, min)) { @@ -185,83 +183,4 @@ export class YearViewService { } } -@Injectable() -export class JalaliYearViewService extends YearViewService { - constructor( - @Inject(IntlService) protected intlService: JalaliCldrIntlService - ) { - super(intlService); - } - - abbrMonthNames2() { - if (this.intlService.isJalali) { - return Array.from(Array(12).keys()).map((x, i) => { - return dayjs('' + i, 'M').calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('MMMM'); - }); - } - - return dayjs().locale(this.intlService.localeId).localeData().monthsShort(); - } - - override data(options) { - const { cellUID, focusedDate, isActiveView, max, min, selectedDate, selectionRange = EMPTY_SELECTIONRANGE, viewDate } = options; - if (!viewDate) { - return EMPTY_DATA; - } - - const months = this.abbrMonthNames2(); - const isSelectedDateInRange = dayjs(selectedDate).isBetween(min, max); - //firstMonthOfYear - const firstDate = dayjs(viewDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).startOf('year').add(dayjs(viewDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).date() - 1, 'day').toDate(); - const lastDate = dayjs(viewDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).endOf('year').add(-1, 'month').add(dayjs(viewDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).date(), 'day').toDate(); - // const firstDate = dayjs(viewDate).calendar(this.intlService.calendarType).locale('fa').startOf('month').toDate(); - // const lastDate = dayjs(viewDate).calendar(this.intlService.calendarType).locale('fa').endOf('month').toDate(); - const currentYear = dayjs(firstDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).year(); - const cells = range(0, CELLS_LENGTH); - const today = getToday(); - - const xxx = range(0, ROWS_LENGTH).map(rowOffset => { - const baseDate = addMonths(firstDate, rowOffset * CELLS_LENGTH); - return cells.map(cellOffset => { - const cellDate = this['normalize'](addMonths(baseDate, cellOffset), min, max); - const changedYear = currentYear < dayjs(cellDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).year(); - if (!dayjs(cellDate).isBetween(min, max)) { - return null; - } - if (changedYear) { - return null; - } - const isRangeStart = this.isEqual(cellDate, selectionRange.start); - const isRangeEnd = this.isEqual(cellDate, selectionRange.end); - const isInMiddle = !isRangeStart && !isRangeEnd; - const isRangeMid = isInMiddle && isInSelectionRange(cellDate, selectionRange); - return { - formattedValue: months[dayjs(cellDate).calendar(this.intlService.calendarType).locale(this.intlService.localeId).month()], - id: `${cellUID}${cellDate.getTime()}`, - isFocused: this.isEqual(cellDate, focusedDate), - isSelected: isActiveView && isSelectedDateInRange && this.isEqual(cellDate, selectedDate), - isWeekend: false, - isRangeStart, - isRangeMid, - isRangeEnd, - isRangeSplitEnd: isRangeMid && this.isEqual(cellDate, lastDate), - isRangeSplitStart: isRangeMid && this.isEqual(cellDate, firstDate), - isToday: this.isEqual(cellDate, today), - title: this.cellTitle(cellDate), - value: cellDate - }; - }); - }); - - return xxx; - } - override title(current: any) { - return `${dayjs(current).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY')}`; - } - override navigationTitle(value: any) { - return `${dayjs(value).calendar(this.intlService.calendarType).locale(this.intlService.localeId).format('YYYY')}`; - - } -} - diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/utils.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-util-overrides.ts similarity index 57% rename from projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/utils.ts rename to projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-util-overrides.ts index 1aef168..5555df9 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/utils.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/kendo-util-overrides.ts @@ -1,5 +1,5 @@ import { getDate } from '@progress/kendo-date-math'; -import moment from 'dayjs'; +import dayjs from 'dayjs'; export const range = (start, end, step = 1) => { const result = []; @@ -8,50 +8,52 @@ export const range = (start, end, step = 1) => { } return result; }; + export const EMPTY_SELECTIONRANGE = { start: null, end: null }; export const getToday = () => getDate(new Date()); + export const isInSelectionRange = (value, selectionRange) => { const { start, end } = selectionRange || EMPTY_SELECTIONRANGE; if (!start || !end) { return false; } return start < value && value < end; -}; +} + export const isInRange = (dt, min, max) => { - return moment(dt).isBetween(min, max); + return dayjs(dt).isBetween(min, max); } + export const firstYearOfDecade = (dt, localeId?) => { - const year = moment(dt).calendar(getCalendarType(localeId)).year(); - return moment(dt).calendar(getCalendarType(localeId)).add(-(year % 10), 'year').toDate(); + return getDayJsValue(dt, localeId).add(-(getYear(dt, localeId) % 10), 'year').toDate(); } + export const lastYearOfDecade = (dt, localeId?) => { - const year = moment(dt).calendar(getCalendarType(localeId)).year(); - return moment(dt).calendar(getCalendarType(localeId)).add((9 - (year % 10)), 'year').toDate(); + return getDayJsValue(dt, localeId).add((9 - (getYear(dt, localeId) % 10)), 'year').toDate(); } + export const firstDayOfMonth = (dt, localeId?) => { - return moment(dt).calendar(getCalendarType(localeId)).startOf('month').toDate(); + return getDayJsValue(dt, localeId).startOf('month').toDate(); } + export const lastDayOfMonth = (dt, localeId?) => { - return moment(dt).calendar(getCalendarType(localeId)).endOf('month').toDate(); + return getDayJsValue(dt, localeId).endOf('month').toDate(); } -// export const addMonths2 = (date, offset) => { -// var newDate = moment(date).toDate(); -// var diff = (newDate.getMonth() + offset) % 12; -// var expectedMonth = (12 + diff) % 12; -// newDate.setMonth(newDate.getMonth() + offset); -// return normalize(adjust_dst_1.adjustDST(newDate, date.getHours()), expectedMonth); -// }; -export const getCalendarType = (localeId: string) => { + +const getCalendarType = (localeId: string) => { return (localeId === 'fa' || localeId === 'fa-IR') ? 'jalali' : 'gregory'; } +const getDayJsValue = (dt: any, localeId: string) => { + return dayjs(dt).calendar(getCalendarType(localeId)) +} + export const firstDecadeOfCentury = (dt, localeId?) => { - const x = moment(dt).calendar(getCalendarType(localeId)).year(); - return moment(dt).calendar(getCalendarType(localeId)).add((-(x % 100)), 'year').toDate(); + return getDayJsValue(dt, localeId).add((-(getYear(dt, localeId) % 100)), 'year').toDate(); } + export const lastDecadeOfCentury = (dt, localeId?) => { - const x = moment(dt).calendar(getCalendarType(localeId)).year(); - return moment(dt).calendar(getCalendarType(localeId)).add((-(x % 100)) + 90, 'year').toDate(); + return getDayJsValue(dt, localeId).add((-(getYear(dt, localeId) % 100)) + 90, 'year').toDate(); } @@ -70,4 +72,10 @@ export var Action; Action[Action["LowerView"] = 8] = "LowerView"; Action[Action["UpperView"] = 9] = "UpperView"; })(Action || (Action = {})); + export const isPresent = (value) => value !== undefined && value !== null; + +function getYear(dt: any, localeId: any) { + return getDayJsValue(dt, localeId).year(); +} + diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/moment-numbers.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/moment-numbers.ts deleted file mode 100644 index bc9f899..0000000 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/moment-numbers.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { Inject, Injectable, LOCALE_ID } from '@angular/core'; -import dayjs from 'dayjs'; -import { IConfig } from '../models/config.model'; -declare global { - interface String { - toPerNumber(): string; - toEnNumber(): string; - toMomentDateTimeFormat(): string; - revertPersianWord(): string; - } -} - -String.prototype.toPerNumber = function () { - return this.replace(/\d/g, (match) => { - return enToPerNumberMap[match] || match; - }); -}; -String.prototype.toEnNumber = function () { - return this.replace(/[١٢٣٤٥٦٧٨٩٠]/g, (match) => { - return perToEnNumberMap[match] || match; - }); -}; -String.prototype.toMomentDateTimeFormat = function () { - let x = this.replace(/d/g, 'D') - .replace(/aa/ig, (m) => m[0]) - .replace(/_/g, '/') - .replace(/[y]{1,}/, 'YYYY'); - - return x; -}; -String.prototype.revertPersianWord = function () { - return this.replace(/(?:(?![٠-٩])[\u0600-\u06FF]){2,}/g, (m) => reverseString(m)); -}; -export const enToPerNumberMap = { - 1: '١', - 2: '٢', - 3: '٣', - 4: '٤', - 5: '٥', - 6: '٦', - 7: '٧', - 8: '٨', - 9: '٩', - 0: '٠' -}; -export const perToEnNumberMap = { - '١': '1', - '٢': '2', - '٣': '3', - '٤': '4', - '٥': '5', - '٦': '6', - '٧': '7', - '٨': '8', - '٩': '9', - '٠': '0' -}; -export const reverseString = str => [...str].reverse().join(''); - -@Injectable() -export class MomentNumberService { - usePersianNumber: boolean; - - constructor( - @Inject(LOCALE_ID) localeId: string, - @Inject('CONFIGS') private configs: IConfig - ) { - this.setLocaleId(localeId); - this.init(); - } - - setLocaleId(value: string) { - this.usePersianNumber = value === 'fa' || value === 'fa-IR'; - } - - init() { - if (this.configs?.usePersianNumber === false) { - return; - } - const me = this; - // dayjs.localeData().months(); - const te = dayjs.prototype.format; - dayjs.prototype.format = function (format) { - - if (!me.usePersianNumber) { - return te.call(this, format); - } - - let result = te.call(this, format); - result = result.toPerNumber().replace(/,/g, '،'); - return result; - }; - } -} diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/week-names.service.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/week-names.service.ts deleted file mode 100644 index 91b8f68..0000000 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/week-names.service.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Injectable } from '@angular/core'; -import { IntlService } from '@progress/kendo-angular-intl'; -import { shiftWeekNames } from './utils'; -export class WeekNamesService { - constructor(private intl) { - } - getWeekNames(includeWeekNumber = false) { - const weekNames = shiftWeekNames(this.intl.dateFormatNames({ nameType: 'short', type: 'days' }), this.intl.firstDay()); - return includeWeekNumber ? [''].concat(weekNames) : weekNames; - } -} - -@Injectable() -export class JalaliWeekNamesService extends WeekNamesService { - constructor(protected intlService: IntlService) { - super(intlService); - } - - - getWeekNames(includeWeekNumber?: boolean): string[] { - return super.getWeekNames(includeWeekNumber); - } -} diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/lib/utils/string-prototypes.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/utils/string-prototypes.ts new file mode 100644 index 0000000..276ce44 --- /dev/null +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/lib/utils/string-prototypes.ts @@ -0,0 +1,51 @@ +declare global { + interface String { + toPerNumber(): string; + toEnNumber(): string; + toMomentDateTimeFormat(): string; + } +} + +String.prototype.toPerNumber = function () { + return this.replace(/\d/g, (match) => { + return enToPerNumberMap[match] || match; + }); +}; +String.prototype.toEnNumber = function () { + return this.replace(/[١٢٣٤٥٦٧٨٩٠]/g, (match) => { + return perToEnNumberMap[match] || match; + }); +}; +String.prototype.toMomentDateTimeFormat = function () { + let x = this.replace(/d/g, 'D') + .replace(/aa/ig, (m) => m[0]) + .replace(/_/g, '/') + .replace(/[y]{1,}/, 'YYYY'); + + return x; +}; + +export const enToPerNumberMap = { + 1: '١', + 2: '٢', + 3: '٣', + 4: '٤', + 5: '٥', + 6: '٦', + 7: '٧', + 8: '٨', + 9: '٩', + 0: '٠' +}; +export const perToEnNumberMap = { + '١': '1', + '٢': '2', + '٣': '3', + '٤': '4', + '٥': '5', + '٦': '6', + '٧': '7', + '٨': '8', + '٩': '9', + '٠': '0' +}; \ No newline at end of file diff --git a/projects/tiampersian/kendo-jalali-date-inputs/src/public-api.ts b/projects/tiampersian/kendo-jalali-date-inputs/src/public-api.ts index 34ead70..0d8bdac 100644 --- a/projects/tiampersian/kendo-jalali-date-inputs/src/public-api.ts +++ b/projects/tiampersian/kendo-jalali-date-inputs/src/public-api.ts @@ -3,9 +3,9 @@ */ export * from './lib/kendo-jalali-date-inputs.module'; -export * from './lib/services/locale.service'; +export * from './lib/services/jalali-cldr-intl.service'; export * from './lib/components/date-input.component'; -// export * from './lib/components/header.component'; export * from './lib/components/calendar.component'; export * from './lib/components/navigation.directive'; -export * from './lib/pipes/number.pipe'; +export * from './lib/models/date-picker-type'; +export * from './lib/models/config.model'; diff --git a/src/app/app.component.html b/src/app/app.component.html index 1277add..14b3400 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -427,21 +427,21 @@

Basic Usage

style="min-height: 450px;display: flex;">

DateInput

- +

(use and to navigate, and to update)

DatePicker

- +

(use Alt+ to open the Calendar)

TimePicker

- +

(use Alt+↓ to open the time list, Tab to move to the next time section in the popup, ↑ to increment and ↓ to decrement the value)

DateTimePicker

- +

(use Alt+↓ to open the popup, Alt+ and Alt+ to switch between the tabs when open)

@@ -449,13 +449,13 @@

Basic Usage


Calendar

+ [(value)]="value">

MultiViewCalendar

- +
diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 434697e..8fc4b9f 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -19,8 +19,8 @@ describe('AppComponent', () => { imports: [ NoopAnimationsModule, BrowserModule, - FormsModule, - KendoJalaliDateInputsModule], + KendoJalaliDateInputsModule + ], declarations: [ AppComponent ], diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 48bdb08..70f39d4 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -23,7 +23,7 @@ export class AppComponent { @Inject(IntlService) private localeService: JalaliCldrIntlService, private cdr: ChangeDetectorRef ) { - this.calendarType = localeService.isJalali ? DatePickerType.jalali : DatePickerType.gregorian; + this.calendarType = localeService.isJalali ? DatePickerType.jalali : DatePickerType.gregory; this.currentLocaleId = localeService.localeId; } diff --git a/src/app/dateinput.component.spec.page.ts b/src/app/dateinput.component.spec.page.ts index 2e6ce33..2b994a3 100644 --- a/src/app/dateinput.component.spec.page.ts +++ b/src/app/dateinput.component.spec.page.ts @@ -1,5 +1,5 @@ import { interval, Subject } from 'rxjs'; -import { DatePickerType } from './../../projects/tiampersian/kendo-jalali-date-inputs/src/lib/services/locale.service'; +import { DatePickerType } from 'projects/tiampersian/kendo-jalali-date-inputs/src/lib/models/date-picker-type'; import { DateInputComponent } from '@progress/kendo-angular-dateinputs'; import { ComponentFixture, TestBed, tick } from '@angular/core/testing'; import { BrowserModule } from '@angular/platform-browser'; @@ -55,7 +55,7 @@ export class DateInputComponentPage { return this; } with_gregorian_mode() { - this.intl.changeType(DatePickerType.gregorian); + this.intl.changeType(DatePickerType.gregory); return this; } diff --git a/src/app/dateinput.component.spec.ts b/src/app/dateinput.component.spec.ts index 69eafe5..dc09c77 100644 --- a/src/app/dateinput.component.spec.ts +++ b/src/app/dateinput.component.spec.ts @@ -7,7 +7,6 @@ import localeData from 'dayjs/plugin/localeData'; import 'dayjs/locale/fa'; dayjs.extend(isBetween); dayjs.extend(localeData); -window['dayjs'] = dayjs; describe('SUT(integration): DateInputComponent', () => { let sutPage: DateInputComponentPage; @@ -16,12 +15,9 @@ describe('SUT(integration): DateInputComponent', () => { const expected_value_gregorian = dayjs(some_value).locale('en').format('M/D/YYYY')/*?*/; beforeEach(async () => { - sutPage = await (await new DateInputComponentPage().init()); + sutPage = await new DateInputComponentPage().init(); }); - afterEach(() => { - sutPage.fixture.destroy(); - }); it(`should create properly`, () => { // assert @@ -167,7 +163,16 @@ describe('SUT(integration): DateInputComponent', () => { }); function getJalaliValue(value: string) { - return dayjs(dayjs(value).format('YYYY/M/D'), { jalali: true } as any).toDate().toISOString(); + try { + if (dayjs(value).isValid()) { + return dayjs(dayjs(value).format('YYYY/M/D'), { jalali: true } as any).toDate().toISOString(); + } + return dayjs(value, 'YYYY/M/D', { jalali: true } as any).toDate().toISOString(); + + } catch (error) { + console.log(error) + } + return dayjs().toDate().toISOString(); } function getGregorianValue(value: string) { return dayjs(value, 'M/D/YYYY', 'en').toDate().toISOString(); From 608bec59d841b8e86694c71d9f35267707537428 Mon Sep 17 00:00:00 2001 From: tiampersian Date: Sat, 18 Nov 2023 13:23:37 +0330 Subject: [PATCH 4/4] fix packages version --- package.json | 57 ++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index 67b683f..c4b20f7 100644 --- a/package.json +++ b/package.json @@ -19,52 +19,51 @@ }, "private": false, "dependencies": { - "@angular/animations": "16.1.4", - "@angular/common": "16.1.4", - "@angular/compiler": "16.1.4", - "@angular/core": "16.1.4", - "@angular/forms": "16.1.4", - "@angular/localize": "16.1.4", - "@angular/platform-browser": "16.1.4", - "@angular/platform-browser-dynamic": "16.1.4", - "@angular/router": "16.1.4", - "@progress/kendo-angular-buttons": "13.1.0", - "@progress/kendo-angular-common": "13.1.0", - "@progress/kendo-angular-dateinputs": "13.1.0", - "@progress/kendo-angular-dialog": "13.1.0", - "@progress/kendo-angular-icons": "13.1.0", - "@progress/kendo-angular-inputs": "13.1.0", - "@progress/kendo-angular-intl": "13.1.0", - "@progress/kendo-angular-l10n": "13.1.0", - "@progress/kendo-angular-navigation": "13.1.0", - "@progress/kendo-angular-popup": "13.1.0", + "@angular/animations": "16.2.2", + "@angular/common": "16.2.2", + "@angular/compiler": "16.2.2", + "@angular/core": "16.2.2", + "@angular/forms": "16.2.2", + "@angular/localize": "16.2.2", + "@angular/platform-browser": "16.2.2", + "@angular/platform-browser-dynamic": "16.2.2", + "@angular/router": "16.2.2", + "@progress/kendo-angular-buttons": "13.3.0", + "@progress/kendo-angular-common": "13.3.0", + "@progress/kendo-angular-dateinputs": "13.3.0", + "@progress/kendo-angular-dialog": "13.3.0", + "@progress/kendo-angular-icons": "13.3.0", + "@progress/kendo-angular-inputs": "13.3.0", + "@progress/kendo-angular-intl": "13.3.0", + "@progress/kendo-angular-l10n": "13.3.0", + "@progress/kendo-angular-navigation": "13.3.0", + "@progress/kendo-angular-popup": "13.3.0", "@progress/kendo-drawing": "1.17.5", "@progress/kendo-licensing": "1.3.0", "@progress/kendo-svg-icons": "1.6.0", "@progress/kendo-theme-default": "6.5.0", - "dayjs": "*", - "dayjs-jalali": "*", - "jalaliday": "*", + "dayjs": "1.11.10", + "jalaliday": "2.3.0", "rxjs": "7.8.1", "tslib": "2.6.0", "zone.js": "0.13.1" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.1.4", - "@angular/cli": "16.1.4", - "@angular/compiler-cli": "16.1.4", + "@angular-devkit/build-angular": "16.2.0", + "@angular/cli": "16.2.0", + "@angular/compiler-cli": "16.2.2", "@types/jasmine": "4.3.5", "@types/node": "18.15.3", - "codelyzer": "^6.0.2", + "codelyzer": "6.0.2", "jasmine-core": "5.0.1", "jasmine-spec-reporter": "7.0.0", "karma": "6.4.2", "karma-chrome-launcher": "3.2.0", - "karma-coverage": "^2.2.1", + "karma-coverage": "2.2.1", "karma-jasmine": "5.1.0", "karma-jasmine-html-reporter": "2.1.0", - "ng-packagr": "^16.1.0", - "protractor": "^7.0.0", + "ng-packagr": "16.2.1", + "protractor": "7.0.0", "ts-node": "10.9.1", "typescript": "5.1.6" },