mirror of
https://github.com/fleetbase/fleetbase.git
synced 2026-01-07 23:04:14 +00:00
Compare commits
6 Commits
ron/dev-v0
...
feature/co
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4b12efef41 | ||
|
|
658568e4ec | ||
|
|
8a487b2352 | ||
|
|
bc89218a26 | ||
|
|
5a4f7e2ae3 | ||
|
|
9fa1bf54d2 |
17
RELEASE.md
17
RELEASE.md
@@ -1,14 +1,17 @@
|
||||
# 🚀 Fleetbase v0.7.18 — 2025-11-10
|
||||
# 🚀 Fleetbase v0.7.19 — 2025-11-17
|
||||
|
||||
> "Hotfix IAM user validation, make online/offline toggle silent"
|
||||
> "A major leap forward in scheduling, reporting, and user interface capabilities."
|
||||
|
||||
---
|
||||
|
||||
## ✨ Highlights
|
||||
- Hotfix validateRequest implementation to not rewrite request params
|
||||
- Hotfix user validation password optional for creation
|
||||
- Made online/offline endpoint for drivers silent
|
||||
- Hotfix QPay payment gateway on Storefront + ebarimt reciept fix
|
||||
- **Core Scheduling Module**: A comprehensive, polymorphic, and reusable scheduling system has been integrated into the core API, providing the foundation for a wide range of scheduling applications.
|
||||
- **Driver Scheduling with HOS Compliance**: FleetOps now includes built-in compliance for FMCSA Hours of Service regulations.
|
||||
- **Computed Columns in Query Builder**: The query builder now supports computed columns, allowing for more complex and powerful data queries with secure expression validation.
|
||||
- **Advanced Table Functionality**: The Ember UI table component now supports multi-column sorting, horizontal scrolling, and sticky columns.
|
||||
- **New Filter Components**: New filter components for multi-input and range selection have been added to the Ember UI.
|
||||
- **Dispatched Flag Control**: The order creation process in FleetOps now allows for explicit control over the dispatch behavior.
|
||||
- **Vehicle Attributes Enhancement**: The vehicle model and API resources in FleetOps have been enhanced with additional attributes.
|
||||
|
||||
---
|
||||
|
||||
@@ -31,4 +34,4 @@ docker compose exec application bash -c "./deploy.sh"
|
||||
```
|
||||
|
||||
## 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/fleetbase/discussions) or drop by [#fleetbase on Discord](https://discord.com/invite/HnTqQ6zAVn)
|
||||
|
||||
@@ -20,13 +20,10 @@
|
||||
"require": {
|
||||
"php": "^8.0",
|
||||
"appstract/laravel-opcache": "^4.0",
|
||||
"fleetbase/billing-api": "^0.1.10",
|
||||
"fleetbase/core-api": "^1.6.24",
|
||||
"fleetbase/fleetops-api": "^0.6.25",
|
||||
"fleetbase/fliit-api": "^0.0.1",
|
||||
"fleetbase/internals-api": "^0.0.21",
|
||||
"fleetbase/core-api": "^1.6.25",
|
||||
"fleetbase/fleetops-api": "^0.6.26",
|
||||
"fleetbase/registry-bridge": "^0.1.0",
|
||||
"fleetbase/storefront-api": "^0.4.6",
|
||||
"fleetbase/storefront-api": "^0.4.7",
|
||||
"guzzlehttp/guzzle": "^7.0.1",
|
||||
"laravel/framework": "^10.0",
|
||||
"laravel/octane": "^2.3",
|
||||
@@ -55,30 +52,6 @@
|
||||
{
|
||||
"type": "composer",
|
||||
"url": "https://registry.fleetbase.io"
|
||||
},
|
||||
{
|
||||
"type": "path",
|
||||
"url": "../packages/core-api"
|
||||
},
|
||||
{
|
||||
"type": "path",
|
||||
"url": "../packages/fleetops"
|
||||
},
|
||||
{
|
||||
"type": "path",
|
||||
"url": "../packages/storefront"
|
||||
},
|
||||
{
|
||||
"type": "path",
|
||||
"url": "../packages/fliit"
|
||||
},
|
||||
{
|
||||
"type": "path",
|
||||
"url": "../packages/internals"
|
||||
},
|
||||
{
|
||||
"type": "path",
|
||||
"url": "../packages/billing"
|
||||
}
|
||||
],
|
||||
"autoload": {
|
||||
|
||||
687
api/composer.lock
generated
687
api/composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -4,11 +4,11 @@ import { inject as service } from '@ember/service';
|
||||
import { action } from '@ember/object';
|
||||
|
||||
export default class DashboardWidgetPanelComponent extends Component {
|
||||
@service universe;
|
||||
@service('universe/widget-service') widgetService;
|
||||
@service notifications;
|
||||
@tracked availableWidgets = [];
|
||||
@tracked dashboard;
|
||||
@tracked isOpen = true;
|
||||
@service notifications;
|
||||
|
||||
/**
|
||||
* Constructs the component and applies initial state.
|
||||
@@ -16,7 +16,7 @@ export default class DashboardWidgetPanelComponent extends Component {
|
||||
constructor(owner, { dashboard }) {
|
||||
super(...arguments);
|
||||
|
||||
this.availableWidgets = this.universe.getDashboardWidgets();
|
||||
this.availableWidgets = this.widgetService.getWidgets('dashboard');
|
||||
this.dashboard = dashboard;
|
||||
}
|
||||
|
||||
|
||||
81
console/app/instance-initializers/initialize-universe.js
Normal file
81
console/app/instance-initializers/initialize-universe.js
Normal file
@@ -0,0 +1,81 @@
|
||||
import { getOwner } from '@ember/application';
|
||||
import { scheduleOnce } from '@ember/runloop';
|
||||
import { Widget } from '@fleetbase/ember-core/contracts';
|
||||
|
||||
/**
|
||||
* Initializes the Universe by:
|
||||
* 1. Creating console-specific registries
|
||||
* 2. Registering default dashboard widgets
|
||||
* 3. Loading extension.js files from enabled extensions
|
||||
* 4. Executing boot callbacks
|
||||
*
|
||||
* This replaces the old load-extensions and initialize-widgets initializers.
|
||||
*
|
||||
* @param {ApplicationInstance} appInstance The application instance
|
||||
*/
|
||||
export function initialize(appInstance) {
|
||||
const universe = appInstance.lookup('service:universe');
|
||||
const widgetService = appInstance.lookup('service:universe/widget-service');
|
||||
const registryService = appInstance.lookup('service:universe/registry-service');
|
||||
const owner = getOwner(appInstance);
|
||||
const app = owner.application;
|
||||
|
||||
// Set application instance on universe
|
||||
universe.applicationInstance = appInstance;
|
||||
|
||||
// Create console-specific registries
|
||||
registryService.createRegistries(['@fleetbase/console', 'auth:login']);
|
||||
|
||||
// Register default dashboard widgets
|
||||
const defaultWidgets = [
|
||||
new Widget({
|
||||
widgetId: 'welcome',
|
||||
name: 'Welcome',
|
||||
description: 'Welcome widget for new users',
|
||||
icon: 'hand-wave',
|
||||
component: 'widget/welcome',
|
||||
grid_options: { w: 12, h: 6, minW: 8, minH: 6 }
|
||||
}),
|
||||
new Widget({
|
||||
widgetId: 'getting-started',
|
||||
name: 'Getting Started',
|
||||
description: 'Getting started guide',
|
||||
icon: 'rocket',
|
||||
component: 'widget/getting-started',
|
||||
grid_options: { w: 12, h: 12, minW: 8, minH: 12 }
|
||||
})
|
||||
];
|
||||
|
||||
widgetService.registerDefaultWidgets(defaultWidgets);
|
||||
widgetService.registerWidgets('dashboard', defaultWidgets);
|
||||
|
||||
// Load extension.js files from enabled extensions
|
||||
// The app.extensions array already respects config + user permissions
|
||||
const extensions = app.extensions || [];
|
||||
|
||||
extensions.forEach(extensionName => {
|
||||
try {
|
||||
// Dynamically require the extension.js file
|
||||
// This is a small file with only metadata, not the full engine bundle
|
||||
const setupExtension = require(`${extensionName}/extension`).default;
|
||||
|
||||
if (typeof setupExtension === 'function') {
|
||||
// Execute the extension setup function
|
||||
// This registers menus, widgets, hooks, etc. as metadata
|
||||
setupExtension(appInstance, universe);
|
||||
}
|
||||
} catch (error) {
|
||||
// Silently fail if extension.js doesn't exist
|
||||
// Extensions can migrate gradually to the new pattern
|
||||
// console.warn(`Could not load extension.js for ${extensionName}:`, error);
|
||||
}
|
||||
});
|
||||
|
||||
// Execute any boot callbacks
|
||||
scheduleOnce('afterRender', universe, 'executeBootCallbacks');
|
||||
}
|
||||
|
||||
export default {
|
||||
name: 'initialize-universe',
|
||||
initialize
|
||||
};
|
||||
@@ -1,36 +0,0 @@
|
||||
import { faGithub } from '@fortawesome/free-brands-svg-icons';
|
||||
|
||||
export function initialize(application) {
|
||||
const universe = application.lookup('service:universe');
|
||||
const defaultWidgets = [
|
||||
{
|
||||
widgetId: 'fleetbase-blog',
|
||||
name: 'Fleetbase Blog',
|
||||
description: 'Lists latest news and events from the Fleetbase official team.',
|
||||
icon: 'newspaper',
|
||||
component: 'fleetbase-blog',
|
||||
grid_options: { w: 8, h: 9, minW: 8, minH: 9 },
|
||||
options: {
|
||||
title: 'Fleetbase Blog',
|
||||
},
|
||||
},
|
||||
{
|
||||
widgetId: 'fleetbase-github-card',
|
||||
name: 'Github Card',
|
||||
description: 'Displays current Github stats from the official Fleetbase repo.',
|
||||
icon: faGithub,
|
||||
component: 'github-card',
|
||||
grid_options: { w: 4, h: 8, minW: 4, minH: 8 },
|
||||
options: {
|
||||
title: 'Github Card',
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
universe.registerDefaultDashboardWidgets(defaultWidgets);
|
||||
universe.registerDashboardWidgets(defaultWidgets);
|
||||
}
|
||||
|
||||
export default {
|
||||
initialize,
|
||||
};
|
||||
@@ -1,11 +0,0 @@
|
||||
export function initialize(application) {
|
||||
const universe = application.lookup('service:universe');
|
||||
if (universe) {
|
||||
universe.createRegistries(['@fleetbase/console', 'auth:login']);
|
||||
universe.bootEngines(application);
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
initialize,
|
||||
};
|
||||
@@ -90,9 +90,9 @@ export default class DashboardModel extends Model {
|
||||
|
||||
getRegistry() {
|
||||
const owner = getOwner(this);
|
||||
const universe = owner.lookup('service:universe');
|
||||
if (universe) {
|
||||
return universe.getDashboardRegistry(this.id);
|
||||
const widgetService = owner.lookup('service:universe/widget-service');
|
||||
if (widgetService) {
|
||||
return widgetService.getRegistry(this.id);
|
||||
}
|
||||
|
||||
return undefined;
|
||||
|
||||
18
console/app/models/schedule-availability.js
Normal file
18
console/app/models/schedule-availability.js
Normal file
@@ -0,0 +1,18 @@
|
||||
import Model, { attr } from '@ember-data/model';
|
||||
|
||||
export default class ScheduleAvailabilityModel extends Model {
|
||||
@attr('string') subject_uuid;
|
||||
@attr('string') subject_type;
|
||||
@attr('date') start_at;
|
||||
@attr('date') end_at;
|
||||
@attr('boolean', { defaultValue: true }) is_available;
|
||||
@attr('number') preference_level;
|
||||
@attr('string') rrule;
|
||||
@attr('string') reason;
|
||||
@attr('string') notes;
|
||||
@attr('object') meta;
|
||||
|
||||
@attr('date') created_at;
|
||||
@attr('date') updated_at;
|
||||
@attr('date') deleted_at;
|
||||
}
|
||||
23
console/app/models/schedule-constraint.js
Normal file
23
console/app/models/schedule-constraint.js
Normal file
@@ -0,0 +1,23 @@
|
||||
import Model, { attr, belongsTo } from '@ember-data/model';
|
||||
|
||||
export default class ScheduleConstraintModel extends Model {
|
||||
@attr('string') company_uuid;
|
||||
@attr('string') subject_uuid;
|
||||
@attr('string') subject_type;
|
||||
@attr('string') name;
|
||||
@attr('string') description;
|
||||
@attr('string') type;
|
||||
@attr('string') category;
|
||||
@attr('string') constraint_key;
|
||||
@attr('string') constraint_value;
|
||||
@attr('string') jurisdiction;
|
||||
@attr('number', { defaultValue: 0 }) priority;
|
||||
@attr('boolean', { defaultValue: true }) is_active;
|
||||
@attr('object') meta;
|
||||
|
||||
@belongsTo('company') company;
|
||||
|
||||
@attr('date') created_at;
|
||||
@attr('date') updated_at;
|
||||
@attr('date') deleted_at;
|
||||
}
|
||||
23
console/app/models/schedule-item.js
Normal file
23
console/app/models/schedule-item.js
Normal file
@@ -0,0 +1,23 @@
|
||||
import Model, { attr, belongsTo } from '@ember-data/model';
|
||||
|
||||
export default class ScheduleItemModel extends Model {
|
||||
@attr('string') public_id;
|
||||
@attr('string') schedule_uuid;
|
||||
@attr('string') assignee_uuid;
|
||||
@attr('string') assignee_type;
|
||||
@attr('string') resource_uuid;
|
||||
@attr('string') resource_type;
|
||||
@attr('date') start_at;
|
||||
@attr('date') end_at;
|
||||
@attr('number') duration;
|
||||
@attr('date') break_start_at;
|
||||
@attr('date') break_end_at;
|
||||
@attr('string', { defaultValue: 'pending' }) status;
|
||||
@attr('object') meta;
|
||||
|
||||
@belongsTo('schedule') schedule;
|
||||
|
||||
@attr('date') created_at;
|
||||
@attr('date') updated_at;
|
||||
@attr('date') deleted_at;
|
||||
}
|
||||
22
console/app/models/schedule-template.js
Normal file
22
console/app/models/schedule-template.js
Normal file
@@ -0,0 +1,22 @@
|
||||
import Model, { attr, belongsTo } from '@ember-data/model';
|
||||
|
||||
export default class ScheduleTemplateModel extends Model {
|
||||
@attr('string') public_id;
|
||||
@attr('string') company_uuid;
|
||||
@attr('string') subject_uuid;
|
||||
@attr('string') subject_type;
|
||||
@attr('string') name;
|
||||
@attr('string') description;
|
||||
@attr('string') start_time;
|
||||
@attr('string') end_time;
|
||||
@attr('number') duration;
|
||||
@attr('number') break_duration;
|
||||
@attr('string') rrule;
|
||||
@attr('object') meta;
|
||||
|
||||
@belongsTo('company') company;
|
||||
|
||||
@attr('date') created_at;
|
||||
@attr('date') updated_at;
|
||||
@attr('date') deleted_at;
|
||||
}
|
||||
27
console/app/models/schedule.js
Normal file
27
console/app/models/schedule.js
Normal file
@@ -0,0 +1,27 @@
|
||||
import Model, { attr, hasMany, belongsTo } from '@ember-data/model';
|
||||
|
||||
export default class ScheduleModel extends Model {
|
||||
/** @ids */
|
||||
@attr('string') public_id;
|
||||
@attr('string') company_uuid;
|
||||
@attr('string') subject_uuid;
|
||||
@attr('string') subject_type;
|
||||
|
||||
/** @attributes */
|
||||
@attr('string') name;
|
||||
@attr('string') description;
|
||||
@attr('date') start_date;
|
||||
@attr('date') end_date;
|
||||
@attr('string') timezone;
|
||||
@attr('string', { defaultValue: 'draft' }) status;
|
||||
@attr('object') meta;
|
||||
|
||||
/** @relationships */
|
||||
@hasMany('schedule-item') items;
|
||||
@belongsTo('company') company;
|
||||
|
||||
/** @dates */
|
||||
@attr('date') created_at;
|
||||
@attr('date') updated_at;
|
||||
@attr('date') deleted_at;
|
||||
}
|
||||
@@ -15,7 +15,8 @@ export default class ApplicationRoute extends Route {
|
||||
@service intl;
|
||||
@service currentUser;
|
||||
@service router;
|
||||
@service universe;
|
||||
@service('universe/hook-service') hookService;
|
||||
@service('universe/extension-manager') extensionManager;
|
||||
@tracked defaultTheme;
|
||||
|
||||
/**
|
||||
@@ -24,7 +25,7 @@ export default class ApplicationRoute extends Route {
|
||||
* @memberof ApplicationRoute
|
||||
*/
|
||||
@action willTransition(transition) {
|
||||
this.universe.callHooks('application:will-transition', this.session, this.router, transition);
|
||||
this.hookService.execute('application:will-transition', this.session, this.router, transition);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -45,7 +46,7 @@ export default class ApplicationRoute extends Route {
|
||||
* @memberof ApplicationRoute
|
||||
*/
|
||||
@action loading(transition) {
|
||||
this.universe.callHooks('application:loading', this.session, this.router, transition);
|
||||
this.hookService.execute('application:loading', this.session, this.router, transition);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -79,9 +80,9 @@ export default class ApplicationRoute extends Route {
|
||||
*/
|
||||
async beforeModel(transition) {
|
||||
await this.session.setup();
|
||||
await this.universe.booting();
|
||||
await this.extensionManager.waitForBoot();
|
||||
|
||||
this.universe.callHooks('application:before-model', this.session, this.router, transition);
|
||||
this.hookService.execute('application:before-model', this.session, this.router, transition);
|
||||
|
||||
const shift = this.urlSearchParams.get('shift');
|
||||
if (this.session.isAuthenticated && shift) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@fleetbase/console",
|
||||
"version": "0.7.18",
|
||||
"version": "0.7.19",
|
||||
"private": true,
|
||||
"description": "Modular logistics and supply chain operating system (LSOS)",
|
||||
"repository": "https://github.com/fleetbase/fleetbase",
|
||||
@@ -29,18 +29,15 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@ember/legacy-built-in-components": "^0.4.2",
|
||||
"@fleetbase/billing-engine": "link:../packages/billing",
|
||||
"@fleetbase/dev-engine": "^0.2.10",
|
||||
"@fleetbase/ember-core": "latest",
|
||||
"@fleetbase/ember-ui": "^0.3.9",
|
||||
"@fleetbase/fleetops-data": "latest",
|
||||
"@fleetbase/fleetops-engine": "link:../packages/fleetops",
|
||||
"@fleetbase/fliit-engine": "link:../packages/fliit",
|
||||
"@fleetbase/ember-ui": "^0.3.11",
|
||||
"@fleetbase/fleetops-data": "^0.1.23",
|
||||
"@fleetbase/fleetops-engine": "^0.6.26",
|
||||
"@fleetbase/iam-engine": "^0.1.4",
|
||||
"@fleetbase/internals-engine": "link:../packages/internals",
|
||||
"@fleetbase/leaflet-routing-machine": "^3.2.17",
|
||||
"@fleetbase/registry-bridge-engine": "^0.1.0",
|
||||
"@fleetbase/storefront-engine": "link:../packages/storefront",
|
||||
"@fleetbase/storefront-engine": "^0.4.7",
|
||||
"@formatjs/intl-datetimeformat": "^6.18.2",
|
||||
"@formatjs/intl-numberformat": "^8.15.6",
|
||||
"@formatjs/intl-pluralrules": "^5.4.6",
|
||||
|
||||
2251
console/pnpm-lock.yaml
generated
2251
console/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -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.18
|
||||
ENV FLEETBASE_VERSION=0.7.19
|
||||
|
||||
# Set environment
|
||||
ARG ENVIRONMENT=production
|
||||
|
||||
Submodule packages/core-api updated: 075d33388c...36cf81ed51
Submodule packages/ember-ui updated: cb43182a11...33b06980eb
Submodule packages/fleetops updated: 91f84efedc...7c02311897
Submodule packages/fleetops-data updated: 2fd746efe7...f20408d663
Submodule packages/storefront updated: 3370c298ab...d6226e89b0
Reference in New Issue
Block a user