mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-13 03:13:47 +00:00
feat: operator view
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
@use '../../../../src/theme/v2Styles' as *;
|
||||
@use '../../../../src/theme/ontimeColours' as *;
|
||||
@import '../Operator.module.scss';
|
||||
|
||||
.event {
|
||||
@include block();
|
||||
background-color: $gray-1300;
|
||||
|
||||
&.subscribed {
|
||||
background-color: $gray-1250;
|
||||
}
|
||||
|
||||
&.running {
|
||||
background-color: $red-700;
|
||||
}
|
||||
}
|
||||
|
||||
.titles {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
|
||||
.title {
|
||||
font-size: 1.5rem;
|
||||
letter-spacing: 0.02px;
|
||||
}
|
||||
|
||||
.cue {
|
||||
font-size: 1rem;
|
||||
background-color: $gray-1050; // to override inline
|
||||
padding: 0 0.5rem;
|
||||
text-align: center;
|
||||
border-radius: $component-border-radius-sm;
|
||||
}
|
||||
}
|
||||
|
||||
.times {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
font-size: calc(1rem - 1px);
|
||||
|
||||
.runtime {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.25rem;
|
||||
}
|
||||
}
|
||||
|
||||
.fields {
|
||||
font-size: 1.25rem;
|
||||
font-weight: 500;
|
||||
color: $orange-500;
|
||||
|
||||
letter-spacing: 0.02px;
|
||||
height: fit-content;
|
||||
|
||||
transition-property: height;
|
||||
transition-duration: $transition-time-feedback;
|
||||
}
|
||||
|
||||
// tablet
|
||||
@media (min-width: $min-tablet) {
|
||||
.times {
|
||||
font-size: 1rem;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
import { OntimeEvent, UserFields } from 'ontime-types';
|
||||
|
||||
import DelayIndicator from '../../../common/components/delay-indicator/DelayIndicator';
|
||||
import { useTimer } from '../../../common/hooks/useSocket';
|
||||
import { cx, getAccessibleColour } from '../../../common/utils/styleUtils';
|
||||
import { formatTime } from '../../../common/utils/time';
|
||||
|
||||
import style from './OperatorEvent.module.scss';
|
||||
|
||||
interface OperatorEventProps {
|
||||
data: OntimeEvent;
|
||||
cue: string;
|
||||
isSelected: boolean;
|
||||
subscribed: keyof UserFields | null;
|
||||
showSeconds: boolean;
|
||||
}
|
||||
|
||||
// extract this to contain re-renders
|
||||
function RollingTime() {
|
||||
const timer = useTimer();
|
||||
return <>{formatTime(timer.current, { showSeconds: true, format: 'hh:mm:ss' })}</>;
|
||||
}
|
||||
|
||||
export default function OperatorEvent(props: OperatorEventProps) {
|
||||
const { data, cue, isSelected, subscribed, showSeconds } = props;
|
||||
|
||||
const start = formatTime(data.timeStart, { showSeconds });
|
||||
const end = formatTime(data.timeEnd, { showSeconds });
|
||||
|
||||
const cueColours = data.colour && getAccessibleColour(data.colour);
|
||||
const subscribedData = (subscribed ? data?.[subscribed] : undefined) || '';
|
||||
|
||||
const operatorClasses = cx([
|
||||
style.event,
|
||||
isSelected ? style.running : null,
|
||||
subscribedData ? style.subscribed : null,
|
||||
]);
|
||||
|
||||
return (
|
||||
<div className={operatorClasses}>
|
||||
<div className={style.titles}>
|
||||
<span className={style.title}>
|
||||
{data.title} - {data.subtitle}
|
||||
</span>
|
||||
<span className={style.cue} style={{ ...cueColours }}>
|
||||
{cue}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div className={style.times}>
|
||||
<span className={style.schedule}>
|
||||
{start} - {end}
|
||||
</span>
|
||||
<span className={style.runtime}>
|
||||
<DelayIndicator delayValue={data.delay} />
|
||||
{isSelected ? <RollingTime /> : formatTime(data.duration, { showSeconds: true, format: 'hh:mm:ss' })}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div className={style.fields}>{subscribedData}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user