@nova-design-system/nova-webcomponents 3.2.0 → 3.4.0
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.
- package/dist/cjs/{index-108ddff0.js → index-c56424e5.js} +18 -186
- package/dist/cjs/index-c56424e5.js.map +1 -0
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/native.cjs.js +2 -23
- package/dist/cjs/native.cjs.js.map +1 -1
- package/dist/cjs/nv-alert.cjs.entry.js +1 -1
- package/dist/cjs/nv-avatar.cjs.entry.js +1 -1
- package/dist/cjs/nv-badge_2.cjs.entry.js +1 -1
- package/dist/cjs/nv-breadcrumb.cjs.entry.js +1 -1
- package/dist/cjs/nv-breadcrumbs.cjs.entry.js +1 -1
- package/dist/cjs/nv-button.cjs.entry.js +1 -1
- package/dist/cjs/nv-calendar.cjs.entry.js +391 -142
- package/dist/cjs/nv-calendar.cjs.entry.js.map +1 -1
- package/dist/cjs/nv-col.cjs.entry.js +1 -1
- package/dist/cjs/nv-datagrid.cjs.entry.js +45 -12
- package/dist/cjs/nv-datagrid.cjs.entry.js.map +1 -1
- package/dist/cjs/nv-datagridcolumn.cjs.entry.js +1 -1
- package/dist/cjs/nv-dialog.cjs.entry.js +1 -1
- package/dist/cjs/nv-dialogfooter_2.cjs.entry.js +1 -1
- package/dist/cjs/nv-fieldcheckbox.cjs.entry.js +1 -1
- package/dist/cjs/nv-fielddate.cjs.entry.js +45 -11
- package/dist/cjs/nv-fielddate.cjs.entry.js.map +1 -1
- package/dist/cjs/nv-fielddaterange.cjs.entry.js +98 -44
- package/dist/cjs/nv-fielddaterange.cjs.entry.js.map +1 -1
- package/dist/cjs/nv-fielddropdown.cjs.entry.js +2 -2
- package/dist/cjs/nv-fielddropdown.cjs.entry.js.map +1 -1
- package/dist/cjs/nv-fielddropdownitem.cjs.entry.js +1 -1
- package/dist/cjs/nv-fieldmultiselect.cjs.entry.js +2 -2
- package/dist/cjs/nv-fieldmultiselect.cjs.entry.js.map +1 -1
- package/dist/cjs/nv-fieldnumber.cjs.entry.js +5 -5
- package/dist/cjs/nv-fieldnumber.cjs.entry.js.map +1 -1
- package/dist/cjs/nv-fieldpassword.cjs.entry.js +5 -5
- package/dist/cjs/nv-fieldpassword.cjs.entry.js.map +1 -1
- package/dist/cjs/nv-fieldradio.cjs.entry.js +4 -4
- package/dist/cjs/nv-fieldselect.cjs.entry.js +7 -7
- package/dist/cjs/nv-fieldselect.cjs.entry.js.map +1 -1
- package/dist/cjs/nv-fieldslider.cjs.entry.js +28 -23
- package/dist/cjs/nv-fieldslider.cjs.entry.js.map +1 -1
- package/dist/cjs/nv-fieldtext.cjs.entry.js +5 -5
- package/dist/cjs/nv-fieldtext.cjs.entry.js.map +1 -1
- package/dist/cjs/nv-fieldtextarea.cjs.entry.js +5 -5
- package/dist/cjs/nv-fieldtextarea.cjs.entry.js.map +1 -1
- package/dist/cjs/nv-fieldtime.cjs.entry.js +11 -11
- package/dist/cjs/nv-fieldtime.cjs.entry.js.map +1 -1
- package/dist/cjs/nv-icon.cjs.entry.js +2 -2
- package/dist/cjs/nv-iconbutton_2.cjs.entry.js +3 -3
- package/dist/cjs/nv-menu.cjs.entry.js +2 -2
- package/dist/cjs/nv-menuitem.cjs.entry.js +2 -2
- package/dist/cjs/nv-popover.cjs.entry.js +3 -3
- package/dist/cjs/nv-popover.cjs.entry.js.map +1 -1
- package/dist/cjs/nv-row.cjs.entry.js +2 -2
- package/dist/cjs/nv-stack.cjs.entry.js +2 -2
- package/dist/cjs/nv-table.cjs.entry.js +3 -3
- package/dist/cjs/nv-tablecolumn.cjs.entry.js +1 -1
- package/dist/cjs/nv-toggle.cjs.entry.js +3 -3
- package/dist/cjs/nv-tooltip.cjs.entry.js +2 -2
- package/dist/collection/components/nv-calendar/nv-calendar.js +235 -136
- package/dist/collection/components/nv-calendar/nv-calendar.js.map +1 -1
- package/dist/collection/components/nv-calendar/nv-calendar.utils.js +32 -7
- package/dist/collection/components/nv-calendar/nv-calendar.utils.js.map +1 -1
- package/dist/collection/components/nv-calendar/partials/calendar-actions.js +11 -0
- package/dist/collection/components/nv-calendar/partials/calendar-actions.js.map +1 -0
- package/dist/collection/components/nv-calendar/partials/calendar-grid.js +24 -0
- package/dist/collection/components/nv-calendar/partials/calendar-grid.js.map +1 -0
- package/dist/collection/components/nv-calendar/partials/calendar-header.js +38 -0
- package/dist/collection/components/nv-calendar/partials/calendar-header.js.map +1 -0
- package/dist/collection/components/nv-calendar/partials/calendar-shortcuts.js +22 -0
- package/dist/collection/components/nv-calendar/partials/calendar-shortcuts.js.map +1 -0
- package/dist/collection/components/nv-calendar/partials/day-cell.js +31 -0
- package/dist/collection/components/nv-calendar/partials/day-cell.js.map +1 -0
- package/dist/collection/components/nv-calendar/partials/index.js +7 -0
- package/dist/collection/components/nv-calendar/partials/index.js.map +1 -0
- package/dist/collection/components/nv-calendar/partials/week-numbers.js +36 -0
- package/dist/collection/components/nv-calendar/partials/week-numbers.js.map +1 -0
- package/dist/collection/components/nv-calendar/test/nv-calendar.utils.test.js +692 -651
- package/dist/collection/components/nv-calendar/test/nv-calendar.utils.test.js.map +1 -1
- package/dist/collection/components/nv-calendar/test/partials/calendar-actions.logic.test.js +169 -0
- package/dist/collection/components/nv-calendar/test/partials/calendar-actions.logic.test.js.map +1 -0
- package/dist/collection/components/nv-calendar/test/partials/calendar-grid.logic.test.js +262 -0
- package/dist/collection/components/nv-calendar/test/partials/calendar-grid.logic.test.js.map +1 -0
- package/dist/collection/components/nv-calendar/test/partials/calendar-header.logic.test.js +208 -0
- package/dist/collection/components/nv-calendar/test/partials/calendar-header.logic.test.js.map +1 -0
- package/dist/collection/components/nv-calendar/test/partials/calendar-shortcuts.logic.test.js +355 -0
- package/dist/collection/components/nv-calendar/test/partials/calendar-shortcuts.logic.test.js.map +1 -0
- package/dist/collection/components/nv-calendar/test/partials/day-cell.logic.test.js +250 -0
- package/dist/collection/components/nv-calendar/test/partials/day-cell.logic.test.js.map +1 -0
- package/dist/collection/components/nv-calendar/test/partials/week-numbers.logic.test.js +217 -0
- package/dist/collection/components/nv-calendar/test/partials/week-numbers.logic.test.js.map +1 -0
- package/dist/collection/components/nv-datagrid/nv-datagrid.docs.js +88 -2
- package/dist/collection/components/nv-datagrid/nv-datagrid.docs.js.map +1 -1
- package/dist/collection/components/nv-datagrid/nv-datagrid.js +89 -10
- package/dist/collection/components/nv-datagrid/nv-datagrid.js.map +1 -1
- package/dist/collection/components/nv-fielddate/nv-fielddate.js +56 -16
- package/dist/collection/components/nv-fielddate/nv-fielddate.js.map +1 -1
- package/dist/collection/components/nv-fielddate/styles/nv-fielddate.css +44 -0
- package/dist/collection/components/nv-fielddate/test/nv-fielddate.logic.test.js +196 -0
- package/dist/collection/components/nv-fielddate/test/nv-fielddate.logic.test.js.map +1 -0
- package/dist/collection/components/nv-fielddaterange/nv-fielddaterange.docs.js +0 -1
- package/dist/collection/components/nv-fielddaterange/nv-fielddaterange.docs.js.map +1 -1
- package/dist/collection/components/nv-fielddaterange/nv-fielddaterange.js +125 -42
- package/dist/collection/components/nv-fielddaterange/nv-fielddaterange.js.map +1 -1
- package/dist/collection/components/nv-fielddaterange/styles/nv-fielddaterange.css +44 -0
- package/dist/collection/components/nv-fielddaterange/test/nv-fielddaterange.logic.test.js +137 -0
- package/dist/collection/components/nv-fielddaterange/test/nv-fielddaterange.logic.test.js.map +1 -0
- package/dist/collection/components/nv-fielddropdown/styles/nv-fielddropdown.css +46 -0
- package/dist/collection/components/nv-fieldmultiselect/styles/nv-fieldmultiselect.css +46 -0
- package/dist/collection/components/nv-fieldnumber/nv-fieldnumber.css +44 -0
- package/dist/collection/components/nv-fieldnumber/nv-fieldnumber.docs.js +8 -0
- package/dist/collection/components/nv-fieldnumber/nv-fieldnumber.docs.js.map +1 -1
- package/dist/collection/components/nv-fieldnumber/nv-fieldnumber.js +4 -3
- package/dist/collection/components/nv-fieldnumber/nv-fieldnumber.js.map +1 -1
- package/dist/collection/components/nv-fieldpassword/nv-fieldpassword.css +44 -0
- package/dist/collection/components/nv-fieldpassword/nv-fieldpassword.js +3 -3
- package/dist/collection/components/nv-fieldradio/nv-fieldradio.js +3 -3
- package/dist/collection/components/nv-fieldselect/nv-fieldselect.css +44 -0
- package/dist/collection/components/nv-fieldselect/nv-fieldselect.js +5 -5
- package/dist/collection/components/nv-fieldslider/nv-fieldslider.docs.js +22 -22
- package/dist/collection/components/nv-fieldslider/nv-fieldslider.docs.js.map +1 -1
- package/dist/collection/components/nv-fieldslider/nv-fieldslider.js +30 -29
- package/dist/collection/components/nv-fieldslider/nv-fieldslider.js.map +1 -1
- package/dist/collection/components/nv-fieldslider/partials/field-input.js +1 -1
- package/dist/collection/components/nv-fieldslider/partials/field-input.js.map +1 -1
- package/dist/collection/components/nv-fieldslider/styles/nv-fieldslider.css +99 -20
- package/dist/collection/components/nv-fieldtext/nv-fieldtext.css +44 -0
- package/dist/collection/components/nv-fieldtext/nv-fieldtext.js +3 -3
- package/dist/collection/components/nv-fieldtextarea/nv-fieldtextarea.css +38 -0
- package/dist/collection/components/nv-fieldtextarea/nv-fieldtextarea.js +3 -3
- package/dist/collection/components/nv-fieldtime/nv-fieldtime.js +9 -9
- package/dist/collection/components/nv-fieldtime/styles/nv-fieldtime.css +44 -0
- package/dist/collection/components/nv-icon/nv-icon.js +1 -1
- package/dist/collection/components/nv-iconbutton/nv-iconbutton.js +1 -1
- package/dist/collection/components/nv-loader/nv-loader.js +1 -1
- package/dist/collection/components/nv-menu/nv-menu.js +1 -1
- package/dist/collection/components/nv-menuitem/nv-menuitem.js +1 -1
- package/dist/collection/components/nv-popover/nv-popover.js +3 -3
- package/dist/collection/components/nv-popover/nv-popover.js.map +1 -1
- package/dist/collection/components/nv-row/nv-row.js +1 -1
- package/dist/collection/components/nv-stack/nv-stack.js +1 -1
- package/dist/collection/components/nv-table/nv-table.js +2 -2
- package/dist/collection/components/nv-toggle/nv-toggle.js +2 -2
- package/dist/collection/components/nv-tooltip/nv-tooltip.js +1 -1
- package/dist/collection/templates/navigation.docs.js +1 -1
- package/dist/collection/templates/navigation.docs.js.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/nv-alert.js +2 -2
- package/dist/components/nv-avatar.js +2 -2
- package/dist/components/nv-badge.js +1 -1
- package/dist/components/nv-breadcrumb.js +3 -3
- package/dist/components/nv-breadcrumbs.js +1 -1
- package/dist/components/nv-button.js +1 -1
- package/dist/components/nv-calendar.js +1 -1
- package/dist/components/nv-col.js +1 -1
- package/dist/components/nv-datagrid.js +54 -19
- package/dist/components/nv-datagrid.js.map +1 -1
- package/dist/components/nv-datagridcolumn.js +1 -1
- package/dist/components/nv-dialog.js +6 -6
- package/dist/components/nv-dialogfooter.js +1 -1
- package/dist/components/nv-dialogheader.js +1 -1
- package/dist/components/nv-fieldcheckbox.js +1 -1
- package/dist/components/nv-fielddate.js +53 -25
- package/dist/components/nv-fielddate.js.map +1 -1
- package/dist/components/nv-fielddaterange.js +110 -62
- package/dist/components/nv-fielddaterange.js.map +1 -1
- package/dist/components/nv-fielddropdown.js +7 -7
- package/dist/components/nv-fielddropdown.js.map +1 -1
- package/dist/components/nv-fielddropdownitem.js +1 -1
- package/dist/components/nv-fielddropdownitemcheck.js +1 -1
- package/dist/components/nv-fieldmultiselect.js +9 -9
- package/dist/components/nv-fieldmultiselect.js.map +1 -1
- package/dist/components/nv-fieldnumber.js +1 -180
- package/dist/components/nv-fieldnumber.js.map +1 -1
- package/dist/components/nv-fieldpassword.js +8 -8
- package/dist/components/nv-fieldpassword.js.map +1 -1
- package/dist/components/nv-fieldradio.js +4 -4
- package/dist/components/nv-fieldselect.js +10 -10
- package/dist/components/nv-fieldselect.js.map +1 -1
- package/dist/components/nv-fieldslider.js +49 -26
- package/dist/components/nv-fieldslider.js.map +1 -1
- package/dist/components/nv-fieldtext.js +1 -1
- package/dist/components/nv-fieldtextarea.js +5 -5
- package/dist/components/nv-fieldtextarea.js.map +1 -1
- package/dist/components/nv-fieldtime.js +15 -15
- package/dist/components/nv-fieldtime.js.map +1 -1
- package/dist/components/nv-icon.js +1 -1
- package/dist/components/nv-iconbutton.js +1 -1
- package/dist/components/nv-loader.js +1 -1
- package/dist/components/nv-menu.js +5 -5
- package/dist/components/nv-menuitem.js +1 -1
- package/dist/components/nv-popover.js +1 -1
- package/dist/components/nv-row.js +2 -2
- package/dist/components/nv-stack.js +2 -2
- package/dist/components/nv-table.js +3 -3
- package/dist/components/nv-tablecolumn.js +1 -1
- package/dist/components/nv-toggle.js +3 -3
- package/dist/components/nv-tooltip.js +1 -1
- package/dist/components/{p-0ab80d95.js → p-131e5140.js} +4 -4
- package/dist/components/{p-0ab80d95.js.map → p-131e5140.js.map} +1 -1
- package/dist/components/{p-cbdc2c8b.js → p-3f567fde.js} +5 -5
- package/dist/components/{p-cbdc2c8b.js.map → p-3f567fde.js.map} +1 -1
- package/dist/components/p-3f58525b.js +167 -0
- package/dist/components/{p-f0a5e7e4.js.map → p-3f58525b.js.map} +1 -1
- package/dist/components/{p-33e231f4.js → p-6277f746.js} +2 -2
- package/dist/components/{p-33e231f4.js.map → p-6277f746.js.map} +1 -1
- package/dist/components/{p-07a89754.js → p-953d8b4d.js} +3 -3
- package/dist/components/{p-07a89754.js.map → p-953d8b4d.js.map} +1 -1
- package/dist/components/{p-dd2273a3.js → p-9e6e26cb.js} +2 -2
- package/dist/components/{p-dd2273a3.js.map → p-9e6e26cb.js.map} +1 -1
- package/dist/components/{p-d19b41d2.js → p-9f1e8ef3.js} +2 -2
- package/dist/components/{p-d19b41d2.js.map → p-9f1e8ef3.js.map} +1 -1
- package/dist/components/{p-4656efae.js → p-a0d7e0cd.js} +396 -169
- package/dist/components/p-a0d7e0cd.js.map +1 -0
- package/dist/components/{p-f1859ddc.js → p-a1438b39.js} +4 -4
- package/dist/components/{p-f1859ddc.js.map → p-a1438b39.js.map} +1 -1
- package/dist/components/{p-04cb3a6f.js → p-a189d074.js} +5 -5
- package/dist/components/{p-04cb3a6f.js.map → p-a189d074.js.map} +1 -1
- package/dist/components/p-a29a9396.js +184 -0
- package/dist/components/p-a29a9396.js.map +1 -0
- package/dist/components/{p-679e0fa9.js → p-aff3ed68.js} +10 -175
- package/dist/components/p-aff3ed68.js.map +1 -0
- package/dist/components/{p-76a30bf1.js → p-b207be02.js} +3 -3
- package/dist/components/{p-76a30bf1.js.map → p-b207be02.js.map} +1 -1
- package/dist/components/{p-581e67cc.js → p-c07c32d2.js} +3 -3
- package/dist/components/{p-581e67cc.js.map → p-c07c32d2.js.map} +1 -1
- package/dist/components/{p-cbe9521f.js → p-dcaf9010.js} +3 -3
- package/dist/components/{p-cbe9521f.js.map → p-dcaf9010.js.map} +1 -1
- package/dist/components/{p-83c8873a.js → p-dec6fc68.js} +3 -3
- package/dist/components/{p-83c8873a.js.map → p-dec6fc68.js.map} +1 -1
- package/dist/components/{p-d63f1cbe.js → p-df465ef2.js} +3 -3
- package/dist/components/{p-d63f1cbe.js.map → p-df465ef2.js.map} +1 -1
- package/dist/components/{p-c0a91091.js → p-f7c7a406.js} +4 -4
- package/dist/components/{p-c0a91091.js.map → p-f7c7a406.js.map} +1 -1
- package/dist/esm/{constants-b97e736d.js → constants-4faa1fae.js} +2 -2
- package/dist/esm/{constants-b97e736d.js.map → constants-4faa1fae.js.map} +1 -1
- package/dist/esm/{index-8f0e5f19.js → index-a1936cd0.js} +19 -186
- package/dist/esm/index-a1936cd0.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/loader.js +3 -3
- package/dist/esm/native.js +3 -24
- package/dist/esm/native.js.map +1 -1
- package/dist/esm/nv-alert.entry.js +2 -2
- package/dist/esm/nv-avatar.entry.js +2 -2
- package/dist/esm/nv-badge_2.entry.js +1 -1
- package/dist/esm/nv-breadcrumb.entry.js +1 -1
- package/dist/esm/nv-breadcrumbs.entry.js +1 -1
- package/dist/esm/nv-button.entry.js +2 -2
- package/dist/esm/nv-calendar.entry.js +392 -143
- package/dist/esm/nv-calendar.entry.js.map +1 -1
- package/dist/esm/nv-col.entry.js +1 -1
- package/dist/esm/nv-datagrid.entry.js +46 -13
- package/dist/esm/nv-datagrid.entry.js.map +1 -1
- package/dist/esm/nv-datagridcolumn.entry.js +1 -1
- package/dist/esm/nv-dialog.entry.js +2 -2
- package/dist/esm/nv-dialogfooter_2.entry.js +2 -2
- package/dist/esm/nv-fieldcheckbox.entry.js +1 -1
- package/dist/esm/nv-fielddate.entry.js +45 -11
- package/dist/esm/nv-fielddate.entry.js.map +1 -1
- package/dist/esm/nv-fielddaterange.entry.js +98 -44
- package/dist/esm/nv-fielddaterange.entry.js.map +1 -1
- package/dist/esm/nv-fielddropdown.entry.js +2 -2
- package/dist/esm/nv-fielddropdown.entry.js.map +1 -1
- package/dist/esm/nv-fielddropdownitem.entry.js +1 -1
- package/dist/esm/nv-fieldmultiselect.entry.js +2 -2
- package/dist/esm/nv-fieldmultiselect.entry.js.map +1 -1
- package/dist/esm/nv-fieldnumber.entry.js +5 -5
- package/dist/esm/nv-fieldnumber.entry.js.map +1 -1
- package/dist/esm/nv-fieldpassword.entry.js +5 -5
- package/dist/esm/nv-fieldpassword.entry.js.map +1 -1
- package/dist/esm/nv-fieldradio.entry.js +4 -4
- package/dist/esm/nv-fieldselect.entry.js +7 -7
- package/dist/esm/nv-fieldselect.entry.js.map +1 -1
- package/dist/esm/nv-fieldslider.entry.js +28 -23
- package/dist/esm/nv-fieldslider.entry.js.map +1 -1
- package/dist/esm/nv-fieldtext.entry.js +5 -5
- package/dist/esm/nv-fieldtext.entry.js.map +1 -1
- package/dist/esm/nv-fieldtextarea.entry.js +5 -5
- package/dist/esm/nv-fieldtextarea.entry.js.map +1 -1
- package/dist/esm/nv-fieldtime.entry.js +12 -12
- package/dist/esm/nv-fieldtime.entry.js.map +1 -1
- package/dist/esm/nv-icon.entry.js +3 -3
- package/dist/esm/nv-iconbutton_2.entry.js +3 -3
- package/dist/esm/nv-menu.entry.js +2 -2
- package/dist/esm/nv-menuitem.entry.js +2 -2
- package/dist/esm/nv-popover.entry.js +3 -3
- package/dist/esm/nv-popover.entry.js.map +1 -1
- package/dist/esm/nv-row.entry.js +2 -2
- package/dist/esm/nv-stack.entry.js +2 -2
- package/dist/esm/nv-table.entry.js +3 -3
- package/dist/esm/nv-tablecolumn.entry.js +1 -1
- package/dist/esm/nv-toggle.entry.js +3 -3
- package/dist/esm/nv-tooltip.entry.js +2 -2
- package/dist/native/index.esm.js +1 -1
- package/dist/native/native.css +1 -1
- package/dist/native/native.esm.js +1 -1
- package/dist/native/native.esm.js.map +1 -1
- package/dist/native/p-01164e86.entry.js +2 -0
- package/dist/native/{p-5382eab2.entry.js.map → p-01164e86.entry.js.map} +1 -1
- package/dist/native/p-0410facd.entry.js +2 -0
- package/dist/native/p-0410facd.entry.js.map +1 -0
- package/dist/native/{p-519b4819.entry.js → p-08ca678c.entry.js} +2 -2
- package/dist/native/{p-cfe0a6c6.entry.js → p-0ec2d430.entry.js} +2 -2
- package/dist/native/{p-cfe0a6c6.entry.js.map → p-0ec2d430.entry.js.map} +1 -1
- package/dist/native/p-14895e84.entry.js +2 -0
- package/dist/native/p-14895e84.entry.js.map +1 -0
- package/dist/native/p-1a5d3b87.entry.js +2 -0
- package/dist/native/{p-7c676f2c.entry.js.map → p-1a5d3b87.entry.js.map} +1 -1
- package/dist/native/{p-0323daf6.entry.js → p-1c1ecd38.entry.js} +2 -2
- package/dist/native/{p-16a4cdf3.entry.js → p-1d98477d.entry.js} +2 -2
- package/dist/native/{p-19fb0fd0.entry.js → p-2006f5d4.entry.js} +2 -2
- package/dist/native/p-24659a85.entry.js +2 -0
- package/dist/native/{p-ef76178b.entry.js.map → p-24659a85.entry.js.map} +1 -1
- package/dist/native/p-2b1e7675.entry.js +2 -0
- package/dist/native/{p-b0fc08e7.entry.js.map → p-2b1e7675.entry.js.map} +1 -1
- package/dist/native/{p-9fba8663.entry.js → p-2bc7d66a.entry.js} +2 -2
- package/dist/native/p-2c3fb8cc.entry.js +2 -0
- package/dist/native/p-2c3fb8cc.entry.js.map +1 -0
- package/dist/native/p-45cbe6e4.entry.js +2 -0
- package/dist/native/p-46428304.entry.js +2 -0
- package/dist/native/p-46428304.entry.js.map +1 -0
- package/dist/native/{p-c930adb7.entry.js → p-55df8bf9.entry.js} +2 -2
- package/dist/native/p-59b07b36.entry.js +2 -0
- package/dist/native/{p-987c79d8.entry.js.map → p-59b07b36.entry.js.map} +1 -1
- package/dist/native/p-6029e51b.entry.js +2 -0
- package/dist/native/{p-fc3bea07.entry.js.map → p-6029e51b.entry.js.map} +1 -1
- package/dist/native/{p-4c0d81b0.entry.js → p-7ba03c5d.entry.js} +2 -2
- package/dist/native/p-82c4bf56.entry.js +2 -0
- package/dist/native/p-82c4bf56.entry.js.map +1 -0
- package/dist/native/{p-407fc32d.entry.js → p-86ab23ea.entry.js} +2 -2
- package/dist/native/p-87784622.entry.js +2 -0
- package/dist/native/{p-05d95d4d.entry.js → p-914da1e1.entry.js} +2 -2
- package/dist/native/p-9850c1d7.entry.js +2 -0
- package/dist/native/{p-5ba3fc3c.entry.js.map → p-9850c1d7.entry.js.map} +1 -1
- package/dist/native/{p-de2c07a6.entry.js → p-a0505695.entry.js} +3 -3
- package/dist/native/p-a0505695.entry.js.map +1 -0
- package/dist/native/p-a30206c1.entry.js +2 -0
- package/dist/native/{p-aa86af25.entry.js.map → p-a30206c1.entry.js.map} +1 -1
- package/dist/native/p-abbe5d69.entry.js +2 -0
- package/dist/native/{p-7c6edd1c.entry.js.map → p-abbe5d69.entry.js.map} +1 -1
- package/dist/native/{p-221b8f72.entry.js → p-ad128108.entry.js} +2 -2
- package/dist/native/{p-f0ddf60b.entry.js → p-b5b9190a.entry.js} +2 -2
- package/dist/native/p-c7b8b7ba.entry.js +2 -0
- package/dist/native/{p-fb897f7d.entry.js.map → p-c7b8b7ba.entry.js.map} +1 -1
- package/dist/native/p-c92d55f9.entry.js +2 -0
- package/dist/native/{p-3f2b6a22.entry.js → p-c9d3de9c.entry.js} +2 -2
- package/dist/native/p-cbca9326.entry.js +2 -0
- package/dist/native/{p-60b204ac.entry.js.map → p-cbca9326.entry.js.map} +1 -1
- package/dist/native/p-d0a33e64.js +3 -0
- package/dist/native/p-d0a33e64.js.map +1 -0
- package/dist/native/{p-ed488498.entry.js → p-d21b2da2.entry.js} +3 -3
- package/dist/native/{p-f85c08f1.js → p-e2d0a77d.js} +2 -2
- package/dist/native/{p-a2c0f1a7.entry.js → p-ec87200a.entry.js} +2 -2
- package/dist/native/{p-0ec1e2e3.entry.js → p-f377b285.entry.js} +2 -2
- package/dist/native/p-ff0f3794.entry.js +2 -0
- package/dist/native/{p-adc96c3a.entry.js.map → p-ff0f3794.entry.js.map} +1 -1
- package/dist/types/components/nv-calendar/nv-calendar.d.ts +25 -45
- package/dist/types/components/nv-calendar/partials/calendar-actions.d.ts +19 -0
- package/dist/types/components/nv-calendar/partials/calendar-grid.d.ts +46 -0
- package/dist/types/components/nv-calendar/partials/calendar-header.d.ts +38 -0
- package/dist/types/components/nv-calendar/partials/calendar-shortcuts.d.ts +35 -0
- package/dist/types/components/nv-calendar/partials/day-cell.d.ts +35 -0
- package/dist/types/components/nv-calendar/partials/index.d.ts +6 -0
- package/dist/types/components/nv-calendar/partials/week-numbers.d.ts +30 -0
- package/dist/types/components/nv-calendar/test/partials/calendar-actions.logic.test.d.ts +1 -0
- package/dist/types/components/nv-calendar/test/partials/calendar-grid.logic.test.d.ts +1 -0
- package/dist/types/components/nv-calendar/test/partials/calendar-header.logic.test.d.ts +1 -0
- package/dist/types/components/nv-calendar/test/partials/calendar-shortcuts.logic.test.d.ts +1 -0
- package/dist/types/components/nv-calendar/test/partials/day-cell.logic.test.d.ts +1 -0
- package/dist/types/components/nv-calendar/test/partials/week-numbers.logic.test.d.ts +1 -0
- package/dist/types/components/nv-datagrid/nv-datagrid.d.ts +106 -2
- package/dist/types/components/nv-fielddate/nv-fielddate.d.ts +21 -9
- package/dist/types/components/nv-fielddate/test/nv-fielddate.logic.test.d.ts +1 -0
- package/dist/types/components/nv-fielddaterange/nv-fielddaterange.d.ts +19 -6
- package/dist/types/components/nv-fielddaterange/test/nv-fielddaterange.logic.test.d.ts +1 -0
- package/dist/types/components/nv-fieldnumber/nv-fieldnumber.d.ts +1 -0
- package/dist/types/components/nv-fieldslider/nv-fieldslider.d.ts +5 -6
- package/dist/types/components.d.ts +175 -38
- package/dist/vscode-data.json +4 -4
- package/hydrate/index.js +666 -291
- package/hydrate/index.mjs +666 -291
- package/package.json +10 -2
- package/dist/cjs/index-108ddff0.js.map +0 -1
- package/dist/components/p-4656efae.js.map +0 -1
- package/dist/components/p-679e0fa9.js.map +0 -1
- package/dist/components/p-f0a5e7e4.js +0 -167
- package/dist/esm/index-8f0e5f19.js.map +0 -1
- package/dist/native/p-1e3d3374.entry.js +0 -2
- package/dist/native/p-21e7132f.entry.js +0 -2
- package/dist/native/p-21e7132f.entry.js.map +0 -1
- package/dist/native/p-2805f9f2.entry.js +0 -2
- package/dist/native/p-2805f9f2.entry.js.map +0 -1
- package/dist/native/p-5382eab2.entry.js +0 -2
- package/dist/native/p-5ba3fc3c.entry.js +0 -2
- package/dist/native/p-60b204ac.entry.js +0 -2
- package/dist/native/p-7092a675.entry.js +0 -2
- package/dist/native/p-711a7778.js +0 -3
- package/dist/native/p-711a7778.js.map +0 -1
- package/dist/native/p-759c9ce4.entry.js +0 -2
- package/dist/native/p-759c9ce4.entry.js.map +0 -1
- package/dist/native/p-7c676f2c.entry.js +0 -2
- package/dist/native/p-7c6edd1c.entry.js +0 -2
- package/dist/native/p-987c79d8.entry.js +0 -2
- package/dist/native/p-aa86af25.entry.js +0 -2
- package/dist/native/p-adc96c3a.entry.js +0 -2
- package/dist/native/p-b0fc08e7.entry.js +0 -2
- package/dist/native/p-d07ab618.entry.js +0 -2
- package/dist/native/p-dac0089b.entry.js +0 -2
- package/dist/native/p-dac0089b.entry.js.map +0 -1
- package/dist/native/p-de2c07a6.entry.js.map +0 -1
- package/dist/native/p-ef76178b.entry.js +0 -2
- package/dist/native/p-f39803d9.entry.js +0 -2
- package/dist/native/p-f39803d9.entry.js.map +0 -1
- package/dist/native/p-fb897f7d.entry.js +0 -2
- package/dist/native/p-fc3bea07.entry.js +0 -2
- /package/dist/native/{p-519b4819.entry.js.map → p-08ca678c.entry.js.map} +0 -0
- /package/dist/native/{p-0323daf6.entry.js.map → p-1c1ecd38.entry.js.map} +0 -0
- /package/dist/native/{p-16a4cdf3.entry.js.map → p-1d98477d.entry.js.map} +0 -0
- /package/dist/native/{p-19fb0fd0.entry.js.map → p-2006f5d4.entry.js.map} +0 -0
- /package/dist/native/{p-9fba8663.entry.js.map → p-2bc7d66a.entry.js.map} +0 -0
- /package/dist/native/{p-1e3d3374.entry.js.map → p-45cbe6e4.entry.js.map} +0 -0
- /package/dist/native/{p-c930adb7.entry.js.map → p-55df8bf9.entry.js.map} +0 -0
- /package/dist/native/{p-4c0d81b0.entry.js.map → p-7ba03c5d.entry.js.map} +0 -0
- /package/dist/native/{p-407fc32d.entry.js.map → p-86ab23ea.entry.js.map} +0 -0
- /package/dist/native/{p-d07ab618.entry.js.map → p-87784622.entry.js.map} +0 -0
- /package/dist/native/{p-05d95d4d.entry.js.map → p-914da1e1.entry.js.map} +0 -0
- /package/dist/native/{p-221b8f72.entry.js.map → p-ad128108.entry.js.map} +0 -0
- /package/dist/native/{p-f0ddf60b.entry.js.map → p-b5b9190a.entry.js.map} +0 -0
- /package/dist/native/{p-7092a675.entry.js.map → p-c92d55f9.entry.js.map} +0 -0
- /package/dist/native/{p-3f2b6a22.entry.js.map → p-c9d3de9c.entry.js.map} +0 -0
- /package/dist/native/{p-ed488498.entry.js.map → p-d21b2da2.entry.js.map} +0 -0
- /package/dist/native/{p-f85c08f1.js.map → p-e2d0a77d.js.map} +0 -0
- /package/dist/native/{p-a2c0f1a7.entry.js.map → p-ec87200a.entry.js.map} +0 -0
- /package/dist/native/{p-0ec1e2e3.entry.js.map → p-f377b285.entry.js.map} +0 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/* eslint-disable jsdoc/require-jsdoc */
|
|
2
|
+
import { describe, it, expect } from "vitest";
|
|
3
|
+
/**
|
|
4
|
+
* Logic tests for the CalendarGrid partial
|
|
5
|
+
*
|
|
6
|
+
* These tests validate the calendar grid logic:
|
|
7
|
+
* - Month days generation
|
|
8
|
+
* - Previous/next days calculation
|
|
9
|
+
* - Selection logic (single/range)
|
|
10
|
+
* - Cell states (disabled, selected, in-range)
|
|
11
|
+
*/
|
|
12
|
+
function getDaysInMonth(year, month) {
|
|
13
|
+
return new Date(year, month + 1, 0).getDate();
|
|
14
|
+
}
|
|
15
|
+
function getFirstDayOfMonth(year, month) {
|
|
16
|
+
return new Date(year, month, 1).getDay();
|
|
17
|
+
}
|
|
18
|
+
function generateCalendarDays(year, month, firstDayOfWeek = 0) {
|
|
19
|
+
const daysInMonth = getDaysInMonth(year, month);
|
|
20
|
+
const firstDay = getFirstDayOfMonth(year, month);
|
|
21
|
+
const daysToShow = [];
|
|
22
|
+
// Adjust first day based on first day of week setting
|
|
23
|
+
const adjustedFirstDay = (firstDay - firstDayOfWeek + 7) % 7;
|
|
24
|
+
// Previous month days
|
|
25
|
+
const prevMonth = month === 0 ? 11 : month - 1;
|
|
26
|
+
const prevYear = month === 0 ? year - 1 : year;
|
|
27
|
+
const daysInPrevMonth = getDaysInMonth(prevYear, prevMonth);
|
|
28
|
+
for (let i = adjustedFirstDay - 1; i >= 0; i--) {
|
|
29
|
+
const dayOfMonth = daysInPrevMonth - i;
|
|
30
|
+
daysToShow.push({
|
|
31
|
+
date: new Date(prevYear, prevMonth, dayOfMonth),
|
|
32
|
+
isCurrentMonth: false,
|
|
33
|
+
dayOfMonth,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
// Current month days
|
|
37
|
+
for (let day = 1; day <= daysInMonth; day++) {
|
|
38
|
+
daysToShow.push({
|
|
39
|
+
date: new Date(year, month, day),
|
|
40
|
+
isCurrentMonth: true,
|
|
41
|
+
dayOfMonth: day,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// Next month days to fill the grid (42 days = 6 weeks)
|
|
45
|
+
const totalCells = 42;
|
|
46
|
+
const remainingCells = totalCells - daysToShow.length;
|
|
47
|
+
const nextMonth = month === 11 ? 0 : month + 1;
|
|
48
|
+
const nextYear = month === 11 ? year + 1 : year;
|
|
49
|
+
for (let day = 1; day <= remainingCells; day++) {
|
|
50
|
+
daysToShow.push({
|
|
51
|
+
date: new Date(nextYear, nextMonth, day),
|
|
52
|
+
isCurrentMonth: false,
|
|
53
|
+
dayOfMonth: day,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return daysToShow;
|
|
57
|
+
}
|
|
58
|
+
function isDateInRange(date, startDate, endDate) {
|
|
59
|
+
if (!startDate || !endDate)
|
|
60
|
+
return false;
|
|
61
|
+
return date >= startDate && date <= endDate;
|
|
62
|
+
}
|
|
63
|
+
function isDateSelected(date, selectedDate, selectedRange, selectionType = 'single') {
|
|
64
|
+
if (selectionType === 'single') {
|
|
65
|
+
return selectedDate ? date.getTime() === selectedDate.getTime() : false;
|
|
66
|
+
}
|
|
67
|
+
if (selectionType === 'range' && selectedRange) {
|
|
68
|
+
if (selectedRange.start && selectedRange.end) {
|
|
69
|
+
return isDateInRange(date, selectedRange.start, selectedRange.end);
|
|
70
|
+
}
|
|
71
|
+
if (selectedRange.start) {
|
|
72
|
+
return date.getTime() === selectedRange.start.getTime();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
function isRangeStart(date, selectedRange) {
|
|
78
|
+
return (selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.start)
|
|
79
|
+
? date.getTime() === selectedRange.start.getTime()
|
|
80
|
+
: false;
|
|
81
|
+
}
|
|
82
|
+
function isRangeEnd(date, selectedRange) {
|
|
83
|
+
return (selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.end)
|
|
84
|
+
? date.getTime() === selectedRange.end.getTime()
|
|
85
|
+
: false;
|
|
86
|
+
}
|
|
87
|
+
function isDateDisabled(date, disabledDates, minDate, maxDate) {
|
|
88
|
+
// Check min/max dates
|
|
89
|
+
if (minDate && date < minDate)
|
|
90
|
+
return true;
|
|
91
|
+
if (maxDate && date > maxDate)
|
|
92
|
+
return true;
|
|
93
|
+
// Check disabled dates array
|
|
94
|
+
if (disabledDates) {
|
|
95
|
+
const year = date.getFullYear();
|
|
96
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
97
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
98
|
+
const dateString = `${year}-${month}-${day}`;
|
|
99
|
+
return disabledDates.includes(dateString);
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
describe('CalendarGrid - Logic Tests', () => {
|
|
104
|
+
const testYear = 2024;
|
|
105
|
+
const testMonth = 5; // June (0-indexed)
|
|
106
|
+
describe('Date Calculations', () => {
|
|
107
|
+
it('should calculate days in month correctly', () => {
|
|
108
|
+
expect(getDaysInMonth(2024, 0)).toBe(31); // January
|
|
109
|
+
expect(getDaysInMonth(2024, 1)).toBe(29); // February (leap year)
|
|
110
|
+
expect(getDaysInMonth(2023, 1)).toBe(28); // February (non-leap year)
|
|
111
|
+
expect(getDaysInMonth(2024, 3)).toBe(30); // April
|
|
112
|
+
expect(getDaysInMonth(2024, 11)).toBe(31); // December
|
|
113
|
+
});
|
|
114
|
+
it('should calculate first day of month correctly', () => {
|
|
115
|
+
expect(getFirstDayOfMonth(2024, 0)).toBe(1); // January 1, 2024 is Monday
|
|
116
|
+
expect(getFirstDayOfMonth(2024, 5)).toBe(6); // June 1, 2024 is Saturday
|
|
117
|
+
});
|
|
118
|
+
it('should handle leap year correctly', () => {
|
|
119
|
+
expect(getDaysInMonth(2024, 1)).toBe(29); // 2024 is leap year
|
|
120
|
+
expect(getDaysInMonth(2023, 1)).toBe(28); // 2023 is not leap year
|
|
121
|
+
expect(getDaysInMonth(2000, 1)).toBe(29); // 2000 is leap year
|
|
122
|
+
expect(getDaysInMonth(1900, 1)).toBe(28); // 1900 is not leap year
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe('Calendar Grid Generation', () => {
|
|
126
|
+
it('should generate correct number of days', () => {
|
|
127
|
+
const days = generateCalendarDays(testYear, testMonth);
|
|
128
|
+
expect(days.length).toBe(42); // Always 6 weeks
|
|
129
|
+
});
|
|
130
|
+
it('should include current month days', () => {
|
|
131
|
+
const days = generateCalendarDays(testYear, testMonth);
|
|
132
|
+
const currentMonthDays = days.filter(day => day.isCurrentMonth);
|
|
133
|
+
expect(currentMonthDays.length).toBe(30); // June has 30 days
|
|
134
|
+
expect(currentMonthDays[0].dayOfMonth).toBe(1);
|
|
135
|
+
expect(currentMonthDays[29].dayOfMonth).toBe(30);
|
|
136
|
+
});
|
|
137
|
+
it('should include previous month days when needed', () => {
|
|
138
|
+
const days = generateCalendarDays(testYear, testMonth);
|
|
139
|
+
const prevMonthDays = days.filter(day => !day.isCurrentMonth && day.date < new Date(testYear, testMonth, 1));
|
|
140
|
+
expect(prevMonthDays.length).toBeGreaterThan(0);
|
|
141
|
+
});
|
|
142
|
+
it('should include next month days to fill grid', () => {
|
|
143
|
+
const days = generateCalendarDays(testYear, testMonth);
|
|
144
|
+
const nextMonthDays = days.filter(day => !day.isCurrentMonth &&
|
|
145
|
+
day.date > new Date(testYear, testMonth + 1, 0));
|
|
146
|
+
expect(nextMonthDays.length).toBeGreaterThan(0);
|
|
147
|
+
});
|
|
148
|
+
it('should respect first day of week setting', () => {
|
|
149
|
+
// Test with Monday as first day (1)
|
|
150
|
+
const daysMonday = generateCalendarDays(testYear, testMonth, 1);
|
|
151
|
+
const daysSunday = generateCalendarDays(testYear, testMonth, 0);
|
|
152
|
+
// Structure should be different
|
|
153
|
+
expect(daysMonday[0].date.getDay()).not.toBe(daysSunday[0].date.getDay());
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe('Selection Logic', () => {
|
|
157
|
+
const testDate = new Date(2024, 5, 15);
|
|
158
|
+
const selectedDate = new Date(2024, 5, 15);
|
|
159
|
+
const selectedRange = {
|
|
160
|
+
start: new Date(2024, 5, 10),
|
|
161
|
+
end: new Date(2024, 5, 20),
|
|
162
|
+
};
|
|
163
|
+
it('should detect single date selection', () => {
|
|
164
|
+
expect(isDateSelected(testDate, selectedDate, undefined, 'single')).toBe(true);
|
|
165
|
+
expect(isDateSelected(new Date(2024, 5, 16), selectedDate, undefined, 'single')).toBe(false);
|
|
166
|
+
});
|
|
167
|
+
it('should detect range selection', () => {
|
|
168
|
+
const inRangeDate = new Date(2024, 5, 15);
|
|
169
|
+
const outOfRangeDate = new Date(2024, 5, 25);
|
|
170
|
+
expect(isDateSelected(inRangeDate, undefined, selectedRange, 'range')).toBe(true);
|
|
171
|
+
expect(isDateSelected(outOfRangeDate, undefined, selectedRange, 'range')).toBe(false);
|
|
172
|
+
});
|
|
173
|
+
it('should detect range start and end', () => {
|
|
174
|
+
expect(isRangeStart(selectedRange.start, selectedRange)).toBe(true);
|
|
175
|
+
expect(isRangeStart(selectedRange.end, selectedRange)).toBe(false);
|
|
176
|
+
expect(isRangeEnd(selectedRange.end, selectedRange)).toBe(true);
|
|
177
|
+
expect(isRangeEnd(selectedRange.start, selectedRange)).toBe(false);
|
|
178
|
+
});
|
|
179
|
+
it('should handle incomplete range selection', () => {
|
|
180
|
+
const incompleteRange = { start: new Date(2024, 5, 10) };
|
|
181
|
+
expect(isDateSelected(incompleteRange.start, undefined, incompleteRange, 'range')).toBe(true);
|
|
182
|
+
expect(isDateSelected(new Date(2024, 5, 15), undefined, incompleteRange, 'range')).toBe(false);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('Date Validation Logic', () => {
|
|
186
|
+
const testDate = new Date(2024, 5, 15);
|
|
187
|
+
const minDate = new Date(2024, 5, 1);
|
|
188
|
+
const maxDate = new Date(2024, 5, 30);
|
|
189
|
+
const disabledDates = ['2024-06-10', '2024-06-20'];
|
|
190
|
+
it('should detect dates outside min/max range', () => {
|
|
191
|
+
const beforeMin = new Date(2024, 4, 31);
|
|
192
|
+
const afterMax = new Date(2024, 6, 1);
|
|
193
|
+
expect(isDateDisabled(beforeMin, undefined, minDate, maxDate)).toBe(true);
|
|
194
|
+
expect(isDateDisabled(afterMax, undefined, minDate, maxDate)).toBe(true);
|
|
195
|
+
expect(isDateDisabled(testDate, undefined, minDate, maxDate)).toBe(false);
|
|
196
|
+
});
|
|
197
|
+
it('should detect specifically disabled dates', () => {
|
|
198
|
+
const disabledDate = new Date(2024, 5, 10);
|
|
199
|
+
const enabledDate = new Date(2024, 5, 15);
|
|
200
|
+
expect(isDateDisabled(disabledDate, disabledDates)).toBe(true);
|
|
201
|
+
expect(isDateDisabled(enabledDate, disabledDates)).toBe(false);
|
|
202
|
+
});
|
|
203
|
+
it('should handle multiple validation conditions', () => {
|
|
204
|
+
const beforeMinAndDisabled = new Date(2024, 4, 31);
|
|
205
|
+
expect(isDateDisabled(beforeMinAndDisabled, disabledDates, minDate, maxDate)).toBe(true);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
describe('Edge Cases', () => {
|
|
209
|
+
it('should handle month boundaries correctly', () => {
|
|
210
|
+
// Test December to January transition
|
|
211
|
+
const decemberDays = generateCalendarDays(2024, 11);
|
|
212
|
+
const currentMonthDays = decemberDays.filter(day => day.isCurrentMonth);
|
|
213
|
+
expect(currentMonthDays.length).toBe(31);
|
|
214
|
+
});
|
|
215
|
+
it('should handle year boundaries correctly', () => {
|
|
216
|
+
// Test December 2024 to January 2025
|
|
217
|
+
const days = generateCalendarDays(2024, 11);
|
|
218
|
+
const nextYearDays = days.filter(day => day.date.getFullYear() === 2025);
|
|
219
|
+
expect(nextYearDays.length).toBeGreaterThan(0);
|
|
220
|
+
});
|
|
221
|
+
it('should handle leap year February correctly', () => {
|
|
222
|
+
const februaryDays = generateCalendarDays(2024, 1); // February 2024
|
|
223
|
+
const currentMonthDays = februaryDays.filter(day => day.isCurrentMonth);
|
|
224
|
+
expect(currentMonthDays.length).toBe(29); // Leap year
|
|
225
|
+
});
|
|
226
|
+
it('should handle different first day of week values', () => {
|
|
227
|
+
const firstDayValues = [0, 1, 2, 3, 4, 5, 6];
|
|
228
|
+
firstDayValues.forEach(firstDay => {
|
|
229
|
+
const days = generateCalendarDays(testYear, testMonth, firstDay);
|
|
230
|
+
expect(days.length).toBe(42);
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
it('should handle empty selections gracefully', () => {
|
|
234
|
+
const testDate = new Date(2024, 5, 15);
|
|
235
|
+
expect(isDateSelected(testDate, undefined, undefined, 'single')).toBe(false);
|
|
236
|
+
expect(isDateSelected(testDate, undefined, undefined, 'range')).toBe(false);
|
|
237
|
+
expect(isRangeStart(testDate, undefined)).toBe(false);
|
|
238
|
+
expect(isRangeEnd(testDate, undefined)).toBe(false);
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
describe('Integration Scenarios', () => {
|
|
242
|
+
it('should generate complete calendar data for a month', () => {
|
|
243
|
+
const days = generateCalendarDays(testYear, testMonth);
|
|
244
|
+
const selectedRange = {
|
|
245
|
+
start: new Date(2024, 5, 10),
|
|
246
|
+
end: new Date(2024, 5, 15),
|
|
247
|
+
};
|
|
248
|
+
const disabledDates = ['2024-06-20'];
|
|
249
|
+
days.forEach(day => {
|
|
250
|
+
const isSelected = isDateSelected(day.date, undefined, selectedRange, 'range');
|
|
251
|
+
const isDisabled = isDateDisabled(day.date, disabledDates);
|
|
252
|
+
const isStart = isRangeStart(day.date, selectedRange);
|
|
253
|
+
const isEnd = isRangeEnd(day.date, selectedRange);
|
|
254
|
+
expect(typeof isSelected).toBe('boolean');
|
|
255
|
+
expect(typeof isDisabled).toBe('boolean');
|
|
256
|
+
expect(typeof isStart).toBe('boolean');
|
|
257
|
+
expect(typeof isEnd).toBe('boolean');
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
//# sourceMappingURL=calendar-grid.logic.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar-grid.logic.test.js","sourceRoot":"","sources":["../../../../../src/components/nv-calendar/test/partials/calendar-grid.logic.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\nimport { describe, it, expect } from 'vitest';\n\n/**\n * Logic tests for the CalendarGrid partial\n *\n * These tests validate the calendar grid logic:\n * - Month days generation\n * - Previous/next days calculation\n * - Selection logic (single/range)\n * - Cell states (disabled, selected, in-range)\n */\n\nfunction getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\nfunction getFirstDayOfMonth(year: number, month: number): number {\n return new Date(year, month, 1).getDay();\n}\n\nfunction generateCalendarDays(\n year: number,\n month: number,\n firstDayOfWeek = 0,\n): Array<{ date: Date; isCurrentMonth: boolean; dayOfMonth: number }> {\n const daysInMonth = getDaysInMonth(year, month);\n const firstDay = getFirstDayOfMonth(year, month);\n const daysToShow = [];\n\n // Adjust first day based on first day of week setting\n const adjustedFirstDay = (firstDay - firstDayOfWeek + 7) % 7;\n\n // Previous month days\n const prevMonth = month === 0 ? 11 : month - 1;\n const prevYear = month === 0 ? year - 1 : year;\n const daysInPrevMonth = getDaysInMonth(prevYear, prevMonth);\n\n for (let i = adjustedFirstDay - 1; i >= 0; i--) {\n const dayOfMonth = daysInPrevMonth - i;\n daysToShow.push({\n date: new Date(prevYear, prevMonth, dayOfMonth),\n isCurrentMonth: false,\n dayOfMonth,\n });\n }\n\n // Current month days\n for (let day = 1; day <= daysInMonth; day++) {\n daysToShow.push({\n date: new Date(year, month, day),\n isCurrentMonth: true,\n dayOfMonth: day,\n });\n }\n\n // Next month days to fill the grid (42 days = 6 weeks)\n const totalCells = 42;\n const remainingCells = totalCells - daysToShow.length;\n const nextMonth = month === 11 ? 0 : month + 1;\n const nextYear = month === 11 ? year + 1 : year;\n\n for (let day = 1; day <= remainingCells; day++) {\n daysToShow.push({\n date: new Date(nextYear, nextMonth, day),\n isCurrentMonth: false,\n dayOfMonth: day,\n });\n }\n\n return daysToShow;\n}\n\nfunction isDateInRange(date: Date, startDate?: Date, endDate?: Date): boolean {\n if (!startDate || !endDate) return false;\n return date >= startDate && date <= endDate;\n}\n\nfunction isDateSelected(\n date: Date,\n selectedDate?: Date,\n selectedRange?: { start?: Date; end?: Date },\n selectionType: 'single' | 'range' = 'single',\n): boolean {\n if (selectionType === 'single') {\n return selectedDate ? date.getTime() === selectedDate.getTime() : false;\n }\n\n if (selectionType === 'range' && selectedRange) {\n if (selectedRange.start && selectedRange.end) {\n return isDateInRange(date, selectedRange.start, selectedRange.end);\n }\n if (selectedRange.start) {\n return date.getTime() === selectedRange.start.getTime();\n }\n }\n\n return false;\n}\n\nfunction isRangeStart(\n date: Date,\n selectedRange?: { start?: Date; end?: Date },\n): boolean {\n return selectedRange?.start\n ? date.getTime() === selectedRange.start.getTime()\n : false;\n}\n\nfunction isRangeEnd(\n date: Date,\n selectedRange?: { start?: Date; end?: Date },\n): boolean {\n return selectedRange?.end\n ? date.getTime() === selectedRange.end.getTime()\n : false;\n}\n\nfunction isDateDisabled(\n date: Date,\n disabledDates?: string[],\n minDate?: Date,\n maxDate?: Date,\n): boolean {\n // Check min/max dates\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n\n // Check disabled dates array\n if (disabledDates) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const dateString = `${year}-${month}-${day}`;\n return disabledDates.includes(dateString);\n }\n\n return false;\n}\n\ndescribe('CalendarGrid - Logic Tests', () => {\n const testYear = 2024;\n const testMonth = 5; // June (0-indexed)\n\n describe('Date Calculations', () => {\n it('should calculate days in month correctly', () => {\n expect(getDaysInMonth(2024, 0)).toBe(31); // January\n expect(getDaysInMonth(2024, 1)).toBe(29); // February (leap year)\n expect(getDaysInMonth(2023, 1)).toBe(28); // February (non-leap year)\n expect(getDaysInMonth(2024, 3)).toBe(30); // April\n expect(getDaysInMonth(2024, 11)).toBe(31); // December\n });\n\n it('should calculate first day of month correctly', () => {\n expect(getFirstDayOfMonth(2024, 0)).toBe(1); // January 1, 2024 is Monday\n expect(getFirstDayOfMonth(2024, 5)).toBe(6); // June 1, 2024 is Saturday\n });\n\n it('should handle leap year correctly', () => {\n expect(getDaysInMonth(2024, 1)).toBe(29); // 2024 is leap year\n expect(getDaysInMonth(2023, 1)).toBe(28); // 2023 is not leap year\n expect(getDaysInMonth(2000, 1)).toBe(29); // 2000 is leap year\n expect(getDaysInMonth(1900, 1)).toBe(28); // 1900 is not leap year\n });\n });\n\n describe('Calendar Grid Generation', () => {\n it('should generate correct number of days', () => {\n const days = generateCalendarDays(testYear, testMonth);\n expect(days.length).toBe(42); // Always 6 weeks\n });\n\n it('should include current month days', () => {\n const days = generateCalendarDays(testYear, testMonth);\n const currentMonthDays = days.filter(day => day.isCurrentMonth);\n\n expect(currentMonthDays.length).toBe(30); // June has 30 days\n expect(currentMonthDays[0].dayOfMonth).toBe(1);\n expect(currentMonthDays[29].dayOfMonth).toBe(30);\n });\n\n it('should include previous month days when needed', () => {\n const days = generateCalendarDays(testYear, testMonth);\n const prevMonthDays = days.filter(\n day =>\n !day.isCurrentMonth && day.date < new Date(testYear, testMonth, 1),\n );\n\n expect(prevMonthDays.length).toBeGreaterThan(0);\n });\n\n it('should include next month days to fill grid', () => {\n const days = generateCalendarDays(testYear, testMonth);\n const nextMonthDays = days.filter(\n day =>\n !day.isCurrentMonth &&\n day.date > new Date(testYear, testMonth + 1, 0),\n );\n\n expect(nextMonthDays.length).toBeGreaterThan(0);\n });\n\n it('should respect first day of week setting', () => {\n // Test with Monday as first day (1)\n const daysMonday = generateCalendarDays(testYear, testMonth, 1);\n const daysSunday = generateCalendarDays(testYear, testMonth, 0);\n\n // Structure should be different\n expect(daysMonday[0].date.getDay()).not.toBe(daysSunday[0].date.getDay());\n });\n });\n\n describe('Selection Logic', () => {\n const testDate = new Date(2024, 5, 15);\n const selectedDate = new Date(2024, 5, 15);\n const selectedRange = {\n start: new Date(2024, 5, 10),\n end: new Date(2024, 5, 20),\n };\n\n it('should detect single date selection', () => {\n expect(isDateSelected(testDate, selectedDate, undefined, 'single')).toBe(\n true,\n );\n expect(\n isDateSelected(\n new Date(2024, 5, 16),\n selectedDate,\n undefined,\n 'single',\n ),\n ).toBe(false);\n });\n\n it('should detect range selection', () => {\n const inRangeDate = new Date(2024, 5, 15);\n const outOfRangeDate = new Date(2024, 5, 25);\n\n expect(\n isDateSelected(inRangeDate, undefined, selectedRange, 'range'),\n ).toBe(true);\n expect(\n isDateSelected(outOfRangeDate, undefined, selectedRange, 'range'),\n ).toBe(false);\n });\n\n it('should detect range start and end', () => {\n expect(isRangeStart(selectedRange.start!, selectedRange)).toBe(true);\n expect(isRangeStart(selectedRange.end!, selectedRange)).toBe(false);\n\n expect(isRangeEnd(selectedRange.end!, selectedRange)).toBe(true);\n expect(isRangeEnd(selectedRange.start!, selectedRange)).toBe(false);\n });\n\n it('should handle incomplete range selection', () => {\n const incompleteRange = { start: new Date(2024, 5, 10) };\n\n expect(\n isDateSelected(\n incompleteRange.start,\n undefined,\n incompleteRange,\n 'range',\n ),\n ).toBe(true);\n expect(\n isDateSelected(\n new Date(2024, 5, 15),\n undefined,\n incompleteRange,\n 'range',\n ),\n ).toBe(false);\n });\n });\n\n describe('Date Validation Logic', () => {\n const testDate = new Date(2024, 5, 15);\n const minDate = new Date(2024, 5, 1);\n const maxDate = new Date(2024, 5, 30);\n const disabledDates = ['2024-06-10', '2024-06-20'];\n\n it('should detect dates outside min/max range', () => {\n const beforeMin = new Date(2024, 4, 31);\n const afterMax = new Date(2024, 6, 1);\n\n expect(isDateDisabled(beforeMin, undefined, minDate, maxDate)).toBe(true);\n expect(isDateDisabled(afterMax, undefined, minDate, maxDate)).toBe(true);\n expect(isDateDisabled(testDate, undefined, minDate, maxDate)).toBe(false);\n });\n\n it('should detect specifically disabled dates', () => {\n const disabledDate = new Date(2024, 5, 10);\n const enabledDate = new Date(2024, 5, 15);\n\n expect(isDateDisabled(disabledDate, disabledDates)).toBe(true);\n expect(isDateDisabled(enabledDate, disabledDates)).toBe(false);\n });\n\n it('should handle multiple validation conditions', () => {\n const beforeMinAndDisabled = new Date(2024, 4, 31);\n\n expect(\n isDateDisabled(beforeMinAndDisabled, disabledDates, minDate, maxDate),\n ).toBe(true);\n });\n });\n\n describe('Edge Cases', () => {\n it('should handle month boundaries correctly', () => {\n // Test December to January transition\n const decemberDays = generateCalendarDays(2024, 11);\n const currentMonthDays = decemberDays.filter(day => day.isCurrentMonth);\n\n expect(currentMonthDays.length).toBe(31);\n });\n\n it('should handle year boundaries correctly', () => {\n // Test December 2024 to January 2025\n const days = generateCalendarDays(2024, 11);\n const nextYearDays = days.filter(day => day.date.getFullYear() === 2025);\n\n expect(nextYearDays.length).toBeGreaterThan(0);\n });\n\n it('should handle leap year February correctly', () => {\n const februaryDays = generateCalendarDays(2024, 1); // February 2024\n const currentMonthDays = februaryDays.filter(day => day.isCurrentMonth);\n\n expect(currentMonthDays.length).toBe(29); // Leap year\n });\n\n it('should handle different first day of week values', () => {\n const firstDayValues = [0, 1, 2, 3, 4, 5, 6];\n\n firstDayValues.forEach(firstDay => {\n const days = generateCalendarDays(testYear, testMonth, firstDay);\n expect(days.length).toBe(42);\n });\n });\n\n it('should handle empty selections gracefully', () => {\n const testDate = new Date(2024, 5, 15);\n\n expect(isDateSelected(testDate, undefined, undefined, 'single')).toBe(\n false,\n );\n expect(isDateSelected(testDate, undefined, undefined, 'range')).toBe(\n false,\n );\n expect(isRangeStart(testDate, undefined)).toBe(false);\n expect(isRangeEnd(testDate, undefined)).toBe(false);\n });\n });\n\n describe('Integration Scenarios', () => {\n it('should generate complete calendar data for a month', () => {\n const days = generateCalendarDays(testYear, testMonth);\n const selectedRange = {\n start: new Date(2024, 5, 10),\n end: new Date(2024, 5, 15),\n };\n const disabledDates = ['2024-06-20'];\n\n days.forEach(day => {\n const isSelected = isDateSelected(\n day.date,\n undefined,\n selectedRange,\n 'range',\n );\n const isDisabled = isDateDisabled(day.date, disabledDates);\n const isStart = isRangeStart(day.date, selectedRange);\n const isEnd = isRangeEnd(day.date, selectedRange);\n\n expect(typeof isSelected).toBe('boolean');\n expect(typeof isDisabled).toBe('boolean');\n expect(typeof isStart).toBe('boolean');\n expect(typeof isEnd).toBe('boolean');\n });\n });\n });\n});\n"]}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/* eslint-disable jsdoc/require-jsdoc */
|
|
2
|
+
import { describe, it, expect } from "vitest";
|
|
3
|
+
/**
|
|
4
|
+
* Logic tests for the CalendarHeader partial
|
|
5
|
+
*
|
|
6
|
+
* These tests validate the calendar header logic:
|
|
7
|
+
* - Previous/next month navigation
|
|
8
|
+
* - Year/month dropdown handling
|
|
9
|
+
* - Min/max limits validation
|
|
10
|
+
* - Label formatting
|
|
11
|
+
*/
|
|
12
|
+
function canNavigatePrevious(currentDate, minDate) {
|
|
13
|
+
if (!minDate)
|
|
14
|
+
return true;
|
|
15
|
+
const prevMonth = new Date(currentDate);
|
|
16
|
+
prevMonth.setMonth(currentDate.getMonth() - 1);
|
|
17
|
+
return prevMonth >= minDate;
|
|
18
|
+
}
|
|
19
|
+
function canNavigateNext(currentDate, maxDate) {
|
|
20
|
+
if (!maxDate)
|
|
21
|
+
return true;
|
|
22
|
+
const nextMonth = new Date(currentDate);
|
|
23
|
+
nextMonth.setMonth(currentDate.getMonth() + 1);
|
|
24
|
+
return nextMonth <= maxDate;
|
|
25
|
+
}
|
|
26
|
+
function generateYearOptions(currentYear, minYear, maxYear) {
|
|
27
|
+
const startYear = minYear || currentYear - 10;
|
|
28
|
+
const endYear = maxYear || currentYear + 10;
|
|
29
|
+
const years = [];
|
|
30
|
+
for (let year = startYear; year <= endYear; year++) {
|
|
31
|
+
years.push(year);
|
|
32
|
+
}
|
|
33
|
+
return years;
|
|
34
|
+
}
|
|
35
|
+
function generateMonthOptions(locale = 'en-US') {
|
|
36
|
+
const months = [];
|
|
37
|
+
for (let month = 0; month < 12; month++) {
|
|
38
|
+
const date = new Date(2024, month, 1);
|
|
39
|
+
const label = date.toLocaleDateString(locale, { month: 'long' });
|
|
40
|
+
months.push({ value: month, label });
|
|
41
|
+
}
|
|
42
|
+
return months;
|
|
43
|
+
}
|
|
44
|
+
function formatHeaderLabel(date, locale = 'en-US') {
|
|
45
|
+
return date.toLocaleDateString(locale, {
|
|
46
|
+
month: 'long',
|
|
47
|
+
year: 'numeric',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function shouldShowDropdowns(allowYearSelection, allowMonthSelection) {
|
|
51
|
+
return allowYearSelection || allowMonthSelection;
|
|
52
|
+
}
|
|
53
|
+
describe('CalendarHeader - Logic Tests', () => {
|
|
54
|
+
const currentDate = new Date('2024-06-15');
|
|
55
|
+
const minDate = new Date('2024-01-01');
|
|
56
|
+
const maxDate = new Date('2024-12-31');
|
|
57
|
+
describe('Navigation Logic', () => {
|
|
58
|
+
it('should allow previous navigation when no min date', () => {
|
|
59
|
+
expect(canNavigatePrevious(currentDate)).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
it('should allow previous navigation when within limits', () => {
|
|
62
|
+
expect(canNavigatePrevious(currentDate, minDate)).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
it('should block previous navigation when at min date', () => {
|
|
65
|
+
const atMinDate = new Date('2024-01-15');
|
|
66
|
+
expect(canNavigatePrevious(atMinDate, minDate)).toBe(false);
|
|
67
|
+
});
|
|
68
|
+
it('should allow next navigation when no max date', () => {
|
|
69
|
+
expect(canNavigateNext(currentDate)).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
it('should allow next navigation when within limits', () => {
|
|
72
|
+
expect(canNavigateNext(currentDate, maxDate)).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
it('should block next navigation when at max date', () => {
|
|
75
|
+
const atMaxDate = new Date('2024-12-15');
|
|
76
|
+
expect(canNavigateNext(atMaxDate, maxDate)).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe('Year Options Generation', () => {
|
|
80
|
+
it('should generate default year range', () => {
|
|
81
|
+
const years = generateYearOptions(2024);
|
|
82
|
+
expect(years).toContain(2014);
|
|
83
|
+
expect(years).toContain(2024);
|
|
84
|
+
expect(years).toContain(2034);
|
|
85
|
+
expect(years.length).toBe(21); // 2014-2034
|
|
86
|
+
});
|
|
87
|
+
it('should respect min/max year constraints', () => {
|
|
88
|
+
const years = generateYearOptions(2024, 2020, 2025);
|
|
89
|
+
expect(years).toEqual([2020, 2021, 2022, 2023, 2024, 2025]);
|
|
90
|
+
expect(years.length).toBe(6);
|
|
91
|
+
});
|
|
92
|
+
it('should handle edge case where min equals max', () => {
|
|
93
|
+
const years = generateYearOptions(2024, 2024, 2024);
|
|
94
|
+
expect(years).toEqual([2024]);
|
|
95
|
+
expect(years.length).toBe(1);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('Month Options Generation', () => {
|
|
99
|
+
it('should generate 12 months with English labels', () => {
|
|
100
|
+
const months = generateMonthOptions('en-US');
|
|
101
|
+
expect(months.length).toBe(12);
|
|
102
|
+
expect(months[0]).toEqual({ value: 0, label: 'January' });
|
|
103
|
+
expect(months[5]).toEqual({ value: 5, label: 'June' });
|
|
104
|
+
expect(months[11]).toEqual({ value: 11, label: 'December' });
|
|
105
|
+
});
|
|
106
|
+
it('should generate months with French labels', () => {
|
|
107
|
+
const months = generateMonthOptions('fr-FR');
|
|
108
|
+
expect(months.length).toBe(12);
|
|
109
|
+
expect(months[0].value).toBe(0);
|
|
110
|
+
expect(months[0].label.toLowerCase()).toContain('janvier');
|
|
111
|
+
});
|
|
112
|
+
it('should handle all month values correctly', () => {
|
|
113
|
+
const months = generateMonthOptions();
|
|
114
|
+
months.forEach((month, index) => {
|
|
115
|
+
expect(month.value).toBe(index);
|
|
116
|
+
expect(typeof month.label).toBe('string');
|
|
117
|
+
expect(month.label.length).toBeGreaterThan(0);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe('Header Label Formatting', () => {
|
|
122
|
+
it('should format header label in English', () => {
|
|
123
|
+
const label = formatHeaderLabel(currentDate, 'en-US');
|
|
124
|
+
expect(label).toBe('June 2024');
|
|
125
|
+
});
|
|
126
|
+
it('should format header label in French', () => {
|
|
127
|
+
const label = formatHeaderLabel(currentDate, 'fr-FR');
|
|
128
|
+
expect(label.toLowerCase()).toContain('juin');
|
|
129
|
+
expect(label).toContain('2024');
|
|
130
|
+
});
|
|
131
|
+
it('should handle different dates correctly', () => {
|
|
132
|
+
const dates = [
|
|
133
|
+
new Date('2024-01-01'),
|
|
134
|
+
new Date('2024-07-15'),
|
|
135
|
+
new Date('2024-12-31'),
|
|
136
|
+
];
|
|
137
|
+
dates.forEach(date => {
|
|
138
|
+
const label = formatHeaderLabel(date);
|
|
139
|
+
expect(typeof label).toBe('string');
|
|
140
|
+
expect(label.length).toBeGreaterThan(0);
|
|
141
|
+
expect(label).toContain('2024');
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
describe('Dropdown Visibility Logic', () => {
|
|
146
|
+
it('should show dropdowns when year selection enabled', () => {
|
|
147
|
+
expect(shouldShowDropdowns(true, false)).toBe(true);
|
|
148
|
+
});
|
|
149
|
+
it('should show dropdowns when month selection enabled', () => {
|
|
150
|
+
expect(shouldShowDropdowns(false, true)).toBe(true);
|
|
151
|
+
});
|
|
152
|
+
it('should show dropdowns when both enabled', () => {
|
|
153
|
+
expect(shouldShowDropdowns(true, true)).toBe(true);
|
|
154
|
+
});
|
|
155
|
+
it('should hide dropdowns when both disabled', () => {
|
|
156
|
+
expect(shouldShowDropdowns(false, false)).toBe(false);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
describe('Integration Scenarios', () => {
|
|
160
|
+
it('should handle complete navigation flow', () => {
|
|
161
|
+
const testDate = new Date('2024-06-15');
|
|
162
|
+
const testMinDate = new Date('2024-05-01');
|
|
163
|
+
const testMaxDate = new Date('2024-07-31');
|
|
164
|
+
// Can navigate previous
|
|
165
|
+
expect(canNavigatePrevious(testDate, testMinDate)).toBe(true);
|
|
166
|
+
// Can navigate next
|
|
167
|
+
expect(canNavigateNext(testDate, testMaxDate)).toBe(true);
|
|
168
|
+
// Generate appropriate options
|
|
169
|
+
const years = generateYearOptions(2024, 2024, 2024);
|
|
170
|
+
expect(years).toContain(2024);
|
|
171
|
+
});
|
|
172
|
+
it('should handle boundary conditions', () => {
|
|
173
|
+
const boundaryDate = new Date('2024-01-01');
|
|
174
|
+
const sameDayMin = new Date('2024-01-01');
|
|
175
|
+
// At exact boundary
|
|
176
|
+
expect(canNavigatePrevious(boundaryDate, sameDayMin)).toBe(false);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
describe('Edge Cases', () => {
|
|
180
|
+
it('should handle leap year in February', () => {
|
|
181
|
+
const leapYearDate = new Date('2024-02-29');
|
|
182
|
+
const label = formatHeaderLabel(leapYearDate);
|
|
183
|
+
expect(label).toContain('February');
|
|
184
|
+
expect(label).toContain('2024');
|
|
185
|
+
});
|
|
186
|
+
it('should handle year boundaries', () => {
|
|
187
|
+
const newYearDate = new Date('2024-01-01');
|
|
188
|
+
const endYearDate = new Date('2024-12-31');
|
|
189
|
+
const newYearLabel = formatHeaderLabel(newYearDate);
|
|
190
|
+
const endYearLabel = formatHeaderLabel(endYearDate);
|
|
191
|
+
expect(newYearLabel).toContain('January 2024');
|
|
192
|
+
expect(endYearLabel).toContain('December 2024');
|
|
193
|
+
});
|
|
194
|
+
it('should handle invalid year ranges gracefully', () => {
|
|
195
|
+
// Max year before min year - should still work
|
|
196
|
+
const years = generateYearOptions(2024, 2025, 2020);
|
|
197
|
+
expect(Array.isArray(years)).toBe(true);
|
|
198
|
+
// Should result in empty array or handle gracefully
|
|
199
|
+
});
|
|
200
|
+
it('should handle very large year ranges', () => {
|
|
201
|
+
const years = generateYearOptions(2024, 1900, 2100);
|
|
202
|
+
expect(years.length).toBe(201); // 1900-2100 inclusive
|
|
203
|
+
expect(years[0]).toBe(1900);
|
|
204
|
+
expect(years[years.length - 1]).toBe(2100);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
//# sourceMappingURL=calendar-header.logic.test.js.map
|
package/dist/collection/components/nv-calendar/test/partials/calendar-header.logic.test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar-header.logic.test.js","sourceRoot":"","sources":["../../../../../src/components/nv-calendar/test/partials/calendar-header.logic.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\nimport { describe, it, expect } from 'vitest';\n\n/**\n * Logic tests for the CalendarHeader partial\n *\n * These tests validate the calendar header logic:\n * - Previous/next month navigation\n * - Year/month dropdown handling\n * - Min/max limits validation\n * - Label formatting\n */\n\nfunction canNavigatePrevious(currentDate: Date, minDate?: Date): boolean {\n if (!minDate) return true;\n\n const prevMonth = new Date(currentDate);\n prevMonth.setMonth(currentDate.getMonth() - 1);\n\n return prevMonth >= minDate;\n}\n\nfunction canNavigateNext(currentDate: Date, maxDate?: Date): boolean {\n if (!maxDate) return true;\n\n const nextMonth = new Date(currentDate);\n nextMonth.setMonth(currentDate.getMonth() + 1);\n\n return nextMonth <= maxDate;\n}\n\nfunction generateYearOptions(\n currentYear: number,\n minYear?: number,\n maxYear?: number,\n): number[] {\n const startYear = minYear || currentYear - 10;\n const endYear = maxYear || currentYear + 10;\n\n const years: number[] = [];\n for (let year = startYear; year <= endYear; year++) {\n years.push(year);\n }\n\n return years;\n}\n\nfunction generateMonthOptions(\n locale = 'en-US',\n): { value: number; label: string }[] {\n const months: { value: number; label: string }[] = [];\n\n for (let month = 0; month < 12; month++) {\n const date = new Date(2024, month, 1);\n const label = date.toLocaleDateString(locale, { month: 'long' });\n months.push({ value: month, label });\n }\n\n return months;\n}\n\nfunction formatHeaderLabel(date: Date, locale = 'en-US'): string {\n return date.toLocaleDateString(locale, {\n month: 'long',\n year: 'numeric',\n });\n}\n\nfunction shouldShowDropdowns(\n allowYearSelection: boolean,\n allowMonthSelection: boolean,\n): boolean {\n return allowYearSelection || allowMonthSelection;\n}\n\ndescribe('CalendarHeader - Logic Tests', () => {\n const currentDate = new Date('2024-06-15');\n const minDate = new Date('2024-01-01');\n const maxDate = new Date('2024-12-31');\n\n describe('Navigation Logic', () => {\n it('should allow previous navigation when no min date', () => {\n expect(canNavigatePrevious(currentDate)).toBe(true);\n });\n\n it('should allow previous navigation when within limits', () => {\n expect(canNavigatePrevious(currentDate, minDate)).toBe(true);\n });\n\n it('should block previous navigation when at min date', () => {\n const atMinDate = new Date('2024-01-15');\n expect(canNavigatePrevious(atMinDate, minDate)).toBe(false);\n });\n\n it('should allow next navigation when no max date', () => {\n expect(canNavigateNext(currentDate)).toBe(true);\n });\n\n it('should allow next navigation when within limits', () => {\n expect(canNavigateNext(currentDate, maxDate)).toBe(true);\n });\n\n it('should block next navigation when at max date', () => {\n const atMaxDate = new Date('2024-12-15');\n expect(canNavigateNext(atMaxDate, maxDate)).toBe(false);\n });\n });\n\n describe('Year Options Generation', () => {\n it('should generate default year range', () => {\n const years = generateYearOptions(2024);\n\n expect(years).toContain(2014);\n expect(years).toContain(2024);\n expect(years).toContain(2034);\n expect(years.length).toBe(21); // 2014-2034\n });\n\n it('should respect min/max year constraints', () => {\n const years = generateYearOptions(2024, 2020, 2025);\n\n expect(years).toEqual([2020, 2021, 2022, 2023, 2024, 2025]);\n expect(years.length).toBe(6);\n });\n\n it('should handle edge case where min equals max', () => {\n const years = generateYearOptions(2024, 2024, 2024);\n\n expect(years).toEqual([2024]);\n expect(years.length).toBe(1);\n });\n });\n\n describe('Month Options Generation', () => {\n it('should generate 12 months with English labels', () => {\n const months = generateMonthOptions('en-US');\n\n expect(months.length).toBe(12);\n expect(months[0]).toEqual({ value: 0, label: 'January' });\n expect(months[5]).toEqual({ value: 5, label: 'June' });\n expect(months[11]).toEqual({ value: 11, label: 'December' });\n });\n\n it('should generate months with French labels', () => {\n const months = generateMonthOptions('fr-FR');\n\n expect(months.length).toBe(12);\n expect(months[0].value).toBe(0);\n expect(months[0].label.toLowerCase()).toContain('janvier');\n });\n\n it('should handle all month values correctly', () => {\n const months = generateMonthOptions();\n\n months.forEach((month, index) => {\n expect(month.value).toBe(index);\n expect(typeof month.label).toBe('string');\n expect(month.label.length).toBeGreaterThan(0);\n });\n });\n });\n\n describe('Header Label Formatting', () => {\n it('should format header label in English', () => {\n const label = formatHeaderLabel(currentDate, 'en-US');\n\n expect(label).toBe('June 2024');\n });\n\n it('should format header label in French', () => {\n const label = formatHeaderLabel(currentDate, 'fr-FR');\n\n expect(label.toLowerCase()).toContain('juin');\n expect(label).toContain('2024');\n });\n\n it('should handle different dates correctly', () => {\n const dates = [\n new Date('2024-01-01'),\n new Date('2024-07-15'),\n new Date('2024-12-31'),\n ];\n\n dates.forEach(date => {\n const label = formatHeaderLabel(date);\n expect(typeof label).toBe('string');\n expect(label.length).toBeGreaterThan(0);\n expect(label).toContain('2024');\n });\n });\n });\n\n describe('Dropdown Visibility Logic', () => {\n it('should show dropdowns when year selection enabled', () => {\n expect(shouldShowDropdowns(true, false)).toBe(true);\n });\n\n it('should show dropdowns when month selection enabled', () => {\n expect(shouldShowDropdowns(false, true)).toBe(true);\n });\n\n it('should show dropdowns when both enabled', () => {\n expect(shouldShowDropdowns(true, true)).toBe(true);\n });\n\n it('should hide dropdowns when both disabled', () => {\n expect(shouldShowDropdowns(false, false)).toBe(false);\n });\n });\n\n describe('Integration Scenarios', () => {\n it('should handle complete navigation flow', () => {\n const testDate = new Date('2024-06-15');\n const testMinDate = new Date('2024-05-01');\n const testMaxDate = new Date('2024-07-31');\n\n // Can navigate previous\n expect(canNavigatePrevious(testDate, testMinDate)).toBe(true);\n\n // Can navigate next\n expect(canNavigateNext(testDate, testMaxDate)).toBe(true);\n\n // Generate appropriate options\n const years = generateYearOptions(2024, 2024, 2024);\n expect(years).toContain(2024);\n });\n\n it('should handle boundary conditions', () => {\n const boundaryDate = new Date('2024-01-01');\n const sameDayMin = new Date('2024-01-01');\n\n // At exact boundary\n expect(canNavigatePrevious(boundaryDate, sameDayMin)).toBe(false);\n });\n });\n\n describe('Edge Cases', () => {\n it('should handle leap year in February', () => {\n const leapYearDate = new Date('2024-02-29');\n const label = formatHeaderLabel(leapYearDate);\n\n expect(label).toContain('February');\n expect(label).toContain('2024');\n });\n\n it('should handle year boundaries', () => {\n const newYearDate = new Date('2024-01-01');\n const endYearDate = new Date('2024-12-31');\n\n const newYearLabel = formatHeaderLabel(newYearDate);\n const endYearLabel = formatHeaderLabel(endYearDate);\n\n expect(newYearLabel).toContain('January 2024');\n expect(endYearLabel).toContain('December 2024');\n });\n\n it('should handle invalid year ranges gracefully', () => {\n // Max year before min year - should still work\n const years = generateYearOptions(2024, 2025, 2020);\n\n expect(Array.isArray(years)).toBe(true);\n // Should result in empty array or handle gracefully\n });\n\n it('should handle very large year ranges', () => {\n const years = generateYearOptions(2024, 1900, 2100);\n\n expect(years.length).toBe(201); // 1900-2100 inclusive\n expect(years[0]).toBe(1900);\n expect(years[years.length - 1]).toBe(2100);\n });\n });\n});\n"]}
|