Skip to content

Commit 8866350

Browse files
author
pipeline
committed
v20.2.50 is released
1 parent 12cb0dc commit 8866350

File tree

128 files changed

+3479
-849
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

128 files changed

+3479
-849
lines changed

controls/calendars/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22

33
## [Unreleased]
44

5+
## 20.2.50 (2022-09-20)
6+
7+
### Calendar
8+
9+
#### Bug Fixes
10+
11+
- `#I403191` - The issue "change event argument contains duplicate dates while using multiselection" has been resolved
12+
513
## 19.3.46 (2021-10-19)
614

715
### TimePicker

controls/calendars/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@syncfusion/ej2-calendars",
3-
"version": "20.2.45",
3+
"version": "20.2.46",
44
"description": "A complete package of date or time components with built-in features such as date formatting, inline editing, multiple (range) selection, range restriction, month and year selection, strict mode, and globalization.",
55
"author": "Syncfusion Inc.",
66
"license": "SEE LICENSE IN license",

controls/calendars/spec/daterangepicker/daterangepicker.spec.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -945,14 +945,12 @@ describe('DateRangePicker', () => {
945945
daterangepicker = new DateRangePicker();
946946
daterangepicker.appendTo('#date');
947947
expect(daterangepicker.placeholder === 'Select the Date Range' && daterangepicker.element.getAttribute("placeholder") === 'Select the Date Range').toBe(true);
948-
expect(daterangepicker.element.getAttribute('aria-placeholder')).toBe('Select the Date Range');
949948
});
950949
it('Element Model placeholder testing ', () => {
951950
ele.setAttribute('placeholder', 'Select the Date Range');
952951
daterangepicker = new DateRangePicker({ placeholder: 'Select Range' });
953952
daterangepicker.appendTo('#date');
954953
expect(daterangepicker.placeholder === 'Select Range' && daterangepicker.element.getAttribute("placeholder") === 'Select Range').toBe(true);
955-
expect(daterangepicker.element.getAttribute('aria-placeholder')).toBe('Select Range');
956954
});
957955
it('Element disable testing', () => {
958956
ele.setAttribute('disabled', '');
@@ -4194,14 +4192,12 @@ describe('DateRangePicker', () => {
41944192
daterangepicker.locale = 'de';
41954193
daterangepicker.dataBind();
41964194
expect(daterangepicker.locale === 'de').toBe(true);
4197-
expect(daterangepicker.element.getAttribute('aria-placeholder') === daterangepicker.l10n.getConstant('placeholder')).toBe(true);
41984195
});
41994196
it('Update Locale test case(ja)', function () {
42004197
daterangepicker = createControl({ placeholder: 'Select Range' });
42014198
daterangepicker.locale = 'ja';
42024199
daterangepicker.dataBind();
42034200
expect(daterangepicker.locale === 'ja').toBe(true);
4204-
expect(daterangepicker.element.getAttribute('aria-placeholder') === daterangepicker.l10n.getConstant('placeholder')).toBe(true);
42054201
});
42064202
it('Update Locale range test case', function () {
42074203
daterangepicker = createControl({ startDate: new Date('02/24/2017'), endDate: new Date('08/10/2017') });

controls/calendars/spec/datetimepicker/datetimepicker.spec.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,6 @@ describe('DateTimepicker', () => {
181181
}
182182
expect(datetimepicker.element.getAttribute('aria-expanded')).toBe('true');
183183
});
184-
it('element ARIA placeholder testing', () => {
185-
expect(datetimepicker.element.getAttribute('aria-placeholder')).toEqual(null);
186-
});
187184
it('element placeholder testing', () => {
188185
expect(datetimepicker.element.getAttribute('placeholder')).toEqual(null);
189186
});
@@ -694,7 +691,6 @@ describe('DOM Wrapper Testing with basic properites', () => {
694691
it('placeholder testing', () => {
695692
datetimepicker = new DateTimePicker({ placeholder: "select DateTime" });
696693
datetimepicker.appendTo('#dateTime');
697-
expect(datetimepicker.inputElement.getAttribute('aria-placeholder')).toEqual('select DateTime');
698694
});
699695
it('Empty value testing', () => {
700696
datetimepicker = new DateTimePicker({ placeholder: "select DateTime", renderDayCell: onRender, value: new Date('2/1/2018 12:00 PM') });
@@ -708,9 +704,6 @@ describe('DOM Wrapper Testing with basic properites', () => {
708704
it('enabled false input element ARIA-DISABELD testing', () => {
709705
expect(datetimepicker.inputElement.getAttribute('aria-disabled')).toEqual('true');
710706
});
711-
it('placeholder ARIA-PLACEHOLDER testing', () => {
712-
expect(datetimepicker.inputElement.getAttribute('aria-placeholder')).toEqual(null);
713-
});
714707
it('placeholder attribute testing', () => {
715708
expect(datetimepicker.inputElement.getAttribute('placeholder')).toEqual(null);
716709
});

controls/calendars/spec/timepicker/timepicker.spec.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,6 @@ describe('TimePicker', () => {
171171
}
172172
expect(timeObj.element.getAttribute('aria-expanded')).toBe('true');
173173
});
174-
it('element ARIA placeholder testing', () => {
175-
expect(timeObj.element.getAttribute('aria-placeholder')).toEqual(null);
176-
});
177174
it('element placeholder testing', () => {
178175
expect(timeObj.element.getAttribute('placeholder')).toEqual(null);
179176
});
@@ -623,7 +620,6 @@ describe('TimePicker', () => {
623620
it('element ARIA placeholder testing', () => {
624621
timeObj = new TimePicker({ placeholder: 'Select Time', floatLabelType: 'Never' });
625622
timeObj.appendTo('#timepicker2');
626-
expect(timeObj.element.getAttribute('aria-placeholder')).toEqual('Select Time');
627623
});
628624
it('element placeholder testing', () => {
629625
timeObj = new TimePicker({ placeholder: 'Select Time', floatLabelType: 'Never' });
@@ -710,9 +706,6 @@ describe('TimePicker', () => {
710706
it('enabled false input element ARIA-DISABELD testing', () => {
711707
expect(timeObj.element.getAttribute('aria-disabled')).toEqual('true');
712708
});
713-
it('placeholder ARIA-PLACEHOLDER testing', () => {
714-
expect(timeObj.element.getAttribute('aria-placeholder')).toEqual(timeObj.placeholder);
715-
});
716709
it('placeholder attribute testing', () => {
717710
expect(timeObj.element.getAttribute('placeholder')).toEqual(timeObj.placeholder);
718711
});
@@ -735,9 +728,6 @@ describe('TimePicker', () => {
735728
}
736729
document.body.innerHTML = '';
737730
});
738-
it('placeholder ARIA-PLACEHOLDER testing', () => {
739-
expect(timeObj.element.getAttribute('aria-placeholder')).toEqual(null);
740-
});
741731
it('placeholder attribute testing', () => {
742732
expect(timeObj.element.getAttribute('placeholder')).toEqual(null);
743733
});
@@ -1017,7 +1007,6 @@ describe('TimePicker', () => {
10171007
timeObj.placeholder = 'select';
10181008
timeObj.dataBind();
10191009
expect(timeObj.element.getAttribute('placeholder')).toBe(timeObj.placeholder);
1020-
expect(timeObj.element.getAttribute('aria-placeholder')).toBe(timeObj.placeholder);
10211010
});
10221011
it('min testing', () => {
10231012
timeObj.min = new Date("12/12/2016 10:00 AM");

controls/calendars/src/calendar/calendar.ts

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ export class CalendarBase extends Component<HTMLElement> implements INotifyPrope
111111
protected todayButtonEvent: MouseEvent | KeyboardEvent;
112112
protected preventChange: boolean = false;
113113
protected isAngular: boolean = false;
114+
protected previousDates: boolean = false;
114115
/**
115116
* Gets or sets the minimum date that can be selected in the Calendar.
116117
*
@@ -966,7 +967,7 @@ export class CalendarBase extends Component<HTMLElement> implements INotifyPrope
966967
const numCells: number = this.weekNumber ? 8 : 7;
967968
let tdEles: HTMLElement[];
968969
if (this.calendarMode === 'Gregorian') {
969-
tdEles = this.renderDays(this.currentDate, value, null, null, isCustomDate);
970+
tdEles = this.renderDays(this.currentDate, value, null, null, isCustomDate, e);
970971
} else {
971972
tdEles = this.islamicModule.islamicRenderDays(this.currentDate, value);
972973
}
@@ -977,7 +978,7 @@ export class CalendarBase extends Component<HTMLElement> implements INotifyPrope
977978
this.islamicModule.islamicRenderTemplate(tdEles, numCells, MONTH, e, value);
978979
}
979980
}
980-
protected renderDays(currentDate: Date, value?: Date, multiSelection?: boolean, values?: Date[], isTodayDate?: boolean): HTMLElement[] {
981+
protected renderDays(currentDate: Date, value?: Date, multiSelection?: boolean, values?: Date[], isTodayDate?: boolean, e?:Event): HTMLElement[] {
981982
const tdEles: HTMLElement[] = [];
982983
const cellsCount: number = 42;
983984
const todayDate: Date = isTodayDate ? new Date(+currentDate) : this.getDate(new Date(), this.timezone);
@@ -1068,6 +1069,9 @@ export class CalendarBase extends Component<HTMLElement> implements INotifyPrope
10681069
// if (args.isDisabled && +this.value === +args.date) {
10691070
// this.setProperties({ value: null }, true);
10701071
// }
1072+
let currentTarget: any;
1073+
if ( !isNullOrUndefined(e) && e.type == 'click') {
1074+
currentTarget = e.currentTarget; }
10711075
if (multiSelection && !isNullOrUndefined(values) && !disabledCls) {
10721076
for (let tempValue: number = 0; tempValue < values.length; tempValue++) {
10731077
const type: string = (this.calendarMode === 'Gregorian') ? 'gregorian' : 'islamic';
@@ -1077,7 +1081,23 @@ export class CalendarBase extends Component<HTMLElement> implements INotifyPrope
10771081
if ((localDateString === tempDateString && this.getDateVal(localDate, values[tempValue]))
10781082
|| (this.getDateVal(localDate, value))) {
10791083
addClass([tdEle], SELECTED);
1080-
} else {
1084+
} if (!isNullOrUndefined(currentTarget) && currentTarget.innerText === tdEle.innerText && this.previousDates && currentTarget.classList.contains(SELECTED)) {
1085+
removeClass([tdEle], SELECTED);
1086+
this.previousDates = false;
1087+
const copyValues: Date[] = this.copyValues(values);
1088+
for (let i: number = 0; i < copyValues.length; i++) {
1089+
const type: string = (this.calendarMode === 'Gregorian') ? 'gregorian' : 'islamic';
1090+
const formatOptions: object = { format: null, type: 'date', skeleton: 'short', calendar: type };
1091+
const localDateString: string = this.globalize.formatDate(date, formatOptions);
1092+
const tempDateString: string = this.globalize.formatDate(copyValues[i], formatOptions);
1093+
if (localDateString === tempDateString) {
1094+
const index: number = copyValues.indexOf(copyValues[i]);
1095+
copyValues.splice(index, 1);
1096+
}
1097+
}
1098+
this.setProperties({ values: copyValues }, true);
1099+
}
1100+
else {
10811101
this.updateFocus(otherMnthBool, disabledCls, localDate, tdEle, currentDate);
10821102
}
10831103
}
@@ -2451,8 +2471,8 @@ export class Calendar extends CalendarBase {
24512471
protected renderMonths(e?: Event, value?: Date, isCustomDate?: boolean): void {
24522472
super.renderMonths(e, this.value, isCustomDate);
24532473
}
2454-
protected renderDays(currentDate: Date, value?: Date, isMultiSelect?: boolean, values?: Date[], isCustomDate?: boolean): HTMLElement[] {
2455-
const tempDays: HTMLElement[] = super.renderDays(currentDate, this.value, this.isMultiSelection, this.values, isCustomDate);
2474+
protected renderDays(currentDate: Date, value?: Date, isMultiSelect?: boolean, values?: Date[], isCustomDate?: boolean, e?: Event): HTMLElement[] {
2475+
const tempDays: HTMLElement[] = super.renderDays(currentDate, this.value, this.isMultiSelection, this.values, isCustomDate, e);
24562476
if (this.isMultiSelection) {
24572477
super.validateValues(this.isMultiSelection, this.values);
24582478
}
@@ -2488,9 +2508,14 @@ export class Calendar extends CalendarBase {
24882508
if (eve.classList.contains(OTHERMONTH)) {
24892509
if (this.isMultiSelection) {
24902510
const copyValues: Date[] = this.copyValues(this.values);
2511+
if (copyValues.toString().indexOf(this.getIdValue(e, null).toString()) === -1) {
24912512
copyValues.push(this.getIdValue(e, null));
24922513
this.setProperties({ values: copyValues }, true);
24932514
this.setProperties({ value: this.values[this.values.length - 1] }, true);
2515+
}
2516+
else {
2517+
this.previousDates = true;
2518+
}
24942519
} else {
24952520
this.setProperties({ value: this.getIdValue(e, null) }, true);
24962521
}

controls/calendars/src/datepicker/datepicker.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,10 @@ export class DatePicker extends Calendar implements IInput {
458458
public render(): void {
459459
this.initialize();
460460
this.bindEvents();
461+
Input.calculateWidth(this.inputElement, this.inputWrapper.container);
462+
if (!isNullOrUndefined(this.inputWrapper.buttons[0]) && !isNullOrUndefined(this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0]) && this.floatLabelType !== 'Never') {
463+
this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0].classList.add('e-icon');
464+
}
461465
this.renderComplete();
462466
this.setTimeZone(this.serverTimezoneOffset);
463467
}
@@ -2151,11 +2155,18 @@ export class DatePicker extends Calendar implements IInput {
21512155
break;
21522156
case 'width':
21532157
this.setWidth(newProp.width);
2158+
Input.calculateWidth(this.inputElement, this.inputWrapper.container);
2159+
if (!isNullOrUndefined(this.inputWrapper.buttons[0]) && !isNullOrUndefined(this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0]) && this.floatLabelType !== 'Never') {
2160+
this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0].classList.add('e-icon');
2161+
}
21542162
break;
21552163
case 'floatLabelType':
21562164
this.floatLabelType = newProp.floatLabelType;
21572165
Input.removeFloating(this.inputWrapper);
21582166
Input.addFloating(this.inputElement, this.floatLabelType, this.placeholder);
2167+
if (!isNullOrUndefined(this.inputWrapper.buttons[0]) && !isNullOrUndefined(this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0]) && this.floatLabelType !== 'Never') {
2168+
this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0].classList.add('e-icon');
2169+
}
21592170
break;
21602171
case 'enableMask':
21612172
if (this.enableMask) {

controls/calendars/src/daterangepicker/daterangepicker.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,10 @@ export class DateRangePicker extends CalendarBase {
737737
if (this.element.hasAttribute('data-val')) {
738738
this.element.setAttribute('data-val', 'false');
739739
}
740+
Input.calculateWidth(this.inputElement, this.inputWrapper.container);
741+
if (!isNullOrUndefined(this.inputWrapper.buttons[0]) && !isNullOrUndefined(this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0]) && this.floatLabelType !== 'Never') {
742+
this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0].classList.add('e-icon');
743+
}
740744
this.renderComplete();
741745
}
742746
/**
@@ -4546,6 +4550,10 @@ export class DateRangePicker extends CalendarBase {
45464550
switch (prop) {
45474551
case 'width':
45484552
this.setEleWidth(this.width);
4553+
Input.calculateWidth(this.inputElement, this.inputWrapper.container);
4554+
if (!isNullOrUndefined(this.inputWrapper.buttons[0]) && !isNullOrUndefined(this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0]) && this.floatLabelType !== 'Never') {
4555+
this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0].classList.add('e-icon');
4556+
}
45494557
break;
45504558
case 'separator':
45514559
this.previousEleValue = this.inputElement.value;
@@ -4729,6 +4737,9 @@ export class DateRangePicker extends CalendarBase {
47294737
this.floatLabelType = newProp.floatLabelType;
47304738
Input.removeFloating(this.inputWrapper);
47314739
Input.addFloating(this.inputElement, this.floatLabelType, this.placeholder);
4740+
if (!isNullOrUndefined(this.inputWrapper.buttons[0]) && !isNullOrUndefined(this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0]) && this.floatLabelType !== 'Never') {
4741+
this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0].classList.add('e-icon');
4742+
}
47324743
break;
47334744
case 'start':
47344745
this.setProperties({ start: newProp.start }, true);

controls/calendars/src/datetimepicker/datetimepicker.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,10 @@ export class DateTimePicker extends DatePicker {
687687
this.inputElement.tabIndex = -1;
688688
}
689689
}
690+
Input.calculateWidth(this.inputElement, this.inputWrapper.container);
691+
if (!isNullOrUndefined(this.inputWrapper.buttons[0]) && !isNullOrUndefined(this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0]) && this.floatLabelType !== 'Never') {
692+
this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0].classList.add('e-date-time-icon');
693+
}
690694
this.renderComplete();
691695
}
692696
private setValue(): void {
@@ -1841,6 +1845,10 @@ export class DateTimePicker extends DatePicker {
18411845
break;
18421846
case 'width':
18431847
this.setWidth(newProp.width);
1848+
Input.calculateWidth(this.inputElement, this.inputWrapper.container);
1849+
if (!isNullOrUndefined(this.inputWrapper.buttons[0]) && !isNullOrUndefined(this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0]) && this.floatLabelType !== 'Never') {
1850+
this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0].classList.add('e-date-time-icon');
1851+
}
18441852
break;
18451853
case 'readonly':
18461854
Input.setReadonly(this.readonly, this.inputElement);
@@ -1849,6 +1857,9 @@ export class DateTimePicker extends DatePicker {
18491857
this.floatLabelType = newProp.floatLabelType;
18501858
Input.removeFloating(this.inputWrapper);
18511859
Input.addFloating(this.inputElement, this.floatLabelType, this.placeholder);
1860+
if (!isNullOrUndefined(this.inputWrapper.buttons[0]) && !isNullOrUndefined(this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0]) && this.floatLabelType !== 'Never') {
1861+
this.inputWrapper.container.getElementsByClassName('e-float-text-overflow')[0].classList.add('e-date-time-icon');
1862+
}
18521863
break;
18531864
case 'scrollTo':
18541865
if (this.checkDateValue(new Date(this.checkValue(newProp.scrollTo)))) {

0 commit comments

Comments
 (0)