Compare commits

..

92 Commits

Author SHA1 Message Date
Ronald A. Richardson
a74c2c94ea restore cd workflow on qa 2025-12-06 21:40:49 +08:00
Ronald A. Richardson
9b0222696e v0.7.21 fully working 2025-12-06 21:39:56 +08:00
Ronald A. Richardson
7a6f9f39e4 fix: always load extensions in load-extensions initializer
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-12-06 21:28:22 +08:00
Ronald A. Richardson
295be2257c Debugging: trying instance initializer patch 2025-12-06 21:25:26 +08:00
Ronald A. Richardson
4d28630470 Merge branch 'dev-v0.7.21' of github.com:fleetbase/fleetbase into cloud-qa 2025-12-06 19:40:47 +08:00
Ronald A. Richardson
ae19256fa6 Hotfix: added fleetbase-extension-generator lib dependency to package.json
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-12-05 23:25:40 +08:00
Ronald A. Richardson
46275a5f53 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-12-05 23:24:25 +08:00
Ronald A. Richardson
ee9fc56fcd Hotfix: merge app/router.js
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-12-05 22:52:47 +08:00
Ronald A. Richardson
b20b74140f Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-12-05 22:35:28 +08:00
Ronald A. Richardson
bcfe690d26 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-12-05 22:31:43 +08:00
Ronald A. Richardson
ccc2fa6cbe Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-11-18 12:07:00 +08:00
Ronald A. Richardson
30ef64c210 refresh lockfile for qa deploy
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-11-07 10:35:55 +08:00
Ronald A. Richardson
a55380c72e Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-11-07 10:31:48 +08:00
Ronald A. Richardson
fe0194f6ea fix composer lockfile
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-11-01 14:51:54 +08:00
Ronald A. Richardson
dee9aef7a2 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-11-01 14:48:10 +08:00
Ronald A. Richardson
a5f9550d50 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-10-30 19:22:52 +08:00
Ronald A. Richardson
ce3e4df484 refresh composer dependencies
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-10-28 06:35:16 +08:00
Ronald A. Richardson
df36449792 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-10-28 06:17:40 +08:00
Ronald A. Richardson
4fa6be74c6 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-10-22 13:18:47 +08:00
Ronald A. Richardson
81aa42f4cb Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-10-15 23:41:54 +08:00
Ronald A. Richardson
7a6b3e3637 Hotfix: only build amd64 images for deploy
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-09-02 16:13:15 +08:00
Ronald A. Richardson
36d0e89ebf Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-09-02 15:54:22 +08:00
Ronald A. Richardson
21ed248446 Hotfix: autoboot aws-marketplace extension
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-08-13 18:35:54 +08:00
Ronald A. Richardson
42a00010fd Hotfix: autoboot aws-marketplace extension 2025-08-13 18:29:39 +08:00
Ronald A. Richardson
7ed51fb118 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-08-13 18:12:09 +08:00
Ronald A. Richardson
d8ceb83ec1 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-08-12 19:11:25 +08:00
Ronald A. Richardson
472533f5bf Upgrade AWS Marketplace extention to v0.0.2
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-08-10 18:06:32 +08:00
Ronald A. Richardson
dd509db1b5 fix dependency hell
Some checks are pending
Fleetbase CI/CD / Build and Deploy the Service (push) Waiting to run
Fleetbase CI/CD / Build and Deploy the Console (push) Blocked by required conditions
2025-08-09 20:15:10 +08:00
Ronald A. Richardson
3bf6324eeb fix dependencies for qa deploy 2025-08-09 20:04:43 +08:00
Ronald A. Richardson
5f2b6395f3 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-08-09 19:51:14 +08:00
Ronald A. Richardson
b822327885 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-06-04 12:56:54 +08:00
Ronald A. Richardson
856e459e74 Fix v0.7.5 Deploy
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-05-30 17:58:13 +08:00
Ronald A. Richardson
76f717ab42 v0.7.5 qa deploy 2025-05-30 17:35:04 +08:00
Ronald A. Richardson
7b48d47530 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-05-30 17:31:00 +08:00
Ronald A. Richardson
f5ccc2eab5 Fix v0.7.4 QA Deploy
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-05-26 18:44:29 +08:00
Ronald A. Richardson
be0396ef0d Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-05-26 16:50:39 +08:00
Ronald A. Richardson
73e0020f12 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-05-24 14:49:15 +08:00
Ronald A. Richardson
ee46f4ef1b Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks are pending
Fleetbase CI/CD / Build and Deploy the Service (push) Waiting to run
Fleetbase CI/CD / Build and Deploy the Console (push) Blocked by required conditions
2025-05-23 20:43:17 +08:00
Ronald A. Richardson
9305d71c4d Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-05-22 13:01:20 +08:00
Ronald A. Richardson
fceaee5a5a Fix v0.7.0 cloud deploy
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-05-16 18:15:46 +08:00
Ronald A. Richardson
f7ef4e90b0 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-05-16 18:00:20 +08:00
Ronald A. Richardson
5d883456d8 fix: Updated with correct version indicator
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-05-08 20:16:15 +08:00
Ronald A. Richardson
f5873a714c Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-05-08 20:15:02 +08:00
Ronald A. Richardson
815a0a55c2 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks are pending
Fleetbase CI/CD / Build and Deploy the Service (push) Waiting to run
Fleetbase CI/CD / Build and Deploy the Console (push) Blocked by required conditions
2025-05-08 12:53:51 +08:00
Ronald A. Richardson
188aeb111b Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-05-01 12:35:34 +08:00
Ronald A. Richardson
bcd6e20c2a Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-04-14 16:22:26 +08:00
Ronald A. Richardson
3cfe25d57d Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-04-11 13:22:28 +08:00
Ronald A. Richardson
77bbfc4209 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-04-11 10:27:37 +08:00
Ronald A. Richardson
2574e6600a Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks are pending
Fleetbase CI/CD / Build and Deploy the Service (push) Waiting to run
Fleetbase CI/CD / Build and Deploy the Console (push) Blocked by required conditions
2025-04-10 14:15:57 +08:00
Ronald A. Richardson
9a099879b6 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks are pending
Fleetbase CI/CD / Build and Deploy the Service (push) Waiting to run
Fleetbase CI/CD / Build and Deploy the Console (push) Blocked by required conditions
2025-04-09 19:51:32 +08:00
Ronald A. Richardson
759948fb7d Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-03-31 11:21:59 +08:00
Ronald A. Richardson
d46501caaf Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-03-27 09:09:10 +08:00
Ronald A. Richardson
909a3908d6 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-02-26 20:43:01 +08:00
Ronald A. Richardson
6acdb4cf8e v0.5.29 Upgrade
Some checks are pending
Fleetbase CI/CD / Build and Deploy the Service (push) Waiting to run
Fleetbase CI/CD / Build and Deploy the Console (push) Blocked by required conditions
2025-02-25 20:56:39 +08:00
Ronald A. Richardson
eafa8987fa Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-02-25 20:53:45 +08:00
Ronald A. Richardson
ff9db8c075 Merge branch 'dev-v0.5.29' of github.com:fleetbase/fleetbase into cloud-qa
Some checks are pending
Fleetbase CI/CD / Build and Deploy the Service (push) Waiting to run
Fleetbase CI/CD / Build and Deploy the Console (push) Blocked by required conditions
2025-02-25 20:10:46 +08:00
Ronald A. Richardson
4416199aca fixed lockfile 2025-02-25 19:00:42 +08:00
Ronald A. Richardson
2589d947c9 added appstract/laravel-opcache package 2025-02-25 18:55:41 +08:00
Ronald A. Richardson
582a5f69fa removed --https and --http-redirect octane flags 2025-02-25 18:24:55 +08:00
Ronald A. Richardson
ff02943f7b updated lockfile 2025-02-25 18:23:14 +08:00
Ronald A. Richardson
a3dc172c5f hotfix deployment - disable octane reload 2025-02-25 17:28:07 +08:00
Ronald A. Richardson
ade87a39bb hotfix deploy config serialization error 2025-02-25 17:19:46 +08:00
Ronald A. Richardson
4b2e93c7fc Merge branch 'dev-v0.5.29' of github.com:fleetbase/fleetbase into cloud-qa 2025-02-25 16:51:27 +08:00
Ronald A. Richardson
cc571e2622 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-02-21 20:59:39 +08:00
Ronald A. Richardson
59304c6d02 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-02-13 15:03:06 +08:00
Ronald A. Richardson
0b7859cb19 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-02-04 23:55:55 +08:00
Ronald A. Richardson
5202d31a9b Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-01-27 15:21:12 +08:00
Ronald A. Richardson
a3967f451e hotfix fix trial days remaining component
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-01-13 12:40:44 +08:00
Ronald A. Richardson
4fd1778ed1 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-01-13 11:26:44 +08:00
Ronald A. Richardson
6980b44239 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa
Some checks failed
Fleetbase CI/CD / Build and Deploy the Service (push) Has been cancelled
Fleetbase CI/CD / Build and Deploy the Console (push) Has been cancelled
2025-01-11 17:52:03 +08:00
Ronald A. Richardson
a349f20298 hotfix console lockfile 2024-12-24 16:21:04 +08:00
Ronald A. Richardson
2b0735efbd Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-12-24 15:37:54 +08:00
Ronald A. Richardson
fdabe55ce2 Upgraded billing extension 2024-11-16 19:29:45 +08:00
Ronald A. Richardson
369fe0e66f Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-11-09 14:38:22 +08:00
Ronald A. Richardson
2ee81c5c26 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-11-07 18:59:14 +08:00
Ronald A. Richardson
6951ee7003 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-11-07 18:57:59 +08:00
Ronald A. Richardson
a824e7da85 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-11-07 18:50:23 +08:00
Ronald A. Richardson
c85b761c28 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-10-17 17:29:31 +08:00
Ronald A. Richardson
9080265806 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-10-15 20:26:29 +08:00
Ronald A. Richardson
5a40d964fe Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-10-10 11:07:39 +08:00
Ronald A. Richardson
2bcd29363c Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-10-08 21:56:59 +08:00
Ronald A. Richardson
5894500121 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-10-04 17:40:54 +08:00
Ronald A. Richardson
fee801c38f Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-10-02 19:34:52 +08:00
Ronald A. Richardson
151ce5d82d Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-08-31 16:28:53 +08:00
Ronald A. Richardson
533f175de0 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-08-31 16:24:15 +08:00
Ronald A. Richardson
0d6b8edcc8 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-08-30 18:24:11 +08:00
Ronald A. Richardson
3f848fd9d8 Fix composer.lock 2024-08-30 16:20:39 +08:00
Ronald A. Richardson
182a5e5d45 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-08-30 15:53:16 +08:00
Ronald A. Richardson
253c68e0ac Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-08-06 13:57:44 +08:00
Ronald A. Richardson
54bee62335 added flespi extension 2024-07-31 18:36:41 +08:00
Ronald A. Richardson
23a8c8596e Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2024-07-31 18:03:55 +08:00
Ronald A. Richardson
18596450ee qa environment setup with qa registry 2024-07-31 17:52:39 +08:00
31 changed files with 1097 additions and 1217 deletions

View File

@@ -206,7 +206,6 @@ jobs:
echo "STRIPE_KEY=${{ secrets.STRIPE_KEY }}" >> ./environments/.env.production
echo "LOGROCKET_APP_ID=${{ secrets.LOGROCKET_APP_ID }}" >> ./environments/.env.production
echo "EXTENSIONS=@fleetbase/billing-engine,@fleetbase/internals-engine,@fleetbase/aws-marketplace" >> ./environments/.env.production
echo "DISABLE_RUNTIME_CONFIG=true" >> ./environments/.env.production
working-directory: ./console
- name: Install dependencies

View File

@@ -8,7 +8,6 @@
http://:8000 {
root * /fleetbase/api/public
encode zstd br gzip
php_server {
resolve_root_symlink
}

View File

@@ -1,27 +1,40 @@
# 🚀 Fleetbase v0.7.24 — 2025-12-21
# 🚀 Fleetbase v0.7.21 — 2025-12-06
> "Critical core-api patches for cache key generation"
> "5x faster css compiling and flawless builds."
---
## ✨ Highlights
### Bug Fixes
- **Fixed cache key collision bug** - Different filter parameters (e.g., `type=customer` vs `type=contact`) now generate unique cache keys instead of returning wrong cached results
- **Fixed BadMethodCallException** - Models without soft deletes (like Permission) no longer crash when calling `getDeletedAtColumn()`
### 🔧 Critical Production Build Fix
### Improvements
- **Added caching to Permission model** - Permission queries now benefit from Redis caching for improved performance
This release resolves a **critical issue** that prevented production builds from succeeding when using ember-ui in Ember Engines environments. All Fleetbase applications and engines should upgrade immediately.
**What was broken:**
Production builds were failing with "Broken @import declaration" errors during CSS minification. Development builds worked fine, but production deployments were completely blocked.
**What we fixed:**
Implemented a proper architectural solution that prevents Ember Engines from attempting to recompile ember-ui styles. The addon now correctly detects when it's being included by an engine and blocks both the style tree distribution and PostCSS configuration override.
**The impact:**
-**Production builds now succeed** without CSS import errors
-**5x faster builds** — CSS is compiled once in the host app instead of being reprocessed by each engine
-**4x smaller bundles** — Eliminated CSS duplication across engine vendor files (reduced from ~3MB to ~750KB in typical setups)
-**Consistent styling** — All engines now use the same compiled CSS from the host application
**Technical details:**
The fix adds engine detection to both the `treeForStyles` and `included` hooks, ensuring that ember-ui styles are compiled exclusively in the host application and inherited by all engines. This follows the proper Ember Engines architecture pattern for shared addon styles.
---
## ⚠️ Breaking Changes
- None 🙂
- None — This is a fully backward-compatible patch that only changes internal build behavior
---
## 🔧 Upgrade Steps
### For System
```bash
# Pull latest version
git pull origin main --no-rebase
@@ -34,6 +47,44 @@ docker compose down && docker compose up -d
docker compose exec application bash -c "./deploy.sh"
```
### For Extension Developers
```bash
# Update ember-ui
pnpm upgrade @fleetbase/ember-ui@^0.3.14 @fleetbase/ember-core@^0.3.8
# Reinstall dependencies
pnpm install
```
### Verification
```bash
# Verify production build succeeds
pnpm build --environment production
# Check bundle sizes (should see significant reduction)
ls -lh dist/assets/vendor*.css
ls -lh dist/engines-dist/*/assets/engine-vendor*.css
```
---
## 📦 What Changed
### Fixed
- **Critical**: Production build failures in Ember Engines environments with "Broken @import declaration" errors
- CSS duplication across engine bundles causing bloated file sizes
- PostCSS configuration conflicts between host app and engines
### Changed
- Added `treeForStyles` hook with engine detection to prevent style tree distribution to engines
- Added engine detection guard in `included` hook to prevent `postcssOptions` override
- Improved CSS import path resolution in PostCSS configuration
### Performance
- Reduced build time by 5x through single CSS compilation
- Reduced total CSS bundle size by 4x through elimination of duplication
- Improved caching efficiency with shared vendor.css
---
## Need help?

View File

@@ -40,6 +40,7 @@ class Kernel extends HttpKernel
],
'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];

View File

@@ -20,18 +20,18 @@
"require": {
"php": ">=8.0 <=8.2.28",
"appstract/laravel-opcache": "^4.0",
"fleetbase/core-api": "^1.6.30",
"fleetbase/fleetops-api": "^0.6.31",
"fleetbase/registry-bridge": "^0.1.2",
"fleetbase/storefront-api": "^0.4.10",
"fleetbase/core-api": "^1.6.27",
"fleetbase/fleetops-api": "^0.6.29",
"fleetbase/flespi-integration": "^0.1.16",
"fleetbase/samsara-api": "^0.0.3",
"fleetbase/vroom-api": "^0.0.3",
"fleetbase/valhalla-api": "^0.0.3",
"fleetbase/billing-api": "^0.1.12",
"fleetbase/internals-api": "^0.0.23",
"fleetbase/aws-marketplace": "^0.0.8",
"fleetbase/flespi-integration": "^0.1.16",
"fleetbase/samsara-api": "^0.0.3",
"fleetbase/registry-bridge": "^0.1.2",
"fleetbase/storefront-api": "^0.4.9",
"fleetbase/customer-portal-api": "^0.0.10",
"fleetbase/valhalla-api": "^0.0.3",
"fleetbase/vroom-api": "^0.0.3",
"guzzlehttp/guzzle": "^7.0.1",
"laravel/framework": "^10.0",
"laravel/octane": "^2.3",
@@ -57,17 +57,25 @@
"phpunit/phpunit": "^10.0"
},
"repositories": [
{
"type": "composer",
"url": "https://registry.fleetbase.io"
},
{
"type": "vcs",
"url": "https://github.com/fleetbase/aws-marketplace"
},
{
"type": "vcs",
"url": "https://github.com/fleetbase/billing"
},
{
"type": "vcs",
"url": "https://github.com/fleetbase/internals"
},
{
"type": "vcs",
"url": "https://github.com/fleetbase/customer-portal"
},
{
"type": "composer",
"url": "https://registry.qa.fleetbase.io"
}
],
"autoload": {

556
api/composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -51,7 +51,7 @@ return [
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single', 'stdout'],
'channels' => ['single'],
'ignore_exceptions' => false,
],

View File

@@ -105,8 +105,8 @@ return [
OperationTerminated::class => [
FlushOnce::class,
FlushTemporaryContainerInstances::class,
DisconnectFromDatabases::class,
CollectGarbage::class,
// DisconnectFromDatabases::class,
// CollectGarbage::class,
],
WorkerErrorOccurred::class => [

View File

@@ -2,7 +2,6 @@ import Application from '@ember/application';
import Resolver from 'ember-resolver';
import loadInitializers from 'ember-load-initializers';
import config from '@fleetbase/console/config/environment';
import './deprecation-workflow';
export default class App extends Application {
modulePrefix = config.modulePrefix;

View File

@@ -0,0 +1,31 @@
<Overlay @isOpen={{@isOpen}} @onLoad={{this.setOverlayContext}} @position="right" @noBackdrop={{true}} @fullHeight={{true}} @width={{or this.width @width "400px"}}>
<Overlay::Header @title={{t "component.dashboard-widget-panel.select-widgets"}} @hideStatusDot={{true}} @titleWrapperClass="leading-5">
<div class="flex flex-1 justify-end">
<Button @type="default" @icon="times" @helpText={{t "component.dashboard-widget-panel.close-and-save"}} @onClick={{this.onPressClose}} />
</div>
</Overlay::Header>
<Overlay::Body @wrapperClass="new-service-rate-overlay-body px-4 space-y-4 pt-4">
<div class="grid grid-cols-1 gap-4 text-xs dark:text-gray-100">
{{#each this.availableWidgets as |widget|}}
<div
class="rounded-lg border border-gray-300 bg-white dark:border-gray-700 dark:bg-gray-800 hover:bg-gray-100 dark:hover:bg-gray-700 transition-all duration-300 ease-in-out shadow-md px-4 py-2 cursor-pointer"
{{on "click" (fn this.addWidgetToDashboard widget)}}
>
<div class="flex flex-row items-center leading-6 mb-2.5">
<div class="w-8 flex items-center justify-start">
<FaIcon @icon={{widget.icon}} class="text-lg text-gray-600 dark:text-gray-300" />
</div>
<p class="text-sm truncate font-semibold dark:text-gray-100 text-gray-800">
{{t "component.dashboard-widget-panel.widget-name" widgetName=widget.name}}
</p>
</div>
<div>
<p class="text-xs dark:text-gray-100 text-gray-800">{{widget.description}}</p>
</div>
</div>
{{/each}}
</div>
<Spacer @height="300px" />
</Overlay::Body>
</Overlay>

View File

@@ -0,0 +1,60 @@
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { inject as service } from '@ember/service';
import { action } from '@ember/object';
export default class DashboardWidgetPanelComponent extends Component {
@service universe;
@tracked availableWidgets = [];
@tracked dashboard;
@tracked isOpen = true;
@service notifications;
/**
* Constructs the component and applies initial state.
*/
constructor(owner, { dashboard }) {
super(...arguments);
this.availableWidgets = this.universe.getDashboardWidgets();
this.dashboard = dashboard;
}
/**
* Sets the overlay context.
*
* @action
* @param {OverlayContextObject} overlayContext
*/
@action setOverlayContext(overlayContext) {
this.context = overlayContext;
if (typeof this.args.onLoad === 'function') {
this.args.onLoad(...arguments);
}
}
@action addWidgetToDashboard(widget) {
// If widget is a component definition/class
if (typeof widget.component === 'function') {
widget.component = widget.component.name;
}
this.args.dashboard.addWidget(widget).catch((error) => {
this.notifications.serverError(error);
});
}
/**
* Handles cancel button press.
*
* @action
*/
@action onPressClose() {
this.isOpen = false;
if (typeof this.args.onClose === 'function') {
this.args.onClose();
}
}
}

View File

@@ -1,61 +1,42 @@
<div class="flex items-center justify-center h-screen min-h-screen px-4 py-12 bg-gray-50 dark:bg-gray-900 sm:px-6 lg:px-8 overflow-y-scroll">
<div class="w-full max-w-md h-screen flex items-center justify-center py-4">
<div class="bg-white dark:bg-gray-800 py-5 px-4 shadow rounded-lg w-full">
<div class="mb-4">
<Image src={{@brand.logo_url}} @fallbackSrc="/images/fleetbase-logo-svg.svg" alt={{t "app.name"}} height="56" class="h-10 object-contain mx-auto" />
<div class="mt-2">
<h2 class="text-center text-lg font-extrabold text-gray-900 dark:text-white truncate">
{{t "onboard.index.title"}}
</h2>
</div>
</div>
<div class="flex px-3 py-2 mb-4 rounded-md shadow-sm bg-blue-200">
<div>
<FaIcon @icon="hand-spock" @size="lg" class="text-blue-900 mr-4" />
</div>
<p class="flex-1 text-sm text-blue-900 dark:text-blue-900">
{{t "onboard.index.welcome-title" htmlSafe=true companyName=(t "app.name")}}
{{t "onboard.index.welcome-text"}}
</p>
</div>
<form {{on "submit" (perform this.onboard)}}>
{{#if this.error}}
<InfoBlock @icon="exclamation-triangle" @text={{this.error}} class="mb-6 px-3 py-2 bg-red-300 text-red-900" @textClass="text-red-900" />
{{/if}}
<InputGroup @name={{t "onboard.index.full-name"}} @value={{this.name}} @helpText={{t "onboard.index.full-name-help-text"}} @inputClass="input-lg" />
<InputGroup @name={{t "onboard.index.your-email"}} @type="email" @value={{this.email}} @helpText={{t "onboard.index.your-email-help-text"}} @inputClass="input-lg" />
<InputGroup @name={{t "onboard.index.phone"}} @helpText={{t "onboard.index.phone-help-text"}}>
<PhoneInput @onInput={{fn (mut this.phone)}} class="form-input input-lg w-full" />
</InputGroup>
<InputGroup @name={{t "onboard.index.organization-name"}} @value={{this.organization_name}} @helpText={{t "onboard.index.organization-help-text"}} @inputClass="input-lg" />
<InputGroup @name={{t "onboard.index.password"}} @value={{this.password}} @type="password" @helpText={{t "onboard.index.password-help-text"}} @inputClass="input-lg" />
<InputGroup
@name={{t "onboard.index.confirm-password"}}
@value={{this.password_confirmation}}
@type="password"
@helpText={{t "onboard.index.confirm-password-help-text"}}
@inputClass="input-lg"
/>
<div class="flex items-center justify-end mt-5">
<Button
@buttonType="submit"
@icon="check"
@iconPrefix="fas"
@type="primary"
@size="lg"
@text={{t "onboard.index.continue-button-text"}}
@isLoading={{this.onboard.isRunning}}
@disabled={{not this.filled}}
/>
</div>
</form>
<RegistryYield @registry="onboard" as |YieldedComponent ctx|>
<YieldedComponent @context={{ctx}} />
</RegistryYield>
<div class="bg-white dark:bg-gray-800 py-5 px-4 shadow rounded-lg w-full">
<div class="mb-4">
<Image src={{@brand.logo_url}} @fallbackSrc="/images/fleetbase-logo-svg.svg" alt={{t "app.name"}} height="56" class="h-10 object-contain mx-auto" />
<div class="mt-2">
<h2 class="text-center text-lg font-extrabold text-gray-900 dark:text-white truncate">
{{t "onboard.index.title"}}
</h2>
</div>
</div>
<div class="flex px-3 py-2 mb-4 rounded-md shadow-sm bg-blue-200">
<div>
<FaIcon @icon="hand-spock" @size="lg" class="text-blue-900 mr-4" />
</div>
<p class="flex-1 text-sm text-blue-900 dark:text-blue-900">
{{t "onboard.index.welcome-title" htmlSafe=true companyName=(t "app.name")}}
{{t "onboard.index.welcome-text"}}
</p>
</div>
<form {{on "submit" (perform this.onboard)}}>
{{#if this.error}}
<InfoBlock @icon="exclamation-triangle" @text={{this.error}} class="mb-6 px-3 py-2 bg-red-300 text-red-900" @textClass="text-red-900" />
{{/if}}
<InputGroup @name={{t "onboard.index.full-name"}} @value={{this.name}} @helpText={{t "onboard.index.full-name-help-text"}} @inputClass="input-lg" />
<InputGroup @name={{t "onboard.index.your-email"}} @type="email" @value={{this.email}} @helpText={{t "onboard.index.your-email-help-text"}} @inputClass="input-lg" />
<InputGroup @name={{t "onboard.index.phone"}} @helpText={{t "onboard.index.phone-help-text"}}>
<PhoneInput @onInput={{fn (mut this.phone)}} class="form-input input-lg w-full" />
</InputGroup>
<InputGroup @name={{t "onboard.index.organization-name"}} @value={{this.organization_name}} @helpText={{t "onboard.index.organization-help-text"}} @inputClass="input-lg" />
<InputGroup @name={{t "onboard.index.password"}} @value={{this.password}} @type="password" @helpText={{t "onboard.index.password-help-text"}} @inputClass="input-lg" />
<InputGroup @name={{t "onboard.index.confirm-password"}} @value={{this.password_confirmation}} @type="password" @helpText={{t "onboard.index.confirm-password-help-text"}} @inputClass="input-lg" />
<div class="flex items-center justify-end mt-5">
<Button @buttonType="submit" @icon="check" @iconPrefix="fas" @type="primary" @size="lg" @text={{t "onboard.index.continue-button-text"}} @isLoading={{this.onboard.isRunning}} @disabled={{not this.filled}} />
</div>
</form>
<RegistryYield @registry="onboard" as |YieldedComponent ctx|>
<YieldedComponent @context={{ctx}} />
</RegistryYield>
</div>

View File

@@ -1,82 +1,78 @@
{{page-title (t "onboard.verify-email.header-title")}}
<div class="flex items-center justify-center h-screen min-h-screen px-4 py-12 bg-gray-50 dark:bg-gray-900 sm:px-6 lg:px-8 overflow-y-scroll">
<div class="w-full max-w-md h-screen flex items-center justify-center py-4">
{{#if this.initialized}}
<div class="bg-white dark:bg-gray-800 py-8 px-4 shadow rounded-lg w-full">
<div class="mb-6">
<LinkTo @route="console" class="flex items-center justify-center">
<LogoIcon @size="12" class="rounded-md" />
</LinkTo>
<h2 class="mt-6 text-center text-lg font-extrabold text-gray-900 dark:text-white truncate">
{{t "onboard.verify-email.title"}}
</h2>
</div>
{{#if this.initialized}}
<div class="bg-white dark:bg-gray-800 py-8 px-4 shadow rounded-lg w-full">
<div class="mb-6">
<LinkTo @route="console" class="flex items-center justify-center">
<LogoIcon @size="12" class="rounded-md" />
</LinkTo>
<h2 class="mt-6 text-center text-lg font-extrabold text-gray-900 dark:text-white truncate">
{{t "onboard.verify-email.title"}}
</h2>
</div>
<InfoBlock @type="info" @icon="shield-halved" @iconSize="lg">
{{t "onboard.verify-email.message-text" htmlSafe=true}}
</InfoBlock>
<InfoBlock @type="info" @icon="shield-halved" @iconSize="lg">
{{t "onboard.verify-email.message-text" htmlSafe=true}}
</InfoBlock>
<form class="mt-8 space-y-6" {{on "submit" (perform this.verify)}}>
<InputGroup
@type="tel"
@name={{t "onboard.verify-email.verification-input-label"}}
@value={{this.code}}
@helpText={{t "onboard.verify-email.verification-code-text"}}
@inputClass="input-lg"
{{on "input" this.verification.validateInput}}
{{did-insert this.verification.validateInput}}
/>
<form class="mt-8 space-y-6" {{on "submit" (perform this.verify)}}>
<InputGroup
@type="tel"
@name={{t "onboard.verify-email.verification-input-label"}}
@value={{this.code}}
@helpText={{t "onboard.verify-email.verification-code-text"}}
@inputClass="input-lg"
{{on "input" this.verification.validateInput}}
{{did-insert this.verification.validateInput}}
/>
<div class="flex flex-row items-center space-x-4">
<Button
@icon="check"
@iconPrefix="fas"
@buttonType="submit"
@type="primary"
@size="lg"
@text="Verify & Continue"
@isLoading={{this.verify.isRunning}}
@disabled={{not this.verification.ready}}
/>
<a href="#" {{on "click" this.verification.didntReceiveCode}} class="text-sm text-blue-400 hover:text-blue-300">{{t "onboard.verify-email.didnt-receive-a-code"}}</a>
</div>
<div class="flex flex-row items-center space-x-4">
<Button
@icon="check"
@iconPrefix="fas"
@buttonType="submit"
@type="primary"
@size="lg"
@text="Verify & Continue"
@isLoading={{this.verify.isRunning}}
@disabled={{not this.verification.ready}}
/>
<a href="#" {{on "click" this.verification.didntReceiveCode}} class="text-sm text-blue-400 hover:text-blue-300">{{t "onboard.verify-email.didnt-receive-a-code"}}</a>
</div>
{{#if this.verification.waiting}}
<div class="flex flex-col flex-grow-0 flex-shrink-0 text-sm bg-yellow-800 border border-yellow-600 px-2 py-2 rounded-md text-yellow-100 my-4 transition-all">
<div class="flex flex-row items-start mb-2">
<div class="w-8 flex-grow-0 flex-shrink-0">
<FaIcon @icon="triangle-exclamation" @size="xl" class="pt-1" />
</div>
<div class="flex-1">
<div class="flex-1 text-sm text-yellow-100">
<div>{{t "auth.verification.didnt-receive-a-code" htmlSafe=true}}</div>
<div>{{t "auth.verification.not-sent.alternative-choice" htmlSafe=true}}</div>
</div>
</div>
</div>
<div class="flex items-center space-x-2">
<Button
@text={{t "auth.verification.not-sent.resend-email"}}
@buttonType="button"
@type="link"
class="text-yellow-100"
@wrapperClass="px-4 py-2 bg-gray-900 bg-opacity-25 hover:opacity-50"
@onClick={{this.verification.resendEmail}}
/>
<Button
@text={{t "auth.verification.not-sent.send-by-sms"}}
@buttonType="button"
@type="link"
class="text-yellow-100"
@wrapperClass="px-4 py-2 bg-gray-900 bg-opacity-25 hover:opacity-50"
@onClick={{this.verification.resendBySms}}
/>
{{#if this.verification.waiting}}
<div class="flex flex-col flex-grow-0 flex-shrink-0 text-sm bg-yellow-800 border border-yellow-600 px-2 py-2 rounded-md text-yellow-100 my-4 transition-all">
<div class="flex flex-row items-start mb-2">
<div class="w-8 flex-grow-0 flex-shrink-0">
<FaIcon @icon="triangle-exclamation" @size="xl" class="pt-1" />
</div>
<div class="flex-1">
<div class="flex-1 text-sm text-yellow-100">
<div>{{t "auth.verification.didnt-receive-a-code" htmlSafe=true}}</div>
<div>{{t "auth.verification.not-sent.alternative-choice" htmlSafe=true}}</div>
</div>
</div>
{{/if}}
</form>
</div>
{{/if}}
</div>
<div class="flex items-center space-x-2">
<Button
@text={{t "auth.verification.not-sent.resend-email"}}
@buttonType="button"
@type="link"
class="text-yellow-100"
@wrapperClass="px-4 py-2 bg-gray-900 bg-opacity-25 hover:opacity-50"
@onClick={{this.verification.resendEmail}}
/>
<Button
@text={{t "auth.verification.not-sent.send-by-sms"}}
@buttonType="button"
@type="link"
class="text-yellow-100"
@wrapperClass="px-4 py-2 bg-gray-900 bg-opacity-25 hover:opacity-50"
@onClick={{this.verification.resendBySms}}
/>
</div>
</div>
{{/if}}
</form>
</div>
</div>
{{/if}}

View File

@@ -1,9 +1,7 @@
<section class="onboarding step-host">
{{#if this.initialized}}
{{#if this.orchestrator.wrapper}}
{{component (lazy-engine-component this.orchestrator.wrapper) currentStepComponent=this.currentComponent context=this.context orchestrator=this.orchestrator brand=@brand}}
{{else if this.currentComponent}}
{{component (lazy-engine-component this.currentComponent) context=this.context orchestrator=this.orchestrator brand=@brand}}
{{#if this.currentComponent}}
{{component this.currentComponent context=this.context orchestrator=this.orchestrator brand=@brand}}
{{/if}}
{{else}}
<div class="flex items-center justify-center min-h-24">

View File

@@ -68,7 +68,6 @@ export default class ConsoleAccountIndexController extends Controller {
subject_uuid: this.user.id,
subject_type: 'user',
type: 'user_avatar',
resize: 'md'
},
(uploadedFile) => {
this.user.setProperties({

View File

@@ -6,13 +6,35 @@ import createNotificationKey from '@fleetbase/ember-core/utils/create-notificati
import { task } from 'ember-concurrency';
export default class ConsoleSettingsNotificationsController extends Controller {
/**
* Inject the notifications service.
*
* @memberof ConsoleSettingsNotificationsController
*/
@service notifications;
/**
* Inject the fetch service.
*
* @memberof ConsoleSettingsNotificationsController
*/
@service fetch;
@service store;
@service currentUser;
/**
* The notification settings value JSON.
*
* @memberof ConsoleSettingsNotificationsController
* @var {Object}
*/
@tracked notificationSettings = {};
/**
* Notification transport methods enabled.
*
* @memberof ConsoleSettingsNotificationsController
* @var {Array}
*/
@tracked notificationTransportMethods = ['email', 'sms'];
@tracked company;
/**
* Creates an instance of ConsoleSettingsNotificationsController.
@@ -23,40 +45,6 @@ export default class ConsoleSettingsNotificationsController extends Controller {
this.getSettings.perform();
}
/**
* Toggles the "Alphanumeric Sender ID" feature for the current company.
*
* Updates the company's `options` object by setting the
* `alpha_numeric_sender_id_enabled` flag. This controls whether the
* organization uses a custom alphanumeric sender ID when sending SMS.
*
* @action
* @param {boolean} enabled - Whether the feature should be enabled or disabled.
* @returns {void}
*/
@action toggleAlphaNumericSenderId(enabled) {
const currentOptions = this.company.options ?? {};
this.company.set('options', { ...currentOptions, alpha_numeric_sender_id_enabled: enabled });
}
/**
* Sets the Alphanumeric Sender ID string for the current company.
*
* Reads the input's value from the event and updates the company's `options`
* object by setting the `alpha_numeric_sender_id` field. This value represents
* the sender name that will appear in outbound SMS messages (subject to carrier
* support and restrictions).
*
* @action
* @param {Event} event - Input event containing the alphanumeric sender ID value.
* @returns {void}
*/
@action setAlphaNumericSenderId(event) {
const value = event.target.value;
const currentOptions = this.company.options ?? {};
this.company.set('options', { ...currentOptions, alpha_numeric_sender_id: value });
}
/**
* Selectes notifiables for settings.
*
@@ -106,8 +94,7 @@ export default class ConsoleSettingsNotificationsController extends Controller {
const { notificationSettings } = this;
try {
yield this.fetch.post('notifications/save-settings', { notificationSettings: notificationSettings ?? {} });
yield this.saveCompanyOptions.perform();
yield this.fetch.post('notifications/save-settings', { notificationSettings });
this.notifications.success('Notification settings successfully saved.');
} catch (error) {
this.notifications.serverError(error);
@@ -127,26 +114,4 @@ export default class ConsoleSettingsNotificationsController extends Controller {
this.notifications.serverError(error);
}
}
/**
* Saves the updated company options to the backend.
*
* This ember-concurrency task attempts to persist the company's modified
* `options` object by calling `company.save()`. If the request fails, a server
* error notification is displayed. No action is taken if no company is loaded.
*
* @task
* @generator
* @yields {Promise} Resolves when the save request completes.
* @returns {Promise<void>} Task completion state.
*/
@task *saveCompanyOptions() {
if (!this.company) return;
try {
yield this.company.save();
} catch (error) {
this.notifications.serverError(error);
}
}
}

View File

@@ -1,9 +0,0 @@
import setupDeprecationWorkflow from 'ember-cli-deprecation-workflow';
setupDeprecationWorkflow({
workflow: [
{ handler: 'silence', matchId: 'ember-concurrency.deprecate-decorator-task' },
{ handler: 'silence', matchId: 'new-helper-names' },
{ handler: 'silence', matchId: 'ember-data:deprecate-non-strict-relationships' },
],
});

View File

@@ -24,7 +24,7 @@ export default class Company extends Model {
@attr('string') logo_url;
@attr('string') backdrop_url;
@attr('string') description;
@attr('object') options;
@attr('raw') options;
@attr('number') users_count;
@attr('string') type;
@attr('string') currency;

View File

@@ -5,7 +5,6 @@ import groupBy from '@fleetbase/ember-core/utils/group-by';
export default class ConsoleSettingsNotificationsRoute extends Route {
@service fetch;
@service currentUser;
model() {
return hash({
@@ -14,11 +13,10 @@ export default class ConsoleSettingsNotificationsRoute extends Route {
});
}
async setupController(controller, { registry, notifiables }) {
setupController(controller, { registry, notifiables }) {
super.setupController(...arguments);
controller.groupedNotifications = groupBy(registry, 'package');
controller.notifiables = notifiables;
controller.company = await this.currentUser.loadCompany();
}
}

View File

@@ -4,6 +4,8 @@ import { EmbeddedRecordsMixin } from '@ember-data/serializer/rest';
export default class UserSerializer extends ApplicationSerializer.extend(EmbeddedRecordsMixin) {
/**
* Embedded relationship attributes
*
* @var {Object}
*/
get attrs() {
return {
@@ -14,45 +16,22 @@ export default class UserSerializer extends ApplicationSerializer.extend(Embedde
}
/**
* Prevent partial payloads from overwriting fully-loaded
* user records in the store.
* Customize serializer so that the password is never sent to the server via Ember Data
*
* This runs ONLY on incoming data.
*/
normalize(modelClass, resourceHash, prop) {
let normalized = super.normalize(modelClass, resourceHash, prop);
// Existing user already loaded in the store?
let existing = this.store.peekRecord(normalized.data.type, normalized.data.id);
if (existing) {
let attrs = normalized.data.attributes || {};
for (let key in attrs) {
if (attrs[key] === null || attrs[key] === undefined || key === 'avatar_url') {
delete attrs[key];
}
}
}
return normalized;
}
/**
* Customize serializer so that sensitive or server-managed
* fields are never sent to the backend.
* @param {Snapshot} snapshot
* @param {Object} options
* @return {Object} json
*/
serialize() {
const json = super.serialize(...arguments);
// Never send password
// delete the password always
delete json.password;
// Verification flags
// delete verification attributes
delete json.email_verified_at;
delete json.phone_verified_at;
// Server-managed timestamps
// delete server managed dates
delete json.deleted_at;
delete json.created_at;
delete json.updated_at;

View File

@@ -7,31 +7,17 @@ export default class OnboardingOrchestratorService extends Service {
@service onboardingContext;
@tracked flow = null;
@tracked wrapper = null;
@tracked current = null;
@tracked history = [];
@tracked sessionId = null;
async start(flowId = null, opts = {}) {
start(flowId = null, opts = {}) {
const flow = this.onboardingRegistry.getFlow(flowId ?? this.onboardingRegistry.defaultFlow);
if (!flow) throw new Error(`Onboarding flow '${flowId}' not found`);
this.flow = flow;
this.wrapper = flow.wrapper || null;
this.sessionId = opts.sessionId || null;
this.history = [];
// Execute onFlowWillStart hook if defined
if (typeof this.flow.onFlowWillStart === 'function') {
await this.flow.onFlowWillStart(this.flow, this);
}
await this.goto(flow.entry);
// Execute onFlowDidStart hook if defined
if (typeof this.flow.onFlowDidStart === 'function') {
await this.flow.onFlowDidStart(this.flow, this);
}
this.goto(flow.entry);
}
async goto(stepId) {
@@ -39,43 +25,27 @@ export default class OnboardingOrchestratorService extends Service {
const step = this.flow.steps.find((s) => s.id === stepId);
if (!step) throw new Error(`Step '${stepId}' not found`);
// Execute onStepWillChange hook if defined
const previousStep = this.current;
if (typeof this.flow.onStepWillChange === 'function') {
await this.flow.onStepWillChange(step, previousStep, this);
}
// Guard function - skip step if guard returns false
if (typeof step.guard === 'function' && !step.guard(this.onboardingContext)) {
return this.next();
}
// beforeEnter lifecycle hook
if (typeof step.beforeEnter === 'function') {
await step.beforeEnter(this.onboardingContext);
}
this.current = step;
// Execute onStepDidChange hook if defined
if (typeof this.flow.onStepDidChange === 'function') {
await this.flow.onStepDidChange(this.current, previousStep, this);
}
}
async next() {
if (!this.flow || !this.current) return;
const leaving = this.current;
// afterLeave lifecycle hook
if (typeof leaving.afterLeave === 'function') {
await leaving.afterLeave(this.onboardingContext);
}
if (!this.history.includes(leaving)) this.history.push(leaving);
// Support both string and function for next property
let nextId;
if (typeof leaving.next === 'function') {
nextId = leaving.next(this.onboardingContext);
@@ -83,20 +53,8 @@ export default class OnboardingOrchestratorService extends Service {
nextId = leaving.next;
}
// If no next step, flow is complete
if (!nextId) {
// Execute onFlowWillEnd hook if defined
if (typeof this.flow.onFlowWillEnd === 'function') {
await this.flow.onFlowWillEnd(leaving, this);
}
this.current = null; // finished
// Execute onFlowDidEnd hook if defined
if (typeof this.flow.onFlowDidEnd === 'function') {
await this.flow.onFlowDidEnd(leaving, this);
}
return;
}
@@ -110,31 +68,4 @@ export default class OnboardingOrchestratorService extends Service {
this.history = this.history.slice(0, -1);
await this.goto(prev.id);
}
/**
* Get the current path (for flows with multiple paths)
* This is a helper method that can be used by flows to determine the current path
*/
getCurrentPath() {
if (!this.flow || !this.flow.paths) return null;
// Determine path based on context or current step
for (const [pathId, pathDef] of Object.entries(this.flow.paths)) {
if (pathDef.steps && pathDef.steps.some(s => s.id === this.current?.id)) {
return pathDef;
}
}
return null;
}
/**
* Check if a step is in the current path
*/
isStepInPath(stepId) {
const currentPath = this.getCurrentPath();
if (!currentPath) return true; // If no paths defined, all steps are valid
return currentPath.steps?.some(s => s.id === stepId) ?? false;
}
}

View File

@@ -9,7 +9,7 @@ export default class OnboardingRegistryService extends Service {
this.defaultFlow = flowId;
}
registerFlow(flow, options = {}) {
registerFlow(flow) {
if (!flow || !flow.id || !flow.entry || !Array.isArray(flow.steps)) {
throw new Error('Invalid FlowDef: id, entry, steps are required');
}
@@ -23,11 +23,6 @@ export default class OnboardingRegistryService extends Service {
}
}
this.flows.set(flow.id, flow);
// If specified, set as default flow
if (options.default) {
this.defaultFlow = flow.id;
}
}
getFlow(id) {

View File

@@ -4,27 +4,21 @@
<div class="container mx-auto h-screen">
<div class="max-w-3xl my-10 mx-auto">
<ContentPanel @title={{t "common.your-profile"}} @open={{true}} @wrapperClass="bordered-classic">
<form class="flex flex-col items-start md:flex-row" {{on "submit" (perform this.saveProfile)}}>
<form class="flex flex-col md:flex-row" {{on "submit" (perform this.saveProfile)}}>
<div class="w-32 flex flex-col justify-center mb-6 mr-6">
<Image src={{this.user.avatar_url}} @fallbackSrc={{config "defaultValues.userImage"}} alt={{this.user.name}} class="w-32 h-32 rounded-md mt-1" />
<FileUpload
@name={{t "console.account.index.photos"}}
@accept="image/*"
@onFileAdded={{this.uploadNewPhoto}}
@labelClass="flex flex-row items-center justify-center"
as |queue|
>
<Image src={{this.user.avatar_url}} @fallbackSrc={{config "defaultValues.userImage"}} alt={{this.user.name}} class="w-32 h-32 rounded-md" />
<FileUpload @name={{t "console.account.index.photos"}} @accept="image/*" @onFileAdded={{this.uploadNewPhoto}} @labelClass="flex flex-row items-center justify-center" as |queue|>
<a tabindex={{0}} class="flex items-center px-0 mt-2 text-xs no-underline truncate btn btn-sm btn-default" disabled={{queue.files.length}}>
{{#if queue.files.length}}
<div class="mr-1.5">
<Spinner />
</div>
<span>
{{t "common.uploading"}}
{{t "common.uploading"}}
</span>
{{else}}
<FaIcon @icon="image" class="mr-1.5" />
<span>
<span>
{{t "console.account.index.upload-new"}}
</span>
{{/if}}
@@ -40,31 +34,11 @@
</InputGroup>
<InputGroup @name={{t "common.date-of-birth"}} @type="date" @value={{this.user.date_of_birth}} />
<InputGroup @name={{t "common.timezone"}} @helpText={{t "console.account.index.timezone"}}>
<div class="fleetbase-model-select fleetbase-power-select ember-model-select">
<PowerSelect
@options={{this.timezones}}
@selected={{this.user.timezone}}
@onChange={{fn (mut this.user.timezone)}}
@placeholder={{t "console.account.index.timezone"}}
@triggerClass="form-select form-input"
@searchEnabled={{true}}
as |option|
>
<div>{{option}}</div>
</PowerSelect>
</div>
<Select @value={{this.user.timezone}} @options={{this.timezones}} @onSelect={{fn (mut this.user.timezone)}} @placeholder={{t "console.account.index.timezone"}} />
</InputGroup>
</div>
<div class="mt-3 flex items-center justify-end">
<Button
@buttonType="submit"
@type="primary"
@size="lg"
@icon="save"
@text={{t "common.save-changes"}}
@onClick={{perform this.saveProfile}}
@isLoading={{not this.saveProfile.isIdle}}
/>
<Button @buttonType="submit" @type="primary" @size="lg" @icon="save" @text={{t "common.save-changes"}} @onClick={{perform this.saveProfile}} @isLoading={{not this.saveProfile.isIdle}} />
</div>
</div>
</form>

View File

@@ -17,7 +17,7 @@
@selected={{get this.notificationSettings (concat (get-notification-key notification.definition notification.name) ".notifiables")}}
@onChange={{fn this.onSelectNotifiable notification}}
@placeholder="Select notifiables..."
@triggerClass="form-select form-input flex-1"
@triggerClass="form-select form-input form-input-sm flex-1"
as |notifiable|
>
{{notifiable.label}}
@@ -27,21 +27,6 @@
{{/each}}
</ContentPanel>
{{/each-in}}
<ContentPanel @title="SMS Notification Settings" @open={{true}} @wrapperClass="bordered-classic">
<Toggle @isToggled={{this.company.options.alpha_numeric_sender_id_enabled}} @onToggle={{this.toggleAlphaNumericSenderId}} @label="Enable Alpha-Numeric Sender ID" @wrapperClass="mb-4" />
<InputGroup @name="Alpha-Numeric Sender ID" @value={{this.company.options.alpha_numeric_sender_id}} @helpText="Set the custom alphanumeric name that will appear as the sender for all SMS sent by your organization. Up to 11 letters or numbers. Not supported in all countries." @disabled={{not this.company.options.alpha_numeric_sender_id_enabled}} />
<div class="space-y-2 mb-3">
<InfoBlock>
<p>Alphanumeric Sender IDs allow your organization to replace a traditional phone number with a custom text-based sender name when sending SMS notifications (e.g., Fleetbase, MyStore, DispatchHQ). This can improve brand recognition, increase message trust, and enhance deliverability in regions where numeric senders are restricted by local carriers.</p>
<p>When enabled, Fleetbase will use this sender ID for all outbound SMS messages sent on behalf of your organization, including order updates, verification codes, driver notifications, and other automated alerts. Sender IDs can contain up to 11 characters using letters and numbers.</p>
<p>Some countries require or enforce specific messaging rules, and certain carriers may only support alphanumeric senders. Using a Sender ID can significantly improve message delivery in these regions.</p>
</InfoBlock>
<InfoBlock @type="warning">
<p>Delivery of SMS using Alphanumeric Sender IDs depends on local carrier policies. Some regions may restrict or block numeric senders or require the use of alphanumeric senders for successful delivery. While Fleetbase will attempt to deliver all messages using your configured Sender ID, message delivery cannot be guaranteed in countries with carrier-level filtering or regulatory restrictions. Your organization is responsible for ensuring compliance with local messaging regulations in the countries you send SMS to.</p>
</InfoBlock>
</div>
</ContentPanel>
</div>
</div>
<Spacer @height="300px" />

View File

@@ -1,3 +1,6 @@
<div class="onboard-route-wrapper">
{{outlet}}
<div class="flex items-center justify-center h-screen min-h-screen px-4 py-12 bg-gray-50 dark:bg-gray-900 sm:px-6 lg:px-8 overflow-y-scroll">
<div class="w-full max-w-md h-screen flex items-center justify-center py-4">
{{outlet}}
</div>
<Spacer @height="300px" />
</div>

View File

@@ -23,7 +23,7 @@ module.exports = function (environment) {
APP: {
autoboot: true,
extensions: asArray(getenv('EXTENSIONS')),
disableRuntimeConfig: toBoolean(getenv('DISABLE_RUNTIME_CONFIG', environment === 'production')),
disableRuntimeConfig: toBoolean(getenv('DISABLE_RUNTIME_CONFIG')),
},
API: {

View File

@@ -6,4 +6,4 @@ SOCKETCLUSTER_HOST=socket.fleetbase.io
SOCKETCLUSTER_SECURE=true
SOCKETCLUSTER_PORT=8000
OSRM_HOST=https://router.project-osrm.org
DISABLE_RUNTIME_CONFIG=true
DISABLE_RUNTIME_CONFIG=true

View File

@@ -1,6 +1,6 @@
{
"name": "@fleetbase/console",
"version": "0.7.24",
"version": "0.7.21",
"private": true,
"description": "Modular logistics and supply chain operating system (LSOS)",
"repository": "https://github.com/fleetbase/fleetbase",
@@ -34,22 +34,22 @@
"dependencies": {
"@ember/legacy-built-in-components": "^0.4.2",
"@fleetbase/dev-engine": "^0.2.12",
"@fleetbase/ember-core": "^0.3.9",
"@fleetbase/ember-ui": "^0.3.15",
"@fleetbase/fleetops-data": "^0.1.24",
"@fleetbase/fleetops-engine": "^0.6.31",
"@fleetbase/ember-core": "^0.3.8",
"@fleetbase/ember-ui": "^0.3.13",
"@fleetbase/fleetops-data": "^0.1.23",
"@fleetbase/fleetops-engine": "^0.6.29",
"@fleetbase/iam-engine": "^0.1.6",
"@fleetbase/billing-engine": "^0.1.12",
"@fleetbase/internals-engine": "^0.0.23",
"@fleetbase/aws-marketplace": "^0.0.8",
"@fleetbase/customer-portal-engine": "^0.0.10",
"@fleetbase/flespi-engine": "^0.1.16",
"@fleetbase/samsara-engine": "^0.0.3",
"@fleetbase/vroom-engine": "^0.0.3",
"@fleetbase/valhalla-engine": "^0.0.3",
"@fleetbase/customer-portal-engine": "^0.0.10",
"@fleetbase/registry-bridge-engine": "^0.1.2",
"@fleetbase/storefront-engine": "^0.4.9",
"@fleetbase/leaflet-routing-machine": "^3.2.17",
"@fleetbase/storefront-engine": "^0.4.10",
"@formatjs/intl-datetimeformat": "^6.18.2",
"@formatjs/intl-numberformat": "^8.15.6",
"@formatjs/intl-pluralrules": "^5.4.6",
@@ -101,7 +101,6 @@
"ember-cli-babel": "^8.2.0",
"ember-cli-clean-css": "^3.0.0",
"ember-cli-dependency-checker": "^3.3.2",
"ember-cli-deprecation-workflow": "^4.0.0",
"ember-cli-dotenv": "^3.1.0",
"ember-cli-htmlbars": "^6.3.0",
"ember-cli-inject-live-reload": "^2.1.0",
@@ -158,9 +157,9 @@
},
"pnpm": {
"overrides": {
"@fleetbase/ember-core": "^0.3.9",
"@fleetbase/ember-ui": "^0.3.15",
"@fleetbase/fleetops-data": "^0.1.24"
"@fleetbase/ember-core": "latest",
"@fleetbase/ember-ui": "latest",
"@fleetbase/fleetops-data": "latest"
}
},
"prettier": {

968
console/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -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/widget-panel', 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`<Dashboard::WidgetPanel />`);
assert.dom().hasText('');
// Template block usage:
await render(hbs`
<Dashboard::WidgetPanel>
template block text
</Dashboard::WidgetPanel>
`);
assert.dom().hasText('template block text');
});
});

View File

@@ -75,7 +75,7 @@ ENV QUEUE_CONNECTION=redis
ENV CADDYFILE_PATH=/fleetbase/Caddyfile
ENV CONSOLE_PATH=/fleetbase/console
ENV OCTANE_SERVER=frankenphp
ENV FLEETBASE_VERSION=0.7.24
ENV FLEETBASE_VERSION=0.7.21
# Set environment
ARG ENVIRONMENT=production
@@ -158,14 +158,14 @@ CMD ["php", "artisan", "queue:work"]
# Application dev stage
FROM base AS app-dev
ENTRYPOINT ["docker-php-entrypoint"]
CMD ["sh", "-c", "php artisan octane:frankenphp --max-requests=1000 --port=8000 --host=0.0.0.0 --watch"]
CMD ["sh", "-c", "php artisan octane:frankenphp --max-requests=250 --port=8000 --host=0.0.0.0 --watch"]
# Application release stage
FROM base AS app-release
ENTRYPOINT ["docker-php-entrypoint"]
CMD ["sh", "-c", "php artisan octane:frankenphp --max-requests=1000 --port=8000 --host=0.0.0.0"]
CMD ["sh", "-c", "php artisan octane:frankenphp --max-requests=250 --port=8000 --host=0.0.0.0"]
# Application stage
FROM base AS app
ENTRYPOINT ["/sbin/ssm-parent", "-c", ".ssm-parent.yaml", "run", "--", "docker-php-entrypoint"]
CMD ["sh", "-c", "php artisan octane:frankenphp --max-requests=1000 --port=8000 --host=0.0.0.0"]
CMD ["sh", "-c", "php artisan octane:frankenphp --max-requests=250 --port=8000 --host=0.0.0.0"]