The Fleetbase Console, a vital component of the Fleetbase Platform, serves as the graphical user interface that facilitates interaction with all Fleetbase extensions. It's architecturally designed to be lightweight, primarily employing Ember Engines for its operational foundation. Ember Engines, a scalable development paradigm for ambitious web applications, allow the Console to dynamically load and manage extensions, ensuring a streamlined and efficient user experience.
+
+
The responsibilities of the Console are kept minimalistic to maintain its performance and agility. The Console's key responsibilities encompass administration management, configuration of organization and user settings, and establishing a robust connection to the Fleetbase extensions repository. In its administrative capacity, it provides an intuitive interface for configuring the Fleetbas instance.
+
+
Lastly, the Console plays a pivotal role in connecting to the Fleetbase extensions repository. This provides the flexibility to add, update, or remove extensions as per the organizational needs and preferences, all while ensuring the seamless operation and integrity of the Fleetbase Platform.
\ No newline at end of file
diff --git a/console/app/templates/auth/forgot-password.hbs b/console/app/templates/auth/forgot-password.hbs
new file mode 100644
index 00000000..08000eab
--- /dev/null
+++ b/console/app/templates/auth/forgot-password.hbs
@@ -0,0 +1,44 @@
+
+
+
+
+ {{if this.isSent "Almost done!" "Forgot your password?"}}
+
+
+
+ {{#if this.isSent}}
+
+
+
+
+
+ Check your email! We've sent you a magic link to your email which will allow you to reset your password. The link expires in 15 minutes.
+
+
+ {{else}}
+
+
+
+
+
+ Don't worry, we've got your back. Enter the email you use to login to {{t "app.name"}} and we will send you a secure link to reset your password.
+
+
+
+
+ {{/if}}
+
\ No newline at end of file
diff --git a/console/app/templates/auth/login.hbs b/console/app/templates/auth/login.hbs
new file mode 100644
index 00000000..54fdab8a
--- /dev/null
+++ b/console/app/templates/auth/login.hbs
@@ -0,0 +1,57 @@
+
+
+
+
+
+ Sign in to your account
+
+
+
+{{#if (gte this.failedAttempts 3)}}
+
+
+
+
+
+
+ Forgot your password? Click the button below to reset your password.
+
+
+
+
+{{/if}}
+
+
\ No newline at end of file
diff --git a/console/app/templates/auth/reset-password.hbs b/console/app/templates/auth/reset-password.hbs
new file mode 100644
index 00000000..24177f8b
--- /dev/null
+++ b/console/app/templates/auth/reset-password.hbs
@@ -0,0 +1,19 @@
+
+
+
+
+ Reset your password
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console.hbs b/console/app/templates/console.hbs
new file mode 100644
index 00000000..d21181db
--- /dev/null
+++ b/console/app/templates/console.hbs
@@ -0,0 +1,15 @@
+{{page-title "Console"}}
+
+
+
+
+
+
+
+
+
+ {{outlet}}
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console/account.hbs b/console/app/templates/console/account.hbs
new file mode 100644
index 00000000..1340ac5c
--- /dev/null
+++ b/console/app/templates/console/account.hbs
@@ -0,0 +1,18 @@
+{{page-title "Account"}}
+
+
+ Profile
+ {{#each this.universe.accountMenuItems as |menuItem|}}
+ {{menuItem.title}}
+ {{/each}}
+
+ {{#each this.universe.accountMenuPanels as |menuPanel|}}
+
+ {{#each menuPanel.items as |menuItem|}}
+ {{menuItem.title}}
+ {{/each}}
+
+ {{/each}}
+
+
+{{outlet}}
\ No newline at end of file
diff --git a/console/app/templates/console/account/index.hbs b/console/app/templates/console/account/index.hbs
new file mode 100644
index 00000000..472e6836
--- /dev/null
+++ b/console/app/templates/console/account/index.hbs
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console/account/virtual.hbs b/console/app/templates/console/account/virtual.hbs
new file mode 100644
index 00000000..46c367b6
--- /dev/null
+++ b/console/app/templates/console/account/virtual.hbs
@@ -0,0 +1,10 @@
+{{page-title @model.title}}
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console/admin.hbs b/console/app/templates/console/admin.hbs
new file mode 100644
index 00000000..0016e8d4
--- /dev/null
+++ b/console/app/templates/console/admin.hbs
@@ -0,0 +1,26 @@
+{{page-title "Admin"}}
+
+
+ Overview
+ Branding
+ {{#each this.universe.adminMenuItems as |menuItem|}}
+ {{menuItem.title}}
+ {{/each}}
+ {{#each this.universe.adminMenuPanels as |menuPanel|}}
+
+ {{#each menuPanel.items as |menuItem|}}
+ {{menuItem.title}}
+ {{/each}}
+
+ {{/each}}
+
+ Services
+ Mail
+ Filesystem
+ Queue
+ Socket
+ Notification Channels
+
+
+
+{{outlet}}
\ No newline at end of file
diff --git a/console/app/templates/console/admin/branding.hbs b/console/app/templates/console/admin/branding.hbs
new file mode 100644
index 00000000..a4aae904
--- /dev/null
+++ b/console/app/templates/console/admin/branding.hbs
@@ -0,0 +1,68 @@
+{{page-title "Branding"}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console/admin/config.hbs b/console/app/templates/console/admin/config.hbs
new file mode 100644
index 00000000..ce328715
--- /dev/null
+++ b/console/app/templates/console/admin/config.hbs
@@ -0,0 +1,2 @@
+{{page-title "System Configuration"}}
+{{outlet}}
\ No newline at end of file
diff --git a/console/app/templates/console/admin/config/cache.hbs b/console/app/templates/console/admin/config/cache.hbs
new file mode 100644
index 00000000..8ce6dc9b
--- /dev/null
+++ b/console/app/templates/console/admin/config/cache.hbs
@@ -0,0 +1,2 @@
+{{page-title "Cache"}}
+{{outlet}}
\ No newline at end of file
diff --git a/console/app/templates/console/admin/config/database.hbs b/console/app/templates/console/admin/config/database.hbs
new file mode 100644
index 00000000..1326ac5f
--- /dev/null
+++ b/console/app/templates/console/admin/config/database.hbs
@@ -0,0 +1,10 @@
+{{page-title "Database Configuration"}}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console/admin/config/filesystem.hbs b/console/app/templates/console/admin/config/filesystem.hbs
new file mode 100644
index 00000000..b47e1a70
--- /dev/null
+++ b/console/app/templates/console/admin/config/filesystem.hbs
@@ -0,0 +1,10 @@
+{{page-title "Filesystem Configuration"}}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console/admin/config/mail.hbs b/console/app/templates/console/admin/config/mail.hbs
new file mode 100644
index 00000000..0ab0d574
--- /dev/null
+++ b/console/app/templates/console/admin/config/mail.hbs
@@ -0,0 +1,10 @@
+{{page-title "Mail Configuration"}}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console/admin/config/notification-channels.hbs b/console/app/templates/console/admin/config/notification-channels.hbs
new file mode 100644
index 00000000..3df85758
--- /dev/null
+++ b/console/app/templates/console/admin/config/notification-channels.hbs
@@ -0,0 +1,10 @@
+{{page-title "Notification Channels Configuration"}}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console/admin/config/queue.hbs b/console/app/templates/console/admin/config/queue.hbs
new file mode 100644
index 00000000..f7454b1a
--- /dev/null
+++ b/console/app/templates/console/admin/config/queue.hbs
@@ -0,0 +1,10 @@
+{{page-title "Queue Configuration"}}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console/admin/config/services.hbs b/console/app/templates/console/admin/config/services.hbs
new file mode 100644
index 00000000..4e5a1645
--- /dev/null
+++ b/console/app/templates/console/admin/config/services.hbs
@@ -0,0 +1,10 @@
+{{page-title "Services Configuration"}}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console/admin/config/socket.hbs b/console/app/templates/console/admin/config/socket.hbs
new file mode 100644
index 00000000..86008a71
--- /dev/null
+++ b/console/app/templates/console/admin/config/socket.hbs
@@ -0,0 +1,10 @@
+{{page-title "Socket Configuration"}}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console/admin/index.hbs b/console/app/templates/console/admin/index.hbs
new file mode 100644
index 00000000..8109b2ab
--- /dev/null
+++ b/console/app/templates/console/admin/index.hbs
@@ -0,0 +1,14 @@
+{{page-title "Overview"}}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console/admin/virtual.hbs b/console/app/templates/console/admin/virtual.hbs
new file mode 100644
index 00000000..46c367b6
--- /dev/null
+++ b/console/app/templates/console/admin/virtual.hbs
@@ -0,0 +1,10 @@
+{{page-title @model.title}}
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console/extensions.hbs b/console/app/templates/console/extensions.hbs
new file mode 100644
index 00000000..5c1c5360
--- /dev/null
+++ b/console/app/templates/console/extensions.hbs
@@ -0,0 +1,12 @@
+{{page-title "Extensions"}}
+
+
+
+
+
Extensions are coming soon!
+
+ Please check back in the upcoming versions as we prepare to launch the Extensions repository and marketplace.
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console/home.hbs b/console/app/templates/console/home.hbs
new file mode 100644
index 00000000..12a2c391
--- /dev/null
+++ b/console/app/templates/console/home.hbs
@@ -0,0 +1,10 @@
+{{page-title "Dashboard"}}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/console/settings.hbs b/console/app/templates/console/settings.hbs
new file mode 100644
index 00000000..39e5f2ec
--- /dev/null
+++ b/console/app/templates/console/settings.hbs
@@ -0,0 +1,18 @@
+{{page-title "Settings"}}
+
+
+ Organization
+ {{#each this.universe.settingsMenuItems as |menuItem|}}
+ {{menuItem.title}}
+ {{/each}}
+
+ {{#each this.universe.settingsMenuPanels as |menuPanel|}}
+
+ {{#each menuPanel.items as |menuItem|}}
+ {{menuItem.title}}
+ {{/each}}
+
+ {{/each}}
+
+
+{{outlet}}
\ No newline at end of file
diff --git a/console/app/templates/console/settings/index.hbs b/console/app/templates/console/settings/index.hbs
new file mode 100644
index 00000000..fe04e47d
--- /dev/null
+++ b/console/app/templates/console/settings/index.hbs
@@ -0,0 +1,68 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/install.hbs b/console/app/templates/install.hbs
new file mode 100644
index 00000000..b3fc16a6
--- /dev/null
+++ b/console/app/templates/install.hbs
@@ -0,0 +1,34 @@
+
+
+
+
+
+
{{t "app.name"}} Installer
+
+
+ {{#each this.steps as |step|}}
+
+
+
+ {{#if (eq step.status 'in_progress')}}
+
+
+
+ {{/if}}
+
+ {{step.name}}
+
+ {{/each}}
+
+
+ {{#if this.error}}
+
+
+ The install failed! Click the button below to retry the install.
+
+ {{/if}}
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/invite.hbs b/console/app/templates/invite.hbs
new file mode 100644
index 00000000..b6129030
--- /dev/null
+++ b/console/app/templates/invite.hbs
@@ -0,0 +1,2 @@
+{{page-title "Invite"}}
+{{outlet}}
\ No newline at end of file
diff --git a/console/app/templates/invite/for-driver.hbs b/console/app/templates/invite/for-driver.hbs
new file mode 100644
index 00000000..f2ed0acc
--- /dev/null
+++ b/console/app/templates/invite/for-driver.hbs
@@ -0,0 +1,2 @@
+{{page-title "ForDriver"}}
+{{outlet}}
\ No newline at end of file
diff --git a/console/app/templates/invite/for-user.hbs b/console/app/templates/invite/for-user.hbs
new file mode 100644
index 00000000..6991dfc9
--- /dev/null
+++ b/console/app/templates/invite/for-user.hbs
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+ You've been invited to join {{@model.name}}
+
+
+
+
+
+
+
+
+ You've been invited to join the {{@model.name}} organization on {{t "app.name"}}. To accept this invitation, input your invitation code received by email and click continue.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/onboard.hbs b/console/app/templates/onboard.hbs
new file mode 100644
index 00000000..b9d79ecf
--- /dev/null
+++ b/console/app/templates/onboard.hbs
@@ -0,0 +1,5 @@
+
+
+ {{outlet}}
+
+
\ No newline at end of file
diff --git a/console/app/templates/onboard/index.hbs b/console/app/templates/onboard/index.hbs
new file mode 100644
index 00000000..050990bf
--- /dev/null
+++ b/console/app/templates/onboard/index.hbs
@@ -0,0 +1,36 @@
+
+
+
+
+ Create your account
+
+
+
+
+
+
+
+
+ Welcome to {{t "app.name"}}!
+ Complete the details required below to get started.
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/templates/onboard/verify-email.hbs b/console/app/templates/onboard/verify-email.hbs
new file mode 100644
index 00000000..0e42ca76
--- /dev/null
+++ b/console/app/templates/onboard/verify-email.hbs
@@ -0,0 +1,45 @@
+
+
+
+
+ Verify your email address
+
+
+
+
+
+
+
+
+ Almost done! Check your email for a verification code.
+
+
+
+
+
\ No newline at end of file
diff --git a/console/app/utils/get-permission-action.js b/console/app/utils/get-permission-action.js
new file mode 100644
index 00000000..97121146
--- /dev/null
+++ b/console/app/utils/get-permission-action.js
@@ -0,0 +1,47 @@
+import { classify } from '@ember/string';
+
+export default function getPermissionAction(permissionName) {
+ const permissionNameParts = permissionName.split(':');
+ const fullActionName = permissionNameParts.lastObject;
+ const actions = [
+ 'create',
+ 'update',
+ 'delete',
+ 'deactivate',
+ 'get',
+ 'list',
+ 'cancel',
+ 'optimize',
+ 'roll',
+ 'export',
+ 'batch_delete',
+ 'batch_cancel',
+ 'notify',
+ 'assign_vehicle',
+ 'assign_order_to',
+ 'dispatch_order_to',
+ 'dispatch',
+ 'assign',
+ 'attach',
+ 'sub_contract',
+ 'create_order_for',
+ ];
+
+ if (permissionName.startsWith('auth')) {
+ return fullActionName;
+ }
+
+ if (fullActionName === '*') {
+ return 'All';
+ }
+
+ for (let i = 0; i < actions.length; i++) {
+ const action = actions.objectAt(i);
+
+ if (fullActionName.toLowerCase().startsWith(classify(action).toLowerCase())) {
+ return classify(action);
+ }
+ }
+
+ return 'N/A';
+}
diff --git a/console/app/utils/get-permission-resource.js b/console/app/utils/get-permission-resource.js
new file mode 100644
index 00000000..f94683ea
--- /dev/null
+++ b/console/app/utils/get-permission-resource.js
@@ -0,0 +1,16 @@
+import getPermissionAction from './get-permission-action';
+import { classify } from '@ember/string';
+import { singularize } from 'ember-inflector';
+
+export default function getPermissionResource(permissionName = '') {
+ if (permissionName.startsWith('auth')) {
+ return 'N/A';
+ }
+
+ const permissionNameParts = permissionName.split(':');
+ const fullActionName = permissionNameParts.lastObject;
+ const actionName = getPermissionAction(permissionName);
+ const resourceName = fullActionName.replace(actionName, '');
+
+ return singularize(classify(resourceName));
+}
diff --git a/console/app/utils/get-service-name.js b/console/app/utils/get-service-name.js
new file mode 100644
index 00000000..006ee528
--- /dev/null
+++ b/console/app/utils/get-service-name.js
@@ -0,0 +1,19 @@
+export default function getServiceName(serviceName) {
+ if (serviceName.toLowerCase().startsWith('fleet')) {
+ return 'Fleet Ops';
+ }
+
+ if (serviceName.toLowerCase().startsWith('iam') || serviceName.toLowerCase().startsWith('identity')) {
+ return 'IAM';
+ }
+
+ if (serviceName.toLowerCase().startsWith('auth')) {
+ return 'Auth';
+ }
+
+ if (serviceName === 'developers' || serviceName.toLowerCase().startsWith('developers')) {
+ return 'Developers Console';
+ }
+
+ return 'N/A';
+}
diff --git a/console/app/validations/onboard.js b/console/app/validations/onboard.js
new file mode 100644
index 00000000..50969c32
--- /dev/null
+++ b/console/app/validations/onboard.js
@@ -0,0 +1,10 @@
+/** @validations onboard */
+import { validatePresence, validateLength, validateConfirmation, validateFormat } from 'ember-changeset-validations/validators';
+
+export default {
+ name: [validatePresence(true)],
+ email: [validatePresence(true), validateFormat({ type: 'email' })],
+ organization_name: [validatePresence(true)],
+ password: [validatePresence(true), validateLength({ min: 8 })],
+ password_confirmation: [validatePresence(true), validateConfirmation({ on: 'password' })],
+};
diff --git a/console/config/dotenv.js b/console/config/dotenv.js
new file mode 100644
index 00000000..71aaa3d8
--- /dev/null
+++ b/console/config/dotenv.js
@@ -0,0 +1,12 @@
+/* eslint-env node */
+
+'use strict';
+
+module.exports = function (env) {
+ return {
+ clientAllowedKeys: ['API_HOST'],
+ fastbootAllowedKeys: [],
+ failOnMissingKey: false,
+ path: `./environments/.env.${env}`,
+ };
+};
diff --git a/console/config/ember-cli-update.json b/console/config/ember-cli-update.json
new file mode 100644
index 00000000..afacb169
--- /dev/null
+++ b/console/config/ember-cli-update.json
@@ -0,0 +1,21 @@
+{
+ "schemaVersion": "1.0.0",
+ "packages": [
+ {
+ "name": "ember-cli",
+ "version": "4.6.0",
+ "blueprints": [
+ {
+ "name": "app",
+ "outputRepo": "https://github.com/ember-cli/ember-new-output",
+ "codemodsSource": "ember-app-codemods-manifest@1",
+ "isBaseBlueprint": true,
+ "options": [
+ "--pnpm",
+ "--ci-provider=github"
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/console/config/ember-intl.js b/console/config/ember-intl.js
new file mode 100644
index 00000000..7cd784b6
--- /dev/null
+++ b/console/config/ember-intl.js
@@ -0,0 +1,95 @@
+/* jshint node:true */
+
+module.exports = function (/* environment */) {
+ return {
+ /**
+ * Merges the fallback locale's translations into all other locales as a
+ * build-time fallback strategy.
+ *
+ * This will **not** prevent missing translation warnings or errors from occurring.
+ * It's meant as safety net when warnings are enabled.
+ * When enabled along with `errorOnMissingTranslations` any fallback attempts will result in an error.
+ *
+ * @property fallbackLocale
+ * @type {String?}
+ * @default "null"
+ */
+ fallbackLocale: null,
+
+ /**
+ * Path where translations are stored. This is relative to the project root.
+ * For example, if your translations are an npm dependency, set this to:
+ *`'./node_modules/path/to/translations'`
+ *
+ * @property inputPath
+ * @type {String}
+ * @default "'translations'"
+ */
+ inputPath: 'translations',
+
+ /**
+ * Prevents the translations from being bundled with the application code.
+ * This enables asynchronously loading the translations for the active locale
+ * by fetching them from the asset folder of the build.
+ *
+ * See: https://ember-intl.github.io/ember-intl/docs/guide/asynchronously-loading-translations
+ *
+ * @property publicOnly
+ * @type {Boolean}
+ * @default "false"
+ */
+ publicOnly: false,
+
+ /**
+ * Add the subdirectories of the translations as a namespace for all keys.
+ *
+ * @property wrapTranslationsWithNamespace
+ * @type {Boolean}
+ * @default "false"
+ */
+ wrapTranslationsWithNamespace: false,
+
+ /**
+ * Cause a build error if ICU argument mismatches are detected between translations
+ * with the same key across all locales.
+ *
+ * @property errorOnNamedArgumentMismatch
+ * @type {Boolean}
+ * @default "false"
+ */
+ errorOnNamedArgumentMismatch: false,
+
+ /**
+ * Cause a build error if missing translations are detected.
+ *
+ * See https://ember-intl.github.io/ember-intl/docs/guide/missing-translations#throwing-a-build-error-on-missing-required-translation
+ *
+ * @property errorOnMissingTranslations
+ * @type {Boolean}
+ * @default "false"
+ */
+ errorOnMissingTranslations: false,
+
+ /**
+ * Removes empty translations from the build output.
+ *
+ * @property stripEmptyTranslations
+ * @type {Boolean}
+ * @default "false"
+ */
+ stripEmptyTranslations: false,
+
+ /**
+ * A function that is called whenever any translation key, from any locale, is missing at build time.
+ *
+ * See https://ember-intl.github.io/ember-intl/docs/guide/missing-translations#requiring-translations
+ *
+ * @property requiresTranslation
+ * @type {Function}
+ * @default "function(key,locale) { return true }"
+ */
+ requiresTranslation(/* key, locale */) {
+ return true;
+ },
+ };
+};
diff --git a/console/config/environment.js b/console/config/environment.js
new file mode 100644
index 00000000..7bcaa3d7
--- /dev/null
+++ b/console/config/environment.js
@@ -0,0 +1,86 @@
+'use strict';
+const toBoolean = require('./utils/to-boolean');
+const getenv = require('./utils/getenv');
+const fixApiHost = require('./utils/fix-api-host');
+
+module.exports = function (environment) {
+ let ENV = {
+ modulePrefix: '@fleetbase/console',
+ environment,
+ rootURL: '/',
+ locationType: 'history',
+ EmberENV: {
+ FEATURES: {
+ // Here you can enable experimental features on an ember canary build
+ // e.g. EMBER_NATIVE_DECORATOR_SUPPORT: true
+ },
+ },
+
+ APP: {
+ showExtensionsLink: toBoolean(getenv('SHOW_EXTENSIONS_LINK', true)),
+ },
+
+ API: {
+ host: fixApiHost(getenv('API_HOST'), getenv('API_SECURE')),
+ namespace: getenv('API_NAMESPACE', 'int/v1'),
+ },
+
+ osrm: {
+ host: getenv('OSRM_HOST', 'https://bundle.routing.fleetbase.io'),
+ servers: getenv('OSRM_SERVERS', '').split(',').filter(Boolean),
+ },
+
+ socket: {
+ path: getenv('SOCKETCLUSTER_PATH', '/socketcluster/'),
+ hostname: getenv('SOCKETCLUSTER_HOST'),
+ secure: toBoolean(getenv('SOCKETCLUSTER_SECURE', false)),
+ port: getenv('SOCKETCLUSTER_PORT', 38000),
+ },
+
+ defaultValues: {
+ categoryImage: getenv('DEFAULT_CATEGORY_IMAGE', 'https://flb-assets.s3.ap-southeast-1.amazonaws.com/images/fallback-placeholder-1.png'),
+ placeholderImage: getenv('DEFAULT_PLACEHOLDER_IMAGE', 'https://flb-assets.s3.ap-southeast-1.amazonaws.com/images/fallback-placeholder-2.png'),
+ driverImage: getenv('DEFAULT_DRIVER_IMAGE', 'https://s3.ap-southeast-1.amazonaws.com/flb-assets/static/no-avatar.png'),
+ userImage: getenv('DEFAULT_USER_IMAGE', 'https://s3.ap-southeast-1.amazonaws.com/flb-assets/static/no-avatar.png'),
+ contactImage: getenv('DEFAULT_CONTACT_IMAGE', 'https://s3.ap-southeast-1.amazonaws.com/flb-assets/static/no-avatar.png'),
+ vehicleImage: getenv('DEFAULT_VEHICLE_IMAGE', 'https://flb-assets.s3.ap-southeast-1.amazonaws.com/static/vehicle-icons/light_commercial_van.svg'),
+ vehicleAvatar: getenv('DEFAUL_VEHICLE_AVATAR', 'https://flb-assets.s3-ap-southeast-1.amazonaws.com/static/vehicle-icons/mini_bus.svg'),
+ },
+
+ 'ember-simple-auth': {
+ routeAfterAuthentication: 'console',
+ },
+
+ 'ember-local-storage': {
+ namespace: '@fleetbase',
+ keyDelimiter: '/',
+ includeEmberDataSupport: true,
+ },
+ };
+
+ if (environment === 'development') {
+ // ENV.APP.LOG_RESOLVER = true;
+ // ENV.APP.LOG_ACTIVE_GENERATION = true;
+ // ENV.APP.LOG_TRANSITIONS = true;
+ // ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
+ // ENV.APP.LOG_VIEW_LOOKUPS = true;
+ }
+
+ if (environment === 'test') {
+ // Testem prefers this...
+ ENV.locationType = 'none';
+
+ // keep test console output quieter
+ ENV.APP.LOG_ACTIVE_GENERATION = false;
+ ENV.APP.LOG_VIEW_LOOKUPS = false;
+
+ ENV.APP.rootElement = '#ember-testing';
+ ENV.APP.autoboot = false;
+ }
+
+ if (environment === 'production') {
+ // here you can enable a production-specific feature
+ }
+
+ return ENV;
+};
diff --git a/console/config/icons.js b/console/config/icons.js
new file mode 100644
index 00000000..b1702e8d
--- /dev/null
+++ b/console/config/icons.js
@@ -0,0 +1,5 @@
+module.exports = function () {
+ return {
+ 'free-solid-svg-icons': 'all',
+ };
+};
diff --git a/console/config/optional-features.json b/console/config/optional-features.json
new file mode 100644
index 00000000..b26286e2
--- /dev/null
+++ b/console/config/optional-features.json
@@ -0,0 +1,6 @@
+{
+ "application-template-wrapper": false,
+ "default-async-observers": true,
+ "jquery-integration": false,
+ "template-only-glimmer-components": true
+}
diff --git a/console/config/targets.js b/console/config/targets.js
new file mode 100644
index 00000000..31c76135
--- /dev/null
+++ b/console/config/targets.js
@@ -0,0 +1,7 @@
+'use strict';
+
+const browsers = ['last 1 Chrome versions', 'last 1 Firefox versions', 'last 1 Safari versions'];
+
+module.exports = {
+ browsers,
+};
diff --git a/console/config/utils/fix-api-host.js b/console/config/utils/fix-api-host.js
new file mode 100644
index 00000000..ce02d8d8
--- /dev/null
+++ b/console/config/utils/fix-api-host.js
@@ -0,0 +1,16 @@
+const toBoolean = require('./to-boolean');
+
+// This function is a temp hotfix to patch api host
+module.exports = function fixApiHost(apiHost, secure = false) {
+ secure = toBoolean(secure);
+
+ if (typeof apiHost === 'string' && apiHost.length > 4 && !apiHost.startsWith('http')) {
+ if (secure === true) {
+ apiHost = `https://${apiHost}`;
+ } else {
+ apiHost = `http://${apiHost}`;
+ }
+ }
+
+ return apiHost;
+};
diff --git a/console/config/utils/getenv.js b/console/config/utils/getenv.js
new file mode 100644
index 00000000..83333129
--- /dev/null
+++ b/console/config/utils/getenv.js
@@ -0,0 +1,3 @@
+module.exports = function getenv(variable, defaultValue = null) {
+ return process.env[variable] !== undefined ? process.env[variable] : defaultValue;
+};
diff --git a/console/config/utils/to-boolean.js b/console/config/utils/to-boolean.js
new file mode 100644
index 00000000..d5b70fb5
--- /dev/null
+++ b/console/config/utils/to-boolean.js
@@ -0,0 +1,19 @@
+module.exports = function toBoolean(value) {
+ switch (value) {
+ case 'true':
+ case '1':
+ case 1:
+ case true:
+ return true;
+ case 'false':
+ case '0':
+ case 0:
+ case false:
+ case null:
+ case undefined:
+ case '':
+ return false;
+ default:
+ return false;
+ }
+};
diff --git a/console/ember-cli-build.js b/console/ember-cli-build.js
new file mode 100644
index 00000000..98ae4179
--- /dev/null
+++ b/console/ember-cli-build.js
@@ -0,0 +1,77 @@
+'use strict';
+
+/** eslint-disable node/no-unpublished-require */
+const EmberApp = require('ember-cli/lib/broccoli/ember-app');
+const FleetbaseExtensionsIndexer = require('fleetbase-extensions-indexer');
+const postcssImport = require('postcss-import');
+const postcssPresetEnv = require('postcss-preset-env');
+const postcssEach = require('postcss-each');
+const postcssMixins = require('postcss-mixins');
+const postcssConditionals = require('postcss-conditionals-renewed');
+const postcssAtRulesVariables = require('postcss-at-rules-variables');
+const autoprefixer = require('autoprefixer');
+const tailwind = require('tailwindcss');
+
+module.exports = function (defaults) {
+ let app = new EmberApp(defaults, {
+ storeConfigInMeta: false,
+
+ fingerprint: {
+ exclude: ['leaflet/', 'leaflet-images/', 'socketcluster-client.min.js'],
+ },
+
+ liveReload: {
+ options: {
+ ignore: ['app/router.js'],
+ },
+ },
+
+ 'ember-simple-auth': {
+ useSessionSetupMethod: true,
+ },
+
+ postcssOptions: {
+ compile: {
+ enabled: true,
+ cacheInclude: [/.*\.(css|scss|hbs)$/, /.*\/tailwind\/config\.js$/, /.*tailwind\.js$/],
+ plugins: [
+ postcssAtRulesVariables,
+ postcssImport({
+ path: ['node_modules'],
+ plugins: [postcssAtRulesVariables, postcssImport],
+ }),
+ postcssMixins,
+ postcssPresetEnv({ stage: 1 }),
+ postcssEach,
+ tailwind('./tailwind.js'),
+ autoprefixer,
+ ],
+ },
+ filter: {
+ enabled: true,
+ plugins: [postcssAtRulesVariables, postcssMixins, postcssEach, postcssConditionals, tailwind('./tailwind.js')],
+ },
+ },
+
+ babel: {
+ plugins: [require.resolve('ember-auto-import/babel-plugin')],
+ },
+ });
+
+ let extensions = new FleetbaseExtensionsIndexer();
+
+ // Use `app.import` to add additional libraries to the generated
+ // output files.
+ //
+ // If you need to use different assets in different
+ // environments, specify an object as the first parameter. That
+ // object's keys should be the environment name and the values
+ // should be the asset to use in that environment.
+ //
+ // If the library that you are including contains AMD or ES6
+ // modules that you would like to import into your application
+ // please specify an object with the list of modules as keys
+ // along with the exports of each module as its value.
+
+ return app.toTree([extensions]);
+};
diff --git a/console/lib/.gitkeep b/console/lib/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/console/nginx.conf b/console/nginx.conf
new file mode 100644
index 00000000..25d323e0
--- /dev/null
+++ b/console/nginx.conf
@@ -0,0 +1,9 @@
+server {
+ listen 4200;
+ server_name localhost;
+
+ location / {
+ root /usr/share/nginx/html;
+ try_files $uri $uri/ /index.html =404;
+ }
+}
diff --git a/console/package.json b/console/package.json
new file mode 100644
index 00000000..e423b595
--- /dev/null
+++ b/console/package.json
@@ -0,0 +1,148 @@
+{
+ "name": "@fleetbase/console",
+ "version": "0.2.5",
+ "private": true,
+ "description": "Fleetbase Console",
+ "repository": "",
+ "license": "MIT",
+ "author": "",
+ "directories": {
+ "doc": "doc",
+ "test": "tests"
+ },
+ "scripts": {
+ "prebuild": "node prebuild.js",
+ "build": "pnpm run prebuild && ember build --environment=production",
+ "lint": "npm-run-all --aggregate-output --continue-on-error --parallel \"lint:!(fix)\"",
+ "lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix",
+ "lint:hbs": "ember-template-lint .",
+ "lint:hbs:fix": "ember-template-lint . --fix",
+ "lint:js": "eslint . --cache",
+ "lint:js:fix": "eslint . --fix",
+ "start": "pnpm run prebuild && ember serve",
+ "test": "npm-run-all lint test:*",
+ "test:ember": "ember test"
+ },
+ "dependencies": {
+ "@ember/legacy-built-in-components": "^0.4.1",
+ "@fleetbase/ember-core": "^0.1.4",
+ "@fleetbase/ember-ui": "^0.2.0",
+ "@fleetbase/dev-engine": "^0.1.8",
+ "@fleetbase/iam-engine": "^0.0.6",
+ "@fleetbase/fleetops-engine": "^0.2.7",
+ "@fleetbase/fleetops-data": "^0.1.1",
+ "@fleetbase/storefront-engine": "^0.1.9",
+ "@fleetbase/leaflet-routing-machine": "^3.2.16",
+ "@fortawesome/ember-fontawesome": "^0.4.1",
+ "ember-intl": "^6.0.0-beta.6",
+ "ember-changeset": "^4.1.2",
+ "ember-changeset-validations": "^4.1.1",
+ "ember-composable-helpers": "^5.0.0",
+ "ember-concurrency": "^3.0.0",
+ "ember-concurrency-decorators": "^2.0.3",
+ "ember-math-helpers": "^2.18.2",
+ "ember-power-select": "^6.0.1",
+ "ember-prism": "^0.13.0",
+ "ember-radio-button": "^3.0.0-beta.1",
+ "ember-tag-input": "^3.1.0",
+ "fleetbase-extensions-indexer": "^0.0.4",
+ "postcss-at-rules-variables": "^0.3.0",
+ "postcss-custom-properties": "^12.1.9",
+ "postcss-nth-list": "^1.0.2"
+ },
+ "devDependencies": {
+ "@ember/optional-features": "^2.0.0",
+ "@ember/test-helpers": "^2.8.1",
+ "@fortawesome/fontawesome-svg-core": "^6.4.0",
+ "@fortawesome/free-brands-svg-icons": "^6.4.0",
+ "@fortawesome/free-solid-svg-icons": "^6.4.0",
+ "@glimmer/component": "^1.1.2",
+ "@glimmer/tracking": "^1.1.2",
+ "@tailwindcss/forms": "^0.5.3",
+ "autoprefixer": "^10.4.8",
+ "babel-eslint": "^10.1.0",
+ "broccoli-asset-rev": "^3.0.0",
+ "broccoli-funnel": "^3.0.8",
+ "date-fns": "^2.30.0",
+ "dragula": "^3.7.3",
+ "ember-auto-import": "^2.4.2",
+ "ember-cli": "~4.6.0",
+ "ember-cli-app-version": "^5.0.0",
+ "ember-cli-babel": "^7.26.11",
+ "ember-cli-dependency-checker": "^3.3.1",
+ "ember-cli-dotenv": "^3.1.0",
+ "ember-cli-es6-transform": "^1.0.0",
+ "ember-cli-htmlbars": "^6.1.0",
+ "ember-cli-inject-live-reload": "^2.1.0",
+ "ember-cli-postcss": "^8.2.0",
+ "ember-cli-sri": "^2.1.1",
+ "ember-cli-string-helpers": "^6.1.0",
+ "ember-cli-terser": "^4.0.2",
+ "ember-data": "^4.6.1",
+ "ember-engines": "^0.8.23",
+ "ember-fetch": "^8.1.1",
+ "ember-leaflet": "^5.1.1",
+ "ember-load-initializers": "^2.1.2",
+ "ember-page-title": "^7.0.0",
+ "ember-qunit": "^5.1.5",
+ "ember-resolver": "^8.0.3",
+ "ember-responsive": "^5.0.0",
+ "ember-source": "~4.6.0",
+ "ember-template-lint": "^4.10.1",
+ "ember-wormhole": "^0.6.0",
+ "eslint": "^7.32.0",
+ "eslint-config-prettier": "^8.5.0",
+ "eslint-plugin-ember": "^11.0.2",
+ "eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-prettier": "^4.2.1",
+ "eslint-plugin-qunit": "^7.3.1",
+ "fast-glob": "^3.3.0",
+ "fs": "0.0.1-security",
+ "inter-ui": "^3.19.3",
+ "leaflet": "^1.9.4",
+ "loader.js": "^4.7.0",
+ "normalize.css": "^8.0.1",
+ "npm-run-all": "^4.1.5",
+ "postcss": "^8.4.21",
+ "postcss-conditionals-renewed": "^1.0.0",
+ "postcss-each": "^1.1.0",
+ "postcss-import": "14.1.0",
+ "postcss-mixins": "^9.0.4",
+ "postcss-preset-env": "^7.8.2",
+ "postcss-simple-vars": "^7.0.0",
+ "prettier": "^2.7.1",
+ "qunit": "^2.19.1",
+ "qunit-dom": "^2.0.0",
+ "recast": "^0.23.3",
+ "tailwindcss": "^3.1.8",
+ "webpack": "^5.74.0"
+ },
+ "engines": {
+ "node": "14.* || >= 16"
+ },
+ "ember": {
+ "edition": "octane"
+ },
+ "pnpm": {
+ "overrides": {
+ "@fleetbase/fleetops-data": "^0.1.1",
+ "@fleetbase/ember-core": "^0.1.4",
+ "@fleetbase/ember-ui": "^0.2.0"
+ }
+ },
+ "prettier": {
+ "trailingComma": "es5",
+ "tabWidth": 4,
+ "semi": true,
+ "singleQuote": true,
+ "printWidth": 190,
+ "overrides": [
+ {
+ "files": "*.hbs",
+ "options": {
+ "singleQuote": false
+ }
+ }
+ ]
+ }
+}
diff --git a/console/prebuild.js b/console/prebuild.js
new file mode 100644
index 00000000..61c5931b
--- /dev/null
+++ b/console/prebuild.js
@@ -0,0 +1,127 @@
+const fg = require('fast-glob');
+const fs = require('fs');
+const path = require('path');
+const recast = require('recast');
+const babelParser = require('recast/parsers/babel');
+const builders = recast.types.builders;
+
+function only(subject, props = []) {
+ const keys = Object.keys(subject);
+ const result = {};
+
+ for (let i = 0; i < keys.length; i++) {
+ const key = keys[i];
+
+ if (props.includes(key)) {
+ result[key] = subject[key];
+ }
+ }
+
+ return result;
+}
+
+function getExtensions() {
+ return new Promise((resolve, reject) => {
+ const extensions = [];
+ const seenPackages = new Set();
+
+ return fg(['node_modules/*/package.json', 'node_modules/*/*/package.json'])
+ .then((results) => {
+ for (let i = 0; i < results.length; i++) {
+ const packagePath = results[i];
+ const packageJson = fs.readFileSync(packagePath);
+ let packageData = null;
+
+ try {
+ packageData = JSON.parse(packageJson);
+ } catch (e) {
+ console.warn(`Could not parse package.json at ${packagePath}:`, e);
+ continue;
+ }
+
+ if (!packageData || !packageData.keywords || !packageData.keywords.includes('fleetbase-extension') || !packageData.keywords.includes('ember-engine')) {
+ continue;
+ }
+
+ // If we've seen this package before, skip it
+ if (seenPackages.has(packageData.name)) {
+ continue;
+ }
+
+ seenPackages.add(packageData.name);
+ extensions.push(only(packageData, ['name', 'description', 'version', 'fleetbase', 'keywords', 'license', 'repository']));
+ }
+
+ resolve(extensions);
+ })
+ .catch(reject);
+ });
+}
+
+function getRouterFileContents() {
+ const routerFilePath = path.join(__dirname, 'router.map.js');
+ const routerFileContents = fs.readFileSync(routerFilePath, 'utf-8');
+
+ return routerFileContents;
+}
+
+(async () => {
+ const extensions = await getExtensions();
+ const routerFileContents = getRouterFileContents();
+ const ast = recast.parse(routerFileContents, { parser: babelParser });
+
+ recast.visit(ast, {
+ visitCallExpression(path) {
+ if (path.value.type === 'CallExpression' && path.value.callee.property.name === 'route' && path.value.arguments[0].value === 'console') {
+ let functionExpression;
+
+ // Find the function expression
+ path.value.arguments.forEach((arg) => {
+ if (arg.type === 'FunctionExpression') {
+ functionExpression = arg;
+ }
+ });
+
+ if (functionExpression) {
+ // Check and add the new engine mounts
+ extensions.forEach((extension) => {
+ const mountName = extension.name.split('/')[1];
+ const mountPath = mountName.replace('-engine', '');
+ let route = mountPath;
+
+ if (extension.fleetbase && extension.fleetbase.route) {
+ route = extension.fleetbase.route;
+ }
+
+ // Check if engine is already mounted
+ const isMounted = functionExpression.body.body.some((expressionStatement) => {
+ return expressionStatement.expression.arguments[0].value === extension.name;
+ });
+
+ // If not mounted, append to the function body
+ if (!isMounted) {
+ functionExpression.body.body.push(
+ builders.expressionStatement(
+ builders.callExpression(builders.memberExpression(builders.thisExpression(), builders.identifier('mount')), [
+ builders.literal(extension.name),
+ builders.objectExpression([
+ builders.property('init', builders.identifier('as'), builders.literal(route)),
+ builders.property('init', builders.identifier('path'), builders.literal(route)),
+ ]),
+ ])
+ )
+ );
+ }
+ });
+
+ return false;
+ }
+ }
+
+ this.traverse(path);
+ },
+ });
+
+ const output = recast.print(ast, { quote: 'single' }).code;
+ fs.writeFileSync(path.join(__dirname, 'app/router.js'), output);
+})();
diff --git a/console/public/favicon/android-chrome-192x192.png b/console/public/favicon/android-chrome-192x192.png
new file mode 100644
index 00000000..5bb94579
Binary files /dev/null and b/console/public/favicon/android-chrome-192x192.png differ
diff --git a/console/public/favicon/android-chrome-256x256.png b/console/public/favicon/android-chrome-256x256.png
new file mode 100644
index 00000000..327e653c
Binary files /dev/null and b/console/public/favicon/android-chrome-256x256.png differ
diff --git a/console/public/favicon/apple-touch-icon-114x114.png b/console/public/favicon/apple-touch-icon-114x114.png
new file mode 100644
index 00000000..8ea847ed
Binary files /dev/null and b/console/public/favicon/apple-touch-icon-114x114.png differ
diff --git a/console/public/favicon/apple-touch-icon-120x120.png b/console/public/favicon/apple-touch-icon-120x120.png
new file mode 100644
index 00000000..aabcd6b9
Binary files /dev/null and b/console/public/favicon/apple-touch-icon-120x120.png differ
diff --git a/console/public/favicon/apple-touch-icon-144x144.png b/console/public/favicon/apple-touch-icon-144x144.png
new file mode 100644
index 00000000..539d561c
Binary files /dev/null and b/console/public/favicon/apple-touch-icon-144x144.png differ
diff --git a/console/public/favicon/apple-touch-icon-152x152.png b/console/public/favicon/apple-touch-icon-152x152.png
new file mode 100644
index 00000000..3ca9ab46
Binary files /dev/null and b/console/public/favicon/apple-touch-icon-152x152.png differ
diff --git a/console/public/favicon/apple-touch-icon-180x180.png b/console/public/favicon/apple-touch-icon-180x180.png
new file mode 100644
index 00000000..1727f26f
Binary files /dev/null and b/console/public/favicon/apple-touch-icon-180x180.png differ
diff --git a/console/public/favicon/apple-touch-icon-57x57.png b/console/public/favicon/apple-touch-icon-57x57.png
new file mode 100644
index 00000000..56a23e98
Binary files /dev/null and b/console/public/favicon/apple-touch-icon-57x57.png differ
diff --git a/console/public/favicon/apple-touch-icon-60x60.png b/console/public/favicon/apple-touch-icon-60x60.png
new file mode 100644
index 00000000..b4db2572
Binary files /dev/null and b/console/public/favicon/apple-touch-icon-60x60.png differ
diff --git a/console/public/favicon/apple-touch-icon-72x72.png b/console/public/favicon/apple-touch-icon-72x72.png
new file mode 100644
index 00000000..82ae16a3
Binary files /dev/null and b/console/public/favicon/apple-touch-icon-72x72.png differ
diff --git a/console/public/favicon/apple-touch-icon-76x76.png b/console/public/favicon/apple-touch-icon-76x76.png
new file mode 100644
index 00000000..622bf569
Binary files /dev/null and b/console/public/favicon/apple-touch-icon-76x76.png differ
diff --git a/console/public/favicon/apple-touch-icon.png b/console/public/favicon/apple-touch-icon.png
new file mode 100644
index 00000000..1727f26f
Binary files /dev/null and b/console/public/favicon/apple-touch-icon.png differ
diff --git a/console/public/favicon/browserconfig.xml b/console/public/favicon/browserconfig.xml
new file mode 100644
index 00000000..70cb989d
--- /dev/null
+++ b/console/public/favicon/browserconfig.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ #da532c
+
+
+
diff --git a/console/public/favicon/favicon-16x16.png b/console/public/favicon/favicon-16x16.png
new file mode 100644
index 00000000..bdcc6c95
Binary files /dev/null and b/console/public/favicon/favicon-16x16.png differ
diff --git a/console/public/favicon/favicon-32x32.png b/console/public/favicon/favicon-32x32.png
new file mode 100644
index 00000000..4b42d679
Binary files /dev/null and b/console/public/favicon/favicon-32x32.png differ
diff --git a/console/public/favicon/favicon.ico b/console/public/favicon/favicon.ico
new file mode 100644
index 00000000..15ba0fe3
Binary files /dev/null and b/console/public/favicon/favicon.ico differ
diff --git a/console/public/favicon/mstile-150x150.png b/console/public/favicon/mstile-150x150.png
new file mode 100644
index 00000000..595fba0c
Binary files /dev/null and b/console/public/favicon/mstile-150x150.png differ
diff --git a/console/public/favicon/safari-pinned-tab.svg b/console/public/favicon/safari-pinned-tab.svg
new file mode 100644
index 00000000..aac7cf9c
--- /dev/null
+++ b/console/public/favicon/safari-pinned-tab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/console/public/favicon/site.webmanifest b/console/public/favicon/site.webmanifest
new file mode 100644
index 00000000..855b3316
--- /dev/null
+++ b/console/public/favicon/site.webmanifest
@@ -0,0 +1,19 @@
+{
+ "name": "",
+ "short_name": "",
+ "icons": [
+ {
+ "src": "/favicon/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/favicon/android-chrome-256x256.png",
+ "sizes": "256x256",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "background_color": "#ffffff",
+ "display": "standalone"
+}
diff --git a/console/public/images/fleetbase-logo-svg.svg b/console/public/images/fleetbase-logo-svg.svg
new file mode 100644
index 00000000..141d565f
--- /dev/null
+++ b/console/public/images/fleetbase-logo-svg.svg
@@ -0,0 +1,78 @@
+
+
+
diff --git a/console/public/images/icon.png b/console/public/images/icon.png
new file mode 100644
index 00000000..219f63b0
Binary files /dev/null and b/console/public/images/icon.png differ
diff --git a/console/public/images/icon.svg b/console/public/images/icon.svg
new file mode 100644
index 00000000..6de9d972
--- /dev/null
+++ b/console/public/images/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/console/public/robots.txt b/console/public/robots.txt
new file mode 100644
index 00000000..f5916452
--- /dev/null
+++ b/console/public/robots.txt
@@ -0,0 +1,3 @@
+# http://www.robotstxt.org
+User-agent: *
+Disallow:
diff --git a/console/router.map.js b/console/router.map.js
new file mode 100644
index 00000000..ccd4a38b
--- /dev/null
+++ b/console/router.map.js
@@ -0,0 +1,48 @@
+import EmberRouter from '@ember/routing/router';
+import config from '@fleetbase/console/config/environment';
+
+export default class Router extends EmberRouter {
+ location = config.locationType;
+ rootURL = config.rootURL;
+}
+
+Router.map(function () {
+ this.route('auth', function () {
+ this.route('login', { path: '/' });
+ this.route('forgot-password');
+ this.route('reset-password');
+ });
+ this.route('onboard', function () {
+ this.route('verify-email');
+ });
+ this.route('invite', { path: 'join' }, function () {
+ this.route('for-driver', { path: '/fleet/:public_id' });
+ this.route('for-user', { path: '/org/:public_id' });
+ });
+ this.route('console', { path: '/' }, function () {
+ this.route('home', { path: '/' });
+ this.route('extensions');
+ this.route('account', function () {
+ this.route('virtual', { path: '/:slug/:view' });
+ });
+ this.route('settings', function () {
+ this.route('virtual', { path: '/:slug/:view' });
+ });
+ this.route('virtual', { path: '/:slug/:view' });
+ this.route('admin', function () {
+ this.route('config', function () {
+ this.route('database');
+ this.route('cache');
+ this.route('filesystem');
+ this.route('mail');
+ this.route('notification-channels');
+ this.route('queue');
+ this.route('services');
+ this.route('socket');
+ });
+ this.route('branding');
+ this.route('virtual', { path: '/:slug/:view' });
+ });
+ });
+ this.route('install');
+});
diff --git a/console/tailwind.js b/console/tailwind.js
new file mode 100644
index 00000000..03a5c279
--- /dev/null
+++ b/console/tailwind.js
@@ -0,0 +1,114 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ darkMode: ['class', '[data-theme="dark"]'],
+ content: [
+ './app/**/*.{hbs,js}',
+ './node_modules/@fleetbase/ember-ui/addon/**/*.{hbs,js}',
+ './node_modules/@fleetbase/ember-ui/addon/templates/*.{hbs,js}',
+ './node_modules/@fleetbase/ember-ui/addon/templates/**/*.{hbs,js}',
+ './node_modules/@fleetbase/ember-ui/addon/components/*.{hbs,js}',
+ './node_modules/@fleetbase/ember-ui/addon/components/**/*.{hbs,js}',
+ './node_modules/@fleetbase/ember-core/addon/**/*.{hbs,js}',
+ './node_modules/@fleetbase/fleetops-engine/addon/**/*.{hbs,js}',
+ './node_modules/@fleetbase/storefront-engine/addon/**/*.{hbs,js}',
+ './node_modules/@fleetbase/*-engine/addon/**/*.{hbs,js}',
+ './node_modules/**/*-engine/addon/**/*.{hbs,js}',
+ '../packages/*-engine/addon/**/*.{hbs,js}',
+ ],
+ theme: {
+ extend: {
+ gridTemplateColumns: {
+ span: ['span 1', 'span 2', 'span 3', 'span 4', 'span 5', 'span 6', 'span 7', 'span 8', 'span 9', 'span 10', 'span 11', 'span 12'],
+ },
+ ringColor: {
+ DEFAULT: 'transparent',
+ },
+ colors: {
+ sky: {
+ 100: '#e6f0fb',
+ 200: '#bad5f5',
+ 300: '#8dbbef',
+ 400: '#61a0e8',
+ 500: '#3485e2',
+ 600: '#1c6cc7',
+ 700: '#16539a',
+ 800: '#103b6d',
+ 900: '#092341',
+ },
+ nightsky: {
+ 100: '#0d2f57',
+ 200: '#092340',
+ 300: '#06172a',
+ 400: '#030b14',
+ },
+ night: {
+ 801: '#222C3C',
+ 802: '#202A3A',
+ 803: '#1D2737',
+ 804: '#1B2535',
+ 805: '#182232',
+ 901: '#131B2B',
+ 902: '#111929',
+ 903: '#0E1626',
+ 904: '#0C1424',
+ 905: '#091121',
+ },
+ midnight: {
+ 100: '#555555',
+ 200: '#484848',
+ 300: '#3b3b3b',
+ 400: '#2e2e2e',
+ 500: '#222222',
+ 600: '#151515',
+ 700: '#080808',
+ },
+ moregray: {
+ 750: '#283345',
+ 850: '#212a38',
+ },
+ },
+ boxShadow: {
+ xs: '0 0 0 1px rgba(0,0,0, 0.05)',
+ 'light-xs': '0 0 0 1px rgba(212,220,236, 0.05)',
+ 'light-sm': '0 1px 2px 0 rgba(212,220,236, 0.05)',
+ light: '0 1px 3px 0 rgba(212,220,236, 0.1), 0 1px 2px 0 rgba(212,220,236, 0.06)',
+ 'light-md': '0 4px 6px -1px rgba(212,220,236, 0.1), 0 2px 4px -1px rgba(212,220,236, 0.06)',
+ 'light-lg': '0 10px 15px -3px rgba(212,220,236, 0.1), 0 4px 6px -2px rgba(212,220,236, 0.05)',
+ 'light-xl': '0 20px 25px -5px rgba(212,220,236, 0.1), 0 10px 10px -5px rgba(212,220,236, 0.04)',
+ 'light-2xl': '0 25px 50px -12px rgba(212,220,236, 0.25)',
+ 'light-3xl': '0 35px 60px -15px rgba(212,220,236, 0.3)',
+ pop: '0 0 2.25rem #d4dcec',
+ 'pop-less': '0 0 1rem #d4dcec',
+ 'pop-lesser': '0 0 .5rem #d4dcec',
+ 'pop-least': '0 0 .25rem #d4dcec',
+ 'dark-overlay': '-5px 10px 13px 3px rgba(0,0,0,0.3)',
+ 'dark-overlay-gray': '-5px 10px 13px 3px rgba(26, 32, 44, .5)',
+ 'overlay-inner': 'inset 0 1px 5px 0 rgba(0, 0, 0, 0.3)',
+ 'next-nav': 'rgba(0 0 0 / 35%) 0px 7px 32px',
+ },
+ width: {
+ 70: '18rem',
+ 74: '22rem',
+ 78: '26rem',
+ 82: '28rem',
+ 86: '30rem',
+ },
+ spacing: {
+ 70: '18rem',
+ 74: '22rem',
+ 78: '26rem',
+ 82: '28rem',
+ 86: '30rem',
+ },
+ },
+ },
+ variants: {
+ boxShadow: ['responsive', 'hover', 'focus', 'group-focus', 'dark'],
+ backgroundColor: ['responsive', 'hover', 'focus', 'dark', 'dark-hover', 'dark-group-hover', 'dark-even', 'dark-odd'],
+ borderColor: ['responsive', 'hover', 'focus', 'dark', 'dark-disabled', 'dark-focus', 'dark-focus-within'],
+ border: ['hover', 'focus', 'dark', 'dark-disabled', 'dark-focus'],
+ textColor: ['responsive', 'hover', 'focus', 'dark', 'dark-hover', 'dark-active', 'dark-placeholder'],
+ maxWidth: ['responsive', 'hover', 'focus'],
+ },
+ plugins: [require('@tailwindcss/forms')],
+};
diff --git a/console/testem.js b/console/testem.js
new file mode 100644
index 00000000..633ddb51
--- /dev/null
+++ b/console/testem.js
@@ -0,0 +1,23 @@
+'use strict';
+
+module.exports = {
+ test_page: 'tests/index.html?hidepassed',
+ disable_watching: true,
+ launch_in_ci: ['Chrome'],
+ launch_in_dev: ['Chrome'],
+ browser_start_timeout: 120,
+ browser_args: {
+ Chrome: {
+ ci: [
+ // --no-sandbox is needed when running Chrome inside a container
+ process.env.CI ? '--no-sandbox' : null,
+ '--headless',
+ '--disable-dev-shm-usage',
+ '--disable-software-rasterizer',
+ '--mute-audio',
+ '--remote-debugging-port=0',
+ '--window-size=1440,900',
+ ].filter(Boolean),
+ },
+ },
+};
diff --git a/console/tests/helpers/index.js b/console/tests/helpers/index.js
new file mode 100644
index 00000000..4b9e23f4
--- /dev/null
+++ b/console/tests/helpers/index.js
@@ -0,0 +1,38 @@
+import { setupApplicationTest as upstreamSetupApplicationTest, setupRenderingTest as upstreamSetupRenderingTest, setupTest as upstreamSetupTest } from 'ember-qunit';
+
+// This file exists to provide wrappers around ember-qunit's / ember-mocha's
+// test setup functions. This way, you can easily extend the setup that is
+// needed per test type.
+
+function setupApplicationTest(hooks, options) {
+ upstreamSetupApplicationTest(hooks, options);
+
+ // Additional setup for application tests can be done here.
+ //
+ // For example, if you need an authenticated session for each
+ // application test, you could do:
+ //
+ // hooks.beforeEach(async function () {
+ // await authenticateSession(); // ember-simple-auth
+ // });
+ //
+ // This is also a good place to call test setup functions coming
+ // from other addons:
+ //
+ // setupIntl(hooks); // ember-intl
+ // setupMirage(hooks); // ember-cli-mirage
+}
+
+function setupRenderingTest(hooks, options) {
+ upstreamSetupRenderingTest(hooks, options);
+
+ // Additional setup for rendering tests can be done here.
+}
+
+function setupTest(hooks, options) {
+ upstreamSetupTest(hooks, options);
+
+ // Additional setup for unit tests can be done here.
+}
+
+export { setupApplicationTest, setupRenderingTest, setupTest };
diff --git a/console/tests/index.html b/console/tests/index.html
new file mode 100644
index 00000000..ace0a8da
--- /dev/null
+++ b/console/tests/index.html
@@ -0,0 +1,39 @@
+
+
+
+
+ @fleetbase/console Tests
+
+
+
+ {{content-for "head"}}
+ {{content-for "test-head"}}
+
+
+
+
+
+ {{content-for "head-footer"}}
+ {{content-for "test-head-footer"}}
+
+
+ {{content-for "body"}}
+ {{content-for "test-body"}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{content-for "body-footer"}}
+ {{content-for "test-body-footer"}}
+
+
diff --git a/console/tests/integration/.gitkeep b/console/tests/integration/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/console/tests/integration/components/configure/filesystem-test.js b/console/tests/integration/components/configure/filesystem-test.js
new file mode 100644
index 00000000..34c2287c
--- /dev/null
+++ b/console/tests/integration/components/configure/filesystem-test.js
@@ -0,0 +1,26 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from '@fleetbase/console/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | configure/filesystem', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.set('myAction', function(val) { ... });
+
+ await render(hbs``);
+
+ assert.dom(this.element).hasText('');
+
+ // Template block usage:
+ await render(hbs`
+
+ template block text
+
+ `);
+
+ assert.dom(this.element).hasText('template block text');
+ });
+});
diff --git a/console/tests/integration/components/configure/mail-test.js b/console/tests/integration/components/configure/mail-test.js
new file mode 100644
index 00000000..fd9f7829
--- /dev/null
+++ b/console/tests/integration/components/configure/mail-test.js
@@ -0,0 +1,26 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from '@fleetbase/console/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | configure/mail', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.set('myAction', function(val) { ... });
+
+ await render(hbs``);
+
+ assert.dom(this.element).hasText('');
+
+ // Template block usage:
+ await render(hbs`
+
+ template block text
+
+ `);
+
+ assert.dom(this.element).hasText('template block text');
+ });
+});
diff --git a/console/tests/integration/components/configure/notification-channels-test.js b/console/tests/integration/components/configure/notification-channels-test.js
new file mode 100644
index 00000000..d79cb8f1
--- /dev/null
+++ b/console/tests/integration/components/configure/notification-channels-test.js
@@ -0,0 +1,26 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from '@fleetbase/console/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | configure/notification-channels', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.set('myAction', function(val) { ... });
+
+ await render(hbs``);
+
+ assert.dom(this.element).hasText('');
+
+ // Template block usage:
+ await render(hbs`
+
+ template block text
+
+ `);
+
+ assert.dom(this.element).hasText('template block text');
+ });
+});
diff --git a/console/tests/integration/components/configure/queue-test.js b/console/tests/integration/components/configure/queue-test.js
new file mode 100644
index 00000000..66d70e07
--- /dev/null
+++ b/console/tests/integration/components/configure/queue-test.js
@@ -0,0 +1,26 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from '@fleetbase/console/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | configure/queue', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.set('myAction', function(val) { ... });
+
+ await render(hbs``);
+
+ assert.dom(this.element).hasText('');
+
+ // Template block usage:
+ await render(hbs`
+
+ template block text
+
+ `);
+
+ assert.dom(this.element).hasText('template block text');
+ });
+});
diff --git a/console/tests/integration/components/configure/services-test.js b/console/tests/integration/components/configure/services-test.js
new file mode 100644
index 00000000..3aa2deab
--- /dev/null
+++ b/console/tests/integration/components/configure/services-test.js
@@ -0,0 +1,26 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from '@fleetbase/console/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | configure/services', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.set('myAction', function(val) { ... });
+
+ await render(hbs``);
+
+ assert.dom(this.element).hasText('');
+
+ // Template block usage:
+ await render(hbs`
+
+ template block text
+
+ `);
+
+ assert.dom(this.element).hasText('template block text');
+ });
+});
diff --git a/console/tests/integration/components/configure/socket-test.js b/console/tests/integration/components/configure/socket-test.js
new file mode 100644
index 00000000..cc258ce4
--- /dev/null
+++ b/console/tests/integration/components/configure/socket-test.js
@@ -0,0 +1,26 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from '@fleetbase/console/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | configure/socket', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.set('myAction', function(val) { ... });
+
+ await render(hbs``);
+
+ assert.dom(this.element).hasText('');
+
+ // Template block usage:
+ await render(hbs`
+
+ template block text
+
+ `);
+
+ assert.dom(this.element).hasText('template block text');
+ });
+});
diff --git a/console/tests/integration/components/dashboard-test.js b/console/tests/integration/components/dashboard-test.js
new file mode 100644
index 00000000..62b00547
--- /dev/null
+++ b/console/tests/integration/components/dashboard-test.js
@@ -0,0 +1,26 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from '@fleetbase/console/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | dashboard', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.set('myAction', function(val) { ... });
+
+ await render(hbs``);
+
+ assert.dom(this.element).hasText('');
+
+ // Template block usage:
+ await render(hbs`
+
+ template block text
+
+ `);
+
+ assert.dom(this.element).hasText('template block text');
+ });
+});
diff --git a/console/tests/integration/components/dashboard/count-test.js b/console/tests/integration/components/dashboard/count-test.js
new file mode 100644
index 00000000..b7ccc203
--- /dev/null
+++ b/console/tests/integration/components/dashboard/count-test.js
@@ -0,0 +1,26 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from '@fleetbase/console/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | dashboard/count', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.set('myAction', function(val) { ... });
+
+ await render(hbs``);
+
+ assert.dom(this.element).hasText('');
+
+ // Template block usage:
+ await render(hbs`
+
+ template block text
+
+ `);
+
+ assert.dom(this.element).hasText('template block text');
+ });
+});
diff --git a/console/tests/integration/components/dashboard/create-test.js b/console/tests/integration/components/dashboard/create-test.js
new file mode 100644
index 00000000..cd765c96
--- /dev/null
+++ b/console/tests/integration/components/dashboard/create-test.js
@@ -0,0 +1,26 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from '@fleetbase/console/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | dashboard/create', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.set('myAction', function(val) { ... });
+
+ await render(hbs``);
+
+ assert.dom(this.element).hasText('');
+
+ // Template block usage:
+ await render(hbs`
+
+ template block text
+
+ `);
+
+ assert.dom(this.element).hasText('template block text');
+ });
+});
diff --git a/console/tests/integration/components/dashboard/query-params-test.js b/console/tests/integration/components/dashboard/query-params-test.js
new file mode 100644
index 00000000..5af3349b
--- /dev/null
+++ b/console/tests/integration/components/dashboard/query-params-test.js
@@ -0,0 +1,26 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from '@fleetbase/console/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | dashboard/query-params', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.set('myAction', function(val) { ... });
+
+ await render(hbs``);
+
+ assert.dom(this.element).hasText('');
+
+ // Template block usage:
+ await render(hbs`
+
+ template block text
+
+ `);
+
+ assert.dom(this.element).hasText('template block text');
+ });
+});
diff --git a/console/tests/integration/components/fleetbase-blog-test.js b/console/tests/integration/components/fleetbase-blog-test.js
new file mode 100644
index 00000000..46e7f774
--- /dev/null
+++ b/console/tests/integration/components/fleetbase-blog-test.js
@@ -0,0 +1,26 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from '@fleetbase/console/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | fleetbase-blog', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.set('myAction', function(val) { ... });
+
+ await render(hbs``);
+
+ assert.dom(this.element).hasText('');
+
+ // Template block usage:
+ await render(hbs`
+
+ template block text
+
+ `);
+
+ assert.dom(this.element).hasText('template block text');
+ });
+});
diff --git a/console/tests/integration/components/github-card-test.js b/console/tests/integration/components/github-card-test.js
new file mode 100644
index 00000000..c09218b5
--- /dev/null
+++ b/console/tests/integration/components/github-card-test.js
@@ -0,0 +1,26 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from '@fleetbase/console/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | github-card', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.set('myAction', function(val) { ... });
+
+ await render(hbs``);
+
+ assert.dom(this.element).hasText('');
+
+ // Template block usage:
+ await render(hbs`
+
+ template block text
+
+ `);
+
+ assert.dom(this.element).hasText('template block text');
+ });
+});
diff --git a/console/tests/integration/helpers/json-pretty-print-test.js b/console/tests/integration/helpers/json-pretty-print-test.js
new file mode 100644
index 00000000..c5ffc995
--- /dev/null
+++ b/console/tests/integration/helpers/json-pretty-print-test.js
@@ -0,0 +1,17 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from '@fleetbase/console/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Helper | json-pretty-print', function (hooks) {
+ setupRenderingTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it renders', async function (assert) {
+ this.set('inputValue', '1234');
+
+ await render(hbs`{{json-pretty-print this.inputValue}}`);
+
+ assert.dom(this.element).hasText('1234');
+ });
+});
diff --git a/console/tests/test-helper.js b/console/tests/test-helper.js
new file mode 100644
index 00000000..45ae0dfc
--- /dev/null
+++ b/console/tests/test-helper.js
@@ -0,0 +1,12 @@
+import Application from '@fleetbase/console/app';
+import config from '@fleetbase/console/config/environment';
+import * as QUnit from 'qunit';
+import { setApplication } from '@ember/test-helpers';
+import { setup } from 'qunit-dom';
+import { start } from 'ember-qunit';
+
+setApplication(Application.create(config.APP));
+
+setup(QUnit.assert);
+
+start();
diff --git a/console/tests/unit/.gitkeep b/console/tests/unit/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/console/tests/unit/adapters/application-test.js b/console/tests/unit/adapters/application-test.js
new file mode 100644
index 00000000..296eceb4
--- /dev/null
+++ b/console/tests/unit/adapters/application-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Adapter | application', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let adapter = this.owner.lookup('adapter:application');
+ assert.ok(adapter);
+ });
+});
diff --git a/console/tests/unit/adapters/brand-test.js b/console/tests/unit/adapters/brand-test.js
new file mode 100644
index 00000000..a4f55909
--- /dev/null
+++ b/console/tests/unit/adapters/brand-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Adapter | brand', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let adapter = this.owner.lookup('adapter:brand');
+ assert.ok(adapter);
+ });
+});
diff --git a/console/tests/unit/controllers/application-test.js b/console/tests/unit/controllers/application-test.js
new file mode 100644
index 00000000..5a8de59b
--- /dev/null
+++ b/console/tests/unit/controllers/application-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | application', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:application');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/auth/forgot-password-test.js b/console/tests/unit/controllers/auth/forgot-password-test.js
new file mode 100644
index 00000000..c9035511
--- /dev/null
+++ b/console/tests/unit/controllers/auth/forgot-password-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | auth/forgot-password', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:auth/forgot-password');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/auth/login-test.js b/console/tests/unit/controllers/auth/login-test.js
new file mode 100644
index 00000000..dc362586
--- /dev/null
+++ b/console/tests/unit/controllers/auth/login-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | auth/login', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:auth/login');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/auth/reset-password-test.js b/console/tests/unit/controllers/auth/reset-password-test.js
new file mode 100644
index 00000000..4abc1adf
--- /dev/null
+++ b/console/tests/unit/controllers/auth/reset-password-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | auth/reset-password', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:auth/reset-password');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/console-test.js b/console/tests/unit/controllers/console-test.js
new file mode 100644
index 00000000..d3df3dfc
--- /dev/null
+++ b/console/tests/unit/controllers/console-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | console', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:console');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/console/account-test.js b/console/tests/unit/controllers/console/account-test.js
new file mode 100644
index 00000000..07398494
--- /dev/null
+++ b/console/tests/unit/controllers/console/account-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | console/account', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:console/account');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/console/account/index-test.js b/console/tests/unit/controllers/console/account/index-test.js
new file mode 100644
index 00000000..81c8e26f
--- /dev/null
+++ b/console/tests/unit/controllers/console/account/index-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | console/account/index', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:console/account/index');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/console/admin-test.js b/console/tests/unit/controllers/console/admin-test.js
new file mode 100644
index 00000000..ccb68c6b
--- /dev/null
+++ b/console/tests/unit/controllers/console/admin-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | console/admin', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:console/admin');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/console/admin/branding-test.js b/console/tests/unit/controllers/console/admin/branding-test.js
new file mode 100644
index 00000000..4f23eb76
--- /dev/null
+++ b/console/tests/unit/controllers/console/admin/branding-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | console/admin/branding', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:console/admin/branding');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/console/admin/config/cache-test.js b/console/tests/unit/controllers/console/admin/config/cache-test.js
new file mode 100644
index 00000000..f1205ed3
--- /dev/null
+++ b/console/tests/unit/controllers/console/admin/config/cache-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | console/admin/config/cache', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:console/admin/config/cache');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/console/admin/config/database-test.js b/console/tests/unit/controllers/console/admin/config/database-test.js
new file mode 100644
index 00000000..51d85499
--- /dev/null
+++ b/console/tests/unit/controllers/console/admin/config/database-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | console/admin/config/database', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:console/admin/config/database');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/console/admin/config/filesystem-test.js b/console/tests/unit/controllers/console/admin/config/filesystem-test.js
new file mode 100644
index 00000000..d0a29829
--- /dev/null
+++ b/console/tests/unit/controllers/console/admin/config/filesystem-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | console/admin/config/filesystem', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:console/admin/config/filesystem');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/console/admin/config/mail-test.js b/console/tests/unit/controllers/console/admin/config/mail-test.js
new file mode 100644
index 00000000..932d6d15
--- /dev/null
+++ b/console/tests/unit/controllers/console/admin/config/mail-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | console/admin/config/mail', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:console/admin/config/mail');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/console/admin/config/notification-channels-test.js b/console/tests/unit/controllers/console/admin/config/notification-channels-test.js
new file mode 100644
index 00000000..d21192de
--- /dev/null
+++ b/console/tests/unit/controllers/console/admin/config/notification-channels-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | console/admin/config/notification-channels', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:console/admin/config/notification-channels');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/console/admin/config/queue-test.js b/console/tests/unit/controllers/console/admin/config/queue-test.js
new file mode 100644
index 00000000..4f5a5d4a
--- /dev/null
+++ b/console/tests/unit/controllers/console/admin/config/queue-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | console/admin/config/queue', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:console/admin/config/queue');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/console/admin/config/services-test.js b/console/tests/unit/controllers/console/admin/config/services-test.js
new file mode 100644
index 00000000..1cdc8d70
--- /dev/null
+++ b/console/tests/unit/controllers/console/admin/config/services-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | console/admin/config/services', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:console/admin/config/services');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/console/home-test.js b/console/tests/unit/controllers/console/home-test.js
new file mode 100644
index 00000000..e0ae011f
--- /dev/null
+++ b/console/tests/unit/controllers/console/home-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | console/home', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:console/home');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/console/settings-test.js b/console/tests/unit/controllers/console/settings-test.js
new file mode 100644
index 00000000..00c98797
--- /dev/null
+++ b/console/tests/unit/controllers/console/settings-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | console/settings', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:console/settings');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/console/settings/index-test.js b/console/tests/unit/controllers/console/settings/index-test.js
new file mode 100644
index 00000000..8fee832d
--- /dev/null
+++ b/console/tests/unit/controllers/console/settings/index-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | console/settings/index', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:console/settings/index');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/install-test.js b/console/tests/unit/controllers/install-test.js
new file mode 100644
index 00000000..a86ff81a
--- /dev/null
+++ b/console/tests/unit/controllers/install-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | install', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:install');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/invite/for-user-test.js b/console/tests/unit/controllers/invite/for-user-test.js
new file mode 100644
index 00000000..168d6a06
--- /dev/null
+++ b/console/tests/unit/controllers/invite/for-user-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | invite/for-user', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:invite/for-user');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/onboard/index-test.js b/console/tests/unit/controllers/onboard/index-test.js
new file mode 100644
index 00000000..5592353c
--- /dev/null
+++ b/console/tests/unit/controllers/onboard/index-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | onboard/index', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:onboard/index');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/controllers/onboard/verify-email-test.js b/console/tests/unit/controllers/onboard/verify-email-test.js
new file mode 100644
index 00000000..f5729c5d
--- /dev/null
+++ b/console/tests/unit/controllers/onboard/verify-email-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Controller | onboard/verify-email', function (hooks) {
+ setupTest(hooks);
+
+ // TODO: Replace this with your real tests.
+ test('it exists', function (assert) {
+ let controller = this.owner.lookup('controller:onboard/verify-email');
+ assert.ok(controller);
+ });
+});
diff --git a/console/tests/unit/initializers/initialize-random-uuid-polyfill-test.js b/console/tests/unit/initializers/initialize-random-uuid-polyfill-test.js
new file mode 100644
index 00000000..c1d9f3ca
--- /dev/null
+++ b/console/tests/unit/initializers/initialize-random-uuid-polyfill-test.js
@@ -0,0 +1,37 @@
+import Application from '@ember/application';
+
+import config from '@fleetbase/console/config/environment';
+import { initialize } from '@fleetbase/console/initializers/initialize-random-uuid-polyfill';
+import { module, test } from 'qunit';
+import Resolver from 'ember-resolver';
+import { run } from '@ember/runloop';
+
+module('Unit | Initializer | initialize-random-uuid-polyfill', function (hooks) {
+ hooks.beforeEach(function () {
+ this.TestApplication = class TestApplication extends Application {
+ modulePrefix = config.modulePrefix;
+ podModulePrefix = config.podModulePrefix;
+ Resolver = Resolver;
+ };
+
+ this.TestApplication.initializer({
+ name: 'initializer under test',
+ initialize,
+ });
+
+ this.application = this.TestApplication.create({
+ autoboot: false,
+ });
+ });
+
+ hooks.afterEach(function () {
+ run(this.application, 'destroy');
+ });
+
+ // TODO: Replace this with your real tests.
+ test('it works', async function (assert) {
+ await this.application.boot();
+
+ assert.ok(true);
+ });
+});
diff --git a/console/tests/unit/initializers/load-socketcluster-client-test.js b/console/tests/unit/initializers/load-socketcluster-client-test.js
new file mode 100644
index 00000000..c86eb3e5
--- /dev/null
+++ b/console/tests/unit/initializers/load-socketcluster-client-test.js
@@ -0,0 +1,37 @@
+import Application from '@ember/application';
+
+import config from '@fleetbase/console/config/environment';
+import { initialize } from '@fleetbase/console/initializers/load-socketcluster-client';
+import { module, test } from 'qunit';
+import Resolver from 'ember-resolver';
+import { run } from '@ember/runloop';
+
+module('Unit | Initializer | load-socketcluster-client', function (hooks) {
+ hooks.beforeEach(function () {
+ this.TestApplication = class TestApplication extends Application {
+ modulePrefix = config.modulePrefix;
+ podModulePrefix = config.podModulePrefix;
+ Resolver = Resolver;
+ };
+
+ this.TestApplication.initializer({
+ name: 'initializer under test',
+ initialize,
+ });
+
+ this.application = this.TestApplication.create({
+ autoboot: false,
+ });
+ });
+
+ hooks.afterEach(function () {
+ run(this.application, 'destroy');
+ });
+
+ // TODO: Replace this with your real tests.
+ test('it works', async function (assert) {
+ await this.application.boot();
+
+ assert.ok(true);
+ });
+});
diff --git a/console/tests/unit/instance-initializers/load-extensions-test.js b/console/tests/unit/instance-initializers/load-extensions-test.js
new file mode 100644
index 00000000..ed2350e2
--- /dev/null
+++ b/console/tests/unit/instance-initializers/load-extensions-test.js
@@ -0,0 +1,39 @@
+import Application from '@ember/application';
+
+import config from '@fleetbase/console/config/environment';
+import { initialize } from '@fleetbase/console/instance-initializers/load-extensions';
+import { module, test } from 'qunit';
+import Resolver from 'ember-resolver';
+import { run } from '@ember/runloop';
+
+module('Unit | Instance Initializer | load-extensions', function (hooks) {
+ hooks.beforeEach(function () {
+ this.TestApplication = class TestApplication extends Application {
+ modulePrefix = config.modulePrefix;
+ podModulePrefix = config.podModulePrefix;
+ Resolver = Resolver;
+ };
+
+ this.TestApplication.instanceInitializer({
+ name: 'initializer under test',
+ initialize,
+ });
+
+ this.application = this.TestApplication.create({
+ autoboot: false,
+ });
+
+ this.instance = this.application.buildInstance();
+ });
+ hooks.afterEach(function () {
+ run(this.instance, 'destroy');
+ run(this.application, 'destroy');
+ });
+
+ // TODO: Replace this with your real tests.
+ test('it works', async function (assert) {
+ await this.instance.boot();
+
+ assert.ok(true);
+ });
+});
diff --git a/console/tests/unit/models/brand-test.js b/console/tests/unit/models/brand-test.js
new file mode 100644
index 00000000..15c41a17
--- /dev/null
+++ b/console/tests/unit/models/brand-test.js
@@ -0,0 +1,13 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Model | brand', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let model = store.createRecord('brand', {});
+ assert.ok(model);
+ });
+});
diff --git a/console/tests/unit/models/category-test.js b/console/tests/unit/models/category-test.js
new file mode 100644
index 00000000..13d59e68
--- /dev/null
+++ b/console/tests/unit/models/category-test.js
@@ -0,0 +1,13 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Model | category', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let model = store.createRecord('category', {});
+ assert.ok(model);
+ });
+});
diff --git a/console/tests/unit/models/company-test.js b/console/tests/unit/models/company-test.js
new file mode 100644
index 00000000..9cf72b02
--- /dev/null
+++ b/console/tests/unit/models/company-test.js
@@ -0,0 +1,13 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Model | company', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let model = store.createRecord('company', {});
+ assert.ok(model);
+ });
+});
diff --git a/console/tests/unit/models/extension-test.js b/console/tests/unit/models/extension-test.js
new file mode 100644
index 00000000..dcfd6cee
--- /dev/null
+++ b/console/tests/unit/models/extension-test.js
@@ -0,0 +1,13 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Model | extension', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let model = store.createRecord('extension', {});
+ assert.ok(model);
+ });
+});
diff --git a/console/tests/unit/models/file-test.js b/console/tests/unit/models/file-test.js
new file mode 100644
index 00000000..f848f0fa
--- /dev/null
+++ b/console/tests/unit/models/file-test.js
@@ -0,0 +1,13 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Model | file', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let model = store.createRecord('file', {});
+ assert.ok(model);
+ });
+});
diff --git a/console/tests/unit/models/group-test.js b/console/tests/unit/models/group-test.js
new file mode 100644
index 00000000..61b86095
--- /dev/null
+++ b/console/tests/unit/models/group-test.js
@@ -0,0 +1,13 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Model | group', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let model = store.createRecord('group', {});
+ assert.ok(model);
+ });
+});
diff --git a/console/tests/unit/models/permission-test.js b/console/tests/unit/models/permission-test.js
new file mode 100644
index 00000000..f01e4578
--- /dev/null
+++ b/console/tests/unit/models/permission-test.js
@@ -0,0 +1,13 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Model | permission', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let model = store.createRecord('permission', {});
+ assert.ok(model);
+ });
+});
diff --git a/console/tests/unit/models/policy-test.js b/console/tests/unit/models/policy-test.js
new file mode 100644
index 00000000..de6b5797
--- /dev/null
+++ b/console/tests/unit/models/policy-test.js
@@ -0,0 +1,13 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Model | policy', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let model = store.createRecord('policy', {});
+ assert.ok(model);
+ });
+});
diff --git a/console/tests/unit/models/role-test.js b/console/tests/unit/models/role-test.js
new file mode 100644
index 00000000..51c66b4a
--- /dev/null
+++ b/console/tests/unit/models/role-test.js
@@ -0,0 +1,13 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Model | role', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let model = store.createRecord('role', {});
+ assert.ok(model);
+ });
+});
diff --git a/console/tests/unit/models/setting-test.js b/console/tests/unit/models/setting-test.js
new file mode 100644
index 00000000..560a849f
--- /dev/null
+++ b/console/tests/unit/models/setting-test.js
@@ -0,0 +1,13 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Model | setting', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let model = store.createRecord('setting', {});
+ assert.ok(model);
+ });
+});
diff --git a/console/tests/unit/models/transaction-test.js b/console/tests/unit/models/transaction-test.js
new file mode 100644
index 00000000..9e13026c
--- /dev/null
+++ b/console/tests/unit/models/transaction-test.js
@@ -0,0 +1,13 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Model | transaction', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let model = store.createRecord('transaction', {});
+ assert.ok(model);
+ });
+});
diff --git a/console/tests/unit/models/user-device-test.js b/console/tests/unit/models/user-device-test.js
new file mode 100644
index 00000000..d84e89f2
--- /dev/null
+++ b/console/tests/unit/models/user-device-test.js
@@ -0,0 +1,13 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Model | user device', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let model = store.createRecord('user-device', {});
+ assert.ok(model);
+ });
+});
diff --git a/console/tests/unit/models/user-test.js b/console/tests/unit/models/user-test.js
new file mode 100644
index 00000000..b4dd010e
--- /dev/null
+++ b/console/tests/unit/models/user-test.js
@@ -0,0 +1,13 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Model | user', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let model = store.createRecord('user', {});
+ assert.ok(model);
+ });
+});
diff --git a/console/tests/unit/routes/application-test.js b/console/tests/unit/routes/application-test.js
new file mode 100644
index 00000000..76276180
--- /dev/null
+++ b/console/tests/unit/routes/application-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | application', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:application');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/auth/forgot-password-test.js b/console/tests/unit/routes/auth/forgot-password-test.js
new file mode 100644
index 00000000..87657b84
--- /dev/null
+++ b/console/tests/unit/routes/auth/forgot-password-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | auth/forgot-password', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:auth/forgot-password');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/auth/login-test.js b/console/tests/unit/routes/auth/login-test.js
new file mode 100644
index 00000000..9781e376
--- /dev/null
+++ b/console/tests/unit/routes/auth/login-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | auth/login', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:auth/login');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/auth/reset-password-test.js b/console/tests/unit/routes/auth/reset-password-test.js
new file mode 100644
index 00000000..2a4298fe
--- /dev/null
+++ b/console/tests/unit/routes/auth/reset-password-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | auth/reset-password', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:auth/reset-password');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console-test.js b/console/tests/unit/routes/console-test.js
new file mode 100644
index 00000000..2096aff0
--- /dev/null
+++ b/console/tests/unit/routes/console-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/account-test.js b/console/tests/unit/routes/console/account-test.js
new file mode 100644
index 00000000..4061f150
--- /dev/null
+++ b/console/tests/unit/routes/console/account-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/account', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/account');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/account/index-test.js b/console/tests/unit/routes/console/account/index-test.js
new file mode 100644
index 00000000..f6294dc0
--- /dev/null
+++ b/console/tests/unit/routes/console/account/index-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/account/index', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/account/index');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/account/virtual-test.js b/console/tests/unit/routes/console/account/virtual-test.js
new file mode 100644
index 00000000..c0ac4d77
--- /dev/null
+++ b/console/tests/unit/routes/console/account/virtual-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/account/virtual', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/account/virtual');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/admin-test.js b/console/tests/unit/routes/console/admin-test.js
new file mode 100644
index 00000000..9652e436
--- /dev/null
+++ b/console/tests/unit/routes/console/admin-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/admin', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/admin');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/admin/branding-test.js b/console/tests/unit/routes/console/admin/branding-test.js
new file mode 100644
index 00000000..11b26668
--- /dev/null
+++ b/console/tests/unit/routes/console/admin/branding-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/admin/branding', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/admin/branding');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/admin/config-test.js b/console/tests/unit/routes/console/admin/config-test.js
new file mode 100644
index 00000000..995652e9
--- /dev/null
+++ b/console/tests/unit/routes/console/admin/config-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/admin/config', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/admin/config');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/admin/config/cache-test.js b/console/tests/unit/routes/console/admin/config/cache-test.js
new file mode 100644
index 00000000..48c1d199
--- /dev/null
+++ b/console/tests/unit/routes/console/admin/config/cache-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/admin/config/cache', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/admin/config/cache');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/admin/config/database-test.js b/console/tests/unit/routes/console/admin/config/database-test.js
new file mode 100644
index 00000000..45293031
--- /dev/null
+++ b/console/tests/unit/routes/console/admin/config/database-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/admin/config/database', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/admin/config/database');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/admin/config/filesystem-test.js b/console/tests/unit/routes/console/admin/config/filesystem-test.js
new file mode 100644
index 00000000..af7ed5d2
--- /dev/null
+++ b/console/tests/unit/routes/console/admin/config/filesystem-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/admin/config/filesystem', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/admin/config/filesystem');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/admin/config/mail-test.js b/console/tests/unit/routes/console/admin/config/mail-test.js
new file mode 100644
index 00000000..a7f4b90a
--- /dev/null
+++ b/console/tests/unit/routes/console/admin/config/mail-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/admin/config/mail', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/admin/config/mail');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/admin/config/notification-channels-test.js b/console/tests/unit/routes/console/admin/config/notification-channels-test.js
new file mode 100644
index 00000000..96a37f13
--- /dev/null
+++ b/console/tests/unit/routes/console/admin/config/notification-channels-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/admin/config/notification-channels', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/admin/config/notification-channels');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/admin/config/queue-test.js b/console/tests/unit/routes/console/admin/config/queue-test.js
new file mode 100644
index 00000000..bc477a1b
--- /dev/null
+++ b/console/tests/unit/routes/console/admin/config/queue-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/admin/config/queue', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/admin/config/queue');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/admin/config/services-test.js b/console/tests/unit/routes/console/admin/config/services-test.js
new file mode 100644
index 00000000..7eef9ebf
--- /dev/null
+++ b/console/tests/unit/routes/console/admin/config/services-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/admin/config/services', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/admin/config/services');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/admin/config/socket-test.js b/console/tests/unit/routes/console/admin/config/socket-test.js
new file mode 100644
index 00000000..a47a3051
--- /dev/null
+++ b/console/tests/unit/routes/console/admin/config/socket-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/admin/config/socket', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/admin/config/socket');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/admin/index-test.js b/console/tests/unit/routes/console/admin/index-test.js
new file mode 100644
index 00000000..e4b0744f
--- /dev/null
+++ b/console/tests/unit/routes/console/admin/index-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/admin/index', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/admin/index');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/admin/virtual-test.js b/console/tests/unit/routes/console/admin/virtual-test.js
new file mode 100644
index 00000000..e5d982b8
--- /dev/null
+++ b/console/tests/unit/routes/console/admin/virtual-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/admin/virtual', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/admin/virtual');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/extensions-test.js b/console/tests/unit/routes/console/extensions-test.js
new file mode 100644
index 00000000..7ccba108
--- /dev/null
+++ b/console/tests/unit/routes/console/extensions-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/extensions', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/extensions');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/home-test.js b/console/tests/unit/routes/console/home-test.js
new file mode 100644
index 00000000..eca6d72e
--- /dev/null
+++ b/console/tests/unit/routes/console/home-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/home', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/home');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/settings-test.js b/console/tests/unit/routes/console/settings-test.js
new file mode 100644
index 00000000..c327b984
--- /dev/null
+++ b/console/tests/unit/routes/console/settings-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/settings', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/settings');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/settings/index-test.js b/console/tests/unit/routes/console/settings/index-test.js
new file mode 100644
index 00000000..88e30c88
--- /dev/null
+++ b/console/tests/unit/routes/console/settings/index-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/settings/index', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/settings/index');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/settings/virtual-test.js b/console/tests/unit/routes/console/settings/virtual-test.js
new file mode 100644
index 00000000..cb4ee47b
--- /dev/null
+++ b/console/tests/unit/routes/console/settings/virtual-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/settings/virtual', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/settings/virtual');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/console/virtual-test.js b/console/tests/unit/routes/console/virtual-test.js
new file mode 100644
index 00000000..aedf12b8
--- /dev/null
+++ b/console/tests/unit/routes/console/virtual-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | console/virtual', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:console/virtual');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/install-test.js b/console/tests/unit/routes/install-test.js
new file mode 100644
index 00000000..9d6994f9
--- /dev/null
+++ b/console/tests/unit/routes/install-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | install', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:install');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/invite-test.js b/console/tests/unit/routes/invite-test.js
new file mode 100644
index 00000000..0be17fea
--- /dev/null
+++ b/console/tests/unit/routes/invite-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | invite', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:invite');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/invite/for-driver-test.js b/console/tests/unit/routes/invite/for-driver-test.js
new file mode 100644
index 00000000..cdd48254
--- /dev/null
+++ b/console/tests/unit/routes/invite/for-driver-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | invite/for-driver', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:invite/for-driver');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/invite/for-user-test.js b/console/tests/unit/routes/invite/for-user-test.js
new file mode 100644
index 00000000..dd1d4aa4
--- /dev/null
+++ b/console/tests/unit/routes/invite/for-user-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | invite/for-user', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:invite/for-user');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/onboard-test.js b/console/tests/unit/routes/onboard-test.js
new file mode 100644
index 00000000..d626b6b9
--- /dev/null
+++ b/console/tests/unit/routes/onboard-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | onboard', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:onboard');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/onboard/index-test.js b/console/tests/unit/routes/onboard/index-test.js
new file mode 100644
index 00000000..9f606d62
--- /dev/null
+++ b/console/tests/unit/routes/onboard/index-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | onboard/index', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:onboard/index');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/routes/onboard/verify-email-test.js b/console/tests/unit/routes/onboard/verify-email-test.js
new file mode 100644
index 00000000..8990c8f1
--- /dev/null
+++ b/console/tests/unit/routes/onboard/verify-email-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Route | onboard/verify-email', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ let route = this.owner.lookup('route:onboard/verify-email');
+ assert.ok(route);
+ });
+});
diff --git a/console/tests/unit/serializers/brand-test.js b/console/tests/unit/serializers/brand-test.js
new file mode 100644
index 00000000..3c752a2f
--- /dev/null
+++ b/console/tests/unit/serializers/brand-test.js
@@ -0,0 +1,23 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Serializer | brand', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let serializer = store.serializerFor('brand');
+
+ assert.ok(serializer);
+ });
+
+ test('it serializes records', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let record = store.createRecord('brand', {});
+
+ let serializedRecord = record.serialize();
+
+ assert.ok(serializedRecord);
+ });
+});
diff --git a/console/tests/unit/serializers/category-test.js b/console/tests/unit/serializers/category-test.js
new file mode 100644
index 00000000..e4636f4e
--- /dev/null
+++ b/console/tests/unit/serializers/category-test.js
@@ -0,0 +1,23 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Serializer | category', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let serializer = store.serializerFor('category');
+
+ assert.ok(serializer);
+ });
+
+ test('it serializes records', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let record = store.createRecord('category', {});
+
+ let serializedRecord = record.serialize();
+
+ assert.ok(serializedRecord);
+ });
+});
diff --git a/console/tests/unit/serializers/group-test.js b/console/tests/unit/serializers/group-test.js
new file mode 100644
index 00000000..d98d3e08
--- /dev/null
+++ b/console/tests/unit/serializers/group-test.js
@@ -0,0 +1,23 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Serializer | group', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let serializer = store.serializerFor('group');
+
+ assert.ok(serializer);
+ });
+
+ test('it serializes records', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let record = store.createRecord('group', {});
+
+ let serializedRecord = record.serialize();
+
+ assert.ok(serializedRecord);
+ });
+});
diff --git a/console/tests/unit/serializers/permission-test.js b/console/tests/unit/serializers/permission-test.js
new file mode 100644
index 00000000..0bc575ec
--- /dev/null
+++ b/console/tests/unit/serializers/permission-test.js
@@ -0,0 +1,23 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Serializer | permission', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let serializer = store.serializerFor('permission');
+
+ assert.ok(serializer);
+ });
+
+ test('it serializes records', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let record = store.createRecord('permission', {});
+
+ let serializedRecord = record.serialize();
+
+ assert.ok(serializedRecord);
+ });
+});
diff --git a/console/tests/unit/serializers/policy-test.js b/console/tests/unit/serializers/policy-test.js
new file mode 100644
index 00000000..38c0e936
--- /dev/null
+++ b/console/tests/unit/serializers/policy-test.js
@@ -0,0 +1,23 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Serializer | policy', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let serializer = store.serializerFor('policy');
+
+ assert.ok(serializer);
+ });
+
+ test('it serializes records', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let record = store.createRecord('policy', {});
+
+ let serializedRecord = record.serialize();
+
+ assert.ok(serializedRecord);
+ });
+});
diff --git a/console/tests/unit/serializers/role-test.js b/console/tests/unit/serializers/role-test.js
new file mode 100644
index 00000000..2356417d
--- /dev/null
+++ b/console/tests/unit/serializers/role-test.js
@@ -0,0 +1,23 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Serializer | role', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let serializer = store.serializerFor('role');
+
+ assert.ok(serializer);
+ });
+
+ test('it serializes records', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let record = store.createRecord('role', {});
+
+ let serializedRecord = record.serialize();
+
+ assert.ok(serializedRecord);
+ });
+});
diff --git a/console/tests/unit/serializers/user-test.js b/console/tests/unit/serializers/user-test.js
new file mode 100644
index 00000000..60cf412a
--- /dev/null
+++ b/console/tests/unit/serializers/user-test.js
@@ -0,0 +1,23 @@
+import { module, test } from 'qunit';
+import { setupTest } from '@fleetbase/console/tests/helpers';
+
+module('Unit | Serializer | user', function (hooks) {
+ setupTest(hooks);
+
+ // Replace this with your real tests.
+ test('it exists', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let serializer = store.serializerFor('user');
+
+ assert.ok(serializer);
+ });
+
+ test('it serializes records', function (assert) {
+ let store = this.owner.lookup('service:store');
+ let record = store.createRecord('user', {});
+
+ let serializedRecord = record.serialize();
+
+ assert.ok(serializedRecord);
+ });
+});
diff --git a/console/tests/unit/utils/get-permission-action-test.js b/console/tests/unit/utils/get-permission-action-test.js
new file mode 100644
index 00000000..c7c78fd1
--- /dev/null
+++ b/console/tests/unit/utils/get-permission-action-test.js
@@ -0,0 +1,10 @@
+import getPermissionAction from '@fleetbase/console/utils/get-permission-action';
+import { module, test } from 'qunit';
+
+module('Unit | Utility | get-permission-action', function () {
+ // TODO: Replace this with your real tests.
+ test('it works', function (assert) {
+ let result = getPermissionAction();
+ assert.ok(result);
+ });
+});
diff --git a/console/tests/unit/utils/get-permission-resource-test.js b/console/tests/unit/utils/get-permission-resource-test.js
new file mode 100644
index 00000000..3ffa2168
--- /dev/null
+++ b/console/tests/unit/utils/get-permission-resource-test.js
@@ -0,0 +1,10 @@
+import getPermissionResource from '@fleetbase/console/utils/get-permission-resource';
+import { module, test } from 'qunit';
+
+module('Unit | Utility | get-permission-resource', function () {
+ // TODO: Replace this with your real tests.
+ test('it works', function (assert) {
+ let result = getPermissionResource();
+ assert.ok(result);
+ });
+});
diff --git a/console/tests/unit/utils/get-service-name-test.js b/console/tests/unit/utils/get-service-name-test.js
new file mode 100644
index 00000000..bd9188d7
--- /dev/null
+++ b/console/tests/unit/utils/get-service-name-test.js
@@ -0,0 +1,10 @@
+import getServiceName from '@fleetbase/console/utils/get-service-name';
+import { module, test } from 'qunit';
+
+module('Unit | Utility | get-service-name', function () {
+ // TODO: Replace this with your real tests.
+ test('it works', function (assert) {
+ let result = getServiceName();
+ assert.ok(result);
+ });
+});
diff --git a/console/translations/en-us.yaml b/console/translations/en-us.yaml
new file mode 100644
index 00000000..9ab375e9
--- /dev/null
+++ b/console/translations/en-us.yaml
@@ -0,0 +1,30 @@
+app:
+ name: Fleetbase
+
+layout:
+ header:
+ menus:
+ organization:
+ settings: Organization settings
+ create-or-join: Create or join organizations
+ explore-extensions: Explore extensions
+ user:
+ view-profile: View profile
+ keyboard-shortcuts: Show keyboard shortcuts
+ changelog: Changelog
+
+terms:
+ new: New
+ sort: Sort
+ filter: Filer
+ columns: Columns
+ settings: Settings
+ home: Home
+ admin: Admin
+ logout: Logout
+ dashboard: Dashboard
+ search: Search
+phrases:
+ search-input: Search Input
+
+
diff --git a/console/vendor/.gitkeep b/console/vendor/.gitkeep
new file mode 100644
index 00000000..e69de29b