@fleetbase/fleetops-engine 0.6.52 → 0.6.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/addon/components/layout/fleet-ops-sidebar/operations-monitor.hbs +201 -0
- package/addon/components/layout/fleet-ops-sidebar/operations-monitor.js +589 -0
- package/addon/components/layout/fleet-ops-sidebar.hbs +19 -233
- package/addon/components/layout/fleet-ops-sidebar.js +287 -394
- package/addon/components/maintenance-schedule/form.js +1 -0
- package/addon/components/order/form/payload.js +3 -1
- package/addon/controllers/connectivity/devices/index.js +4 -1
- package/addon/controllers/maintenance/index.js +100 -0
- package/addon/controllers/management/fuel-transactions/index.js +1 -1
- package/addon/controllers/management/index.js +88 -0
- package/addon/controllers/settings/index.js +142 -0
- package/addon/extension.js +21 -0
- package/addon/routes/analytics/index.js +3 -0
- package/addon/routes/connectivity/devices/index.js +3 -0
- package/addon/routes/maintenance/index.js +3 -0
- package/addon/routes/maintenance/work-orders/index.js +2 -0
- package/addon/routes/settings/index.js +3 -0
- package/addon/styles/fleetops-engine.css +1801 -2
- package/addon/templates/analytics/index.hbs +14 -0
- package/addon/templates/analytics/reports/index.hbs +4 -4
- package/addon/templates/maintenance/index.hbs +113 -0
- package/addon/templates/management/fuel-transactions/index/details.hbs +1 -1
- package/addon/templates/management/index.hbs +109 -73
- package/addon/templates/operations/orders/index.hbs +1 -1
- package/addon/templates/operations/service-rates/index.hbs +1 -1
- package/addon/templates/settings/index.hbs +83 -0
- package/addon/templates/settings/routing.hbs +2 -2
- package/app/controllers/maintenance/index.js +1 -0
- package/app/controllers/management/index.js +1 -0
- package/app/controllers/settings/index.js +1 -0
- package/app/routes/analytics/index.js +1 -0
- package/app/routes/maintenance/index.js +1 -0
- package/app/routes/settings/index.js +1 -0
- package/app/templates/analytics/index.js +1 -0
- package/app/templates/maintenance/index.js +1 -0
- package/app/templates/management/index.js +1 -0
- package/app/templates/settings/index.js +1 -0
- package/composer.json +1 -1
- package/extension.json +1 -1
- package/package.json +3 -3
- package/server/migrations/2026_06_15_000001_normalize_device_attachable_vehicle_morph_types.php +30 -0
- package/server/src/Console/Commands/FixInvalidPolymorphicRelationTypeNamespaces.php +1 -0
- package/server/src/Http/Controllers/Internal/v1/DeviceController.php +75 -11
- package/server/src/Http/Controllers/Internal/v1/HubController.php +300 -0
- package/server/src/Http/Controllers/Internal/v1/SearchController.php +506 -0
- package/server/src/Http/Controllers/Internal/v1/TelematicController.php +1 -1
- package/server/src/Http/Controllers/Internal/v1/VehicleController.php +94 -10
- package/server/src/Http/Filter/DeviceFilter.php +74 -0
- package/server/src/Http/Filter/DriverFilter.php +6 -0
- package/server/src/Http/Filter/VehicleFilter.php +6 -0
- package/server/src/Jobs/SyncTelematicDevicesJob.php +82 -24
- package/server/src/Models/Device.php +1 -1
- package/server/src/Models/Driver.php +1 -1
- package/server/src/Providers/FleetOpsServiceProvider.php +10 -0
- package/server/src/Support/Telematics/Providers/AfaqyProvider.php +51 -13
- package/server/src/routes.php +9 -0
- package/server/tests/HubRoutesTest.php +62 -0
- package/server/tests/TelematicsHardeningTest.php +94 -3
- package/translations/ar-ae.yml +1 -1
- package/translations/vi-vn.yaml +1 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<Layout::Section::Body class="overflow-y-scroll h-full" data-test-fleet-ops-analytics-hub>
|
|
2
|
+
<Dashboard
|
|
3
|
+
@defaultDashboardId="fleet-ops"
|
|
4
|
+
@defaultDashboardName="Fleet-Ops Dashboard"
|
|
5
|
+
@extension="fleet-ops"
|
|
6
|
+
@leftHeaderWrapperClass="fleet-ops-dashboard-title"
|
|
7
|
+
@rightHeaderWrapperClass="fleet-ops-dashboard-actions"
|
|
8
|
+
@createWrapperClass="fleet-ops-dashboard-create-wrapper"
|
|
9
|
+
@stickyHeader={{true}}
|
|
10
|
+
class="fleet-ops-dashboard-page"
|
|
11
|
+
/>
|
|
12
|
+
<Spacer @height="300px" />
|
|
13
|
+
{{outlet}}
|
|
14
|
+
</Layout::Section::Body>
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"table/empty-state"
|
|
16
16
|
icon="chart-line"
|
|
17
17
|
title="No reports yet"
|
|
18
|
-
description="Create a
|
|
18
|
+
description="Create a Fleet-Ops report to start tracking operational trends, utilization, and performance over time."
|
|
19
19
|
filteredTitle="No reports match your search"
|
|
20
20
|
filteredDescription="Adjust the search or filters to find an existing report."
|
|
21
21
|
primaryText="New report"
|
|
@@ -24,9 +24,9 @@
|
|
|
24
24
|
secondaryText="Refresh"
|
|
25
25
|
secondaryIcon="refresh"
|
|
26
26
|
secondaryAction=this.reportActions.refresh
|
|
27
|
-
docsSlug="fleet-ops/analytics/overview"
|
|
28
|
-
docsTitle="
|
|
29
|
-
docsText="
|
|
27
|
+
docsSlug="fleet-ops/analytics/reports/overview"
|
|
28
|
+
docsTitle="Reports guide"
|
|
29
|
+
docsText="Reports guide"
|
|
30
30
|
docsSource="fleet-ops-empty-reports"
|
|
31
31
|
}}
|
|
32
32
|
/>
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
<div class="fleet-ops-control-hub" data-test-fleet-ops-maintenance-hub>
|
|
2
|
+
<section class="fleet-ops-control-hub-header">
|
|
3
|
+
<div class="fleet-ops-control-hub-header-copy">
|
|
4
|
+
<div class="fleet-ops-control-hub-eyebrow">Maintenance</div>
|
|
5
|
+
<h1 class="fleet-ops-control-hub-title">Maintenance Hub</h1>
|
|
6
|
+
<p class="fleet-ops-control-hub-subtitle">Plan recurring service, coordinate work orders, and keep assets ready for daily operations.</p>
|
|
7
|
+
</div>
|
|
8
|
+
<div class="fleet-ops-control-hub-header-actions">
|
|
9
|
+
<Button @icon="refresh" @size="sm" @helpText={{t "common.reload"}} @onClick={{perform this.loadHub}} />
|
|
10
|
+
</div>
|
|
11
|
+
</section>
|
|
12
|
+
|
|
13
|
+
<div class="fleet-ops-control-hub-body">
|
|
14
|
+
<section class="fleet-ops-control-hub-kpis">
|
|
15
|
+
{{#each this.kpis as |kpi|}}
|
|
16
|
+
<LinkTo @route={{kpi.route}} class="fleet-ops-control-hub-kpi fleet-ops-control-hub-tone-{{kpi.tone}}" data-test-fleet-ops-maintenance-kpi={{kpi.key}}>
|
|
17
|
+
<div class="fleet-ops-control-hub-kpi-copy">
|
|
18
|
+
<div class="fleet-ops-control-hub-kpi-label">{{kpi.label}}</div>
|
|
19
|
+
<div class="fleet-ops-control-hub-kpi-value">{{kpi.value}}</div>
|
|
20
|
+
<div class="fleet-ops-control-hub-kpi-caption">{{kpi.caption}}</div>
|
|
21
|
+
<div class="fleet-ops-control-hub-kpi-action">
|
|
22
|
+
<span>Open {{kpi.label}}</span>
|
|
23
|
+
<FaIcon @icon="arrow-right" />
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="fleet-ops-control-hub-kpi-icon"><FaIcon @icon={{kpi.icon}} /></div>
|
|
27
|
+
</LinkTo>
|
|
28
|
+
{{/each}}
|
|
29
|
+
</section>
|
|
30
|
+
|
|
31
|
+
<section class="fleet-ops-control-hub-grid">
|
|
32
|
+
<div class="fleet-ops-control-hub-main">
|
|
33
|
+
{{#each this.sections as |section|}}
|
|
34
|
+
<div class="fleet-ops-control-hub-panel" data-test-fleet-ops-maintenance-section={{section.key}}>
|
|
35
|
+
<div class="fleet-ops-control-hub-panel-header">
|
|
36
|
+
<div>
|
|
37
|
+
<h2>{{section.title}}</h2>
|
|
38
|
+
<p>{{section.description}}</p>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<div class="fleet-ops-control-hub-link-grid">
|
|
43
|
+
{{#each section.links as |link|}}
|
|
44
|
+
<LinkTo @route={{link.route}} class="fleet-ops-control-hub-link" data-test-fleet-ops-hub-card={{link.label}}>
|
|
45
|
+
<span class="fleet-ops-control-hub-link-icon"><FaIcon @icon={{link.icon}} /></span>
|
|
46
|
+
<span class="fleet-ops-control-hub-link-copy">
|
|
47
|
+
<span class="fleet-ops-control-hub-link-title">{{link.label}}</span>
|
|
48
|
+
<span class="fleet-ops-control-hub-link-description">{{link.description}}</span>
|
|
49
|
+
</span>
|
|
50
|
+
<span class="fleet-ops-control-hub-link-count">{{link.count}}</span>
|
|
51
|
+
</LinkTo>
|
|
52
|
+
{{/each}}
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
{{/each}}
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<aside class="fleet-ops-control-hub-side">
|
|
59
|
+
<div class="fleet-ops-control-hub-panel">
|
|
60
|
+
<div class="fleet-ops-control-hub-panel-header">
|
|
61
|
+
<div>
|
|
62
|
+
<h2>Action Queue</h2>
|
|
63
|
+
<p>Signals from schedules, work orders, parts, and equipment.</p>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<div class="fleet-ops-control-hub-action-list">
|
|
68
|
+
{{#each this.actions as |action|}}
|
|
69
|
+
{{#if action.route}}
|
|
70
|
+
<LinkTo @route={{action.route}} @query={{action.query}} class="fleet-ops-control-hub-action fleet-ops-control-hub-tone-{{action.tone}}">
|
|
71
|
+
<FaIcon @icon={{action.icon}} />
|
|
72
|
+
<span>
|
|
73
|
+
<strong>{{action.label}}</strong>
|
|
74
|
+
<small>{{action.description}}</small>
|
|
75
|
+
</span>
|
|
76
|
+
</LinkTo>
|
|
77
|
+
{{else}}
|
|
78
|
+
<div class="fleet-ops-control-hub-action fleet-ops-control-hub-tone-{{action.tone}}">
|
|
79
|
+
<FaIcon @icon={{action.icon}} />
|
|
80
|
+
<span>
|
|
81
|
+
<strong>{{action.label}}</strong>
|
|
82
|
+
<small>{{action.description}}</small>
|
|
83
|
+
</span>
|
|
84
|
+
</div>
|
|
85
|
+
{{/if}}
|
|
86
|
+
{{/each}}
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
|
|
90
|
+
<div class="fleet-ops-control-hub-doc-note">
|
|
91
|
+
<div class="fleet-ops-control-hub-doc-note-heading">
|
|
92
|
+
<FaIcon @icon="lightbulb" />
|
|
93
|
+
<span>Guides</span>
|
|
94
|
+
</div>
|
|
95
|
+
<p class="fleet-ops-control-hub-doc-note-copy">Read the guide before changing maintenance workflows.</p>
|
|
96
|
+
<div class="fleet-ops-control-hub-doc-grid">
|
|
97
|
+
{{#each this.docs as |doc|}}
|
|
98
|
+
<button type="button" class="fleet-ops-control-hub-doc-link" {{on "click" (fn this.openDocs doc)}}>
|
|
99
|
+
<FaIcon @icon={{doc.icon}} />
|
|
100
|
+
<span class="fleet-ops-control-hub-doc-copy">
|
|
101
|
+
<strong>Read the guide on {{doc.label}}</strong>
|
|
102
|
+
<small>{{doc.description}}</small>
|
|
103
|
+
</span>
|
|
104
|
+
</button>
|
|
105
|
+
{{/each}}
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</aside>
|
|
109
|
+
</section>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
{{outlet}}
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
<aside class="space-y-4">
|
|
47
47
|
<section class="rounded-md border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-700 dark:bg-gray-800">
|
|
48
48
|
<h2 class="text-sm font-bold text-gray-900 dark:text-gray-100">Manual Match</h2>
|
|
49
|
-
<p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">Use a
|
|
49
|
+
<p class="mt-1 text-xs leading-5 text-gray-500 dark:text-gray-300">Use a Fleet-Ops UUID or public ID when automatic matching cannot identify the vehicle or order.</p>
|
|
50
50
|
<div class="mt-3 space-y-3 no-input-group-padding">
|
|
51
51
|
<InputGroup @name="Vehicle ID">
|
|
52
52
|
<Input class="form-input w-full" @value={{this.vehicleId}} {{on "input" this.setVehicleId}} />
|
|
@@ -1,77 +1,113 @@
|
|
|
1
|
-
<div class="
|
|
2
|
-
<
|
|
3
|
-
<div class="
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
>
|
|
8
|
-
<p class="font-semibold text-lg mb-1 text-black group-hover:text-white">{{t "fleet-ops.management.vendors.index.title"}}</p>
|
|
9
|
-
<p class="text-grey-darker group-hover:text-white mb-2">{{t "fleet-ops.common.manage-message"}}</p>
|
|
10
|
-
</LinkTo>
|
|
1
|
+
<div class="fleet-ops-control-hub" data-test-fleet-ops-resources-hub>
|
|
2
|
+
<section class="fleet-ops-control-hub-header">
|
|
3
|
+
<div class="fleet-ops-control-hub-header-copy">
|
|
4
|
+
<div class="fleet-ops-control-hub-eyebrow">Resources</div>
|
|
5
|
+
<h1 class="fleet-ops-control-hub-title">Resources Hub</h1>
|
|
6
|
+
<p class="fleet-ops-control-hub-subtitle">Manage the people, vehicles, places, partners, and operating records that keep dispatch grounded.</p>
|
|
11
7
|
</div>
|
|
12
|
-
<div class="
|
|
13
|
-
<
|
|
14
|
-
@route="dashboard.fleet-ops.management.fleets"
|
|
15
|
-
class="group hover:bg-flb-blue p-4 cursor-pointer bg-white rounded max-w-xs w-full shadow-lg select-none overflow-hidden mx-auto mb-6"
|
|
16
|
-
>
|
|
17
|
-
<p class="font-semibold text-lg mb-1 text-black group-hover:text-white">{{t "fleet-ops.management.fleets.index.title"}}</p>
|
|
18
|
-
<p class="text-grey-darker group-hover:text-white mb-2">{{t "fleet-ops.common.manage-message"}}</p>
|
|
19
|
-
</LinkTo>
|
|
20
|
-
</div>
|
|
21
|
-
<div class="col-12 col-lg-3 col-xl-3">
|
|
22
|
-
<LinkTo
|
|
23
|
-
@route="dashboard.fleet-ops.management.drivers"
|
|
24
|
-
class="group hover:bg-flb-blue p-4 cursor-pointer bg-white rounded max-w-xs w-full shadow-lg select-none overflow-hidden mx-auto mb-6"
|
|
25
|
-
>
|
|
26
|
-
<p class="font-semibold text-lg mb-1 text-black group-hover:text-white">{{t "fleet-ops.management.drivers.index.title"}}</p>
|
|
27
|
-
<p class="text-grey-darker group-hover:text-white mb-2">{{t "fleet-ops.common.manage-message"}}</p>
|
|
28
|
-
</LinkTo>
|
|
29
|
-
</div>
|
|
30
|
-
<div class="col-12 col-lg-3 col-xl-3">
|
|
31
|
-
<LinkTo
|
|
32
|
-
@route="dashboard.fleet-ops.management.vehicles"
|
|
33
|
-
class="group hover:bg-flb-blue p-4 cursor-pointer bg-white rounded max-w-xs w-full shadow-lg select-none overflow-hidden mx-auto mb-6"
|
|
34
|
-
>
|
|
35
|
-
<p class="font-semibold text-lg mb-1 text-black group-hover:text-white">{{t "fleet-ops.management.vehicles.index.title"}}</p>
|
|
36
|
-
<p class="text-grey-darker group-hover:text-white mb-2">{{t "fleet-ops.common.manage-message"}}</p>
|
|
37
|
-
</LinkTo>
|
|
38
|
-
</div>
|
|
39
|
-
<div class="col-12 col-lg-3 col-xl-3">
|
|
40
|
-
<LinkTo
|
|
41
|
-
@route="dashboard.fleet-ops.management.places"
|
|
42
|
-
class="group hover:bg-flb-blue p-4 cursor-pointer bg-white rounded max-w-xs w-full shadow-lg select-none overflow-hidden mx-auto mb-6"
|
|
43
|
-
>
|
|
44
|
-
<p class="font-semibold text-lg mb-1 text-black group-hover:text-white">{{t "fleet-ops.management.places.index.title"}}</p>
|
|
45
|
-
<p class="text-grey-darker group-hover:text-white mb-2">{{t "fleet-ops.common.manage-message"}}</p>
|
|
46
|
-
</LinkTo>
|
|
47
|
-
</div>
|
|
48
|
-
<div class="col-12 col-lg-3 col-xl-3">
|
|
49
|
-
<LinkTo
|
|
50
|
-
@route="dashboard.fleet-ops.management.contacts."
|
|
51
|
-
class="group hover:bg-flb-blue p-4 cursor-pointer bg-white rounded max-w-xs w-full shadow-lg select-none overflow-hidden mx-auto mb-6"
|
|
52
|
-
>
|
|
53
|
-
<p class="font-semibold text-lg mb-1 text-black group-hover:text-white">{{t "fleet-ops.management.contacts.index.title"}}</p>
|
|
54
|
-
<p class="text-grey-darker group-hover:text-white mb-2">{{t "fleet-ops.common.manage-message"}}</p>
|
|
55
|
-
</LinkTo>
|
|
56
|
-
</div>
|
|
57
|
-
<div class="col-12 col-lg-3 col-xl-3">
|
|
58
|
-
<LinkTo
|
|
59
|
-
@route="dashboard.fleet-ops.management.issues"
|
|
60
|
-
class="group hover:bg-flb-blue p-4 cursor-pointer bg-white rounded max-w-xs w-full shadow-lg select-none overflow-hidden mx-auto mb-6"
|
|
61
|
-
>
|
|
62
|
-
<p class="font-semibold text-lg mb-1 text-black group-hover:text-white">{{t "fleet-ops.management.issues.index.title"}}</p>
|
|
63
|
-
<p class="text-grey-darker group-hover:text-white mb-2">{{t "fleet-ops.common.manage-message"}}</p>
|
|
64
|
-
</LinkTo>
|
|
65
|
-
</div>
|
|
66
|
-
<div class="col-12 col-lg-3 col-xl-3">
|
|
67
|
-
<LinkTo
|
|
68
|
-
@route="dashboard.fleet-ops.management.fuel-reports"
|
|
69
|
-
class="group hover:bg-flb-blue p-4 cursor-pointer bg-white rounded max-w-xs w-full shadow-lg select-none overflow-hidden mx-auto mb-6"
|
|
70
|
-
>
|
|
71
|
-
<p class="font-semibold text-lg mb-1 text-black group-hover:text-white">{{t "fleet-ops.management.fuel-reports.index.title"}}</p>
|
|
72
|
-
<p class="text-grey-darker group-hover:text-white mb-2">{{t "fleet-ops.common.manage-message"}}</p>
|
|
73
|
-
</LinkTo>
|
|
8
|
+
<div class="fleet-ops-control-hub-header-actions">
|
|
9
|
+
<Button @icon="refresh" @size="sm" @helpText={{t "common.reload"}} @onClick={{perform this.loadHub}} />
|
|
74
10
|
</div>
|
|
11
|
+
</section>
|
|
12
|
+
|
|
13
|
+
<div class="fleet-ops-control-hub-body">
|
|
14
|
+
<section class="fleet-ops-control-hub-kpis">
|
|
15
|
+
{{#each this.kpis as |kpi|}}
|
|
16
|
+
<LinkTo @route={{kpi.route}} class="fleet-ops-control-hub-kpi fleet-ops-control-hub-tone-{{kpi.tone}}" data-test-fleet-ops-resources-kpi={{kpi.key}}>
|
|
17
|
+
<div class="fleet-ops-control-hub-kpi-copy">
|
|
18
|
+
<div class="fleet-ops-control-hub-kpi-label">{{kpi.label}}</div>
|
|
19
|
+
<div class="fleet-ops-control-hub-kpi-value">{{kpi.value}}</div>
|
|
20
|
+
<div class="fleet-ops-control-hub-kpi-caption">{{kpi.caption}}</div>
|
|
21
|
+
<div class="fleet-ops-control-hub-kpi-action">
|
|
22
|
+
<span>{{kpi.actionLabel}}</span>
|
|
23
|
+
<FaIcon @icon="arrow-right" />
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="fleet-ops-control-hub-kpi-icon"><FaIcon @icon={{kpi.icon}} /></div>
|
|
27
|
+
</LinkTo>
|
|
28
|
+
{{/each}}
|
|
29
|
+
</section>
|
|
30
|
+
|
|
31
|
+
<section class="fleet-ops-control-hub-grid">
|
|
32
|
+
<div class="fleet-ops-control-hub-main">
|
|
33
|
+
{{#each this.sections as |section|}}
|
|
34
|
+
<div class="fleet-ops-control-hub-panel" data-test-fleet-ops-resources-section={{section.key}}>
|
|
35
|
+
<div class="fleet-ops-control-hub-panel-header">
|
|
36
|
+
<div>
|
|
37
|
+
<h2>{{section.title}}</h2>
|
|
38
|
+
<p>{{section.description}}</p>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<div class="fleet-ops-control-hub-link-grid">
|
|
43
|
+
{{#each section.links as |link|}}
|
|
44
|
+
<LinkTo @route={{link.route}} class="fleet-ops-control-hub-link" data-test-fleet-ops-hub-card={{link.label}}>
|
|
45
|
+
<span class="fleet-ops-control-hub-link-icon"><FaIcon @icon={{link.icon}} /></span>
|
|
46
|
+
<span class="fleet-ops-control-hub-link-copy">
|
|
47
|
+
<span class="fleet-ops-control-hub-link-title">{{link.label}}</span>
|
|
48
|
+
<span class="fleet-ops-control-hub-link-description">{{link.description}}</span>
|
|
49
|
+
</span>
|
|
50
|
+
<span class="fleet-ops-control-hub-link-count">{{link.count}}</span>
|
|
51
|
+
</LinkTo>
|
|
52
|
+
{{/each}}
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
{{/each}}
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<aside class="fleet-ops-control-hub-side">
|
|
59
|
+
<div class="fleet-ops-control-hub-panel">
|
|
60
|
+
<div class="fleet-ops-control-hub-panel-header">
|
|
61
|
+
<div>
|
|
62
|
+
<h2>Action Queue</h2>
|
|
63
|
+
<p>Prioritized from current resource readiness.</p>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<div class="fleet-ops-control-hub-action-list">
|
|
68
|
+
{{#each this.actions as |action|}}
|
|
69
|
+
{{#if action.route}}
|
|
70
|
+
<LinkTo @route={{action.route}} @query={{action.query}} class="fleet-ops-control-hub-action fleet-ops-control-hub-tone-{{action.tone}}">
|
|
71
|
+
<FaIcon @icon={{action.icon}} />
|
|
72
|
+
<span>
|
|
73
|
+
<strong>{{action.label}}</strong>
|
|
74
|
+
<small>{{action.description}}</small>
|
|
75
|
+
</span>
|
|
76
|
+
</LinkTo>
|
|
77
|
+
{{else}}
|
|
78
|
+
<div class="fleet-ops-control-hub-action fleet-ops-control-hub-tone-{{action.tone}}">
|
|
79
|
+
<FaIcon @icon={{action.icon}} />
|
|
80
|
+
<span>
|
|
81
|
+
<strong>{{action.label}}</strong>
|
|
82
|
+
<small>{{action.description}}</small>
|
|
83
|
+
</span>
|
|
84
|
+
</div>
|
|
85
|
+
{{/if}}
|
|
86
|
+
{{/each}}
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
|
|
90
|
+
<div class="fleet-ops-control-hub-doc-note">
|
|
91
|
+
<div class="fleet-ops-control-hub-doc-note-heading">
|
|
92
|
+
<FaIcon @icon="lightbulb" />
|
|
93
|
+
<span>Guides</span>
|
|
94
|
+
</div>
|
|
95
|
+
<p class="fleet-ops-control-hub-doc-note-copy">Read the guide before changing resource setup.</p>
|
|
96
|
+
<div class="fleet-ops-control-hub-doc-grid">
|
|
97
|
+
{{#each this.docs as |doc|}}
|
|
98
|
+
<button type="button" class="fleet-ops-control-hub-doc-link" {{on "click" (fn this.openDocs doc)}}>
|
|
99
|
+
<FaIcon @icon={{doc.icon}} />
|
|
100
|
+
<span class="fleet-ops-control-hub-doc-copy">
|
|
101
|
+
<strong>Read the guide on {{doc.label}}</strong>
|
|
102
|
+
<small>{{doc.description}}</small>
|
|
103
|
+
</span>
|
|
104
|
+
</button>
|
|
105
|
+
{{/each}}
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</aside>
|
|
109
|
+
</section>
|
|
75
110
|
</div>
|
|
76
111
|
</div>
|
|
77
|
-
|
|
112
|
+
|
|
113
|
+
{{outlet}}
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"table/empty-state"
|
|
52
52
|
icon="paper-plane"
|
|
53
53
|
title="Create your first order"
|
|
54
|
-
description="Orders are the center of
|
|
54
|
+
description="Orders are the center of Fleet-Ops: plan routes, assign drivers and vehicles, track progress, and collect proof."
|
|
55
55
|
filteredTitle="No orders match your filters"
|
|
56
56
|
filteredDescription="Adjust the search, bulk search, or filters to find another order."
|
|
57
57
|
primaryText="New order"
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"table/empty-state"
|
|
15
15
|
icon="route"
|
|
16
16
|
title="Set up your first service rate"
|
|
17
|
-
description="Service rates define how
|
|
17
|
+
description="Service rates define how Fleet-Ops prices routes, zones, distance, and other service rules."
|
|
18
18
|
filteredTitle="No service rates match your filters"
|
|
19
19
|
filteredDescription="Adjust the search or filters to find another service rate."
|
|
20
20
|
primaryText="New service rate"
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
<div class="fleet-ops-control-hub fleet-ops-settings-control-hub" data-test-fleet-ops-settings-hub>
|
|
2
|
+
<section class="fleet-ops-control-hub-header">
|
|
3
|
+
<div class="fleet-ops-control-hub-header-copy">
|
|
4
|
+
<div class="fleet-ops-control-hub-eyebrow">Settings</div>
|
|
5
|
+
<h1 class="fleet-ops-control-hub-title">Fleet-Ops Settings</h1>
|
|
6
|
+
<p class="fleet-ops-control-hub-subtitle">Configure the operator, driver, routing, notification, and data rules that shape Fleet-Ops workflows.</p>
|
|
7
|
+
</div>
|
|
8
|
+
</section>
|
|
9
|
+
|
|
10
|
+
<div class="fleet-ops-control-hub-body">
|
|
11
|
+
<section class="fleet-ops-control-hub-grid">
|
|
12
|
+
<div class="fleet-ops-control-hub-main">
|
|
13
|
+
{{#each this.groups as |group|}}
|
|
14
|
+
<div class="fleet-ops-control-hub-panel">
|
|
15
|
+
<div class="fleet-ops-control-hub-panel-header">
|
|
16
|
+
<div>
|
|
17
|
+
<h2>{{group.title}}</h2>
|
|
18
|
+
<p>{{group.description}}</p>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
<div class="fleet-ops-control-hub-link-grid fleet-ops-control-hub-link-grid-compact">
|
|
23
|
+
{{#each group.links as |link|}}
|
|
24
|
+
<LinkTo @route={{link.route}} class="fleet-ops-control-hub-link" data-test-fleet-ops-hub-card={{link.label}}>
|
|
25
|
+
<span class="fleet-ops-control-hub-link-icon"><FaIcon @icon={{link.icon}} /></span>
|
|
26
|
+
<span class="fleet-ops-control-hub-link-copy">
|
|
27
|
+
<span class="fleet-ops-control-hub-link-title">{{link.label}}</span>
|
|
28
|
+
<span class="fleet-ops-control-hub-link-description">{{link.description}}</span>
|
|
29
|
+
</span>
|
|
30
|
+
<FaIcon @icon="arrow-right" class="fleet-ops-control-hub-link-arrow" />
|
|
31
|
+
</LinkTo>
|
|
32
|
+
{{/each}}
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
{{/each}}
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<aside class="fleet-ops-control-hub-side">
|
|
39
|
+
<div class="fleet-ops-control-hub-panel">
|
|
40
|
+
<div class="fleet-ops-control-hub-panel-header">
|
|
41
|
+
<div>
|
|
42
|
+
<h2>Setup Focus</h2>
|
|
43
|
+
<p>Compact next steps for operators.</p>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<div class="fleet-ops-control-hub-action-list">
|
|
48
|
+
{{#each this.actions as |action|}}
|
|
49
|
+
<LinkTo @route={{action.route}} class="fleet-ops-control-hub-action fleet-ops-control-hub-tone-{{action.tone}}">
|
|
50
|
+
<FaIcon @icon={{action.icon}} />
|
|
51
|
+
<span>
|
|
52
|
+
<strong>{{action.label}}</strong>
|
|
53
|
+
<small>{{action.description}}</small>
|
|
54
|
+
</span>
|
|
55
|
+
</LinkTo>
|
|
56
|
+
{{/each}}
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<div class="fleet-ops-control-hub-doc-note">
|
|
61
|
+
<div class="fleet-ops-control-hub-doc-note-heading">
|
|
62
|
+
<FaIcon @icon="lightbulb" />
|
|
63
|
+
<span>Guides</span>
|
|
64
|
+
</div>
|
|
65
|
+
<p class="fleet-ops-control-hub-doc-note-copy">Read the guide before changing settings.</p>
|
|
66
|
+
<div class="fleet-ops-control-hub-doc-grid">
|
|
67
|
+
{{#each this.docs as |doc|}}
|
|
68
|
+
<button type="button" class="fleet-ops-control-hub-doc-link" {{on "click" (fn this.openDocs doc)}}>
|
|
69
|
+
<FaIcon @icon={{doc.icon}} />
|
|
70
|
+
<span class="fleet-ops-control-hub-doc-copy">
|
|
71
|
+
<strong>Read the guide on {{doc.label}}</strong>
|
|
72
|
+
<small>{{doc.description}}</small>
|
|
73
|
+
</span>
|
|
74
|
+
</button>
|
|
75
|
+
{{/each}}
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
</aside>
|
|
79
|
+
</section>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
{{outlet}}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<Layout::Section::Header @title="
|
|
1
|
+
<Layout::Section::Header @title="Fleet-Ops Routing & Tracking">
|
|
2
2
|
<Button
|
|
3
3
|
@type="primary"
|
|
4
4
|
@size="sm"
|
|
@@ -132,4 +132,4 @@
|
|
|
132
132
|
</div>
|
|
133
133
|
<Spacer @height="600px" />
|
|
134
134
|
</div>
|
|
135
|
-
</Layout::Section::Body>
|
|
135
|
+
</Layout::Section::Body>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/controllers/maintenance/index';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/controllers/management/index';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/controllers/settings/index';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/routes/analytics/index';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/routes/maintenance/index';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/routes/settings/index';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/templates/analytics/index';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/templates/maintenance/index';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/templates/management/index';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/templates/settings/index';
|
package/composer.json
CHANGED
package/extension.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fleetbase/fleetops-engine",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.53",
|
|
4
4
|
"description": "Fleet & Transport Management Extension for Fleetbase",
|
|
5
5
|
"fleetbase": {
|
|
6
6
|
"route": "fleet-ops"
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@babel/core": "^7.23.2",
|
|
45
45
|
"@fleetbase/ember-core": "^0.3.22",
|
|
46
|
-
"@fleetbase/ember-ui": "^0.3.
|
|
47
|
-
"@fleetbase/fleetops-data": "^0.1.
|
|
46
|
+
"@fleetbase/ember-ui": "^0.3.35",
|
|
47
|
+
"@fleetbase/fleetops-data": "^0.1.38",
|
|
48
48
|
"@fleetbase/leaflet-routing-machine": "^3.2.17",
|
|
49
49
|
"@fortawesome/ember-fontawesome": "^2.0.0",
|
|
50
50
|
"@fortawesome/fontawesome-svg-core": "6.4.0",
|
package/server/migrations/2026_06_15_000001_normalize_device_attachable_vehicle_morph_types.php
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
use Fleetbase\FleetOps\Models\Vehicle;
|
|
4
|
+
use Illuminate\Database\Migrations\Migration;
|
|
5
|
+
use Illuminate\Support\Facades\DB;
|
|
6
|
+
use Illuminate\Support\Facades\Schema;
|
|
7
|
+
|
|
8
|
+
return new class extends Migration {
|
|
9
|
+
public function up(): void
|
|
10
|
+
{
|
|
11
|
+
if (!Schema::hasTable('devices') || !Schema::hasColumn('devices', 'attachable_type') || !Schema::hasColumn('devices', 'attachable_uuid')) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
DB::table('devices')
|
|
16
|
+
->whereNotNull('attachable_uuid')
|
|
17
|
+
->whereIn('attachable_type', [
|
|
18
|
+
'Fleetbase\\Models\\Vehicle',
|
|
19
|
+
'\\Fleetbase\\Models\\Vehicle',
|
|
20
|
+
])
|
|
21
|
+
->update([
|
|
22
|
+
'attachable_type' => Vehicle::class,
|
|
23
|
+
]);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public function down(): void
|
|
27
|
+
{
|
|
28
|
+
// Intentionally do not restore invalid legacy morph class names.
|
|
29
|
+
}
|
|
30
|
+
};
|
|
@@ -37,6 +37,7 @@ class FixInvalidPolymorphicRelationTypeNamespaces extends Command
|
|
|
37
37
|
['model' => \Fleetbase\FleetOps\Models\Place::class, 'columns' => ['owner_type']],
|
|
38
38
|
['model' => \Fleetbase\FleetOps\Models\Entity::class, 'columns' => ['customer_type']],
|
|
39
39
|
['model' => \Fleetbase\FleetOps\Models\PurchaseRate::class, 'columns' => ['customer_type']],
|
|
40
|
+
['model' => \Fleetbase\FleetOps\Models\Device::class, 'columns' => ['attachable_type']],
|
|
40
41
|
];
|
|
41
42
|
|
|
42
43
|
foreach ($models as $modelConfig) {
|