Skip to main content

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 Dev Environment#

Prerequisites#

You 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#

  1. Get Code: git clone https://github.com/Lissy93/dashy.git
  2. Navigate into the directory: cd dashy
  3. Install dependencies: yarn
  4. 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#

  • yarn dev - Starts the development server with hot reloading
  • yarn build - Builds the project for production, and outputs it into ./dist
  • yarn start - Starts a web server, and serves up the production site from ./dist
  • yarn validate-config - Parses and validates your conf.yml against Dashy's schema
  • yarn lint - Lints code to ensure it follows a consistent, neat style
  • yarn test - Runs tests, and outputs results

There is also:

  • yarn build-and-start will run yarn build and yarn start
  • yarn build-watch will output contents to ./dist and recompile when anything in ./src is modified, you can then use either yarn start or your own server, to have a production environment that watches for changes.

Using the Vue CLI:

  • The app is build with Vue, and uses the Vue-CLI Service for basic commands.
  • If you have NPX installed, then you can invoke the Vue CLI binary using npx vue-cli-service [command]
  • Vue also has a GUI environment that can be used for basic project management, and may be useful for beginners, this can be started by running vue ui, and opening up http://localhost:8000

Note:

  • If you are using NPM, replace yarn with npm run
  • If you are using Docker, precede each command with docker exec -it [container-id]. Container ID can be found by running docker ps

Environmental Variables#

All 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 within your local development environment using a .env file.

Any environmental variables used by the frontend are preceded with VUE_APP_. Vue will merge the contents of your .env file into the app in a similar way to the 'dotenv' package, where any variables that you set on your system will always take preference over the contents of any .env file.

  • PORT - The port in which the application will run (defaults to 4000 for the Node.js server, and 80 within the Docker container)
  • NODE_ENV - Which environment to use, either production, development or test
  • VUE_APP_DOMAIN - The URL where Dashy is going to be accessible from. This should include the protocol, hostname and (if not 80 or 443), then the port too, e.g. https://localhost:3000, http://192.168.1.2:4002 or https://dashy.mydomain.com

If you do add new variables, ensure that there is always a fallback (define it in defaults.js), so as to not cause breaking changes. Don't commit your .env file to git, but instead take a few moments to document what you've added under the appropriate section. Try and follow the concepts outlined in the 12 factor app.

Environment Modes#

You can set the environment using the NODE_ENV variable. The correct environment will be selected based on the script you run by default The following environments are supported.

  • production
  • development
  • test

For more info, see Vue CLI Environment Modes.


Git Strategy#

Git Flow#

Like most Git repos, we are following the Github Flow standard.

  1. Create a branch (or fork if you don'd have write acces)
  2. Code some awesome stuff, then add and commit your changes
  3. Create a Pull Request, complete the checklist and ensure the build succeeds
  4. Follow up with any reviews on your code
  5. Merge ๐ŸŽ‰

Git Branch Naming#

The 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 Emojis#

Using 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 Guidelines#

Once 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 Beginners#

New 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:

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).


Style Guide#

Linting is done using ESLint, and using the Vue.js Styleguide, which is very similar to the AirBnB Stylguide. 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:


Application Structure#

Directory 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โ”œโ”€โ”€ 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โ•ฏ

Frontend Source: ./src/#

./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โ”‚  โ”œโ”€โ”€ Configuration              # Components relating to the user config pop-upโ”‚  โ”‚  โ”œโ”€โ”€ AppInfoModal.vue        # A modal showing core app info, like version, language, etcโ”‚  โ”‚  โ”œโ”€โ”€ 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โ”‚  โ”‚  โ•ฐโ”€โ”€ Input.vue               # Standard text field input componentโ”‚  โ”œโ”€โ”€ LinkItems                  # Components for Sections and Link Itemsโ”‚  โ”‚  โ”œโ”€โ”€ Collapsable.vue         # The collapsible functionality of sectionsโ”‚  โ”‚  โ”œโ”€โ”€ ContextMenu.vue         # The right-click menu, for showing Item opening methods and infoโ”‚  โ”‚  โ”œโ”€โ”€ 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 โ”‚  โ”‚  โ•ฐโ”€โ”€ StatusIndicator.vue     # Traffic light dot, showing if app is online or downโ”‚  โ”œโ”€โ”€ 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โ”‚  โ•ฐโ”€โ”€ 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โ”œโ”€โ”€ utils                         # Directory of re-used helper functionsโ”‚  โ”œโ”€โ”€ ArrowKeyNavigation.js      # Functionality for arrow-key navigationโ”‚  โ”œโ”€โ”€ Auth.js                    # Handles all authentication related actionsโ”‚  โ”œโ”€โ”€ ClickOutside.js            # A directive for detecting click, used to hide dropdown, modal or context menuโ”‚  โ”œโ”€โ”€ ConfigAccumulator.js       # Central place for managing and combining configโ”‚  โ”œโ”€โ”€ 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โ”‚  โ”œโ”€โ”€ ConfigValidator.js         # A helper script that validates the config file against schemaโ”‚  โ”œโ”€โ”€ defaults.js                # Global constants and their default valuesโ”‚  โ”œโ”€โ”€ ErrorHandler.js            # Helper function called when an error is returnedโ”‚  โ”œโ”€โ”€ JsonToYaml.js              # Function that parses and converts raw JSON into valid YAMLโ”‚  โ”œโ”€โ”€ 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

Frontend Components#

All frontend code is located in the ./src directory, which is split into 5 sub-folders:

  • Components - All frontend web components are located here. Each component should have a distinct, well defined and simple task, and ideally should not be too long. The components directory is organised into a series of sub-directories, representing a specific area of the application
    • PageStrcture - Components relating to overall page structure (nav, footer, etc)
    • FormElements - Reusable form elements (button, input field, etc)
    • LinkItems - Components relating to Dashy's sections and items (item group, item, item icon, etc)
    • Configuration - Components relating to Dashy's configuration forms (cloud backup, JSON editor, etc)
  • Views - Each view directly corresponds to a route (defined in the router), and in effectively a page. They should have minimal logic, and just contain a few components
  • Utils - These are helper functions, or logic that is used within the app does not include an UI elements
  • Styles - Any SCSS that is used globally throughout that app, and is not specific to a single component goes here. This includes variables, color themes, typography settings, CSS reset and media queries
  • Assets - Static assets that need to be bundled into the application, but do not require any manipulation go here. This includes interface icons and fonts

The structure of the components directory is similar to that of the frontend application layout


Development Tools#

Performance - Lighthouse#

The 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 - BundlePhobia#

BundlePhobia is a really useful app that lets you analyze the cost of adding any particular dependency to an application


Notes#

Known Warnings#

When 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.

glob-parent Security Alert - This will be fixed soon. The version of glob-parent that is used by the latest version of Vue-CLI has a security issue associated with it. I am waiting on Vue to update their dependencies.