mirror of
https://github.com/fleetbase/fleetbase.git
synced 2026-01-08 07:16:49 +00:00
Release ready
This commit is contained in:
33
RELEASE.md
33
RELEASE.md
@@ -1,14 +1,35 @@
|
||||
# 🚀 Fleetbase v0.7.22 — 2025-12-07
|
||||
# 🚀 Fleetbase v0.7.23 — 2025-12-19
|
||||
|
||||
> "Organizations can now set their own alpha-numeric sender ID for SMS"
|
||||
> "🤯 Insane optimization and performance upgrades + horizontal scaling support 🚀"
|
||||
|
||||
---
|
||||
|
||||
## ✨ Highlights
|
||||
- **Custom Alphanumeric Sender ID for SMS:**
|
||||
Organizations can now configure their own **Alphanumeric Sender ID** used when sending verification codes and other SMS notifications.
|
||||
This feature improves brand recognition, enhances trust, and aligns outbound communication with each organization’s identity.
|
||||
Supported in regions/carriers where alphanumeric senders are allowed (e.g., Mongolia and others).
|
||||
|
||||
- Major performance and optimization improvements which support horizontal scaling
|
||||
- Ability to resize images on upload using resize parameters
|
||||
- Several patches in FleetOps - fixed service rates and missing translations, improvements and patch to scheduler
|
||||
- Added a new `LanguageService` available in ember-core
|
||||
- Minor `@fleetbase/ember-ui` improvements
|
||||
|
||||
### New Features
|
||||
- **Improved API performance** with two-layer caching system (Redis + ETag validation) for user and organization data
|
||||
- **Reduced bandwidth usage** with automatic HTTP 304 Not Modified responses via new ValidateETag middleware
|
||||
- **Faster page loads** with intelligent cache invalidation that updates immediately when data changes
|
||||
- **New UserCacheService class** for centralized cache management across the application
|
||||
- **Image resizing support** for dynamic image dimensions via URL parameters
|
||||
- Added `ApiModelCache` class - Provides intelligent Redis-based caching for API query results with automatic invalidation
|
||||
- Added `HasApiModelCache` trait - Enables models to cache query results with a single method call
|
||||
|
||||
### Performance Improvements
|
||||
- Optimized form data syncing to eliminate N+1 query problems, reducing database queries from N to 2 for relationship syncing
|
||||
- Implemented cache stampede prevention to handle high concurrent load efficiently
|
||||
- Added cache versioning system for automatic invalidation when data changes
|
||||
|
||||
### Developer Experience
|
||||
- Added `X-Cache-Status` header to API responses for easy cache debugging (HIT/MISS visibility)
|
||||
- Automatic multi-tenant cache key generation for company-scoped data isolation
|
||||
- Graceful fallback to direct queries when cache is unavailable
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -20,10 +20,10 @@
|
||||
"require": {
|
||||
"php": ">=8.0 <=8.2.28",
|
||||
"appstract/laravel-opcache": "^4.0",
|
||||
"fleetbase/core-api": "^1.6.28",
|
||||
"fleetbase/fleetops-api": "^0.6.29",
|
||||
"fleetbase/core-api": "^1.6.29",
|
||||
"fleetbase/fleetops-api": "^0.6.30",
|
||||
"fleetbase/registry-bridge": "^0.1.2",
|
||||
"fleetbase/storefront-api": "^0.4.9",
|
||||
"fleetbase/storefront-api": "^0.4.10",
|
||||
"guzzlehttp/guzzle": "^7.0.1",
|
||||
"laravel/framework": "^10.0",
|
||||
"laravel/octane": "^2.3",
|
||||
|
||||
496
api/composer.lock
generated
496
api/composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -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) {
|
||||
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;
|
||||
|
||||
@@ -7,18 +7,24 @@
|
||||
<form class="flex flex-col md:flex-row" {{on "submit" (perform this.saveProfile)}}>
|
||||
<div class="w-32 flex flex-col justify-center mb-6 mr-6">
|
||||
<Image src={{this.user.avatar_url}} @fallbackSrc={{config "defaultValues.userImage"}} alt={{this.user.name}} class="w-32 h-32 rounded-md" />
|
||||
<FileUpload @name={{t "console.account.index.photos"}} @accept="image/*" @onFileAdded={{this.uploadNewPhoto}} @labelClass="flex flex-row items-center justify-center" as |queue|>
|
||||
<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>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@fleetbase/console",
|
||||
"version": "0.7.22",
|
||||
"version": "0.7.23",
|
||||
"private": true,
|
||||
"description": "Modular logistics and supply chain operating system (LSOS)",
|
||||
"repository": "https://github.com/fleetbase/fleetbase",
|
||||
@@ -34,14 +34,14 @@
|
||||
"dependencies": {
|
||||
"@ember/legacy-built-in-components": "^0.4.2",
|
||||
"@fleetbase/dev-engine": "^0.2.12",
|
||||
"@fleetbase/ember-core": "^0.3.8",
|
||||
"@fleetbase/ember-ui": "^0.3.14",
|
||||
"@fleetbase/fleetops-data": "^0.1.23",
|
||||
"@fleetbase/fleetops-engine": "^0.6.29",
|
||||
"@fleetbase/ember-core": "^0.3.9",
|
||||
"@fleetbase/ember-ui": "^0.3.15",
|
||||
"@fleetbase/fleetops-data": "^0.1.24",
|
||||
"@fleetbase/fleetops-engine": "^0.6.30",
|
||||
"@fleetbase/iam-engine": "^0.1.6",
|
||||
"@fleetbase/leaflet-routing-machine": "^3.2.17",
|
||||
"@fleetbase/registry-bridge-engine": "^0.1.2",
|
||||
"@fleetbase/storefront-engine": "^0.4.9",
|
||||
"@fleetbase/storefront-engine": "^0.4.10",
|
||||
"@formatjs/intl-datetimeformat": "^6.18.2",
|
||||
"@formatjs/intl-numberformat": "^8.15.6",
|
||||
"@formatjs/intl-pluralrules": "^5.4.6",
|
||||
@@ -93,6 +93,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",
|
||||
@@ -149,9 +150,9 @@
|
||||
},
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
"@fleetbase/ember-core": "latest",
|
||||
"@fleetbase/ember-ui": "latest",
|
||||
"@fleetbase/fleetops-data": "latest"
|
||||
"@fleetbase/ember-core": "^0.3.9",
|
||||
"@fleetbase/ember-ui": "^0.3.15",
|
||||
"@fleetbase/fleetops-data": "^0.1.24"
|
||||
}
|
||||
},
|
||||
"prettier": {
|
||||
|
||||
838
console/pnpm-lock.yaml
generated
838
console/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
Submodule packages/core-api updated: d964db3f42...b637c41e98
Submodule packages/ember-core updated: 2999dcc4c0...ac75087bb0
Submodule packages/ember-ui updated: 4f45d72386...f440950231
Submodule packages/fleetops updated: 0b5accee01...77b5f5959f
Submodule packages/fleetops-data updated: f20408d663...621a8761cd
Submodule packages/storefront updated: f7c6d42f8a...7026b514c1
Reference in New Issue
Block a user