Skip to content

Commit 8a84862

Browse files
authored
Merge pull request #338 from os2display/feature/align-with-develop-2026-01-05
Align release/3.0.0 branch with changes to develop.
2 parents 5e19d05 + f0067d6 commit 8a84862

26 files changed

Lines changed: 2509 additions & 970 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ All notable changes to this project will be documented in this file.
2626
- Refactored screen layout commands.
2727
- Moved list components (search and checkboxes) around.
2828
- Replaced lodash functions with native ones.
29+
- Aligned with v. 2.6.0.
2930

3031
### NB! Prior to 3.x the project was split into separate repositories
3132

Taskfile.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,4 +227,9 @@ tasks:
227227
fixtures:copy-assets:
228228
desc: "Copy the folder from fixtures/public/fixtures to public/fixtures. Rerun if fixtures are changed."
229229
cmds:
230-
- task compose -- exec phpfpm cp -r fixtures/public/fixtures public/fixtures
230+
- task compose -- exec phpfpm cp -r fixtures/public/fixtures public/
231+
232+
assets:build:
233+
desc: "Build the assets."
234+
cmds:
235+
- task compose -- run --rm node npm run build

assets/admin/components/feed-sources/feed-source-form.jsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import EventDatabaseApiFeedType from "./templates/event-database-feed-type";
1313
import ColiboFeedType from "./templates/colibo-feed-type";
1414
import StickyFooter from "../util/sticky-footer";
1515
import EventDatabaseApiV2FeedType from "./templates/event-database-v2-feed-type";
16+
import BrndFeedType from "./templates/brnd-feed-type.jsx";
1617

1718
/**
1819
* The feed-source form component.
@@ -124,6 +125,14 @@ function FeedSourceForm({
124125
feedSourceId={feedSource["@id"]}
125126
/>
126127
)}
128+
{feedSource?.feedType === "App\\Feed\\BrndFeedType" && (
129+
<BrndFeedType
130+
handleInput={handleSecretInput}
131+
formStateObject={feedSource.secrets}
132+
mode={mode}
133+
feedSourceId={feedSource["@id"]}
134+
/>
135+
)}
127136
{feedSource?.feedType ===
128137
"App\\Feed\\EventDatabaseApiFeedType" && (
129138
<EventDatabaseApiFeedType
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import React from "react";
2+
import { useTranslation } from "react-i18next";
3+
import FormInput from "../../util/forms/form-input";
4+
5+
const BrndFeedType = ({ handleInput, formStateObject, mode }) => {
6+
const { t } = useTranslation("common", {
7+
keyPrefix: "brnd-feed-type",
8+
});
9+
10+
return (
11+
<>
12+
<FormInput
13+
name="api_base_uri"
14+
type="text"
15+
label={t("api-base-uri")}
16+
className="mb-2"
17+
onChange={handleInput}
18+
placeholder={
19+
mode === "PUT" ? t("redacted-value-input-placeholder") : ""
20+
}
21+
value={formStateObject?.api_base_uri}
22+
/>
23+
24+
<FormInput
25+
name="company_id"
26+
type="text"
27+
className="mb-2"
28+
label={t("company-id")}
29+
onChange={handleInput}
30+
placeholder={
31+
mode === "PUT" ? t("redacted-value-input-placeholder") : ""
32+
}
33+
value={formStateObject?.company_id}
34+
/>
35+
36+
<FormInput
37+
name="api_auth_key"
38+
type="text"
39+
label={t("api-auth-key")}
40+
onChange={handleInput}
41+
placeholder={
42+
mode === "PUT" ? t("redacted-value-input-placeholder") : ""
43+
}
44+
value={formStateObject?.api_auth_key}
45+
/>
46+
</>
47+
);
48+
};
49+
50+
export default BrndFeedType;

assets/admin/translations/da/common.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,9 @@
285285
"colibo-feed-type": {
286286
"title": "Colibo"
287287
},
288+
"brnd-feed-type": {
289+
"title": "BRND"
290+
},
288291
"dynamic-fields": {
289292
"event-database-api-feed-type": {
290293
"title": "Eventdatabase API",
@@ -1158,6 +1161,14 @@
11581161
"save-before-recipients-can-be-set": "Bemærk! Datakilden skal gemmes før der kan tilkobles tilladte modtagergrupper. Gem og åbn datakilden igen.",
11591162
"allowed-recipients-help": "Det er kun disse modtagergrupper, der vil være tilgængelige, når man opretter et slide, der bruger datakilden."
11601163
},
1164+
"brnd-feed-type": {
1165+
"title": "BRND feed",
1166+
"api-base-uri": "API Base URI",
1167+
"company-id": "Company ID",
1168+
"api-auth-key": "API Auth Key",
1169+
"values-info": "Værdierne Company ID og API Auth Key udleveres af BRND. Ret henvendelse til BRND support.",
1170+
"redacted-value-input-placeholder": "Skjult værdi"
1171+
},
11611172
"event-database-api-v2-feed-type": {
11621173
"title": "Event databasen v.2",
11631174
"host": "Host",

assets/shared/templates/brnd.json

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
{
2+
"title": "BRND sportcenter dagsprogram",
3+
"id": "01K8TNT13XVCYYPXBJBBJVFENS",
4+
"options": {},
5+
"adminForm": [
6+
{
7+
"key": "brnd-form-1",
8+
"input": "header",
9+
"text": "Skabelon: BRND",
10+
"name": "header1",
11+
"formGroupClasses": "h4 mb-3"
12+
},
13+
{
14+
"key": "brnd-form-2",
15+
"input": "header-h3",
16+
"text": "Opsæt feed",
17+
"name": "header2",
18+
"formGroupClasses": "h5 mb-3"
19+
},
20+
{
21+
"key": "brnd-form-3",
22+
"input": "feed",
23+
"text": "Opsæt feed",
24+
"name": "feed",
25+
"supportedFeedOutputType": "brnd-booking",
26+
"formGroupClasses": "mb-3"
27+
},
28+
{
29+
"key": "brnd-form-4",
30+
"input": "header-h3",
31+
"text": "Konfigurér slide",
32+
"name": "header2",
33+
"formGroupClasses": "h5 mb-3"
34+
},
35+
{
36+
"key": "calendar-form-layout",
37+
"input": "select",
38+
"name": "layout",
39+
"label": "Vælg layout",
40+
"required": true,
41+
"formGroupClasses": "col-md-6 mb-3",
42+
"options": [
43+
{
44+
"key": "layout1",
45+
"title": "Sportcenter Dagsprogram",
46+
"value": "sportcenter-today"
47+
}
48+
]
49+
},
50+
{
51+
"key": "brnd-form-form-14",
52+
"input": "select",
53+
"required": true,
54+
"label": "Tekststørrelse",
55+
"formGroupClasses": "col-md-6 mb-3",
56+
"options": [
57+
{
58+
"key": "fontsize1",
59+
"title": "xs",
60+
"value": "font-size-xs"
61+
},
62+
{
63+
"key": "fontsize2",
64+
"title": "s",
65+
"value": "font-size-s"
66+
},
67+
{
68+
"key": "fontsize3",
69+
"title": "m",
70+
"value": "font-size-m"
71+
},
72+
{
73+
"key": "fontsize4",
74+
"title": "l",
75+
"value": "font-size-lg"
76+
},
77+
{
78+
"key": "fontsize5",
79+
"title": "xl",
80+
"value": "font-size-xl"
81+
}
82+
],
83+
"name": "fontSize"
84+
},
85+
{
86+
"key": "brnd-form-title",
87+
"input": "input",
88+
"name": "title",
89+
"type": "text",
90+
"label": "Overskrift",
91+
"helpText": "Her kan du skrive overskrift.",
92+
"formGroupClasses": "col-md-6"
93+
},
94+
{
95+
"key": "brnd-form-image",
96+
"multipleImages": false,
97+
"input": "image",
98+
"name": "image",
99+
"label": "Baggrundsbillede"
100+
},
101+
{
102+
"key": "form-media-contain",
103+
"input": "checkbox",
104+
"name": "mediaContain",
105+
"label": "Deaktivér billedbeskæring",
106+
"helpText": "Billedet vil blive vist ubeskåret med tomme områder omkring"
107+
}
108+
]
109+
}

assets/shared/templates/brnd.jsx

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import React, { useEffect, Fragment, useState } from "react";
2+
import dayjs from "dayjs";
3+
import localizedFormat from "dayjs/plugin/localizedFormat";
4+
import { FormattedMessage, IntlProvider } from "react-intl";
5+
import BaseSlideExecution from "../slide-utils/base-slide-execution";
6+
import da from "./brnd/lang/da.json";
7+
import {
8+
getFirstMediaUrlFromField,
9+
ThemeStyles,
10+
} from "../slide-utils/slide-util";
11+
import BrndSportcenterToday from "./brnd/brnd-sportcenter-today";
12+
import GlobalStyles from "../slide-utils/GlobalStyles";
13+
import "./brnd/brnd.scss";
14+
import templateConfig from "./brnd.json";
15+
16+
function id() {
17+
return templateConfig.id;
18+
}
19+
20+
function config() {
21+
return templateConfig;
22+
}
23+
24+
function renderSlide(slide, run, slideDone) {
25+
return (
26+
<Brnd
27+
slide={slide}
28+
run={run}
29+
slideDone={slideDone}
30+
content={slide.content}
31+
executionId={slide.executionId}
32+
/>
33+
);
34+
}
35+
36+
/**
37+
* Brnd component.
38+
*
39+
* @param {object} props Props.
40+
* @param {object} props.slide The slide.
41+
* @param {object} props.content The slide content.
42+
* @param {string} props.run Whether or not the slide should start running.
43+
* @param {Function} props.slideDone Function to invoke when the slide is done playing.
44+
* @param {string} props.executionId Unique id for the instance.
45+
* @returns {JSX.Element} The component.
46+
*/
47+
function Brnd({ slide, content, run, slideDone, executionId }) {
48+
const [translations, setTranslations] = useState();
49+
50+
const {
51+
layout = "sportcenter-today",
52+
duration = 15000,
53+
fontSize,
54+
resourceUnavailableText,
55+
} = content;
56+
const { feedData = [] } = slide;
57+
58+
const classes = ["template-brnd", fontSize];
59+
const rootStyle = {};
60+
61+
const imageUrl = getFirstMediaUrlFromField(slide.mediaData, content.image);
62+
63+
if (imageUrl) {
64+
rootStyle["--bg-image"] = `url("${imageUrl}")`;
65+
}
66+
67+
/** Setup slide run function. */
68+
const slideExecution = new BaseSlideExecution(slide, slideDone);
69+
useEffect(() => {
70+
if (run) {
71+
slideExecution.start(duration);
72+
}
73+
74+
return function cleanup() {
75+
slideExecution.stop();
76+
};
77+
}, [run]);
78+
79+
/** Imports language strings, sets localized formats. */
80+
useEffect(() => {
81+
dayjs.extend(localizedFormat);
82+
83+
setTranslations(da);
84+
}, []);
85+
86+
const getTitle = (eventTitle) => {
87+
if (!eventTitle || eventTitle === "") {
88+
if (resourceUnavailableText) {
89+
return resourceUnavailableText;
90+
}
91+
return <FormattedMessage id="unavailable" defaultMessage="Unavailable" />;
92+
}
93+
return eventTitle;
94+
};
95+
96+
return (
97+
<>
98+
<IntlProvider messages={translations} locale="da" defaultLocale="da">
99+
{layout === "sportcenter-today" && (
100+
<BrndSportcenterToday
101+
bookings={feedData.bookings}
102+
content={content}
103+
templateClasses={classes}
104+
templateRootStyle={rootStyle}
105+
getTitle={getTitle}
106+
/>
107+
)}
108+
</IntlProvider>
109+
<ThemeStyles id={executionId} css={slide?.theme?.cssStyles} />
110+
<GlobalStyles />
111+
</>
112+
);
113+
}
114+
115+
export default { id, config, renderSlide };

0 commit comments

Comments
 (0)