Compare commits

..

6 Commits

Author SHA1 Message Date
Ron
dccd1b6883 Merge pull request #500 from fleetbase/fix/onboarding-context-quota-error
fix: Add localStorage quota error handling to onboarding-context service
2026-02-12 15:49:48 +08:00
Ronald A. Richardson
5e69a7d443 v0.7.29 2026-02-12 15:48:02 +08:00
Ron
989fa9a777 Merge pull request #501 from fleetbase/dev-v0.7.28
Some checks failed
Fleetbase CI / Build and Start Docker Services (push) Has been cancelled
Upgrades fleetops to v0.6.35
2026-02-06 10:17:13 +08:00
Ronald A. Richardson
edec9d02a4 Sync submodule pointers to origin/main 2026-02-06 10:16:16 +08:00
Ronald A. Richardson
a79ebda392 Upgrades fleetops to v0.6.35 2026-02-06 10:04:32 +08:00
Ronald A Richardson
3dc5b9b015 fix: Add localStorage quota error handling to onboarding-context service
- Add _safeSet() and _safeGet() wrappers around appCache operations
- Implement in-memory fallback when localStorage quota is exceeded
- Add user notification when storage issues occur
- Track quota exceeded status to avoid duplicate notifications
- Add getStorageStatus() method for debugging
- Ensure onboarding can complete even with full localStorage
- Data persists in memory for current session when storage is full
2026-02-05 03:54:10 -05:00
21 changed files with 524 additions and 1631 deletions

View File

@@ -210,6 +210,9 @@ jobs:
- name: Set Env Variables
run: |
# ensure file ends with a newline
printf '\n' >> ./environments/.env.production
echo "EXTENSIONS=${{ secrets.EXTENSIONS }}" >> ./environments/.env.production
echo "LOGROCKET_APP_ID=${{ secrets.LOGROCKET_APP_ID }}" >> ./environments/.env.production
echo "STRIPE_KEY=${{ secrets.STRIPE_KEY }}" >> ./environments/.env.production

View File

@@ -1,19 +1,11 @@
# 🚀 Fleetbase v0.7.27 — 2026-02-05
# 🚀 Fleetbase v0.7.28 — 2026-02-05
> "Improvements and patches"
> "Critical patch: eager load driver and vehicle in consumable orders query API"
---
## ✨ Highlights
- Core now supports disabling cache in runtime for `HasApiModelCache` x `HasApiModelBehavior`
- Added new `FileResolverService` to support file resolution from file resources, URL's, base64, and file uploads [190c03d](https://github.com/fleetbase/core-api/pull/187/commits/190c03d484648319f3d890439f74e45820f352fc)
- `VerificationCode` model in core always throws SMS exceptions
- FleetOps: Patched proof of delivery component in order details
- FleetOps: Improved and patched service rate `getServicableForPlaces` which improved service quote performance
- FleetOps: Fix location GeoJSON Point casting for `location` properties - using the new `Utils::castPoint` utility [208151f](https://github.com/fleetbase/fleetops/pull/202/commits/208151f37ece54bb23cfeeebdbb6fde1142908f7)
- Storefront: Critical patch for QPay checkout workflow [storefront#66](https://github.com/fleetbase/storefront/pull/66)
- Storefront: Added new phone number verification endpoints for customers (`request-phone-verification` and `verify-phone-number`)
- Storefront: Fixed cart based service quotes
- Critical patch which fixes eager loading relationship when querying orders via the consumable API, this is done to handle the new `whenLoaded` resource conditional methods. [fleetbase/fleetops#203](https://github.com/fleetbase/fleetops/pull/203)
---

View File

@@ -21,17 +21,9 @@
"php": ">=8.0 <=8.2.30",
"appstract/laravel-opcache": "^4.0",
"fleetbase/core-api": "^1.6.35",
"fleetbase/fleetops-api": "^0.6.34",
"fleetbase/fleetops-api": "^0.6.35",
"fleetbase/registry-bridge": "^0.1.5",
"fleetbase/storefront-api": "^0.4.13",
"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.20",
"fleetbase/internals-api": "^0.0.27",
"fleetbase/aws-marketplace": "^0.0.8",
"fleetbase/customer-portal-api": "^0.0.10",
"guzzlehttp/guzzle": "^7.0.1",
"laravel/framework": "^10.0",
"laravel/octane": "^2.3",
@@ -57,25 +49,9 @@
"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.qa.fleetbase.io"
"url": "https://registry.fleetbase.io"
}
],
"autoload": {

731
api/composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "e954505e73c22f58f4c560cd1a88c7cf",
"content-hash": "240f5916db1171e37d4f4548cd9f1373",
"packages": [
{
"name": "appstract/laravel-opcache",
@@ -2154,208 +2154,6 @@
},
"time": "2025-04-09T20:32:01+00:00"
},
{
"name": "fleetbase/aws-marketplace",
"version": "0.0.8",
"source": {
"type": "git",
"url": "git@github.com:fleetbase/aws-marketplace.git",
"reference": "ae041a5fa5165ca26de0c58bcc1522cd72dd28f9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fleetbase/aws-marketplace/zipball/ae041a5fa5165ca26de0c58bcc1522cd72dd28f9",
"reference": "ae041a5fa5165ca26de0c58bcc1522cd72dd28f9",
"shasum": ""
},
"require": {
"aws/aws-sdk-php": "^3.0",
"fleetbase/core-api": "*",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^5.11.0|^6.4.0",
"pestphp/pest": "^1.22.6",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\AwsMarketplace\\Providers\\AwsMarketplaceServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\AwsMarketplace\\": "server/src/",
"Fleetbase\\AwsMarketplace\\Seeds\\": "server/seeds/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\AwsMarketplace\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Pte Ltd",
"email": "hello@fleetbase.io"
}
],
"description": "AWS Marketplace SaaS integration extension for Fleetbase",
"keywords": [
"aws",
"billing",
"cloudformation",
"deployment",
"fleetbase",
"fleetbase-extension",
"marketplace",
"saas"
],
"support": {
"source": "https://github.com/fleetbase/aws-marketplace/tree/v0.0.8",
"issues": "https://github.com/fleetbase/aws-marketplace/issues"
},
"time": "2025-12-06T10:25:37+00:00"
},
{
"name": "fleetbase/billing-api",
"version": "0.1.20",
"source": {
"type": "git",
"url": "git@github.com:fleetbase/billing.git",
"reference": "c610ef3ff224fb2f141eedc46615e2be9423db24"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fleetbase/billing/zipball/c610ef3ff224fb2f141eedc46615e2be9423db24",
"reference": "c610ef3ff224fb2f141eedc46615e2be9423db24",
"shasum": ""
},
"require": {
"fleetbase/core-api": "*",
"laravel/cashier": "^16.2.0",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*",
"stripe/stripe-php": "^17.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^7.0",
"pestphp/pest": "^2.33.2",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\Billing\\Providers\\BillingServiceProvider"
]
},
"fleetbase": {
"sandbox-migrations": false
},
"fleetbase/billing-api": {
"excludes": [
"addon",
"app",
"assets",
"config",
"tests",
"vendor"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\Billing\\": "server/src/",
"Fleetbase\\Billing\\Seeders\\": "server/seeders/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\Billing\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Pte Ltd.",
"email": "hello@fleetbase.io"
},
{
"name": "Ronald A. Richardson",
"email": "ron@fleetbase.io"
}
],
"description": "Multi-Tenant Billing and Subscriptions Extension for Fleetbase",
"keywords": [
"billing",
"billing system",
"fleetbase",
"fleetbase-extension",
"revenue engine",
"revenue generator",
"stripe",
"stripe api"
],
"support": {
"source": "https://github.com/fleetbase/billing/tree/v0.1.20",
"issues": "https://github.com/fleetbase/billing/issues"
},
"time": "2026-02-05T00:30:22+00:00"
},
{
"name": "fleetbase/core-api",
"version": "1.6.35",
@@ -2523,108 +2321,18 @@
},
"time": "2025-07-10T14:06:48+00:00"
},
{
"name": "fleetbase/customer-portal-api",
"version": "0.0.10",
"source": {
"type": "git",
"url": "git@github.com:fleetbase/customer-portal.git",
"reference": "99a072129a60c71fd9f2703166b15f442b7072bb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fleetbase/customer-portal/zipball/99a072129a60c71fd9f2703166b15f442b7072bb",
"reference": "99a072129a60c71fd9f2703166b15f442b7072bb",
"shasum": ""
},
"require": {
"fleetbase/core-api": "*",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^5.11.0|^6.4.0",
"pestphp/pest": "^1.22.6",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\CustomerPortal\\Providers\\CustomerPortalServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\CustomerPortal\\": "server/src/",
"Fleetbase\\CustomerPortal\\Seeds\\": "server/seeds/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\CustomerPortal\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Pte Ltd.",
"email": "hello@fleetbase.io"
}
],
"description": "Extendable Customer Portal for Fleetbase",
"keywords": [
"customer",
"customer management",
"customer portal",
"customer support",
"customer tracking",
"fleetbase",
"fleetbase-extension"
],
"support": {
"source": "https://github.com/fleetbase/customer-portal/tree/v0.0.10",
"issues": "https://github.com/fleetbase/customer-portal/issues"
},
"time": "2025-12-06T10:12:51+00:00"
},
{
"name": "fleetbase/fleetops-api",
"version": "0.6.34",
"version": "0.6.35",
"source": {
"type": "git",
"url": "https://github.com/fleetbase/fleetops.git",
"reference": "05503cee9f55f5e4e1bad2210615e4f67bb165ab"
"reference": "c89d1f3e81564cb5009293001a67cd4e59051a69"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fleetbase/fleetops/zipball/05503cee9f55f5e4e1bad2210615e4f67bb165ab",
"reference": "05503cee9f55f5e4e1bad2210615e4f67bb165ab",
"url": "https://api.github.com/repos/fleetbase/fleetops/zipball/c89d1f3e81564cb5009293001a67cd4e59051a69",
"reference": "c89d1f3e81564cb5009293001a67cd4e59051a69",
"shasum": ""
},
"require": {
@@ -2699,202 +2407,9 @@
],
"support": {
"issues": "https://github.com/fleetbase/fleetops/issues",
"source": "https://github.com/fleetbase/fleetops/tree/v0.6.34"
"source": "https://github.com/fleetbase/fleetops/tree/v0.6.35"
},
"time": "2026-02-05T00:08:14+00:00"
},
{
"name": "fleetbase/flespi-integration",
"version": "0.1.16",
"dist": {
"type": "tar",
"url": "https://s3.ap-southeast-1.amazonaws.com/fleetbase-registry-qa/flb/%40fleetbase/flespi-engine/flespi-engine-0.1.16.tgz?AWSAccessKeyId=ASIA26E6KG6WDUGJSKAY&Expires=1770268345&Signature=5uPKDadg8%2BQkKeJ%2FcMBSqvc20FY%3D&x-amz-security-token=IQoJb3JpZ2luX2VjEF0aDmFwLXNvdXRoZWFzdC0xIkYwRAIgOJZmdTX9gP9v%2Bo0zL%2BcafWeo3dHkwNRBvYe5Yixz89cCIGt4Tkhn6Oj0SeYSQT%2BAAwZXKMIjLq2WihJ2ZwT8xR2xKoYECCYQABoMNzUxOTUxMjk2NDI4Igxm9U7jrz%2BlqDPjemIq4wMcmYb9sR85Y%2B%2F6NcN8ApLrQgy%2B7vdefCS20gmj11AQupkfGRVN2FJqnJvavgtfMEdNIWJoCnEx%2BYvVbmnb3LeyBSNfHXjUP%2BE%2B0FTKXtkKstnPt9HXetQ1EU%2Fc52hnZT7KZzqJ%2Ft4iSkYhrpfZsLFMjJsez%2Bchezu%2FrMouPr44VCJa9kHIDs%2FimbJSGoGjVLqeYaUHHr9zBgFKhUSn8L93Q5sDkHUgxYG8PTJSZ5rGjGH7oR0B404xRgveOemTq9HRPwbdBBNooCVfPElJkZXB7r6RRfvVb0REayC4aKZ1Y07IMUc7LokkCDDtorkRrXmq3bi0i9xtJzTuE2D5N5MTmYL8pS8gss%2FApMhM7EU9UTZzJGEvnY11IF9gePRgYjJ4DYFNt850fDzsdeMrgQso5Pc67KqiVUIo%2FLs5kWrslTPybBIb66nk2uCwK4GUD45qDGCwNymIPjI8hSR2MSCdGkpp9Y%2FfSkpZuvYKuCpcfEdhIkC5ryseCdnKoyyODJ7PO%2BUjqJ6JuxBC5Wafxpn6zT6pE%2B29QA1LrPGMN5qRSHyO%2FaZmrIGp8buOaHAHST5gvryDpTazz0XU8uqxLZWxXt3zt4SkZMCy%2B6cHoWYWll0ukyVgI9efy3rB6wuBUkiP9Pgw6LyQzAY6pgFHoWEqdlr1JPzXHVStehXxLGb1XW42IYCelc8eGjighayNscGg05bBjlT3h4JIsF7GPqjG2kafB9NSLB3f26kT%2F%2Fsu5FNgeo2aT7dMdh2gRe%2B62R8%2FfdvMnTAlPVuqbf898wgOQqRWBCpaPHJyNWaYjfbl0JFG0nnVs60C65qgngGJFGQr8C4oVpTGACAx%2FsKmNKse8iafy7db3BqakR41u2DgY4QO"
},
"require": {
"fleetbase/core-api": "*",
"fleetbase/fleetops-api": "*",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*",
"vlucas/phpdotenv": "^5.5"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^5.11.0|^6.4.0",
"pestphp/pest": "^1.22.6",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\Flespi\\Providers\\FlespiIntegrationServiceProvider",
"Fleetbase\\Flespi\\Providers\\NotificationServiceProvider"
]
},
"fleetbase": {
"sandbox-migrations": false
},
"fleetbase/flespi-integration": {
"excludes": [
"addon",
"app",
"assets",
"config",
"tests",
"vendor"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\Flespi\\": "server/src/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\Flespi\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Pte Ltd.",
"email": "hello@fleetbase.io"
}
],
"description": "Flespi Universal Telematics Gateway, Parser & API Extension for Fleetbase",
"keywords": [
"fleetbase-extension",
"flespi"
]
},
{
"name": "fleetbase/internals-api",
"version": "0.0.27",
"source": {
"type": "git",
"url": "git@github.com:fleetbase/internals.git",
"reference": "824ca96698eb947d1510bbe3c713ad4a8f632692"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fleetbase/internals/zipball/824ca96698eb947d1510bbe3c713ad4a8f632692",
"reference": "824ca96698eb947d1510bbe3c713ad4a8f632692",
"shasum": ""
},
"require": {
"fleetbase/billing-api": "*",
"fleetbase/core-api": "*",
"fleetbase/registry-bridge": "*",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^7.0",
"pestphp/pest": "^2.33.2",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\Internals\\Providers\\InternalServiceProvider"
]
},
"fleetbase": {
"sandbox-migrations": false
},
"fleetbase/internals-api": {
"excludes": [
"addon",
"app",
"assets",
"config",
"tests",
"vendor"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\Internals\\": "server/src/",
"Fleetbase\\Internals\\Seeds\\": "server/seeds/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\Internals\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Pte Ltd.",
"email": "hello@fleetbase.io"
},
{
"name": "Ronald A. Richardson",
"email": "ron@fleetbase.io"
}
],
"description": "Private internal functionality for Fleetbase SaaS",
"keywords": [
"fleetbase",
"fleetbase-extension",
"fleetbase-internals"
],
"support": {
"source": "https://github.com/fleetbase/internals/tree/v0.0.27",
"issues": "https://github.com/fleetbase/internals/issues"
},
"time": "2026-02-05T00:32:03+00:00"
"time": "2026-02-06T00:58:53+00:00"
},
{
"name": "fleetbase/laravel-mysql-spatial",
@@ -3044,84 +2559,6 @@
},
"time": "2026-01-31T05:33:11+00:00"
},
{
"name": "fleetbase/samsara-api",
"version": "0.0.3",
"dist": {
"type": "tar",
"url": "https://s3.ap-southeast-1.amazonaws.com/fleetbase-registry-qa/flb/%40fleetbase/samsara-engine/samsara-engine-0.0.3.tgz?AWSAccessKeyId=ASIA26E6KG6WDUGJSKAY&Expires=1770268345&Signature=n3Rsr7uDpxjqwzWmcC2r8mUpwDM%3D&x-amz-security-token=IQoJb3JpZ2luX2VjEF0aDmFwLXNvdXRoZWFzdC0xIkYwRAIgOJZmdTX9gP9v%2Bo0zL%2BcafWeo3dHkwNRBvYe5Yixz89cCIGt4Tkhn6Oj0SeYSQT%2BAAwZXKMIjLq2WihJ2ZwT8xR2xKoYECCYQABoMNzUxOTUxMjk2NDI4Igxm9U7jrz%2BlqDPjemIq4wMcmYb9sR85Y%2B%2F6NcN8ApLrQgy%2B7vdefCS20gmj11AQupkfGRVN2FJqnJvavgtfMEdNIWJoCnEx%2BYvVbmnb3LeyBSNfHXjUP%2BE%2B0FTKXtkKstnPt9HXetQ1EU%2Fc52hnZT7KZzqJ%2Ft4iSkYhrpfZsLFMjJsez%2Bchezu%2FrMouPr44VCJa9kHIDs%2FimbJSGoGjVLqeYaUHHr9zBgFKhUSn8L93Q5sDkHUgxYG8PTJSZ5rGjGH7oR0B404xRgveOemTq9HRPwbdBBNooCVfPElJkZXB7r6RRfvVb0REayC4aKZ1Y07IMUc7LokkCDDtorkRrXmq3bi0i9xtJzTuE2D5N5MTmYL8pS8gss%2FApMhM7EU9UTZzJGEvnY11IF9gePRgYjJ4DYFNt850fDzsdeMrgQso5Pc67KqiVUIo%2FLs5kWrslTPybBIb66nk2uCwK4GUD45qDGCwNymIPjI8hSR2MSCdGkpp9Y%2FfSkpZuvYKuCpcfEdhIkC5ryseCdnKoyyODJ7PO%2BUjqJ6JuxBC5Wafxpn6zT6pE%2B29QA1LrPGMN5qRSHyO%2FaZmrIGp8buOaHAHST5gvryDpTazz0XU8uqxLZWxXt3zt4SkZMCy%2B6cHoWYWll0ukyVgI9efy3rB6wuBUkiP9Pgw6LyQzAY6pgFHoWEqdlr1JPzXHVStehXxLGb1XW42IYCelc8eGjighayNscGg05bBjlT3h4JIsF7GPqjG2kafB9NSLB3f26kT%2F%2Fsu5FNgeo2aT7dMdh2gRe%2B62R8%2FfdvMnTAlPVuqbf898wgOQqRWBCpaPHJyNWaYjfbl0JFG0nnVs60C65qgngGJFGQr8C4oVpTGACAx%2FsKmNKse8iafy7db3BqakR41u2DgY4QO"
},
"require": {
"fleetbase/core-api": "*",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^5.11.0|^6.4.0",
"pestphp/pest": "^1.22.6",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\Samsara\\Providers\\SamsaraServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\Samsara\\": "server/src/",
"Fleetbase\\Samsara\\Seeds\\": "server/seeds/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\Samsara\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Developer",
"email": "developer@fleetbase.io"
}
],
"description": "Vehicle Data Import & Location Integration via Samsara API",
"keywords": [
"fleet",
"fleetbase",
"fleetbase-extension",
"integration",
"samsara",
"tracking",
"vehicle"
]
},
{
"name": "fleetbase/storefront-api",
"version": "0.4.13",
@@ -3282,160 +2719,6 @@
],
"time": "2024-08-15T08:26:54+00:00"
},
{
"name": "fleetbase/valhalla-api",
"version": "0.0.3",
"dist": {
"type": "tar",
"url": "https://s3.ap-southeast-1.amazonaws.com/fleetbase-registry-qa/flb/%40fleetbase/valhalla-engine/valhalla-engine-0.0.3.tgz?AWSAccessKeyId=ASIA26E6KG6WDUGJSKAY&Expires=1770268345&Signature=n23fkLe8P9zSKVmusHQVSI8YJMQ%3D&x-amz-security-token=IQoJb3JpZ2luX2VjEF0aDmFwLXNvdXRoZWFzdC0xIkYwRAIgOJZmdTX9gP9v%2Bo0zL%2BcafWeo3dHkwNRBvYe5Yixz89cCIGt4Tkhn6Oj0SeYSQT%2BAAwZXKMIjLq2WihJ2ZwT8xR2xKoYECCYQABoMNzUxOTUxMjk2NDI4Igxm9U7jrz%2BlqDPjemIq4wMcmYb9sR85Y%2B%2F6NcN8ApLrQgy%2B7vdefCS20gmj11AQupkfGRVN2FJqnJvavgtfMEdNIWJoCnEx%2BYvVbmnb3LeyBSNfHXjUP%2BE%2B0FTKXtkKstnPt9HXetQ1EU%2Fc52hnZT7KZzqJ%2Ft4iSkYhrpfZsLFMjJsez%2Bchezu%2FrMouPr44VCJa9kHIDs%2FimbJSGoGjVLqeYaUHHr9zBgFKhUSn8L93Q5sDkHUgxYG8PTJSZ5rGjGH7oR0B404xRgveOemTq9HRPwbdBBNooCVfPElJkZXB7r6RRfvVb0REayC4aKZ1Y07IMUc7LokkCDDtorkRrXmq3bi0i9xtJzTuE2D5N5MTmYL8pS8gss%2FApMhM7EU9UTZzJGEvnY11IF9gePRgYjJ4DYFNt850fDzsdeMrgQso5Pc67KqiVUIo%2FLs5kWrslTPybBIb66nk2uCwK4GUD45qDGCwNymIPjI8hSR2MSCdGkpp9Y%2FfSkpZuvYKuCpcfEdhIkC5ryseCdnKoyyODJ7PO%2BUjqJ6JuxBC5Wafxpn6zT6pE%2B29QA1LrPGMN5qRSHyO%2FaZmrIGp8buOaHAHST5gvryDpTazz0XU8uqxLZWxXt3zt4SkZMCy%2B6cHoWYWll0ukyVgI9efy3rB6wuBUkiP9Pgw6LyQzAY6pgFHoWEqdlr1JPzXHVStehXxLGb1XW42IYCelc8eGjighayNscGg05bBjlT3h4JIsF7GPqjG2kafB9NSLB3f26kT%2F%2Fsu5FNgeo2aT7dMdh2gRe%2B62R8%2FfdvMnTAlPVuqbf898wgOQqRWBCpaPHJyNWaYjfbl0JFG0nnVs60C65qgngGJFGQr8C4oVpTGACAx%2FsKmNKse8iafy7db3BqakR41u2DgY4QO"
},
"require": {
"fleetbase/core-api": "*",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^5.11.0|^6.4.0",
"pestphp/pest": "^1.22.6",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\Valhalla\\Providers\\ValhallaServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\Valhalla\\": "server/src/",
"Fleetbase\\Valhalla\\Seeds\\": "server/seeds/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\Valhalla\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Pte Ltd",
"email": "hello@fleetbase.io"
}
],
"description": "Valhalla routing engine extension for Fleetbase",
"keywords": [
"fleetbase",
"fleetbase",
"fleetbase-extension",
"routing",
"routing engine",
"valhalla"
]
},
{
"name": "fleetbase/vroom-api",
"version": "0.0.3",
"dist": {
"type": "tar",
"url": "https://s3.ap-southeast-1.amazonaws.com/fleetbase-registry-qa/flb/%40fleetbase/vroom-engine/vroom-engine-0.0.3.tgz?AWSAccessKeyId=ASIA26E6KG6WDUGJSKAY&Expires=1770268345&Signature=hCcXYbdUv7LrDXBToikZbYN1vFQ%3D&x-amz-security-token=IQoJb3JpZ2luX2VjEF0aDmFwLXNvdXRoZWFzdC0xIkYwRAIgOJZmdTX9gP9v%2Bo0zL%2BcafWeo3dHkwNRBvYe5Yixz89cCIGt4Tkhn6Oj0SeYSQT%2BAAwZXKMIjLq2WihJ2ZwT8xR2xKoYECCYQABoMNzUxOTUxMjk2NDI4Igxm9U7jrz%2BlqDPjemIq4wMcmYb9sR85Y%2B%2F6NcN8ApLrQgy%2B7vdefCS20gmj11AQupkfGRVN2FJqnJvavgtfMEdNIWJoCnEx%2BYvVbmnb3LeyBSNfHXjUP%2BE%2B0FTKXtkKstnPt9HXetQ1EU%2Fc52hnZT7KZzqJ%2Ft4iSkYhrpfZsLFMjJsez%2Bchezu%2FrMouPr44VCJa9kHIDs%2FimbJSGoGjVLqeYaUHHr9zBgFKhUSn8L93Q5sDkHUgxYG8PTJSZ5rGjGH7oR0B404xRgveOemTq9HRPwbdBBNooCVfPElJkZXB7r6RRfvVb0REayC4aKZ1Y07IMUc7LokkCDDtorkRrXmq3bi0i9xtJzTuE2D5N5MTmYL8pS8gss%2FApMhM7EU9UTZzJGEvnY11IF9gePRgYjJ4DYFNt850fDzsdeMrgQso5Pc67KqiVUIo%2FLs5kWrslTPybBIb66nk2uCwK4GUD45qDGCwNymIPjI8hSR2MSCdGkpp9Y%2FfSkpZuvYKuCpcfEdhIkC5ryseCdnKoyyODJ7PO%2BUjqJ6JuxBC5Wafxpn6zT6pE%2B29QA1LrPGMN5qRSHyO%2FaZmrIGp8buOaHAHST5gvryDpTazz0XU8uqxLZWxXt3zt4SkZMCy%2B6cHoWYWll0ukyVgI9efy3rB6wuBUkiP9Pgw6LyQzAY6pgFHoWEqdlr1JPzXHVStehXxLGb1XW42IYCelc8eGjighayNscGg05bBjlT3h4JIsF7GPqjG2kafB9NSLB3f26kT%2F%2Fsu5FNgeo2aT7dMdh2gRe%2B62R8%2FfdvMnTAlPVuqbf898wgOQqRWBCpaPHJyNWaYjfbl0JFG0nnVs60C65qgngGJFGQr8C4oVpTGACAx%2FsKmNKse8iafy7db3BqakR41u2DgY4QO"
},
"require": {
"fleetbase/core-api": "*",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^5.11.0|^6.4.0",
"pestphp/pest": "^1.22.6",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\Vroom\\Providers\\VroomServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\Vroom\\": "server/src/",
"Fleetbase\\Vroom\\Seeds\\": "server/seeds/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\Vroom\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Pte Ltd",
"email": "hello@fleetbase.io"
}
],
"description": "VROOM route optimization machine extension for Fleetbase",
"keywords": [
"fleetbase",
"fleetbase",
"fleetbase-extension",
"route optimization",
"routing",
"vroom"
]
},
{
"name": "fruitcake/php-cors",
"version": "v1.4.0",

View File

@@ -2,6 +2,7 @@ import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { inject as service } from '@ember/service';
import { isArray } from '@ember/array';
import { debug } from '@ember/debug';
import { storageFor } from 'ember-local-storage';
import { add, isPast } from 'date-fns';
import { task } from 'ember-concurrency';

View File

@@ -6,20 +6,110 @@ const KEYS_INDEX = `${CONTEXT_PREFIX}__keys__`;
export default class OnboardingContextService extends Service {
@service appCache;
@service notifications;
@tracked data = {};
@tracked quotaExceeded = false;
@tracked usingMemoryFallback = false;
// In-memory fallback storage for when localStorage is full
_memoryCache = new Map();
/**
* Safe wrapper for appCache.set with quota error handling
*
* @param {string} key - The key to set
* @param {*} value - The value to store
* @returns {Object} Result object with success status and storage type
*/
_safeSet(key, value) {
try {
this.appCache.set(key, value);
return { success: true, storage: 'localStorage' };
} catch (error) {
if (this._isQuotaError(error)) {
console.warn(`[OnboardingContext] localStorage quota exceeded, using memory fallback for key: ${key}`);
// Store in memory as fallback
this._memoryCache.set(key, value);
// Mark that we're using fallback and notify user (only once)
if (!this.quotaExceeded) {
this.quotaExceeded = true;
this.usingMemoryFallback = true;
this._notifyUser();
}
return { success: true, storage: 'memory', warning: 'Using memory fallback' };
}
// Re-throw non-quota errors
throw error;
}
}
/**
* Safe wrapper for appCache.get with memory fallback
*
* @param {string} key - The key to retrieve
* @returns {*} The stored value or undefined
*/
_safeGet(key) {
try {
const value = this.appCache.get(key);
if (value !== undefined) {
return value;
}
} catch (error) {
console.warn(`[OnboardingContext] Error reading from appCache: ${error.message}`);
}
// Fallback to memory cache
return this._memoryCache.get(key);
}
/**
* Check if error is a quota exceeded error
*
* @param {Error} error - The error to check
* @returns {boolean} True if it's a quota error
*/
_isQuotaError(error) {
return (
error instanceof DOMException &&
(error.code === 22 ||
error.code === 1014 ||
error.name === 'QuotaExceededError' ||
error.name === 'NS_ERROR_DOM_QUOTA_REACHED')
);
}
/**
* Notify user about storage issues (only called once)
*/
_notifyUser() {
if (this.notifications) {
this.notifications.warning(
'Your browser storage is full. Your onboarding progress will be saved temporarily but may be lost if you close this tab. Please complete the onboarding process in this session.',
{
timeout: 10000,
clearDuration: 300
}
);
}
}
/**
* Get a value from in-memory state first, then fallback to cache
*/
get(key) {
return this.data[key] ?? this.appCache.get(`${CONTEXT_PREFIX}${key}`);
return this.data[key] ?? this._safeGet(`${CONTEXT_PREFIX}${key}`);
}
/**
* Get a value directly from cache
*/
getFromCache(key) {
return this.appCache.get(`${CONTEXT_PREFIX}${key}`);
return this._safeGet(`${CONTEXT_PREFIX}${key}`);
}
/**
@@ -28,11 +118,11 @@ export default class OnboardingContextService extends Service {
* @returns {Object}
*/
restore() {
const keys = this.appCache.get(KEYS_INDEX) ?? [];
const keys = this._safeGet(KEYS_INDEX) ?? [];
const persisted = {};
for (const key of keys) {
const value = this.appCache.get(`${CONTEXT_PREFIX}${key}`);
const value = this._safeGet(`${CONTEXT_PREFIX}${key}`);
if (value !== undefined) {
persisted[key] = value;
}
@@ -63,14 +153,14 @@ export default class OnboardingContextService extends Service {
this.data = { ...this.data, ...filteredData };
if (options.persist === true) {
const keys = new Set(this.appCache.get(KEYS_INDEX) ?? []);
const keys = new Set(this._safeGet(KEYS_INDEX) ?? []);
for (const key of Object.keys(filteredData)) {
keys.add(key);
this.appCache.set(`${CONTEXT_PREFIX}${key}`, this.data[key]);
this._safeSet(`${CONTEXT_PREFIX}${key}`, this.data[key]);
}
this.appCache.set(KEYS_INDEX, [...keys]);
this._safeSet(KEYS_INDEX, [...keys]);
}
}
@@ -88,11 +178,11 @@ export default class OnboardingContextService extends Service {
this.data = { ...this.data, [key]: value };
if (options.persist === true) {
const keys = new Set(this.appCache.get(KEYS_INDEX) ?? []);
const keys = new Set(this._safeGet(KEYS_INDEX) ?? []);
keys.add(key);
this.appCache.set(`${CONTEXT_PREFIX}${key}`, value);
this.appCache.set(KEYS_INDEX, [...keys]);
this._safeSet(`${CONTEXT_PREFIX}${key}`, value);
this._safeSet(KEYS_INDEX, [...keys]);
}
}
@@ -110,24 +200,44 @@ export default class OnboardingContextService extends Service {
const { [key]: _removed, ...rest } = this.data; // eslint-disable-line no-unused-vars
this.data = rest;
const keys = new Set(this.appCache.get(KEYS_INDEX) ?? []);
const keys = new Set(this._safeGet(KEYS_INDEX) ?? []);
keys.delete(key);
this.appCache.set(`${CONTEXT_PREFIX}${key}`, undefined);
this.appCache.set(KEYS_INDEX, [...keys]);
this._safeSet(`${CONTEXT_PREFIX}${key}`, undefined);
this._safeSet(KEYS_INDEX, [...keys]);
// Also remove from memory cache
this._memoryCache.delete(`${CONTEXT_PREFIX}${key}`);
}
/**
* Fully reset onboarding context (memory + persistence)
*/
reset() {
const keys = this.appCache.get(KEYS_INDEX) ?? [];
const keys = this._safeGet(KEYS_INDEX) ?? [];
for (const key of keys) {
this.appCache.set(`${CONTEXT_PREFIX}${key}`, undefined);
this._safeSet(`${CONTEXT_PREFIX}${key}`, undefined);
this._memoryCache.delete(`${CONTEXT_PREFIX}${key}`);
}
this.appCache.set(KEYS_INDEX, []);
this._safeSet(KEYS_INDEX, []);
this._memoryCache.clear();
this.data = {};
this.quotaExceeded = false;
this.usingMemoryFallback = false;
}
}
/**
* Get storage status for debugging
*
* @returns {Object} Storage status information
*/
getStorageStatus() {
return {
quotaExceeded: this.quotaExceeded,
usingMemoryFallback: this.usingMemoryFallback,
memoryItemCount: this._memoryCache.size
};
}
}

View File

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

View File

@@ -1,9 +0,0 @@
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.27",
"version": "0.7.28",
"private": true,
"description": "Modular logistics and supply chain operating system (LSOS)",
"repository": "https://github.com/fleetbase/fleetbase",
@@ -33,22 +33,14 @@
},
"dependencies": {
"@ember/legacy-built-in-components": "^0.4.2",
"@fleetbase/aws-marketplace": "^0.0.8",
"@fleetbase/billing-engine": "^0.1.20",
"@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.34",
"@fleetbase/flespi-engine": "^0.1.16",
"@fleetbase/fleetops-engine": "^0.6.35",
"@fleetbase/iam-engine": "^0.1.6",
"@fleetbase/internals-engine": "^0.0.27",
"@fleetbase/leaflet-routing-machine": "^3.2.17",
"@fleetbase/registry-bridge-engine": "^0.1.5",
"@fleetbase/samsara-engine": "^0.0.3",
"@fleetbase/valhalla-engine": "^0.0.3",
"@fleetbase/vroom-engine": "^0.0.3",
"@fleetbase/storefront-engine": "^0.4.13",
"@formatjs/intl-datetimeformat": "^6.18.2",
"@formatjs/intl-numberformat": "^8.15.6",

1182
console/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

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.27
ENV FLEETBASE_VERSION=0.7.28
# Set environment
ARG ENVIRONMENT=production