@fleetbase/fleetops-engine 0.6.38 → 0.6.40
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/activity/form.hbs +2 -12
- package/addon/components/activity/logic-builder.hbs +1 -1
- package/addon/components/custom-entity/form.hbs +4 -20
- package/addon/components/device/form.hbs +3 -15
- package/addon/components/device/panel-header.hbs +13 -2
- package/addon/components/driver/details.hbs +33 -2
- package/addon/components/driver/form.hbs +42 -0
- package/addon/components/driver/panel-header.hbs +8 -1
- package/addon/components/driver/schedule.hbs +115 -76
- package/addon/components/driver/schedule.js +349 -157
- package/addon/components/driver-onboard-settings.hbs +2 -8
- package/addon/components/entity-field-editing-settings.hbs +2 -5
- package/addon/components/equipment/card.hbs +49 -0
- package/addon/components/equipment/card.js +6 -0
- package/addon/components/equipment/details.hbs +83 -44
- package/addon/components/equipment/form.hbs +111 -41
- package/addon/components/equipment/form.js +78 -10
- package/addon/components/equipment/panel-header.hbs +36 -0
- package/addon/components/equipment/panel-header.js +2 -0
- package/addon/components/fleet/driver-listing.hbs +3 -1
- package/addon/components/fleet/vehicle-listing.hbs +4 -7
- package/addon/components/fleet-panel/vehicle-listing.hbs +1 -6
- package/addon/components/fuel-report/form.hbs +1 -5
- package/addon/components/layout/fleet-ops-sidebar.hbs +43 -38
- package/addon/components/layout/fleet-ops-sidebar.js +103 -24
- package/addon/components/maintenance/cost-panel.hbs +176 -0
- package/addon/components/maintenance/cost-panel.js +241 -0
- package/addon/components/maintenance/details.hbs +123 -60
- package/addon/components/maintenance/form.hbs +138 -78
- package/addon/components/maintenance/form.js +131 -6
- package/addon/components/maintenance/panel-header.hbs +31 -0
- package/addon/components/maintenance/panel-header.js +2 -0
- package/addon/components/maintenance-schedule/details.hbs +260 -0
- package/addon/components/maintenance-schedule/details.js +158 -0
- package/addon/components/maintenance-schedule/form.hbs +287 -0
- package/addon/components/maintenance-schedule/form.js +199 -0
- package/addon/components/map/container.hbs +1 -1
- package/addon/components/map/drawer/device-event-listing.hbs +1 -1
- package/addon/components/map/drawer/driver-listing.hbs +1 -6
- package/addon/components/map/drawer/place-listing.hbs +1 -6
- package/addon/components/map/drawer/vehicle-listing.hbs +1 -6
- package/addon/components/map/drawer.hbs +8 -1
- package/addon/components/map/leaflet-live-map.hbs +2 -1
- package/addon/components/map/toolbar/visibility-control-panel.hbs +1 -1
- package/addon/components/map/toolbar.hbs +4 -29
- package/addon/components/modals/add-driver-shift.hbs +155 -0
- package/addon/components/modals/add-driver-shift.js +210 -0
- package/addon/components/modals/bulk-assign-orders.hbs +67 -0
- package/addon/components/modals/driver-shift.hbs +43 -0
- package/addon/components/modals/driver-shift.js +56 -0
- package/addon/components/modals/entity-form.hbs +5 -28
- package/addon/components/modals/orchestrator-import.hbs +351 -0
- package/addon/components/modals/orchestrator-import.js +807 -0
- package/addon/components/modals/order-config-new-status.hbs +1 -5
- package/addon/components/modals/scheduling-conflict.hbs +47 -0
- package/addon/components/modals/scheduling-conflict.js +53 -0
- package/addon/components/modals/send-work-order.hbs +91 -0
- package/addon/components/modals/send-work-order.js +3 -0
- package/addon/components/modals/service-area-form.hbs +1 -6
- package/addon/components/modals/set-driver-availability.hbs +50 -0
- package/addon/components/modals/set-driver-availability.js +57 -0
- package/addon/components/modals/update-order-activity.hbs +13 -9
- package/addon/components/modals/user-form.hbs +1 -5
- package/addon/components/modals/vehicle-form.hbs +17 -102
- package/addon/components/modals/vendor-form.hbs +15 -82
- package/addon/components/orchestrator/card-fields-settings.hbs +76 -0
- package/addon/components/orchestrator/card-fields-settings.js +134 -0
- package/addon/components/orchestrator/order-pool.hbs +264 -0
- package/addon/components/orchestrator/order-pool.js +394 -0
- package/addon/components/orchestrator/phase-builder.hbs +162 -0
- package/addon/components/orchestrator/phase-builder.js +162 -0
- package/addon/components/orchestrator/plan-viewer.hbs +278 -0
- package/addon/components/orchestrator/plan-viewer.js +342 -0
- package/addon/components/orchestrator/resource-panel.hbs +301 -0
- package/addon/components/orchestrator/resource-panel.js +106 -0
- package/addon/components/orchestrator-workbench.hbs +318 -0
- package/addon/components/orchestrator-workbench.js +1088 -0
- package/addon/components/order/details/custom-fields.hbs +10 -1
- package/addon/components/order/details/detail.hbs +37 -2
- package/addon/components/order/details/detail.js +0 -1
- package/addon/components/order/details/integrated-vendor-details.hbs +4 -4
- package/addon/components/order/details/notes.hbs +1 -7
- package/addon/components/order/details/route.hbs +1 -5
- package/addon/components/order/form/details.hbs +44 -10
- package/addon/components/order/form/details.js +57 -0
- package/addon/components/order/form/notes.hbs +1 -7
- package/addon/components/order/form/payload.hbs +1 -7
- package/addon/components/order/form/route.hbs +3 -15
- package/addon/components/order/header.hbs +1 -7
- package/addon/components/order/route-editor.hbs +4 -25
- package/addon/components/order/schedule-card.hbs +102 -95
- package/addon/components/order/schedule-card.js +8 -3
- package/addon/components/order-config-manager/details.hbs +2 -10
- package/addon/components/order-config-manager/entities.hbs +1 -7
- package/addon/components/order-config-manager.hbs +1 -6
- package/addon/components/part/card.hbs +49 -0
- package/addon/components/part/card.js +6 -0
- package/addon/components/part/details.hbs +102 -56
- package/addon/components/part/form.hbs +131 -56
- package/addon/components/part/form.js +78 -11
- package/addon/components/part/panel-header.hbs +36 -0
- package/addon/components/part/panel-header.js +2 -0
- package/addon/components/place/form.hbs +1 -7
- package/addon/components/sensor/details.hbs +1 -1
- package/addon/components/sensor/form.hbs +5 -3
- package/addon/components/sensor/panel-header.hbs +8 -1
- package/addon/components/service-area/form.hbs +1 -6
- package/addon/components/service-rate/form.hbs +12 -60
- package/addon/components/telematic/form.hbs +6 -2
- package/addon/components/vehicle/details/maintenance-history.hbs +42 -0
- package/addon/components/vehicle/details/maintenance-history.js +32 -0
- package/addon/components/vehicle/details/schedules.hbs +40 -0
- package/addon/components/vehicle/details/schedules.js +32 -0
- package/addon/components/vehicle/details/work-orders.hbs +42 -0
- package/addon/components/vehicle/details/work-orders.js +32 -0
- package/addon/components/vehicle/details.hbs +52 -0
- package/addon/components/vehicle/form.hbs +51 -0
- package/addon/components/vehicle/panel-header.hbs +19 -49
- package/addon/components/warranty/details.hbs +3 -2
- package/addon/components/warranty/form.hbs +3 -17
- package/addon/components/work-order/details.hbs +135 -40
- package/addon/components/work-order/form.hbs +178 -45
- package/addon/components/work-order/form.js +197 -4
- package/addon/components/work-order/panel-header.hbs +31 -0
- package/addon/components/work-order/panel-header.js +2 -0
- package/addon/controllers/connectivity/devices/index/details.js +1 -1
- package/addon/controllers/maintenance/equipment/index/details/index.js +0 -1
- package/addon/controllers/maintenance/equipment/index/details.js +36 -1
- package/addon/controllers/maintenance/equipment/index/edit.js +56 -1
- package/addon/controllers/maintenance/equipment/index/new.js +32 -1
- package/addon/controllers/maintenance/equipment/index.js +127 -113
- package/addon/controllers/maintenance/maintenances/index/details/index.js +3 -0
- package/addon/controllers/maintenance/maintenances/index/details.js +54 -0
- package/addon/controllers/maintenance/maintenances/index/edit.js +68 -0
- package/addon/controllers/maintenance/maintenances/index/new.js +34 -0
- package/addon/controllers/maintenance/maintenances/index.js +191 -0
- package/addon/controllers/maintenance/parts/index/details/index.js +0 -1
- package/addon/controllers/maintenance/parts/index/details.js +36 -1
- package/addon/controllers/maintenance/parts/index/edit.js +56 -1
- package/addon/controllers/maintenance/parts/index/new.js +32 -1
- package/addon/controllers/maintenance/parts/index.js +135 -113
- package/addon/controllers/maintenance/schedules/index/details.js +115 -0
- package/addon/controllers/maintenance/schedules/index/edit.js +41 -0
- package/addon/controllers/maintenance/schedules/index/new.js +33 -0
- package/addon/controllers/maintenance/schedules/index.js +280 -0
- package/addon/controllers/maintenance/work-orders/index/details.js +41 -1
- package/addon/controllers/maintenance/work-orders/index/edit.js +67 -1
- package/addon/controllers/maintenance/work-orders/index/new.js +43 -1
- package/addon/controllers/maintenance/work-orders/index.js +105 -113
- package/addon/controllers/management/drivers/index/details.js +6 -1
- package/addon/controllers/management/vehicles/index/details.js +65 -0
- package/addon/controllers/management/vehicles/index.js +18 -0
- package/addon/controllers/operations/orchestrator.js +10 -0
- package/addon/controllers/operations/orders/index.js +6 -0
- package/addon/controllers/operations/scheduler/fleet-schedule.js +341 -0
- package/addon/controllers/operations/scheduler/index.js +799 -275
- package/addon/controllers/operations/scheduler.js +21 -0
- package/addon/controllers/settings/orchestrator.js +70 -0
- package/addon/controllers/settings/scheduling.js +155 -0
- package/addon/extension.js +19 -0
- package/addon/instance-initializers/register-vroom-allocation.js +27 -0
- package/addon/models/maintenance-schedule.js +61 -0
- package/addon/routes/maintenance/equipment/index/details.js +27 -1
- package/addon/routes/maintenance/equipment/index/edit.js +27 -1
- package/addon/routes/maintenance/maintenances/index/details/index.js +3 -0
- package/addon/routes/maintenance/maintenances/index/details.js +29 -0
- package/addon/routes/maintenance/maintenances/index/edit.js +29 -0
- package/addon/routes/maintenance/maintenances/index/new.js +3 -0
- package/addon/routes/maintenance/maintenances/index.js +23 -0
- package/addon/routes/maintenance/maintenances.js +3 -0
- package/addon/routes/maintenance/parts/index/details.js +27 -1
- package/addon/routes/maintenance/parts/index/edit.js +27 -1
- package/addon/routes/maintenance/schedules/index/details/index.js +2 -0
- package/addon/routes/maintenance/schedules/index/details/work-orders.js +11 -0
- package/addon/routes/maintenance/schedules/index/details.js +25 -0
- package/addon/routes/maintenance/schedules/index/edit.js +25 -0
- package/addon/routes/maintenance/schedules/index/new.js +2 -0
- package/addon/routes/maintenance/schedules/index.js +21 -0
- package/addon/routes/maintenance/schedules.js +2 -0
- package/addon/routes/maintenance/work-orders/index/details.js +27 -1
- package/addon/routes/maintenance/work-orders/index/edit.js +27 -1
- package/addon/routes/management/vehicles/index/details/maintenance-history.js +3 -0
- package/addon/routes/management/vehicles/index/details/schedules.js +3 -0
- package/addon/routes/management/vehicles/index/details/work-orders.js +3 -0
- package/addon/routes/operations/orchestrator.js +23 -0
- package/addon/routes/operations/scheduler/fleet-schedule.js +28 -0
- package/addon/routes/operations/scheduler/index.js +48 -26
- package/addon/routes/operations/scheduler.js +14 -1
- package/addon/routes/settings/orchestrator.js +27 -0
- package/addon/routes/settings/scheduling.js +3 -0
- package/addon/routes.js +31 -1
- package/addon/services/driver-actions.js +40 -7
- package/addon/services/driver-scheduling.js +4 -1
- package/addon/services/equipment-actions.js +15 -5
- package/addon/services/leaflet-map-manager.js +14 -6
- package/addon/services/maintenance-actions.js +17 -14
- package/addon/services/maintenance-schedule-actions.js +118 -0
- package/addon/services/orchestration-engine-interface.js +49 -0
- package/addon/services/orchestration-engine.js +74 -0
- package/addon/services/order-actions.js +15 -0
- package/addon/services/order-allocation.js +116 -0
- package/addon/services/part-actions.js +12 -2
- package/addon/services/scheduling.js +316 -0
- package/addon/services/vehicle-actions.js +70 -7
- package/addon/services/vroom-allocation-engine.js +45 -0
- package/addon/services/work-order-actions.js +79 -0
- package/addon/styles/fleetops-engine.css +1658 -0
- package/addon/templates/analytics/reports/index/edit.hbs +1 -1
- package/addon/templates/analytics/reports/index/new.hbs +1 -1
- package/addon/templates/application.hbs +6 -1
- package/addon/templates/connectivity/devices/index/details/events.hbs +0 -1
- package/addon/templates/connectivity/devices.hbs +0 -1
- package/addon/templates/connectivity/events/index/details.hbs +0 -1
- package/addon/templates/connectivity/events.hbs +0 -1
- package/addon/templates/connectivity/sensors.hbs +0 -1
- package/addon/templates/connectivity/telematics/index/details/devices.hbs +0 -1
- package/addon/templates/connectivity/telematics/index/details/events.hbs +0 -1
- package/addon/templates/connectivity/telematics/index/details/sensors.hbs +0 -1
- package/addon/templates/connectivity/telematics.hbs +0 -1
- package/addon/templates/connectivity/tracking.hbs +0 -1
- package/addon/templates/connectivity.hbs +0 -1
- package/addon/templates/maintenance/equipment/index/details/index.hbs +1 -2
- package/addon/templates/maintenance/equipment/index/details.hbs +15 -2
- package/addon/templates/maintenance/equipment/index/edit.hbs +12 -2
- package/addon/templates/maintenance/equipment/index/new.hbs +1 -2
- package/addon/templates/maintenance/equipment/index.hbs +48 -13
- package/addon/templates/maintenance/equipment.hbs +0 -1
- package/addon/templates/maintenance/maintenances/index/details/index.hbs +1 -0
- package/addon/templates/maintenance/maintenances/index/details.hbs +15 -0
- package/addon/templates/maintenance/maintenances/index/edit.hbs +12 -0
- package/addon/templates/maintenance/maintenances/index/new.hbs +11 -0
- package/addon/templates/maintenance/maintenances/index.hbs +14 -0
- package/addon/templates/maintenance/maintenances.hbs +1 -0
- package/addon/templates/maintenance/parts/index/details/index.hbs +1 -2
- package/addon/templates/maintenance/parts/index/details.hbs +15 -2
- package/addon/templates/maintenance/parts/index/edit.hbs +12 -2
- package/addon/templates/maintenance/parts/index/new.hbs +1 -2
- package/addon/templates/maintenance/parts/index.hbs +48 -13
- package/addon/templates/maintenance/parts.hbs +0 -1
- package/addon/templates/maintenance/schedules/index/details/index.hbs +1 -0
- package/addon/templates/maintenance/schedules/index/details/work-orders.hbs +39 -0
- package/addon/templates/maintenance/schedules/index/details.hbs +14 -0
- package/addon/templates/maintenance/schedules/index/edit.hbs +12 -0
- package/addon/templates/maintenance/schedules/index/new.hbs +11 -0
- package/addon/templates/maintenance/schedules/index.hbs +40 -0
- package/addon/templates/maintenance/schedules.hbs +1 -0
- package/addon/templates/maintenance/work-orders/index/details.hbs +2 -1
- package/addon/templates/maintenance/work-orders/index/edit.hbs +2 -4
- package/addon/templates/maintenance/work-orders/index/new.hbs +1 -2
- package/addon/templates/maintenance/work-orders.hbs +0 -1
- package/addon/templates/management/contacts/customers/edit.hbs +1 -2
- package/addon/templates/management/contacts/customers/new.hbs +1 -2
- package/addon/templates/management/contacts/customers.hbs +1 -1
- package/addon/templates/management/contacts/index/edit.hbs +1 -2
- package/addon/templates/management/contacts/index/new.hbs +1 -2
- package/addon/templates/management/drivers/index/details/orders.hbs +0 -1
- package/addon/templates/management/drivers/index/edit.hbs +1 -2
- package/addon/templates/management/drivers/index/new.hbs +1 -2
- package/addon/templates/management/fleets/index/edit.hbs +1 -2
- package/addon/templates/management/fleets/index/new.hbs +1 -2
- package/addon/templates/management/fleets/index.hbs +1 -2
- package/addon/templates/management/fuel-reports/index/edit.hbs +1 -2
- package/addon/templates/management/fuel-reports/index/new.hbs +1 -2
- package/addon/templates/management/fuel-reports/index.hbs +1 -2
- package/addon/templates/management/issues/index/edit.hbs +1 -2
- package/addon/templates/management/issues/index/new.hbs +1 -2
- package/addon/templates/management/issues/index.hbs +1 -2
- package/addon/templates/management/places/index/details/activity.hbs +0 -1
- package/addon/templates/management/places/index/details/comments.hbs +0 -1
- package/addon/templates/management/places/index/details/documents.hbs +0 -1
- package/addon/templates/management/places/index/details/map.hbs +0 -1
- package/addon/templates/management/places/index/details/operations.hbs +0 -1
- package/addon/templates/management/places/index/details/performance.hbs +0 -1
- package/addon/templates/management/places/index/details/rules.hbs +0 -1
- package/addon/templates/management/vehicles/index/details/equipment.hbs +0 -1
- package/addon/templates/management/vehicles/index/details/maintenance-history.hbs +2 -0
- package/addon/templates/management/vehicles/index/details/schedules.hbs +2 -0
- package/addon/templates/management/vehicles/index/details/work-orders.hbs +2 -0
- package/addon/templates/management/vehicles/index/details.hbs +1 -1
- package/addon/templates/management/vehicles/index/edit.hbs +1 -2
- package/addon/templates/management/vehicles/index/new.hbs +1 -2
- package/addon/templates/management/vendors/index/edit.hbs +1 -2
- package/addon/templates/management/vendors/index/new.hbs +1 -2
- package/addon/templates/management/vendors/index.hbs +1 -2
- package/addon/templates/management/vendors/integrated.hbs +1 -2
- package/addon/templates/operations/orchestrator.hbs +1 -0
- package/addon/templates/operations/orders/index.hbs +6 -1
- package/addon/templates/operations/scheduler/fleet-schedule.hbs +41 -0
- package/addon/templates/operations/scheduler/index.hbs +147 -88
- package/addon/templates/operations/scheduler.hbs +7 -1
- package/addon/templates/settings/avatars.hbs +1 -1
- package/addon/templates/settings/orchestrator.hbs +65 -0
- package/addon/templates/settings/payments/index.hbs +1 -5
- package/addon/templates/settings/scheduling.hbs +82 -0
- package/addon/utils/create-full-calendar-event-from-order.js +52 -14
- package/addon/utils/create-full-calendar-event-from-schedule-item.js +50 -0
- package/addon/utils/fleet-ops-options.js +254 -0
- package/addon/utils/route-colors.js +99 -0
- package/addon/utils/to-calendar-date.js +70 -0
- package/app/components/driver/schedule.js +1 -0
- package/app/components/maintenance/cost-panel.js +1 -0
- package/app/components/maintenance/panel-header.js +1 -0
- package/app/components/maintenance-schedule/details.js +1 -0
- package/app/components/maintenance-schedule/form.js +1 -0
- package/app/components/modals/add-driver-shift.js +1 -0
- package/app/components/modals/bulk-assign-orders.js +1 -0
- package/app/components/modals/driver-shift.js +1 -0
- package/app/components/modals/orchestrator-import.js +1 -0
- package/app/components/modals/scheduling-conflict.js +1 -0
- package/app/components/modals/send-work-order.js +1 -0
- package/app/components/modals/set-driver-availability.js +1 -0
- package/app/components/orchestrator/card-fields-settings.js +1 -0
- package/app/components/orchestrator/order-pool.js +1 -0
- package/app/components/orchestrator/phase-builder.js +1 -0
- package/app/components/orchestrator/plan-viewer.js +1 -0
- package/app/components/orchestrator/resource-panel.js +1 -0
- package/app/components/orchestrator-workbench.js +1 -0
- package/app/components/vehicle/details/maintenance-history.js +1 -0
- package/app/components/vehicle/details/schedules.js +1 -0
- package/app/components/vehicle/details/work-orders.js +1 -0
- package/app/controllers/operations/orchestrator.js +1 -0
- package/app/controllers/settings/orchestrator.js +1 -0
- package/app/controllers/settings/scheduling.js +1 -0
- package/app/routes/operations/orchestrator.js +1 -0
- package/app/routes/settings/orchestrator.js +1 -0
- package/app/routes/settings/scheduling.js +1 -0
- package/app/services/maintenance-schedule-actions.js +1 -0
- package/app/services/orchestration-engine-interface.js +1 -0
- package/app/services/orchestration-engine.js +1 -0
- package/app/services/order-allocation.js +1 -0
- package/app/services/scheduling.js +1 -0
- package/app/services/vroom-allocation-engine.js +1 -0
- package/app/templates/settings/scheduling.js +1 -0
- package/app/utils/create-full-calendar-event-from-schedule-item.js +1 -0
- package/app/utils/route-colors.js +1 -0
- package/composer.json +4 -2
- package/extension.json +1 -1
- package/package.json +6 -5
- package/server/config/fleetops.php +20 -1
- package/server/migrations/2025_08_28_054927_create_parts_table.php +2 -2
- package/server/migrations/2025_08_28_054932_add_public_id_to_maintenance_tables.php +45 -0
- package/server/migrations/2025_09_01_000001_create_maintenance_schedules_table.php +88 -0
- package/server/migrations/2026_04_01_000001_fix_monetary_columns_in_parts_table.php +48 -0
- package/server/migrations/2026_04_01_000003_add_photo_uuid_to_equipment_and_parts_tables.php +61 -0
- package/server/migrations/2026_04_01_000004_add_public_id_to_equipments_table.php +38 -0
- package/server/migrations/2026_04_01_000005_add_missing_columns_to_parts_table.php +67 -0
- package/server/migrations/2026_04_04_000001_add_reminder_offsets_to_maintenance_schedules.php +44 -0
- package/server/migrations/2026_04_08_000001_add_orchestrator_columns_to_vehicles_table.php +53 -0
- package/server/migrations/2026_04_08_000002_add_orchestrator_columns_to_drivers_table.php +41 -0
- package/server/migrations/2026_04_08_000003_add_orchestrator_columns_to_orders_table.php +38 -0
- package/server/migrations/2026_04_08_000004_add_orchestrator_columns_to_payloads_table.php +38 -0
- package/server/migrations/2026_04_08_000005_add_orchestrator_columns_to_waypoints_table.php +38 -0
- package/server/migrations/2026_04_09_000001_create_manifests_table.php +48 -0
- package/server/migrations/2026_04_09_000002_create_manifest_stops_table.php +48 -0
- package/server/migrations/2026_04_09_000003_add_manifest_uuid_to_orders_table.php +28 -0
- package/server/migrations/2026_04_13_000001_add_pod_notes_columns_to_waypoints_table.php +39 -0
- package/server/migrations/2026_04_14_000001_drop_redundant_capacity_columns_from_payloads_table.php +42 -0
- package/server/migrations/2026_04_14_000002_rename_capacity_columns_on_vehicles_table.php +48 -0
- package/server/resources/views/mail/maintenance-schedule-reminder.blade.php +59 -0
- package/server/resources/views/mail/work-order-dispatched.blade.php +67 -0
- package/server/src/Auth/Schemas/FleetOps.php +44 -0
- package/server/src/Console/Commands/ProcessMaintenanceTriggers.php +150 -0
- package/server/src/Console/Commands/SendMaintenanceReminders.php +128 -0
- package/server/src/Http/Controllers/Api/v1/OrderController.php +15 -2
- package/server/src/Http/Controllers/Api/v1/VehicleController.php +18 -2
- package/server/src/Http/Controllers/Internal/v1/DriverController.php +1 -0
- package/server/src/Http/Controllers/Internal/v1/EquipmentController.php +27 -0
- package/server/src/Http/Controllers/Internal/v1/LiveController.php +9 -2
- package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +165 -0
- package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +304 -0
- package/server/src/Http/Controllers/Internal/v1/ManifestController.php +138 -0
- package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +975 -0
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +42 -0
- package/server/src/Http/Controllers/Internal/v1/PartController.php +27 -0
- package/server/src/Http/Controllers/Internal/v1/SettingController.php +118 -0
- package/server/src/Http/Controllers/Internal/v1/Traits/DriverSchedulingTrait.php +214 -0
- package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +68 -0
- package/server/src/Http/Resources/v1/Driver.php +1 -0
- package/server/src/Http/Resources/v1/Maintenance.php +138 -0
- package/server/src/Http/Resources/v1/MaintenanceSchedule.php +137 -0
- package/server/src/Http/Resources/v1/Orchestrator/Order.php +116 -0
- package/server/src/Http/Resources/v1/Order.php +7 -4
- package/server/src/Http/Resources/v1/Waypoint.php +7 -0
- package/server/src/Http/Resources/v1/WorkOrder.php +136 -0
- package/server/src/Imports/EquipmentImport.php +32 -0
- package/server/src/Imports/MaintenanceImport.php +32 -0
- package/server/src/Imports/MaintenanceScheduleImport.php +32 -0
- package/server/src/Imports/PartImport.php +32 -0
- package/server/src/Imports/WorkOrderImport.php +32 -0
- package/server/src/Jobs/ProcessAllocationJob.php +119 -0
- package/server/src/Listeners/HandleDeliveryCompletion.php +47 -0
- package/server/src/Listeners/NotifyDriverOnShiftChange.php +63 -0
- package/server/src/Mail/MaintenanceScheduleReminder.php +68 -0
- package/server/src/Mail/WorkOrderDispatched.php +58 -0
- package/server/src/Models/Asset.php +2 -2
- package/server/src/Models/Device.php +1 -1
- package/server/src/Models/Driver.php +82 -4
- package/server/src/Models/Equipment.php +62 -2
- package/server/src/Models/Maintenance.php +127 -9
- package/server/src/Models/MaintenanceSchedule.php +353 -0
- package/server/src/Models/Manifest.php +214 -0
- package/server/src/Models/ManifestStop.php +162 -0
- package/server/src/Models/Order.php +70 -0
- package/server/src/Models/OrderConfig.php +5 -2
- package/server/src/Models/Part.php +69 -3
- package/server/src/Models/Place.php +1 -1
- package/server/src/Models/Sensor.php +1 -1
- package/server/src/Models/ServiceQuote.php +1 -1
- package/server/src/Models/Vehicle.php +18 -1
- package/server/src/Models/Warranty.php +1 -1
- package/server/src/Models/Waypoint.php +7 -1
- package/server/src/Models/WorkOrder.php +122 -12
- package/server/src/Notifications/DriverShiftChanged.php +110 -0
- package/server/src/Observers/WorkOrderObserver.php +107 -0
- package/server/src/Orchestration/Contracts/OrchestrationEngineInterface.php +63 -0
- package/server/src/Orchestration/Engines/DriverAssignmentEngine.php +265 -0
- package/server/src/Orchestration/Engines/GreedyOrchestrationEngine.php +155 -0
- package/server/src/Orchestration/Engines/RouteSequencingEngine.php +272 -0
- package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +192 -0
- package/server/src/Orchestration/OrchestrationEngineRegistry.php +83 -0
- package/server/src/Orchestration/Support/OrchestrationPayloadBuilder.php +380 -0
- package/server/src/Providers/EventServiceProvider.php +7 -1
- package/server/src/Providers/FleetOpsServiceProvider.php +42 -15
- package/server/src/routes.php +65 -4
- package/translations/ar-ae.yml +44 -12
- package/translations/bg-bg.yaml +51 -10
- package/translations/en-us.yaml +444 -1
- package/translations/fr-fr.yaml +51 -10
- package/translations/mn-mn.yaml +51 -10
- package/translations/pt-br.yaml +51 -10
- package/translations/ru-ru.yaml +51 -10
- package/translations/vi-vn.yaml +48 -12
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
<Modal::Default @modalIsOpened={{@modalIsOpened}} @options={{@options}} @confirm={{@onConfirm}} @decline={{@onDecline}}>
|
|
2
2
|
<div class="modal-body-container">
|
|
3
|
-
<InputGroup
|
|
4
|
-
@name={{t "modals.order-config-new-status.new-status"}}
|
|
5
|
-
@value={{@options.statusName}}
|
|
6
|
-
@helpText={{t "modals.order-config-new-status.status-text"}}
|
|
7
|
-
/>
|
|
3
|
+
<InputGroup @name={{t "modals.order-config-new-status.new-status"}} @value={{@options.statusName}} @helpText={{t "modals.order-config-new-status.status-text"}} />
|
|
8
4
|
</div>
|
|
9
5
|
</Modal::Default>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<Modal::Default @modalIsOpened={{@modalIsOpened}} @options={{@options}} @confirm={{@onConfirm}} @decline={{@onDecline}}>
|
|
2
|
+
<div class="modal-body-container">
|
|
3
|
+
<div class="grid grid-cols-1 gap-4 text-xs dark:text-gray-100">
|
|
4
|
+
|
|
5
|
+
{{! ── Warning banner ─────────────────────────────────────────────── }}
|
|
6
|
+
<div class="flex items-start gap-3 rounded-lg bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-300 dark:border-yellow-700 px-3 py-3">
|
|
7
|
+
<FaIcon @icon="triangle-exclamation" class="text-yellow-500 mt-0.5 flex-shrink-0" />
|
|
8
|
+
<p class="text-yellow-800 dark:text-yellow-200 leading-relaxed">
|
|
9
|
+
{{t "scheduler.conflict-description" driverName=@options.driver.name orderTracking=@options.order.tracking}}
|
|
10
|
+
</p>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
{{! ── Conflicting events list ─────────────────────────────────────── }}
|
|
14
|
+
<div class="rounded-md border border-yellow-200 dark:border-yellow-700 overflow-hidden">
|
|
15
|
+
<div class="bg-yellow-50 dark:bg-yellow-900/20 px-3 py-2 font-semibold text-yellow-800 dark:text-yellow-300 uppercase tracking-wide">
|
|
16
|
+
{{t "scheduler.conflicting-orders"}}
|
|
17
|
+
</div>
|
|
18
|
+
<div class="divide-y divide-gray-200 dark:divide-gray-700">
|
|
19
|
+
{{#each @options.conflicts as |conflict|}}
|
|
20
|
+
<div class="flex items-center justify-between px-3 py-2">
|
|
21
|
+
<div class="flex items-center gap-2">
|
|
22
|
+
<FaIcon @icon="box" class="text-gray-400" />
|
|
23
|
+
<span class="font-medium">{{conflict.tracking}}</span>
|
|
24
|
+
</div>
|
|
25
|
+
<span class="text-gray-500 dark:text-gray-400">
|
|
26
|
+
{{conflict.scheduledAtTime}}
|
|
27
|
+
</span>
|
|
28
|
+
</div>
|
|
29
|
+
{{/each}}
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
{{! ── Resolution prompt ───────────────────────────────────────────── }}
|
|
34
|
+
<p class="text-gray-600 dark:text-gray-400">
|
|
35
|
+
{{t "scheduler.conflict-resolution-prompt"}}
|
|
36
|
+
</p>
|
|
37
|
+
|
|
38
|
+
{{! ── Resolution buttons ──────────────────────────────────────────── }}
|
|
39
|
+
<div class="flex items-center gap-2 justify-end">
|
|
40
|
+
<Button @type="default" @text={{t "common.cancel"}} @icon="times" @size="sm" @onClick={{@onDecline}} />
|
|
41
|
+
<Button @type="default" @text={{t "scheduler.auto-adjust"}} @icon="wand-magic-sparkles" @size="sm" @isLoading={{@options.isLoading}} @onClick={{this.autoAdjust}} />
|
|
42
|
+
<Button @type="danger" @text={{t "scheduler.assign-anyway"}} @icon="triangle-exclamation" @size="sm" @isLoading={{@options.isLoading}} @onClick={{this.assignAnyway}} />
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
</Modal::Default>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import Component from '@glimmer/component';
|
|
2
|
+
import { action } from '@ember/object';
|
|
3
|
+
import { inject as service } from '@ember/service';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Modals::SchedulingConflict
|
|
7
|
+
*
|
|
8
|
+
* Surfaces a scheduling conflict when an order is dragged onto a driver row
|
|
9
|
+
* that already has an overlapping event. Provides three resolution paths:
|
|
10
|
+
*
|
|
11
|
+
* 1. Cancel — close the modal, leave the order unscheduled
|
|
12
|
+
* 2. Auto-Adjust — call @options.autoAdjust to find the next available slot
|
|
13
|
+
* 3. Assign Anyway — call @options.assignAnyway to force the assignment
|
|
14
|
+
*
|
|
15
|
+
* Options accepted (set via modalsManager.show):
|
|
16
|
+
* - order {Order} The order being scheduled
|
|
17
|
+
* - driver {Driver} The target driver
|
|
18
|
+
* - conflicts {Array} Existing events that overlap the requested slot
|
|
19
|
+
* - scheduledAt {Date} The originally requested start time
|
|
20
|
+
* - autoAdjust {Function} (modalsManager, done) => Promise
|
|
21
|
+
* - assignAnyway {Function} (modalsManager, done) => Promise
|
|
22
|
+
*/
|
|
23
|
+
export default class ModalsSchedulingConflictComponent extends Component {
|
|
24
|
+
@service modalsManager;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Trigger the auto-adjust resolution path.
|
|
28
|
+
* Calls @options.autoAdjust(modalsManager, done) so the controller can
|
|
29
|
+
* start loading, find the best-fit slot, assign, and close the modal.
|
|
30
|
+
*/
|
|
31
|
+
@action
|
|
32
|
+
autoAdjust() {
|
|
33
|
+
const { autoAdjust } = this.args.options;
|
|
34
|
+
if (typeof autoAdjust === 'function') {
|
|
35
|
+
const done = () => this.modalsManager.done();
|
|
36
|
+
autoAdjust(this.modalsManager, done);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Trigger the assign-anyway resolution path.
|
|
42
|
+
* Calls @options.assignAnyway(modalsManager, done) so the controller can
|
|
43
|
+
* skip the conflict check and force the assignment.
|
|
44
|
+
*/
|
|
45
|
+
@action
|
|
46
|
+
assignAnyway() {
|
|
47
|
+
const { assignAnyway } = this.args.options;
|
|
48
|
+
if (typeof assignAnyway === 'function') {
|
|
49
|
+
const done = () => this.modalsManager.done();
|
|
50
|
+
assignAnyway(this.modalsManager, done);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
<Modal::Default @modalIsOpened={{@modalIsOpened}} @options={{@options}} @confirm={{@onConfirm}} @decline={{@onDecline}}>
|
|
2
|
+
<div class="modal-body-container">
|
|
3
|
+
<div class="text-sm text-gray-600 dark:text-gray-400 mb-4">
|
|
4
|
+
Review the details below before sending. The work order will be emailed to the assigned vendor.
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
{{! ── Work Order details ── }}
|
|
8
|
+
<div class="rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden mb-4">
|
|
9
|
+
<div class="bg-gray-50 dark:bg-gray-800 px-3 py-2 border-b border-gray-200 dark:border-gray-700">
|
|
10
|
+
<span class="text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400">Work Order</span>
|
|
11
|
+
</div>
|
|
12
|
+
<div class="px-3 py-3 space-y-2">
|
|
13
|
+
<div class="flex items-start justify-between gap-4">
|
|
14
|
+
<span class="text-xs text-gray-500 dark:text-gray-400 shrink-0 w-20">Subject</span>
|
|
15
|
+
<span class="text-xs font-medium text-gray-800 dark:text-gray-100 text-right">
|
|
16
|
+
{{n-a (or @options.workOrder.subject @options.workOrder.target_name)}}
|
|
17
|
+
</span>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="flex items-start justify-between gap-4">
|
|
20
|
+
<span class="text-xs text-gray-500 dark:text-gray-400 shrink-0 w-20">ID</span>
|
|
21
|
+
<span class="text-xs font-mono text-gray-600 dark:text-gray-300 text-right">
|
|
22
|
+
{{n-a @options.workOrder.public_id}}
|
|
23
|
+
</span>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="flex items-start justify-between gap-4">
|
|
26
|
+
<span class="text-xs text-gray-500 dark:text-gray-400 shrink-0 w-20">Status</span>
|
|
27
|
+
<span class="text-xs text-right">
|
|
28
|
+
<Badge @status={{@options.workOrder.status}}>{{smart-humanize @options.workOrder.status}}</Badge>
|
|
29
|
+
</span>
|
|
30
|
+
</div>
|
|
31
|
+
{{#if @options.workOrder.due_at}}
|
|
32
|
+
<div class="flex items-start justify-between gap-4">
|
|
33
|
+
<span class="text-xs text-gray-500 dark:text-gray-400 shrink-0 w-20">Due</span>
|
|
34
|
+
<span class="text-xs text-gray-600 dark:text-gray-300 text-right">
|
|
35
|
+
{{format-date-fns @options.workOrder.due_at}}
|
|
36
|
+
</span>
|
|
37
|
+
</div>
|
|
38
|
+
{{/if}}
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
{{! ── Recipient (vendor) details ── }}
|
|
43
|
+
<div class="rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden">
|
|
44
|
+
<div class="bg-gray-50 dark:bg-gray-800 px-3 py-2 border-b border-gray-200 dark:border-gray-700">
|
|
45
|
+
<span class="text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400">Recipient</span>
|
|
46
|
+
</div>
|
|
47
|
+
{{#if @options.vendorName}}
|
|
48
|
+
<div class="px-3 py-3 space-y-2">
|
|
49
|
+
<div class="flex items-center gap-3">
|
|
50
|
+
<div class="flex-shrink-0 w-8 h-8 rounded-full bg-blue-100 dark:bg-blue-900 flex items-center justify-center">
|
|
51
|
+
<FaIcon @icon="building" class="text-blue-500 dark:text-blue-300 text-xs" />
|
|
52
|
+
</div>
|
|
53
|
+
<div class="flex-1 min-w-0">
|
|
54
|
+
<div class="text-sm font-medium text-gray-800 dark:text-gray-100 truncate">
|
|
55
|
+
{{@options.vendorName}}
|
|
56
|
+
</div>
|
|
57
|
+
{{#if @options.vendorEmail}}
|
|
58
|
+
<div class="text-xs text-gray-500 dark:text-gray-400 truncate flex items-center gap-1 mt-0.5">
|
|
59
|
+
<FaIcon @icon="envelope" class="text-gray-400 text-[10px]" />
|
|
60
|
+
{{@options.vendorEmail}}
|
|
61
|
+
</div>
|
|
62
|
+
{{/if}}
|
|
63
|
+
{{#if @options.vendorPhone}}
|
|
64
|
+
<div class="text-xs text-gray-500 dark:text-gray-400 truncate flex items-center gap-1 mt-0.5">
|
|
65
|
+
<FaIcon @icon="phone" class="text-gray-400 text-[10px]" />
|
|
66
|
+
{{@options.vendorPhone}}
|
|
67
|
+
</div>
|
|
68
|
+
{{/if}}
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
{{else}}
|
|
73
|
+
<div class="px-3 py-3">
|
|
74
|
+
<div class="flex items-center gap-2 text-amber-600 dark:text-amber-400">
|
|
75
|
+
<FaIcon @icon="triangle-exclamation" class="text-sm" />
|
|
76
|
+
<span class="text-xs">No vendor assigned to this work order.</span>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
{{/if}}
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
{{#unless @options.vendorEmail}}
|
|
83
|
+
<div class="mt-3 flex items-start gap-2 p-3 rounded-lg bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800">
|
|
84
|
+
<FaIcon @icon="circle-exclamation" class="text-red-500 dark:text-red-400 text-sm mt-0.5 shrink-0" />
|
|
85
|
+
<span class="text-xs text-red-700 dark:text-red-300">
|
|
86
|
+
The assigned vendor does not have an email address on file. Please update the vendor record before sending.
|
|
87
|
+
</span>
|
|
88
|
+
</div>
|
|
89
|
+
{{/unless}}
|
|
90
|
+
</div>
|
|
91
|
+
</Modal::Default>
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
<Modal::Default @modalIsOpened={{@modalIsOpened}} @options={{@options}} @confirm={{@onConfirm}} @decline={{@onDecline}}>
|
|
2
2
|
<div class="modal-body-container">
|
|
3
|
-
<InputGroup
|
|
4
|
-
@value={{@options.serviceArea.name}}
|
|
5
|
-
@name={{t "modals.service-area-form.name"}}
|
|
6
|
-
@helpText={{t "modals.service-area-form.name-text"}}
|
|
7
|
-
@required={{true}}
|
|
8
|
-
/>
|
|
3
|
+
<InputGroup @value={{@options.serviceArea.name}} @name={{t "modals.service-area-form.name"}} @helpText={{t "modals.service-area-form.name-text"}} @required={{true}} />
|
|
9
4
|
<InputGroup @name={{t "modals.service-area-form.type"}} @helpText={{t "modals.service-area-form.type-text"}}>
|
|
10
5
|
<Select
|
|
11
6
|
@options={{@options.serviceAreaTypes}}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<Modal::Default @modalIsOpened={{@modalIsOpened}} @options={{@options}} @confirm={{@onConfirm}} @decline={{@onDecline}}>
|
|
2
|
+
<div class="modal-body-container">
|
|
3
|
+
<div class="grid grid-cols-1 gap-4 text-xs dark:text-gray-100">
|
|
4
|
+
|
|
5
|
+
{{! Availability type selection }}
|
|
6
|
+
<div class="input-group">
|
|
7
|
+
<label>{{t "scheduler.availability-type"}}</label>
|
|
8
|
+
<div class="flex gap-3 mt-1">
|
|
9
|
+
<button type="button" class="availability-type-btn {{if this.isAvailable 'is-selected-available' 'is-unselected'}}" {{on "click" (fn this.toggleAvailability true)}}>
|
|
10
|
+
<FaIcon @icon="circle-check" />
|
|
11
|
+
{{t "scheduler.available"}}
|
|
12
|
+
</button>
|
|
13
|
+
<button
|
|
14
|
+
type="button"
|
|
15
|
+
class="availability-type-btn {{unless this.isAvailable 'is-selected-unavailable' 'is-unselected'}}"
|
|
16
|
+
{{on "click" (fn this.toggleAvailability false)}}
|
|
17
|
+
>
|
|
18
|
+
<FaIcon @icon="circle-xmark" />
|
|
19
|
+
{{t "scheduler.unavailable-time-off"}}
|
|
20
|
+
</button>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
{{! Date range }}
|
|
25
|
+
<div class="grid grid-cols-2 gap-4">
|
|
26
|
+
<div class="input-group">
|
|
27
|
+
<label>{{t "scheduler.start-date"}}</label>
|
|
28
|
+
<DateTimeInput @value={{@options.startAt}} @onChange={{this.updateStartAt}} placeholder={{t "scheduler.select-start-date"}} class="w-full form-input" />
|
|
29
|
+
</div>
|
|
30
|
+
<div class="input-group">
|
|
31
|
+
<label>{{t "scheduler.end-date"}}</label>
|
|
32
|
+
<DateTimeInput @value={{@options.endAt}} @onChange={{this.updateEndAt}} placeholder={{t "scheduler.select-end-date"}} class="w-full form-input" />
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
{{! Reason }}
|
|
37
|
+
<div class="input-group">
|
|
38
|
+
<label>{{t "scheduler.reason"}} <span class="text-gray-400">({{t "common.optional"}})</span></label>
|
|
39
|
+
<Input @value={{@options.reason}} @type="text" placeholder={{t "scheduler.reason-placeholder"}} class="w-full form-input" />
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
{{! Notes }}
|
|
43
|
+
<div class="input-group">
|
|
44
|
+
<label>{{t "common.notes"}}</label>
|
|
45
|
+
<Textarea @value={{@options.notes}} placeholder={{t "scheduler.notes-placeholder"}} class="w-full form-input" rows="3" />
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
</Modal::Default>
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import Component from '@glimmer/component';
|
|
2
|
+
import { tracked } from '@glimmer/tracking';
|
|
3
|
+
import { action } from '@ember/object';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Modals::SetDriverAvailability
|
|
7
|
+
*
|
|
8
|
+
* Shared modal for both "Set Availability" (is_available=true) and
|
|
9
|
+
* "Request Time Off" (is_available=false) flows. The caller controls
|
|
10
|
+
* the initial value of `isAvailable` via modal options.
|
|
11
|
+
*
|
|
12
|
+
* Plain text/textarea inputs bind @value directly to @options — Ember's
|
|
13
|
+
* two-way binding keeps them in sync without manual update actions.
|
|
14
|
+
* DateTimeInput still uses @onChange because it emits a processed value.
|
|
15
|
+
*
|
|
16
|
+
* @example (from driver/schedule.js)
|
|
17
|
+
* this.modalsManager.show('modals/set-driver-availability', {
|
|
18
|
+
* isAvailable: false,
|
|
19
|
+
* confirm: async (modal) => { ... }
|
|
20
|
+
* });
|
|
21
|
+
*/
|
|
22
|
+
export default class ModalsSetDriverAvailabilityComponent extends Component {
|
|
23
|
+
// isAvailable drives the button selection UI — must stay tracked
|
|
24
|
+
@tracked isAvailable = true;
|
|
25
|
+
|
|
26
|
+
constructor() {
|
|
27
|
+
super(...arguments);
|
|
28
|
+
const opts = this.args.options;
|
|
29
|
+
|
|
30
|
+
// Seed all fields onto @options so the template can bind @value directly
|
|
31
|
+
// and the confirm callback reads them back without any sync actions.
|
|
32
|
+
opts.startAt = opts.startAt ?? null;
|
|
33
|
+
opts.endAt = opts.endAt ?? null;
|
|
34
|
+
opts.reason = opts.reason ?? '';
|
|
35
|
+
opts.notes = opts.notes ?? '';
|
|
36
|
+
|
|
37
|
+
this.isAvailable = opts.isAvailable ?? true;
|
|
38
|
+
opts.isAvailable = this.isAvailable;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// DateTimeInput emits a processed value — needs @onChange
|
|
42
|
+
@action
|
|
43
|
+
updateStartAt(value) {
|
|
44
|
+
this.args.options.startAt = value;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@action
|
|
48
|
+
updateEndAt(value) {
|
|
49
|
+
this.args.options.endAt = value;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@action
|
|
53
|
+
toggleAvailability(value) {
|
|
54
|
+
this.isAvailable = value;
|
|
55
|
+
this.args.options.isAvailable = value;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -42,13 +42,7 @@
|
|
|
42
42
|
{{activity.details}}
|
|
43
43
|
|
|
44
44
|
{{#if (eq activity.code "dispatched")}}
|
|
45
|
-
<InfoBlock
|
|
46
|
-
@type="warning"
|
|
47
|
-
@size="xs"
|
|
48
|
-
@icon="exclamation-triangle"
|
|
49
|
-
@text={{t "modals.order-new-activity.dispatch"}}
|
|
50
|
-
class="mt-1"
|
|
51
|
-
/>
|
|
45
|
+
<InfoBlock @type="warning" @size="xs" @icon="exclamation-triangle" @text={{t "modals.order-new-activity.dispatch"}} class="mt-1" />
|
|
52
46
|
{{/if}}
|
|
53
47
|
</span>
|
|
54
48
|
</label>
|
|
@@ -72,10 +66,20 @@
|
|
|
72
66
|
<label for="activity_custom" class="ml-3 flex flex-col cursor-pointer w-full pr-5">
|
|
73
67
|
<div class="font-semibold text-sm mb-1">Add custom activity</div>
|
|
74
68
|
<span class="block text-sm font-medium">
|
|
75
|
-
<Input
|
|
69
|
+
<Input
|
|
70
|
+
@type="text"
|
|
71
|
+
@value={{this.customActivity.status}}
|
|
72
|
+
class="form-input form-input-sm w-full rounded-b-none"
|
|
73
|
+
placeholder={{t "modals.order-new-activity.status"}}
|
|
74
|
+
/>
|
|
76
75
|
</span>
|
|
77
76
|
<span class="block text-sm">
|
|
78
|
-
<Input
|
|
77
|
+
<Input
|
|
78
|
+
@type="text"
|
|
79
|
+
@value={{this.customActivity.details}}
|
|
80
|
+
class="form-input form-input-sm w-full rounded-t-none"
|
|
81
|
+
placeholder={{t "modals.order-new-activity.details"}}
|
|
82
|
+
/>
|
|
79
83
|
</span>
|
|
80
84
|
</label>
|
|
81
85
|
<div>
|
|
@@ -46,11 +46,7 @@
|
|
|
46
46
|
<label>
|
|
47
47
|
{{t "common.country"}}
|
|
48
48
|
</label>
|
|
49
|
-
<CountrySelect
|
|
50
|
-
class="w-full form-input form-select form-datalist"
|
|
51
|
-
@value={{@options.user.country}}
|
|
52
|
-
@onChange={{fn (mut @options.user.country)}}
|
|
53
|
-
/>
|
|
49
|
+
<CountrySelect class="w-full form-input form-select form-datalist" @value={{@options.user.country}} @onChange={{fn (mut @options.user.country)}} />
|
|
54
50
|
</div>
|
|
55
51
|
</div>
|
|
56
52
|
</div>
|
|
@@ -105,12 +105,7 @@
|
|
|
105
105
|
<label>
|
|
106
106
|
{{t "modals.vehicle-details.acceleration"}}
|
|
107
107
|
</label>
|
|
108
|
-
<Input
|
|
109
|
-
@value={{@options.vehicle.model_0_to_100_kph}}
|
|
110
|
-
@type="text"
|
|
111
|
-
class="w-full form-input"
|
|
112
|
-
placeholder={{t "modals.vehicle-details.acceleration"}}
|
|
113
|
-
/>
|
|
108
|
+
<Input @value={{@options.vehicle.model_0_to_100_kph}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-details.acceleration"}} />
|
|
114
109
|
</div>
|
|
115
110
|
|
|
116
111
|
<div class="input-group mb-2">
|
|
@@ -152,24 +147,14 @@
|
|
|
152
147
|
<label>
|
|
153
148
|
{{t "modals.vehicle-details.top-speed"}}
|
|
154
149
|
</label>
|
|
155
|
-
<Input
|
|
156
|
-
@value={{@options.vehicle.model_top_speed_kph}}
|
|
157
|
-
@type="text"
|
|
158
|
-
class="w-full form-input"
|
|
159
|
-
placeholder={{t "modals.vehicle-form.top-speed"}}
|
|
160
|
-
/>
|
|
150
|
+
<Input @value={{@options.vehicle.model_top_speed_kph}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-form.top-speed"}} />
|
|
161
151
|
</div>
|
|
162
152
|
|
|
163
153
|
<div class="input-group mb-2">
|
|
164
154
|
<label>
|
|
165
155
|
{{t "modals.vehicle-details.transmission"}}
|
|
166
156
|
</label>
|
|
167
|
-
<Input
|
|
168
|
-
@value={{@options.vehicle.model_transmission_type}}
|
|
169
|
-
@type="text"
|
|
170
|
-
class="w-full form-input"
|
|
171
|
-
placeholder={{t "modals.vehicle-form.transmission"}}
|
|
172
|
-
/>
|
|
157
|
+
<Input @value={{@options.vehicle.model_transmission_type}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-form.transmission"}} />
|
|
173
158
|
</div>
|
|
174
159
|
|
|
175
160
|
<div class="input-group mb-2">
|
|
@@ -183,12 +168,7 @@
|
|
|
183
168
|
<label>
|
|
184
169
|
{{t "modals.vehicle-details.wheelbase"}}
|
|
185
170
|
</label>
|
|
186
|
-
<Input
|
|
187
|
-
@value={{@options.vehicle.model_wheelbase_mm}}
|
|
188
|
-
@type="text"
|
|
189
|
-
class="w-full form-input"
|
|
190
|
-
placeholder={{t "modals.vehicle-form.wheelbase"}}
|
|
191
|
-
/>
|
|
171
|
+
<Input @value={{@options.vehicle.model_wheelbase_mm}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-form.wheelbase"}} />
|
|
192
172
|
</div>
|
|
193
173
|
|
|
194
174
|
<div class="input-group mb-2">
|
|
@@ -206,12 +186,7 @@
|
|
|
206
186
|
<label>
|
|
207
187
|
{{t "modals.vehicle-details.engine-bore"}}
|
|
208
188
|
</label>
|
|
209
|
-
<Input
|
|
210
|
-
@value={{@options.vehicle.model_engine_bore_mm}}
|
|
211
|
-
@type="text"
|
|
212
|
-
class="w-full form-input"
|
|
213
|
-
placeholder={{t "modals.vehicle-form.engine-bore"}}
|
|
214
|
-
/>
|
|
189
|
+
<Input @value={{@options.vehicle.model_engine_bore_mm}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-form.engine-bore"}} />
|
|
215
190
|
</div>
|
|
216
191
|
|
|
217
192
|
<div class="input-group mb-2">
|
|
@@ -225,12 +200,7 @@
|
|
|
225
200
|
<label>
|
|
226
201
|
{{t "modals.vehicle-details.compression"}}
|
|
227
202
|
</label>
|
|
228
|
-
<Input
|
|
229
|
-
@value={{@options.vehicle.model_engine_compression}}
|
|
230
|
-
@type="text"
|
|
231
|
-
class="w-full form-input"
|
|
232
|
-
placeholder={{t "modals.vehicle-form.compression"}}
|
|
233
|
-
/>
|
|
203
|
+
<Input @value={{@options.vehicle.model_engine_compression}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-form.compression"}} />
|
|
234
204
|
</div>
|
|
235
205
|
|
|
236
206
|
<div class="input-group mb-2">
|
|
@@ -244,84 +214,49 @@
|
|
|
244
214
|
<label>
|
|
245
215
|
{{t "modals.vehicle-details.position"}}
|
|
246
216
|
</label>
|
|
247
|
-
<Input
|
|
248
|
-
@value={{@options.vehicle.model_engine_position}}
|
|
249
|
-
@type="text"
|
|
250
|
-
class="w-full form-input"
|
|
251
|
-
placeholder={{t "modals.vehicle-form.position"}}
|
|
252
|
-
/>
|
|
217
|
+
<Input @value={{@options.vehicle.model_engine_position}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-form.position"}} />
|
|
253
218
|
</div>
|
|
254
219
|
|
|
255
220
|
<div class="input-group mb-2">
|
|
256
221
|
<label>
|
|
257
222
|
{{t "modals.vehicle-details.power-ps"}}
|
|
258
223
|
</label>
|
|
259
|
-
<Input
|
|
260
|
-
@value={{@options.vehicle.model_engine_power_ps}}
|
|
261
|
-
@type="text"
|
|
262
|
-
class="w-full form-input"
|
|
263
|
-
placeholder={{t "modals.vehicle-form.power-ps"}}
|
|
264
|
-
/>
|
|
224
|
+
<Input @value={{@options.vehicle.model_engine_power_ps}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-form.power-ps"}} />
|
|
265
225
|
</div>
|
|
266
226
|
|
|
267
227
|
<div class="input-group mb-2">
|
|
268
228
|
<label>
|
|
269
229
|
{{t "modals.vehicle-details.power-rpm"}}
|
|
270
230
|
</label>
|
|
271
|
-
<Input
|
|
272
|
-
@value={{@options.vehicle.model_engine_power_rpm}}
|
|
273
|
-
@type="text"
|
|
274
|
-
class="w-full form-input"
|
|
275
|
-
placeholder={{t "modals.vehicle-form.power-rpm"}}
|
|
276
|
-
/>
|
|
231
|
+
<Input @value={{@options.vehicle.model_engine_power_rpm}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-form.power-rpm"}} />
|
|
277
232
|
</div>
|
|
278
233
|
|
|
279
234
|
<div class="input-group mb-2">
|
|
280
235
|
<label>
|
|
281
236
|
{{t "modals.vehicle-details.stroke"}}
|
|
282
237
|
</label>
|
|
283
|
-
<Input
|
|
284
|
-
@value={{@options.vehicle.model_engine_stroke_mm}}
|
|
285
|
-
@type="text"
|
|
286
|
-
class="w-full form-input"
|
|
287
|
-
placeholder={{t "modals.vehicle-form.stroke"}}
|
|
288
|
-
/>
|
|
238
|
+
<Input @value={{@options.vehicle.model_engine_stroke_mm}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-form.stroke"}} />
|
|
289
239
|
</div>
|
|
290
240
|
|
|
291
241
|
<div class="input-group mb-2">
|
|
292
242
|
<label>
|
|
293
243
|
{{t "modals.vehicle-details.torque-nm"}}
|
|
294
244
|
</label>
|
|
295
|
-
<Input
|
|
296
|
-
@value={{@options.vehicle.model_engine_torque_nm}}
|
|
297
|
-
@type="text"
|
|
298
|
-
class="w-full form-input"
|
|
299
|
-
placeholder={{t "modals.vehicle-form.torque-nm"}}
|
|
300
|
-
/>
|
|
245
|
+
<Input @value={{@options.vehicle.model_engine_torque_nm}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-form.torque-nm"}} />
|
|
301
246
|
</div>
|
|
302
247
|
|
|
303
248
|
<div class="input-group mb-2">
|
|
304
249
|
<label>
|
|
305
250
|
{{t "modals.vehicle-details.torque-rpm"}}
|
|
306
251
|
</label>
|
|
307
|
-
<Input
|
|
308
|
-
@value={{@options.vehicle.model_engine_torque_rpm}}
|
|
309
|
-
@type="text"
|
|
310
|
-
class="w-full form-input"
|
|
311
|
-
placeholder={{t "modals.vehicle-form.torque-rpm"}}
|
|
312
|
-
/>
|
|
252
|
+
<Input @value={{@options.vehicle.model_engine_torque_rpm}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-form.torque-rpm"}} />
|
|
313
253
|
</div>
|
|
314
254
|
|
|
315
255
|
<div class="input-group mb-2">
|
|
316
256
|
<label>
|
|
317
257
|
{{t "modals.vehicle-details.valves"}}
|
|
318
258
|
</label>
|
|
319
|
-
<Input
|
|
320
|
-
@value={{@options.vehicle.model_engine_valves_per_cyl}}
|
|
321
|
-
@type="text"
|
|
322
|
-
class="w-full form-input"
|
|
323
|
-
placeholder={{t "modals.vehicle-details.valves"}}
|
|
324
|
-
/>
|
|
259
|
+
<Input @value={{@options.vehicle.model_engine_valves_per_cyl}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-details.valves"}} />
|
|
325
260
|
</div>
|
|
326
261
|
</div>
|
|
327
262
|
</ContentPanel>
|
|
@@ -332,12 +267,7 @@
|
|
|
332
267
|
<label>
|
|
333
268
|
{{t "modals.vehicle-details.fuel"}}
|
|
334
269
|
</label>
|
|
335
|
-
<Input
|
|
336
|
-
@value={{@options.vehicle.model_engine_fuel}}
|
|
337
|
-
@type="text"
|
|
338
|
-
class="w-full form-input"
|
|
339
|
-
placeholder={{t "modals.vehicle-form.fuel-type"}}
|
|
340
|
-
/>
|
|
270
|
+
<Input @value={{@options.vehicle.model_engine_fuel}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-form.fuel-type"}} />
|
|
341
271
|
</div>
|
|
342
272
|
|
|
343
273
|
<div class="input-group mb-2">
|
|
@@ -351,36 +281,21 @@
|
|
|
351
281
|
<label>
|
|
352
282
|
{{t "modals.vehicle-details.liters-city"}}
|
|
353
283
|
</label>
|
|
354
|
-
<Input
|
|
355
|
-
@value={{@options.vehicle.model_lkm_city}}
|
|
356
|
-
@type="text"
|
|
357
|
-
class="w-full form-input"
|
|
358
|
-
placeholder={{t "modals.vehicle-details.liters-city"}}
|
|
359
|
-
/>
|
|
284
|
+
<Input @value={{@options.vehicle.model_lkm_city}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-details.liters-city"}} />
|
|
360
285
|
</div>
|
|
361
286
|
|
|
362
287
|
<div class="input-group mb-2">
|
|
363
288
|
<label>
|
|
364
289
|
{{t "modals.vehicle-details.liters-highway"}}
|
|
365
290
|
</label>
|
|
366
|
-
<Input
|
|
367
|
-
@value={{@options.vehicle.model_lkm_hwy}}
|
|
368
|
-
@type="text"
|
|
369
|
-
class="w-full form-input"
|
|
370
|
-
placeholder={{t "modals.vehicle-details.liters-highway"}}
|
|
371
|
-
/>
|
|
291
|
+
<Input @value={{@options.vehicle.model_lkm_hwy}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-details.liters-highway"}} />
|
|
372
292
|
</div>
|
|
373
293
|
|
|
374
294
|
<div class="input-group mb-2">
|
|
375
295
|
<label>
|
|
376
296
|
{{t "modals.vehicle-details.liters-mixed"}}
|
|
377
297
|
</label>
|
|
378
|
-
<Input
|
|
379
|
-
@value={{@options.vehicle.model_lkm_mixed}}
|
|
380
|
-
@type="text"
|
|
381
|
-
class="w-full form-input"
|
|
382
|
-
placeholder={{t "modals.vehicle-details.liters-mixed"}}
|
|
383
|
-
/>
|
|
298
|
+
<Input @value={{@options.vehicle.model_lkm_mixed}} @type="text" class="w-full form-input" placeholder={{t "modals.vehicle-details.liters-mixed"}} />
|
|
384
299
|
</div>
|
|
385
300
|
</div>
|
|
386
301
|
</ContentPanel>
|