mirror of https://github.com/Lissy93/dashy.git
Merge branch 'master' of github.com:Lissy93/dashy into FEATURE/minimal-view
This commit is contained in:
commit
5290be9214
|
@ -1,5 +1,16 @@
|
|||
# Changelog
|
||||
|
||||
## ✨ 1.5.8 - Multi-Tasking Support in Workspace View [PR #146](https://github.com/Lissy93/dashy/pull/146)
|
||||
- Adds option to keep launched apps open in the background, to reduce friction when switching between websites, Re: #144
|
||||
- This can be enabled by setting `appConfig.enableMultiTasking: true`
|
||||
- Note that having many apps opened simultaneously, will have an impact on performance
|
||||
|
||||
## ✨ 1.5.7 - Adds Support for Material Design Icons [PR #141](https://github.com/Lissy93/dashy/pull/141)
|
||||
- Enables user to use any icon from [materialdesignicons.com](https://dev.materialdesignicons.com/icons), Re: #139
|
||||
- Also adds support for [simpleicons.org](https://simpleicons.org/)
|
||||
- Assets only loaded when needed
|
||||
- Adds docs for using MDI icons
|
||||
|
||||
## ⚡️ 1.5.6 - Refactor + Couple of small things [PR #135](https://github.com/Lissy93/dashy/pull/135)
|
||||
- The main Dockerfile now uses yarn.lock instead of package-lock.json
|
||||
- Adds a check to verify password is not empty in cloud backup screen
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
# Test and build the Docker container after a release
|
||||
# Then push it to GH container registry if all checks pass
|
||||
name: Build & Publish Docker Image
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
env:
|
||||
REGISTRY: ghcr.io
|
||||
IMAGE_NAME: ${{ github.repository }}
|
||||
jobs:
|
||||
build-and-push-image:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
steps:
|
||||
# Get the code
|
||||
- name: Checkout repository 🛎️
|
||||
uses: actions/checkout@v2
|
||||
# Log into ghcr.io
|
||||
- name: Log in to the Container registry 🔑
|
||||
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
# Get release version, for Docker tag
|
||||
- name: Extract metadata (tags, labels) for Docker 🗂️
|
||||
id: meta
|
||||
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
# Build the container, and push if succesful
|
||||
- name: Build and push Docker image ⚒️
|
||||
uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
|
@ -6,23 +6,7 @@ on:
|
|||
schedule:
|
||||
- cron: '0 1 * * 0' # At 01:00 on Sunday.
|
||||
jobs:
|
||||
# Job #1 - Update the Credits page
|
||||
insert-credits:
|
||||
runs-on: ubuntu-latest
|
||||
name: Inserts contributors into credits.md
|
||||
steps:
|
||||
- name: Contribute List
|
||||
uses: akhilmhdh/contributors-readme-action@v2.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
|
||||
with:
|
||||
image_size: 80
|
||||
readme_path: docs/credits.md
|
||||
columns_per_row: 6
|
||||
commit_message: ':yellow_heart: Updates contributors list'
|
||||
committer_username: liss-bot
|
||||
committer_email: liss-bot@d0h.co
|
||||
# Job #2 - Generate an embedded SVG asset, showing all contributors
|
||||
# Job #1 - Generate an embedded SVG asset, showing all contributors
|
||||
generate-contributors:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
@ -37,4 +21,32 @@ jobs:
|
|||
userNameHeight: 20
|
||||
svgWidth: 830
|
||||
commitMessage: ':blue_heart: Updates contributor SVG'
|
||||
# Job #2 - Update the Credits page
|
||||
insert-credits:
|
||||
runs-on: ubuntu-latest
|
||||
name: Inserts contributors into credits.md
|
||||
steps:
|
||||
- name: Contribute List - Credits Page
|
||||
uses: akhilmhdh/contributors-readme-action@v2.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
|
||||
with:
|
||||
image_size: 80
|
||||
readme_path: docs/credits.md
|
||||
columns_per_row: 6
|
||||
commit_message: ':purple_heart: Updates contributors list'
|
||||
committer_username: liss-bot
|
||||
committer_email: liss-bot@d0h.co
|
||||
- name: Sponsors List - Readme
|
||||
uses: akhilmhdh/contributors-readme-action@v2.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
|
||||
with:
|
||||
image_size: 80
|
||||
readme_path: README.md
|
||||
columns_per_row: 6
|
||||
commit_message: ':yellow_heart: Updates sponsors table'
|
||||
committer_username: liss-bot
|
||||
committer_email: liss-bot@d0h.co
|
||||
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
FROM node:lts-alpine
|
||||
FROM node:lts-alpine3.14
|
||||
|
||||
# Define some ENV Vars
|
||||
ENV PORT=80 \
|
||||
|
|
44
README.md
44
README.md
|
@ -83,6 +83,7 @@
|
|||
#### Spin up your own Demo
|
||||
- 1-Click Deploy: [![One-Click Deploy with PWD](https://img.shields.io/badge/Play--with--Docker-Deploy-2496ed?style=flat-square&logo=docker)](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml)
|
||||
- Or on your own machine: `docker run -p 8080:80 lissy93/dashy`
|
||||
- See the [Quick Start Guide](./docs/quick-start.md) for getting Dashy up and running in under 5 minutes
|
||||
|
||||
#### Recording
|
||||
<p align="center">
|
||||
|
@ -102,7 +103,7 @@ Are using Dashy? Want to share your dashboard here too - [Submit your Screenshot
|
|||
|
||||
> For full setup instructions, see: [**Deployment**](./docs/deployment.md)
|
||||
|
||||
#### Deploying from Docker Hub 🐳
|
||||
### Deploying from Docker Hub 🐳
|
||||
|
||||
You will need [Docker](https://docs.docker.com/get-docker/) installed on your system
|
||||
|
||||
|
@ -122,13 +123,14 @@ docker run -d \
|
|||
```
|
||||
|
||||
If you prefer to use Docker Compose, [here is an example](./docs/deployment.md#using-docker-compose).
|
||||
You can also build the Docker container from source, by cloning the repo, cd'ing into it and running `docker build .` and `docker compose up`.
|
||||
|
||||
[![Dashy on Docker Hub](https://dockeri.co/image/lissy93/dashy)](https://hub.docker.com/r/lissy93/dashy)
|
||||
|
||||
> Once you've got Dashy running, you can take a look at [App Management Docs](./docs/management.md), for info on using health checks, provisioning assets, configuring web servers, securing your app, logs, performance and more.
|
||||
|
||||
#### Deploying from Source 🚀
|
||||
### Deploying from Source 🚀
|
||||
|
||||
You will need both [git](https://git-scm.com/downloads) and the latest or LTS version of [Node.js](https://nodejs.org/) installed on your system
|
||||
You will need [git](https://git-scm.com/downloads), the latest or LTS version of [Node.js](https://nodejs.org/) and (optionally) [Yarn](https://yarnpkg.com/) installed on your system.
|
||||
|
||||
- Get Code: `git clone git@github.com:Lissy93/dashy.git` and `cd dashy`
|
||||
- Configuration: Fill in you're settings in `./public/conf.yml`
|
||||
|
@ -138,7 +140,7 @@ You will need both [git](https://git-scm.com/downloads) and the latest or LTS ve
|
|||
|
||||
> See docs [Full list of Dashy's commands](./docs/management.md#basic-commands)
|
||||
|
||||
#### Deploy to the Cloud ☁️
|
||||
### Deploy to the Cloud ☁️
|
||||
|
||||
Dashy supports 1-Click deployments on several popular cloud platforms. To spin up a new instance, just click a link below:
|
||||
- [<img src="https://i.ibb.co/ZxtzrP3/netlify.png" width="18"/> Deploy to Netlify](https://app.netlify.com/start/deploy?repository=https://github.com/lissy93/dashy)
|
||||
|
@ -158,11 +160,11 @@ Dashy supports 1-Click deployments on several popular cloud platforms. To spin u
|
|||
|
||||
> For full configuration documentation, see: [**Configuring**](./docs/configuring.md)
|
||||
|
||||
All of Dashy's configuration is specified in a single [YAML](https://yaml.org/) file, located at `./public/conf.yml` (or `./app/public/conf.yml` for Docker). You can find a complete list of available options in th [Configuring Docs](/docs/configuring.md). If you're using Docker, you'll probably want to pass this file in as a Docker volume (e.g. `-v /root/my-local-conf.yml:/app/public/conf.yml`).
|
||||
All of Dashy's configuration is specified in a single [YAML](https://yaml.org/) file, located at `./public/conf.yml`. You can find a complete list of available options in th [Configuring Docs](/docs/configuring.md). If you're using Docker, you'll probably want to pass this file in as a Docker volume (e.g. `-v /root/my-local-conf.yml:/app/public/conf.yml`).
|
||||
|
||||
The config can also be edited directly through the UI, with changes written to your conf.yml file. After making any modifications the app does need to be rebuilt, this should happen automatically but you can also trigger a build with `yarn build`, `docker exec -it [container-id] yarn build`, or directly through the UI.
|
||||
The config can also be edited directly through the UI, with changes written to your conf.yml file. After making any modifications the app needs to be rebuilt, which will happen automatically or can be trigger with `yarn build` or directly through the UI.
|
||||
|
||||
You can check that your config is correct and valid, by running: `yarn validate-config`. This will validate that your configuration matches Dashy's [schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.json).
|
||||
You can check that your config is valid and matches Dashy's [schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.json), by running: `yarn validate-config`.
|
||||
|
||||
Finally, you may find these [example config](https://gist.github.com/Lissy93/000f712a5ce98f212817d20bc16bab10) helpful for getting you started.
|
||||
|
||||
|
@ -207,7 +209,8 @@ Both sections and items can have an icon associated with them, and defined under
|
|||
- **Generative**: Setting `icon: generative`, will generate a unique for a given service, based on it's URL or IP
|
||||
- **Emoji**: Use an emoji as a tile icon, by putting the emoji's code as the icon attribute. Emojis can be specified either as emojis (`🚀`), unicode (`'U+1F680'`) or shortcode (`':rocket:'`).
|
||||
- **URL**: You can also pass in a URL to an icon asset, hosted either locally or using any CDN service. E.g. `icon: https://i.ibb.co/710B3Yc/space-invader-x256.png`.
|
||||
- **Local Image**: To use a local image, store it in `./public/item-icons/` (or create a volume in Docker: `-v /local/image/directory:/app/public/item-icons/`) , and reference it by name and extension - e.g. set `icon: image.png` to use `./public/item-icon/image.png`. You can also use sub-folders here if you have a lot of icons, to keep them organized.
|
||||
- **Local Image**: To use a local image, store it in `./public/item-icons/` (or create a volume in Docker: `-v /local/image/directory:/app/public/item-icons/`) , and reference it by name and extension - e.g. set `icon: image.png` to use `./public/item-icon/image.png`. You can also use sub-folders here.
|
||||
- **Material Design Icons**: You can also use any icon from [materialdesignicons.com](https://dev.materialdesignicons.com/icons) by setting the icon to `mdi-[icon-name]`.
|
||||
|
||||
**[⬆️ Back to Top](#dashy)**
|
||||
|
||||
|
@ -352,6 +355,7 @@ Dashy has the ability to support multiple languages and locales. When available,
|
|||
- 🇩🇪 **German**: `de` - Contributed by **[@Niklashere](https://github.com/Niklashere)**
|
||||
- 🇳🇱 **Dutch**: `nl` - Contributed by **[@evroon](https://github.com/evroon)**
|
||||
- 🇲🇫 **French**: `fr` - Contributed by **[@EVOTk](https://github.com/EVOTk)**
|
||||
- 🇸🇮 **Slovenian**: `sl` - Contributed by **[@UrekD](https://github.com/UrekD)**
|
||||
|
||||
#### Add your Language
|
||||
It would be awesome for open source projects to be available to everyone, without language being a barrier to entry for non-native English speakers. If you have a few minutes to sapir, you're help with translating it would be very much appreciated.
|
||||
|
@ -439,6 +443,23 @@ Thank you so much to everyone who has helped with Dashy so far, every contributi
|
|||
|
||||
Huge thanks to the sponsors helping to support Dashy's development!
|
||||
<!-- readme: sponsors -start -->
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<a href="https://github.com/Robert-Ernst">
|
||||
<img src="https://avatars.githubusercontent.com/u/9050259?u=7253b4063f1ffe3b5a894263c8b2056151802508&v=4" width="80;" alt="Robert-Ernst"/>
|
||||
<br />
|
||||
<sub><b>Robert Ernst</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/swcarlosrj">
|
||||
<img src="https://avatars.githubusercontent.com/u/9881700?u=c92e4a0ccc0bff241e50582bce914b179b6d89b6&v=4" width="80;" alt="swcarlosrj"/>
|
||||
<br />
|
||||
<sub><b>Carlos Rufo</b></sub>
|
||||
</a>
|
||||
</td></tr>
|
||||
</table>
|
||||
<!-- readme: sponsors -end -->
|
||||
|
||||
#### Contributors
|
||||
|
@ -459,6 +480,8 @@ Dashy was made possible thanks to the following packages and components. For mor
|
|||
|
||||
> For full development documentation, see: [**Developing**](./docs/developing.md)
|
||||
|
||||
[![Open Project in VS Code](https://img.shields.io/badge/Open_in-VS_Code-863cfc?style=for-the-badge&logo=visualstudiocode)](https://open.vscode.dev/Lissy93/Dashy)
|
||||
|
||||
To set up the development environment:
|
||||
1. Get Code: `git clone git@github.com:Lissy93/dashy.git` and `cd dashy`
|
||||
2. Install dependencies: `yarn`
|
||||
|
@ -550,7 +573,8 @@ There are a few self-hosted web apps, that serve a similar purpose to Dashy. If
|
|||
- [HomeDash2](https://lamarios.github.io/Homedash2)
|
||||
- [Homer](https://github.com/bastienwirtz/homer) (`Apache License 2.0`)
|
||||
- [Organizr](https://organizr.app/) (`GPL-3.0 License`)
|
||||
- [Heimdall](https://github.com/linuxserver/Heimdall) (`MIT License`)
|
||||
- [Heimdall](https://github.com/linuxserver/Heimdall) (`MIT`)
|
||||
- [Smashing](https://github.com/Smashing/smashing) (`MIT`)
|
||||
|
||||
**[⬆️ Back to Top](#dashy)**
|
||||
|
||||
|
|
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 925 KiB After Width: | Height: | Size: 990 KiB |
|
@ -72,6 +72,7 @@ To disallow any changes from being written to disk via the UI config editor, set
|
|||
**`externalStyleSheet`** | `string` or `string[]` | _Optional_ | Either a URL to an external stylesheet or an array or URLs, which can be applied as themes within the UI
|
||||
**`customCss`** | `string` | _Optional_ | Raw CSS that will be applied to the page. This can also be set from the UI. Please minify it first.
|
||||
**`hideComponents`** | `object` | _Optional_ | A list of key page components (header, footer, search, settings, etc) that are present by default, but can be removed using this option. See [`appConfig.hideComponents`](#appconfighideComponents-optional)
|
||||
**`enableMultiTasking`** | `boolean` | _Optional_ | If set to true, will keep apps open in the background when in the workspace view. Useful for quickly switching between multiple sites, and preserving their state, but comes at the cost of performance.
|
||||
**`allowConfigEdit`** | `boolean` | _Optional_ | Should prevent / allow the user to write configuration changes to the conf.yml from the UI. When set to `false`, the user can only apply changes locally using the config editor within the app, whereas if set to `true` then changes can be written to disk directly through the UI. Defaults to `true`. Note that if authentication is enabled, the user must be of type `admin` in order to apply changes globally.
|
||||
**`enableErrorReporting`** | `boolean` | _Optional_ | Enable reporting of unexpected errors and crashes. This is off by default, and **no data will ever be captured unless you explicitly enable it**. Turning on error reporting helps previously unknown bugs get discovered and fixed. Dashy uses [Sentry](https://github.com/getsentry/sentry) for error reporting. Defaults to `false`.
|
||||
**`sentryDsn`** | `boolean` | _Optional_ | If you need to monitor errors in your instance, then you can use Sentry to collect and process bug reports. Sentry can be self-hosted, or used as SaaS, once your instance is setup, then all you need to do is pass in the DSN here, and enable error reporting. You can learn more on the [Sentry DSN Docs](https://docs.sentry.io/product/sentry-basics/dsn-explainer/). Note that this will only ever be used if `enableErrorReporting` is explicitly enabled.
|
||||
|
@ -153,7 +154,7 @@ To disallow any changes from being written to disk via the UI config editor, set
|
|||
|
||||
**Field** | **Type** | **Required**| **Description**
|
||||
--- | --- | --- | ---
|
||||
**`icon`** | `string` | _Optional_ | The icon for a given item or section. Can be a font-awesome icon, favicon, remote URL or local URL. If set to `favicon`, the icon will be automatically fetched from the items website URL. To use font-awesome, specify the category, followed by the icon name, e.g. `fas fa-rocket`, `fab fa-monero` or `fal fa-duck` - note that to use pro icons, you mut specify `appConfig.fontAwesomeKey`. If set to `generative`, then a unique icon is generated from the apps URL or IP. You can also use hosted any by specifying it's URL, e.g. `https://i.ibb.co/710B3Yc/space-invader-x256.png`. To use a local image, first store it in `./public/item-icons/` (or `-v /app/public/item-icons/` in Docker) , and reference it by name and extension - e.g. set `image.png` to use `./public/item-icon/image.png`, you can also use sub-folders if you have a lot of icons, to keep them organised.
|
||||
**`icon`** | `string` | _Optional_ | The icon for a given item or section. Can be a font-awesome icon, favicon, remote URL or local URL. If set to `favicon`, the icon will be automatically fetched from the items website URL. To use font-awesome, specify the category, followed by the icon name, e.g. `fas fa-rocket`, `fab fa-monero` or `fal fa-duck` - note that to use pro icons, you mut specify `appConfig.fontAwesomeKey`. Similarly, you can also use [simple-icons](https://simpleicons.org/) by setting icon to `si-[icon-name]` or [material-design-icons](https://dev.materialdesignicons.com/icons) by setting icon to `mdi-[icon-name]`. If set to `generative`, then a unique icon is generated from the apps URL or IP. You can also use hosted any by specifying it's URL, e.g. `https://i.ibb.co/710B3Yc/space-invader-x256.png`. To use a local image, first store it in `./public/item-icons/` (or `-v /app/public/item-icons/` in Docker) , and reference it by name and extension - e.g. set `image.png` to use `./public/item-icon/image.png`, you can also use sub-folders if you have a lot of icons, to keep them organised.
|
||||
|
||||
**[⬆️ Back to Top](#configuring)**
|
||||
|
||||
|
|
|
@ -10,18 +10,27 @@ Contributing to the code or documentation is super helpful. You can fix a bug, a
|
|||
## Add Translations
|
||||
If you speak another language, then adding translations would be really helpful, and you will be credited in the readme for your work. Multi-language support makes Dashy accessible for non-English speakers, which I feel is important. This is a very quick and easy task, as all application text is located in [`locales/en.json`](https://github.com/Lissy93/dashy/blob/master/src/assets/locales/en.json), so adding a new language is as simple as copying this file and translating the values. You don't have to translate it all, as any missing attributes will just fallback to English. For a full tutorial, see the [Multi-Language Support Docs](https://github.com/Lissy93/dashy/blob/master/docs/multi-language-support.md).
|
||||
|
||||
## Take a 2-minute survey
|
||||
Help improve Dashy by taking a very short, 6-question survey. This will give me a better understanding of what is important to you, so that I can make Dashy better in the future :)
|
||||
|
||||
[![Take the Survey](https://img.shields.io/badge/Take_the-Survey-%231a86fd?style=for-the-badge&logo=buddy)](https://n9fy6xak9yd.typeform.com/to/gl0L68ou)
|
||||
|
||||
## Share your dashboard
|
||||
Dashy now has a [Showcase](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md#dashy-showcase-) where you can show off a screenshot of your dashboard, and get inspiration from other users. I also really enjoy seeing how people are using Dashy. To [submit your dashboard](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md#submitting-your-dashboard), please either open a PR or raise an issue.
|
||||
|
||||
## Improve the Docs
|
||||
Found a typo, or something that isn't as clear as it could be? Maybe I've missed something off altogether, or you hit a roadblock that took you a while to figure out. Submitting a pull request to add to or improve the documentation will help future users get Dashy up and running more easily.
|
||||
All content is located either in the [`./README.md`](/README.md) or [`/docs/`](/docs) directory, and synced to the Wiki and website using a GH [action](/actions/workflows/wiki-sync.yml).
|
||||
|
||||
## Raise a bug
|
||||
If you've found a bug, then please do raise it as an issue. This will help me know if there's something that needs fixing. Try and include as much detail as possible, such as your environment, steps to reproduce, any console output and maybe an example screenshot or recording if necessary. You can [Raise a Bug here](https://github.com/Lissy93/dashy/issues/new?assignees=Lissy93&labels=%F0%9F%90%9B+Bug&template=bug-report---.md&title=%5BBUG%5D) 🐛.
|
||||
If you've found a bug, then please do raise it as an issue. This will help me know if there's something that needs fixing. Try and include as much detail as possible, such as your environment, steps to reproduce, any console output and maybe an example screenshot or recording if necessary.
|
||||
|
||||
[![Raise a Bug](https://img.shields.io/badge/Raise_a-Bug-%23dc2d76?style=for-the-badge&logo=dependabot)](https://github.com/Lissy93/dashy/issues/new?assignees=Lissy93&labels=%F0%9F%90%9B+Bug&template=bug-report---.md&title=%5BBUG%5D)
|
||||
|
||||
## Join the discussion
|
||||
I've enabled the discussion feature on GitHub, here you can share tips and tricks, useful information, or your dashboard. You can also ask questions, and offer basic support to other users.
|
||||
|
||||
## Share your dashboard
|
||||
Dashy now has a [Showcase](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md#dashy-showcase-) where you can show off a screenshot of your dashboard, and get inspiration from other users. I also really enjoy seeing how people are using Dashy. To [submit your dashboard](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md#submitting-your-dashboard), please either open a PR or raise an issue.
|
||||
[![Join the Discussion on GitHub](https://img.shields.io/badge/Join_the-Discussion-%23ffd000?style=for-the-badge&logo=livechat)](https://github.com/Lissy93/dashy/discussions)
|
||||
|
||||
## Spread the word
|
||||
Dashy is still a relatively young project, and as such not many people know of it. It would be great to see more users, and so it would be awesome if you could consider sharing on social platforms.
|
||||
|
@ -42,8 +51,9 @@ Dashy is on the following platforms, and if you could spare a few seconds to giv
|
|||
|
||||
[![ProductHunt](https://img.shields.io/badge/Review-ProductHunt-%23b74424?style=for-the-badge&logo=producthunt)](https://www.producthunt.com/posts/dashy)
|
||||
[![AlternativeTo](https://img.shields.io/badge/Review-AlternativeTo-%235581a6?style=for-the-badge&logo=abletonlive)](https://alternativeto.net/software/dashy/about/)
|
||||
[![Slant](https://img.shields.io/badge/Review-Slant-%2346a1df?style=for-the-badge&logo=capacitor)](https://www.slant.co/improve/topics/27783/viewpoints/1/~self-hosted-homelab-startpage~dashy)
|
||||
[![Star on GitHub](https://img.shields.io/github/stars/Lissy93/Dashy?color=ba96d6&label=Star%20-%20GitHub&logo=github&style=for-the-badge)](https://github.com/Lissy93/dashy/stargazers)
|
||||
|
||||
[![Star on DockerHub](https://img.shields.io/docker/stars/lissy93/dashy?color=4cb6e0&label=Star%20-%20Docker&logo=docker&style=for-the-badge)](https://hub.docker.com/r/lissy93/dashy)
|
||||
|
||||
## Make a small donation
|
||||
Please only do this is you can definitely afford to. Don't feel any pressure to donate anything, as Dashy and my other projects will always be 100% free, for everyone, for ever.
|
||||
|
@ -65,7 +75,7 @@ Sponsoring will give you several perks, from $1 / £0.70 per month, as well as a
|
|||
## Request a feature via BountySource
|
||||
BountySource is a platform for sponsoring the development of certain features on open source projects. If there is a feature you'd like implemented into Dashy, but either isn't high enough priority or is deemed to be more work than it's worth, then you can instead contribute a bounty towards it's development. You won't pay a penny until your proposal is fully built, and you are satisfied with the result. This helps support the developers, and makes Dashy better for everyone.
|
||||
|
||||
For more info, see [Dashy on Bounty Source](https://www.bountysource.com/teams/dashy)
|
||||
[![Request a Feature on BountySource](https://img.shields.io/badge/BountySource-Dashy-%23F67909?style=for-the-badge&logo=openbugbounty)](https://www.bountysource.com/teams/dashy)
|
||||
|
||||
## Enable Anonymous Bug Reports
|
||||
[Sentry](https://github.com/getsentry/sentry) is an open source error tracking and performance monitoring tool, which enables the identification any errors which occur in the production app (only if you enable it). It helps me to discover bugs I was unaware of, and then fix them, in order to make Dashy more reliable long term. This is a simple, yet really helpful step you can take to help improve Dashy.
|
||||
|
|
|
@ -32,6 +32,13 @@
|
|||
<sub><b>Alicia Sykes</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/EVOTk">
|
||||
<img src="https://avatars.githubusercontent.com/u/45015615?v=4" width="80;" alt="EVOTk"/>
|
||||
<br />
|
||||
<sub><b>EVOTk</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/evroon">
|
||||
<img src="https://avatars.githubusercontent.com/u/11857441?v=4" width="80;" alt="evroon"/>
|
||||
|
@ -40,10 +47,17 @@
|
|||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/EVOTk">
|
||||
<img src="https://avatars.githubusercontent.com/u/45015615?v=4" width="80;" alt="EVOTk"/>
|
||||
<a href="https://github.com/snyk-bot">
|
||||
<img src="https://avatars.githubusercontent.com/u/19733683?v=4" width="80;" alt="snyk-bot"/>
|
||||
<br />
|
||||
<sub><b>EVOTk</b></sub>
|
||||
<sub><b>Snyk Bot</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/UrekD">
|
||||
<img src="https://avatars.githubusercontent.com/u/38784343?v=4" width="80;" alt="UrekD"/>
|
||||
<br />
|
||||
<sub><b>UrekD</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
|
@ -52,7 +66,8 @@
|
|||
<br />
|
||||
<sub><b>Begin</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
</td></tr>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<a href="https://github.com/deepsourcebot">
|
||||
<img src="https://avatars.githubusercontent.com/u/60907429?v=4" width="80;" alt="deepsourcebot"/>
|
||||
|
@ -67,14 +82,6 @@
|
|||
<sub><b>Ryan Turner</b></sub>
|
||||
</a>
|
||||
</td></tr>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<a href="https://github.com/snyk-bot">
|
||||
<img src="https://avatars.githubusercontent.com/u/19733683?v=4" width="80;" alt="snyk-bot"/>
|
||||
<br />
|
||||
<sub><b>Snyk Bot</b></sub>
|
||||
</a>
|
||||
</td></tr>
|
||||
</table>
|
||||
<!-- readme: contributors -end -->
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
Welcome to Dashy, so glad you're here :) Deployment is super easy, and there are several methods available depending on what type of system you're using. If you're self-hosting, then deploying with Docker (or similar container engine) is the recommended approach.
|
||||
|
||||
#### Quick Start
|
||||
If you want to skip the fuss, and get straight down to it, then you can spin up a new instance of Dashy by running:
|
||||
If you want to skip the fuss, and [get straight down to it](./docs/quick-start.md), then you can spin up a new instance of Dashy by running:
|
||||
```
|
||||
docker run -p 8080:80 lissy93/dashy
|
||||
```
|
||||
|
@ -25,7 +25,18 @@ Once you've got Dashy up and running, you'll want to configure it with your own
|
|||
|
||||
### Deploy with Docker
|
||||
|
||||
[![Dashy on Docker Hub](https://dockeri.co/image/lissy93/dashy)](https://hub.docker.com/r/lissy93/dashy)
|
||||
**Container Info**: [
|
||||
![Docker Supported Architecture](https://img.shields.io/badge/Architectures-amd64%20|%20arm32v7%20|%20arm64v8-6ba6e5)
|
||||
![Docker Base Image](https://img.shields.io/badge/Base_Image-Alpine_3.14-6ba6e5)
|
||||
![Docker Hosted on](https://img.shields.io/badge/Hosted_on-DockerHub-6ba6e5)
|
||||
](https://hub.docker.com/r/lissy93/dashy)<br>
|
||||
**Status**: [
|
||||
![Docker Build Status](https://img.shields.io/docker/cloud/build/lissy93/dashy?label=Docker%20Build)
|
||||
![Docker Pulls](https://img.shields.io/docker/pulls/lissy93/dashy?color=ecb2f7)
|
||||
![Docker Stars](https://img.shields.io/docker/stars/lissy93/dashy?color=f7f754&label=Docker%20Stars)
|
||||
![Docker Image Size](https://img.shields.io/docker/image-size/lissy93/dashy/latest?color=1eea76)
|
||||
![Docker Cloud Build](https://img.shields.io/docker/cloud/automated/lissy93/dashy?color=f4a966&label=Docker%20Build)
|
||||
](https://hub.docker.com/r/lissy93/dashy)
|
||||
|
||||
Dashy has a built container image hosted on [Docker Hub](https://hub.docker.com/r/lissy93/dashy). You will need [Docker](https://docs.docker.com/get-docker/) installed on your system.
|
||||
|
||||
|
@ -108,8 +119,8 @@ Some hosting providers required a bit of extra configuration, which was why I've
|
|||
|
||||
**Note** If you use a static hosting provider, then status checks, writing new config changes to disk from the UI, and triggering a rebuild through the UI will not be availible. This is because these features need endpoints provided by Dashy's local Node server. Everything else should work just the same though.
|
||||
|
||||
#### Netlify <img src="https://i.ibb.co/ZxtzrP3/netlify.png" width="24"/>
|
||||
[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/lissy93/dashy)
|
||||
#### Netlify
|
||||
[![Deploy to Netlify](https://i.ibb.co/GtKMysT/deploy-netlify-button.png)](https://app.netlify.com/start/deploy?repository=https://github.com/lissy93/dashy)
|
||||
|
||||
[Netlify](https://www.netlify.com/) offers Git-based serverless cloud hosting for web applications. Their services are free to use for personal use, and they support deployment from both public and private repos, as well as direct file upload. The free plan also allows you to use your own custom domain or sub-domain, and is easy to setup.
|
||||
|
||||
|
@ -118,8 +129,8 @@ To deploy Dashy to Netlify, use the following link
|
|||
https://app.netlify.com/start/deploy?repository=https://github.com/lissy93/dashy
|
||||
```
|
||||
|
||||
#### Heroku <img src="https://i.ibb.co/d2P1WZ7/heroku.png" width="24"/>
|
||||
[![Deploy to Heroku](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/Lissy93/dashy)
|
||||
#### Heroku
|
||||
[![Deploy to Heroku](https://i.ibb.co/GdMFzBP/deploy-heroku-button.png)](https://heroku.com/deploy?template=https://github.com/Lissy93/dashy)
|
||||
|
||||
[Heroku](https://www.heroku.com/) is a fully managed cloud platform as a service. You define app settings in a Procfile and app.json, which specifying how the app should be build and how the server should be started. Heroku is free to use for unlimited, non-commercial, single dyno apps, and supports custom domains. Heroku's single-dyno service is not as quite performant as some other providers, and the app will have a short wake-up time when not visited for a while
|
||||
|
||||
|
@ -128,8 +139,8 @@ To deploy Dashy to Heroku, use the following link
|
|||
https://heroku.com/deploy?template=https://github.com/Lissy93/dashy
|
||||
```
|
||||
|
||||
#### Cloudflare Workers <img src="https://i.ibb.co/CvpFM1S/cloudflare.png" width="24"/>
|
||||
[![Deploy to Cloudflare Workers](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/lissy93/dashy/tree/deploy_cloudflare)
|
||||
#### Cloudflare Workers
|
||||
[![Deploy to Cloudflare Workers](https://i.ibb.co/jf9xVdm/deploy-cloudflare-button.png)](https://deploy.workers.cloudflare.com/?url=https://github.com/lissy93/dashy/tree/deploy_cloudflare)
|
||||
|
||||
[Cloudflare Workers](https://workers.cloudflare.com/) is a simple yet powerful service for running cloud functions and hosting web content. It requires a Cloudflare account, but is completely free for smaller projects, and very reasonably priced ($0.15/million requests per month) for large applications. You can use your own domain, and applications are protected with Cloudflare's state of the art DDoS protection. For more info, see the docs on [Worker Sites](https://developers.cloudflare.com/workers/platform/sites)
|
||||
|
||||
|
@ -138,8 +149,8 @@ To deploy Dashy to Cloudflare, use the following link
|
|||
https://deploy.workers.cloudflare.com/?url=https://github.com/lissy93/dashy/tree/deploy_cloudflare
|
||||
```
|
||||
|
||||
#### Vercel <img src="https://i.ibb.co/Ld2FZzb/vercel.png" width="24"/>
|
||||
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/project?template=https://github.com/lissy93/dashy)
|
||||
#### Vercel
|
||||
[![Deploy with Vercel](https://i.ibb.co/mJF3R7m/deploy-vercel-button.png)](https://vercel.com/new/project?template=https://github.com/lissy93/dashy)
|
||||
|
||||
[Vercel](https://vercel.com/) is a performance-focused platform for hosting static frontend apps. It comes bundled with some useful tools for monitoring and anaylzing application performance and other metrics. Vercel is free for personal use, allows for custom domains and has very reasonable limits.
|
||||
|
||||
|
@ -148,8 +159,8 @@ To deploy Dashy to Vercel, use the following link
|
|||
https://vercel.com/new/project?template=https://github.com/lissy93/dashy
|
||||
```
|
||||
|
||||
#### DigitalOcean <img src="https://i.ibb.co/V2MxtGC/digitalocean.png" width="24"/>
|
||||
[![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/lissy93/dashy/tree/deploy_digital-ocean&refcode=3838338e7f79)
|
||||
#### DigitalOcean
|
||||
[![Deploy to DO](https://i.ibb.co/PFt0PkB/deploy-digital-ocean-button.png)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/lissy93/dashy/tree/deploy_digital-ocean&refcode=3838338e7f79)
|
||||
|
||||
[DigitalOcan](https://www.digitalocean.com/) is a cloud service providing affordable developer-friendly virtual machines from $5/month. But they also have an app platform, where you can run web apps, static sites, APIs and background workers. CDN-backed static sites are free for personal use.
|
||||
|
||||
|
@ -157,8 +168,8 @@ https://vercel.com/new/project?template=https://github.com/lissy93/dashy
|
|||
https://cloud.digitalocean.com/apps/new?repo=https://github.com/lissy93/dashy/tree/deploy_digital-ocean
|
||||
```
|
||||
|
||||
#### Google Cloud Platform <img src="https://i.ibb.co/J7MGymY/googlecloud.png" width="24"/>
|
||||
[![Run on Google Cloud](https://deploy.cloud.run/button.svg)](https://deploy.cloud.run/?git_repo=https://github.com/lissy93/dashy.git)
|
||||
#### Google Cloud Platform
|
||||
[![Run on Google Cloud](https://i.ibb.co/LkvHttd/deploy-google-cloud-button.png)](https://deploy.cloud.run/?git_repo=https://github.com/lissy93/dashy.git)
|
||||
|
||||
[Cloud Run](https://cloud.google.com/run/) is a service offered by [Google Cloud](https://cloud.google.com/). It's a fully managed serverless platform, for developing and deploying highly scalable containerized applications. Similar to AWS and Azure, GCP offers a wide range of cloud services, which are billed on a pay‐per‐use basis, but Cloud Run has a [free tier](https://cloud.google.com/run/pricing) offering 180,000 vCPU-seconds, 360,000 GiB-seconds, and 2 million requests per month.
|
||||
|
||||
|
@ -167,8 +178,8 @@ To deploy Dashy to GCP, use the following link
|
|||
https://deploy.cloud.run/?git_repo=https://github.com/lissy93/dashy.git
|
||||
```
|
||||
|
||||
#### Platform.sh <img src="https://i.ibb.co/GdfvH3Z/platformsh.png" width="24"/>
|
||||
[![Deploy to Platform.sh](https://platform.sh/images/deploy/deploy-button-lg-blue.svg)](https://console.platform.sh/projects/create-project/?template=https://github.com/lissy93/dashy&utm_campaign=deploy_on_platform?utm_medium=button&utm_source=affiliate_links&utm_content=https://github.com/lissy93/dashy)
|
||||
#### Platform.sh
|
||||
[![Deploy to Platform.sh](https://i.ibb.co/nPnJgJP/deploy-platform-sh-button.png)](https://console.platform.sh/projects/create-project/?template=https://github.com/lissy93/dashy&utm_campaign=deploy_on_platform?utm_medium=button&utm_source=affiliate_links&utm_content=https://github.com/lissy93/dashy)
|
||||
|
||||
[Platform.sh](https://platform.sh) is an end-to-end solution for developing and deploying applications. It is geared towards enterprise users with large teams, and focuses on allowing applications to scale up and down. Unlike the above providers, Platform.sh is not free, although you can deploy a test app to it without needing a payment method
|
||||
|
||||
|
@ -177,8 +188,8 @@ To deploy Dashy to Platform.sh, use the following link
|
|||
https://console.platform.sh/projects/create-project/?template=https://github.com/lissy93/dashy
|
||||
```
|
||||
|
||||
#### Render <img src="https://i.ibb.co/xCHtzgh/render.png" width="24"/>
|
||||
[![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy?repo=https://github.com/lissy93/dashy/tree/deploy_render)
|
||||
#### Render
|
||||
[![Deploy to Render](https://i.ibb.co/QXNCbxT/deploy-render-button.png)](https://render.com/deploy?repo=https://github.com/lissy93/dashy/tree/deploy_render)
|
||||
|
||||
[Render](https://render.com) is cloud provider that provides easy deployments for static sites, Docker apps, web services, databases and background workers. Render is great for developing applications, and very easy to use. Static sites are free, and services start at $7/month. Currently there are only 2 server locations - Oregon, USA and Frankfurt, Germany. For more info, see the [Render Docs](https://render.com/docs)
|
||||
|
||||
|
@ -187,8 +198,8 @@ To deploy Dashy to Render, use the following link
|
|||
https://render.com/deploy?repo=https://github.com/lissy93/dashy/tree/deploy_render
|
||||
```
|
||||
|
||||
#### Scalingo <img src="https://i.ibb.co/Rvf5c4y/scalingo.png" width="24"/>
|
||||
[![Deploy on Scalingo](https://cdn.scalingo.com/deploy/button.svg)](https://my.scalingo.com/deploy?source=https://github.com/lissy93/dashy#master)
|
||||
#### Scalingo
|
||||
[![Deploy on Scalingo](https://i.ibb.co/nj0KxyH/deploy-scalingo-button.png)](https://my.scalingo.com/deploy?source=https://github.com/lissy93/dashy#master)
|
||||
|
||||
[Scalingo](https://scalingo.com/) is a scalable container-based cloud platform as a service. It's focus is on compliance and uptime, and is geared towards enterprise users. Scalingo is also not free, although they do have a 3-day free trial that does not require a payment method
|
||||
|
||||
|
@ -197,8 +208,8 @@ To deploy Dashy to Scalingo, use the following link
|
|||
https://my.scalingo.com/deploy?source=https://github.com/lissy93/dashy#master
|
||||
```
|
||||
|
||||
#### Play-with-Docker <img src="https://i.ibb.co/HVWVYF7/docker.png" width="24"/>
|
||||
[![Try in PWD](https://raw.githubusercontent.com/play-with-docker/stacks/cff22438/assets/images/button.png)](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml)
|
||||
#### Play-with-Docker
|
||||
[![Try in PWD](https://i.ibb.co/SfbH7Zy/deploy-pwd-button.png)](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml)
|
||||
|
||||
[Play with Docker](https://labs.play-with-docker.com/) is a community project by Marcos Liljedhal and Jonathan Leibiusky and sponsored by Docker, intended to provide a hands-on learning environment. Their labs let you quickly spin up a Docker container or stack, and test out the image in a temporary, sandboxed environment. There's no need to sign up, and it's completely free.
|
||||
|
||||
|
@ -207,9 +218,10 @@ To run Dashy in PWD, use the following URL:
|
|||
https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml
|
||||
```
|
||||
|
||||
#### Surge.sh <img src="https://i.ibb.co/WgVC4mB/surge.png" width="24"/>
|
||||
[Surge.sh](http://surge.sh/) is quick and easy static web publishing platform for frontend-apps.
|
||||
#### Surge.sh
|
||||
![Follow instructions below](https://i.ibb.co/XkcKzKz/deploy-surge-button.png)
|
||||
|
||||
[Surge.sh](http://surge.sh/) is quick and easy static web publishing platform for frontend-apps.
|
||||
Surge supports [password-protected projects](https://surge.sh/help/adding-password-protection-to-a-project). You can also [add a custom domain](https://surge.sh/help/adding-a-custom-domain) and then [force HTTPS by default](https://surge.sh/help/using-https-by-default) and optionally [set a custom SSL certificate](https://surge.sh/help/securing-your-custom-domain-with-ssl)
|
||||
|
||||
To deploy Dashy to Surge.sh, first clone and cd into Dashy, install dependencies, and then use the following commands
|
||||
|
|
|
@ -14,6 +14,8 @@ Both sections and items can have an icon, which is specified using the `icon` at
|
|||
<img width="500" src="https://i.ibb.co/GTVmZnc/dashy-example-icons.png" />
|
||||
</p>
|
||||
|
||||
Note that, if you are using icons from an external source (like font-awesome or material-design-icons), then the relevant font file will be loaded in automatically if and when needed, but combining icons from multiple services may have a negative impact on performance.
|
||||
|
||||
### Font Awesome
|
||||
You can use any [Font Awesome Icon](https://fontawesome.com/icons) simply by specifying it's identifier. This is in the format of `[category] [name]` and can be found on the page for any given icon on the Font Awesome site. For example: `fas fa-rocket`, `fab fa-monero` or `fas fa-unicorn`.
|
||||
|
||||
|
@ -54,7 +56,7 @@ You can use almost any emoji as an icon for items or sections. You can specify t
|
|||
<img width="580" src="https://i.ibb.co/YLwgTf9/emoji-icons-1.png" />
|
||||
</p>
|
||||
|
||||
The following example shows the unicode options available, all three will render the 🚀 emoji.
|
||||
The following examples will all render the same rocket (🚀) emoji:
|
||||
|
||||
```yaml
|
||||
items:
|
||||
|
@ -74,5 +76,25 @@ You may also want to store your icons locally, bundled within Dashy so that ther
|
|||
|
||||
You can also use sub-folders within the `item-icons` directory to keep things organised. You would then specify an icon with it's folder name slash image name. For example: `networking/monit.png`
|
||||
|
||||
### Material Design Icons
|
||||
Dashy also supports 5000+ [material-design-icons](https://github.com/Templarian/MaterialDesign). To use these, first find the name/ slug for your icon [here](https://dev.materialdesignicons.com/icons), and then prefix is with `mdi-`.
|
||||
|
||||
For example:
|
||||
```yaml
|
||||
sections:
|
||||
- name: Material Design Icons Example
|
||||
items:
|
||||
- title: Alien Icon
|
||||
icon: mdi-alien
|
||||
- title: Fire Icon
|
||||
icon: mdi-fire
|
||||
- title: Dino Icon
|
||||
icon: mdi-google-downasaur
|
||||
|
||||
```
|
||||
|
||||
### Simple Icons
|
||||
To use glyphs from [SimpleIcons.org](https://simpleicons.org/), first find the icon slug, and then prefix it with `si-`. The image will be loaded directly from the Simple Icons
|
||||
|
||||
### No Icon
|
||||
If you don't wish for a given item or section to have an icon, just leave out the `icon` attribute.
|
||||
|
|
|
@ -0,0 +1,106 @@
|
|||
# Quick Start
|
||||
|
||||
Welcome to Dashy! So glad you're here 😊 In a couple of minutes, you'll have your new dashboard up and running 🚀
|
||||
|
||||
**TDLR;** Run `docker run -p 8080:80 lissy93/dashy`, then open `http://localhost:8080`
|
||||
|
||||
---
|
||||
|
||||
## 1. Prerequisites
|
||||
|
||||
The quickest and easiest method of running Dashy is using Docker (or another container engine). You can find installation instructions for your system in the [Docker Documentation](https://docs.docker.com/get-docker/).
|
||||
If you don't want to use Docker, then you can use one of Dashy's other supported installation methods instead, all of which are outlined in the [Deployment Docs](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md).
|
||||
|
||||
---
|
||||
|
||||
## 2. Installation
|
||||
|
||||
To pull the latest image, and build and start the app run:
|
||||
```
|
||||
docker run -d \
|
||||
-p 8080:80 \
|
||||
--name my-dashboard \
|
||||
--restart=always \
|
||||
lissy93/dashy:latest
|
||||
```
|
||||
|
||||
For a full list of available options, then see [Dashy with Docker](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md#deploy-with-docker) Docs. If you'd prefer to use Docker Compose, then see [Dashy with Docker Compose](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md#using-docker-compose) Docs.
|
||||
|
||||
Your dashboard should now be up and running at `http://localhost:8080` (or your servers IP address/ domain, and the port that you chose). The first build will may take a few minutes
|
||||
|
||||
---
|
||||
|
||||
## 3. Configure
|
||||
|
||||
Now that you've got Dashy running, you are going to want to set it up with your own content.
|
||||
Config is written in [YAML Format](https://yaml.org/), and saved in [`/public/conf.yml`](https://github.com/Lissy93/dashy/blob/master/public/conf.yml).
|
||||
The format on the config file is pretty straight forward. There are three root attributes:
|
||||
- [`pageInfo`](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md#pageinfo) - Dashboard meta data, like title, description, nav bar links and footer text
|
||||
- [`appConfig`](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md#appconfig-optional) - Dashboard settings, like themes, authentication, language and customization
|
||||
- [`sections`](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md#section) - An array of sections, each including an array of items
|
||||
|
||||
|
||||
You can view a full list of all available config options in the [Configuring Docs](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md).
|
||||
|
||||
```yaml
|
||||
pageInfo:
|
||||
title: Home Lab
|
||||
sections: # An array of sections
|
||||
- name: Example Section
|
||||
icon: far fa-rocket
|
||||
items:
|
||||
- title: GitHub
|
||||
description: Dashy source code and docs
|
||||
icon: fab fa-github
|
||||
url: https://github.com/Lissy93/dashy
|
||||
- title: Issues
|
||||
description: View open issues, or raise a new one
|
||||
icon: fas fa-bug
|
||||
url: https://github.com/Lissy93/dashy/issues
|
||||
- name: Local Services
|
||||
items:
|
||||
- title: Firewall
|
||||
icon: favicon
|
||||
url: http://192.168.1.1/
|
||||
- title: Game Server
|
||||
icon: https://i.ibb.co/710B3Yc/space-invader-x256.png
|
||||
url: http://192.168.130.1/
|
||||
```
|
||||
|
||||
Notes:
|
||||
- You can use a Docker volume to pass a config file from your host system to the container
|
||||
- E.g. `-v ./host-system/my-local-conf.yml:/app/public/conf.yml`
|
||||
- It's also possible to edit your config directly through the UI, and changes will be saved in this file
|
||||
- Check your config against Dashy's schema, with `docker exec -it [container-id] yarn validate-config`
|
||||
- You might find it helpful to look at some examples, a collection of which can be [found here](https://gist.github.com/Lissy93/000f712a5ce98f212817d20bc16bab10)
|
||||
- After editing your config, the app will rebuild in the background, which may take a minute
|
||||
|
||||
---
|
||||
|
||||
## 4. Further Customisation
|
||||
|
||||
Once you've got Dashy setup, you'll want to ensure the container is properly healthy, secured, backed up and kept up-to-date. All this is covered in the [Management Docs](https://github.com/Lissy93/dashy/blob/master/docs/management.md).
|
||||
|
||||
|
||||
You might also want to check out the docs for specific features you'd like to use:
|
||||
- [Authentication](/docs/authentication.md) - Setting up authentication to protect your dashboard
|
||||
- [Backup & Restore](/docs/backup-restore.md) - Guide to Dashy's cloud sync feature
|
||||
- [Icons](/docs/icons.md) - Outline of all available icon types for sections and items
|
||||
- [Localisation](/docs/multi-language-support.md) - How to change language, or add your own
|
||||
- [Status Indicators](/docs/status-indicators.md) - Using Dashy to monitor uptime and status of your apps
|
||||
- [Theming](/docs/theming.md) - Complete guide to applying, writing and modifying themes and styles
|
||||
|
||||
---
|
||||
|
||||
## 5. Final Note
|
||||
|
||||
If you're enjoying Dashy, and have a few minutes to spare, please do take a moment to look at the [Contributing Page](https://github.com/Lissy93/dashy/blob/master/docs/contributing.md). There are a few things that we really need some help with, and whatever your skill set, there are ways you can help out. Any contributions, however small would be greatly appreciated.
|
||||
Thank you to [everyone](https://github.com/Lissy93/dashy/blob/master/docs/credits.md) who is already doing so, without developing and maintaining Dashy would not have been so possible.
|
||||
|
||||
You can also consider sharing your dashboard in the [Showcase](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md), to help provide inspiration for others.
|
||||
|
||||
For more info, check out the [Documentation](https://github.com/Lissy93/dashy/tree/master/docs#readme). If you've got any questions feel free to ask in the [Discussion](https://github.com/Lissy93/dashy/discussions), and if you think you've found a bug you can [raise an issue](https://github.com/Lissy93/dashy/issues/new/choose) to get it fixed.
|
||||
|
||||
Enjoy your dashboard :)
|
||||
|
||||
---
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
This document contains common problems and their solutions.
|
||||
|
||||
### Yarn Error
|
||||
## Yarn Error
|
||||
|
||||
For more info, see [Issue #1](https://github.com/Lissy93/dashy/issues/1)
|
||||
|
||||
|
@ -18,3 +18,35 @@ Alternatively, as a workaround, you have several options:
|
|||
- Try using [NPM](https://www.npmjs.com/get-npm) instead: So clone, cd, then run `npm install`, `npm run build` and `npm start`
|
||||
- Try using [Docker](https://www.docker.com/get-started) instead, and all of the system setup and dependencies will already be taken care of. So from within the directory, just run `docker build -t lissy93/dashy .` to build, and then use docker start to run the project, e.g: `docker run -it -p 8080:80 lissy93/dashy` (see the [deploying docs](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md#deploy-with-docker) for more info)
|
||||
|
||||
---
|
||||
## `Refused to Connect` in Modal or Workspace View
|
||||
|
||||
This is not an issue with Dashy, but instead caused by the target app preventing direct access through embedded elements. It can be fixed by setting the [`X-Frame-Options`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options) HTTP header set to `ALLOW [path to Dashy]` or `SAMEORIGIN`, as defined in [RFC-7034](https://datatracker.ietf.org/doc/html/rfc7034). These settings are usually set in the config file for the web server that's hosting the target application, here are some examples of how to enable cross-origin access with common web servers:
|
||||
|
||||
### NGINX
|
||||
In NGINX, you can use the [`add_header`](https://nginx.org/en/docs/http/ngx_http_headers_module.html) module within the app block.
|
||||
```
|
||||
server {
|
||||
...
|
||||
add_header X-Frame-Options SAMEORIGIN always;
|
||||
}
|
||||
```
|
||||
Then reload with `service nginx reload`
|
||||
|
||||
### Caddy
|
||||
|
||||
In Caddy, you can use the [`header`](https://caddyserver.com/docs/caddyfile/directives/header) directive.
|
||||
|
||||
```yaml
|
||||
header {
|
||||
X-Frame-Options SAMEORIGIN
|
||||
}
|
||||
```
|
||||
|
||||
### Apache
|
||||
|
||||
In Apache, you can use the [`mod_headers`](https://httpd.apache.org/docs/current/mod/mod_headers.html) module to set the `X-Frame-Options` in your config file. This file is usually located somewhere like `/etc/apache2/httpd.conf
|
||||
|
||||
```
|
||||
Header set X-Frame-Options: "ALLOW-FROM http://[dashy-location]/"
|
||||
```
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "Dashy",
|
||||
"version": "1.5.6",
|
||||
"version": "1.5.8",
|
||||
"license": "MIT",
|
||||
"main": "server",
|
||||
"scripts": {
|
||||
|
@ -17,11 +17,11 @@
|
|||
"dependencies": {
|
||||
"@sentry/tracing": "^6.10.0",
|
||||
"@sentry/vue": "^6.10.0",
|
||||
"ajv": "^8.5.0",
|
||||
"ajv": "^8.6.2",
|
||||
"axios": "^0.21.1",
|
||||
"body-parser": "^1.19.0",
|
||||
"connect": "^3.7.0",
|
||||
"crypto-js": "^4.0.0",
|
||||
"crypto-js": "^4.1.1",
|
||||
"js-yaml": "^4.1.0",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"prismjs": "^1.24.1",
|
||||
|
@ -37,7 +37,7 @@
|
|||
"vue-material-tabs": "0.1.5",
|
||||
"vue-prism-editor": "^1.2.2",
|
||||
"vue-router": "^3.0.3",
|
||||
"vue-select": "^3.11.2",
|
||||
"vue-select": "^3.12.1",
|
||||
"vue-swatches": "^2.1.1",
|
||||
"vue-toasted": "^1.1.28"
|
||||
},
|
||||
|
|
|
@ -147,5 +147,11 @@
|
|||
"backup-error-password": "Incorrect password. Please enter your current password.",
|
||||
"backup-success-msg": "Completed Successfully",
|
||||
"restore-success-msg": "Config Restored Successfully"
|
||||
},
|
||||
"menu": {
|
||||
"sametab": "Open in Current Tab",
|
||||
"newtab": "Open in New Tab",
|
||||
"modal": "Open in Pop-Up Modal",
|
||||
"workspace": "Open in Workspace View"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -147,5 +147,11 @@
|
|||
"backup-error-password": "Mot de passe incorrect. Veuillez saisir votre mot de passe actuel.",
|
||||
"backup-success-msg": "Sauvegarde effectuée avec succès",
|
||||
"restore-success-msg": "Configuration restaurée avec succès"
|
||||
},
|
||||
"menu": {
|
||||
"sametab": "Ouvrir dans l'onglet actuel",
|
||||
"newtab": "Ouvrir dans un nouvel onglet",
|
||||
"modal": "Ouvrir en mode fenêtré",
|
||||
"workspace": "Ouvrir en mode plein écran"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,157 @@
|
|||
{
|
||||
"home": {
|
||||
"no-results": "Ni Rezultatov Iskanja",
|
||||
"no-data": "Podatki Niso Konfigurirani"
|
||||
},
|
||||
"search": {
|
||||
"search-label": "Iskanje",
|
||||
"search-placeholder": "Začnite tipkati za filtrirate",
|
||||
"clear-search-tooltip": "Počisti iskanje"
|
||||
},
|
||||
"login": {
|
||||
"title": "Dashy",
|
||||
"username-label": "Uporabniško ime",
|
||||
"password-label": "Geslo",
|
||||
"login-button": "Prijava",
|
||||
"remember-me-label": "Zapomni si me za",
|
||||
"remember-me-never": "Nikoli",
|
||||
"remember-me-hour": "4 Ure",
|
||||
"remember-me-day": "1 Dan",
|
||||
"remember-me-week": "1 Teden",
|
||||
"error-missing-username": "Manjka Uporabniško Ime",
|
||||
"error-missing-password": "Manjka Geslo",
|
||||
"error-incorrect-username": "Uporabnik ne obstaja",
|
||||
"error-incorrect-password": "Napačno Geslo",
|
||||
"success-message": "Prijavljanje...",
|
||||
"logout-message": "Odjavljen"
|
||||
},
|
||||
"config": {
|
||||
"main-tab": "Glavni Meni",
|
||||
"view-config-tab": "Ogled Konfiguracije",
|
||||
"edit-config-tab": "Urejanje Konfiguracije",
|
||||
"custom-css-tab": "Slogi Po Meri",
|
||||
"heading": "Možnosti Konfiguracija",
|
||||
"download-config-button": "Prenos Konfiguracije",
|
||||
"edit-config-button": "Uredi Konfiguracijo",
|
||||
"edit-css-button": "Uredi CSS Po Meri",
|
||||
"cloud-sync-button": "Omogoči Sinhronizacijo v Oblaku",
|
||||
"edit-cloud-sync-button": "Ureditev Sinhronizacije v Oblaku",
|
||||
"rebuild-app-button": "Obnovi Aplikacijo",
|
||||
"change-language-button": "Spremeni Jezik Aplikacije",
|
||||
"reset-settings-button": "Ponastavi Lokalne Nastavitve",
|
||||
"app-info-button": "Informacije o Aplikaciji",
|
||||
"backup-note": "Priporočljivo je, da pred spremembami naredite varnostno kopijo konfiguracije.",
|
||||
"reset-config-msg-l1": "To bo odstranilo vse uporabniške nastavitve iz lokalnega pomnilnika, vendar ne bo vplivalo na datoteko 'conf.yml'.",
|
||||
"reset-config-msg-l2": "Če želeti spremembe, ki ste jih naredili lokalno uporabiti v prihodnosti, ustvarite varnostno kopijo.",
|
||||
"reset-config-msg-l3": "Ali ste prepričani, da želite nadaljevati?",
|
||||
"data-cleared-msg": "Podatki so bili uspešno izbrisani",
|
||||
"actions-label": "Dejanja",
|
||||
"copy-config-label": "Kopiraj Konfiguracijo",
|
||||
"data-copied-msg": "Config je bil kopiran v odložišče",
|
||||
"reset-config-label": "Ponastavi Konfiguracijo",
|
||||
"css-save-btn": "Shrani spremembe",
|
||||
"css-note-label": "Opomba",
|
||||
"css-note-l1": "Za uveljavitev sprememb boste morali osvežiti stran.",
|
||||
"css-note-l2": "Preglasitve slogov so shranjene samo lokalno, zato je priporočljivo narediti kopijo CSS -ja.",
|
||||
"css-note-l3": "Če želite odstraniti vse sloge po meri, izbrišite vsebino in pritisnite Shrani spremembe"
|
||||
},
|
||||
"settings": {
|
||||
"theme-label": "Tema",
|
||||
"layout-label": "Postavitev",
|
||||
"layout-auto": "Avtomatsko",
|
||||
"layout-horizontal": "Vodoravno",
|
||||
"layout-vertical": "Vertikalno",
|
||||
"item-size-label": "Velikost Predmeta",
|
||||
"item-size-small": "Majhno",
|
||||
"item-size-medium": "Srednje",
|
||||
"item-size-large": "Veliko",
|
||||
"config-launcher-label": "Nastavitve",
|
||||
"config-launcher-tooltip": "Posodobi Konfiguracijo",
|
||||
"sign-out-tooltip": "Odjava"
|
||||
},
|
||||
"updates": {
|
||||
"app-version-note": "Dashy verzija",
|
||||
"up-to-date": "Posodobljeno",
|
||||
"out-of-date": "Navoljo posodobitev",
|
||||
"unsupported-version-l1": "Uporabljate nepodprto različico programa Dashy",
|
||||
"unsupported-version-l2": "Za najboljšo izkušnjo in najnovejše varnostne popravke posodobite na"
|
||||
},
|
||||
"language-switcher": {
|
||||
"title": "Spremenite Jezik Aplikacije",
|
||||
"dropdown-label": "Izberite Jezik",
|
||||
"save-button": "Shrani",
|
||||
"success-msg": "Jezik Posodobljen na"
|
||||
},
|
||||
"theme-maker": {
|
||||
"title": "Konfigurator Teme",
|
||||
"export-button": "Izvozi Spremenljivke po Meri",
|
||||
"reset-button": "Ponastavi Sloge za",
|
||||
"show-all-button": "Pokaži Vse Spremenljivke",
|
||||
"save-button": "Shrani",
|
||||
"cancel-button": "Prekliči",
|
||||
"saved-toast": "{theme} Posodbljena Uspešno",
|
||||
"copied-toast": "Podatki o temi za {theme} so kopirani v odložišče",
|
||||
"reset-toast": "Barve po Meri za {theme} Odstranjene"
|
||||
},
|
||||
"config-editor": {
|
||||
"save-location-label": "Način Shranjevanja",
|
||||
"location-local-label": "Shrani Lokalno",
|
||||
"location-disk-label": "Zapišite spremembe v datoteko za konfiguracijo",
|
||||
"save-button": "Shrani Spremembe",
|
||||
"valid-label": "Konfiguracija je veljavna",
|
||||
"status-success-msg": "Operacija dokončana",
|
||||
"status-fail-msg": "Operacija ni uspela",
|
||||
"success-msg-disk": "Konfiguracijska datoteka je uspešno zapisana na disk",
|
||||
"success-msg-local": "Lokalne spremembe so bile uspešno shranjene",
|
||||
"success-note-l1": "Aplikacija se bo samodejno obnovila.",
|
||||
"success-note-l2": "To lahko traja do ene minute.",
|
||||
"success-note-l3": "Za uveljavitev sprememb boste morali osvežiti stran.",
|
||||
"error-msg-save-mode": "Izberite način shranjevanja: Lokalno ali v Datoteko",
|
||||
"error-msg-cannot-save": "Pri shranjevanju konfiguracije je prišlo do napake",
|
||||
"error-msg-bad-json": "Napaka v JSON -u, morda nepravilno oblikovana",
|
||||
"warning-msg-validation": "Opozorilo o Validaciji"
|
||||
},
|
||||
"app-rebuild": {
|
||||
"title": "Obnovite Aplikacijo",
|
||||
"rebuild-note-l1": "Za uveljavitev sprememb, zapisanih v datoteki conf.yml, je potrebna obnovitev.",
|
||||
"rebuild-note-l2": "To bi se moralo zgoditi samodejno, če pa se ne, lahko to ročno sprožite tukaj.",
|
||||
"rebuild-note-l3": "To ni potrebno za spremembe, shranjene lokalno.",
|
||||
"rebuild-button": "Začni Graditi",
|
||||
"rebuilding-status-1": "Gradnja...",
|
||||
"rebuilding-status-2": "To lahko traja nekaj minut",
|
||||
"error-permission": "Nimate dovoljenja za izvajanje tega dejanja",
|
||||
"success-msg": "Gradnja je bila uspešno zaključena",
|
||||
"fail-msg": "Operacija izdelave ni uspela",
|
||||
"reload-note": "Za uveljavitev sprememb je potrebno osvežiti stran",
|
||||
"reload-button": "Osveži Stran"
|
||||
},
|
||||
"cloud-sync": {
|
||||
"title": "Varnostno Kopiranje & Obnovitev v Oblaku",
|
||||
"intro-l1": "Varnostno kopiranje in obnovitev v oblaku je izbirna funkcija, ki vam omogoča, da svojo konfiguracijo shranite v oblak in jo nato obnovite v kateri koli drugi napravi ali primerku Dashyja.",
|
||||
"intro-l2": "Vsi podatki so v celoti šifrirani z AES, pri čemer je vaše geslo ključ.",
|
||||
"intro-l3": "Za več informacij si oglejte",
|
||||
"backup-title-setup": "Ustvari Varnostno Kopijo",
|
||||
"backup-title-update": "Posodobi Varnostno Kopijo",
|
||||
"password-label-setup": "Izberi Geslo",
|
||||
"password-label-update": "Vnesite Geslo",
|
||||
"backup-button-setup": "Varnosto Kopiraj",
|
||||
"backup-button-update": "Posodobi Varnostno Kopijo",
|
||||
"backup-id-label": "Vaš Obnovitveni ID",
|
||||
"backup-id-note": "To se uporabi za obnovitev iz varnostnih kopij pozneje. Zato ga skupaj z geslom hranite na varnem.",
|
||||
"restore-title": "Obnovite Varnostno Kopijo",
|
||||
"restore-id-label": "Obnovitveni ID",
|
||||
"restore-password-label": "Geslo",
|
||||
"restore-button": "Obnovi",
|
||||
"backup-missing-password": "Vnesite geslo",
|
||||
"backup-error-unknown": "Zahteve ni mogoče obdelati",
|
||||
"backup-error-password": "Napačno geslo. Prosim vnesite vaše trenutno geslo.",
|
||||
"backup-success-msg": "Uspešno Zaključeno",
|
||||
"restore-success-msg": "Konfiguracija Uspešno Obnovljena"
|
||||
},
|
||||
"menu": {
|
||||
"sametab": "Odpri v Trenutnem Zavihku",
|
||||
"newtab": "Odpri v Novem Zavihku",
|
||||
"modal": "Odpri v Pojavnem Oknu",
|
||||
"workspace": "Odpri v Delovnem Pogledu"
|
||||
}
|
||||
}
|
|
@ -5,19 +5,19 @@
|
|||
<ul>
|
||||
<li @click="launch('sametab')">
|
||||
<SameTabOpenIcon />
|
||||
<span>Open in Current Tab</span>
|
||||
<span>{{ $t('menu.sametab') }}</span>
|
||||
</li>
|
||||
<li @click="launch('newtab')">
|
||||
<NewTabOpenIcon />
|
||||
<span>Open in New Tab</span>
|
||||
<span>{{ $t('menu.newtab') }}</span>
|
||||
</li>
|
||||
<li @click="launch('modal')">
|
||||
<IframeOpenIcon />
|
||||
<span>Open in Pop-Up Modal</span>
|
||||
<span>{{ $t('menu.modal') }}</span>
|
||||
</li>
|
||||
<li @click="launch('workspace')">
|
||||
<WorkspaceOpenIcon />
|
||||
<span>Open in Workspace View</span>
|
||||
<span>{{ $t('menu.workspace') }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<a @click="itemOpened"
|
||||
@mouseup.right="openContextMenu"
|
||||
@contextmenu.prevent
|
||||
:href="target !== 'modal' ? url : '#'"
|
||||
:href="(target !== 'modal' && target !== 'workspace') ? url : '#'"
|
||||
:target="target === 'newtab' ? '_blank' : ''"
|
||||
:class="`item ${!icon? 'short': ''} size-${itemSize}`"
|
||||
v-tooltip="getTooltipOptions()"
|
||||
|
@ -100,6 +100,8 @@ export default {
|
|||
if (e.altKey || this.target === 'modal') {
|
||||
e.preventDefault();
|
||||
this.$emit('triggerModal', this.url);
|
||||
} else if (this.target === 'workspace') {
|
||||
router.push({ name: 'workspace', query: { url: this.url } });
|
||||
} else {
|
||||
this.$emit('itemClicked');
|
||||
}
|
||||
|
|
|
@ -1,10 +1,19 @@
|
|||
<template>
|
||||
<div class="item-icon">
|
||||
<!-- Font-Awesome Icon -->
|
||||
<i v-if="iconType === 'font-awesome'" :class="`${icon} ${size}`" ></i>
|
||||
<!-- Emoji Icon -->
|
||||
<i v-else-if="iconType === 'emoji'" :class="`emoji-icon ${size}`" >{{getEmoji(iconPath)}}</i>
|
||||
<!-- Material Design Icon -->
|
||||
<span v-else-if="iconType === 'mdi'" :class=" `mdi ${icon} ${size}`"></span>
|
||||
<!-- Simple-Icons -->
|
||||
<object v-else-if="iconType === 'si'" :class="`simple-icons ${size}`"
|
||||
type="image/svg+xml" :data="getSimpleIcon(icon)"></object>
|
||||
<!-- Standard image asset icon -->
|
||||
<img v-else-if="icon" :src="iconPath" @error="imageNotFound"
|
||||
:class="`tile-icon ${size} ${broken ? 'broken' : ''}`"
|
||||
/>
|
||||
<!-- Icon could not load/ broken url -->
|
||||
<BrokenImage v-if="broken" class="missing-image" />
|
||||
</div>
|
||||
</template>
|
||||
|
@ -12,7 +21,7 @@
|
|||
<script>
|
||||
import BrokenImage from '@/assets/interface-icons/broken-icon.svg';
|
||||
import ErrorHandler from '@/utils/ErrorHandler';
|
||||
import { faviconApi as defaultFaviconApi, faviconApiEndpoints } from '@/utils/defaults';
|
||||
import { faviconApi as defaultFaviconApi, faviconApiEndpoints, iconCdns } from '@/utils/defaults';
|
||||
import EmojiUnicodeRegex from '@/utils/EmojiUnicodeRegex';
|
||||
import emojiLookup from '@/utils/emojis.json';
|
||||
|
||||
|
@ -28,17 +37,18 @@ export default {
|
|||
BrokenImage,
|
||||
},
|
||||
computed: {
|
||||
/* Determines the type of icon */
|
||||
iconType: function iconType() {
|
||||
return this.determineImageType(this.icon);
|
||||
},
|
||||
/* Gets the icon path, dependent on icon type */
|
||||
iconPath: function iconPath() {
|
||||
return this.getIconPath(this.icon, this.url);
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
broken: false,
|
||||
// faviconApi: this.config.appConfig.faviconApi || defaultFaviconApi,
|
||||
broken: false, // If true, was unable to resolve icon
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
|
@ -80,7 +90,7 @@ export default {
|
|||
getFavicon(fullUrl) {
|
||||
if (this.shouldUseDefaultFavicon(fullUrl)) { // Check if we should use local icon
|
||||
const urlParts = fullUrl.split('/');
|
||||
if (urlParts.length >= 2) return `${urlParts[0]}/${urlParts[1]}/${urlParts[2]}/favicon.ico`;
|
||||
if (urlParts.length >= 2) return `${urlParts[0]}/${urlParts[1]}/${urlParts[2]}/${iconCdns.faviconName}`;
|
||||
} else if (fullUrl.includes('http')) { // Service is running publicly
|
||||
const host = this.getHostName(fullUrl);
|
||||
const faviconApi = this.config.appConfig.faviconApi || defaultFaviconApi;
|
||||
|
@ -95,11 +105,18 @@ export default {
|
|||
const isLocalIP = /(127\.)|(192\.168\.)|(10\.)|(172\.1[6-9]\.)|(172\.2[0-9]\.)|(172\.3[0-1]\.)|(::1$)|([fF][cCdD])|(localhost)/;
|
||||
return (isLocalIP.test(fullUrl) || this.config.appConfig.faviconApi === 'local');
|
||||
},
|
||||
/* Fetches the path of local images, from Docker container */
|
||||
getLocalImagePath(img) {
|
||||
return `/item-icons/${img}`;
|
||||
return `${iconCdns.localPath}/${img}`;
|
||||
},
|
||||
/* Formats the URL for fetching the generative icons */
|
||||
getGenerativeIcon(url) {
|
||||
return `https://ipsicon.io/${this.getHostName(url)}.svg`;
|
||||
return `${iconCdns.generative}/${this.getHostName(url)}.svg`;
|
||||
},
|
||||
/* Formats the URL for getting Simple-Icons SVG asset */
|
||||
getSimpleIcon(img) {
|
||||
const imageName = img.replace('si-', '');
|
||||
return `${iconCdns.si}/${imageName}.svg`;
|
||||
},
|
||||
/* Checks if the icon is from a local image, remote URL, SVG or font-awesome */
|
||||
getIconPath(img, url) {
|
||||
|
@ -108,8 +125,10 @@ export default {
|
|||
case 'img': return this.getLocalImagePath(img);
|
||||
case 'favicon': return this.getFavicon(url);
|
||||
case 'generative': return this.getGenerativeIcon(url);
|
||||
case 'svg': return img;
|
||||
case 'emoji': return img;
|
||||
case 'mdi': return img; // Material design icons
|
||||
case 'simple-icons': return this.getSimpleIcon(img);
|
||||
case 'svg': return img; // Local SVG icon
|
||||
case 'emoji': return img; // Emoji/ unicode
|
||||
default: return '';
|
||||
}
|
||||
},
|
||||
|
@ -121,12 +140,15 @@ export default {
|
|||
else if (this.isUrl(img)) imgType = 'url';
|
||||
else if (this.isImage(img)) imgType = 'img';
|
||||
else if (img.includes('fa-')) imgType = 'font-awesome';
|
||||
else if (img.includes('mdi-')) imgType = 'mdi';
|
||||
else if (img.includes('si-')) imgType = 'si';
|
||||
else if (img === 'favicon') imgType = 'favicon';
|
||||
else if (img === 'generative') imgType = 'generative';
|
||||
else if (this.isEmoji(img).isEmoji) imgType = 'emoji';
|
||||
else imgType = 'none';
|
||||
return imgType;
|
||||
},
|
||||
/* For a given URL, return the hostname only. Used for favicon and generative icons */
|
||||
getHostName(url) {
|
||||
try { return new URL(url).hostname; } catch (e) { return url; }
|
||||
},
|
||||
|
@ -140,6 +162,7 @@ export default {
|
|||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
/* Default Image Icon */
|
||||
.tile-icon {
|
||||
width: 2rem;
|
||||
// filter: var(--item-icon-transform);
|
||||
|
@ -152,7 +175,8 @@ export default {
|
|||
width: 3rem;
|
||||
}
|
||||
}
|
||||
i.fas, i.fab, i.far, i.fal, i.fad {
|
||||
/* Font-Awesome and Material Design Icons */
|
||||
i.fas, i.fab, i.far, i.fal, i.fad, span.mdi {
|
||||
font-size: 2rem;
|
||||
color: currentColor;
|
||||
margin: 1px 4px;
|
||||
|
@ -163,6 +187,9 @@ export default {
|
|||
font-size: 2.5rem;
|
||||
}
|
||||
}
|
||||
span.mdi {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
object.tile-icon {
|
||||
width: 55px;
|
||||
height: 55px;
|
||||
|
@ -170,6 +197,13 @@ export default {
|
|||
fill: currentColor;
|
||||
}
|
||||
}
|
||||
/* Simple Icons */
|
||||
object.simple-icons {
|
||||
width: 2rem;
|
||||
&.small { width: 1.5rem; }
|
||||
&.large { width: 2.5rem; }
|
||||
}
|
||||
/* Emoji Icons */
|
||||
i.emoji-icon {
|
||||
font-style: normal;
|
||||
font-size: 2rem;
|
||||
|
@ -181,6 +215,7 @@ export default {
|
|||
font-size: 2.5rem;
|
||||
}
|
||||
}
|
||||
/* Icon Not Found */
|
||||
.missing-image {
|
||||
width: 3.5rem;
|
||||
path {
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
<template>
|
||||
<div class="multi-taking-view" ref="container"></div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Vue from 'vue';
|
||||
import WebContent from '@/components/Workspace/WebContent';
|
||||
|
||||
export default {
|
||||
name: 'WebContent',
|
||||
props: {
|
||||
url: String, // The URL of currently visible app
|
||||
},
|
||||
data: () => ({
|
||||
openApps: [], // List of all currently open apps
|
||||
}),
|
||||
watch: {
|
||||
/* Update the currently open app, when URL changes */
|
||||
url() { this.launchApp(); },
|
||||
},
|
||||
methods: {
|
||||
/* Check if app already open or not, and call appropriate opener */
|
||||
launchApp() {
|
||||
if (this.openApps.includes(this.url)) {
|
||||
this.openExistingApp();
|
||||
} else {
|
||||
this.openApps.push(this.url);
|
||||
this.appendNewApp();
|
||||
}
|
||||
},
|
||||
/* Opens a new app */
|
||||
appendNewApp() {
|
||||
const ComponentClass = Vue.extend(WebContent);
|
||||
const instance = new ComponentClass({
|
||||
propsData: { url: this.url, id: btoa(this.url) },
|
||||
});
|
||||
instance.$mount(); // pass nothing
|
||||
this.$refs.container.appendChild(instance.$el);
|
||||
},
|
||||
/* Switches visibility to an already open app */
|
||||
openExistingApp() {
|
||||
Array.from(document.getElementsByClassName('web-content')).forEach((frame) => {
|
||||
frame.classList.add('hide');
|
||||
});
|
||||
document.getElementById(btoa(this.url)).classList.remove('hide');
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
iframe {
|
||||
position: absolute;
|
||||
left: var(--side-bar-width);
|
||||
height: calc(100% - var(--header-height));
|
||||
width: calc(100% - var(--side-bar-width));
|
||||
border: none;
|
||||
background: white;
|
||||
}
|
||||
|
||||
</style>
|
|
@ -44,8 +44,6 @@ export default {
|
|||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@/styles/media-queries.scss';
|
||||
@import '@/styles/style-helpers.scss';
|
||||
|
||||
div.side-bar-item {
|
||||
color: var(--side-bar-color);
|
||||
|
@ -56,8 +54,10 @@ div.side-bar-item {
|
|||
border: none;
|
||||
box-shadow: none;
|
||||
p.small-title {
|
||||
margin: 0.1rem auto;
|
||||
margin: 0.1rem 0 0 -0.5rem;
|
||||
font-size: 0.6rem;
|
||||
transform: rotate(-25deg);
|
||||
padding: 0.5rem 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<template>
|
||||
<div class="web-content">
|
||||
<div class="web-content" :id="id">
|
||||
<iframe :src="url" />
|
||||
</div>
|
||||
</template>
|
||||
|
@ -10,13 +10,15 @@ export default {
|
|||
name: 'WebContent',
|
||||
props: {
|
||||
url: String,
|
||||
id: {
|
||||
type: String,
|
||||
default: 'web-app-view',
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@/styles/media-queries.scss';
|
||||
@import '@/styles/style-helpers.scss';
|
||||
|
||||
iframe {
|
||||
position: absolute;
|
||||
|
@ -27,4 +29,8 @@ iframe {
|
|||
background: white;
|
||||
}
|
||||
|
||||
.web-content.hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
@ -239,6 +239,11 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"enableMultiTasking": {
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
"description": "If set to true, will keep apps opened in the workspace open in the background. Useful for switching between sites, but comes at the cost of performance"
|
||||
},
|
||||
"allowConfigEdit": {
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
|
|
|
@ -131,6 +131,15 @@ module.exports = {
|
|||
allesedv: 'https://f1.allesedv.com/128/$URL',
|
||||
webmasterapi: 'https://api.webmasterapi.com/v1/favicon/yEwx0ZFs0CSPshHq/$URL',
|
||||
},
|
||||
/* The URL to CDNs used for external icons. These are only loaded when required */
|
||||
iconCdns: {
|
||||
fa: 'https://kit.fontawesome.com',
|
||||
mdi: 'https://cdn.jsdelivr.net/npm/@mdi/font@5.9.55/css/materialdesignicons.min.css',
|
||||
si: 'https://unpkg.com/simple-icons@v5/icons',
|
||||
generative: 'https://ipsicon.io',
|
||||
localPath: '/item-icons',
|
||||
faviconName: 'favicon.ico',
|
||||
},
|
||||
/* Available built-in colors for the theme builder */
|
||||
swatches: [
|
||||
['#eb5cad', '#985ceb', '#5346f3', '#5c90eb'],
|
||||
|
|
|
@ -3,6 +3,7 @@ import en from '@/assets/locales/en.json';
|
|||
import de from '@/assets/locales/de.json';
|
||||
import nl from '@/assets/locales/nl.json';
|
||||
import fr from '@/assets/locales/fr.json';
|
||||
import sl from '@/assets/locales/sl.json';
|
||||
|
||||
// Language data - Add your country name, locale code and imported file here
|
||||
export const languages = [
|
||||
|
@ -30,6 +31,12 @@ export const languages = [
|
|||
locale: fr,
|
||||
flag: '🇲🇫',
|
||||
},
|
||||
{
|
||||
name: 'Slovenian',
|
||||
code: 'sl',
|
||||
locale: sl,
|
||||
flag: '🇸🇮',
|
||||
},
|
||||
// Including:
|
||||
// name - Human readable name for your language (e.g German)
|
||||
// code - ISO language code (e.g. de)
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
|
||||
import SettingsContainer from '@/components/Settings/SettingsContainer.vue';
|
||||
import ItemGroup from '@/components/LinkItems/ItemGroup.vue';
|
||||
import Defaults, { localStorageKeys } from '@/utils/defaults';
|
||||
import Defaults, { localStorageKeys, iconCdns } from '@/utils/defaults';
|
||||
|
||||
export default {
|
||||
name: 'home',
|
||||
|
@ -160,16 +160,21 @@ export default {
|
|||
availibleThemes.Default = '#';
|
||||
return availibleThemes;
|
||||
},
|
||||
/* Checks if any of the icons are Font Awesome glyphs */
|
||||
checkIfFontAwesomeNeeded() {
|
||||
/* Checks if any sections or items use icons from a given CDN */
|
||||
checkIfIconLibraryNeeded(prefix) {
|
||||
let isNeeded = false;
|
||||
if (!this.sections) return false;
|
||||
this.sections.forEach((section) => {
|
||||
if (section.icon && section.icon.includes('fa-')) isNeeded = true;
|
||||
if (section.icon && section.icon.includes(prefix)) isNeeded = true;
|
||||
section.items.forEach((item) => {
|
||||
if (item.icon && item.icon.includes('fa-')) isNeeded = true;
|
||||
if (item.icon && item.icon.includes(prefix)) isNeeded = true;
|
||||
});
|
||||
});
|
||||
return isNeeded;
|
||||
},
|
||||
/* Checks if any of the icons are Font Awesome glyphs */
|
||||
checkIfFontAwesomeNeeded() {
|
||||
let isNeeded = this.checkIfIconLibraryNeeded('fa-');
|
||||
const currentTheme = localStorage[localStorageKeys.THEME]; // Some themes require FA
|
||||
if (['material', 'material-dark'].includes(currentTheme)) isNeeded = true;
|
||||
return isNeeded;
|
||||
|
@ -179,10 +184,23 @@ export default {
|
|||
if (this.appConfig.enableFontAwesome || this.checkIfFontAwesomeNeeded()) {
|
||||
const fontAwesomeScript = document.createElement('script');
|
||||
const faKey = this.appConfig.fontAwesomeKey || Defaults.fontAwesomeKey;
|
||||
fontAwesomeScript.setAttribute('src', `https://kit.fontawesome.com/${faKey}.js`);
|
||||
fontAwesomeScript.setAttribute('src', `${iconCdns.fa}/${faKey}.js`);
|
||||
document.head.appendChild(fontAwesomeScript);
|
||||
}
|
||||
},
|
||||
/* Checks if any of the icons are Material Design Icons */
|
||||
checkIfMdiNeeded() {
|
||||
return this.checkIfIconLibraryNeeded('mdi-');
|
||||
},
|
||||
/* Injects Material Design Icons, only if needed */
|
||||
initiateMaterialDesignIcons() {
|
||||
if (this.checkIfMdiNeeded()) {
|
||||
const mdiStylesheet = document.createElement('link');
|
||||
mdiStylesheet.setAttribute('rel', 'stylesheet');
|
||||
mdiStylesheet.setAttribute('href', iconCdns.mdi);
|
||||
document.head.appendChild(mdiStylesheet);
|
||||
}
|
||||
},
|
||||
/* Returns true if there is more than 1 sub-result visible during searching */
|
||||
checkIfResults() {
|
||||
if (!this.sections) return false;
|
||||
|
@ -204,6 +222,7 @@ export default {
|
|||
},
|
||||
mounted() {
|
||||
this.initiateFontAwesome();
|
||||
this.initiateMaterialDesignIcons();
|
||||
this.layout = this.layoutOrientation;
|
||||
this.itemSizeBound = this.iconSize;
|
||||
},
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
<template>
|
||||
<div class="work-space">
|
||||
<SideBar :sections="sections" @launch-app="launchApp" />
|
||||
<WebContent :url="url" />
|
||||
<WebContent :url="url" v-if="!isMultiTaskingEnabled" />
|
||||
<MultiTaskingWebComtent :url="url" v-else />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -9,6 +10,7 @@
|
|||
|
||||
import SideBar from '@/components/Workspace/SideBar';
|
||||
import WebContent from '@/components/Workspace/WebContent';
|
||||
import MultiTaskingWebComtent from '@/components/Workspace/MultiTaskingWebComtent';
|
||||
import Defaults from '@/utils/defaults';
|
||||
import { GetTheme, ApplyLocalTheme, ApplyCustomVariables } from '@/utils/ThemeHelper';
|
||||
|
||||
|
@ -24,9 +26,15 @@ export default {
|
|||
ApplyLocalTheme,
|
||||
ApplyCustomVariables,
|
||||
}),
|
||||
computed: {
|
||||
isMultiTaskingEnabled() {
|
||||
return this.appConfig.enableMultiTasking || false;
|
||||
},
|
||||
},
|
||||
components: {
|
||||
SideBar,
|
||||
WebContent,
|
||||
MultiTaskingWebComtent,
|
||||
},
|
||||
methods: {
|
||||
launchApp(url) {
|
||||
|
|
28
yarn.lock
28
yarn.lock
|
@ -1895,7 +1895,7 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.6:
|
|||
json-schema-traverse "^0.4.1"
|
||||
uri-js "^4.2.2"
|
||||
|
||||
ajv@^8.0.1, ajv@^8.5.0:
|
||||
ajv@^8.0.1:
|
||||
version "8.6.1"
|
||||
resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.1.tgz#ae65764bf1edde8cd861281cda5057852364a295"
|
||||
integrity sha512-42VLtQUOLefAvKFAQIxIZDaThq6om/PrfP0CYk3/vn+y4BMNkKnbli8ON2QCiHov4KkzOSJ/xSoBJdayiiYvVQ==
|
||||
|
@ -1905,6 +1905,16 @@ ajv@^8.0.1, ajv@^8.5.0:
|
|||
require-from-string "^2.0.2"
|
||||
uri-js "^4.2.2"
|
||||
|
||||
ajv@^8.6.2:
|
||||
version "8.6.2"
|
||||
resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571"
|
||||
integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==
|
||||
dependencies:
|
||||
fast-deep-equal "^3.1.1"
|
||||
json-schema-traverse "^1.0.0"
|
||||
require-from-string "^2.0.2"
|
||||
uri-js "^4.2.2"
|
||||
|
||||
alphanum-sort@^1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
|
||||
|
@ -3300,10 +3310,10 @@ crypto-browserify@^3.11.0:
|
|||
randombytes "^2.0.0"
|
||||
randomfill "^1.0.3"
|
||||
|
||||
crypto-js@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.0.0.tgz#2904ab2677a9d042856a2ea2ef80de92e4a36dcc"
|
||||
integrity sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==
|
||||
crypto-js@^4.1.1:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf"
|
||||
integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==
|
||||
|
||||
crypto-random-string@^2.0.0:
|
||||
version "2.0.0"
|
||||
|
@ -9785,10 +9795,10 @@ vue-router@^3.0.3:
|
|||
resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.5.2.tgz#5f55e3f251970e36c3e8d88a7cd2d67a350ade5c"
|
||||
integrity sha512-807gn82hTnjCYGrnF3eNmIw/dk7/GE4B5h69BlyCK9KHASwSloD1Sjcn06zg9fVG4fYH2DrsNBZkpLtb25WtaQ==
|
||||
|
||||
vue-select@^3.11.2:
|
||||
version "3.11.2"
|
||||
resolved "https://registry.yarnpkg.com/vue-select/-/vue-select-3.11.2.tgz#3ef93e3f2707e133c2df0b2920a05eea78764d18"
|
||||
integrity sha512-pIOcY8ajWNSwg8Ns4eHVr5ZWwqKCSZeQRymTnlUI8i+3QiQXF6JIM4lylK6mVfbccs4S6vOyxB7zmJBpp7tDUg==
|
||||
vue-select@^3.12.1:
|
||||
version "3.12.2"
|
||||
resolved "https://registry.yarnpkg.com/vue-select/-/vue-select-3.12.2.tgz#b0dd89233d673dcbee567418667b1bfd5c139b64"
|
||||
integrity sha512-KWIXQ50pC+B1wpBmaUXwuHm8yevPIL8YsZin9Hi2qCdK7C0KMbztRk6adgpIJ99bqaiccrGFQIPuXsuUNeegPw==
|
||||
|
||||
vue-style-loader@^4.1.0, vue-style-loader@^4.1.2:
|
||||
version "4.1.3"
|
||||
|
|
Loading…
Reference in New Issue