Skip to content

Commit

Permalink
Feature: iFrame widget (#2261)
Browse files Browse the repository at this point in the history
---------

Co-authored-by: shamoon <[email protected]>
  • Loading branch information
Reiss-Cashmore and shamoon authored Oct 31, 2023
1 parent 5512d05 commit ebd384c
Show file tree
Hide file tree
Showing 7 changed files with 111 additions and 0 deletions.
35 changes: 35 additions & 0 deletions docs/widgets/services/iframe.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
title: iFrame
Description: Add a custom iFrame Widget
---

A basic iFrame widget to show external content, see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) for more details about some of the options.

!!! warning

Requests made via the iFrame widget are inherently **not proxied** as they are made from the browser itself.

## Basic Example

```yaml
widget:
type: iframe
name: myIframe
src: http://example.com
```
## Full Example
```yaml
widget:
type: iframe
name: myIframe
src: http://example.com
classes: h-60 sm:h-60 md:h-60 lg:h-60 xl:h-60 2xl:h-72 # optional, use tailwind height classes, see https://tailwindcss.com/docs/height
referrerPolicy: same-origin # optional, no default
allowPolicy: autoplay fullscreen gamepad # optional, no default
allowFullscreen: false # optional, default: true
loadingStrategy: eager # optional, default: eager
allowScrolling: no # optional, default: yes
refreshInterval: 2000 # optional, no default
```
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ nav:
- widgets/services/healthchecks.md
- widgets/services/homeassistant.md
- widgets/services/homebridge.md
- widgets/services/iframe.md
- widgets/services/immich.md
- widgets/services/jackett.md
- widgets/services/jdownloader.md
Expand Down
17 changes: 17 additions & 0 deletions src/utils/config/service-helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,13 @@ export function cleanServiceGroups(groups) {
firstDayInWeek,
view,
maxEvents,
src, // iframe widget
classes,
referrerPolicy,
allowPolicy,
allowFullscreen,
loadingStrategy,
allowScrolling,
} = cleanedService.widget;

let fieldsList = fields;
Expand Down Expand Up @@ -413,6 +420,16 @@ export function cleanServiceGroups(groups) {
if (app) cleanedService.widget.app = app;
if (podSelector) cleanedService.widget.podSelector = podSelector;
}
if (type === "iframe") {
if (src) cleanedService.widget.src = src;
if (classes) cleanedService.widget.classes = classes;
if (referrerPolicy) cleanedService.widget.referrerPolicy = referrerPolicy;
if (allowPolicy) cleanedService.widget.allowPolicy = allowPolicy;
if (allowFullscreen) cleanedService.widget.allowFullscreen = allowFullscreen;
if (loadingStrategy) cleanedService.widget.loadingStrategy = loadingStrategy;
if (allowScrolling) cleanedService.widget.allowScrolling = allowScrolling;
if (refreshInterval) cleanedService.widget.refreshInterval = refreshInterval;
}
if (["opnsense", "pfsense"].includes(type)) {
if (wan) cleanedService.widget.wan = wan;
}
Expand Down
1 change: 1 addition & 0 deletions src/widgets/components.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ const components = {
channelsdvrserver: dynamic(() => import("./channelsdvrserver/component")),
cloudflared: dynamic(() => import("./cloudflared/component")),
coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
iframe: dynamic(() => import("./iframe/component")),
customapi: dynamic(() => import("./customapi/component")),
deluge: dynamic(() => import("./deluge/component")),
diskstation: dynamic(() => import("./diskstation/component")),
Expand Down
50 changes: 50 additions & 0 deletions src/widgets/iframe/component.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { useState, useEffect } from "react";
import classNames from "classnames";

import Container from "components/services/widget/container";

export default function Component({ service }) {
const [refreshTimer, setRefreshTimer] = useState(0);

const { widget } = service;

useEffect(() => {
if (widget?.refreshInterval) {
setInterval(
() => setRefreshTimer(refreshTimer + 1),
widget?.refreshInterval < 1000 ? 1000 : widget?.refreshInterval,
);
}
}, [refreshTimer, widget?.refreshInterval]);

const scrollingDisableStyle = widget?.allowScrolling === "no" ? { pointerEvents: "none", overflow: "hidden" } : {};

const classes = widget?.classes || "h-60 sm:h-60 md:h-60 lg:h-60 xl:h-60 2xl:h-72";

return (
<Container service={service}>
<div
className={classNames(
"bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-col items-center justify-center text-center",
"service-block",
)}
>
<iframe
src={widget?.src}
key={`${widget?.name}-${refreshTimer}`}
name={widget?.name}
title={widget?.name}
allow={widget?.allowPolicy}
allowFullScreen={widget?.allowfullscreen}
referrerPolicy={widget?.referrerPolicy}
loading={widget?.loadingStrategy}
scrolling={widget?.allowScrolling}
style={{
scrollingDisableStyle,
}}
className={`rounded w-full ${classes}`}
/>
</div>
</Container>
);
}
3 changes: 3 additions & 0 deletions src/widgets/iframe/widget.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
const widget = {};

export default widget;
4 changes: 4 additions & 0 deletions tailwind.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,5 +76,9 @@ module.exports = {
"dark:bg-white",
"bg-orange-400",
"dark:bg-orange-400",
{
pattern: /h-([0-96])/,
variants: ["sm", "md", "lg", "xl", "2xl"],
},
],
};

0 comments on commit ebd384c

Please sign in to comment.