@progress/kendo-angular-scheduler 14.4.0-develop.16 → 14.4.0-develop.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/esm2020/editing/recurrence/recurrence-end-rule-editor.component.mjs +1 -1
  2. package/esm2020/editing/recurrence/recurrence-interval-editor.component.mjs +1 -1
  3. package/esm2020/editing/recurrence/recurrence-monthly-yearly-editor.component.mjs +1 -1
  4. package/esm2020/editing/resource-multiple-editor.component.mjs +1 -1
  5. package/esm2020/editing/timezone-editor.component.mjs +1 -1
  6. package/esm2020/index.mjs +1 -0
  7. package/esm2020/localization/messages.mjs +5 -1
  8. package/esm2020/navigation/shortcuts.directive.mjs +9 -0
  9. package/esm2020/package-metadata.mjs +2 -2
  10. package/esm2020/scheduler.component.mjs +12 -0
  11. package/esm2020/scheduler.module.mjs +8 -1
  12. package/esm2020/toolbar/navigation.component.mjs +9 -1
  13. package/esm2020/toolbar/toolbar.component.mjs +25 -3
  14. package/esm2020/views/year/utils.mjs +60 -0
  15. package/esm2020/views/year/year-view-internal.component.mjs +418 -0
  16. package/esm2020/views/year/year-view.component.mjs +115 -0
  17. package/esm2020/views/year/year-view.module.mjs +47 -0
  18. package/fesm2015/progress-kendo-angular-scheduler.mjs +663 -22
  19. package/fesm2020/progress-kendo-angular-scheduler.mjs +657 -22
  20. package/index.d.ts +1 -0
  21. package/localization/messages.d.ts +9 -1
  22. package/package.json +13 -12
  23. package/scheduler.module.d.ts +15 -13
  24. package/schematics/ngAdd/index.js +2 -2
  25. package/toolbar/navigation.component.d.ts +10 -2
  26. package/toolbar/toolbar.component.d.ts +9 -0
  27. package/types/scheduler-slot.interface.d.ts +4 -0
  28. package/types/slot-class-args.interface.d.ts +4 -0
  29. package/views/year/utils.d.ts +21 -0
  30. package/views/year/year-view-internal.component.d.ts +82 -0
  31. package/views/year/year-view.component.d.ts +56 -0
  32. package/views/year/year-view.module.d.ts +19 -0
@@ -211,7 +211,7 @@ RecurrenceEndRuleEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion:
211
211
  </ul>
212
212
  </div>
213
213
  </div>
214
- `, isInline: true, components: [{ type: i3.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional", "labelCssStyle", "labelCssClass"], exportAs: ["kendoLabel"] }, { type: i4.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }, { type: i4.NumericTextBoxCustomMessagesComponent, selector: "kendo-numerictextbox-messages" }, { type: i5.DatePickerComponent, selector: "kendo-datepicker", inputs: ["focusableId", "cellTemplate", "monthCellTemplate", "yearCellTemplate", "decadeCellTemplate", "centuryCellTemplate", "weekNumberTemplate", "headerTitleTemplate", "navigationItemTemplate", "activeView", "bottomView", "topView", "calendarType", "animateCalendarNavigation", "disabled", "readonly", "readOnlyInput", "popupSettings", "navigation", "min", "max", "incompleteDateValidation", "autoCorrectParts", "autoSwitchParts", "autoSwitchKeys", "enableMouseWheel", "allowCaretMode", "autoFill", "focusedDate", "value", "format", "twoDigitYearMax", "formatPlaceholder", "placeholder", "tabindex", "tabIndex", "disabledDates", "title", "subtitle", "rangeValidation", "disabledDatesValidation", "weekNumber", "size", "rounded", "fillMode", "adaptiveMode"], outputs: ["valueChange", "focus", "blur", "open", "close"], exportAs: ["kendo-datepicker"] }, { type: i5.DatePickerCustomMessagesComponent, selector: "kendo-datepicker-messages" }], directives: [{ type: i6.EndRuleRadioButtonDirective, selector: "[kendoRecurrenceEndRuleRadioButton]", inputs: ["kendoRecurrenceEndRuleRadioButton"] }, { type: i3.LabelDirective, selector: "label[for]", inputs: ["for", "labelClass"] }] });
214
+ `, isInline: true, components: [{ type: i3.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional", "labelCssStyle", "labelCssClass"], exportAs: ["kendoLabel"] }, { type: i4.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { type: i4.NumericTextBoxCustomMessagesComponent, selector: "kendo-numerictextbox-messages" }, { type: i5.DatePickerComponent, selector: "kendo-datepicker", inputs: ["focusableId", "cellTemplate", "monthCellTemplate", "yearCellTemplate", "decadeCellTemplate", "centuryCellTemplate", "weekNumberTemplate", "headerTitleTemplate", "navigationItemTemplate", "activeView", "bottomView", "topView", "calendarType", "animateCalendarNavigation", "disabled", "readonly", "readOnlyInput", "popupSettings", "navigation", "min", "max", "incompleteDateValidation", "autoCorrectParts", "autoSwitchParts", "autoSwitchKeys", "enableMouseWheel", "allowCaretMode", "autoFill", "focusedDate", "value", "format", "twoDigitYearMax", "formatPlaceholder", "placeholder", "tabindex", "tabIndex", "disabledDates", "title", "subtitle", "rangeValidation", "disabledDatesValidation", "weekNumber", "size", "rounded", "fillMode", "adaptiveMode"], outputs: ["valueChange", "focus", "blur", "open", "close"], exportAs: ["kendo-datepicker"] }, { type: i5.DatePickerCustomMessagesComponent, selector: "kendo-datepicker-messages" }], directives: [{ type: i6.EndRuleRadioButtonDirective, selector: "[kendoRecurrenceEndRuleRadioButton]", inputs: ["kendoRecurrenceEndRuleRadioButton"] }, { type: i3.LabelDirective, selector: "label[for]", inputs: ["for", "labelClass"] }] });
215
215
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RecurrenceEndRuleEditorComponent, decorators: [{
216
216
  type: Component,
217
217
  args: [{
@@ -114,7 +114,7 @@ RecurrenceIntervalEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion
114
114
  <span>&nbsp;{{ textForFrequency() }}</span>
115
115
  </div>
116
116
  </div>
117
- `, isInline: true, components: [{ type: i3.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional", "labelCssStyle", "labelCssClass"], exportAs: ["kendoLabel"] }, { type: i4.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }, { type: i4.NumericTextBoxCustomMessagesComponent, selector: "kendo-numerictextbox-messages" }] });
117
+ `, isInline: true, components: [{ type: i3.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional", "labelCssStyle", "labelCssClass"], exportAs: ["kendoLabel"] }, { type: i4.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { type: i4.NumericTextBoxCustomMessagesComponent, selector: "kendo-numerictextbox-messages" }] });
118
118
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RecurrenceIntervalEditorComponent, decorators: [{
119
119
  type: Component,
120
120
  args: [{
@@ -338,7 +338,7 @@ RecurrenceMonthlyYearlyEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVe
338
338
  </ul>
339
339
  </div>
340
340
  </div>
341
- `, isInline: true, components: [{ type: i3.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional", "labelCssStyle", "labelCssClass"], exportAs: ["kendoLabel"] }, { type: i4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { type: i5.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }, { type: i5.NumericTextBoxCustomMessagesComponent, selector: "kendo-numerictextbox-messages" }], directives: [{ type: i6.RepeatOnRadioButtonDirective, selector: "[kendoRecurrenceRepeatOnRadioButton]", inputs: ["kendoRecurrenceRepeatOnRadioButton"] }, { type: i3.LabelDirective, selector: "label[for]", inputs: ["for", "labelClass"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
341
+ `, isInline: true, components: [{ type: i3.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional", "labelCssStyle", "labelCssClass"], exportAs: ["kendoLabel"] }, { type: i4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { type: i5.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { type: i5.NumericTextBoxCustomMessagesComponent, selector: "kendo-numerictextbox-messages" }], directives: [{ type: i6.RepeatOnRadioButtonDirective, selector: "[kendoRecurrenceRepeatOnRadioButton]", inputs: ["kendoRecurrenceRepeatOnRadioButton"] }, { type: i3.LabelDirective, selector: "label[for]", inputs: ["for", "labelClass"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
342
342
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RecurrenceMonthlyYearlyEditorComponent, decorators: [{
343
343
  type: Component,
344
344
  args: [{
@@ -54,7 +54,7 @@ MultipleResourceEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion:
54
54
  {{ getField(dataItem, resource.textField) }}
55
55
  </ng-template>
56
56
  </kendo-multiselect>
57
- `, isInline: true, components: [{ type: i1.MultiSelectComponent, selector: "kendo-multiselect", inputs: ["showStickyHeader", "focusableId", "autoClose", "loading", "data", "value", "valueField", "textField", "tabindex", "tabIndex", "size", "rounded", "fillMode", "placeholder", "adaptiveMode", "title", "subtitle", "disabled", "itemDisabled", "checkboxes", "readonly", "filterable", "virtual", "popupSettings", "listHeight", "valuePrimitive", "clearButton", "tagMapper", "allowCustom", "valueNormalizer"], outputs: ["filterChange", "valueChange", "open", "opened", "close", "closed", "focus", "blur", "removeTag"], exportAs: ["kendoMultiSelect"] }], directives: [{ type: i1.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.TagTemplateDirective, selector: "[kendoMultiSelectTagTemplate],[kendoMultiSelectTreeTagTemplate]" }] });
57
+ `, isInline: true, components: [{ type: i1.MultiSelectComponent, selector: "kendo-multiselect", inputs: ["showStickyHeader", "focusableId", "autoClose", "loading", "data", "value", "valueField", "textField", "tabindex", "tabIndex", "size", "rounded", "fillMode", "placeholder", "adaptiveMode", "title", "subtitle", "disabled", "itemDisabled", "checkboxes", "readonly", "filterable", "virtual", "popupSettings", "listHeight", "valuePrimitive", "clearButton", "tagMapper", "allowCustom", "valueNormalizer"], outputs: ["filterChange", "valueChange", "open", "opened", "close", "closed", "focus", "blur", "inputFocus", "inputBlur", "removeTag"], exportAs: ["kendoMultiSelect"] }], directives: [{ type: i1.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.TagTemplateDirective, selector: "[kendoMultiSelectTagTemplate],[kendoMultiSelectTreeTagTemplate]" }] });
58
58
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: MultipleResourceEditorComponent, decorators: [{
59
59
  type: Component,
60
60
  args: [{
@@ -100,7 +100,7 @@ TimeZoneEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0"
100
100
  (filterChange)="onTimeZoneFilterChange($event)"
101
101
  (valueChange)="onTimeZoneChange($event)">
102
102
  </kendo-combobox>
103
- `, isInline: true, components: [{ type: i1.ComboBoxComponent, selector: "kendo-combobox", inputs: ["icon", "svgIcon", "showStickyHeader", "focusableId", "allowCustom", "data", "value", "textField", "valueField", "valuePrimitive", "valueNormalizer", "placeholder", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "loading", "suggest", "clearButton", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "selectionChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoComboBox"] }] });
103
+ `, isInline: true, components: [{ type: i1.ComboBoxComponent, selector: "kendo-combobox", inputs: ["icon", "svgIcon", "showStickyHeader", "focusableId", "allowCustom", "data", "value", "textField", "valueField", "valuePrimitive", "valueNormalizer", "placeholder", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "loading", "suggest", "clearButton", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "selectionChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoComboBox"] }] });
104
104
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TimeZoneEditorComponent, decorators: [{
105
105
  type: Component,
106
106
  args: [{
package/esm2020/index.mjs CHANGED
@@ -58,6 +58,7 @@ export { SlotSelectableDirective } from './views/common/slot-selectable.directiv
58
58
  export { AgendaViewComponent } from './views/agenda/agenda-view.component';
59
59
  export { DayViewComponent } from './views/multi-day/day-view.component';
60
60
  export { WeekViewComponent } from './views/multi-day/week-view.component';
61
+ export { YearViewComponent } from './views/year/year-view.component';
61
62
  export { RecurrenceEditorComponent } from './editing/recurrence/recurrence-editor.component';
62
63
  export { BaseEditService } from './editing-directives/base-edit.service';
63
64
  export { PDFModule } from './pdf/pdf.module';
@@ -11,7 +11,7 @@ import * as i0 from "@angular/core";
11
11
  export class Messages extends ComponentMessages {
12
12
  }
13
13
  Messages.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: Messages, deps: null, target: i0.ɵɵFactoryTarget.Directive });
14
- Messages.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.12", type: Messages, inputs: { allEvents: "allEvents", allDay: "allDay", dateHeader: "dateHeader", timeHeader: "timeHeader", eventHeader: "eventHeader", deleteTitle: "deleteTitle", nextTitle: "nextTitle", previousTitle: "previousTitle", today: "today", calendarToday: "calendarToday", showFullDay: "showFullDay", showWorkDay: "showWorkDay", dayViewTitle: "dayViewTitle", multiDayViewTitle: "multiDayViewTitle", weekViewTitle: "weekViewTitle", workWeekViewTitle: "workWeekViewTitle", monthViewTitle: "monthViewTitle", multiWeekViewTitle: "multiWeekViewTitle", timelineViewTitle: "timelineViewTitle", timelineWeekViewTitle: "timelineWeekViewTitle", timelineMonthViewTitle: "timelineMonthViewTitle", agendaViewTitle: "agendaViewTitle", cancel: "cancel", save: "save", editorEventTitle: "editorEventTitle", editorEventStart: "editorEventStart", editorEventStartTimeZone: "editorEventStartTimeZone", editorEventEnd: "editorEventEnd", editorEventEndTimeZone: "editorEventEndTimeZone", editorEventAllDay: "editorEventAllDay", editorEventDescription: "editorEventDescription", editorEventSeparateTimeZones: "editorEventSeparateTimeZones", editorEventTimeZone: "editorEventTimeZone", editorDateInputsToday: "editorDateInputsToday", editorDateInputsToggle: "editorDateInputsToggle", editorDateInputsParentViewButton: "editorDateInputsParentViewButton", editorDateInputsNow: "editorDateInputsNow", editorDateInputsNowLabel: "editorDateInputsNowLabel", editorDateInputsAccept: "editorDateInputsAccept", editorDateInputsAcceptLabel: "editorDateInputsAcceptLabel", editorDateInputsCancel: "editorDateInputsCancel", editorDateInputsCancelLabel: "editorDateInputsCancelLabel", editorDateInputsDateTab: "editorDateInputsDateTab", editorDateInputsDateTabLabel: "editorDateInputsDateTabLabel", editorDateInputsTimeTab: "editorDateInputsTimeTab", editorDateInputsTimeTabLabel: "editorDateInputsTimeTabLabel", recurrenceEditorNumericIncrement: "recurrenceEditorNumericIncrement", recurrenceEditorNumericDecrement: "recurrenceEditorNumericDecrement", recurrenceEditorRepeat: "recurrenceEditorRepeat", recurrenceEditorDailyInterval: "recurrenceEditorDailyInterval", recurrenceEditorDailyRepeatEvery: "recurrenceEditorDailyRepeatEvery", recurrenceEditorWeeklyInterval: "recurrenceEditorWeeklyInterval", recurrenceEditorWeeklyRepeatEvery: "recurrenceEditorWeeklyRepeatEvery", recurrenceEditorWeeklyRepeatOn: "recurrenceEditorWeeklyRepeatOn", recurrenceEditorMonthlyDay: "recurrenceEditorMonthlyDay", recurrenceEditorMonthlyInterval: "recurrenceEditorMonthlyInterval", recurrenceEditorMonthlyRepeatEvery: "recurrenceEditorMonthlyRepeatEvery", recurrenceEditorMonthlyRepeatOn: "recurrenceEditorMonthlyRepeatOn", recurrenceEditorYearlyOf: "recurrenceEditorYearlyOf", recurrenceEditorYearlyRepeatEvery: "recurrenceEditorYearlyRepeatEvery", recurrenceEditorYearlyRepeatOn: "recurrenceEditorYearlyRepeatOn", recurrenceEditorYearlyInterval: "recurrenceEditorYearlyInterval", recurrenceEditorFrequenciesDaily: "recurrenceEditorFrequenciesDaily", recurrenceEditorFrequenciesMonthly: "recurrenceEditorFrequenciesMonthly", recurrenceEditorFrequenciesNever: "recurrenceEditorFrequenciesNever", recurrenceEditorFrequenciesWeekly: "recurrenceEditorFrequenciesWeekly", recurrenceEditorFrequenciesYearly: "recurrenceEditorFrequenciesYearly", recurrenceEditorOffsetPositionsFirst: "recurrenceEditorOffsetPositionsFirst", recurrenceEditorOffsetPositionsSecond: "recurrenceEditorOffsetPositionsSecond", recurrenceEditorOffsetPositionsThird: "recurrenceEditorOffsetPositionsThird", recurrenceEditorOffsetPositionsFourth: "recurrenceEditorOffsetPositionsFourth", recurrenceEditorOffsetPositionsLast: "recurrenceEditorOffsetPositionsLast", recurrenceEditorWeekdaysDay: "recurrenceEditorWeekdaysDay", recurrenceEditorWeekdaysWeekday: "recurrenceEditorWeekdaysWeekday", recurrenceEditorWeekdaysWeekendday: "recurrenceEditorWeekdaysWeekendday", recurrenceEditorEndAfter: "recurrenceEditorEndAfter", recurrenceEditorEndOccurrence: "recurrenceEditorEndOccurrence", recurrenceEditorEndLabel: "recurrenceEditorEndLabel", recurrenceEditorEndNever: "recurrenceEditorEndNever", recurrenceEditorEndOn: "recurrenceEditorEndOn", editorTitle: "editorTitle", destroy: "destroy", deleteConfirmation: "deleteConfirmation", editRecurringConfirmation: "editRecurringConfirmation", editOccurrence: "editOccurrence", editSeries: "editSeries", deleteRecurringConfirmation: "deleteRecurringConfirmation", deleteOccurrence: "deleteOccurrence", deleteSeries: "deleteSeries", deleteDialogTitle: "deleteDialogTitle", deleteRecurringDialogTitle: "deleteRecurringDialogTitle", editRecurringDialogTitle: "editRecurringDialogTitle", selectView: "selectView" }, usesInheritance: true, ngImport: i0 });
14
+ Messages.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.12", type: Messages, inputs: { allEvents: "allEvents", allDay: "allDay", dateHeader: "dateHeader", timeHeader: "timeHeader", eventHeader: "eventHeader", deleteTitle: "deleteTitle", nextTitle: "nextTitle", previousTitle: "previousTitle", today: "today", calendarToday: "calendarToday", showFullDay: "showFullDay", showWorkDay: "showWorkDay", dayViewTitle: "dayViewTitle", multiDayViewTitle: "multiDayViewTitle", weekViewTitle: "weekViewTitle", workWeekViewTitle: "workWeekViewTitle", monthViewTitle: "monthViewTitle", multiWeekViewTitle: "multiWeekViewTitle", timelineViewTitle: "timelineViewTitle", timelineWeekViewTitle: "timelineWeekViewTitle", timelineMonthViewTitle: "timelineMonthViewTitle", agendaViewTitle: "agendaViewTitle", yearViewTitle: "yearViewTitle", yearViewNoEvents: "yearViewNoEvents", cancel: "cancel", save: "save", editorEventTitle: "editorEventTitle", editorEventStart: "editorEventStart", editorEventStartTimeZone: "editorEventStartTimeZone", editorEventEnd: "editorEventEnd", editorEventEndTimeZone: "editorEventEndTimeZone", editorEventAllDay: "editorEventAllDay", editorEventDescription: "editorEventDescription", editorEventSeparateTimeZones: "editorEventSeparateTimeZones", editorEventTimeZone: "editorEventTimeZone", editorDateInputsToday: "editorDateInputsToday", editorDateInputsToggle: "editorDateInputsToggle", editorDateInputsParentViewButton: "editorDateInputsParentViewButton", editorDateInputsNow: "editorDateInputsNow", editorDateInputsNowLabel: "editorDateInputsNowLabel", editorDateInputsAccept: "editorDateInputsAccept", editorDateInputsAcceptLabel: "editorDateInputsAcceptLabel", editorDateInputsCancel: "editorDateInputsCancel", editorDateInputsCancelLabel: "editorDateInputsCancelLabel", editorDateInputsDateTab: "editorDateInputsDateTab", editorDateInputsDateTabLabel: "editorDateInputsDateTabLabel", editorDateInputsTimeTab: "editorDateInputsTimeTab", editorDateInputsTimeTabLabel: "editorDateInputsTimeTabLabel", recurrenceEditorNumericIncrement: "recurrenceEditorNumericIncrement", recurrenceEditorNumericDecrement: "recurrenceEditorNumericDecrement", recurrenceEditorRepeat: "recurrenceEditorRepeat", recurrenceEditorDailyInterval: "recurrenceEditorDailyInterval", recurrenceEditorDailyRepeatEvery: "recurrenceEditorDailyRepeatEvery", recurrenceEditorWeeklyInterval: "recurrenceEditorWeeklyInterval", recurrenceEditorWeeklyRepeatEvery: "recurrenceEditorWeeklyRepeatEvery", recurrenceEditorWeeklyRepeatOn: "recurrenceEditorWeeklyRepeatOn", recurrenceEditorMonthlyDay: "recurrenceEditorMonthlyDay", recurrenceEditorMonthlyInterval: "recurrenceEditorMonthlyInterval", recurrenceEditorMonthlyRepeatEvery: "recurrenceEditorMonthlyRepeatEvery", recurrenceEditorMonthlyRepeatOn: "recurrenceEditorMonthlyRepeatOn", recurrenceEditorYearlyOf: "recurrenceEditorYearlyOf", recurrenceEditorYearlyRepeatEvery: "recurrenceEditorYearlyRepeatEvery", recurrenceEditorYearlyRepeatOn: "recurrenceEditorYearlyRepeatOn", recurrenceEditorYearlyInterval: "recurrenceEditorYearlyInterval", recurrenceEditorFrequenciesDaily: "recurrenceEditorFrequenciesDaily", recurrenceEditorFrequenciesMonthly: "recurrenceEditorFrequenciesMonthly", recurrenceEditorFrequenciesNever: "recurrenceEditorFrequenciesNever", recurrenceEditorFrequenciesWeekly: "recurrenceEditorFrequenciesWeekly", recurrenceEditorFrequenciesYearly: "recurrenceEditorFrequenciesYearly", recurrenceEditorOffsetPositionsFirst: "recurrenceEditorOffsetPositionsFirst", recurrenceEditorOffsetPositionsSecond: "recurrenceEditorOffsetPositionsSecond", recurrenceEditorOffsetPositionsThird: "recurrenceEditorOffsetPositionsThird", recurrenceEditorOffsetPositionsFourth: "recurrenceEditorOffsetPositionsFourth", recurrenceEditorOffsetPositionsLast: "recurrenceEditorOffsetPositionsLast", recurrenceEditorWeekdaysDay: "recurrenceEditorWeekdaysDay", recurrenceEditorWeekdaysWeekday: "recurrenceEditorWeekdaysWeekday", recurrenceEditorWeekdaysWeekendday: "recurrenceEditorWeekdaysWeekendday", recurrenceEditorEndAfter: "recurrenceEditorEndAfter", recurrenceEditorEndOccurrence: "recurrenceEditorEndOccurrence", recurrenceEditorEndLabel: "recurrenceEditorEndLabel", recurrenceEditorEndNever: "recurrenceEditorEndNever", recurrenceEditorEndOn: "recurrenceEditorEndOn", editorTitle: "editorTitle", destroy: "destroy", deleteConfirmation: "deleteConfirmation", editRecurringConfirmation: "editRecurringConfirmation", editOccurrence: "editOccurrence", editSeries: "editSeries", deleteRecurringConfirmation: "deleteRecurringConfirmation", deleteOccurrence: "deleteOccurrence", deleteSeries: "deleteSeries", deleteDialogTitle: "deleteDialogTitle", deleteRecurringDialogTitle: "deleteRecurringDialogTitle", editRecurringDialogTitle: "editRecurringDialogTitle", selectView: "selectView" }, usesInheritance: true, ngImport: i0 });
15
15
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: Messages, decorators: [{
16
16
  type: Directive
17
17
  }], propDecorators: { allEvents: [{
@@ -58,6 +58,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
58
58
  type: Input
59
59
  }], agendaViewTitle: [{
60
60
  type: Input
61
+ }], yearViewTitle: [{
62
+ type: Input
63
+ }], yearViewNoEvents: [{
64
+ type: Input
61
65
  }], cancel: [{
62
66
  type: Input
63
67
  }], save: [{
@@ -22,6 +22,7 @@ import * as i3 from "./focus.service";
22
22
  import * as i4 from "../views/view-state.service";
23
23
  import * as i5 from "../editing/dialogs.service";
24
24
  const isContentWrapper = element => hasClasses(element, 'k-scheduler-content');
25
+ const CALENDAR_TAG = 'KENDO-CALENDAR-HORIZONTAL';
25
26
  /**
26
27
  * @hidden
27
28
  */
@@ -114,6 +115,10 @@ export class ShortcutsDirective {
114
115
  }, {
115
116
  match: e => (e.keyCode === Keys.ArrowUp || e.keyCode === Keys.ArrowLeft) && noModifiers(e) && !isContentWrapper(e.target),
116
117
  action: e => {
118
+ //use the MultiViewCalendar navigation for Year View
119
+ if (e.target.tagName === CALENDAR_TAG) {
120
+ return;
121
+ }
117
122
  const prevented = this.scheduler.onNavigationAction({ type: 'focus-prev' });
118
123
  if (!prevented) {
119
124
  const item = this.focusService.activeItem;
@@ -127,6 +132,10 @@ export class ShortcutsDirective {
127
132
  }, {
128
133
  match: e => (e.keyCode === Keys.ArrowDown || e.keyCode === Keys.ArrowRight) && noModifiers(e) && !isContentWrapper(e.target),
129
134
  action: e => {
135
+ //use the MultiViewCalendar navigation for Year View
136
+ if (e.target.tagName === CALENDAR_TAG) {
137
+ return;
138
+ }
130
139
  const prevented = this.scheduler.onNavigationAction({ type: 'focus-next' });
131
140
  if (!prevented) {
132
141
  const isInToolbar = this.focusService.activeItem.containerType === 'toolbar';
@@ -9,7 +9,7 @@ export const packageMetadata = {
9
9
  name: '@progress/kendo-angular-scheduler',
10
10
  productName: 'Kendo UI for Angular',
11
11
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
12
- publishDate: 1706186536,
13
- version: '14.4.0-develop.16',
12
+ publishDate: 1706281562,
13
+ version: '14.4.0-develop.18',
14
14
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
15
15
  };
@@ -961,6 +961,12 @@ SchedulerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ver
961
961
  i18n-agendaViewTitle="kendo.scheduler.agendaViewTitle|The agenda view title."
962
962
  agendaViewTitle="Agenda"
963
963
 
964
+ i18n-yearViewTitle="kendo.scheduler.yearViewTitle|The year view title."
965
+ yearViewTitle="Year"
966
+
967
+ i18n-yearViewNoEvents="kendo.scheduler.yearViewNoEvents|The year view no events message."
968
+ yearViewNoEvents="No events on this date."
969
+
964
970
  i18n-cancel="kendo.scheduler.cancel|The text similar to 'Cancel' displayed in the Scheduler."
965
971
  cancel="Cancel"
966
972
 
@@ -1302,6 +1308,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
1302
1308
  i18n-agendaViewTitle="kendo.scheduler.agendaViewTitle|The agenda view title."
1303
1309
  agendaViewTitle="Agenda"
1304
1310
 
1311
+ i18n-yearViewTitle="kendo.scheduler.yearViewTitle|The year view title."
1312
+ yearViewTitle="Year"
1313
+
1314
+ i18n-yearViewNoEvents="kendo.scheduler.yearViewNoEvents|The year view no events message."
1315
+ yearViewNoEvents="No events on this date."
1316
+
1305
1317
  i18n-cancel="kendo.scheduler.cancel|The text similar to 'Cancel' displayed in the Scheduler."
1306
1318
  cancel="Cancel"
1307
1319
 
@@ -57,6 +57,8 @@ import { SharedModule } from './shared.module';
57
57
  import { ShortcutsDirective } from './navigation/shortcuts.directive';
58
58
  import { SlotSelectableDirective } from './views/common/slot-selectable.directive';
59
59
  import { LabelModule } from '@progress/kendo-angular-label';
60
+ import { YearViewModule } from './views/year/year-view.module';
61
+ import { YearViewComponent } from './views/year/year-view.component';
60
62
  import * as i0 from "@angular/core";
61
63
  import * as i1 from "./toolbar/navigation.component";
62
64
  import * as i2 from "./toolbar/toolbar-template.directive";
@@ -106,6 +108,7 @@ const declarations = [
106
108
  const publicDirectives = [
107
109
  AgendaViewComponent,
108
110
  MonthViewModule,
111
+ YearViewComponent,
109
112
  MultiDayViewModule,
110
113
  ReactiveEditingDirective,
111
114
  TimelineViewModule,
@@ -190,7 +193,8 @@ SchedulerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version
190
193
  ResizeSensorModule,
191
194
  MonthViewModule,
192
195
  TimelineViewModule,
193
- WatermarkModule, ButtonsModule,
196
+ WatermarkModule,
197
+ YearViewModule, ButtonsModule,
194
198
  CheckBoxModule,
195
199
  TextAreaModule,
196
200
  DateInputsModule,
@@ -203,6 +207,7 @@ SchedulerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version
203
207
  LabelModule,
204
208
  FormFieldModule], exports: [AgendaViewComponent,
205
209
  MonthViewModule,
210
+ YearViewComponent,
206
211
  MultiDayViewModule,
207
212
  ReactiveEditingDirective,
208
213
  TimelineViewModule, i1.ToolbarNavigationComponent, i2.ToolbarTemplateDirective, i3.ToolbarViewSelectorComponent, SchedulerComponent,
@@ -253,6 +258,7 @@ SchedulerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version
253
258
  MonthViewModule,
254
259
  TimelineViewModule,
255
260
  WatermarkModule,
261
+ YearViewModule,
256
262
  ...importedKendoModules
257
263
  ], MonthViewModule,
258
264
  MultiDayViewModule,
@@ -269,6 +275,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
269
275
  MonthViewModule,
270
276
  TimelineViewModule,
271
277
  WatermarkModule,
278
+ YearViewModule,
272
279
  ...importedKendoModules
273
280
  ],
274
281
  declarations: declarations,
@@ -191,7 +191,7 @@ export class ToolbarNavigationComponent {
191
191
  }
192
192
  }
193
193
  ToolbarNavigationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ToolbarNavigationComponent, deps: [{ token: i1.PopupService }, { token: i2.ToolbarService }, { token: i3.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: i4.ViewContextService }], target: i0.ɵɵFactoryTarget.Component });
194
- ToolbarNavigationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: ToolbarNavigationComponent, selector: "[kendoSchedulerToolbarNavigation]", inputs: { min: "min", max: "max" }, host: { properties: { "class.k-toolbar-group": "this.hostClass" } }, providers: [
194
+ ToolbarNavigationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: ToolbarNavigationComponent, selector: "[kendoSchedulerToolbarNavigation]", inputs: { min: "min", max: "max", activeView: "activeView", bottomView: "bottomView" }, host: { properties: { "class.k-toolbar-group": "this.hostClass" } }, providers: [
195
195
  PopupService
196
196
  ], viewQueries: [{ propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }], ngImport: i0, template: `
197
197
  <span class="k-scheduler-navigation k-button-group k-button-group-solid" role="group">
@@ -249,6 +249,8 @@ ToolbarNavigationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0
249
249
  <kendo-calendar
250
250
  #calendar
251
251
  (blur)="onBlur()"
252
+ [activeView]="activeView"
253
+ [bottomView]="bottomView"
252
254
  (keydown.escape)="toggleSelectedDate({ nativeElement: anchor }, template); anchor.focus();"
253
255
  (valueChange)="selectDate($event)"
254
256
  [value]="ctx.selectedDate | async" [min]="min" [max]="max">
@@ -322,6 +324,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
322
324
  <kendo-calendar
323
325
  #calendar
324
326
  (blur)="onBlur()"
327
+ [activeView]="activeView"
328
+ [bottomView]="bottomView"
325
329
  (keydown.escape)="toggleSelectedDate({ nativeElement: anchor }, template); anchor.focus();"
326
330
  (valueChange)="selectDate($event)"
327
331
  [value]="ctx.selectedDate | async" [min]="min" [max]="max">
@@ -341,4 +345,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
341
345
  type: Input
342
346
  }], max: [{
343
347
  type: Input
348
+ }], activeView: [{
349
+ type: Input
350
+ }], bottomView: [{
351
+ type: Input
344
352
  }] } });
@@ -31,6 +31,18 @@ export class ToolbarComponent {
31
31
  this.subs = new Subscription();
32
32
  this.subs.add(service.action.subscribe(action => this.navigate.next(action)));
33
33
  }
34
+ /**
35
+ * @hidden
36
+ */
37
+ get activeView() {
38
+ return this.service.context.selectedView?.name === 'year' ? 'decade' : 'month';
39
+ }
40
+ /**
41
+ * @hidden
42
+ */
43
+ get bottomView() {
44
+ return this.service.context.selectedView?.name === 'year' ? 'decade' : 'month';
45
+ }
34
46
  ngOnInit() {
35
47
  this.subs.add(this.selectedDate.subscribe(date => this.templateContext.selectedDate = date));
36
48
  this.subs.add(this.dateRange.subscribe(dateRange => this.templateContext.dateRange = dateRange));
@@ -70,13 +82,18 @@ ToolbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", versi
70
82
  </ng-template>
71
83
 
72
84
  <ng-template #defaultTemplate>
73
- <div kendoSchedulerToolbarNavigation [min]="min" [max]="max"></div>
85
+ <div kendoSchedulerToolbarNavigation
86
+ [min]="min"
87
+ [max]="max"
88
+ [activeView]="activeView"
89
+ [bottomView]="bottomView">
90
+ </div>
74
91
  <span class="k-spacer"></span>
75
92
  <div kendoSchedulerToolbarViewSelector [toolbarWidth]="toolbarWidth"></div>
76
93
  </ng-template>
77
94
 
78
95
  <kendo-resize-sensor (resize)="resizeHandler()" [style]="'display: contents;'"></kendo-resize-sensor>
79
- `, isInline: true, components: [{ type: i2.ToolbarNavigationComponent, selector: "[kendoSchedulerToolbarNavigation]", inputs: ["min", "max"] }, { type: i3.ToolbarViewSelectorComponent, selector: "[kendoSchedulerToolbarViewSelector]", inputs: ["toolbarWidth", "responsiveBreakpoint"] }, { type: i4.ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
96
+ `, isInline: true, components: [{ type: i2.ToolbarNavigationComponent, selector: "[kendoSchedulerToolbarNavigation]", inputs: ["min", "max", "activeView", "bottomView"] }, { type: i3.ToolbarViewSelectorComponent, selector: "[kendoSchedulerToolbarViewSelector]", inputs: ["toolbarWidth", "responsiveBreakpoint"] }, { type: i4.ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
80
97
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ToolbarComponent, decorators: [{
81
98
  type: Component,
82
99
  args: [{
@@ -90,7 +107,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
90
107
  </ng-template>
91
108
 
92
109
  <ng-template #defaultTemplate>
93
- <div kendoSchedulerToolbarNavigation [min]="min" [max]="max"></div>
110
+ <div kendoSchedulerToolbarNavigation
111
+ [min]="min"
112
+ [max]="max"
113
+ [activeView]="activeView"
114
+ [bottomView]="bottomView">
115
+ </div>
94
116
  <span class="k-spacer"></span>
95
117
  <div kendoSchedulerToolbarViewSelector [toolbarWidth]="toolbarWidth"></div>
96
118
  </ng-template>
@@ -0,0 +1,60 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2024 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ import { intersects, toUTCDate, toUTCDateTime } from '../utils';
6
+ import { sortTasksByTime } from '../../common/util';
7
+ import { addDays } from '@progress/kendo-date-math';
8
+ /**
9
+ * @hidden
10
+ */
11
+ export const createTasks = (periodStart, periodEnd, items, ranges) => {
12
+ const tasks = [];
13
+ const utcStart = toUTCDateTime(periodStart);
14
+ const utcEnd = toUTCDateTime(periodEnd);
15
+ for (let index = 0; index < items.length; index++) {
16
+ const item = items[index];
17
+ const data = {};
18
+ const startTime = item.start.toUTCDate();
19
+ const end = item.end;
20
+ const endTime = (item.end.getTime() !== end.getTime() ? end.addDays(1) : end).toUTCDate();
21
+ if (intersects(startTime, endTime, utcStart, utcEnd)) {
22
+ for (let rangeIdx = 0; rangeIdx < ranges.length; rangeIdx++) {
23
+ const range = ranges[rangeIdx];
24
+ const rangeStart = toUTCDate(range);
25
+ const rangeEnd = toUTCDate(addDays(range, 1));
26
+ if (intersects(startTime, endTime, rangeStart, rangeEnd)) {
27
+ const task = {
28
+ index,
29
+ startTime: startTime > rangeStart ? startTime : rangeStart,
30
+ endTime: endTime < rangeEnd ? endTime : rangeEnd,
31
+ start: item.start,
32
+ end: item.end,
33
+ event: item.event,
34
+ isAllDay: item.event.isAllDay,
35
+ rangeIndex: rangeIdx,
36
+ data: data
37
+ };
38
+ task.head = endTime > rangeEnd && startTime > rangeStart;
39
+ task.tail = startTime < rangeStart && endTime < rangeEnd;
40
+ task.mid = endTime > rangeEnd && startTime < rangeStart;
41
+ task.isMultiDay = task.head || task.mid || task.tail;
42
+ tasks.push(task);
43
+ }
44
+ }
45
+ }
46
+ }
47
+ return sortTasksByTime(tasks);
48
+ };
49
+ /**
50
+ * @hidden
51
+ */
52
+ export const noop = (_) => { };
53
+ /**
54
+ * @hidden
55
+ */
56
+ export const yearEnd = (year) => new Date(year, 11, 31, 23, 59, 59, 999);
57
+ /**
58
+ * @hidden
59
+ */
60
+ export const yearStart = (year) => new Date(year, 0, 1, 0, 0, 0, 0);