import { useCallback } from 'react'; import { MaybeNumber, OntimeBlock } from 'ontime-types'; import { millisToString } from 'ontime-utils'; import * as Editor from '../../../common/components/editor-utils/EditorUtils'; import SwatchSelect from '../../../common/components/input/colour-input/SwatchSelect'; import AppLink from '../../../common/components/link/app-link/AppLink'; import { useEntryActions } from '../../../common/hooks/useEntryAction'; import useCustomFields from '../../../common/hooks-query/useCustomFields'; import { getOffsetState } from '../../../common/utils/offset'; import { cx, enDash, timerPlaceholder } from '../../../common/utils/styleUtils'; import TextLikeInput from '../../../views/cuesheet/cuesheet-table/cuesheet-table-elements/TextLikeInput'; import EntryEditorCustomFields from './composite/EventEditorCustomFields'; import EventTextArea from './composite/EventTextArea'; import EntryEditorTextInput from './composite/EventTextInput'; import TargetDurationInput from './composite/TargetDurationInput'; import style from './EntryEditor.module.scss'; // title + colour + custom field labels export type BlockEditorUpdateTextFields = 'title' | 'colour' | string; export type BlockEditorUpdateMaybeNumberFields = 'targetDuration'; interface BlockEditorProps { block: OntimeBlock; } export default function BlockEditor({ block }: BlockEditorProps) { const { data: customFields } = useCustomFields(); const { updateEntry } = useEntryActions(); const handleSubmit = useCallback( (field: BlockEditorUpdateTextFields | BlockEditorUpdateMaybeNumberFields, value: string | MaybeNumber) => { // Handle custom fields if (typeof field === 'string' && field.startsWith('custom-')) { const fieldLabel = field.split('custom-')[1]; updateEntry({ id: block.id, custom: { [fieldLabel]: value as string } }); return; } if (field === 'targetDuration') { return updateEntry({ id: block.id, targetDuration: value as MaybeNumber }); } // all other strings are text fields return updateEntry({ id: block.id, [field]: value as string }); }, [block.id, updateEntry], ); const isEditor = window.location.pathname.includes('editor'); const planOffset = typeof block.targetDuration !== 'number' ? null : block.duration - block.targetDuration; const planOffsetLabel = planOffset !== null ? getOffsetState(planOffset * -1) : null; return (
Group schedule
{ // TODO: format with user time settings } First event start {millisToString(block.timeStart, { fallback: timerPlaceholder })}
Last event end {millisToString(block.timeEnd, { fallback: timerPlaceholder })}
Scheduled duration {millisToString(block.duration, { fallback: enDash })}
Plan offset {planOffset !== null && planOffset > 0 ? '+' : ''} {millisToString(planOffset, { fallback: enDash })}
Block data
Colour
Custom Fields {isEditor && Manage Custom Fields}
); }