import { MaybeNumber, OntimeGroup } from 'ontime-types'; import { millisToString } from 'ontime-utils'; import { useCallback } from 'react'; 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 { useEntryActionsContext } from '../../../common/context/EntryActionsContext'; import useCustomFields from '../../../common/hooks-query/useCustomFields'; import { getOffsetState } from '../../../common/utils/offset'; import { cx, enDash } from '../../../common/utils/styleUtils'; import { formatTime } from '../../../common/utils/time'; 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 GroupEditorUpdateTextFields = 'title' | 'colour' | string; export type GroupEditorUpdateMaybeNumberFields = 'targetDuration'; interface GroupEditorProps { group: OntimeGroup; } export default function GroupEditor({ group }: GroupEditorProps) { const { data: customFields } = useCustomFields(); const { updateEntry } = useEntryActionsContext(); const handleSubmit = useCallback( (field: GroupEditorUpdateTextFields | GroupEditorUpdateMaybeNumberFields, value: string | MaybeNumber) => { // Handle custom fields if (typeof field === 'string' && field.startsWith('custom-')) { const fieldLabel = field.split('custom-')[1]; updateEntry({ id: group.id, custom: { [fieldLabel]: value as string } }); return; } if (field === 'targetDuration') { return updateEntry({ id: group.id, targetDuration: value as MaybeNumber }); } // all other strings are text fields return updateEntry({ id: group.id, [field]: value as string }); }, [group.id, updateEntry], ); const isEditor = window.location.pathname.includes('editor'); const planOffset = group.targetDuration === null ? null : group.duration - group.targetDuration; const planOffsetLabel = planOffset !== null ? getOffsetState(planOffset) : null; return (
Group schedule
First event start {formatTime(group.timeStart)}
Last event end {formatTime(group.timeEnd)}
Scheduled duration {millisToString(group.duration, { fallback: enDash })}
Plan offset {planOffset !== null && planOffset > 0 ? '+' : ''} {millisToString(planOffset, { fallback: enDash })}
Group data
Colour
Custom Fields {isEditor && Manage Custom Fields}
); }