diff --git a/apps/client/src/common/components/view-params-editor/viewParams.utils.ts b/apps/client/src/common/components/view-params-editor/viewParams.utils.ts
index 93789451d..746e93f9c 100644
--- a/apps/client/src/common/components/view-params-editor/viewParams.utils.ts
+++ b/apps/client/src/common/components/view-params-editor/viewParams.utils.ts
@@ -1,4 +1,4 @@
-import type { CustomFields } from 'ontime-types';
+import type { CustomFields, ProjectData } from 'ontime-types';
import type { SelectOption } from '../select/Select';
@@ -53,6 +53,18 @@ export function makeCustomFieldSelectOptions(customFields: CustomFields, filterI
return options;
}
+/**
+ * Creates data for a select element that displays project custom data
+ */
+export function makeProjectDataOptions(projectData: ProjectData): SelectOption[] {
+ return projectData.custom.map((entry, index) => {
+ return {
+ value: `${index}-${entry.title}`,
+ label: entry.title,
+ };
+ });
+}
+
type ViewParamsObj = { [key: string]: string | FormDataEntryValue };
/**
diff --git a/apps/client/src/views/backstage/Backstage.scss b/apps/client/src/views/backstage/Backstage.scss
index f47645359..1aaeb30bb 100644
--- a/apps/client/src/views/backstage/Backstage.scss
+++ b/apps/client/src/views/backstage/Backstage.scss
@@ -149,10 +149,27 @@
.info {
grid-area: info;
display: flex;
- gap: max(1vw, 16px);
- align-self: flex-end;
+ flex-direction: column;
+ gap: $view-element-gap;
+ align-self: end;
overflow: hidden;
- align-items: end;
+ }
+
+ .info__column {
+ display: flex;
+ flex-direction: column;
+ }
+
+ .info-card {
+ display: flex;
+ gap: $view-element-gap;
+
+ &__label {
+ font-size: $timer-label-size;
+ color: var(--label-color-override, $viewer-label-color);
+ font-weight: 600;
+ text-transform: uppercase;
+ }
&__message {
font-size: $base-font-size;
@@ -162,11 +179,16 @@
flex: 1;
}
- .qr {
+ &__qr {
padding: 0.5rem;
background-color: $ui-white;
border-radius: 2px;
}
+
+ &__img {
+ padding: 0.5rem;
+ border-radius: 2px;
+ }
}
}
diff --git a/apps/client/src/views/backstage/Backstage.tsx b/apps/client/src/views/backstage/Backstage.tsx
index f1f7c2df6..f1cb64d1f 100644
--- a/apps/client/src/views/backstage/Backstage.tsx
+++ b/apps/client/src/views/backstage/Backstage.tsx
@@ -48,7 +48,7 @@ export default function Backstage({
settings,
}: BackstageProps) {
const { getLocalizedString } = useTranslation();
- const { secondarySource } = useBackstageOptions();
+ const { secondarySource, extraInfo } = useBackstageOptions();
const [blinkClass, setBlinkClass] = useState(false);
const { height: screenHeight } = useViewportSize();
@@ -104,8 +104,8 @@ export default function Backstage({
// gather option data
const defaultFormat = getDefaultFormat(settings?.timeFormat);
const backstageOptions = useMemo(
- () => getBackstageOptions(defaultFormat, customFields),
- [defaultFormat, customFields],
+ () => getBackstageOptions(defaultFormat, customFields, general),
+ [defaultFormat, customFields, general],
);
return (
@@ -180,8 +180,44 @@ export default function Backstage({
{showSchedule &&