Skip to content

Commit e60ac7a

Browse files
authored
Add iframe widgets (#22)
1 parent 2d8d815 commit e60ac7a

6 files changed

Lines changed: 55 additions & 7 deletions

File tree

packages/admin/src/types/kiosk.types.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { ReactElement } from 'react';
22
import {
33
TbAlignLeft,
44
TbBike,
5+
TbBrowserPlus,
56
TbBus,
67
TbCalendarEvent,
78
TbCloudStorm,
@@ -79,7 +80,8 @@ export type WidgetName =
7980
| 'bike'
8081
| 'weathercam'
8182
| 'map'
82-
| 'cmschEvents';
83+
| 'cmschEvents'
84+
| 'iframe';
8385

8486
export const WidgetDisplay: Record<WidgetName, { name: string; icon: ReactElement }> = {
8587
weather: { name: 'Időjárás', icon: TbSun({ size: 50 }) },
@@ -92,6 +94,7 @@ export const WidgetDisplay: Record<WidgetName, { name: string; icon: ReactElemen
9294
weathercam: { name: 'Időjárás kamera', icon: TbCloudStorm({ size: 50 }) },
9395
map: { name: 'Térkép', icon: TbMap({ size: 50 }) },
9496
cmschEvents: { name: 'CMSch események', icon: TbCalendarEvent({ size: 50 }) },
97+
iframe: { name: 'Iframe', icon: TbBrowserPlus({ size: 50 }) },
9598
};
9699

97100
type WidgetConfigField = {
@@ -120,6 +123,7 @@ export const WidgetConfigFields: Record<WidgetName, WidgetConfigField[]> = {
120123
{ name: 'radius', type: 'number', label: 'Hatósugár' },
121124
],
122125
cmschEvents: [{ name: 'baseUrl', type: 'text', label: 'Szerver Hoszt' }],
126+
iframe: [{ name: 'url', type: 'text', label: 'Iframe URL címe' }],
123127
};
124128

125129
export type WidgetConfigBase = {
@@ -177,6 +181,11 @@ export interface CMSchEventsConfig extends WidgetConfigBase {
177181
baseUrl: string;
178182
}
179183

184+
export interface IframeConfig extends WidgetConfigBase {
185+
name: 'iframe';
186+
url: string;
187+
}
188+
180189
export type GridSettings = {
181190
column: Axis;
182191
row: Axis;
@@ -199,4 +208,5 @@ export type WidgetConfig =
199208
| BikeConfig
200209
| WeatherCamConfig
201210
| MapConfig
202-
| CMSchEventsConfig;
211+
| CMSchEventsConfig
212+
| IframeConfig;

packages/backend/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Use the official Node.js LTS (Long Term Support) image as the base image
2-
FROM node:20-alpine
2+
FROM node:24-alpine
33

44
# Set the working directory inside the container
55
WORKDIR /usr/src/app

packages/backend/src/types/kiosk.types.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ export type WidgetName =
6363
| 'bike'
6464
| 'weathercam'
6565
| 'map'
66-
| 'cmschEvents';
66+
| 'cmschEvents'
67+
| 'iframe';
6768

6869
export type WidgetConfigBase = {
6970
name: WidgetName;
@@ -121,6 +122,11 @@ export interface CMSchEventsConfig extends WidgetConfigBase {
121122
baseUrl: string;
122123
}
123124

125+
export interface IframeConfig extends WidgetConfigBase {
126+
name: 'iframe';
127+
url: string;
128+
}
129+
124130
export type GridSettings = {
125131
column: Axis;
126132
row: Axis;
@@ -141,7 +147,8 @@ export type WidgetConfig =
141147
| BikeConfig
142148
| WeatherCamConfig
143149
| MapConfig
144-
| CMSchEventsConfig;
150+
| CMSchEventsConfig
151+
| IframeConfig;
145152

146153
export enum KioskRoles {
147154
VISITOR,
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import styled from 'styled-components';
2+
3+
import { Widget } from '@/layout/Widget';
4+
import { IframeConfig } from '@/types/widget.type.ts';
5+
import { useWidgetConfig } from '@/utils/useWidgetConfig.ts';
6+
7+
export function IframeWidget() {
8+
const config = useWidgetConfig<IframeConfig>('iframe');
9+
return (
10+
<Widget grid={config.grid} style={{ padding: 0 }}>
11+
<StyledIframe src={config.url} title='Iframe widget' />
12+
</Widget>
13+
);
14+
}
15+
16+
const StyledIframe = styled.iframe`
17+
width: 100%;
18+
height: 100%;
19+
border: none;
20+
border-radius: inherit;
21+
`;

packages/client/src/layout/WidgetDistributor.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { CmschEventsWidget } from '@/components/widgets/CmschEventsWidget.tsx';
2+
import { IframeWidget } from '@/components/widgets/IframeWidget.tsx';
23

34
import { BikeWidget } from '../components/widgets/BikeWidget';
45
import { Departures } from '../components/widgets/departures/Departures';
@@ -37,6 +38,8 @@ export function WidgetDistributor({ config }: WidgetDistributorProps) {
3738
return <MapWidget />;
3839
case 'cmschEvents':
3940
return <CmschEventsWidget />;
41+
case 'iframe':
42+
return <IframeWidget />;
4043
default:
4144
return null;
4245
}

packages/client/src/types/widget.type.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ export type WidgetName =
88
| 'bike'
99
| 'weathercam'
1010
| 'map'
11-
| 'cmschEvents';
11+
| 'cmschEvents'
12+
| 'iframe';
1213

1314
export type WidgetConfigBase = {
1415
name: WidgetName;
@@ -65,6 +66,11 @@ export interface CMSchEventsConfig extends WidgetConfigBase {
6566
baseUrl: string;
6667
}
6768

69+
export interface IframeConfig extends WidgetConfigBase {
70+
name: 'iframe';
71+
url: string;
72+
}
73+
6874
export type GridSettings = {
6975
column: Axis;
7076
row: Axis;
@@ -85,4 +91,5 @@ export type WidgetConfig =
8591
| BikeConfig
8692
| WeatherCamConfig
8793
| MapConfig
88-
| CMSchEventsConfig;
94+
| CMSchEventsConfig
95+
| IframeConfig;

0 commit comments

Comments
 (0)