@fleetbase/fleetops-engine 0.6.20 → 0.6.22
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/custom-entity/form.hbs +14 -14
- package/addon/components/device/card.hbs +1 -0
- package/addon/components/device/card.js +3 -0
- package/addon/components/device/details.hbs +92 -43
- package/addon/components/device/form.hbs +108 -60
- package/addon/components/device/form.js +36 -8
- package/addon/components/device/manager.hbs +29 -0
- package/addon/components/device/manager.js +95 -0
- package/addon/components/device/panel-header.hbs +32 -0
- package/addon/components/device/panel-header.js +3 -0
- package/addon/components/device/pill.hbs +16 -0
- package/addon/components/device/pill.js +3 -0
- package/addon/components/driver/details.hbs +4 -0
- package/addon/components/driver/details.js +19 -1
- package/addon/components/driver/form.hbs +14 -3
- package/addon/components/driver/form.js +49 -47
- package/addon/components/driver/pill.hbs +17 -0
- package/addon/components/driver/pill.js +3 -0
- package/addon/components/entity/form.hbs +7 -5
- package/addon/components/layout/fleet-ops-sidebar.js +12 -12
- package/addon/components/map/drawer/device-event-listing.hbs +64 -0
- package/addon/components/map/drawer/device-event-listing.js +181 -0
- package/addon/components/map/drawer/position-listing.hbs +100 -0
- package/addon/components/map/drawer/position-listing.js +455 -0
- package/addon/components/map/drawer.js +2 -0
- package/addon/components/map/leaflet-live-map.hbs +7 -2
- package/addon/components/modals/attach-device.hbs +18 -0
- package/addon/components/modals/attach-device.js +3 -0
- package/addon/components/order/details/detail.hbs +2 -54
- package/addon/components/order/details/detail.js +1 -0
- package/addon/components/order/details/payload.hbs +6 -4
- package/addon/components/order/details/payload.js +2 -0
- package/addon/components/order/pill.hbs +34 -0
- package/addon/components/order/pill.js +3 -0
- package/addon/components/order-config-manager/custom-fields.js +1 -1
- package/addon/components/positions-replay.hbs +339 -0
- package/addon/components/positions-replay.js +409 -0
- package/addon/components/sensor/details.hbs +64 -38
- package/addon/components/sensor/form.hbs +112 -63
- package/addon/components/sensor/form.js +36 -24
- package/addon/components/sensor/panel-header.hbs +32 -0
- package/addon/components/sensor/panel-header.js +3 -0
- package/addon/components/telematic/details.hbs +40 -16
- package/addon/components/telematic/form.hbs +63 -64
- package/addon/components/telematic/form.js +73 -4
- package/addon/components/vehicle/card.hbs +2 -2
- package/addon/components/vehicle/details.hbs +4 -0
- package/addon/components/vehicle/details.js +19 -1
- package/addon/components/vehicle/form.hbs +4 -0
- package/addon/components/vehicle/pill.hbs +34 -0
- package/addon/components/vehicle/pill.js +3 -0
- package/addon/controllers/analytics/reports/index/edit.js +1 -1
- package/addon/controllers/connectivity/devices/index/details.js +22 -1
- package/addon/controllers/connectivity/devices/index/edit.js +66 -1
- package/addon/controllers/connectivity/devices/index.js +51 -9
- package/addon/controllers/connectivity/events/index.js +65 -16
- package/addon/controllers/connectivity/sensors/index/details.js +22 -1
- package/addon/controllers/connectivity/sensors/index/edit.js +66 -1
- package/addon/controllers/connectivity/sensors/index.js +66 -6
- package/addon/controllers/connectivity/telematics/index/details.js +22 -1
- package/addon/controllers/connectivity/telematics/index/edit.js +66 -1
- package/addon/controllers/connectivity/telematics/index.js +20 -11
- package/addon/controllers/management/fleets/index/details.js +26 -21
- package/addon/controllers/management/fleets/index/edit.js +9 -6
- package/addon/controllers/management/vehicles/index/details.js +26 -13
- package/addon/controllers/settings/custom-fields.js +6 -0
- package/addon/helpers/get-fleet-ops-option-label.js +11 -0
- package/addon/routes/connectivity/devices/index/details.js +27 -1
- package/addon/routes/connectivity/devices/index/edit.js +27 -1
- package/addon/routes/connectivity/sensors/index/details.js +27 -1
- package/addon/routes/connectivity/sensors/index/edit.js +27 -1
- package/addon/routes/connectivity/telematics/index/details.js +27 -1
- package/addon/routes/connectivity/telematics/index/edit.js +27 -1
- package/addon/routes/management/drivers/index/details/positions.js +3 -0
- package/addon/routes/management/vehicles/index/details/positions.js +3 -0
- package/addon/routes.js +4 -0
- package/addon/services/movement-tracker.js +81 -30
- package/addon/services/position-playback.js +486 -0
- package/addon/services/resource-metadata.js +46 -0
- package/addon/styles/fleetops-engine.css +157 -0
- package/addon/templates/connectivity/devices/index/details/index.hbs +2 -2
- package/addon/templates/connectivity/devices/index/details.hbs +15 -2
- package/addon/templates/connectivity/devices/index/edit.hbs +1 -1
- package/addon/templates/connectivity/events/index.hbs +1 -1
- package/addon/templates/connectivity/sensors/index/details/index.hbs +2 -2
- package/addon/templates/connectivity/sensors/index/details.hbs +15 -2
- package/addon/templates/connectivity/sensors/index/edit.hbs +1 -1
- package/addon/templates/connectivity/telematics/index/details/index.hbs +2 -2
- package/addon/templates/connectivity/telematics/index/details.hbs +14 -2
- package/addon/templates/connectivity/telematics/index/edit.hbs +1 -1
- package/addon/templates/management/drivers/index/details/positions.hbs +2 -0
- package/addon/templates/management/vehicles/index/details/devices.hbs +1 -2
- package/addon/templates/management/vehicles/index/details/positions.hbs +1 -0
- package/addon/utils/fleet-ops-options.js +95 -0
- package/app/components/device/card.js +1 -0
- package/app/components/device/manager.js +1 -0
- package/app/components/device/panel-header.js +1 -0
- package/app/components/device/pill.js +1 -0
- package/app/components/driver/pill.js +1 -0
- package/app/components/map/drawer/device-event-listing.js +1 -0
- package/app/components/map/drawer/position-listing.js +1 -0
- package/app/components/modals/attach-device.js +1 -0
- package/app/components/order/pill.js +1 -0
- package/app/components/positions-replay.js +1 -0
- package/app/components/sensor/panel-header.js +1 -0
- package/app/components/vehicle/pill.js +1 -0
- package/app/helpers/get-fleet-ops-option-label.js +1 -0
- package/app/routes/management/drivers/index/details/positions.js +1 -0
- package/app/routes/management/vehicles/index/details/positions.js +1 -0
- package/app/services/position-playback.js +1 -0
- package/app/services/resource-metadata.js +1 -0
- package/app/templates/management/drivers/index/details/positions.js +1 -0
- package/app/templates/management/vehicles/index/details/positions.js +1 -0
- package/composer.json +1 -1
- package/extension.json +1 -1
- package/package.json +4 -4
- package/server/config/telematics.php +111 -0
- package/server/migrations/2025_10_27_000001_add_telematics_integration_fields.php +70 -0
- package/server/migrations/2025_10_27_171322_fix_device_column_names.php +107 -0
- package/server/migrations/2025_10_27_203023_add_company_uuid_to_device_events_table.php +28 -0
- package/server/src/Console/Commands/ReplayVehicleLocations.php +225 -0
- package/server/src/Contracts/TelematicProviderDescriptor.php +72 -0
- package/server/src/Contracts/TelematicProviderInterface.php +119 -0
- package/server/src/Exceptions/TelematicProviderException.php +14 -0
- package/server/src/Exceptions/TelematicRateLimitExceededException.php +12 -0
- package/server/src/Http/Controllers/Api/v1/DriverController.php +24 -14
- package/server/src/Http/Controllers/Api/v1/VehicleController.php +27 -7
- package/server/src/Http/Controllers/Internal/v1/DeviceController.php +22 -0
- package/server/src/Http/Controllers/Internal/v1/PositionController.php +240 -0
- package/server/src/Http/Controllers/Internal/v1/SensorController.php +11 -0
- package/server/src/Http/Controllers/Internal/v1/TelematicController.php +141 -0
- package/server/src/Http/Controllers/TelematicWebhookController.php +169 -0
- package/server/src/Http/Filter/DeviceEventFilter.php +68 -0
- package/server/src/Http/Filter/PositionFilter.php +35 -0
- package/server/src/Http/Resources/v1/Position.php +44 -0
- package/server/src/Jobs/ReplayPositions.php +64 -0
- package/server/src/Jobs/SendPositionReplay.php +65 -0
- package/server/src/Jobs/SyncTelematicDevicesJob.php +106 -0
- package/server/src/Jobs/TestTelematicConnectionJob.php +102 -0
- package/server/src/Models/Asset.php +10 -8
- package/server/src/Models/Device.php +79 -12
- package/server/src/Models/DeviceEvent.php +33 -3
- package/server/src/Models/Driver.php +28 -1
- package/server/src/Models/Maintenance.php +15 -12
- package/server/src/Models/Part.php +2 -0
- package/server/src/Models/Payload.php +0 -1
- package/server/src/Models/Place.php +4 -1
- package/server/src/Models/Position.php +27 -17
- package/server/src/Models/Sensor.php +78 -13
- package/server/src/Models/Telematic.php +116 -6
- package/server/src/Models/TrackingNumber.php +3 -1
- package/server/src/Models/Vehicle.php +8 -11
- package/server/src/Models/WorkOrder.php +8 -5
- package/server/src/Providers/FleetOpsServiceProvider.php +2 -0
- package/server/src/Support/Telematics/Providers/AbstractProvider.php +151 -0
- package/server/src/Support/Telematics/Providers/FlespiProvider.php +182 -0
- package/server/src/Support/Telematics/Providers/GeotabProvider.php +181 -0
- package/server/src/Support/Telematics/Providers/SamsaraProvider.php +177 -0
- package/server/src/Support/Telematics/TelematicProviderRegistry.php +147 -0
- package/server/src/Support/Telematics/TelematicService.php +223 -0
- package/server/src/Support/Utils.php +1 -1
- package/server/src/routes.php +24 -1
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import Service, { inject as service } from '@ember/service';
|
|
2
|
+
import { action } from '@ember/object';
|
|
3
|
+
import getModelName from '@fleetbase/ember-core/utils/get-model-name';
|
|
4
|
+
|
|
5
|
+
export default class ResourceMetadataService extends Service {
|
|
6
|
+
@service modalsManager;
|
|
7
|
+
@service notifications;
|
|
8
|
+
@service intl;
|
|
9
|
+
|
|
10
|
+
@action view(resource, options = {}) {
|
|
11
|
+
this.modalsManager.show('modals/view-metadata', {
|
|
12
|
+
title: `${this.intl.t('resource.' + getModelName(resource))} ${this.intl.t('common.metadata')}`,
|
|
13
|
+
acceptButtonText: this.intl.t('common.done'),
|
|
14
|
+
hideDeclineButton: true,
|
|
15
|
+
metadata: resource.meta,
|
|
16
|
+
...options,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@action edit(resource, options = {}) {
|
|
21
|
+
this.modalsManager.show('modals/edit-metadata', {
|
|
22
|
+
title: `${this.intl.t('common.edit')} ${this.intl.t('resource.' + getModelName(resource))} ${this.intl.t('common.metadata')}`,
|
|
23
|
+
acceptButtonText: this.intl.t('common.save-changes'),
|
|
24
|
+
acceptButtonIcon: 'save',
|
|
25
|
+
actionsWrapperClass: 'px-3',
|
|
26
|
+
metadata: resource.meta,
|
|
27
|
+
onChange: (meta) => {
|
|
28
|
+
resource.set('meta', meta);
|
|
29
|
+
},
|
|
30
|
+
confirm: async (modal) => {
|
|
31
|
+
modal.startLoading();
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
await resource.save();
|
|
35
|
+
this.notifications.success(this.intl.t('common.field-saved', { field: this.intl.t('common.metadata') }));
|
|
36
|
+
modal.done();
|
|
37
|
+
} catch (error) {
|
|
38
|
+
this.notifications.serverError(error);
|
|
39
|
+
} finally {
|
|
40
|
+
modal.stopLoading();
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
...options,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -1689,3 +1689,160 @@ main.console-fleet-ops-operations-orders-index-index section.next-view-section >
|
|
|
1689
1689
|
padding-left: 0.5rem;
|
|
1690
1690
|
padding-right: 2rem;
|
|
1691
1691
|
}
|
|
1692
|
+
|
|
1693
|
+
.positions-replay-component {
|
|
1694
|
+
width: 100%;
|
|
1695
|
+
max-width: 100%;
|
|
1696
|
+
}
|
|
1697
|
+
|
|
1698
|
+
.positions-replay-component .metric-card {
|
|
1699
|
+
padding: 0.75rem;
|
|
1700
|
+
border-radius: 0.5rem;
|
|
1701
|
+
background-color: rgba(0, 0, 0, 2%);
|
|
1702
|
+
transition: all 0.2s ease-in-out;
|
|
1703
|
+
}
|
|
1704
|
+
|
|
1705
|
+
.positions-replay-component .metric-card:hover {
|
|
1706
|
+
background-color: rgba(0, 0, 0, 4%);
|
|
1707
|
+
box-shadow: 0 4px 6px rgba(0, 0, 0, 10%);
|
|
1708
|
+
}
|
|
1709
|
+
|
|
1710
|
+
body[data-theme='dark'] .positions-replay-component .metric-card {
|
|
1711
|
+
background-color: rgba(255, 255, 255, 5%);
|
|
1712
|
+
}
|
|
1713
|
+
|
|
1714
|
+
body[data-theme='dark'] .positions-replay-component .metric-card:hover {
|
|
1715
|
+
background-color: rgba(255, 255, 255, 8%);
|
|
1716
|
+
}
|
|
1717
|
+
|
|
1718
|
+
.positions-replay-component .metric-label {
|
|
1719
|
+
font-size: 0.65rem;
|
|
1720
|
+
text-transform: uppercase;
|
|
1721
|
+
letter-spacing: 0.05em;
|
|
1722
|
+
margin-bottom: 0.25rem;
|
|
1723
|
+
}
|
|
1724
|
+
|
|
1725
|
+
.positions-replay-component .metric-value {
|
|
1726
|
+
font-size: 0.85rem;
|
|
1727
|
+
line-height: 1;
|
|
1728
|
+
}
|
|
1729
|
+
|
|
1730
|
+
.positions-replay-component .positions-replay-map-container {
|
|
1731
|
+
overflow: hidden;
|
|
1732
|
+
height: 100%;
|
|
1733
|
+
width: 100%;
|
|
1734
|
+
}
|
|
1735
|
+
|
|
1736
|
+
.positions-replay-component .replay-controls {
|
|
1737
|
+
display: flex;
|
|
1738
|
+
align-items: center;
|
|
1739
|
+
justify-content: space-between;
|
|
1740
|
+
flex-wrap: wrap;
|
|
1741
|
+
gap: 1rem;
|
|
1742
|
+
}
|
|
1743
|
+
|
|
1744
|
+
.positions-replay-component .speed-control {
|
|
1745
|
+
display: flex;
|
|
1746
|
+
align-items: center;
|
|
1747
|
+
}
|
|
1748
|
+
|
|
1749
|
+
.positions-replay-component .speed-control > select.speed-select {
|
|
1750
|
+
height: 1.7rem;
|
|
1751
|
+
font-size: 0.85rem;
|
|
1752
|
+
line-height: 0.85rem;
|
|
1753
|
+
text-align: center;
|
|
1754
|
+
padding: 0 2rem 0 0.75rem;
|
|
1755
|
+
}
|
|
1756
|
+
|
|
1757
|
+
.positions-replay-component .replay-progress {
|
|
1758
|
+
display: flex;
|
|
1759
|
+
align-items: center;
|
|
1760
|
+
gap: 0.5rem;
|
|
1761
|
+
}
|
|
1762
|
+
|
|
1763
|
+
.positions-replay-component .progress-bar {
|
|
1764
|
+
position: relative;
|
|
1765
|
+
overflow: hidden;
|
|
1766
|
+
border-radius: 9999px;
|
|
1767
|
+
}
|
|
1768
|
+
|
|
1769
|
+
.positions-replay-component .progress-fill {
|
|
1770
|
+
height: 100%;
|
|
1771
|
+
background: linear-gradient(90deg, #3b82f6, #2563eb);
|
|
1772
|
+
transition: width 0.3s ease-in-out;
|
|
1773
|
+
}
|
|
1774
|
+
|
|
1775
|
+
.positions-replay-component .map-wrapper {
|
|
1776
|
+
position: relative;
|
|
1777
|
+
width: 100%;
|
|
1778
|
+
}
|
|
1779
|
+
|
|
1780
|
+
.positions-replay-component .positions-replay-map {
|
|
1781
|
+
width: 100%;
|
|
1782
|
+
height: 100%;
|
|
1783
|
+
}
|
|
1784
|
+
|
|
1785
|
+
.positions-replay-component .positions-replay-timeline {
|
|
1786
|
+
margin-top: 1rem;
|
|
1787
|
+
}
|
|
1788
|
+
|
|
1789
|
+
.positions-replay-component .timeline-container {
|
|
1790
|
+
position: relative;
|
|
1791
|
+
}
|
|
1792
|
+
|
|
1793
|
+
.positions-replay-component .timeline-track {
|
|
1794
|
+
display: flex;
|
|
1795
|
+
padding-bottom: 1rem;
|
|
1796
|
+
min-width: min-content;
|
|
1797
|
+
}
|
|
1798
|
+
|
|
1799
|
+
.positions-replay-component .timeline-item {
|
|
1800
|
+
position: relative;
|
|
1801
|
+
min-width: 80px;
|
|
1802
|
+
padding: 0.5rem;
|
|
1803
|
+
border-radius: 0.375rem;
|
|
1804
|
+
transition: all 0.2s ease-in-out;
|
|
1805
|
+
}
|
|
1806
|
+
|
|
1807
|
+
.positions-replay-component .timeline-item:hover {
|
|
1808
|
+
transform: translateY(-2px);
|
|
1809
|
+
}
|
|
1810
|
+
|
|
1811
|
+
.positions-replay-component .timeline-marker {
|
|
1812
|
+
width: 0.75rem;
|
|
1813
|
+
height: 0.75rem;
|
|
1814
|
+
border-radius: 50%;
|
|
1815
|
+
margin: 0 auto 0.25rem;
|
|
1816
|
+
transition: all 0.2s ease-in-out;
|
|
1817
|
+
}
|
|
1818
|
+
|
|
1819
|
+
.positions-replay-component .timeline-item:hover .timeline-marker {
|
|
1820
|
+
transform: scale(1.3);
|
|
1821
|
+
}
|
|
1822
|
+
|
|
1823
|
+
.positions-replay-component .timeline-content {
|
|
1824
|
+
text-align: center;
|
|
1825
|
+
white-space: nowrap;
|
|
1826
|
+
}
|
|
1827
|
+
|
|
1828
|
+
.positions-replay-component .positions-replay-table table {
|
|
1829
|
+
width: 100%;
|
|
1830
|
+
border-collapse: collapse;
|
|
1831
|
+
}
|
|
1832
|
+
|
|
1833
|
+
.positions-replay-component .positions-replay-table th {
|
|
1834
|
+
position: sticky;
|
|
1835
|
+
top: 0;
|
|
1836
|
+
z-index: 10;
|
|
1837
|
+
white-space: nowrap;
|
|
1838
|
+
text-overflow: ellipsis;
|
|
1839
|
+
font-size: 0.65rem;
|
|
1840
|
+
}
|
|
1841
|
+
|
|
1842
|
+
.positions-replay-component .empty-state {
|
|
1843
|
+
display: flex;
|
|
1844
|
+
flex-direction: column;
|
|
1845
|
+
align-items: center;
|
|
1846
|
+
justify-content: center;
|
|
1847
|
+
min-height: 400px;
|
|
1848
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
<Device::Details @resource={{@model}} />
|
|
2
|
+
<Spacer @height="200px" />
|
|
@@ -1,2 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
{{
|
|
1
|
+
<Layout::Resource::Panel
|
|
2
|
+
@resource={{@model}}
|
|
3
|
+
@controller={{this}}
|
|
4
|
+
@headerComponent={{component "device/panel-header" resource=@model}}
|
|
5
|
+
@headerTitle={{or @model.name @model.serial_number}}
|
|
6
|
+
@actionButtons={{this.actionButtons}}
|
|
7
|
+
@onPressCancel={{transition-to "connectivity.devices.index"}}
|
|
8
|
+
@onOverlayReady={{fn (mut this.overlay)}}
|
|
9
|
+
@headerClass="no-bottom-border"
|
|
10
|
+
@bodyClass="no-scroll"
|
|
11
|
+
>
|
|
12
|
+
<TabNavigation @tabs={{this.tabs}} @contentClass="scrollable" @tablistClass="pl-2">
|
|
13
|
+
{{outlet}}
|
|
14
|
+
</TabNavigation>
|
|
15
|
+
</Layout::Resource::Panel>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<Layout::Resource::Panel
|
|
2
2
|
@resource={{@model}}
|
|
3
3
|
@controller={{this}}
|
|
4
|
-
@headerTitle={{concat "Edit: " @model.name}}
|
|
4
|
+
@headerTitle={{concat "Edit: " (or @model.name @model.serial_number)}}
|
|
5
5
|
@actionButtons={{this.actionButtons}}
|
|
6
6
|
@saveTask={{this.save}}
|
|
7
7
|
@onPressCancel={{this.cancel}}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
<Sensor::Details @resource={{@model}} />
|
|
2
|
+
<Spacer @height="200px" />
|
|
@@ -1,2 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
{{
|
|
1
|
+
<Layout::Resource::Panel
|
|
2
|
+
@resource={{@model}}
|
|
3
|
+
@controller={{this}}
|
|
4
|
+
@headerComponent={{component "sensor/panel-header" resource=@model}}
|
|
5
|
+
@headerTitle={{or @model.name @model.serial_number}}
|
|
6
|
+
@actionButtons={{this.actionButtons}}
|
|
7
|
+
@onPressCancel={{transition-to "connectivity.sensors.index"}}
|
|
8
|
+
@onOverlayReady={{fn (mut this.overlay)}}
|
|
9
|
+
@headerClass="no-bottom-border"
|
|
10
|
+
@bodyClass="no-scroll"
|
|
11
|
+
>
|
|
12
|
+
<TabNavigation @tabs={{this.tabs}} @contentClass="scrollable" @tablistClass="pl-2">
|
|
13
|
+
{{outlet}}
|
|
14
|
+
</TabNavigation>
|
|
15
|
+
</Layout::Resource::Panel>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<Layout::Resource::Panel
|
|
2
2
|
@resource={{@model}}
|
|
3
3
|
@controller={{this}}
|
|
4
|
-
@headerTitle={{concat "Edit: " @model.name}}
|
|
4
|
+
@headerTitle={{concat "Edit: " (or @model.name @model.serial_number)}}
|
|
5
5
|
@actionButtons={{this.actionButtons}}
|
|
6
6
|
@saveTask={{this.save}}
|
|
7
7
|
@onPressCancel={{this.cancel}}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
<Telematic::Details @resource={{@model}} />
|
|
2
|
+
<Spacer @height="200px" />
|
|
@@ -1,2 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
{{
|
|
1
|
+
<Layout::Resource::Panel
|
|
2
|
+
@resource={{@model}}
|
|
3
|
+
@controller={{this}}
|
|
4
|
+
@headerTitle={{or @model.name @model.provider}}
|
|
5
|
+
@actionButtons={{this.actionButtons}}
|
|
6
|
+
@onPressCancel={{transition-to "connectivity.telematics.index"}}
|
|
7
|
+
@onOverlayReady={{fn (mut this.overlay)}}
|
|
8
|
+
@headerClass="no-bottom-border"
|
|
9
|
+
@bodyClass="no-scroll"
|
|
10
|
+
>
|
|
11
|
+
<TabNavigation @tabs={{this.tabs}} @contentClass="scrollable" @tablistClass="pl-2">
|
|
12
|
+
{{outlet}}
|
|
13
|
+
</TabNavigation>
|
|
14
|
+
</Layout::Resource::Panel>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<Layout::Resource::Panel
|
|
2
2
|
@resource={{@model}}
|
|
3
3
|
@controller={{this}}
|
|
4
|
-
@headerTitle={{concat "Edit: " @model.name}}
|
|
4
|
+
@headerTitle={{concat "Edit: " (or @model.name @model.provider)}}
|
|
5
5
|
@actionButtons={{this.actionButtons}}
|
|
6
6
|
@saveTask={{this.save}}
|
|
7
7
|
@onPressCancel={{this.cancel}}
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
{{outlet}}
|
|
1
|
+
<Device::Manager @resource={{@model}} />
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<PositionsReplay @resource={{@model}} />
|
|
@@ -403,6 +403,95 @@ export const serviceAreaTypes = [
|
|
|
403
403
|
{ label: 'Continent', value: 'continent', description: 'A global landmass encompassing multiple countries (e.g., Asia, Europe, Africa).' },
|
|
404
404
|
];
|
|
405
405
|
|
|
406
|
+
export const telematicStatuses = [
|
|
407
|
+
{ value: 'initialized', label: 'Initialized', description: 'Provider entry has been created but not yet configured.' },
|
|
408
|
+
{ value: 'configured', label: 'Configured', description: 'Provider credentials and settings are valid but connection not yet tested.' },
|
|
409
|
+
{ value: 'connecting', label: 'Connecting', description: 'Attempting to establish a connection with provider API.' },
|
|
410
|
+
{ value: 'connected', label: 'Connected', description: 'Successfully authenticated and connected to provider API.' },
|
|
411
|
+
{ value: 'synchronizing', label: 'Synchronizing', description: 'Currently syncing data (devices, vehicles, positions, etc.) from provider.' },
|
|
412
|
+
{ value: 'active', label: 'Active', description: 'Integration is healthy and data syncs are occurring normally.' },
|
|
413
|
+
{ value: 'degraded', label: 'Degraded', description: 'Integration partially working; intermittent errors or missing data.' },
|
|
414
|
+
{ value: 'disconnected', label: 'Disconnected', description: 'Connection lost or failed authentication.' },
|
|
415
|
+
{ value: 'error', label: 'Error', description: 'Provider integration encountered a fatal issue.' },
|
|
416
|
+
{ value: 'disabled', label: 'Disabled', description: 'Manually disabled by the user.' },
|
|
417
|
+
{ value: 'archived', label: 'Archived', description: 'Deprecated or replaced integration, kept for record.' },
|
|
418
|
+
];
|
|
419
|
+
|
|
420
|
+
export const telematicHealthStates = [
|
|
421
|
+
{ value: 'healthy', label: 'Healthy', description: 'Integration tested and stable.' },
|
|
422
|
+
{ value: 'warning', label: 'Warning', description: 'Minor issues detected (e.g., slow response, nearing quota).' },
|
|
423
|
+
{ value: 'critical', label: 'Critical', description: 'Persistent failure or no data received in X hours.' },
|
|
424
|
+
];
|
|
425
|
+
|
|
426
|
+
export const deviceTypes = [
|
|
427
|
+
{ label: 'GPS Tracker', value: 'gps_tracker', description: 'Standalone GPS tracking device installed in vehicle or asset.' },
|
|
428
|
+
{ label: 'OBD-II Plug-in Device', value: 'obd2_plugin', description: 'Plugs into vehicle OBD-II port; reads diagnostics, engine data, and transmits telematics.' },
|
|
429
|
+
{ label: 'CAN Bus Module', value: 'can_bus_module', description: 'Hard-wired module connected to vehicle CAN bus for detailed vehicle subsystem data.' },
|
|
430
|
+
{ label: 'Dash Camera Telematics Unit', value: 'dashcam_unit', description: 'Camera + integrated telematics module capturing video and vehicle data.' },
|
|
431
|
+
{
|
|
432
|
+
label: 'Battery-Powered Asset Tracker',
|
|
433
|
+
value: 'battery_asset_tracker',
|
|
434
|
+
description: 'Self-powered wireless device for tracking non-powered assets (trailers, containers, equipment).',
|
|
435
|
+
},
|
|
436
|
+
{ label: 'Smartphone App Device', value: 'smartphone_app_device', description: 'Mobile device running telematics/tracking app using phone sensors and connectivity.' },
|
|
437
|
+
{ label: 'Hard-wired Black Box Module', value: 'hardwired_black_box', description: 'Permanently installed telematics control unit wired to vehicle electrical system for fleet use.' },
|
|
438
|
+
{ label: 'Mobile Edge / IoT Gateway', value: 'mobile_edge_gateway', description: 'Multi-sensor/IoT gateway installed in vehicle or asset to aggregate sensor data and telematics.' },
|
|
439
|
+
{
|
|
440
|
+
label: 'Trailer/Container Telematic Sensor Node',
|
|
441
|
+
value: 'trailer_container_node',
|
|
442
|
+
description: 'Specialised telematics node for trailers, containers, intermodal assets, tracking location and status.',
|
|
443
|
+
},
|
|
444
|
+
];
|
|
445
|
+
|
|
446
|
+
export const sensorTypes = [
|
|
447
|
+
{ label: 'GPS / GNSS Receiver', value: 'gps_gnss', description: 'Global positioning sensor providing latitude/longitude, speed and time information.' },
|
|
448
|
+
{ label: 'Accelerometer', value: 'accelerometer', description: 'Measures linear acceleration; used to detect harsh braking, rapid acceleration, and movement.' },
|
|
449
|
+
{ label: 'Gyroscope / IMU', value: 'gyroscope_imu', description: 'Inertial Measurement Unit estimating orientation, yaw/pitch/roll of vehicle or asset.' },
|
|
450
|
+
{ label: 'Fuel Level Sensor', value: 'fuel_level', description: 'Measures remaining fuel in tank; used for fuel monitoring and consumption tracking.' },
|
|
451
|
+
{ label: 'Tire Pressure Sensor (TPMS)', value: 'tire_pressure', description: 'Measures pressure (and often temperature) in tires for safety and maintenance.' },
|
|
452
|
+
{ label: 'Engine Diagnostic / OBD Sensor', value: 'engine_diagnostic', description: 'Reads engine fault codes, RPM, engine hours, and other diagnostics via OBD or CAN.' },
|
|
453
|
+
{ label: 'Temperature Sensor', value: 'temperature', description: 'Monitors ambient or equipment temperature; used for refrigerated cargo, battery health etc.' },
|
|
454
|
+
{ label: 'Humidity Sensor', value: 'humidity', description: 'Detects moisture/humidity levels in cargo or enclosed spaces for condition monitoring.' },
|
|
455
|
+
{ label: 'Door / Hatch Sensor', value: 'door_hatch', description: 'Monitors open/close status of doors, hatches or compartments for security/tracking.' },
|
|
456
|
+
{ label: 'Vibration / Shock Sensor', value: 'vibration_shock', description: 'Measures vibration or shock events; suitable for freight, containers or equipment stability monitoring.' },
|
|
457
|
+
{ label: 'Battery Voltage Sensor', value: 'battery_voltage', description: 'Monitors battery or electrical system voltage to detect low power or charging issues.' },
|
|
458
|
+
{ label: 'Geofence / Entry-Exit Event Sensor', value: 'geofence_event', description: 'Triggers when asset enters/exits defined geographic zone; used for location-based alerts.' },
|
|
459
|
+
{ label: 'Idle Time Sensor', value: 'idle_time', description: 'Tracks engine on with vehicle stationary; used to measure idling and optimize fuel/usage.' },
|
|
460
|
+
{ label: 'Driver Behavior Sensor', value: 'driver_behavior', description: 'Aggregates data (speed, braking, cornering) to score driving behavior and safety.' },
|
|
461
|
+
];
|
|
462
|
+
|
|
463
|
+
export const deviceStatuses = [
|
|
464
|
+
{ label: 'Inactive', value: 'inactive', description: 'Device record exists but has not yet been activated or assigned.' },
|
|
465
|
+
{ label: 'Active', value: 'active', description: 'Device is online and actively communicating with the platform.' },
|
|
466
|
+
{ label: 'Online', value: 'online', description: 'Device is currently connected and transmitting live data.' },
|
|
467
|
+
{ label: 'Offline', value: 'offline', description: 'Device is powered off or has not transmitted data within the expected interval.' },
|
|
468
|
+
{ label: 'Sleeping', value: 'sleeping', description: 'Device in low-power mode awaiting wake event or scheduled reporting interval.' },
|
|
469
|
+
{ label: 'Idle', value: 'idle', description: 'Device is powered and connected but not moving or transmitting new telemetry.' },
|
|
470
|
+
{ label: 'Maintenance', value: 'maintenance', description: 'Device is undergoing repair, firmware update, or service maintenance.' },
|
|
471
|
+
{ label: 'Degraded', value: 'degraded', description: 'Device is partially functional; intermittent connectivity or incomplete data.' },
|
|
472
|
+
{ label: 'Error', value: 'error', description: 'Device reported fault, hardware issue, or repeated communication errors.' },
|
|
473
|
+
{ label: 'Disconnected', value: 'disconnected', description: 'Device lost connection to network or telematic gateway.' },
|
|
474
|
+
{ label: 'Decommissioned', value: 'decommissioned', description: 'Device permanently retired or removed from active fleet use.' },
|
|
475
|
+
{ label: 'Disabled', value: 'disabled', description: 'Device manually disabled by user or admin; data not being accepted.' },
|
|
476
|
+
{ label: 'Pending Activation', value: 'pending_activation', description: 'Device provisioned but not yet verified or linked to telematic source.' },
|
|
477
|
+
{ label: 'Provisioning', value: 'provisioning', description: 'Device configuration or initialization is in progress.' },
|
|
478
|
+
];
|
|
479
|
+
|
|
480
|
+
export const sensorStatuses = [
|
|
481
|
+
{ label: 'Active', value: 'active', description: 'Sensor is online and transmitting readings as expected.' },
|
|
482
|
+
{ label: 'Inactive', value: 'inactive', description: 'Sensor exists but is not currently operational or reporting.' },
|
|
483
|
+
{ label: 'Online', value: 'online', description: 'Sensor is connected and sending live data via its parent device.' },
|
|
484
|
+
{ label: 'Offline', value: 'offline', description: 'Sensor has stopped sending data or is unreachable.' },
|
|
485
|
+
{ label: 'Calibrating', value: 'calibrating', description: 'Sensor undergoing calibration or self-test to ensure measurement accuracy.' },
|
|
486
|
+
{ label: 'Faulty', value: 'faulty', description: 'Sensor hardware failure or inconsistent readings detected.' },
|
|
487
|
+
{ label: 'Degraded', value: 'degraded', description: 'Sensor partially functional; data irregularities or unstable connection.' },
|
|
488
|
+
{ label: 'Maintenance', value: 'maintenance', description: 'Sensor temporarily disabled for maintenance, cleaning, or recalibration.' },
|
|
489
|
+
{ label: 'Error', value: 'error', description: 'Critical failure or unrecoverable error reported by sensor or gateway.' },
|
|
490
|
+
{ label: 'Disconnected', value: 'disconnected', description: 'Sensor communication link lost with device or telematic gateway.' },
|
|
491
|
+
{ label: 'Disabled', value: 'disabled', description: 'Sensor manually disabled; no data being collected.' },
|
|
492
|
+
{ label: 'Decommissioned', value: 'decommissioned', description: 'Sensor permanently retired, replaced, or removed from service.' },
|
|
493
|
+
];
|
|
494
|
+
|
|
406
495
|
export default function fleetOpsOptions(key) {
|
|
407
496
|
const allOptions = {
|
|
408
497
|
driverTypes,
|
|
@@ -434,6 +523,12 @@ export default function fleetOpsOptions(key) {
|
|
|
434
523
|
dimensionUnits,
|
|
435
524
|
weightUnits,
|
|
436
525
|
serviceAreaTypes,
|
|
526
|
+
telematicStatuses,
|
|
527
|
+
telematicHealthStates,
|
|
528
|
+
deviceTypes,
|
|
529
|
+
sensorTypes,
|
|
530
|
+
deviceStatuses,
|
|
531
|
+
sensorStatuses,
|
|
437
532
|
};
|
|
438
533
|
|
|
439
534
|
return allOptions[key] ?? [];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/components/device/card';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/components/device/manager';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/components/device/panel-header';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/components/device/pill';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/components/driver/pill';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/components/map/drawer/device-event-listing';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/components/map/drawer/position-listing';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/components/modals/attach-device';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/components/order/pill';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/components/positions-replay';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/components/sensor/panel-header';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/components/vehicle/pill';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/helpers/get-fleet-ops-option-label';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/routes/management/drivers/index/details/positions';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/routes/management/vehicles/index/details/positions';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/services/position-playback';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/services/resource-metadata';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/templates/management/drivers/index/details/positions';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/fleetops-engine/templates/management/vehicles/index/details/positions';
|
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.22",
|
|
4
4
|
"description": "Fleet & Transport Management Extension for Fleetbase",
|
|
5
5
|
"fleetbase": {
|
|
6
6
|
"route": "fleet-ops"
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@babel/core": "^7.23.2",
|
|
45
|
-
"@fleetbase/ember-core": "^0.3.
|
|
46
|
-
"@fleetbase/ember-ui": "^0.3.
|
|
47
|
-
"@fleetbase/fleetops-data": "^0.1.
|
|
45
|
+
"@fleetbase/ember-core": "^0.3.6",
|
|
46
|
+
"@fleetbase/ember-ui": "^0.3.8",
|
|
47
|
+
"@fleetbase/fleetops-data": "^0.1.21",
|
|
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",
|