@fleetbase/fleetops-engine 0.6.56 → 0.6.57

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/ai/create-order-preview.hbs +297 -0
  2. package/addon/components/ai/create-order-preview.js +362 -0
  3. package/addon/components/ai/route-preview-map.hbs +79 -0
  4. package/addon/components/ai/route-preview-map.js +527 -0
  5. package/addon/components/fleet/details.hbs +21 -8
  6. package/addon/components/fleet/details.js +55 -1
  7. package/addon/components/fleet/hierarchy-tree.hbs +137 -0
  8. package/addon/components/fleet/hierarchy-tree.js +528 -0
  9. package/addon/components/map/drawer/device-event-listing.js +1 -0
  10. package/addon/components/map/drawer/driver-listing.js +1 -0
  11. package/addon/components/map/drawer/place-listing.js +1 -0
  12. package/addon/components/map/drawer/vehicle-listing.js +1 -0
  13. package/addon/components/order/details.hbs +34 -1
  14. package/addon/components/order/form/details.hbs +4 -0
  15. package/addon/components/order/form.hbs +9 -1
  16. package/addon/components/vehicle/card.hbs +14 -2
  17. package/addon/components/vehicle/form.hbs +13 -1
  18. package/addon/controllers/settings/map.js +4 -0
  19. package/addon/extension.js +14 -0
  20. package/addon/routes/management/fleets/index/details.js +1 -1
  21. package/addon/services/map-adapter/google.js +56 -16
  22. package/addon/services/map-manager.js +12 -0
  23. package/addon/styles/fleetops-engine.css +487 -1
  24. package/addon/utils/map-drawer-dropdown-position.js +11 -13
  25. package/app/components/ai/create-order-preview.js +1 -0
  26. package/app/components/ai/route-preview-map.js +1 -0
  27. package/app/components/fleet/hierarchy-tree.js +1 -0
  28. package/app/services/route-engine.js +1 -0
  29. package/composer.json +1 -1
  30. package/extension.json +1 -1
  31. package/package.json +6 -4
  32. package/scripts/normalize-rgba-alpha.js +90 -0
  33. package/server/src/Http/Resources/v1/Fleet.php +8 -2
  34. package/server/src/Models/Driver.php +6 -0
  35. package/server/src/Models/Order.php +18 -6
  36. package/server/src/Models/Place.php +11 -3
  37. package/server/src/Providers/FleetOpsServiceProvider.php +26 -0
  38. package/server/src/Support/Ai/Capabilities/AbstractFleetOpsAICapability.php +88 -0
  39. package/server/src/Support/Ai/Capabilities/AssetStatusCapability.php +108 -0
  40. package/server/src/Support/Ai/Capabilities/ConsoleNavigationCapability.php +55 -0
  41. package/server/src/Support/Ai/Capabilities/CreateOrderPreviewCapability.php +508 -0
  42. package/server/src/Support/Ai/Capabilities/DocsHelpCapability.php +49 -0
  43. package/server/src/Support/Ai/Capabilities/ImportOrdersPreviewCapability.php +66 -0
  44. package/server/src/Support/Ai/Capabilities/OperationalQueryCapability.php +319 -0
  45. package/server/src/Support/Ai/Capabilities/OptimizeOrderRouteCapability.php +240 -0
  46. package/server/src/Support/Ai/Capabilities/OrderInsightsCapability.php +95 -0
  47. package/server/src/Support/Ai/Capabilities/SearchResourcesCapability.php +195 -0
  48. package/server/src/Support/Ai/FleetOpsAiQueryResources.php +150 -0
  49. package/server/src/Support/Utils.php +52 -0
  50. package/server/tests/AiCreateOrderPreviewCapabilityTest.php +131 -0
  51. package/server/tests/AiOperationalQueryCapabilityTest.php +75 -0
  52. package/server/tests/FleetHierarchyResourceTest.php +12 -0
  53. package/server/tests/OrderPayloadPlaceResolutionTest.php +53 -0
  54. package/server/tests/PointResolutionTest.php +63 -0
  55. package/addon/components/table/cell/dropdown/action-item.hbs +0 -31
  56. package/addon/components/table/cell/dropdown/action-item.js +0 -62
  57. package/addon/components/table/cell/dropdown.hbs +0 -28
  58. package/addon/components/table/cell/dropdown.js +0 -91
  59. package/app/components/table/cell/dropdown/action-item.js +0 -1
  60. package/app/components/table/cell/dropdown.js +0 -1
@@ -1,4 +1,3 @@
1
- /* stylelint-disable alpha-value-notation -- Fleet-Ops lazy engine production CSS is minified by legacy clean-css, which corrupts comma-form rgba() percent alpha values. */
2
1
  .scheduler-left-sidebar {
3
2
  border-right: 1px rgb(229 231 235 / 100%) solid;
4
3
  height: 100vh;
@@ -2242,6 +2241,20 @@ body[data-theme='dark'] .fleet-ops-operations-monitor-divider::before {
2242
2241
  padding-left: 2.75rem !important;
2243
2242
  }
2244
2243
 
2244
+ .fleet-hierarchy-tree-row-depth-1 {
2245
+ padding-left: 1.5rem !important;
2246
+ }
2247
+
2248
+ .fleet-hierarchy-tree-row-depth-2 {
2249
+ padding-left: 2.5rem !important;
2250
+ }
2251
+
2252
+ .fleet-hierarchy-tree-row-depth-3,
2253
+ .fleet-hierarchy-tree-row-depth-4,
2254
+ .fleet-hierarchy-tree-row-depth-5 {
2255
+ padding-left: 3.5rem !important;
2256
+ }
2257
+
2245
2258
  .fleet-ops-operations-monitor-child-row {
2246
2259
  margin-top: -0.125rem;
2247
2260
  }
@@ -8049,3 +8062,476 @@ body[data-theme='dark'] .issue-timeline-card time,
8049
8062
  body[data-theme='dark'] .issue-timeline-card p {
8050
8063
  color: #d1d5db;
8051
8064
  }
8065
+
8066
+ .fleetbase-ai-create-order-preview {
8067
+ display: flex;
8068
+ flex-direction: column;
8069
+ gap: 8px;
8070
+ padding: 8px;
8071
+ }
8072
+
8073
+ .fleetbase-ai-create-order-preview__header {
8074
+ display: flex;
8075
+ align-items: flex-start;
8076
+ justify-content: space-between;
8077
+ gap: 8px;
8078
+ }
8079
+
8080
+ .fleetbase-ai-create-order-preview__map {
8081
+ position: relative;
8082
+ overflow: hidden;
8083
+ border: 1px solid rgb(148 163 184 / 20%);
8084
+ border-radius: 7px;
8085
+ background: rgb(15 23 42 / 5%);
8086
+ }
8087
+
8088
+ .fleetbase-ai-create-order-preview__leaflet,
8089
+ .fleetbase-ai-create-order-preview__google,
8090
+ .fleetbase-ai-create-order-preview__empty-map {
8091
+ width: 100%;
8092
+ height: 190px;
8093
+ }
8094
+
8095
+ .fleetbase-ai-create-order-preview__empty-map {
8096
+ display: flex;
8097
+ align-items: center;
8098
+ justify-content: center;
8099
+ gap: 8px;
8100
+ color: #64748b;
8101
+ font-size: 12px;
8102
+ }
8103
+
8104
+ .fleetbase-ai-create-order-preview__map-status {
8105
+ position: absolute;
8106
+ right: 8px;
8107
+ bottom: 8px;
8108
+ display: inline-flex;
8109
+ align-items: center;
8110
+ gap: 6px;
8111
+ border: 1px solid rgb(255 255 255 / 28%);
8112
+ border-radius: 999px;
8113
+ background: rgb(15 23 42 / 62%);
8114
+ padding: 4px 8px;
8115
+ color: #f8fafc;
8116
+ font-size: 11px;
8117
+ line-height: 1;
8118
+ backdrop-filter: blur(5px);
8119
+ }
8120
+
8121
+ .fleetbase-ai-create-order-preview__map-status--error {
8122
+ border-color: rgb(245 158 11 / 32%);
8123
+ background: rgb(120 53 15 / 64%);
8124
+ }
8125
+
8126
+ .fleetbase-ai-create-order-preview__fields {
8127
+ display: grid;
8128
+ grid-template-columns: repeat(2, minmax(0, 1fr));
8129
+ gap: 4px 8px;
8130
+ }
8131
+
8132
+ .fleetbase-ai-create-order-preview__field-row {
8133
+ display: flex;
8134
+ min-width: 0;
8135
+ align-items: center;
8136
+ justify-content: space-between;
8137
+ gap: 6px;
8138
+ border-radius: 7px;
8139
+ padding: 5px 6px;
8140
+ transition:
8141
+ background 120ms ease,
8142
+ box-shadow 120ms ease;
8143
+ }
8144
+
8145
+ .fleetbase-ai-create-order-preview__field-row:hover,
8146
+ .fleetbase-ai-create-order-preview__field-row:focus-within {
8147
+ background: rgb(255 255 255 / 20%);
8148
+ box-shadow: inset 0 0 0 1px rgb(148 163 184 / 14%);
8149
+ }
8150
+
8151
+ .fleetbase-ai-create-order-preview__field-row--notes {
8152
+ grid-column: 1 / -1;
8153
+ }
8154
+
8155
+ .fleetbase-ai-create-order-preview__field-copy {
8156
+ min-width: 0;
8157
+ flex: 1 1 auto;
8158
+ }
8159
+
8160
+ .fleetbase-ai-create-order-preview__field-copy > span {
8161
+ display: block;
8162
+ margin-bottom: 1px;
8163
+ color: #64748b;
8164
+ font-size: 10px;
8165
+ font-weight: 700;
8166
+ letter-spacing: 0;
8167
+ line-height: 1.1;
8168
+ text-transform: uppercase;
8169
+ }
8170
+
8171
+ .fleetbase-ai-create-order-preview__field-copy > strong {
8172
+ display: block;
8173
+ overflow: hidden;
8174
+ color: #0f172a;
8175
+ font-size: 12px;
8176
+ font-weight: 650;
8177
+ line-height: 1.25;
8178
+ text-overflow: ellipsis;
8179
+ white-space: nowrap;
8180
+ }
8181
+
8182
+ .fleetbase-ai-create-order-preview__field-row--notes .fleetbase-ai-create-order-preview__field-copy > strong {
8183
+ white-space: normal;
8184
+ }
8185
+
8186
+ .fleetbase-ai-create-order-preview__edit-wrapper {
8187
+ width: 24px;
8188
+ height: 24px;
8189
+ flex: 0 0 24px;
8190
+ box-shadow: none;
8191
+ }
8192
+
8193
+ .fleetbase-ai-create-order-preview__edit-button {
8194
+ display: inline-flex;
8195
+ width: 24px;
8196
+ height: 24px;
8197
+ align-items: center;
8198
+ justify-content: center;
8199
+ border: 0;
8200
+ border-radius: 6px;
8201
+ color: #64748b;
8202
+ }
8203
+
8204
+ .fleetbase-ai-create-order-preview__edit-button:hover {
8205
+ background: rgb(148 163 184 / 16%);
8206
+ color: #2563eb;
8207
+ }
8208
+
8209
+ .fleetbase-ai-create-order-preview__inline-select,
8210
+ .fleetbase-ai-create-order-preview__inline-native-select,
8211
+ .fleetbase-ai-create-order-preview__inline-datetime,
8212
+ .fleetbase-ai-create-order-preview__inline-textarea {
8213
+ width: 100%;
8214
+ min-height: 24px;
8215
+ border: 0;
8216
+ background: transparent;
8217
+ color: #0f172a;
8218
+ font-size: 12px;
8219
+ line-height: 1.25;
8220
+ outline: 0;
8221
+ box-shadow: none;
8222
+ }
8223
+
8224
+ .fleetbase-ai-create-order-preview__inline-select.ember-power-select-trigger {
8225
+ display: flex;
8226
+ min-height: 24px;
8227
+ align-items: center;
8228
+ border: 0;
8229
+ border-radius: 0;
8230
+ background: transparent;
8231
+ padding: 0;
8232
+ color: #0f172a;
8233
+ box-shadow: none;
8234
+ }
8235
+
8236
+ .fleetbase-ai-create-order-preview .ember-power-select-trigger,
8237
+ .fleetbase-ai-create-order-preview .ember-basic-dropdown-trigger,
8238
+ .fleetbase-ai-create-order-preview .ember-model-select,
8239
+ .fleetbase-ai-create-order-preview .fleetbase-model-select,
8240
+ .fleetbase-ai-create-order-preview .ember-power-select-status-icon,
8241
+ .fleetbase-ai-create-order-preview .ember-power-select-clear-btn {
8242
+ border: 0;
8243
+ background: transparent;
8244
+ box-shadow: none;
8245
+ }
8246
+
8247
+ .fleetbase-ai-create-order-preview .ember-power-select-trigger {
8248
+ min-height: 24px;
8249
+ padding: 0;
8250
+ }
8251
+
8252
+ .fleetbase-ai-create-order-preview .ember-power-select-status-icon {
8253
+ right: 0;
8254
+ width: 12px;
8255
+ height: 12px;
8256
+ }
8257
+
8258
+ .fleetbase-ai-create-order-preview .ember-power-select-clear-btn {
8259
+ right: 14px;
8260
+ color: #94a3b8;
8261
+ }
8262
+
8263
+ .fleetbase-ai-create-order-preview .ember-power-select-search-input,
8264
+ .fleetbase-ai-create-order-preview .ember-power-select-search-input:focus {
8265
+ border: 0;
8266
+ background: transparent;
8267
+ color: inherit;
8268
+ outline: 0;
8269
+ box-shadow: none;
8270
+ }
8271
+
8272
+ .fleetbase-ai-create-order-preview__inline-select .ember-power-select-selected-item,
8273
+ .fleetbase-ai-create-order-preview__inline-select .ember-power-select-placeholder {
8274
+ overflow: hidden;
8275
+ margin-left: 0;
8276
+ margin-right: 16px;
8277
+ color: inherit;
8278
+ font-size: 12px;
8279
+ line-height: 1.25;
8280
+ text-overflow: ellipsis;
8281
+ white-space: nowrap;
8282
+ }
8283
+
8284
+ .fleetbase-ai-create-order-preview__inline-native-select {
8285
+ width: auto;
8286
+ max-width: 150px;
8287
+ appearance: none;
8288
+ border-radius: 0;
8289
+ padding: 0 16px 0 0;
8290
+ font-weight: 650;
8291
+ cursor: pointer;
8292
+ }
8293
+
8294
+ .fleetbase-ai-create-order-preview__inline-textarea {
8295
+ resize: vertical;
8296
+ }
8297
+
8298
+ .fleetbase-ai-create-order-preview__inline-datetime,
8299
+ .fleetbase-ai-create-order-preview__inline-datetime input {
8300
+ border: 0;
8301
+ background: transparent;
8302
+ padding: 0;
8303
+ color: inherit;
8304
+ font-size: 12px;
8305
+ line-height: 1.25;
8306
+ outline: 0;
8307
+ box-shadow: none;
8308
+ }
8309
+
8310
+ .fleetbase-ai-create-order-preview__inline-datetime {
8311
+ display: grid;
8312
+ grid-template-columns: minmax(0, 1.15fr) minmax(0, 0.85fr);
8313
+ gap: 6px;
8314
+ }
8315
+
8316
+ .fleetbase-ai-create-order-preview__inline-datetime input {
8317
+ width: 100%;
8318
+ min-width: 0;
8319
+ }
8320
+
8321
+ .fleetbase-ai-create-order-preview__toggles {
8322
+ display: flex;
8323
+ flex-direction: column;
8324
+ gap: 8px;
8325
+ }
8326
+
8327
+ .fleetbase-ai-create-order-preview__toggle-row {
8328
+ display: flex;
8329
+ min-height: 28px;
8330
+ align-items: center;
8331
+ justify-content: space-between;
8332
+ gap: 10px;
8333
+ border-top: 1px solid rgb(148 163 184 / 14%);
8334
+ padding: 7px 2px 0;
8335
+ }
8336
+
8337
+ .fleetbase-ai-create-order-preview__inline-pill {
8338
+ display: inline-flex;
8339
+ align-items: center;
8340
+ gap: 5px;
8341
+ border: 0;
8342
+ border-radius: 999px;
8343
+ background: rgb(148 163 184 / 14%);
8344
+ padding: 3px 7px;
8345
+ color: #475569;
8346
+ font-size: 11px;
8347
+ line-height: 1;
8348
+ }
8349
+
8350
+ .fleetbase-ai-create-order-preview__inline-pill:hover {
8351
+ background: rgb(37 99 235 / 14%);
8352
+ color: #2563eb;
8353
+ }
8354
+
8355
+ .fleetbase-ai-create-order-preview__select-label {
8356
+ overflow: hidden;
8357
+ color: #0f172a;
8358
+ font-size: 12px;
8359
+ font-weight: 600;
8360
+ line-height: 1.25;
8361
+ text-overflow: ellipsis;
8362
+ text-transform: uppercase;
8363
+ white-space: nowrap;
8364
+ }
8365
+
8366
+ .fleetbase-ai-create-order-preview__controls {
8367
+ display: flex;
8368
+ align-items: center;
8369
+ gap: 8px;
8370
+ }
8371
+
8372
+ .fleetbase-ai-create-order-preview__refreshing {
8373
+ color: #64748b;
8374
+ font-size: 11px;
8375
+ }
8376
+
8377
+ .fleetbase-ai-create-order-preview__applying,
8378
+ .fleetbase-ai-create-order-preview__completed,
8379
+ .fleetbase-ai-create-order-preview__cancelled {
8380
+ display: flex;
8381
+ align-items: center;
8382
+ gap: 7px;
8383
+ border-radius: 7px;
8384
+ padding: 8px 9px;
8385
+ font-size: 12px;
8386
+ }
8387
+
8388
+ .fleetbase-ai-create-order-preview__applying {
8389
+ border: 1px solid rgb(96 165 250 / 20%);
8390
+ background: rgb(37 99 235 / 10%);
8391
+ color: #1d4ed8;
8392
+ }
8393
+
8394
+ .fleetbase-ai-create-order-preview__magic-loader {
8395
+ display: inline-flex;
8396
+ align-items: center;
8397
+ gap: 3px;
8398
+ }
8399
+
8400
+ .fleetbase-ai-create-order-preview__magic-loader span {
8401
+ width: 5px;
8402
+ height: 5px;
8403
+ border-radius: 999px;
8404
+ background: currentcolor;
8405
+ opacity: 0.45;
8406
+ animation: fleetbase-ai-create-order-dot 900ms ease-in-out infinite;
8407
+ }
8408
+
8409
+ .fleetbase-ai-create-order-preview__magic-loader span:nth-child(2) {
8410
+ animation-delay: 120ms;
8411
+ }
8412
+
8413
+ .fleetbase-ai-create-order-preview__magic-loader span:nth-child(3) {
8414
+ animation-delay: 240ms;
8415
+ }
8416
+
8417
+ @keyframes fleetbase-ai-create-order-dot {
8418
+ 0%,
8419
+ 80%,
8420
+ 100% {
8421
+ opacity: 0.35;
8422
+ transform: translateY(0);
8423
+ }
8424
+
8425
+ 40% {
8426
+ opacity: 1;
8427
+ transform: translateY(-2px);
8428
+ }
8429
+ }
8430
+
8431
+ .fleetbase-ai-create-order-preview__completed {
8432
+ border: 1px solid rgb(34 197 94 / 20%);
8433
+ background: rgb(22 163 74 / 10%);
8434
+ color: #166534;
8435
+ }
8436
+
8437
+ .fleetbase-ai-create-order-preview__completed-icon {
8438
+ display: inline-flex;
8439
+ width: 26px;
8440
+ height: 26px;
8441
+ flex: 0 0 26px;
8442
+ align-items: center;
8443
+ justify-content: center;
8444
+ border-radius: 999px;
8445
+ background: rgb(34 197 94 / 16%);
8446
+ }
8447
+
8448
+ .fleetbase-ai-create-order-preview__completed-copy {
8449
+ display: flex;
8450
+ min-width: 0;
8451
+ flex: 1 1 auto;
8452
+ flex-direction: column;
8453
+ gap: 2px;
8454
+ }
8455
+
8456
+ .fleetbase-ai-create-order-preview__completed-copy strong,
8457
+ .fleetbase-ai-create-order-preview__completed-copy span {
8458
+ overflow: hidden;
8459
+ text-overflow: ellipsis;
8460
+ white-space: nowrap;
8461
+ }
8462
+
8463
+ .fleetbase-ai-create-order-preview__completed-copy span {
8464
+ opacity: 0.8;
8465
+ }
8466
+
8467
+ .fleetbase-ai-create-order-preview__cancelled {
8468
+ border: 1px solid rgb(239 68 68 / 20%);
8469
+ background: rgb(239 68 68 / 10%);
8470
+ color: #991b1b;
8471
+ }
8472
+
8473
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__map,
8474
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__field-row:hover,
8475
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__field-row:focus-within {
8476
+ border-color: rgb(148 163 184 / 20%);
8477
+ background: rgb(15 23 42 / 30%);
8478
+ }
8479
+
8480
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__field-copy > strong,
8481
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__inline-select,
8482
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__inline-native-select,
8483
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__inline-datetime,
8484
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__inline-textarea,
8485
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__inline-select.ember-power-select-trigger,
8486
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__select-label {
8487
+ color: #f8fafc;
8488
+ }
8489
+
8490
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__field-copy > span,
8491
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__edit-button,
8492
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__refreshing,
8493
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__empty-map {
8494
+ color: #cbd5e1;
8495
+ }
8496
+
8497
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__toggle-row {
8498
+ border-top-color: rgb(148 163 184 / 18%);
8499
+ }
8500
+
8501
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__inline-pill {
8502
+ background: rgb(148 163 184 / 14%);
8503
+ color: #cbd5e1;
8504
+ }
8505
+
8506
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__inline-pill:hover {
8507
+ background: rgb(96 165 250 / 14%);
8508
+ color: #bfdbfe;
8509
+ }
8510
+
8511
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__applying {
8512
+ border-color: rgb(96 165 250 / 24%);
8513
+ background: rgb(30 64 175 / 24%);
8514
+ color: #bfdbfe;
8515
+ }
8516
+
8517
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__completed {
8518
+ border-color: rgb(74 222 128 / 22%);
8519
+ background: rgb(20 83 45 / 28%);
8520
+ color: #bbf7d0;
8521
+ }
8522
+
8523
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__completed-icon {
8524
+ background: rgb(34 197 94 / 18%);
8525
+ }
8526
+
8527
+ body[data-theme='dark'] .fleetbase-ai-create-order-preview__cancelled {
8528
+ border-color: rgb(248 113 113 / 22%);
8529
+ background: rgb(127 29 29 / 22%);
8530
+ color: #fecaca;
8531
+ }
8532
+
8533
+ @media (prefers-reduced-motion: reduce) {
8534
+ .fleetbase-ai-create-order-preview__magic-loader span {
8535
+ animation: none;
8536
+ }
8537
+ }
@@ -1,17 +1,15 @@
1
1
  export default function calculateMapDrawerDropdownPosition(trigger, content) {
2
- const dropdownRoot = trigger?.closest?.('.ember-basic-dropdown');
3
2
  const drawerPanel = trigger?.closest?.('.next-drawer-panel');
4
3
 
5
- if (!trigger || !dropdownRoot) {
4
+ if (!trigger) {
6
5
  return { style: {} };
7
6
  }
8
7
 
9
8
  const triggerRect = trigger.getBoundingClientRect();
10
- const rootRect = dropdownRoot.getBoundingClientRect();
11
9
  const drawerRect = drawerPanel?.getBoundingClientRect?.();
12
10
  const contentRect = content?.getBoundingClientRect?.();
13
11
  const contentWidth = contentRect?.width || 224;
14
- // const contentHeight = contentRect?.height || 240;
12
+ const contentHeight = contentRect?.height || 240;
15
13
  const gap = 6;
16
14
 
17
15
  const viewportRect = {
@@ -21,21 +19,21 @@ export default function calculateMapDrawerDropdownPosition(trigger, content) {
21
19
  left: 0,
22
20
  };
23
21
  const boundaryRect = drawerRect ?? viewportRect;
24
- const minLeft = boundaryRect.left - rootRect.left + gap;
25
- const maxLeft = boundaryRect.right - rootRect.left - contentWidth - gap;
26
- // const minTop = boundaryRect.top - rootRect.top + gap;
27
- // const maxTop = boundaryRect.bottom - rootRect.top - contentHeight - gap;
22
+ const minLeft = boundaryRect.left + gap;
23
+ const maxLeft = boundaryRect.right - contentWidth - gap;
24
+ const minTop = boundaryRect.top;
25
+ const maxTop = boundaryRect.bottom - contentHeight + 8;
28
26
 
29
- const preferredLeft = triggerRect.left - rootRect.left - contentWidth - gap;
30
- // const preferredTop = triggerRect.top - rootRect.top;
27
+ const preferredLeft = triggerRect.left - contentWidth - gap;
28
+ const preferredTop = triggerRect.top;
31
29
  const left = clamp(preferredLeft, minLeft, Math.max(minLeft, maxLeft));
32
- const top = 0; //clamp(preferredTop, minTop, Math.max(minTop, maxTop));
30
+ const top = clamp(preferredTop, minTop, Math.max(minTop, maxTop));
33
31
 
34
32
  return {
35
33
  style: {
36
34
  position: 'absolute',
37
- left: `${left}px`,
38
- top: `${top}px`,
35
+ left,
36
+ top,
39
37
  marginTop: '0px',
40
38
  zIndex: '10000',
41
39
  },
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/ai/create-order-preview';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/ai/route-preview-map';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/components/fleet/hierarchy-tree';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/services/route-engine';
package/composer.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetbase/fleetops-api",
3
- "version": "0.6.56",
3
+ "version": "0.6.57",
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.56",
3
+ "version": "0.6.57",
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.56",
3
+ "version": "0.6.57",
4
4
  "description": "Fleet & Transport Management Extension for Fleetbase",
5
5
  "fleetbase": {
6
6
  "route": "fleet-ops"
@@ -25,7 +25,9 @@
25
25
  "scripts": {
26
26
  "build": "ember build --environment=production",
27
27
  "lint": "concurrently \"npm:lint:*(!fix)\" --names \"lint:\"",
28
- "lint:css": "stylelint \"**/*.css\"",
28
+ "check:css-alpha": "node scripts/normalize-rgba-alpha.js --check",
29
+ "fix:css-alpha": "node scripts/normalize-rgba-alpha.js",
30
+ "lint:css": "npm run check:css-alpha && stylelint \"**/*.css\"",
29
31
  "lint:css:fix": "concurrently \"npm:lint:css -- --fix\"",
30
32
  "lint:fix": "concurrently \"npm:lint:*:fix\" --names \"fix:\"",
31
33
  "lint:hbs": "ember-template-lint .",
@@ -42,8 +44,8 @@
42
44
  },
43
45
  "dependencies": {
44
46
  "@babel/core": "^7.23.2",
45
- "@fleetbase/ember-core": "^0.3.23",
46
- "@fleetbase/ember-ui": "^0.3.38",
47
+ "@fleetbase/ember-core": "^0.3.24",
48
+ "@fleetbase/ember-ui": "^0.3.39",
47
49
  "@fleetbase/fleetops-data": "^0.1.40",
48
50
  "@fleetbase/leaflet-routing-machine": "^3.2.17",
49
51
  "@fortawesome/ember-fontawesome": "^2.0.0",
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+
7
+ const root = process.cwd();
8
+ const checkOnly = process.argv.includes('--check');
9
+ const cssRoot = path.join(root, 'addon');
10
+ const rgbaPercentAlphaPattern = /rgba\(\s*([+-]?(?:\d*\.)?\d+)\s*,\s*([+-]?(?:\d*\.)?\d+)\s*,\s*([+-]?(?:\d*\.)?\d+)\s*,\s*([+-]?(?:\d*\.)?\d+)%\s*\)/g;
11
+
12
+ function collectCssFiles(dir, files = []) {
13
+ if (!fs.existsSync(dir)) {
14
+ return files;
15
+ }
16
+
17
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
18
+ const fullPath = path.join(dir, entry.name);
19
+
20
+ if (entry.isDirectory()) {
21
+ collectCssFiles(fullPath, files);
22
+ continue;
23
+ }
24
+
25
+ if (entry.isFile() && entry.name.endsWith('.css')) {
26
+ files.push(fullPath);
27
+ }
28
+ }
29
+
30
+ return files;
31
+ }
32
+
33
+ function formatAlpha(percent) {
34
+ const alpha = Number(percent) / 100;
35
+ return Number.isInteger(alpha) ? String(alpha) : String(Number(alpha.toFixed(4)));
36
+ }
37
+
38
+ function lineForIndex(source, index) {
39
+ return source.slice(0, index).split('\n').length;
40
+ }
41
+
42
+ const changes = [];
43
+
44
+ for (const filePath of collectCssFiles(cssRoot)) {
45
+ const source = fs.readFileSync(filePath, 'utf8');
46
+ const matches = [];
47
+
48
+ const next = source.replace(rgbaPercentAlphaPattern, (match, red, green, blue, alphaPercent, offset) => {
49
+ const replacement = `rgba(${red}, ${green}, ${blue}, ${formatAlpha(alphaPercent)})`;
50
+ matches.push({
51
+ line: lineForIndex(source, offset),
52
+ before: match,
53
+ after: replacement,
54
+ });
55
+ return replacement;
56
+ });
57
+
58
+ if (matches.length === 0) {
59
+ continue;
60
+ }
61
+
62
+ changes.push({
63
+ filePath,
64
+ matches,
65
+ });
66
+
67
+ if (!checkOnly) {
68
+ fs.writeFileSync(filePath, next);
69
+ }
70
+ }
71
+
72
+ if (changes.length === 0) {
73
+ console.log('No comma-form rgba() percent-alpha values found.');
74
+ process.exit(0);
75
+ }
76
+
77
+ for (const change of changes) {
78
+ const relativePath = path.relative(root, change.filePath);
79
+
80
+ for (const match of change.matches) {
81
+ console.log(`${relativePath}:${match.line} ${match.before} -> ${match.after}`);
82
+ }
83
+ }
84
+
85
+ if (checkOnly) {
86
+ console.error('\nRun `npm run fix:css-alpha` to normalize these values before production builds.');
87
+ process.exit(1);
88
+ }
89
+
90
+ console.log(`\nNormalized ${changes.reduce((total, change) => total + change.matches.length, 0)} rgba() alpha value(s).`);