@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.
Files changed (60) hide show
  1. package/addon/components/layout/fleet-ops-sidebar/operations-monitor.hbs +201 -0
  2. package/addon/components/layout/fleet-ops-sidebar/operations-monitor.js +589 -0
  3. package/addon/components/layout/fleet-ops-sidebar.hbs +19 -233
  4. package/addon/components/layout/fleet-ops-sidebar.js +287 -394
  5. package/addon/components/maintenance-schedule/form.js +1 -0
  6. package/addon/components/order/form/payload.js +3 -1
  7. package/addon/controllers/connectivity/devices/index.js +4 -1
  8. package/addon/controllers/maintenance/index.js +100 -0
  9. package/addon/controllers/management/fuel-transactions/index.js +1 -1
  10. package/addon/controllers/management/index.js +88 -0
  11. package/addon/controllers/settings/index.js +142 -0
  12. package/addon/extension.js +21 -0
  13. package/addon/routes/analytics/index.js +3 -0
  14. package/addon/routes/connectivity/devices/index.js +3 -0
  15. package/addon/routes/maintenance/index.js +3 -0
  16. package/addon/routes/maintenance/work-orders/index.js +2 -0
  17. package/addon/routes/settings/index.js +3 -0
  18. package/addon/styles/fleetops-engine.css +1801 -2
  19. package/addon/templates/analytics/index.hbs +14 -0
  20. package/addon/templates/analytics/reports/index.hbs +4 -4
  21. package/addon/templates/maintenance/index.hbs +113 -0
  22. package/addon/templates/management/fuel-transactions/index/details.hbs +1 -1
  23. package/addon/templates/management/index.hbs +109 -73
  24. package/addon/templates/operations/orders/index.hbs +1 -1
  25. package/addon/templates/operations/service-rates/index.hbs +1 -1
  26. package/addon/templates/settings/index.hbs +83 -0
  27. package/addon/templates/settings/routing.hbs +2 -2
  28. package/app/controllers/maintenance/index.js +1 -0
  29. package/app/controllers/management/index.js +1 -0
  30. package/app/controllers/settings/index.js +1 -0
  31. package/app/routes/analytics/index.js +1 -0
  32. package/app/routes/maintenance/index.js +1 -0
  33. package/app/routes/settings/index.js +1 -0
  34. package/app/templates/analytics/index.js +1 -0
  35. package/app/templates/maintenance/index.js +1 -0
  36. package/app/templates/management/index.js +1 -0
  37. package/app/templates/settings/index.js +1 -0
  38. package/composer.json +1 -1
  39. package/extension.json +1 -1
  40. package/package.json +3 -3
  41. package/server/migrations/2026_06_15_000001_normalize_device_attachable_vehicle_morph_types.php +30 -0
  42. package/server/src/Console/Commands/FixInvalidPolymorphicRelationTypeNamespaces.php +1 -0
  43. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +75 -11
  44. package/server/src/Http/Controllers/Internal/v1/HubController.php +300 -0
  45. package/server/src/Http/Controllers/Internal/v1/SearchController.php +506 -0
  46. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +1 -1
  47. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +94 -10
  48. package/server/src/Http/Filter/DeviceFilter.php +74 -0
  49. package/server/src/Http/Filter/DriverFilter.php +6 -0
  50. package/server/src/Http/Filter/VehicleFilter.php +6 -0
  51. package/server/src/Jobs/SyncTelematicDevicesJob.php +82 -24
  52. package/server/src/Models/Device.php +1 -1
  53. package/server/src/Models/Driver.php +1 -1
  54. package/server/src/Providers/FleetOpsServiceProvider.php +10 -0
  55. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +51 -13
  56. package/server/src/routes.php +9 -0
  57. package/server/tests/HubRoutesTest.php +62 -0
  58. package/server/tests/TelematicsHardeningTest.php +94 -3
  59. package/translations/ar-ae.yml +1 -1
  60. 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 FleetOps report to start tracking operational trends, utilization, and performance over time."
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="Analytics guide"
29
- docsText="Analytics guide"
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 FleetOps UUID or public ID when automatic matching cannot identify the vehicle or order.</p>
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="content">
2
- <div class="row">
3
- <div class="col-12 col-lg-3 col-xl-3">
4
- <LinkTo
5
- @route="dashboard.fleet-ops.management.vendors"
6
- 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"
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="col-12 col-lg-3 col-xl-3">
13
- <LinkTo
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
- {{outlet}}
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 FleetOps: plan routes, assign drivers and vehicles, track progress, and collect proof."
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 FleetOps prices routes, zones, distance, and other service rules."
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="FleetOps Routing & Tracking">
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetbase/fleetops-api",
3
- "version": "0.6.52",
3
+ "version": "0.6.53",
4
4
  "description": "Fleet & Transport Management Extension for Fleetbase",
5
5
  "keywords": [
6
6
  "fleetbase-extension",
package/extension.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "Fleet-Ops",
3
- "version": "0.6.52",
3
+ "version": "0.6.53",
4
4
  "description": "Fleet & Transport Management Extension for Fleetbase",
5
5
  "repository": "https://github.com/fleetbase/fleetops",
6
6
  "license": "AGPL-3.0-or-later",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fleetbase/fleetops-engine",
3
- "version": "0.6.52",
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.34",
47
- "@fleetbase/fleetops-data": "^0.1.37",
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",
@@ -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) {