refactor: timer strategy is default

This commit is contained in:
Carlos Valente
2024-10-19 13:51:35 +02:00
committed by Carlos Valente
parent cc5c097ddc
commit ab847a324b
4 changed files with 58 additions and 20 deletions
@@ -9,8 +9,6 @@ import {
parseUserTime, parseUserTime,
reorderArray, reorderArray,
swapEventData, swapEventData,
validateEndAction,
validateTimerType,
} from 'ontime-utils'; } from 'ontime-utils';
import { RUNDOWN } from '../api/constants'; import { RUNDOWN } from '../api/constants';
@@ -37,6 +35,7 @@ export const useEventAction = () => {
const { const {
defaultPublic, defaultPublic,
linkPrevious, linkPrevious,
defaultTimeStrategy,
defaultDuration, defaultDuration,
defaultWarnTime, defaultWarnTime,
defaultDangerTime, defaultDangerTime,
@@ -116,11 +115,15 @@ export const useEventAction = () => {
} }
if (newEvent.timerType === undefined) { if (newEvent.timerType === undefined) {
newEvent.timerType = validateTimerType(defaultTimerType); newEvent.timerType = defaultTimerType;
} }
if (newEvent.endAction === undefined) { if (newEvent.endAction === undefined) {
newEvent.endAction = validateEndAction(defaultEndAction); newEvent.endAction = defaultEndAction;
}
if (newEvent.timeStrategy === undefined) {
newEvent.timeStrategy = defaultTimeStrategy;
} }
} }
@@ -142,6 +145,7 @@ export const useEventAction = () => {
defaultEndAction, defaultEndAction,
defaultPublic, defaultPublic,
defaultTimerType, defaultTimerType,
defaultTimeStrategy,
defaultWarnTime, defaultWarnTime,
linkPrevious, linkPrevious,
queryClient, queryClient,
@@ -1,5 +1,5 @@
import { EndAction, TimerType } from 'ontime-types'; import { EndAction, TimerType, TimeStrategy } from 'ontime-types';
import { validateEndAction, validateTimerType } from 'ontime-utils'; import { validateEndAction, validateTimerType, validateTimeStrategy } from 'ontime-utils';
import { create } from 'zustand'; import { create } from 'zustand';
import { booleanFromLocalStorage } from '../utils/localStorage'; import { booleanFromLocalStorage } from '../utils/localStorage';
@@ -7,6 +7,7 @@ import { booleanFromLocalStorage } from '../utils/localStorage';
type EditorSettingsStore = { type EditorSettingsStore = {
defaultDuration: string; defaultDuration: string;
linkPrevious: boolean; linkPrevious: boolean;
defaultTimeStrategy: TimeStrategy;
defaultWarnTime: string; defaultWarnTime: string;
defaultDangerTime: string; defaultDangerTime: string;
defaultPublic: boolean; defaultPublic: boolean;
@@ -14,6 +15,7 @@ type EditorSettingsStore = {
defaultEndAction: EndAction; defaultEndAction: EndAction;
setDefaultDuration: (defaultDuration: string) => void; setDefaultDuration: (defaultDuration: string) => void;
setLinkPrevious: (linkPrevious: boolean) => void; setLinkPrevious: (linkPrevious: boolean) => void;
setTimeStrategy: (timeStrategy: TimeStrategy) => void;
setWarnTime: (warnTime: string) => void; setWarnTime: (warnTime: string) => void;
setDangerTime: (dangerTime: string) => void; setDangerTime: (dangerTime: string) => void;
setDefaultPublic: (defaultPublic: boolean) => void; setDefaultPublic: (defaultPublic: boolean) => void;
@@ -24,6 +26,7 @@ type EditorSettingsStore = {
export const editorSettingsDefaults = { export const editorSettingsDefaults = {
duration: '00:10:00', duration: '00:10:00',
linkPrevious: true, linkPrevious: true,
timeStrategy: TimeStrategy.LockDuration,
warnTime: '00:02:00', // 120000 same as backend warnTime: '00:02:00', // 120000 same as backend
dangerTime: '00:01:00', // 60000 same as backend dangerTime: '00:01:00', // 60000 same as backend
isPublic: true, isPublic: true,
@@ -34,6 +37,7 @@ export const editorSettingsDefaults = {
enum EditorSettingsKeys { enum EditorSettingsKeys {
DefaultDuration = 'ontime-default-duration', DefaultDuration = 'ontime-default-duration',
LinkPrevious = 'ontime-link-previous', LinkPrevious = 'ontime-link-previous',
DefaultTimeStrategy = 'ontime-time-strategy',
DefaultWarnTime = 'ontime-default-warn-time', DefaultWarnTime = 'ontime-default-warn-time',
DefaultDangerTime = 'ontime-default-danger-time', DefaultDangerTime = 'ontime-default-danger-time',
DefaultPublic = 'ontime-default-public', DefaultPublic = 'ontime-default-public',
@@ -45,6 +49,10 @@ export const useEditorSettings = create<EditorSettingsStore>((set) => {
return { return {
defaultDuration: localStorage.getItem(EditorSettingsKeys.DefaultDuration) ?? editorSettingsDefaults.duration, defaultDuration: localStorage.getItem(EditorSettingsKeys.DefaultDuration) ?? editorSettingsDefaults.duration,
linkPrevious: booleanFromLocalStorage(EditorSettingsKeys.LinkPrevious, editorSettingsDefaults.linkPrevious), linkPrevious: booleanFromLocalStorage(EditorSettingsKeys.LinkPrevious, editorSettingsDefaults.linkPrevious),
defaultTimeStrategy: validateTimeStrategy(
localStorage.getItem(EditorSettingsKeys.DefaultTimeStrategy),
editorSettingsDefaults.timeStrategy,
),
defaultWarnTime: localStorage.getItem(EditorSettingsKeys.DefaultWarnTime) ?? editorSettingsDefaults.warnTime, defaultWarnTime: localStorage.getItem(EditorSettingsKeys.DefaultWarnTime) ?? editorSettingsDefaults.warnTime,
defaultDangerTime: localStorage.getItem(EditorSettingsKeys.DefaultDangerTime) ?? editorSettingsDefaults.dangerTime, defaultDangerTime: localStorage.getItem(EditorSettingsKeys.DefaultDangerTime) ?? editorSettingsDefaults.dangerTime,
defaultPublic: booleanFromLocalStorage(EditorSettingsKeys.DefaultPublic, editorSettingsDefaults.isPublic), defaultPublic: booleanFromLocalStorage(EditorSettingsKeys.DefaultPublic, editorSettingsDefaults.isPublic),
@@ -68,6 +76,12 @@ export const useEditorSettings = create<EditorSettingsStore>((set) => {
localStorage.setItem(EditorSettingsKeys.LinkPrevious, String(linkPrevious)); localStorage.setItem(EditorSettingsKeys.LinkPrevious, String(linkPrevious));
return { linkPrevious }; return { linkPrevious };
}), }),
setTimeStrategy: (defaultTimeStrategy) =>
set(() => {
localStorage.setItem(EditorSettingsKeys.DefaultTimeStrategy, String(defaultTimeStrategy));
return { defaultTimeStrategy };
}),
setWarnTime: (defaultWarnTime) => setWarnTime: (defaultWarnTime) =>
set(() => { set(() => {
localStorage.setItem(EditorSettingsKeys.DefaultWarnTime, String(defaultWarnTime)); localStorage.setItem(EditorSettingsKeys.DefaultWarnTime, String(defaultWarnTime));
@@ -1,5 +1,5 @@
import { Select, Switch } from '@chakra-ui/react'; import { Select, Switch } from '@chakra-ui/react';
import { EndAction, TimerType } from 'ontime-types'; import { EndAction, TimerType, TimeStrategy } from 'ontime-types';
import { parseUserTime } from 'ontime-utils'; import { parseUserTime } from 'ontime-utils';
import TimeInput from '../../../../common/components/input/time-input/TimeInput'; import TimeInput from '../../../../common/components/input/time-input/TimeInput';
@@ -10,6 +10,7 @@ export default function EditorSettingsForm() {
const { const {
defaultDuration, defaultDuration,
linkPrevious, linkPrevious,
defaultTimeStrategy,
defaultWarnTime, defaultWarnTime,
defaultDangerTime, defaultDangerTime,
defaultPublic, defaultPublic,
@@ -17,6 +18,7 @@ export default function EditorSettingsForm() {
defaultEndAction, defaultEndAction,
setDefaultDuration, setDefaultDuration,
setLinkPrevious, setLinkPrevious,
setTimeStrategy,
setWarnTime, setWarnTime,
setDangerTime, setDangerTime,
setDefaultPublic, setDefaultPublic,
@@ -36,15 +38,6 @@ export default function EditorSettingsForm() {
<Panel.Section> <Panel.Section>
<Panel.Title>Rundown defaults for new events</Panel.Title> <Panel.Title>Rundown defaults for new events</Panel.Title>
<Panel.ListGroup> <Panel.ListGroup>
<Panel.ListItem>
<Panel.Field title='Default duration' description='Default duration for new events' />
<TimeInput<'defaultDuration'>
name='defaultDuration'
submitHandler={(_field, value) => setDefaultDuration(value)}
time={durationInMs}
placeholder={editorSettingsDefaults.duration}
/>
</Panel.ListItem>
<Panel.ListItem> <Panel.ListItem>
<Panel.Field <Panel.Field
title='Link previous' title='Link previous'
@@ -57,6 +50,33 @@ export default function EditorSettingsForm() {
onChange={(event) => setLinkPrevious(event.target.checked)} onChange={(event) => setLinkPrevious(event.target.checked)}
/> />
</Panel.ListItem> </Panel.ListItem>
<Panel.ListItem>
<Panel.Field
title='Timer strategy'
description='Which time should be maintained when event schedule is recalculated'
/>
<Select
variant='ontime'
size='sm'
width='auto'
value={defaultTimeStrategy}
onChange={(event) => setTimeStrategy(event.target.value as TimeStrategy)}
>
<option value={TimeStrategy.LockDuration}>Duration</option>
<option value={TimeStrategy.LockEnd}>End Time</option>
</Select>
</Panel.ListItem>
</Panel.ListGroup>
<Panel.ListGroup>
<Panel.ListItem>
<Panel.Field title='Default duration' description='Default duration for new events' />
<TimeInput<'defaultDuration'>
name='defaultDuration'
submitHandler={(_field, value) => setDefaultDuration(value)}
time={durationInMs}
placeholder={editorSettingsDefaults.duration}
/>
</Panel.ListItem>
<Panel.ListItem> <Panel.ListItem>
<Panel.Field title='Timer type' description='Default type of timer for new events' /> <Panel.Field title='Timer type' description='Default type of timer for new events' />
<Select <Select
@@ -10,7 +10,7 @@ import { MaybeString, OntimeEvent, TimeStrategy } from 'ontime-types';
import TimeInputWithButton from '../../../common/components/input/time-input/TimeInputWithButton'; import TimeInputWithButton from '../../../common/components/input/time-input/TimeInputWithButton';
import { useEventAction } from '../../../common/hooks/useEventAction'; import { useEventAction } from '../../../common/hooks/useEventAction';
import { cx } from '../../../common/utils/styleUtils'; import { cx } from '../../../common/utils/styleUtils';
import { tooltipDelayFast } from '../../../ontimeConfig'; import { tooltipDelayFast, tooltipDelayMid } from '../../../ontimeConfig';
import style from './TimeInputFlow.module.scss'; import style from './TimeInputFlow.module.scss';
@@ -66,7 +66,7 @@ const TimeInputFlow = (props: EventBlockTimerProps) => {
placeholder='Start' placeholder='Start'
disabled={Boolean(linkStart)} disabled={Boolean(linkStart)}
> >
<Tooltip label='Link start to previous end' shouldWrapChildren openDelay={0}> <Tooltip label='Link start to previous end' openDelay={tooltipDelayMid}>
<InputRightElement className={activeStart} onClick={() => handleLink(!linkStart)}> <InputRightElement className={activeStart} onClick={() => handleLink(!linkStart)}>
<span className={style.timeLabel}>S</span> <span className={style.timeLabel}>S</span>
<span className={style.fourtyfive}>{linkStart ? <IoLink /> : <IoUnlink />}</span> <span className={style.fourtyfive}>{linkStart ? <IoLink /> : <IoUnlink />}</span>
@@ -82,7 +82,7 @@ const TimeInputFlow = (props: EventBlockTimerProps) => {
disabled={isLockedDuration} disabled={isLockedDuration}
placeholder='End' placeholder='End'
> >
<Tooltip label='Lock end' shouldWrapChildren openDelay={0}> <Tooltip label='Lock end' openDelay={tooltipDelayMid}>
<InputRightElement <InputRightElement
className={activeEnd} className={activeEnd}
onClick={() => handleChangeStrategy(TimeStrategy.LockEnd)} onClick={() => handleChangeStrategy(TimeStrategy.LockEnd)}
@@ -101,7 +101,7 @@ const TimeInputFlow = (props: EventBlockTimerProps) => {
disabled={isLockedEnd} disabled={isLockedEnd}
placeholder='Duration' placeholder='Duration'
> >
<Tooltip label='Lock duration' shouldWrapChildren openDelay={0}> <Tooltip label='Lock duration' openDelay={tooltipDelayMid}>
<InputRightElement <InputRightElement
className={activeDuration} className={activeDuration}
onClick={() => handleChangeStrategy(TimeStrategy.LockDuration)} onClick={() => handleChangeStrategy(TimeStrategy.LockDuration)}