Skip to content

Commit 1ccaa20

Browse files
author
Mint de Wit
committed
chore: expose "Edit Piece" context menu
1 parent 1848f9e commit 1ccaa20

File tree

5 files changed

+50
-17
lines changed

5 files changed

+50
-17
lines changed

packages/webui/src/client/ui/RundownView.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ import { logger } from '../lib/logging'
163163
import { isTranslatableMessage, translateMessage } from '@sofie-automation/corelib/dist/TranslatableMessage'
164164
import { i18nTranslator } from './i18n'
165165
import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub'
166-
import { isEntirePlaylistLooping, isLoopRunning } from '../lib/RundownResolver'
166+
import { isEntirePlaylistLooping, isLoopRunning, PieceExtended } from '../lib/RundownResolver'
167167
import { useRundownAndShowStyleIdsForPlaylist } from './util/useRundownAndShowStyleIdsForPlaylist'
168168
import { RundownPlaylistClientUtil } from '../lib/rundownPlaylistUtil'
169169
import { UserPermissionsContext, UserPermissions } from './UserPermissions'
@@ -1177,6 +1177,7 @@ interface IProps {
11771177
export interface IContextMenuContext {
11781178
segment?: SegmentUi
11791179
part?: PartUi | null
1180+
piece?: PieceExtended | null
11801181

11811182
partDocumentOffset?: OffsetPosition
11821183
timeScale?: number
@@ -3184,12 +3185,7 @@ const RundownViewContent = translateWithTracker<IPropsWithReady, IState, ITracke
31843185
onQueueNextSegment={this.onQueueNextSegment}
31853186
onSetQuickLoopStart={this.onSetQuickLoopStart}
31863187
onSetQuickLoopEnd={this.onSetQuickLoopEnd}
3187-
onEditSegmentProps={(id) =>
3188-
selectionContext.clearAndSetSelection({ type: 'segment', elementId: id })
3189-
}
3190-
onEditPartProps={(id) =>
3191-
selectionContext.clearAndSetSelection({ type: 'part', elementId: id })
3192-
}
3188+
onEditProps={(selection) => selectionContext.clearAndSetSelection(selection)}
31933189
studioMode={this.props.userPermissions.studio}
31943190
enablePlayFromAnywhere={!!studio.settings.enablePlayFromAnywhere}
31953191
enableQuickLoop={!!studio.settings.enableQuickLoop}

packages/webui/src/client/ui/SegmentTimeline/Parts/SourceLayer.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, { useCallback, useState } from 'react'
22
import _ from 'underscore'
33
import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
4-
import { literal, unprotectString } from '../../../lib/tempLib'
4+
import { literal, protectString, unprotectString } from '../../../lib/tempLib'
55
import { getElementDocumentOffset, OffsetPosition } from '../../../utils/positions'
66
import { IContextMenuContext } from '../../RundownView'
77
import { IOutputLayerUi, ISourceLayerUi, PartUi, PieceUi, SegmentUi } from '../SegmentTimelineContainer'
@@ -10,6 +10,7 @@ import { ContextMenuTrigger } from '@jstarpl/react-contextmenu'
1010
import { SourceLayerItemContainer } from '../SourceLayerItemContainer'
1111
import { contextMenuHoldToDisplayTime } from '../../../lib/lib'
1212
import { UIStudio } from '@sofie-automation/meteor-lib/dist/api/studios'
13+
import { PieceInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids'
1314

1415
export interface ISourceLayerPropsBase {
1516
key: string
@@ -50,15 +51,18 @@ export function useMouseContext(props: ISourceLayerPropsBase): {
5051
onMouseDown(e: React.MouseEvent<HTMLElement>): void
5152
} {
5253
const [mousePosition, setMousePosition] = useState<OffsetPosition>({ left: 0, top: 0 })
54+
const [pieceInstanceId, setPieceInstanceId] = useState<PieceInstanceId>()
5355

5456
return {
5557
getPartContext: useCallback(() => {
5658
const partElement = document.querySelector('#' + SegmentTimelinePartElementId + props.part.instance._id)
5759
const partDocumentOffset = getElementDocumentOffset(partElement)
60+
const piece = props.part?.pieces.find((p) => p.instance._id === pieceInstanceId)
5861

5962
const ctx = literal<IContextMenuContext>({
6063
segment: props.segment,
6164
part: props.part,
65+
piece,
6266
partDocumentOffset: partDocumentOffset || undefined,
6367
timeScale: props.timeScale,
6468
mousePosition: mousePosition,
@@ -72,6 +76,13 @@ export function useMouseContext(props: ISourceLayerPropsBase): {
7276
return ctx
7377
}, [props.segment, props.part, props.timeScale, props.startsAt, props.onContextMenu, mousePosition]),
7478
onMouseDown: (e: React.MouseEvent<HTMLElement>) => {
79+
const id = (e.target as HTMLElement)?.dataset?.objId
80+
if (id) {
81+
setPieceInstanceId(protectString(id))
82+
} else {
83+
setPieceInstanceId(undefined)
84+
}
85+
7586
setMousePosition({ left: e.pageX, top: e.pageY })
7687
},
7788
}

packages/webui/src/client/ui/SegmentTimeline/SegmentContextMenu.tsx

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,20 @@ import { Translated } from '../../lib/ReactMeteorData/ReactMeteorData'
1212
import { RundownUtils } from '../../lib/rundown'
1313
import { IContextMenuContext } from '../RundownView'
1414
import { PartUi, SegmentUi } from './SegmentTimelineContainer'
15-
import { PartId, SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids'
15+
import { SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids'
1616
import { SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment'
1717
import { UserEditOperationMenuItems } from '../UserEditOperations/RenderUserEditOperations'
1818
import * as RundownResolver from '../../lib/RundownResolver'
19+
import { SelectedElement } from '../RundownView/SelectedElementsContext'
20+
import { PieceExtended } from '../../lib/RundownResolver'
1921

2022
interface IProps {
2123
onSetNext: (part: DBPart | undefined, e: any, offset?: number, take?: boolean) => void
2224
onSetNextSegment: (segmentId: SegmentId, e: any) => void
2325
onQueueNextSegment: (segmentId: SegmentId | null, e: any) => void
2426
onSetQuickLoopStart: (marker: QuickLoopMarker | null, e: any) => void
2527
onSetQuickLoopEnd: (marker: QuickLoopMarker | null, e: any) => void
26-
onEditSegmentProps: (id: SegmentId) => void
27-
onEditPartProps: (id: PartId) => void
28+
onEditProps: (element: SelectedElement) => void
2829
playlist?: DBRundownPlaylist
2930
studioMode: boolean
3031
contextMenuContext: IContextMenuContext | null
@@ -50,6 +51,7 @@ export const SegmentContextMenu = withTranslation()(
5051
)
5152
return null
5253

54+
const piece = this.getPieceFromContext()
5355
const part = this.getPartFromContext()
5456
const segment = this.getSegmentFromContext()
5557
const timecode = this.getTimePosition()
@@ -109,7 +111,9 @@ export const SegmentContextMenu = withTranslation()(
109111
{this.props.enableUserEdits && (
110112
<>
111113
<hr />
112-
<MenuItem onClick={() => this.props.onEditSegmentProps(part.instance.segmentId)}>
114+
<MenuItem
115+
onClick={() => this.props.onEditProps({ type: 'segment', elementId: part.instance.segmentId })}
116+
>
113117
<span>{t('Edit Segment Properties')}</span>
114118
</MenuItem>
115119
</>
@@ -198,12 +202,23 @@ export const SegmentContextMenu = withTranslation()(
198202
{this.props.enableUserEdits && (
199203
<>
200204
<hr />
201-
<MenuItem onClick={() => this.props.onEditSegmentProps(part.instance.segmentId)}>
205+
<MenuItem
206+
onClick={() => this.props.onEditProps({ type: 'segment', elementId: part.instance.segmentId })}
207+
>
202208
<span>{t('Edit Segment Properties')}</span>
203209
</MenuItem>
204-
<MenuItem onClick={() => this.props.onEditPartProps(part.instance.part._id)}>
210+
<MenuItem
211+
onClick={() => this.props.onEditProps({ type: 'part', elementId: part.instance.part._id })}
212+
>
205213
<span>{t('Edit Part Properties')}</span>
206214
</MenuItem>
215+
{piece && piece.instance.piece.userEditProperties && (
216+
<MenuItem
217+
onClick={() => this.props.onEditProps({ type: 'piece', elementId: piece.instance.piece._id })}
218+
>
219+
<span>{t('Edit Piece Properties')}</span>
220+
</MenuItem>
221+
)}
207222
</>
208223
)}
209224
</>
@@ -229,6 +244,14 @@ export const SegmentContextMenu = withTranslation()(
229244
}
230245
}
231246

247+
getPieceFromContext = (): PieceExtended | null => {
248+
if (this.props.contextMenuContext && this.props.contextMenuContext.piece) {
249+
return this.props.contextMenuContext.piece
250+
} else {
251+
return null
252+
}
253+
}
254+
232255
// private onSetAsNextFromHere = (part: DBPart, e) => {
233256
// const offset = this.getTimePosition()
234257
// this.props.onSetNext(part, e, offset || 0)

packages/webui/src/client/ui/SegmentTimeline/SourceLayerItem.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,10 @@ export const SourceLayerItem = withTranslation()(
687687
ref={this.setRef}
688688
onClick={this.itemClick}
689689
onDoubleClick={(e) => {
690-
if (this.props.studio?.settings.enableUserEdits) {
690+
if (
691+
this.props.studio?.settings.enableUserEdits &&
692+
!this.props.studio?.settings.allowPieceDirectPlay
693+
) {
691694
const pieceId = this.props.piece.instance.piece._id
692695
if (!selectElementContext.isSelected(pieceId)) {
693696
selectElementContext.clearAndSetSelection({ type: 'piece', elementId: pieceId })

packages/webui/src/client/ui/Settings/Studio/Generic.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,11 +381,11 @@ function StudioSettings({ studio }: { studio: DBStudio }): JSX.Element {
381381
</LabelAndOverridesForCheckbox>
382382

383383
<LabelAndOverridesForCheckbox
384-
label={t('Double click selection for properties panel')}
384+
label={t('Enable User Editing')}
385385
item={wrappedItem}
386386
itemKey={'enableUserEdits'}
387387
overrideHelper={overrideHelper}
388-
hint={t('This feature enables user edits')}
388+
hint={t('This feature enables the use of the Properties Panel and the Edit Mode')}
389389
>
390390
{(value, handleUpdate) => <CheckboxControl value={!!value} handleUpdate={handleUpdate} />}
391391
</LabelAndOverridesForCheckbox>

0 commit comments

Comments
 (0)