Developing
This article outlines how to get Dashy running in a development environment, and outlines the basics of the architecture. If you're adding new features, you may want to check out the Development Guides docs, for tutorials covering basic tasks.
- Setting up the Development Environment
- Git Strategy
- Resources for Beginners
- App Info
- Code Style Guide
- Application Structure
- Development Tools
- Misc / Notes
#
Setting up the Dev Environment#
PrerequisitesYou will need either the latest or LTS version of Node.js to build and serve the application and Git to easily fetch the code, and push any changes. If you plan on running or deploying the container, you'll also need Docker. To avoid any unexpected issues, ensure you've got at least NPM V 7.5 or Yarn 1.22 (you may find NVM helpful for switching/ managing versions).
#
Running the Project- Get Code:
git clone https://github.com/Lissy93/dashy.git
- Navigate into the directory:
cd dashy
- Install dependencies:
yarn
- Start dev server:
yarn dev
Dashy should now be being served on http://localhost:8080/. Hot reload is enabled, so making changes to any of the files will trigger them to be rebuilt and the page refreshed.
#
Project Commands#
Basicsyarn build
- In the interest of speed, the application is pre-compiled, this means that the config file is read during build-time, and therefore the app needs to rebuilt for any new changes to take effect. Luckily this is very straight forward. Just runyarn build
ordocker exec -it [container-id] yarn build
yarn start
- Starts a web server, and serves up the production site from./dist
(must run build command first)
#
Developmentyarn dev
- Starts the development server with hot reloadingyarn lint
- Lints code to ensure it follows a consistent, neat styleyarn test
- Runs tests, and outputs results
#
Utils and Checksyarn validate-config
- If you have quite a long configuration file, you may wish to check that it's all good to go, before deploying the app. This can be done withyarn validate-config
ordocker exec -it [container-id] yarn validate-config
. Your config file needs to be in/user-data/conf.yml
(or within your Docker container at/app/user-data/conf.yml
). This will first check that your YAML is valid, and then validates it against Dashy's schema.yarn health-check
- Checks that the application is up and running on it's specified port, and outputs current status and response times. Useful for integrating into your monitoring service, if you need to maintain high system availability
#
Alternate Start Commandsyarn build-and-start
- Builds the app, runs checks and starts the production server. Commands are run in parallel, and so is faster than running them in independently. Uses theyarn build
andyarn start
commandsyarn build-watch
- If you find yourself making frequent changes to your configuration, and do not want to have to keep manually rebuilding, then this option is for you. It will watch for changes to any files within the projects root, and then trigger a rebuild. Note that if you are developing new features, thenyarn dev
would be more appropriate, as it's significantly faster at recompiling (under 1 second), and has hot reloading, linting and testing integratedyarn pm2-start
- Starts the Node server using PM2, a process manager for Node.js applications, that helps them stay alive. PM2 has some built-in basic monitoring features, and an optional management solution. If you are running the app on bare metal, it is recommended to use this start command
#
Notes- If you are using NPM, replace
yarn
withnpm run
- If you are using Docker, precede each command with
docker exec -it [container-id]
. Container ID can be found by runningdocker ps
- You can manage the app using the Vue-CLI Service, with
npx vue-cli-service [command]
. Or to start the Vue Management UI, runnpx vue ui
, and openhttp://localhost:8000
#
Environmental VariablesAll environmental variables are optional. Currently there are not many environmental variables used, as most of the user preferences are stored under appConfig
in the conf.yml
file.
You can set variables either in your environment, or using the .env
file.
NODE_ENV
- Current environment, can be either development, production or testPORT
- The port to expose the running application onHOST
- The host that Dashy is running on, domain or IPBASE_URL
- The default base path for serving up static assetsVUE_APP_DOMAIN
- Usually the same as BASE_URL, but accessible in frontendINTEGRITY
- Should enable SRI for build script and link resourcesIS_DOCKER
- Computed automatically on build. Indicates if running in containerVUE_APP_VERSION
- Again, set automatically using package.json during build timeBACKUP_DIR
- Directory for conf.yml backups
#
Environment ModesYou can set the environment using the NODE_ENV
variable. By default, the correct environment should be selected based on the script you run to start the app. The following environments are supported: production
, development
and test
. For more info, see Vue CLI Environment Modes.
#
Git Strategy#
Git FlowLike most Git repos, we are following the Github Flow standard.
- Create a branch (or fork if you don'd have write access)
- Code some awesome stuff ๐งโ๐ป
- Add, commit and push your changes to your branch/ fork
- Head over to GitHub and create a Pull Request
- Fill in the required sections in the template, and hit submit
- Follow up with any reviews on your code
- Merge ๐
#
Git Branch NamingThe format of your branch name should be something similar to: [TYPE]/[TICKET]_[TITLE]
For example, FEATURE/420_Awesome-feature
or FIX/690_login-server-error
#
Commit EmojisUsing a single emoji at the start of each commit message, to indicate the type task, makes the commit ledger easier to understand, plus it looks cool.
- ๐จ
:art:
- Improve structure / format of the code. - โก๏ธ
:zap:
- Improve performance. - ๐ฅ
:fire:
- Remove code or files. - ๐
:bug:
- Fix a bug. - ๐๏ธ
:ambulance:
- Critical hotfix - โจ
:sparkles:
- Introduce new features. - ๐
:memo:
- Add or update documentation. - ๐
:rocket:
- Deploy stuff. - ๐
:lipstick:
- Add or update the UI and style files. - ๐
:tada:
- Begin a project. - โ
:white_check_mark:
- Add, update, or pass tests. - ๐๏ธ
:lock:
- Fix security issues. - ๐
:bookmark:
- Make a Release or Version tag. - ๐จ
:rotating_light:
- Fix compiler / linter warnings. - ๐ง
:construction:
- Work in progress. - โฌ๏ธ
:arrow_up:
- Upgrade dependencies. - ๐ท
:construction_worker:
- Add or update CI build system. - โป๏ธ
:recycle:
- Refactor code. - ๐ฉน
:adhesive_bandage:
- Simple fix for a non-critical issue. - ๐ง
:wrench:
- Add or update configuration files. - ๐ฑ
:bento:
- Add or update assets. - ๐๏ธ
:card_file_box:
- Perform database schema related changes. - โ๏ธ
:pencil2:
- Fix typos. - ๐
:globe_with_meridians:
- Internationalization and translations.
For a full list of options, see gitmoji.dev
#
PR GuidelinesOnce you've made your changes, and pushed them to your fork or branch, you're ready to open a pull request!
For a pull request to be merged, it must:
- Must be backwards compatible
- The build, lint and tests (run by GH actions) must pass
- There must not be any merge conflicts
When you submit your PR, include the required info, by filling out the PR template. Including:
- A brief description of your changes
- The issue, ticket or discussion number (if applicable)
- For UI relate updates include a screenshot
- If any dependencies were added, explain why it was needed, state the cost associated, and confirm it does not introduce any security issues
- Finally, check the checkboxes, to confirm that the standards are met, and hit submit!
#
Resources for BeginnersNew to Web Development? Glad you're here! Dashy is a pretty simple app, so it should make a good candidate for your first PR. Presuming that you already have a basic knowledge of JavaScript, the following articles should point you in the right direction for getting up to speed with the technologies used in this project:
- Open Source for Beginners
- Introduction to Vue.js
- Vue.js Walkthrough
- ES6 Features
- Definitive guide to SCSS
- Complete beginners guide to Docker
- Docker Classroom - Interactive Tutorials
- Quick start TypeScript guide
- Complete TypeScript tutorial series
- Using TypeScript with Vue.js
- Git cheat sheet
- Basics of using NPM
As well as Node, Git and Docker- you'll also need an IDE (e.g. VS Code or Vim) and a terminal (Windows users may find WSL more convenient).
#
App Info#
Style GuideLinting is done using ESLint, and using the Vue.js Styleguide, which is very similar to the AirBnB Styleguide. You can run yarn lint
to report and fix issues. While the dev server is running, issues will be reported to the console automatically, and any lint errors will trigger the build to fail. Note that all lint checks must pass before any PR can be merged. Linting is also run as a git pre-commit hook
The most significant things to note are:
- Indentation should be done with two spaces
- Strings should use single quotes
- All statements must end in a semi-colon
- The final element in all objects must be preceded with a comma
- Maximum line length is 100
- There must be exactly one blank line between sections, before function names, and at the end of the file
- With conditionals, put else on the same line as your if block's closing brace
- All multiline blocks must use braces
- Avoid console statements in the frontend
Styleguides:
- Vue: Vue styleguide
- JavaScript: github.com/airbnb/javascript
#
Application Structure./
#
Files in the Root: โฎโโโ package.json # Project meta-data, dependencies and paths to scriptsโโโ src/ # Project front-end source codeโโโ server.js # A Node.js server to serve up the /dist directoryโโโ services/ # All server-side endpoints and utilitiesโโโ vue.config.js # Vue.js configurationโโโ Dockerfile # The blueprint for building the Docker containerโโโ docker-compose.yml # A Docker run commandโโโ .env # Location for any environmental variablesโโโ yarn.lock # Auto-generated list of current packages and version numbersโโโ docs/ # Markdown documentationโโโ README.md # Readme, basic info for getting startedโโโ LICENSE.md # License for useโฏ
./src/
#
Frontend Source: ./srcโโโ App.vue # Vue.js starting fileโโโ assets # Static non-compiled assetsโ โโโ fonts # .ttf font filesโ โโโ locales # All app text, each language in a separate JSON fileโ โฐโโ interface-icons # SVG icons used in the appโโโ components # All front-end Vue web componentsโ โโโ Charts # Charting components for dynamically displaying widget dataโ โ โโโ Gauge.vue # A speed-dial style chart for showing 0 - 100 valuesโ โ โฐโโ PercentageChart.vue # A horizontal bar for showing percentage breakdownsโ โโโ Configuration # Components relating to the user config pop-upโ โ โโโ AppInfoModal.vue # A modal showing core app info, like version, language, etcโ โ โโโ AppVersion.vue # Shows current version from package.json, compares with GitHubโ โ โโโ CloudBackupRestore.vue # Form where the user manages cloud sync optionsโ โ โโโ ConfigContainer.vue # Main container, wrapping all other config componentsโ โ โโโ CustomCss.vue # Form where the user can input custom CSSโ โ โโโ EditSiteMeta.vue # Form where the user can edit site meta dataโ โ โโโ JsonEditor.vue # JSON editor, where the user can modify the main config fileโ โ โฐโโ RebuildApp.vue # A component allowing user to trigger a rebuild through the UIโ โโโ FormElements # Basic form elements used throughout the appโ โ โโโ Button.vue # Standard button componentโ โ โโโ Radio.vue # Standard radio button inputโ โ โโโ Select.vue # Standard dropdown input selectorโ โ โโโ Input.vue # Standard text field input componentโ โ โฐโโ Toggle.vue # Standard on / off toggle switchโ โโโ InteractiveEditor # Components for the interactive UI config editorโ โ โโโ AddNewSectionLauncher # Button that launches the EditSection form, used for adding new sectionโ โ โโโ EditAppConfig.vue # Form for editing appConfigโ โ โโโ EditPageInfo.vue # Form for editing pageInfoโ โ โโโ EditSection.vue # Form for adding / editing sectionsโ โ โโโ EditItem.vue # Form for adding or editing itemsโ โ โโโ EditModeSaveMenu.vue # The bar at the bottom of screen in edit mode, containing save buttonsโ โ โโโ EditModeTopBanner.vue # The bar at the top of screen in edit modeโ โ โโโ ExportConfigMenu.vue # Modal for viewing / exporting edited configโ โ โโโ MoveItemTo.vue # Form for moving / copying items to other sectionsโ โ โฐโโ SaveCancelButtons.vue # Buttons visible in all the edit menus, to save or cancel changesโ โโโ LinkItems # Components for Sections and Link Itemsโ โ โโโ Collapsable.vue # The collapsible functionality of sectionsโ โ โโโ IframeModal.vue # Pop-up iframe modal, for viewing websites within the appโ โ โโโ Item.vue # Main link item, which is displayed within an item groupโ โ โโโ ItemGroup.vue # Item group is a section containing iconsโ โ โโโ ItemIcon.vue # The icon used by both items and sectionsโ โ โโโ ItemOpenMethodIcon.vue # A small icon, visible on hover, indicating opening methodโ โ โโโ ItemContextMenu.vue # The right-click menu, for showing Item opening methods and infoโ โ โโโ SectionContextMenu.vue # The right-click menu, for showing Section edit/ open optionsโ โ โฐโโ StatusIndicator.vue # Traffic light dot, showing if app is online or downโ โโโ Minimal View # Components used for the startpage / minimal alternative viewโ โ โโโ MinimalHeading.vue # Title part of minimal viewโ โ โโโ MinimalSearch.vue # Search bar for minimal viewโ โ โฐโโ MinimalSection.vue # Tabbed-Item section for minimal viewโ โโโ PageStrcture # Components relating the main structure of the pageโ โ โโโ Footer.vue # Footer, visible at the bottom of all pagesโ โ โโโ Header.vue # Header, visible at the top of pages, and includes title and navโ โ โโโ LoadingScreen.vue # Splash screen shown on first loadโ โ โโโ Nav.vue # Navigation bar, includes a list of linksโ โ โฐโโ PageTitle.vue # Page title and sub-title, visible within the Headerโ โโโ Workspace # Components used for the multi-tasking/ Workspace viewโ โ โโโ MultiTaskingWeb.vue # When multi-tasking enabled, generates new iframeโ โ โโโ SideBar.vue # The left sidebar for the workspace viewโ โ โโโ SideBarItem.vue # App item for the sidebar viewโ โ โโโ SideBarSection.vue # Collapsible collection of items within workspace sidebarโ โ โโโ WebContent.vue # Workspace iframe view, displays content of current appโ โ โฐโโ WidgetView.vue # Workspace container for displaying widgets in main contentโ โโโ Widgets # Directory contains all custom widget componentsโ โ โฐโโ .... # Too many to list, see widget docs insteadโ โฐโโ Settings # Components relating to the quick-settings, in the top-rightโ โโโ AuthButtons.vue # Logout button and other app infoโ โโโ ConfigLauncher.vue # Icon that when clicked will launch the Configuration componentโ โโโ CustomThemeMaker.vue # Color pickers for letting user build their own themeโ โโโ ItemSizeSelector.vue # Set of buttons used to set and save item sizeโ โโโ KeyboardShortcutInfo.vue# Small pop-up displaying the available keyboard shortcutsโ โโโ LanguageSwitcher.vue # Dropdown in a modal for changing app languageโ โโโ LayoutSelector.vue # Set of buttons, letting the user select their desired layoutโ โโโ SearchBar.vue # The input field in the header, used for searching the appโ โโโ SettingsContainer.vue # Container that wraps all the quick-settings componentsโ โฐโโ ThemeSelector.vue # Drop-down menu enabling the user to select and change themesโโโ main.js # Main front-end entry pointโโโ registerServiceWorker.js # Registers and manages service workers, for PWA appsโโโ router.js # Defines all available application routesโโโ styles # Directory of all globally used common SCSS stylesโ โโโ color-palette.scss # All color variable names and default valuesโ โโโ color-themes.scss # All variable values for built-in themesโ โโโ dimensions.scss # Dimensions and sizes as variablesโ โโโ global-styles.scss # Basics and style resets used globallyโ โโโ media-queries.scss # Screen sizes and media queriesโ โโโ style-helpers.scss # SCSS functions used for modifying valuesโ โโโ typography.scss # Font and text styles used globallyโ โฐโโ user-defined-themes.scss # Empty, put any custom styles or themes hereโโโ mixins # Reusable component bases, extended by other views / componentsโ โโโ ChartingMixin.js # Functions for rendering charts in widget componentsโ โโโ GlancesMixin.js # Functions for fetching system info from Glances for widgetsโ โโโ HomeMixin.js # Functions for homepage, used by default, minimal and workspace viewsโ โฐโโ WidgetMixin.js # Functions for all widgets, like data fetching, updating and error handlingโโโ utils # Directory of re-used helper functionsโ โโโ ArrowKeyNavigation.js # Functionality for arrow-key navigationโ โโโ Auth.js # Handles all authentication related actionsโ โโโ CheckSectionVisibility.js # Checks which parts of the page should be visible/ hidden based on configโ โโโ ClickOutside.js # A directive for detecting click, used to hide dropdown, modal or context menuโ โโโ ConfigHelpers.js # Helper functions for managing configurationโ โโโ CloudBackup.js # Functionality for encrypting, processing and network callsโ โโโ ConfigSchema.json # The schema, used to validate the users conf.yml fileโ โโโ ConfigAccumulator.js # Central place for managing and combining configโ โโโ ConfigHelpers.json # Collection of helper functions to process config using accumulatorโ โโโ ConfigValidator.js # A helper script that validates the config file against schemaโ โโโ CoolConsole.js # Prints info, warning and error messages to browser console, with a cool styleโ โโโ defaults.js # Global constants and their default valuesโ โโโ emojis.json # List of emojis with unicode and shortcode, used for emoji icon featureโ โโโ EmojiUnicodeRegex.js # Regular expression to validate emoji unicode format, for emoji iconsโ โโโ ErrorHandler.js # Helper function called when an error is returnedโ โโโ InitServiceWorker.js # Initializes and manages service worker, if enabledโ โโโ Search.js # Helper functions for searching/ filtering items in all viewsโ โโโ JsonToYaml.js # Function that parses and converts raw JSON into valid YAMLโ โโโ KeycloakAuth.js # Singleton class to manage Keycloak authenticationโ โโโ languages.js # Handles fetching, switching and validating languagesโ โฐโโ ThemeHelper.js # Function that handles the fetching and setting of user themesโฐโโ views # Directory of available pages, corresponding to available routes โโโ Home.vue # The home page container โโโ About.vue # About page โโโ Login.vue # TAuthentication page โโโ Minimal.vue # The minimal view โฐโโ Workspace.vue # The workspace view with apps in sidebar
#
Visualisation of Source Directory#
Development Tools#
Performance - LighthouseThe easiest method of checking performance is to use Chromium's build in auditing tool, Lighthouse. To run the test, open Developer Tools (usually F12) --> Lighthouse and click on the 'Generate Report' button at the bottom.
#
Dependencies - BundlePhobiaBundlePhobia is a really useful app that lets you analyze the cost of adding any particular dependency to an application
#
Notes#
Known WarningsWhen running the build command, several warnings appear. These are not errors, and do not affect the security or performance of the application. They will be addressed in a future update
WARN A new version of sass-loader is available. Please upgrade for best experience.
- Currently we're using an older version of SASS loader, since the more recent releases do not seem to be compatible with the Vue CLI's webpack configuration.
WARN asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).
- For the PWA to support Windows 10, a splash screen asset is required, and is quite large. This throws a warning, however PWA assets are not loaded until needed, so shouldn't have any impact on application performance. A similar warning is thrown for the Raleway font, and that is looking to be addressed.