abstract-datepicker
v0.1.3
Published
An abstract logic handler for rendering datepickers in any UI framework.
Downloads
2
Readme
Abstract Date Picker
An abstract logic handler for rendering datepickers in any UI framework.
⚠️ WARNING: This package is still in need of heavy testing before it is ready for production use. ⚠️
Installation
yarn add abstract-datepicker
Usage
The current intended use for this module is a business application that I work on which uses React for the front end. The below example describes how one would utilize this package in a React context.
import React from 'react';
import { createDatePicker } from 'abstract-datepicker';
import { Date, Button, Row, Week } from './styled';
class App extends React.Component {
constructor(props) {
super(props);
this.picker = createDatePicker({
groupByWeek: true,
});
this.state = {
monthName: '',
month: [],
};
}
componentDidMount() {
this.unsubscribe = this.picker.subscribe(({ month, monthName, year }) => {
this.setState({
month,
monthName,
year,
});
});
}
componentWillUnmount() {
this.unsubscribe();
}
incrementMonth = () => this.picker.incrementMonth();
decrementMonth = () => this.picker.decrementMonth();
render() {
const { monthName, year, month } = this.state;
return (
<>
<Row>
<Button onClick={this.decrementMonth}>Prev Month</Button>
<span>{monthName} {year}</span>
<Button onClick={this.incrementMonth}>Next Month</Button>
</Row>
<div>
{
month.map((week, idx) => (
<Week key={`${year}-${monthName}-week-${idx}`}>
{
week.map((day) => (
<Date
key={day.iso}
selected={day.selected}
>
{day.date}
</Date>
))
}
</Week>
))
}
</div>
</>
)
}
}
API
createDatePicker
- Type:
(?DatePickerOptions) => DatePicker
- Default:
{}
TODO: Quality description
DatePickerOptions
- Type:
Object
Params:
| Name | Type | Description
| --- | --- | ---
| groupByWeek | boolean
| When true, returns a 2D array where each top-level array represents a week beginning on Sunday in the month
| initialDate | Date \| string
| The initial date the datepicker should utilize. The initial month will be calculated based on initialDate. Default: new Date()
| includeTrailers | boolean
| Often the first week of a month begins at the end of a previous month (e.g. July 2019 started on a Monday, leaving a trailing Sunday from the previous month). By default, "trailers" are included in the month.
| retainMonthsRadius | number
| (NOT YET IMPLEMENTED/UNDER CONSIDERATION) For potential gains (needs benchmarking), calculated months can be retained based on a radius of months relative the currently selected month. That is, a radius of 2 with a selected month of July would hold on to a previously calculated May, June, August and September.
| monthNameFormat | 'short' \| 'long'
| (WILL LIKELY ABROGATE IN FAVOR OF A FORMATTER OR LEAVE UP TO THE CONSUMER)
DatePicker
- Type:
Object
Params:
| Name | Type | Description
| --- | --- | ---
| subscribe | (DatePickerState) => () => void
| A function that will subscribe a callback to changes in the datepicker. The function returns a function that when called will unsubscribe the function from updates.
| incrementMonth | () => void
| Increment the current month forward
| decrementMonth | () => void
| Decrement the current month backward
| resetMonth | () => void
| Reset the current month to be inline with the currently selected date
| setDate | (Date) => void
| Set the selected date
DatePickerState
- Type:
Object
Params:
| Name | Type | Description
| --- | --- | ---
| month | Array<DatePickerDate>
| An array of dates to be rendered by the renderer
| selectedDate | Date
| The current selected date
| selectedMonth | Date
| The current selected month (may not align with date)
DatePickerDate
- Type:
Object
Params:
| Name | Type | Description
| --- | --- | ---
| day | Date
| The day of the week to which the date belongs
| date | number
| The day of the month
| iso | string
| An ISO-8601 formatted date-time string in UTC
| obj | Date
| A native JS Date object
| selected | boolean
| Whether the date is the currently selected date