mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-20 14:39:06 +00:00
ae15f3cdc5
* refactor: align header columns * refactor: improve scrollbar visibility * refactor: center align table elements * refactor: make param elements stateful * fix: issue with collapsed elements not loosing value * fix: prevent search params containing multiple alias references * fix: the issue where a file disappears if it is both migrated and recovered in the same load operation (#1744) * refactor: disable group action for elements in groups * refactor: move context menu items into the event element (#1747) * feat: sheet import new features for v4 (#1730) * import milestone * fixup! import milestone * test: milestone import * add entries to group stop on new group or on group-end type * fixup! add entries to group * cleanup * add event target duration * link start if undefined * add skip import type * extract some to the excel paresing functions * tweaks to presentation * move file --------- Co-authored-by: Carlos Valente <carlosvalente@pm.me> * fix: notify runtimeStore of events bieng groupd * fix: improve authentication and stage detection in demo * chore: ship logo with project * fix: client is referenced by name * fix: prevent reflow in event editor * fix: stale render on selected event due to ref mismatch * Create/Load/Delete multiple rundowns (#1696) * refactor: restore last loaded rundown * refactor: initialise rundown in ProjectService * feat: allow switching rundowns ensure on coordination between the db object and the working object server provide list of rundowns implement switch in the UI implement delete implement new rundown button * fix: render order for floating button * refactor: appropriate names to service * refactor: rundown endpoints * refactor: save last loaded rundown ID * refactor: rundown management UI * refactor: emit refetch all on project load --------- Co-authored-by: Carlos Valente <carlosvalente@pm.me> * feat: recover single event subscription * fixup! feat: sheet import new features for v4 (#1730) * fix: prevent dropping a group inside another * fixup! refactor: move context menu items into the event element (#1747) * fix: prevent stale references to custom fields * fix: propagate updates to all rundowns * refactor: client rundown metadata (#1728) * generate metadata in the hook * move test * ensure there is always a last element * use for-loop * update metadata in useEfect * fully extract metadata generation * use direct assignment * cleanup --------- Co-authored-by: Carlos Valente <carlosvalente@pm.me> * refactor: small imporvement and tests for coerce functions (#1752) * refactor: small imporvement and tests for coerce functions add test `coerceString` add test `coerceBoolean` add test `coerceColour` * remove old todo * fix: consistent quick add behaviour * refactor: create flat rundown with metadata * fix: show add buttons on top * feat: allow editing milestones * refactor: style tweaks to rundown elements refactor: milestones are full width refactor: cuesheet header alignment fix: editor styling in cuesheet * refactor: virtualise table * refactor: improve overscan (#1758) * bump version to 4.0.0-alpha.5 --------- Co-authored-by: Alex Christoffer Rasmussen <ac@omnivox.dk>
191 lines
6.5 KiB
TypeScript
191 lines
6.5 KiB
TypeScript
import { ReactNode, use } from 'react';
|
|
import { IoChevronDown, IoOptions, IoSettingsOutline } from 'react-icons/io5';
|
|
import { Popover } from '@base-ui-components/react/popover';
|
|
import { Toggle } from '@base-ui-components/react/toggle';
|
|
import { ToggleGroup } from '@base-ui-components/react/toggle-group';
|
|
import { Toolbar } from '@base-ui-components/react/toolbar';
|
|
import { useSessionStorage } from '@mantine/hooks';
|
|
import type { Column } from '@tanstack/react-table';
|
|
|
|
import Button from '../../../../common/components/buttons/Button';
|
|
import Checkbox from '../../../../common/components/checkbox/Checkbox';
|
|
import * as Editor from '../../../../common/components/editor-utils/EditorUtils';
|
|
import PopoverContents from '../../../../common/components/popover/Popover';
|
|
import { PresetContext } from '../../../../common/context/PresetContext';
|
|
import type { ExtendedEntry } from '../../../../common/utils/rundownMetadata';
|
|
import { cx } from '../../../../common/utils/styleUtils';
|
|
import { AppMode, sessionKeys } from '../../../../ontimeConfig';
|
|
import { usePersistedCuesheetOptions } from '../../cuesheet.options';
|
|
import { useCuesheetPermissions } from '../../useTablePermissions';
|
|
|
|
import CuesheetShareModal from './CuesheetShareModal';
|
|
|
|
import style from './CuesheetTableSettings.module.scss';
|
|
|
|
interface CuesheetTableSettingsProps {
|
|
columns: Column<ExtendedEntry, unknown>[];
|
|
handleResetResizing: () => void;
|
|
handleResetReordering: () => void;
|
|
handleClearToggles: () => void;
|
|
}
|
|
|
|
export default function CuesheetTableSettings({
|
|
columns,
|
|
handleResetResizing,
|
|
handleResetReordering,
|
|
handleClearToggles,
|
|
}: CuesheetTableSettingsProps) {
|
|
const canShare = useCuesheetPermissions((state) => state.canShare);
|
|
const preset = use(PresetContext);
|
|
|
|
const [cuesheetMode, setCuesheetMode] = useSessionStorage({
|
|
key: preset ? `${preset.alias}${sessionKeys.cuesheetMode}` : sessionKeys.cuesheetMode,
|
|
defaultValue: preset ? AppMode.Run : AppMode.Edit,
|
|
});
|
|
|
|
const toggleCuesheetMode = (mode: AppMode[]) => {
|
|
// we need to stop user from deselecting a mode
|
|
const newValue = mode.at(0);
|
|
if (!newValue) return;
|
|
setCuesheetMode(newValue);
|
|
};
|
|
|
|
return (
|
|
<Toolbar.Root className={style.tableSettings}>
|
|
<ViewSettings />
|
|
<ColumnSettings
|
|
columns={columns}
|
|
handleResetResizing={handleResetResizing}
|
|
handleResetReordering={handleResetReordering}
|
|
handleClearToggles={handleClearToggles}
|
|
/>
|
|
<ToggleGroup value={[cuesheetMode]} onValueChange={toggleCuesheetMode} className={cx([style.group, style.apart])}>
|
|
<Toolbar.Button render={<Toggle />} value={AppMode.Run} className={style.radioButton}>
|
|
Run
|
|
</Toolbar.Button>
|
|
<Toolbar.Button render={<Toggle />} value={AppMode.Edit} className={style.radioButton}>
|
|
Edit
|
|
</Toolbar.Button>
|
|
</ToggleGroup>
|
|
|
|
{canShare && (
|
|
<>
|
|
<Editor.Separator orientation='vertical' />
|
|
<CuesheetShareModal />
|
|
</>
|
|
)}
|
|
</Toolbar.Root>
|
|
);
|
|
}
|
|
|
|
function ViewSettings() {
|
|
const options = usePersistedCuesheetOptions();
|
|
|
|
return (
|
|
<Popover.Root>
|
|
<Popover.Trigger
|
|
render={
|
|
<Toolbar.Button
|
|
render={
|
|
<Button variant='ghosted-white'>
|
|
<IoSettingsOutline /> Settings
|
|
<IoChevronDown />
|
|
</Button>
|
|
}
|
|
/>
|
|
}
|
|
/>
|
|
|
|
<PopoverContents align='start' className={style.inline}>
|
|
<div className={style.column}>
|
|
<Editor.Label className={style.sectionTitle}>Element visibility</Editor.Label>
|
|
<Editor.Label className={style.option}>
|
|
<Checkbox
|
|
defaultChecked={options.hideTableSeconds}
|
|
onCheckedChange={(checked) => options.setOption('hideTableSeconds', checked)}
|
|
/>
|
|
Hide seconds in table
|
|
</Editor.Label>
|
|
<Editor.Label className={style.option}>
|
|
<Checkbox
|
|
defaultChecked={options.hideIndexColumn}
|
|
onCheckedChange={(checked) => options.setOption('hideIndexColumn', checked)}
|
|
/>
|
|
Hide index column
|
|
</Editor.Label>
|
|
</div>
|
|
|
|
<div className={style.column}>
|
|
<Editor.Label className={style.sectionTitle}>Table Behaviour</Editor.Label>
|
|
<Editor.Label className={style.option}>
|
|
<Checkbox
|
|
defaultChecked={options.showDelayedTimes}
|
|
onCheckedChange={(checked) => options.setOption('showDelayedTimes', checked)}
|
|
/>
|
|
Show delayed times
|
|
</Editor.Label>
|
|
<Editor.Label className={style.option}>
|
|
<Checkbox
|
|
defaultChecked={options.hideDelays}
|
|
onCheckedChange={(checked) => options.setOption('hideDelays', checked)}
|
|
/>
|
|
Hide delay entries
|
|
</Editor.Label>
|
|
</div>
|
|
</PopoverContents>
|
|
</Popover.Root>
|
|
);
|
|
}
|
|
|
|
function ColumnSettings({
|
|
columns,
|
|
handleResetResizing,
|
|
handleResetReordering,
|
|
handleClearToggles,
|
|
}: CuesheetTableSettingsProps) {
|
|
return (
|
|
<Popover.Root>
|
|
<Popover.Trigger
|
|
render={
|
|
<Toolbar.Button
|
|
render={
|
|
<Button variant='ghosted-white'>
|
|
<IoOptions /> View
|
|
<IoChevronDown />
|
|
</Button>
|
|
}
|
|
/>
|
|
}
|
|
/>
|
|
<PopoverContents align='start' className={style.inline}>
|
|
<div className={style.column}>
|
|
<Editor.Label className={style.sectionTitle}>Column visibility</Editor.Label>
|
|
{columns.map((column) => {
|
|
const columnHeader = column.columnDef.header;
|
|
const visible = column.getIsVisible();
|
|
return (
|
|
<Editor.Label key={`${column.id}-${visible}`} className={style.option}>
|
|
<Checkbox defaultChecked={visible} onCheckedChange={column.toggleVisibility} />
|
|
{columnHeader as ReactNode}
|
|
</Editor.Label>
|
|
);
|
|
})}
|
|
</div>
|
|
<Editor.Separator orientation='vertical' />
|
|
<div className={style.column}>
|
|
<Editor.Label className={style.sectionTitle}>Reset Options</Editor.Label>
|
|
<Button size='small' fluid onClick={handleClearToggles}>
|
|
Show All
|
|
</Button>
|
|
<Button size='small' fluid onClick={handleResetResizing}>
|
|
Reset Resizing
|
|
</Button>
|
|
<Button size='small' fluid onClick={handleResetReordering}>
|
|
Reset Reordering
|
|
</Button>
|
|
</div>
|
|
</PopoverContents>
|
|
</Popover.Root>
|
|
);
|
|
}
|