diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ba593523..1edf79cc 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -6,6 +6,7 @@ ==================== STOP ==== ⚠️ Before opening this pull request please review the guidelines in the checklist below. + If this PR does not meet those guidelines it will not be accepted, and everyone will be sad. --> @@ -14,9 +15,6 @@ If this PR does not meet those guidelines it will not be accepted, and everyone @@ -30,13 +28,13 @@ What type of change does your PR introduce to Homepage? - [ ] New service widget - [ ] Bug fix (non-breaking change which fixes an issue) -- [ ] New feature (non-breaking change which adds functionality) +- [ ] New feature or enhancement (non-breaking change which adds functionality) - [ ] Documentation only - [ ] Other (please explain) ## Checklist: - [ ] If applicable, I have added corresponding documentation changes. -- [ ] If applicable, I have reviewed the [feature](https://gethomepage.dev/more/development/#new-feature-guidelines) and / or [service widget guidelines](https://gethomepage.dev/more/development/#service-widget-guidelines). +- [ ] If applicable, I have reviewed the [feature / enhancement](https://gethomepage.dev/more/development/#new-feature-guidelines) and / or [service widget guidelines](https://gethomepage.dev/more/development/#service-widget-guidelines). - [ ] I have checked that all code style checks pass using [pre-commit hooks](https://gethomepage.dev/more/development/#code-formatting-with-pre-commit-hooks) and [linting checks](https://gethomepage.dev/more/development/#code-linting). - [ ] If applicable, I have tested my code for new features & regressions on both mobile & desktop devices, using the latest version of major browsers. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0cc5fad0..0d85c731 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -63,7 +63,7 @@ The homepage team appreciates all effort and interest from the community in fili - Issues, pull requests and discussions that are closed will be locked after 30 days of inactivity. - Discussions with a marked answer will be automatically closed. - Discussions in the 'General' or 'Support' categories will be closed after 180 days of inactivity. -- Feature requests that do not meet the following thresholds will be closed: 5 "up-votes" after 180 days of inactivity or 10 "up-votes" after 365 days. +- Feature requests that do not meet the following thresholds will be closed: 10 "up-votes" after 180 days of inactivity or 20 "up-votes" after 365 days. In all cases, threads can be re-opened by project maintainers and, of course, users can always create a new discussion for related concerns. Finally, remember that all information remains searchable and 'closed' feature requests can still serve as inspiration for new features. diff --git a/docs/configs/services.md b/docs/configs/services.md index 6ef25c39..b1883043 100644 --- a/docs/configs/services.md +++ b/docs/configs/services.md @@ -134,7 +134,7 @@ Services may have descriptions, ## Icons -Services may have an icon attached to them, you can use icons from [Dashboard Icons](https://github.com/walkxcode/dashboard-icons) automatically, by passing the name of the icon, with, or without `.png` or with `.svg` to use the svg version. +Services may have an icon attached to them, you can use icons from [Dashboard Icons](https://github.com/homarr-labs/dashboard-icons) automatically, by passing the name of the icon, with, or without `.png`, `.webp` or `.svg` to specify the desired version. You can also specify prefixed icons from: diff --git a/docs/installation/source.md b/docs/installation/source.md index 42e5fe91..573711a8 100644 --- a/docs/installation/source.md +++ b/docs/installation/source.md @@ -23,3 +23,5 @@ Finally, run the server: ```bash pnpm start ``` + +When updating homepage versions you will need to re-build the static files i.e. repeat the process above. diff --git a/docs/widgets/authoring/getting-started.md b/docs/widgets/authoring/getting-started.md index d3aa106f..8e16b915 100644 --- a/docs/widgets/authoring/getting-started.md +++ b/docs/widgets/authoring/getting-started.md @@ -46,9 +46,9 @@ See the [pre-commit documentation](https://pre-commit.com/#install) to get start In general, homepage is meant to be a dashboard for 'self-hosted' services and we believe it is a small way we can help showcase this kind of software. While exceptions are made, mostly when there is no viable self-hosted / open-source alternative, we ask that any widgets, etc. are developed primarily for a self-hosted tool. -## New Feature Guidelines +## New Feature or Enhancement Guidelines {#new-feature-guidelines} -- New features should be linked to an existing feature request. The purpose of this requirement is to avoid the addition (and maintenance) of features that might only benefit a small number of users. +- New features or enhancements, **no matter how small**, must be linked to an existing feature request. The purpose of this requirement is to avoid the addition (and maintenance) of features that might only benefit a small number of users. - If you have ideas for a larger feature you may want to open a discussion first. ## Service Widget Guidelines diff --git a/docs/widgets/services/customapi.md b/docs/widgets/services/customapi.md index c392d942..0deb8294 100644 --- a/docs/widgets/services/customapi.md +++ b/docs/widgets/services/customapi.md @@ -62,10 +62,12 @@ widget: format: size ``` -Supported formats for the values are `text`, `number`, `float`, `percent`, `bytes`, `bitrate`, `size`, `date` and `relativeDate`. +Supported formats for the values are `text`, `number`, `float`, `percent`, `duration`, `bytes`, `bitrate`, `size`, `date` and `relativeDate`. The `dateStyle` and `timeStyle` options of the `date` format are passed directly to [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) and the `style` and `numeric` options of `relativeDate` are passed to [Intl.RelativeTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/RelativeTimeFormat). +The `duration` format expects the duration to be specified in seconds. The `scale` transformation tool can be used if a conversion is required. + The `size` format will return the length of the array or string, or the number of keys in an object. This is then formatted as `number`. ## Example diff --git a/docs/widgets/services/gluetun.md b/docs/widgets/services/gluetun.md index 44775b15..1cc68c9a 100644 --- a/docs/widgets/services/gluetun.md +++ b/docs/widgets/services/gluetun.md @@ -11,7 +11,7 @@ Learn more about [Gluetun](https://github.com/qdm12/gluetun). Allowed fields: `["public_ip", "region", "country"]`. -To setup authentication, follow [the official Gluetun documentation](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md#authentication). +To setup authentication, follow [the official Gluetun documentation](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md#authentication). Note that to use the api key method, you must add the route `GET /v1/publicip/ip` to the `routes` array in your Gluetun config.toml. ```yaml widget: diff --git a/src/components/errorboundry.jsx b/src/components/errorboundry.jsx index bad4b552..1b2a3b1e 100644 --- a/src/components/errorboundry.jsx +++ b/src/components/errorboundry.jsx @@ -14,8 +14,10 @@ export default class ErrorBoundary extends React.Component { }); // You can also log error messages to an error reporting service here - // eslint-disable-next-line no-console - console.error(error, errorInfo); + if (error || errorInfo) { + // eslint-disable-next-line no-console + console.error("component error: %s, info: %s", error, errorInfo); + } } render() { diff --git a/src/components/resolvedicon.jsx b/src/components/resolvedicon.jsx index de29c0cd..4858f3d5 100644 --- a/src/components/resolvedicon.jsx +++ b/src/components/resolvedicon.jsx @@ -101,7 +101,26 @@ export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "log const iconName = icon.replace(".svg", ""); return ( {alt} + ); + } + + if (icon.endsWith(".webp")) { + const iconName = icon.replace(".webp", ""); + return ( + log
   const iconName = icon.replace( 0) { + nestedServices = [...nestedServices, ...group.groups.map(getServices).flat()]; + } + return nestedServices; + } + + return [...services.map(getServices).flat()]; +} + function Home({ initialSettings }) { const { i18n } = useTranslation(); const { theme, setTheme } = useContext(ThemeContext); @@ -182,10 +194,9 @@ function Home({ initialSettings }) { const { data: bookmarks } = useSWR("/api/bookmarks"); const { data: widgets } = useSWR("/api/widgets"); - const servicesAndBookmarks = [ - ...services.map((sg) => sg.services).flat(), - ...bookmarks.map((bg) => bg.bookmarks).flat(), - ].filter((i) => i?.href); + const servicesAndBookmarks = [...bookmarks.map((bg) => bg.bookmarks).flat(), ...getAllServices(services)].filter( + (i) => i?.href, + ); useEffect(() => { if (settings.language) { @@ -459,7 +470,7 @@ function Home({ initialSettings }) { } export default function Wrapper({ initialSettings, fallback }) { - const { theme } = useContext(ThemeContext); + const { themeContext } = useContext(ThemeContext); const wrappedStyle = {}; let backgroundBlur = false; let backgroundSaturate = false; @@ -490,9 +501,9 @@ export default function Wrapper({ initialSettings, fallback }) { id="page_wrapper" className={classNames( "relative", - theme && theme, + initialSettings.theme && initialSettings.theme, initialSettings.color && `theme-${initialSettings.color}`, - theme === "dark" ? "scheme-dark" : "scheme-light", + themeContext === "dark" ? "scheme-dark" : "scheme-light", )} >