Skip to content

Commit a671baa

Browse files
author
Mint de Wit
committed
chore: support translations for properties panel
1 parent ea2fb4a commit a671baa

File tree

10 files changed

+119
-29
lines changed

10 files changed

+119
-29
lines changed

packages/blueprints-integration/src/documents/part.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ export interface IBlueprintMutatablePart<TPrivateData = unknown, TPublicData = u
9393
* Properties that are user editable from the properties panel in the Sofie UI, if the user saves changes to these
9494
* it will trigger a user edit operation of type DefaultUserOperationEditProperties
9595
*/
96-
userEditProperties?: Readonly<UserEditingProperties>
96+
userEditProperties?: UserEditingProperties
9797
}
9898

9999
export interface HackPartMediaObjectSubscription {

packages/blueprints-integration/src/userEditing.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,10 @@ export enum UserEditingType {
7474
}
7575

7676
export interface UserEditingSourceLayer {
77-
sourceLayerLabel: string // translate? take from type?
77+
sourceLayerLabel: string
7878
sourceLayerType: SourceLayerType
7979
schema: JSONBlob<JSONSchema>
80+
defaultValue?: Record<string, any>
8081
}
8182

8283
export enum UserEditingButtonType {
@@ -124,7 +125,6 @@ export interface UserEditingProperties {
124125
/**
125126
* A list of id's of operations to be exposed on the properties panel as buttons. These operations
126127
* must be available on the element
127-
*
128128
*/
129129
operations?: UserEditingDefinitionAction[]
130130
}

packages/corelib/src/dataModel/Part.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ITranslatableMessage } from '../TranslatableMessage'
33
import { PartId, RundownId, SegmentId } from './Ids'
44
import { PartNote } from './Notes'
55
import { ReadonlyDeep } from 'type-fest'
6-
import { CoreUserEditingDefinition, UserEditingProperties } from './UserEditingDefinitions'
6+
import { CoreUserEditingDefinition, CoreUserEditingProperties } from './UserEditingDefinitions'
77

88
export interface PartInvalidReason {
99
message: ITranslatableMessage
@@ -46,7 +46,7 @@ export interface DBPart extends Omit<IBlueprintPart, 'userEditOperations'> {
4646
* Properties that are user editable from the properties panel in the Sofie UI, if the user saves changes to these
4747
* it will trigger a user edit operation of type DefaultUserOperationEditProperties
4848
*/
49-
userEditProperties?: UserEditingProperties
49+
userEditProperties?: CoreUserEditingProperties
5050
}
5151

5252
export function isPartPlayable(part: Pick<ReadonlyDeep<DBPart>, 'invalid' | 'floated'>): boolean {

packages/corelib/src/dataModel/Segment.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { SegmentDisplayMode, SegmentTimingInfo } from '@sofie-automation/blueprints-integration'
22
import { SegmentId, RundownId } from './Ids'
33
import { SegmentNote } from './Notes'
4-
import { CoreUserEditingDefinition, UserEditingProperties } from './UserEditingDefinitions'
4+
import { CoreUserEditingDefinition, CoreUserEditingProperties } from './UserEditingDefinitions'
55

66
export enum SegmentOrphanedReason {
77
/** Segment is deleted from the NRCS but we still need it */
@@ -56,5 +56,5 @@ export interface DBSegment {
5656
* Properties that are user editable from the properties panel in the Sofie UI, if the user saves changes to these
5757
* it will trigger a user edit operation of type DefaultUserOperationEditProperties
5858
*/
59-
userEditProperties?: UserEditingProperties
59+
userEditProperties?: CoreUserEditingProperties
6060
}

packages/corelib/src/dataModel/UserEditingDefinitions.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export interface CoreUserEditingDefinitionSourceLayerForm {
6767
}
6868
}
6969

70-
export interface UserEditingProperties {
70+
export interface CoreUserEditingProperties {
7171
/**
7272
* These properties are dependent on the (primary) piece type, the user will get the option
7373
* to select the type of piece (from the SourceLayerTypes i.e. Camera or Split etc.) and then
@@ -106,5 +106,8 @@ export interface UserEditingProperties {
106106
*
107107
* note - perhaps these should have their own full definitions?
108108
*/
109-
operations?: string[]
109+
operations?: CoreUserEditingDefinitionAction[]
110+
111+
/** Translation namespaces to use when rendering this form */
112+
translationNamespaces: string[]
110113
}

packages/documentation/docs/for-developers/json-config-schema.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,12 @@ If an integer property, whether to treat it as zero-based
4343
### `ui:displayType`
4444

4545
Override the presentation with a special mode.
46-
Currently only valid for string properties. Valid values are 'json'.
46+
47+
Currently only valid for:
48+
49+
- object properties. Valid values are 'json'.
50+
- string properties. Valid values are 'base64-image'.
51+
- boolean properties. Valid values are 'switch'.
4752

4853
### `tsEnumNames`
4954

packages/job-worker/src/blueprints/context/lib.ts

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
CoreUserEditingDefinitionAction,
1515
CoreUserEditingDefinitionForm,
1616
CoreUserEditingDefinitionSourceLayerForm,
17-
UserEditingProperties,
17+
CoreUserEditingProperties,
1818
} from '@sofie-automation/corelib/dist/dataModel/UserEditingDefinitions'
1919
import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment'
2020
import { assertNever, clone, Complete, literal, omit } from '@sofie-automation/corelib/dist/lib'
@@ -59,6 +59,7 @@ import {
5959
UserEditingDefinitionAction,
6060
UserEditingDefinitionForm,
6161
UserEditingDefinitionSourceLayerForm,
62+
UserEditingProperties,
6263
UserEditingType,
6364
} from '@sofie-automation/blueprints-integration/dist/userEditing'
6465
import type { PlayoutMutatablePart } from '../../playout/model/PlayoutPartInstanceModel'
@@ -283,7 +284,7 @@ export function convertPartToBlueprints(part: ReadonlyDeep<DBPart>): IBlueprintP
283284
part.hackListenToMediaObjectUpdates
284285
),
285286
userEditOperations: translateUserEditsToBlueprint(part.userEditOperations),
286-
userEditProperties: clone<UserEditingProperties | undefined>(part.userEditProperties),
287+
userEditProperties: translateUserEditPropertiesToBlueprint(part.userEditProperties),
287288
}
288289

289290
return obj
@@ -352,7 +353,7 @@ export function convertSegmentToBlueprints(segment: ReadonlyDeep<DBSegment>): IB
352353
showShelf: segment.showShelf,
353354
segmentTiming: segment.segmentTiming,
354355
userEditOperations: translateUserEditsToBlueprint(segment.userEditOperations),
355-
userEditProperties: clone<UserEditingProperties | undefined>(segment.userEditProperties),
356+
userEditProperties: translateUserEditPropertiesToBlueprint(segment.userEditProperties),
356357
}
357358

358359
return obj
@@ -544,6 +545,30 @@ function translateUserEditsToBlueprint(
544545
)
545546
}
546547

548+
function translateUserEditPropertiesToBlueprint(
549+
props: ReadonlyDeep<CoreUserEditingProperties> | undefined
550+
): UserEditingProperties | undefined {
551+
if (!props) return undefined
552+
553+
return {
554+
globalProperties: props.globalProperties,
555+
pieceTypeProperties: props.pieceTypeProperties,
556+
557+
operations: props.operations?.map(
558+
(userEdit) =>
559+
({
560+
type: UserEditingType.ACTION,
561+
id: userEdit.id,
562+
label: omit(userEdit.label, 'namespaces'),
563+
svgIcon: userEdit.svgIcon,
564+
svgIconInactive: userEdit.svgIconInactive,
565+
isActive: userEdit.isActive,
566+
buttonType: userEdit.buttonType,
567+
} satisfies Complete<UserEditingDefinitionAction>)
568+
),
569+
}
570+
}
571+
547572
export function translateUserEditsFromBlueprint(
548573
userEdits: UserEditingDefinition[] | undefined,
549574
blueprintIds: BlueprintId[]
@@ -589,6 +614,33 @@ export function translateUserEditsFromBlueprint(
589614
)
590615
}
591616

617+
export function translateUserEditPropertiesFromBlueprint(
618+
props: UserEditingProperties | undefined,
619+
blueprintIds: BlueprintId[]
620+
): CoreUserEditingProperties | undefined {
621+
if (!props) return undefined
622+
623+
return {
624+
globalProperties: clone(props.globalProperties),
625+
pieceTypeProperties: clone(props.pieceTypeProperties),
626+
627+
operations: props.operations?.map(
628+
(userEdit) =>
629+
({
630+
type: UserEditingType.ACTION,
631+
id: userEdit.id,
632+
label: wrapTranslatableMessageFromBlueprints(userEdit.label, blueprintIds),
633+
svgIcon: userEdit.svgIcon,
634+
svgIconInactive: userEdit.svgIconInactive,
635+
isActive: userEdit.isActive,
636+
buttonType: userEdit.buttonType,
637+
} satisfies Complete<UserEditingDefinitionAction>)
638+
),
639+
640+
translationNamespaces: blueprintIds.map((id) => `blueprint_${id}`),
641+
}
642+
}
643+
592644
export function convertPartialBlueprintMutablePartToCore(
593645
updatePart: Partial<IBlueprintMutatablePart>,
594646
blueprintId: BlueprintId
@@ -606,5 +658,13 @@ export function convertPartialBlueprintMutablePartToCore(
606658
delete playoutUpdatePart.userEditOperations
607659
}
608660

661+
if ('userEditProperties' in updatePart) {
662+
playoutUpdatePart.userEditProperties = translateUserEditPropertiesFromBlueprint(updatePart.userEditProperties, [
663+
blueprintId,
664+
])
665+
} else {
666+
delete playoutUpdatePart.userEditOperations
667+
}
668+
609669
return playoutUpdatePart
610670
}

packages/job-worker/src/ingest/generationSegment.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { IngestReplacePartType, IngestSegmentModel } from './model/IngestSegment
2424
import { ReadonlyDeep } from 'type-fest'
2525
import { Rundown } from '@sofie-automation/corelib/dist/dataModel/Rundown'
2626
import { WrappedShowStyleBlueprint } from '../blueprints/cache'
27-
import { translateUserEditsFromBlueprint } from '../blueprints/context/lib'
27+
import { translateUserEditPropertiesFromBlueprint, translateUserEditsFromBlueprint } from '../blueprints/context/lib'
2828

2929
async function getWatchedPackagesHelper(
3030
context: JobContext,
@@ -293,6 +293,9 @@ function updateModelWithGeneratedSegment(
293293
userEditOperations: translateUserEditsFromBlueprint(blueprintSegment.segment.userEditOperations, [
294294
blueprintId,
295295
]),
296+
userEditProperties: translateUserEditPropertiesFromBlueprint(blueprintSegment.segment.userEditProperties, [
297+
blueprintId,
298+
]),
296299
})
297300
)
298301

@@ -376,6 +379,9 @@ function updateModelWithGeneratedPart(
376379
}
377380
: undefined,
378381
userEditOperations: translateUserEditsFromBlueprint(blueprintPart.part.userEditOperations, [blueprintId]),
382+
userEditProperties: translateUserEditPropertiesFromBlueprint(blueprintPart.part.userEditProperties, [
383+
blueprintId,
384+
]),
379385
})
380386

381387
// Update pieces

packages/webui/src/client/styles/propertiesPanel.scss

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,9 @@
9696
}
9797
> .propertiespanel-pop-up_close {
9898
height: 1em;
99-
cursor: pointer;
10099
margin-left: 1em;
100+
background-color: unset;
101+
border: none;
101102
}
102103
}
103104

0 commit comments

Comments
 (0)