react-js-cron-mui
Version:
A React cron editor with Material UI a forked repo from Xavier Rutayisire (https://github.com/xrutayisire/react-js-cron)
376 lines (351 loc) • 9.16 kB
text/typescript
import { Dispatch, SetStateAction } from 'react'
import {ButtonProps,SelectProps} from '@material-ui/core'
// External props
export interface CronProps {
/**
* Cron value, the component is by design a controled component.
* The first value will be the default value.
*
* required
*/
value: string
/**
* Set the cron value, similar to onChange.
* The naming tells you that you have to set the value by yourself.
*
* required
*/
setValue: SetValue
/**
* Set the container className and used as a prefix for other selectors.
* Available selectors: https://xrutayisire.github.io/react-js-cron/?path=/story/reactjs-cron--custom-style
*/
className?: string
/**
* Humanize the labels in the cron component, SUN-SAT and JAN-DEC.
*
* Default: true
*/
humanizeLabels?: boolean
/**
* Humanize the value, SUN-SAT and JAN-DEC.
*
* Default: false
*/
humanizeValue?: boolean
/**
* Controls whether to use cron intervals syntax.
*
* Example: When set to true, a cron expression like '0 8 * * 1,3,5' ("At 08:00 AM, only on Monday, Wednesday, and Friday")
* would be changed to '0 8 * * 1-5/2' ("At 08:00 AM, every 2 days of the week, Monday through Friday")
*
* Default: true
*/
useCronIntervals?: boolean
/**
* Add a "0" before numbers lower than 10.
*
* Default: false
*/
leadingZero?: LeadingZero
/**
* Define the default period when the default value is empty.
*
* Default: 'day'
*/
defaultPeriod?: PeriodType
/**
* Define the options of periods that will be displayed.
*
* Example: If you only want the option to generate cron expressions to
* represent a time in the day you can define periodsToDisplay={['day']}.
* The other options won't be available in the period select component.
*
* Default: ['year', 'month', 'week', 'day', 'hour', 'minute', 'reboot']
*
* OBS: 'reboot' option will apply only when '@reboot' is listed in shortcuts list.
*/
periodsToDisplay?: PeriodType[]
/**
* Define which fields can select multiple values.
*
* Example: If you don't want to allow multiple hours or minutes to be selected,
* you can define allowMultipleSelectFor={['months', 'month-days', 'week-days']}.
* This way only months, month days and week days select components will be allowed
* to have multiple values in the cron expression.
*
* Default: ['months', 'month-days', 'week-days', 'hours', 'minutes']
*/
allowMultipleSelectFor?: Omit<CronType, 'period'>[]
/**
* Disable the cron component.
*
* Default: false
*/
disabled?: boolean
/**
* Make the cron component read-only.
*
* Default: false
*/
readOnly?: boolean
/**
* Define if empty should trigger an error.
*
* Default: 'for-default-value'
*/
allowEmpty?: AllowEmpty
/**
* Support cron shortcuts.
*
* Default: ['@yearly', '@annually', '@monthly', '@weekly', '@daily', '@midnight', '@hourly']
*/
shortcuts?: Shortcuts
/**
* Define the clock format.
*/
clockFormat?: ClockFormat
/**
* Display the clear button.
*
* Default: true
*/
clearButton?: boolean
clearButtonProps?: ClearButtonProps
/**
* Define the clear button action.
*
* Default: 'fill-with-every'
*/
clearButtonAction?: ClearButtonAction
/**
* Display error style (red border and background).
*
* Display: true
*/
displayError?: boolean
/**
* Triggered when the cron component detects an error with the value.
*/
onError?: OnError
/**
* Change the component language.
* Can also be used to remove prefix and suffix.
*
* When setting 'humanizeLabels' you can change the language of the
* alternative labels with 'altWeekDays' and 'altMonths'.
*
* The order of the 'locale' properties 'weekDays', 'months', 'altMonths'
* and 'altWeekDays' is important! The index will be used as value.
*
* Default './locale.ts'
*/
locale?: Locale
}
export interface Locale {
everyText?: string
emptyMonths?: string
emptyMonthDays?: string
emptyMonthDaysShort?: string
emptyWeekDays?: string
emptyWeekDaysShort?: string
emptyHours?: string
emptyMinutes?: string
emptyMinutesForHourPeriod?: string
yearOption?: string
monthOption?: string
weekOption?: string
dayOption?: string
hourOption?: string
minuteOption?: string
rebootOption?: string
prefixPeriod?: string
prefixMonths?: string
prefixMonthDays?: string
prefixWeekDays?: string
prefixWeekDaysForMonthAndYearPeriod?: string
prefixHours?: string
prefixMinutes?: string
prefixMinutesForHourPeriod?: string
suffixMinutesForHourPeriod?: string
errorInvalidCron?: string
clearButtonText?: string
weekDays?: string[]
months?: string[]
altWeekDays?: string[]
altMonths?: string[]
}
export type SetValueFunction = (value: string) => void
export type SetValue = SetValueFunction | Dispatch<SetStateAction<string>>
export type CronError =
| {
type: 'invalid_cron'
description: string
}
| undefined
export type OnErrorFunction = (error: CronError) => void
export type OnError =
| OnErrorFunction
| Dispatch<SetStateAction<CronError>>
| undefined
export interface ClearButtonProps extends Omit<ButtonProps, 'onClick'> {}
export type ClearButtonAction = 'empty' | 'fill-with-every' | string
export type PeriodType =
| 'year'
| 'month'
| 'week'
| 'day'
| 'hour'
| 'minute'
| 'reboot'
| string
export type AllowEmpty = 'always' | 'never' | 'for-default-value' | string
export type CronType =
| 'period'
| 'months'
| 'month-days'
| 'week-days'
| 'hours'
| 'minutes'
| string
export type LeadingZeroType = 'month-days' | 'hours' | 'minutes' | string
export type LeadingZero = boolean | LeadingZeroType[]
export type ClockFormat = '24-hour-clock' | '12-hour-clock' | string
export type ShortcutsType =
| '@yearly'
| '@annually'
| '@monthly'
| '@weekly'
| '@daily'
| '@midnight'
| '@hourly'
| '@reboot'
export type Shortcuts = boolean | ShortcutsType[]
// Internal props
export interface FieldProps {
value?: number[]
setValue: SetValueNumbersOrUndefined
locale: Locale
className?: string
disabled: boolean
readOnly: boolean
useCronIntervals: boolean
period: PeriodType
multiple: boolean
}
export interface PeriodProps
extends Omit<FieldProps, 'value' | 'setValue' | 'period' | 'useCronIntervals' | 'multiple'> {
value: PeriodType
setValue: SetValuePeriod
shortcuts: Shortcuts
periodsToDisplay?: PeriodType[]
}
export interface MonthsProps extends FieldProps {
humanizeLabels: boolean
}
export interface MonthDaysProps extends FieldProps {
weekDays?: number[]
leadingZero: LeadingZero
}
export interface WeekDaysProps extends FieldProps {
humanizeLabels: boolean
monthDays?: number[]
}
export interface HoursProps extends FieldProps {
leadingZero: LeadingZero
clockFormat?: ClockFormat
}
export interface MinutesProps extends FieldProps {
leadingZero: LeadingZero
clockFormat?: ClockFormat
}
export interface CustomSelectProps
extends Omit<
SelectProps,
| 'mode'
| 'tokenSeparators'
| 'allowClear'
| 'virtual'
| 'onClick'
| 'onBlur'
| 'tagRender'
| 'dropdownRender'
| 'showSearch'
| 'showArrow'
| 'onChange'
| 'dropdownMatchSelectWidth'
| 'options'
| 'onSelect'
| 'onDeselect'
> {
grid?: boolean
setValue: SetValueNumbersOrUndefined
optionsList?: string[]
locale: Locale
value?: number[]
humanizeLabels?: boolean
useCronIntervals?: boolean
disabled: boolean
readOnly: boolean
leadingZero?: LeadingZero
clockFormat?: ClockFormat
period: PeriodType
unit: Unit
}
export type SetValueNumbersOrUndefined = Dispatch<
SetStateAction<number[] | undefined>
>
export type SetValuePeriod = Dispatch<SetStateAction<PeriodType>>
export type SetInternalError = Dispatch<SetStateAction<boolean>>
export interface DefaultLocale {
everyText: string
emptyMonths: string
emptyMonthDays: string
emptyMonthDaysShort: string
emptyWeekDays: string
emptyWeekDaysShort: string
emptyHours: string
emptyMinutes: string
emptyMinutesForHourPeriod: string
yearOption: string
monthOption: string
weekOption: string
dayOption: string
hourOption: string
minuteOption: string
rebootOption: string
prefixPeriod: string
prefixMonths: string
prefixMonthDays: string
prefixWeekDays: string
prefixWeekDaysForMonthAndYearPeriod: string
prefixHours: string
prefixMinutes: string
prefixMinutesForHourPeriod: string
suffixMinutesForHourPeriod: string
errorInvalidCron: string
clearButtonText: string
weekDays: string[]
months: string[]
altWeekDays: string[]
altMonths: string[]
}
export type CronValues = { [key in CronType]: number[] | string | undefined }
export interface Classes {
[key: string]: boolean
}
export interface ShortcutsValues {
name: ShortcutsType
value: string
}
export interface Unit {
type: CronType
min: number
max: number
total: number
alt?: string[]
}
export interface Clicks {
time: number
value: number
}