Compare commits

...

194 Commits

Author SHA1 Message Date
Ronald A. Richardson
e6d34268e0 Hotfix: patch dropdown menu item isComponent
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-30 12:12:16 +08:00
Ronald A. Richardson
5a5ddad825 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud-qa 2025-12-30 11:41:09 +08:00
Ron
b25da51496 Merge pull request #486 from fleetbase/dev-v0.7.25
Some checks failed
Fleetbase CI / Build and Start Docker Services (push) Has been cancelled
feat: New SMS service to support multiple SMS providers + framework improvements
2025-12-29 21:02:03 +08:00
Ronald A. Richardson
7d776f2bd5 updated pnpm lockfile overrides 2025-12-29 20:48:29 +08:00
Ronald A. Richardson
ecfcec72e4 updated override versions 2025-12-29 20:39:25 +08:00
Ronald A. Richardson
ca1741a4b2 feat: New SMS service to support multiple SMS providers + framework improvements 2025-12-29 20:36:43 +08:00
Ron
947565bcf0 Merge pull request #483 from fleetbase/dev-v0.7.24
Some checks failed
Fleetbase CI / Build and Start Docker Services (push) Has been cancelled
Fix: Critical cache key collision bug in ApiModelCache
2025-12-21 12:05:16 +08:00
Ronald A. Richardson
2d4cc5cf66 Fix: Critical cache key collision bug in ApiModelCache 2025-12-21 12:02:53 +08:00
Ronald A. Richardson
53a87d6f38 Hotfix: load iam engine for user-form modal when creating driver
Some checks failed
Fleetbase CI / Build and Start Docker Services (push) Has been cancelled
2025-12-19 23:17:51 +08:00
Ronald A. Richardson
d7f8f87315 Hotfix: onboarding wrapper stylings added back 2025-12-19 22:58:29 +08:00
Ron
36673ef564 Merge pull request #482 from fleetbase/dev-v0.7.23
dev-v0.7.23
2025-12-19 22:41:13 +08:00
Ronald A. Richardson
19341c81e7 Minor tweaks to user model and profile page 2025-12-19 22:39:41 +08:00
Ronald A. Richardson
b4ecf5bda9 bump FLEETBASE_VERSION in Dockerfile 2025-12-19 22:24:38 +08:00
Ronald A. Richardson
1b714a7ef8 Release ready 2025-12-19 22:23:39 +08:00
Ron
e41cd62ea5 Merge pull request #481 from fleetbase/feature/onboarding-wrapper-architecture
feat: Add wrapper component support to onboarding orchestrator
2025-12-19 15:56:49 +08:00
Ronald A. Richardson
1ca1342052 feat: fixed optimization changes for octane, added deprecation workflow 2025-12-19 15:56:03 +08:00
roncodes
a5a5ddb0d5 perf: Optimize FrankenPHP/Octane configuration for high load
**Changes:**

1. **Caddyfile**:
   - Reduced num_threads from 24 to 20
   - Added request timeouts (read_body: 10s, write: 60s, idle: 120s)
   - With 4 containers: 20 × 4 = 80 total workers

2. **Dockerfile**:
   - Added explicit --workers=20 to octane:frankenphp command
   - Increased --max-requests from 250 to 1000
   - Applied to app-dev, app-release, and app stages

3. **Octane config**:
   - Enabled DisconnectFromDatabases listener
   - Enabled CollectGarbage listener
   - Prevents DB connection leaks and memory leaks

**Impact:**
- Better resource management under load
- Prevents connection pool exhaustion
- Requires db.t3.large (591 max connections) or better
- Supports up to 250 concurrent VUs

**Related:**
- Requires RDS upgrade from db.t4g.micro to db.t3.large
- Works with DB_CONNECTION_POOL_SIZE=25 (100 total connections)
- See configuration-analysis.md for details
2025-12-16 20:06:35 -05:00
Ronald A. Richardson
c51f3ca6c8 v0.7.23 2025-12-17 08:57:41 +08:00
roncodes
a9b172081a feat: Add lifecycle hooks support to onboarding orchestrator
- Add onFlowWillStart, onFlowDidStart, onStepWillChange, onStepDidChange, onFlowWillEnd, onFlowDidEnd hooks
- Hooks are optional and backward compatible with existing flows
- Add getCurrentPath() and isStepInPath() helper methods for multi-path flows
- Support dynamic next() functions (already existed, now documented)
- Maintain full backward compatibility with default@v1 flow
2025-12-11 23:10:23 -05:00
Ronald A. Richardson
a29ca0ecb9 feat: update onboarding-registry service to allow set default onboard flow on registration 2025-12-09 09:48:23 +08:00
roncodes
6442644438 feat: Add wrapper component support to onboarding orchestrator
- Add wrapper property to OnboardingOrchestratorService
- Update onboarding/yield component to render wrapper using lazy-engine-component
- Clean up onboard.hbs template to remove styling constraints
- Enable extensions to provide custom wrapper components for onboarding flows
2025-12-08 20:38:59 -05:00
Ron
0238632fdd Merge pull request #477 from fleetbase/dev-v0.7.22
Some checks failed
Fleetbase CI / Build and Start Docker Services (push) Has been cancelled
Organizations can now set their own alpha-numeric sender ID for SMS
2025-12-07 06:37:02 +00:00
Ronald A. Richardson
27652db9c3 Organizations can now set their own alpha-numeric sender ID for SMS 2025-12-07 14:15:31 +08:00
Ronald A. Richardson
5eaf2039d4 Fix: correct version of ember-ui in console/package.json
Some checks failed
Fleetbase CI / Build and Start Docker Services (push) Has been cancelled
2025-12-06 21:49:14 +08:00
Ron
d8c06ae0be Merge pull request #476 from fleetbase/dev-v0.7.21
v0.7.21 ~ 5x faster css compiling and flawless builds
2025-12-06 13:41:42 +00:00
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
c9011b3ffa *critical* patch to load-extensions initializer 2025-12-06 21:38:02 +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
520de0f6bc fixed formating on console/package.json 2025-12-06 19:39:24 +08:00
Ronald A. Richardson
ba6ed235e3 v0.7.21 ~ 5x faster css compiling and flawless builds 2025-12-06 19:26:17 +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
Ronald A. Richardson
3c013a3817 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-07-30 22:54:57 +08:00
Ronald A. Richardson
4392c7e3ff Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-07-25 19:06:03 +08:00
Ronald A. Richardson
97dfbedd1a Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-07-25 18:43:36 +08:00
Ronald A. Richardson
6d13f22a98 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-07-23 13:32:42 +08:00
Ronald A. Richardson
2c09c87bb6 fix console depn install in cd 2024-07-23 12:31:29 +08:00
Ronald A. Richardson
f7f6991ef3 bump pnpm version in cd workflow 2024-07-23 11:46:44 +08:00
Ronald A. Richardson
73acd4833c fix cd workflow 2024-07-23 11:30:14 +08:00
Ronald A. Richardson
1c3c4c16a5 use node 18 in cd 2024-07-23 11:11:43 +08:00
Ronald A. Richardson
5d01438dc9 fix env set in workflow 2024-07-23 10:59:16 +08:00
Ronald A. Richardson
9d004410ee Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-07-23 10:46:47 +08:00
Ronald A. Richardson
3a396f3b54 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-07-23 10:34:32 +08:00
Ronald A. Richardson
e86b970fc8 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-07-06 13:18:22 +08:00
Ronald A. Richardson
122a0d186a Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-07-05 17:09:56 +08:00
Ronald A. Richardson
7e258f698f Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-07-02 17:53:20 +08:00
Ronald A. Richardson
65ef642315 fixed composer.lock 2024-07-02 16:00:17 +08:00
Ronald A. Richardson
d79f034dbd Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-07-02 15:41:58 +08:00
Ronald A. Richardson
05b7d5e112 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-07-02 15:40:58 +08:00
Ronald A. Richardson
61779ab102 Trigger Deploy 2024-07-01 16:42:55 +08:00
Ronald A. Richardson
a287c05380 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-05-30 19:57:16 +08:00
Ronald A. Richardson
ecc41e587e Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-05-17 16:58:14 +08:00
Ronald A. Richardson
166529f9b4 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-05-15 14:39:54 +08:00
Ronald A. Richardson
189547f9de Upgrade fleetbase/billing#^0.0.9 with hotfix for getSytemResourceModels utility function 2024-05-04 13:56:59 +08:00
Ronald A. Richardson
90a42e8a93 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-05-04 13:19:13 +08:00
Ronald A. Richardson
d28b1d41fb Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-04-30 19:40:08 +08:00
Ronald A. Richardson
b056ef62b0 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-04-30 18:11:33 +08:00
Ronald A. Richardson
e70cbacbc2 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-04-17 16:58:07 +08:00
Ronald A. Richardson
fbd4a7490a Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-04-13 20:28:50 +08:00
Ronald A. Richardson
b9b0eb308b Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-04-02 18:06:15 +08:00
Ronald A. Richardson
48e1b89ec8 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-03-27 21:09:51 +08:00
Ronald A. Richardson
5e02c95b66 Upgrade extension 'fleetops' to version v0.4.22 2024-03-19 19:25:51 +08:00
Ronald A. Richardson
db8b5c4d6a Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-03-17 12:32:42 +08:00
Ronald A. Richardson
aa214ccad7 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-03-15 17:33:37 +08:00
Ronald A. Richardson
cdd5524cf3 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-03-13 15:31:47 +08:00
Ronald A. Richardson
d99cefd2a4 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-03-12 18:25:56 +08:00
Ronald A. Richardson
1c58fd43c3 v0.4.10l fixed console lockfile 2024-03-11 21:56:26 +08:00
Ronald A. Richardson
9226394159 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-03-11 21:19:32 +08:00
Ronald A. Richardson
9b23b39f32 upgraded to v0.4.9 2024-02-24 17:07:49 +08:00
Ronald A. Richardson
5310fc3ff3 upgraded to v0.4.8 2024-02-23 13:52:21 +08:00
Ronald A. Richardson
9569053f50 upgraded to v0.4.7 2024-02-22 18:16:12 +08:00
Ronald A. Richardson
b08c054b99 upgraded to v0.4.6 2024-02-21 18:59:10 +08:00
Ronald A. Richardson
2e517f2f95 hotfix core-api w/ composer lock 2024-02-17 19:53:53 +08:00
Ronald A. Richardson
7038d375b0 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-02-17 19:31:14 +08:00
Ronald A. Richardson
d5ea7f7790 Upgraded fleetops-api v0.4.11 - Fixes deprecation error/warning which occurs in some environments Implicit conversion from float x to int loses precision when creating a DistanceMatrix object 2024-02-16 03:04:16 +07:00
Ronald A. Richardson
4eb4b04121 use fixed fleetbase/laravel-mysql-spatial v1.0.2 2024-02-16 01:34:01 +07:00
Ronald A. Richardson
24c5b93005 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-02-16 00:16:49 +07:00
Ronald A. Richardson
80610b9a48 Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-02-15 23:52:27 +07:00
Ronald A. Richardson
9e5551972e upgraded to v0.4.3 2024-02-13 17:02:37 +08:00
Ronald A. Richardson
b784f890f3 upgraded to v0.4.2 2024-02-13 14:45:20 +08:00
Ronald A. Richardson
797a3d61fe fix router 2024-02-13 13:55:57 +08:00
Ronald A. Richardson
d2f0bfe83e upgraded to v0.4.1 2024-02-13 13:54:46 +08:00
Ronald A. Richardson
f28ad85c1a Upgraded fleetops to v0.4.8 for LocationService minifcation hotfix 2024-02-09 19:07:32 +08:00
Ronald A. Richardson
d7b0826f3f upgrade core-api to v1.4.1 2024-02-08 19:07:10 +08:00
Ronald A. Richardson
dd6008a8aa dont copy auth.json 2024-02-08 17:44:52 +08:00
Ronald A. Richardson
6671fefaaa Upgraded to v0.4.0 2024-02-08 17:41:02 +08:00
Ronald A. Richardson
7136f6195c v0.3.10 upgraded lockfile 2024-02-01 20:19:52 +08:00
Ronald A. Richardson
2384887620 Upgraded to v0.3.10 2024-02-01 20:14:31 +08:00
Ronald A. Richardson
a2778f1552 Upgraded to v0.3.9 2024-01-25 20:10:39 +08:00
Ronald A. Richardson
acfda5ed1a Merge branch 'main' of github.com:fleetbase/fleetbase into cloud 2024-01-24 18:32:51 +08:00
Ronald A. Richardson
e08255007a remove later hook from extensions initializer 2024-01-23 21:37:22 +08:00
Ronald A. Richardson
41761ea50e add delay to extensions initialization step 2024-01-23 21:20:51 +08:00
Ronald A. Richardson
5c623819ed use node:18.15.0-alpine for console build 2024-01-23 20:13:23 +08:00
Ronald A. Richardson
2bd885b1a2 Upgraded fleetbase/core-api to v1.3.11 2024-01-19 20:16:06 +08:00
Ronald A. Richardson
88c3842441 Upgraded to v0.3.7 2024-01-19 19:55:47 +08:00
Ronald A. Richardson
2c2a4121a8 Upgraded fleetbase/core-api to v1.3.9 with critical patches 2024-01-19 17:02:47 +08:00
Ronald A. Richardson
aadd03f14b upgrade fleetbase/core-api to v1.3.8 2024-01-18 20:00:32 +08:00
Ronald A. Richardson
706e94270d upgraded to v0.3.6 2024-01-18 19:18:52 +08:00
Ronald A. Richardson
1dabc375f9 upgraded to v0.3.5 2024-01-12 18:44:52 +08:00
Ronald A. Richardson
0efec46155 updated production env backend vars 2024-01-08 14:42:58 +08:00
Ronald A. Richardson
8bb2c6b65d fix socketcluster port for environments 2024-01-03 17:37:35 +08:00
Ronald A. Richardson
1c0af1a119 set correct values in .env files for console 2024-01-03 13:27:10 +08:00
Ronald A. Richardson
dd65ee619b upgraded to v0.3.4 2023-12-27 12:01:39 +08:00
Ronald A. Richardson
e790a0e123 upgraded to v0.3.3 2023-12-27 11:07:33 +08:00
Ronald A. Richardson
723e3ca3d1 fix composer file 2023-11-27 10:23:44 +08:00
Ronald A. Richardson
4eb706d33e upgraded to v0.3.1 / cloud version 2023-11-27 10:19:56 +08:00
52 changed files with 2781 additions and 1649 deletions

View File

@@ -197,7 +197,7 @@ jobs:
run: |
echo "STRIPE_KEY=${{ secrets.STRIPE_TEST_KEY }}" >> ./environments/.env.production
echo "LOGROCKET_APP_ID=${{ secrets.LOGROCKET_APP_ID }}" >> ./environments/.env.production
echo "EXTENSIONS=@fleetbase/billing-engine,@fleetbase/internals-engine" >> ./environments/.env.production
echo "EXTENSIONS=@fleetbase/billing-engine,@fleetbase/internals-engine,@fleetbase/aws-marketplace" >> ./environments/.env.production
working-directory: ./console
- name: Set Env Variables for Production
@@ -205,7 +205,7 @@ jobs:
run: |
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" >> ./environments/.env.production
echo "EXTENSIONS=@fleetbase/billing-engine,@fleetbase/internals-engine,@fleetbase/aws-marketplace" >> ./environments/.env.production
working-directory: ./console
- name: Install dependencies

View File

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

View File

@@ -1,281 +1,23 @@
# 🚀 Fleetbase v0.7.20 — 2025-12-05
# 🚀 Fleetbase v0.7.25 — 2025-12-29
> "Major architectural & universe framework refactor for improved build, loading and initialization of extensions and system."
> "New SMS service to support multiple SMS providers + framework improvements"
---
## @fleetbase/ember-core v0.3.7
### 🎯 Major Features
#### Universe Service Refactor
Complete architectural overhaul of the Universe service with separation of concerns into specialized sub-services:
- **ExtensionManager**: Manages extension loading, engine instances, and lifecycle hooks
- **RegistryService**: Fully dynamic, Map-based registry system for cross-engine resource sharing
- **MenuService**: Dedicated menu item and panel management with event support
- **WidgetService**: Dashboard widget registration and retrieval system
- **HookService**: Application lifecycle hooks and custom event hooks
**Key Benefits:**
- Improved performance with lazy loading and proper engine lifecycle management
- Better separation of concerns and maintainability
- Enhanced cross-engine resource sharing via Ember's application container
- Backward compatibility maintained through facade pattern
#### Enhanced Extension System
**New Extension Patterns:**
- `extension.js` hook patterns with `setupExtension()` and `onEngineLoaded()` support
- `whenEngineLoaded()` utility method that handles both loaded and not-yet-loaded engines
- Comprehensive extension checking methods: `isInstalled()`, `isEngineLoaded()`, `isEngineLoading()`
- Automatic hook execution for router-loaded engines
**Engine Loading Improvements:**
- Fixed race conditions between engine loading and hook registration
- Proper tracking of router-loaded engines in `loadedEngines` Map
- Patched `buildChildEngineInstance` to run hooks for router-loaded engines
- Two-phase extension setup: registration first, then hook execution
**Performance Optimizations:**
- `extensions.json` loading with localStorage caching
- Reduced console noise by removing excessive debug logs
- Performance monitoring for extension load times
#### Helper Registration System
- Cross-engine helper sharing via application container
- `registerHelper()` method for template helpers
- Support for both class-based and function-based helpers
- Automatic registration to application container for global access
#### Component Registration Enhancements
- `registerRenderableComponent()` for cross-engine component sharing
- Support for component classes via `ExtensionComponent`
- Automatic component registration to engine containers
- `getRenderableComponents()` for retrieving registered components
### 🔧 API Improvements
#### UniverseService
- `getService()` method with flexible naming pattern resolution:
- Short names: `"menu"``universe/menu-service`
- Plural variations: `"hooks"` or `"hook"``universe/hook-service`
- CamelCase: `"menuService"``universe/menu-service`
- Full names: `"menu-service"``universe/menu-service`
- With namespace: `"universe/menu-service"``universe/menu-service`
- `whenEngineLoaded()` for simplified engine-dependent setup
- `getServiceFromEngine()` for accessing engine-specific services
- `getApplicationInstance()` with fallback to `window.Fleetbase`
#### MenuService
- Computed getters for template access: `headerMenuItems`, `adminMenuItems`, `adminMenuPanels`
- Event triggers for backward compatibility
- Proper `finalView` normalization for all menu items
- `onClick` handlers wrapped with `menuItem` and `universe` parameters
- Fixed panel item slug/view structure to match original behavior
#### WidgetService
- Per-dashboard widget registration
- `registerWidgets()` for making widgets available on dashboards
- `registerDefaultWidgets()` for auto-loading specific widgets
- Proper widget filtering by dashboard ID
### 🐛 Bug Fixes
#### Extension Loading
- Resolved timeout errors during engine boot
- Fixed duplicate dashboard ID errors
- Corrected engine instance tracking and retrieval
- Fixed race conditions in extension setup
#### Menu System
- Fixed registry name mismatch for header menu items
- Corrected panel item structure for proper routing
- Added null checks before `dasherize` calls
- Fixed `onClick` handler parameter passing
#### Registry System
- Fixed widget registry lookup to work with array storage
- Proper filtering by registration key
- Shared registries Map across all engines via application container
- Triggered reactivity when creating new registries
#### Service Resolution
- Fixed service injection on engine boot
- Corrected service map injection
- Added missing `getServiceFromEngine` method
- Fixed `virtualRouteRedirect` and `getViewFromTransition` methods
### 📦 Exports & Structure
- Named exports on "exports" namespace
- Separated default and named exports in app/exports re-exports
### 🔄 ResourceActionService
- Allow properties to be set from initialization options
- Improved flexibility for service configuration
## @fleetbase/ember-ui v0.3.12
### 🎯 Major Features
#### Dashboard Service Refactor
Complete rewrite to support the new Universe service architecture:
- Direct injection of `widgetService` instead of going through universe
- Updated to use new widget service API
- Proper dashboard cleanup and recreation on route revisit
- Race condition fixes with `drop` task modifier
#### Widget Panel Enhancements
**Search & Filter:**
- Real-time keyword search for widgets by name and description
- `@tracked searchQuery` with `updateSearchQuery` action
- Improved widget discoverability
**Floating Pagination:**
- New floating pagination style (bottom-right, rounded, shadowed)
- Reveals horizontal scrollbar for better table navigation
- `@useTfootPagination` arg for backward compatibility
- Default to floating, opt-in to table footer pagination
**Thin Scrollbars:**
- Consistent 8px scrollbar height for both axes
- Webkit scrollbar styles for modern browsers
- Firefox `scrollbar-width: thin` support
- Dark mode scrollbar colors
### 🔧 Component Improvements
#### LazyEngineComponent
- Support for both path-based (lazy) and class-based (immediate) components
- Automatic component registration to engine containers
- Proper engine component lookup
- Helper for use with `{{component}}` syntax
#### RegistryYield
- Converted `yieldables` to computed getter for automatic reactivity
- Automatic wrapping of components with `LazyEngineComponent`
- `isComponent` getter to detect component types vs menu items
- Updated to use `registryService.getRenderableComponents()`
- Removed event listener approach (now uses reactive getters)
#### LoadEngine Component
- New component for explicit engine loading
- Complements `LazyEngineComponent` for different use cases
### 🐛 Bug Fixes
#### Dashboard Service
- Fixed duplicate dashboard ID errors with `drop` task modifier
- Added try-catch in `_createDefaultDashboard` for race conditions
- Proper state checks (`isDeleted`, `isDestroying`, `isDestroyed`)
- Fixed reset() to unload dashboard-widgets before dashboards
- Prevents identity map conflicts when recreating dashboards
#### Widget Panel
- Fixed `availableWidgets` reactivity by converting to getter
- Use `args.defaultDashboardId` first, then fallback to `this.defaultDashboardId`
- Ensures widgets registered after component creation are visible
- Handles string-represented widgets and components
#### RegistryYield
- Fixed TypeError by removing `registryService.on` event listener
- RegistryService doesn't have Evented mixin, now uses reactive getters
- Components registered after construction now properly yielded
#### Table Styling
- Fixed floating pagination spacing (reduced padding, adjusted margins)
- Applied `overflow-x` to `.next-table-wrapper` instead of table
- Horizontal scrollbar now visible and not hidden by pagination
- Added `overflow-y: visible` to prevent vertical scroll issues
### 🎨 UX Improvements
- Minor UX tweaks to widget panel component
- Improved widget panel layout and spacing
- Better visual hierarchy for widget selection
- Enhanced table navigation with floating pagination
## Migration Guide
### For Extension Developers
#### Using the New Extension Patterns
**Before:**
```javascript
// In addon/engine.js
export default class MyEngine extends Engine {
setupExtension() {
// Setup code here
}
}
```
**After:**
```javascript
// In addon/extension.js
import { Widget } from '@fleetbase/ember-core/contracts';
export default {
setupExtension(universe) {
// Get widget service
const widgetService = universe.getService('widget');
// Register widgets, menu items, etc.
widgetService.registerWidgets('dashboard', [new Widget({ ... })]);
// Register hooks for when other engines load
universe.whenEngineLoaded('@fleetbase/fleetops-engine', (engineInstance) => {
// Setup integration with FleetOps
});
}
}
```
#### Accessing Universe Sub-Services
**Flexible Service Resolution:**
```javascript
// All of these work:
const menuService = universe.getService('menu');
const menuService = universe.getService('menu-service');
const menuService = universe.getService('menuService');
const menuService = universe.getService('universe/menu-service');
const hookService = universe.getService('hooks');
const widgetService = universe.getService('widgets');
const registry = universe.getService('registry');
```
#### Widget Registration
**Before:**
```javascript
universe.registerWidget(widgetObject);
```
**After:**
```javascript
// Register widgets available for a dashboard
universe.registerWidgets('dashboard', [widget1, widget2]);
// Register widgets that auto-load on a dashboard
universe.registerDefaultWidgets('dashboard', [widget1]);
```
## ✨ Highlights
- Removed `window.Fleetbase` for improved frontend security
- Improved query optimizations
- Added new SMS service to support multiple SMS providers
---
## ⚠️ Breaking Changes
- **NO MAJOR BREAKING CHANGED** Both releases maintain full backward compatibility with existing code. The refactor uses a facade pattern to ensure all existing APIs continue to work while providing new, improved patterns for future development.
### Notice
- Extensions must adapt to the new `extension.js` pattern for initialization setup.
- Extension dependencies are not auto-loaded and initialized, dependencies must be explicitly loaded from the setup `extension.js`
- `UniverseService` has major changes which refactored core responsibilities to sub-services. There is backwards compatability, but plan to migrate to the new integration architecture.
- None 🙂
---
## 🔧 Upgrade Steps
```bash
# Pull latest version
git pull origin main --no-rebase
@@ -288,12 +30,7 @@ docker compose down && docker compose up -d
docker compose exec application bash -c "./deploy.sh"
```
### Post-Upgrade
1. Clear browser cache and localStorage
2. Restart your development server
3. Test extension loading and dashboard functionality
4. Check console for any deprecation warnings
---
## Need help?
Join the discussion on [GitHub Discussions](https://github.com/fleetbase/fleetbase/discussions) or drop by [#fleetbase on Discord](https://discord.com/invite/HnTqQ6zAVn)
Join the discussion on [GitHub Discussions](https://github.com/fleetbase/ember-ui/discussions) or drop by [#fleetbase on Discord](https://discord.com/invite/HnTqQ6zAVn)

View File

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

View File

@@ -20,10 +20,18 @@
"require": {
"php": ">=8.0 <=8.2.28",
"appstract/laravel-opcache": "^4.0",
"fleetbase/core-api": "^1.6.27",
"fleetbase/fleetops-api": "^0.6.28",
"fleetbase/registry-bridge": "^0.1.1",
"fleetbase/storefront-api": "^0.4.8",
"fleetbase/core-api": "^1.6.32",
"fleetbase/fleetops-api": "^0.6.32",
"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/registry-bridge": "^0.1.2",
"fleetbase/storefront-api": "^0.4.10",
"fleetbase/customer-portal-api": "^0.0.10",
"guzzlehttp/guzzle": "^7.0.1",
"laravel/framework": "^10.0",
"laravel/octane": "^2.3",
@@ -49,9 +57,25 @@
"phpunit/phpunit": "^10.0"
},
"repositories": [
{
"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.fleetbase.io"
"url": "https://registry.qa.fleetbase.io"
}
],
"autoload": {

1369
api/composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -27,7 +27,7 @@ return [
'allowed_headers' => ['*'],
'exposed_headers' => ['x-compressed-json', 'access-console-sandbox', 'access-console-sandbox-key'],
'exposed_headers' => ['x-compressed-json', 'access-console-sandbox', 'access-console-sandbox-key', 'content-disposition'],
'max_age' => 0,

View File

@@ -51,7 +51,7 @@ return [
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
'channels' => ['single', 'stdout'],
'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

@@ -43,4 +43,10 @@ return [
'secret' => env('STRIPE_SECRET', env('STRIPE_API_SECRET')),
'webhook_secret' => env('STRIPE_WEBHOOK_SECRET'),
],
'callpromn' => [
'api_key' => env('CALLPROMN_API_KEY', ''),
'from' => env('CALLPROMN_FROM', ''),
'base_url' => env('CALLPROMN_BASE_URL', 'https://api.messagepro.mn' ),
],
];

View File

@@ -2,6 +2,7 @@ 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

@@ -1,31 +0,0 @@
<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

@@ -1,60 +0,0 @@
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,42 +1,61 @@
<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 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>
</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,78 +1,82 @@
{{page-title (t "onboard.verify-email.header-title")}}
{{#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>
<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>
<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>
{{#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}}
/>
</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}}
/>
</div>
</div>
{{/if}}
</form>
{{/if}}
</form>
</div>
{{/if}}
</div>
{{/if}}
</div>

View File

@@ -1,7 +1,9 @@
<section class="onboarding step-host">
{{#if this.initialized}}
{{#if this.currentComponent}}
{{component this.currentComponent context=this.context orchestrator=this.orchestrator brand=@brand}}
{{#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}}
{{else}}
<div class="flex items-center justify-center min-h-24">

View File

@@ -68,6 +68,7 @@ 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,35 +6,13 @@ 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;
/**
* The notification settings value JSON.
*
* @memberof ConsoleSettingsNotificationsController
* @var {Object}
*/
@service store;
@service currentUser;
@tracked notificationSettings = {};
/**
* Notification transport methods enabled.
*
* @memberof ConsoleSettingsNotificationsController
* @var {Array}
*/
@tracked notificationTransportMethods = ['email', 'sms'];
@tracked company;
/**
* Creates an instance of ConsoleSettingsNotificationsController.
@@ -45,6 +23,40 @@ 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.
*
@@ -94,7 +106,8 @@ export default class ConsoleSettingsNotificationsController extends Controller {
const { notificationSettings } = this;
try {
yield this.fetch.post('notifications/save-settings', { notificationSettings });
yield this.fetch.post('notifications/save-settings', { notificationSettings: notificationSettings ?? {} });
yield this.saveCompanyOptions.perform();
this.notifications.success('Notification settings successfully saved.');
} catch (error) {
this.notifications.serverError(error);
@@ -114,4 +127,26 @@ 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

@@ -0,0 +1,9 @@
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

@@ -10,9 +10,11 @@
{{content-for "head"}}
<link rel="apple-touch-icon" sizes="180x180" href="/favicon/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicon/favicon-16x16.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/favicon/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="192x192" href="/favicon/android-chrome-192x192.png" />
<link rel="icon" type="image/png" sizes="256x256" href="/favicon/android-chrome-256x256.png" />
<link rel="manifest" href="/favicon/site.webmanifest" />
<link rel="mask-icon" href="/favicon/safari-pinned-tab.svg" color="#5bbad5" />
<link integrity="" rel="stylesheet" href="{{rootURL}}assets/vendor.css">

View File

@@ -21,8 +21,7 @@ export function initialize(appInstance) {
debug('[Initializing Router Patch] Applying router refresh bug fix...');
try {
const application = appInstance.application;
applyRouterFix(application);
applyRouterFix(appInstance);
const endTime = performance.now();
debug(`[Initializing Router Patch] Router fix applied in ${(endTime - startTime).toFixed(2)}ms`);

View File

@@ -6,12 +6,10 @@ export async function initialize(appInstance) {
const application = appInstance.application;
const extensionManager = appInstance.lookup('service:universe/extension-manager');
if (!application.extensions || application.extensions.length === 0) {
try {
await extensionManager.loadExtensions(application);
} catch (error) {
console.error('[load-extensions] Error:', error);
}
try {
await extensionManager.loadExtensions(application);
} catch (error) {
console.error('[load-extensions] Error:', error);
}
}

View File

@@ -1,10 +1,4 @@
export function initialize(appInstance) {
// Set window.Fleetbase to the application instance for global access
// This is used by services and engines to access the root application instance
if (typeof window !== 'undefined') {
window.Fleetbase = appInstance;
}
// Look up UniverseService and set the application instance
const universeService = appInstance.lookup('service:universe');
if (universeService) {

View File

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

View File

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

View File

@@ -4,8 +4,6 @@ import { EmbeddedRecordsMixin } from '@ember-data/serializer/rest';
export default class UserSerializer extends ApplicationSerializer.extend(EmbeddedRecordsMixin) {
/**
* Embedded relationship attributes
*
* @var {Object}
*/
get attrs() {
return {
@@ -16,22 +14,45 @@ export default class UserSerializer extends ApplicationSerializer.extend(Embedde
}
/**
* Customize serializer so that the password is never sent to the server via Ember Data
* Prevent partial payloads from overwriting fully-loaded
* user records in the store.
*
* @param {Snapshot} snapshot
* @param {Object} options
* @return {Object} json
* 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.
*/
serialize() {
const json = super.serialize(...arguments);
// delete the password always
// Never send password
delete json.password;
// delete verification attributes
// Verification flags
delete json.email_verified_at;
delete json.phone_verified_at;
// delete server managed dates
// Server-managed timestamps
delete json.deleted_at;
delete json.created_at;
delete json.updated_at;

View File

@@ -7,17 +7,31 @@ export default class OnboardingOrchestratorService extends Service {
@service onboardingContext;
@tracked flow = null;
@tracked wrapper = null;
@tracked current = null;
@tracked history = [];
@tracked sessionId = null;
start(flowId = null, opts = {}) {
async 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 = [];
this.goto(flow.entry);
// 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);
}
}
async goto(stepId) {
@@ -25,27 +39,43 @@ 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);
@@ -53,8 +83,20 @@ 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;
}
@@ -68,4 +110,31 @@ 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) {
registerFlow(flow, options = {}) {
if (!flow || !flow.id || !flow.entry || !Array.isArray(flow.steps)) {
throw new Error('Invalid FlowDef: id, entry, steps are required');
}
@@ -23,6 +23,11 @@ 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,21 +4,27 @@
<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 md:flex-row" {{on "submit" (perform this.saveProfile)}}>
<form class="flex flex-col items-start 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" />
<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 mt-1" />
<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}}
@@ -34,11 +40,31 @@
</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"}}>
<Select @value={{this.user.timezone}} @options={{this.timezones}} @onSelect={{fn (mut this.user.timezone)}} @placeholder={{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>
</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 form-input-sm flex-1"
@triggerClass="form-select form-input flex-1"
as |notifiable|
>
{{notifiable.label}}
@@ -27,6 +27,21 @@
{{/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,6 +1,3 @@
<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 class="onboard-route-wrapper">
{{outlet}}
</div>

View File

@@ -79,6 +79,12 @@ function getCachedConfig() {
return null;
}
// Application version has changed
if (cachedVersion !== config.APP.version) {
debug(`[Runtime Config] Version mismatch (cached: ${cachedVersion}, current: ${config.APP.version})`);
return null;
}
const cacheData = JSON.parse(cached);
const cacheAge = Date.now() - cacheData.timestamp;
@@ -101,14 +107,14 @@ function getCachedConfig() {
*
* @param {Object} config Config object
*/
function setCachedConfig(config) {
function setCachedConfig(runtimeConfig) {
try {
const cacheData = {
config,
config: runtimeConfig,
timestamp: Date.now(),
};
localStorage.setItem(CACHE_KEY, JSON.stringify(cacheData));
localStorage.setItem(CACHE_VERSION_KEY, '1');
localStorage.setItem(CACHE_VERSION_KEY, config.APP.version);
debug('[Runtime Config] Config cached to localStorage');
} catch (e) {
debug(`[Runtime Config] Failed to cache config: ${e.message}`);
@@ -147,12 +153,15 @@ export default async function loadRuntimeConfig() {
return;
}
// // Try cache first
// const cachedConfig = getCachedConfig();
// if (cachedConfig) {
// applyRuntimeConfig(cachedConfig);
// return;
// }
const isProduction = config?.environment === 'production';
if (isProduction) {
// Try cache first
const cachedConfig = getCachedConfig();
if (cachedConfig) {
applyRuntimeConfig(cachedConfig);
return;
}
}
// Cache miss - fetch from server
try {

View File

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

View File

@@ -5,16 +5,7 @@ const EmberApp = require('ember-cli/lib/broccoli/ember-app');
const Funnel = require('broccoli-funnel');
const writeFile = require('broccoli-file-creator');
const mergeTrees = require('broccoli-merge-trees');
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');
const toBoolean = require('./config/utils/to-boolean');
const environment = process.env.EMBER_ENV;
module.exports = function (defaults) {
const app = new EmberApp(defaults, {
@@ -38,29 +29,6 @@ module.exports = function (defaults) {
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.config.js'),
autoprefixer,
],
},
filter: {
enabled: true,
plugins: [postcssAtRulesVariables, postcssMixins, postcssEach, postcssConditionals, tailwind('./tailwind.config.js')],
},
},
babel: {
plugins: [require.resolve('ember-auto-import/babel-plugin')],
},

View File

@@ -1,8 +1,9 @@
API_HOST=
API_HOST=https://api.fleetbase.io
API_NAMESPACE=int/v1
API_SECURE=true
SOCKETCLUSTER_PATH=/socketcluster/
SOCKETCLUSTER_HOST=
SOCKETCLUSTER_HOST=socket.fleetbase.io
SOCKETCLUSTER_SECURE=true
SOCKETCLUSTER_PORT=38000
OSRM_HOST=https://router.project-osrm.org
SOCKETCLUSTER_PORT=8000
OSRM_HOST=https://router.project-osrm.org
DISABLE_RUNTIME_CONFIG=true

View File

@@ -0,0 +1,9 @@
API_HOST=https://api.qa.fleetbase.io
API_NAMESPACE=int/v1
API_SECURE=true
SOCKETCLUSTER_PATH=/socketcluster/
SOCKETCLUSTER_HOST=socket.qa.fleetbase.io
SOCKETCLUSTER_SECURE=true
SOCKETCLUSTER_PORT=8000
OSRM_HOST=https://router.project-osrm.org
DISABLE_RUNTIME_CONFIG=true

View File

@@ -1,6 +1,6 @@
{
"name": "@fleetbase/console",
"version": "0.7.20",
"version": "0.7.25",
"private": true,
"description": "Modular logistics and supply chain operating system (LSOS)",
"repository": "https://github.com/fleetbase/fleetbase",
@@ -33,15 +33,23 @@
},
"dependencies": {
"@ember/legacy-built-in-components": "^0.4.2",
"@fleetbase/dev-engine": "^0.2.11",
"@fleetbase/ember-core": "^0.3.7",
"@fleetbase/ember-ui": "^0.3.12",
"@fleetbase/fleetops-data": "^0.1.23",
"@fleetbase/fleetops-engine": "^0.6.28",
"@fleetbase/iam-engine": "^0.1.5",
"@fleetbase/aws-marketplace": "^0.0.8",
"@fleetbase/billing-engine": "^0.1.12",
"@fleetbase/customer-portal-engine": "^0.0.10",
"@fleetbase/dev-engine": "^0.2.12",
"@fleetbase/ember-core": "^0.3.10",
"@fleetbase/ember-ui": "^0.3.18",
"@fleetbase/fleetops-data": "^0.1.25",
"@fleetbase/fleetops-engine": "^0.6.32",
"@fleetbase/flespi-engine": "^0.1.16",
"@fleetbase/iam-engine": "^0.1.6",
"@fleetbase/internals-engine": "^0.0.23",
"@fleetbase/leaflet-routing-machine": "^3.2.17",
"@fleetbase/registry-bridge-engine": "^0.1.1",
"@fleetbase/storefront-engine": "^0.4.8",
"@fleetbase/registry-bridge-engine": "^0.1.2",
"@fleetbase/samsara-engine": "^0.0.3",
"@fleetbase/storefront-engine": "^0.4.10",
"@fleetbase/valhalla-engine": "^0.0.3",
"@fleetbase/vroom-engine": "^0.0.3",
"@formatjs/intl-datetimeformat": "^6.18.2",
"@formatjs/intl-numberformat": "^8.15.6",
"@formatjs/intl-pluralrules": "^5.4.6",
@@ -82,6 +90,8 @@
"broccoli-asset-rev": "^3.0.0",
"broccoli-file-creator": "^2.1.1",
"broccoli-funnel": "^3.0.8",
"broccoli-merge-trees": "^4.2.0",
"chokidar": "4.0.3",
"concurrently": "^8.2.2",
"date-fns": "^2.30.0",
"dragula": "^3.7.3",
@@ -91,6 +101,7 @@
"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",
@@ -147,9 +158,9 @@
},
"pnpm": {
"overrides": {
"@fleetbase/ember-core": "latest",
"@fleetbase/ember-ui": "latest",
"@fleetbase/fleetops-data": "latest"
"@fleetbase/ember-core": "^0.3.10",
"@fleetbase/ember-ui": "^0.3.18",
"@fleetbase/fleetops-data": "^0.1.24"
}
},
"prettier": {
@@ -166,5 +177,6 @@
}
}
]
}
},
"packageManager": "pnpm@9.5.0+sha512.140036830124618d624a2187b50d04289d5a087f326c9edfc0ccd733d76c4f52c3a313d4fc148794a2a9d81553016004e6742e8cf850670268a7387fc220c903"
}

1889
console/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,18 +1,6 @@
{
"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"
}
],
"name": "Fleetbase Console",
"short_name": "Fleetbase",
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"

View File

@@ -1,26 +0,0 @@
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.20
ENV FLEETBASE_VERSION=0.7.25
# 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=250 --port=8000 --host=0.0.0.0 --watch"]
CMD ["sh", "-c", "php artisan octane:frankenphp --max-requests=1000 --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=250 --port=8000 --host=0.0.0.0"]
CMD ["sh", "-c", "php artisan octane:frankenphp --max-requests=1000 --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=250 --port=8000 --host=0.0.0.0"]
CMD ["sh", "-c", "php artisan octane:frankenphp --max-requests=1000 --port=8000 --host=0.0.0.0"]