@fleetbase/fleetops-engine 0.0.1

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 (446) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +32 -0
  3. package/addon/components/cell/driver-name.hbs +13 -0
  4. package/addon/components/cell/driver-name.js +30 -0
  5. package/addon/components/custom-field-value.hbs +11 -0
  6. package/addon/components/custom-field-value.js +41 -0
  7. package/addon/components/custom-field.hbs +42 -0
  8. package/addon/components/custom-field.js +46 -0
  9. package/addon/components/display-place.hbs +52 -0
  10. package/addon/components/display-place.js +11 -0
  11. package/addon/components/driver-card-mini.hbs +12 -0
  12. package/addon/components/driver-card-mini.js +25 -0
  13. package/addon/components/driver-card.hbs +27 -0
  14. package/addon/components/driver-card.js +14 -0
  15. package/addon/components/event-timeline/event.hbs +5 -0
  16. package/addon/components/event-timeline.hbs +7 -0
  17. package/addon/components/event-timeline.js +423 -0
  18. package/addon/components/file-icon.js +1 -0
  19. package/addon/components/fleet-driver-listing.hbs +73 -0
  20. package/addon/components/fleet-driver-listing.js +117 -0
  21. package/addon/components/full-calendar/draggable.js +1 -0
  22. package/addon/components/full-calendar.js +1 -0
  23. package/addon/components/full-size.js +1 -0
  24. package/addon/components/global-search.hbs +84 -0
  25. package/addon/components/global-search.js +52 -0
  26. package/addon/components/horizontal-route.hbs +33 -0
  27. package/addon/components/horizontal-route.js +48 -0
  28. package/addon/components/integrated-order-details.hbs +117 -0
  29. package/addon/components/integrated-order-details.js +10 -0
  30. package/addon/components/leaflet-draw-control.js +147 -0
  31. package/addon/components/leaflet-rotated-marker.js +24 -0
  32. package/addon/components/live-map.hbs +63 -0
  33. package/addon/components/live-map.js +856 -0
  34. package/addon/components/map-container/toolbar/zones-panel.hbs +41 -0
  35. package/addon/components/map-container/toolbar/zones-panel.js +106 -0
  36. package/addon/components/map-container/toolbar-container.hbs +1 -0
  37. package/addon/components/map-container/toolbar-container.js +3 -0
  38. package/addon/components/map-container/toolbar.hbs +51 -0
  39. package/addon/components/map-container/toolbar.js +34 -0
  40. package/addon/components/map-container/topbar.hbs +1 -0
  41. package/addon/components/map-container/topbar.js +3 -0
  42. package/addon/components/map-container/view-switch.hbs +1 -0
  43. package/addon/components/map-container/view-switch.js +3 -0
  44. package/addon/components/map-container.hbs +1 -0
  45. package/addon/components/map-container.js +15 -0
  46. package/addon/components/modals/assign-driver.hbs +24 -0
  47. package/addon/components/modals/assign-driver.js +3 -0
  48. package/addon/components/modals/clone-config-form.hbs +6 -0
  49. package/addon/components/modals/contact-details.hbs +44 -0
  50. package/addon/components/modals/contact-form.hbs +56 -0
  51. package/addon/components/modals/driver-assign-order.hbs +67 -0
  52. package/addon/components/modals/driver-assign-vehicle.hbs +20 -0
  53. package/addon/components/modals/driver-assign-vendor.hbs +20 -0
  54. package/addon/components/modals/driver-details.hbs +85 -0
  55. package/addon/components/modals/driver-form.hbs +83 -0
  56. package/addon/components/modals/edit-meta-form.hbs +20 -0
  57. package/addon/components/modals/entity-form.hbs +57 -0
  58. package/addon/components/modals/entity-meta-field-prompt.hbs +6 -0
  59. package/addon/components/modals/fleet-details.hbs +31 -0
  60. package/addon/components/modals/fleet-form.hbs +26 -0
  61. package/addon/components/modals/fuel-report-details.hbs +34 -0
  62. package/addon/components/modals/fuel-report-form.hbs +26 -0
  63. package/addon/components/modals/group-details.hbs +42 -0
  64. package/addon/components/modals/group-form.hbs +54 -0
  65. package/addon/components/modals/install-prompt.hbs +21 -0
  66. package/addon/components/modals/map-field-form.hbs +9 -0
  67. package/addon/components/modals/map-field-group-form.hbs +6 -0
  68. package/addon/components/modals/map-layer-form.hbs +29 -0
  69. package/addon/components/modals/meta-field-form.hbs +8 -0
  70. package/addon/components/modals/meta-field-group-form.hbs +5 -0
  71. package/addon/components/modals/new-order-config.hbs +11 -0
  72. package/addon/components/modals/option-prompt.hbs +17 -0
  73. package/addon/components/modals/order-assign-driver.hbs +25 -0
  74. package/addon/components/modals/order-config-new-status.hbs +5 -0
  75. package/addon/components/modals/order-event.hbs +18 -0
  76. package/addon/components/modals/order-form.hbs +63 -0
  77. package/addon/components/modals/order-import.hbs +84 -0
  78. package/addon/components/modals/order-label.hbs +7 -0
  79. package/addon/components/modals/order-meta.hbs +12 -0
  80. package/addon/components/modals/order-new-activity.hbs +62 -0
  81. package/addon/components/modals/order-route-form.hbs +111 -0
  82. package/addon/components/modals/place-assign-vendor.hbs +20 -0
  83. package/addon/components/modals/place-details.hbs +105 -0
  84. package/addon/components/modals/place-form.hbs +30 -0
  85. package/addon/components/modals/point-map.hbs +16 -0
  86. package/addon/components/modals/policy-form.hbs +22 -0
  87. package/addon/components/modals/resend-verification-email.hbs +25 -0
  88. package/addon/components/modals/role-form.hbs +16 -0
  89. package/addon/components/modals/select-payment-method.hbs +12 -0
  90. package/addon/components/modals/service-area-form.hbs +31 -0
  91. package/addon/components/modals/set-password.hbs +15 -0
  92. package/addon/components/modals/uninstall-prompt.hbs +21 -0
  93. package/addon/components/modals/user-form.hbs +56 -0
  94. package/addon/components/modals/vehicle-details.hbs +227 -0
  95. package/addon/components/modals/vehicle-form.hbs +282 -0
  96. package/addon/components/modals/vendor-details.hbs +77 -0
  97. package/addon/components/modals/vendor-form.hbs +168 -0
  98. package/addon/components/modals/view-service-area.hbs +12 -0
  99. package/addon/components/modals/view-zone.hbs +12 -0
  100. package/addon/components/modals/zone-form.hbs +16 -0
  101. package/addon/components/operations-pane/pane.hbs +1 -0
  102. package/addon/components/order/header.hbs +48 -0
  103. package/addon/components/order/header.js +26 -0
  104. package/addon/components/order/place-card.hbs +51 -0
  105. package/addon/components/order/place-card.js +33 -0
  106. package/addon/components/order/schedule-card.hbs +35 -0
  107. package/addon/components/order/schedule-card.js +17 -0
  108. package/addon/components/order/sub-header/item.hbs +16 -0
  109. package/addon/components/order/sub-header.hbs +3 -0
  110. package/addon/components/order-config/activity-flow-editor.hbs +108 -0
  111. package/addon/components/order-config/activity-flow-editor.js +374 -0
  112. package/addon/components/order-config/details-editor.hbs +32 -0
  113. package/addon/components/order-config/details-editor.js +16 -0
  114. package/addon/components/order-config/entities-editor.hbs +84 -0
  115. package/addon/components/order-config/entities-editor.js +123 -0
  116. package/addon/components/order-config/fields-editor.hbs +122 -0
  117. package/addon/components/order-config/fields-editor.js +233 -0
  118. package/addon/components/order-config/selector.hbs +1 -0
  119. package/addon/components/order-config/selector.js +3 -0
  120. package/addon/components/order-config.hbs +66 -0
  121. package/addon/components/order-config.js +296 -0
  122. package/addon/components/order-list-overlay/driver-panel-title.hbs +6 -0
  123. package/addon/components/order-list-overlay/order.hbs +22 -0
  124. package/addon/components/order-list-overlay/order.js +3 -0
  125. package/addon/components/order-list-overlay.hbs +120 -0
  126. package/addon/components/order-list-overlay.js +227 -0
  127. package/addon/components/route-list.hbs +47 -0
  128. package/addon/components/route-list.js +11 -0
  129. package/addon/components/settings-window.hbs +15 -0
  130. package/addon/components/settings-window.js +62 -0
  131. package/addon/components/split-grid.js +1 -0
  132. package/addon/components/widget/fleet-ops-quickstart.hbs +40 -0
  133. package/addon/components/widget/fleet-ops-quickstart.js +58 -0
  134. package/addon/components/widget/issues.hbs +1 -0
  135. package/addon/components/widget/key-metrics.hbs +121 -0
  136. package/addon/components/widget/key-metrics.js +46 -0
  137. package/addon/components/widget/live-order-map.hbs +59 -0
  138. package/addon/components/widget/live-order-map.js +11 -0
  139. package/addon/components/widget/recent-orders.hbs +35 -0
  140. package/addon/components/widget/recent-orders.js +24 -0
  141. package/addon/components/widget/transaction-earnings.hbs +1 -0
  142. package/addon/components/widget/transactions.hbs +36 -0
  143. package/addon/components/widget/transactions.js +29 -0
  144. package/addon/components/widget/weekly-orders.hbs +1 -0
  145. package/addon/components/widget/weekly-orders.js +3 -0
  146. package/addon/controllers/application.js +40 -0
  147. package/addon/controllers/management/contacts/index.js +438 -0
  148. package/addon/controllers/management/drivers/index.js +868 -0
  149. package/addon/controllers/management/fleets/index.js +507 -0
  150. package/addon/controllers/management/fuel-reports/index.js +428 -0
  151. package/addon/controllers/management/issues/index.js +335 -0
  152. package/addon/controllers/management/places/index.js +571 -0
  153. package/addon/controllers/management/vehicles/index.js +616 -0
  154. package/addon/controllers/management/vendors/index.js +626 -0
  155. package/addon/controllers/management.js +5 -0
  156. package/addon/controllers/operations/orders/index/config/types.js +17 -0
  157. package/addon/controllers/operations/orders/index/config.js +13 -0
  158. package/addon/controllers/operations/orders/index/new.js +1213 -0
  159. package/addon/controllers/operations/orders/index/view.js +794 -0
  160. package/addon/controllers/operations/orders/index.js +674 -0
  161. package/addon/controllers/operations/scheduler/index.js +110 -0
  162. package/addon/controllers/operations/service-rates/index/edit.js +59 -0
  163. package/addon/controllers/operations/service-rates/index/new.js +369 -0
  164. package/addon/controllers/operations/service-rates/index.js +275 -0
  165. package/addon/controllers/operations/zones/index.js +470 -0
  166. package/addon/engine.js +19 -0
  167. package/addon/helpers/avatar-url.js +9 -0
  168. package/addon/helpers/extract-coordinates.js +6 -0
  169. package/addon/helpers/feature-group.js +14 -0
  170. package/addon/helpers/flow-raw-status.js +13 -0
  171. package/addon/helpers/format-point.js +13 -0
  172. package/addon/helpers/get-tip-amount.js +19 -0
  173. package/addon/helpers/is-active-route.js +1 -0
  174. package/addon/helpers/is-facilitator-supported-place.js +6 -0
  175. package/addon/helpers/is-not-facilitator-supported-place.js +6 -0
  176. package/addon/helpers/is-waypoint-record.js +6 -0
  177. package/addon/helpers/point-coordinates.js +10 -0
  178. package/addon/helpers/point-to-coordinates.js +28 -0
  179. package/addon/helpers/service-name.js +6 -0
  180. package/addon/helpers/waypoint-label.js +1 -0
  181. package/addon/instance-initializers/register-leaflet-draw-control-layer.js +17 -0
  182. package/addon/instance-initializers/register-leaflet-rotated-marker.js +17 -0
  183. package/addon/modifiers/translate-x.js +5 -0
  184. package/addon/routes/application.js +25 -0
  185. package/addon/routes/comms/chat.js +3 -0
  186. package/addon/routes/comms/intercom.js +3 -0
  187. package/addon/routes/comms.js +3 -0
  188. package/addon/routes/home.js +20 -0
  189. package/addon/routes/management/contacts/index.js +24 -0
  190. package/addon/routes/management/contacts.js +3 -0
  191. package/addon/routes/management/drivers/index.js +33 -0
  192. package/addon/routes/management/drivers.js +3 -0
  193. package/addon/routes/management/fleets/index.js +27 -0
  194. package/addon/routes/management/fleets.js +3 -0
  195. package/addon/routes/management/fuel-reports/index.js +23 -0
  196. package/addon/routes/management/fuel-reports.js +3 -0
  197. package/addon/routes/management/index.js +3 -0
  198. package/addon/routes/management/issues/index.js +24 -0
  199. package/addon/routes/management/issues.js +3 -0
  200. package/addon/routes/management/places/index.js +18 -0
  201. package/addon/routes/management/places.js +3 -0
  202. package/addon/routes/management/vehicles/index.js +35 -0
  203. package/addon/routes/management/vehicles.js +3 -0
  204. package/addon/routes/management/vendors/index.js +34 -0
  205. package/addon/routes/management/vendors.js +3 -0
  206. package/addon/routes/management.js +3 -0
  207. package/addon/routes/operations/dispatch.js +3 -0
  208. package/addon/routes/operations/orders/index/config/types.js +17 -0
  209. package/addon/routes/operations/orders/index/config.js +3 -0
  210. package/addon/routes/operations/orders/index/new.js +16 -0
  211. package/addon/routes/operations/orders/index/view.js +37 -0
  212. package/addon/routes/operations/orders/index.js +35 -0
  213. package/addon/routes/operations/orders.js +4 -0
  214. package/addon/routes/operations/scheduler/index.js +10 -0
  215. package/addon/routes/operations/scheduler.js +3 -0
  216. package/addon/routes/operations/service-rates/index/edit.js +35 -0
  217. package/addon/routes/operations/service-rates/index/new.js +15 -0
  218. package/addon/routes/operations/service-rates/index.js +49 -0
  219. package/addon/routes/operations/service-rates.js +10 -0
  220. package/addon/routes/operations/zones/index.js +25 -0
  221. package/addon/routes/operations/zones.js +7 -0
  222. package/addon/routes/operations.js +3 -0
  223. package/addon/routes.js +55 -0
  224. package/addon/services/map-manager.js +3 -0
  225. package/addon/services/service-areas.js +385 -0
  226. package/addon/templates/application.hbs +27 -0
  227. package/addon/templates/comms/chat.hbs +1 -0
  228. package/addon/templates/comms/intercom.hbs +1 -0
  229. package/addon/templates/comms.hbs +1 -0
  230. package/addon/templates/home.hbs +1 -0
  231. package/addon/templates/management/contacts/index.hbs +23 -0
  232. package/addon/templates/management/contacts.hbs +1 -0
  233. package/addon/templates/management/drivers/index.hbs +35 -0
  234. package/addon/templates/management/drivers.hbs +1 -0
  235. package/addon/templates/management/fleets/index.hbs +22 -0
  236. package/addon/templates/management/fleets.hbs +1 -0
  237. package/addon/templates/management/fuel-reports/index.hbs +21 -0
  238. package/addon/templates/management/fuel-reports.hbs +1 -0
  239. package/addon/templates/management/index.hbs +53 -0
  240. package/addon/templates/management/issues/index.hbs +21 -0
  241. package/addon/templates/management/issues.hbs +1 -0
  242. package/addon/templates/management/places/index.hbs +34 -0
  243. package/addon/templates/management/places.hbs +1 -0
  244. package/addon/templates/management/vehicles/index.hbs +22 -0
  245. package/addon/templates/management/vehicles.hbs +1 -0
  246. package/addon/templates/management/vendors/index.hbs +22 -0
  247. package/addon/templates/management/vendors.hbs +1 -0
  248. package/addon/templates/management.hbs +1 -0
  249. package/addon/templates/operations/dispatch.hbs +1 -0
  250. package/addon/templates/operations/orders/index/config/types.hbs +26 -0
  251. package/addon/templates/operations/orders/index/config.hbs +24 -0
  252. package/addon/templates/operations/orders/index/new.hbs +506 -0
  253. package/addon/templates/operations/orders/index/view.hbs +428 -0
  254. package/addon/templates/operations/orders/index.hbs +48 -0
  255. package/addon/templates/operations/orders.hbs +1 -0
  256. package/addon/templates/operations/scheduler/index.hbs +30 -0
  257. package/addon/templates/operations/scheduler.hbs +1 -0
  258. package/addon/templates/operations/service-rates/index/edit.hbs +1 -0
  259. package/addon/templates/operations/service-rates/index/new.hbs +308 -0
  260. package/addon/templates/operations/service-rates/index.hbs +23 -0
  261. package/addon/templates/operations/service-rates.hbs +1 -0
  262. package/addon/templates/operations/zones/index.hbs +72 -0
  263. package/addon/templates/operations/zones.hbs +1 -0
  264. package/addon/templates/operations.hbs +1 -0
  265. package/addon/utils/calculate-percentage.js +1 -0
  266. package/addon/utils/extract-coordinates.js +1 -0
  267. package/addon/utils/format-currency.js +1 -0
  268. package/addon/utils/geojson/geo-json.js +17 -0
  269. package/addon/utils/is-facilitator-supported-place.js +14 -0
  270. package/addon/utils/to-model.js +1 -0
  271. package/app/components/cell/driver-name.js +1 -0
  272. package/app/components/custom-field-value.js +1 -0
  273. package/app/components/custom-field.js +1 -0
  274. package/app/components/display-place.js +1 -0
  275. package/app/components/driver-card-mini.js +1 -0
  276. package/app/components/driver-card.js +1 -0
  277. package/app/components/event-timeline/event.js +1 -0
  278. package/app/components/event-timeline.js +1 -0
  279. package/app/components/file-icon.js +1 -0
  280. package/app/components/fleet-driver-listing.js +1 -0
  281. package/app/components/full-calendar/draggable.js +1 -0
  282. package/app/components/full-calendar.js +1 -0
  283. package/app/components/full-size.js +1 -0
  284. package/app/components/global-search.js +1 -0
  285. package/app/components/horizontal-route.js +1 -0
  286. package/app/components/integrated-order-details.js +1 -0
  287. package/app/components/leaflet-draw-control.js +1 -0
  288. package/app/components/leaflet-rotated-marker.js +1 -0
  289. package/app/components/live-map.js +1 -0
  290. package/app/components/map-container/toolbar/zones-panel.js +1 -0
  291. package/app/components/map-container/toolbar-container.js +1 -0
  292. package/app/components/map-container/toolbar.js +1 -0
  293. package/app/components/map-container/topbar.js +1 -0
  294. package/app/components/map-container/view-switch.js +1 -0
  295. package/app/components/map-container.js +1 -0
  296. package/app/components/modals/assign-driver.js +1 -0
  297. package/app/components/modals/clone-config-form.js +1 -0
  298. package/app/components/modals/contact-details.js +1 -0
  299. package/app/components/modals/contact-form.js +1 -0
  300. package/app/components/modals/driver-assign-order.js +1 -0
  301. package/app/components/modals/driver-assign-vehicle.js +1 -0
  302. package/app/components/modals/driver-assign-vendor.js +1 -0
  303. package/app/components/modals/driver-details.js +1 -0
  304. package/app/components/modals/driver-form.js +1 -0
  305. package/app/components/modals/edit-meta-form.js +1 -0
  306. package/app/components/modals/entity-form.js +1 -0
  307. package/app/components/modals/entity-meta-field-prompt.js +1 -0
  308. package/app/components/modals/fleet-details.js +1 -0
  309. package/app/components/modals/fleet-form.js +1 -0
  310. package/app/components/modals/fuel-report-details.js +1 -0
  311. package/app/components/modals/fuel-report-form.js +1 -0
  312. package/app/components/modals/group-details.js +1 -0
  313. package/app/components/modals/group-form.js +1 -0
  314. package/app/components/modals/install-prompt.js +1 -0
  315. package/app/components/modals/map-field-form.js +1 -0
  316. package/app/components/modals/map-field-group-form.js +1 -0
  317. package/app/components/modals/map-layer-form.js +1 -0
  318. package/app/components/modals/meta-field-form.js +1 -0
  319. package/app/components/modals/meta-field-group-form.js +1 -0
  320. package/app/components/modals/new-order-config.js +1 -0
  321. package/app/components/modals/option-prompt.js +1 -0
  322. package/app/components/modals/order-assign-driver.js +1 -0
  323. package/app/components/modals/order-config-new-status.js +1 -0
  324. package/app/components/modals/order-event.js +1 -0
  325. package/app/components/modals/order-form.js +1 -0
  326. package/app/components/modals/order-import.js +1 -0
  327. package/app/components/modals/order-label.js +1 -0
  328. package/app/components/modals/order-meta.js +1 -0
  329. package/app/components/modals/order-new-activity.js +1 -0
  330. package/app/components/modals/order-route-form.js +1 -0
  331. package/app/components/modals/place-assign-vendor.js +1 -0
  332. package/app/components/modals/place-details.js +1 -0
  333. package/app/components/modals/place-form.js +1 -0
  334. package/app/components/modals/point-map.js +1 -0
  335. package/app/components/modals/policy-form.js +1 -0
  336. package/app/components/modals/resend-verification-email.js +1 -0
  337. package/app/components/modals/role-form.js +1 -0
  338. package/app/components/modals/select-payment-method.js +1 -0
  339. package/app/components/modals/service-area-form.js +1 -0
  340. package/app/components/modals/set-password.js +1 -0
  341. package/app/components/modals/uninstall-prompt.js +1 -0
  342. package/app/components/modals/user-form.js +1 -0
  343. package/app/components/modals/vehicle-details.js +1 -0
  344. package/app/components/modals/vehicle-form.js +1 -0
  345. package/app/components/modals/vendor-details.js +1 -0
  346. package/app/components/modals/vendor-form.js +1 -0
  347. package/app/components/modals/view-service-area.js +1 -0
  348. package/app/components/modals/view-zone.js +1 -0
  349. package/app/components/modals/zone-form.js +1 -0
  350. package/app/components/operations-pane/pane.js +1 -0
  351. package/app/components/order/header.js +1 -0
  352. package/app/components/order/place-card.js +1 -0
  353. package/app/components/order/schedule-card.js +1 -0
  354. package/app/components/order/sub-header/item.js +1 -0
  355. package/app/components/order/sub-header.js +1 -0
  356. package/app/components/order-config/activity-flow-editor.js +1 -0
  357. package/app/components/order-config/details-editor.js +1 -0
  358. package/app/components/order-config/entities-editor.js +1 -0
  359. package/app/components/order-config/fields-editor.js +1 -0
  360. package/app/components/order-config/selector.js +1 -0
  361. package/app/components/order-config.js +1 -0
  362. package/app/components/order-list-overlay/driver-panel-title.js +1 -0
  363. package/app/components/order-list-overlay/order.js +1 -0
  364. package/app/components/order-list-overlay.js +1 -0
  365. package/app/components/route-list.js +1 -0
  366. package/app/components/settings-window.js +1 -0
  367. package/app/components/split-grid.js +1 -0
  368. package/app/components/widget/issues.js +1 -0
  369. package/app/components/widget/key-metrics.js +1 -0
  370. package/app/components/widget/live-order-map.js +1 -0
  371. package/app/components/widget/recent-orders.js +1 -0
  372. package/app/components/widget/recommended-todo.js +1 -0
  373. package/app/components/widget/transaction-earnings.js +1 -0
  374. package/app/components/widget/transactions.js +1 -0
  375. package/app/components/widget/weekly-orders.js +1 -0
  376. package/app/controllers/application.js +1 -0
  377. package/app/controllers/management/contacts/index.js +1 -0
  378. package/app/controllers/management/drivers/index/details.js +1 -0
  379. package/app/controllers/management/drivers/index.js +1 -0
  380. package/app/controllers/management/fleets/index/details.js +1 -0
  381. package/app/controllers/management/fleets/index.js +1 -0
  382. package/app/controllers/management/fuel-reports/index.js +1 -0
  383. package/app/controllers/management/issues/index.js +1 -0
  384. package/app/controllers/management/places/index.js +1 -0
  385. package/app/controllers/management/vehicles/index.js +1 -0
  386. package/app/controllers/management/vendors/index/details/remarks.js +1 -0
  387. package/app/controllers/management/vendors/index/details.js +1 -0
  388. package/app/controllers/management/vendors/index.js +1 -0
  389. package/app/controllers/management.js +1 -0
  390. package/app/controllers/operations/orders/index/config/types.js +1 -0
  391. package/app/controllers/operations/orders/index/config.js +1 -0
  392. package/app/controllers/operations/orders/index/new.js +1 -0
  393. package/app/controllers/operations/orders/index/view.js +1 -0
  394. package/app/controllers/operations/scheduler/index.js +1 -0
  395. package/app/controllers/operations/service-rates/index/edit.js +1 -0
  396. package/app/controllers/operations/service-rates/index/new.js +1 -0
  397. package/app/controllers/operations/service-rates/index.js +1 -0
  398. package/app/controllers/operations/zones/index.js +1 -0
  399. package/app/helpers/avatar-url.js +1 -0
  400. package/app/helpers/extract-coordinates.js +1 -0
  401. package/app/helpers/feature-group.js +1 -0
  402. package/app/helpers/flow-raw-status.js +1 -0
  403. package/app/helpers/format-point.js +1 -0
  404. package/app/helpers/get-tip-amount.js +1 -0
  405. package/app/helpers/is-facilitator-supported-place.js +1 -0
  406. package/app/helpers/is-not-facilitator-supported-place.js +1 -0
  407. package/app/helpers/is-waypoint-record.js +1 -0
  408. package/app/helpers/point-coordinates.js +1 -0
  409. package/app/helpers/point-to-coordinates.js +1 -0
  410. package/app/helpers/service-name.js +1 -0
  411. package/app/helpers/waypoint-label.js +1 -0
  412. package/app/modifiers/translate-x.js +1 -0
  413. package/app/routes/home.js +1 -0
  414. package/app/routes/management/fleets/index/details.js +1 -0
  415. package/app/routes/operations/orders/index/config/types.js +1 -0
  416. package/app/routes/operations/orders/index/config.js +1 -0
  417. package/app/routes/operations/orders/index/new.js +1 -0
  418. package/app/routes/operations/orders/index/view.js +1 -0
  419. package/app/routes/operations/scheduler/index.js +1 -0
  420. package/app/routes/operations/scheduler.js +1 -0
  421. package/app/routes/operations/service-rates/index/edit.js +1 -0
  422. package/app/routes/operations/service-rates/index/new.js +1 -0
  423. package/app/services/map-manager.js +1 -0
  424. package/app/services/service-areas.js +1 -0
  425. package/app/templates/home.js +1 -0
  426. package/app/templates/management/fleets/index/details.js +1 -0
  427. package/app/templates/operations/orders/index/config/types.js +1 -0
  428. package/app/templates/operations/orders/index/config.js +1 -0
  429. package/app/templates/operations/orders/index/new.js +1 -0
  430. package/app/templates/operations/orders/index/view.js +1 -0
  431. package/app/templates/operations/scheduler/index.js +1 -0
  432. package/app/templates/operations/scheduler.js +1 -0
  433. package/app/templates/operations/service-rates/index/edit.js +1 -0
  434. package/app/templates/operations/service-rates/index/new.js +1 -0
  435. package/app/utils/calculate-percentage.js +1 -0
  436. package/app/utils/extract-coordinates.js +1 -0
  437. package/app/utils/format-currency.js +1 -0
  438. package/app/utils/geojson/geo-json.js +1 -0
  439. package/app/utils/is-facilitator-supported-place.js +1 -0
  440. package/app/utils/is-latitude.js +1 -0
  441. package/app/utils/to-model.js +1 -0
  442. package/assets/images/drawing-controls-spritesheet-inverted.png +0 -0
  443. package/config/environment.js +25 -0
  444. package/index.js +73 -0
  445. package/package.json +132 -0
  446. package/pnpm-lock.yaml +12613 -0
@@ -0,0 +1,108 @@
1
+ <div class="order-config-activity-flow-editor" {{did-insert this.setupComponent}} ...attributes>
2
+ <div class="content-panel mb-20">
3
+ <div class="content-panel-header items-center">
4
+ <h3 class="text-lg font-semibold dark:text-gray-100">
5
+ Activity Flow
6
+ </h3>
7
+
8
+ <Button @icon="plus" @iconPrefix="fas" @text="New Status" @size="sm" @onClick={{this.newStatus}} />
9
+ </div>
10
+ <div class="content-panel-body no-padding">
11
+ <div class="my-6 px-5">
12
+ <p>Activity flow configuration will allow you to define the different types of tracking status activities that apply for this order type. Logic of the activity flow can also be configured.</p>
13
+ </div>
14
+
15
+ <div class="ui-tabs mb-4">
16
+ <nav>
17
+ <a href="javascript:;" class="ui-tab {{if (eq this.activeTab 'order') 'active'}}" {{on "click" (fn (mut this.activeTab) "order" )}}>
18
+ Order Flow
19
+ </a>
20
+ <a href="javascript:;" class="ui-tab {{if (eq this.activeTab 'waypoint') 'active'}}" {{on "click" (fn (mut this.activeTab) "waypoint" )}}>
21
+ Waypoint Flow
22
+ </a>
23
+ </nav>
24
+ </div>
25
+
26
+ {{#if @orderConfig.meta.flow}}
27
+ <div class="px-5">
28
+ {{#if this.flow}}
29
+ <Dragula @onDrop={{this.moveStatus}} @onReady={{this.setDragulaInstance}} as |Container|>
30
+ <Container class="activity-flow-connector">
31
+ {{#each-in this.activeFlow as |status activity|}}
32
+ <div data-status={{status}} class="activity-flow-sub-connector {{dasherize (flow-raw-status status)}}-flow pb-6">
33
+ <div class="activity-status relative cursor-move flex items-center justify-center mb-6">
34
+ <div class="relative px-3 py-2 status-element {{dasherize (flow-raw-status status)}}-status-element rounded-md flex flex-col items-center justify-center">
35
+ <Badge @status={{flow-raw-status status}} class="status-badge-lg shadow-none" />
36
+ <Button @text="New Activity" @icon="plus" @iconPrefix="fas" @wrapperClass="my-2" @onClick={{fn this.addNewActivity status}} />
37
+ {{#if (not (includes status (w "created dispatched completed")))}}
38
+ <div class="absolute top-0 right-0">
39
+ <button type="button" class="flex items-center justify-center rounded-full w-6 h-6 bg-gray-900 font-semibold text-white -mt-3 -mr-3 shadow-sm" {{on "click" (fn this.removeStatus status)}}>
40
+ <FaIcon @prefix="fas" @icon="times" class="text-white" />
41
+ </button>
42
+ </div>
43
+ {{/if}}
44
+ </div>
45
+ </div>
46
+ <div class="activity-events-list">
47
+ {{#each activity.events as |event|}}
48
+ <div class="shadow-sm border-2 status-element-border {{dasherize (flow-raw-status status)}}-status-element dark:bg-gray-800 bg-gray-100">
49
+ <div class="p-3 border-b border-gray-300 dark:border-gray-900">
50
+ <div class="mb-4 flex items-center justify-between">
51
+ <div>
52
+ <FaIcon @icon="sitemap" class="mr-2 dark:text-sky-300" />
53
+ <span class="dark:text-gray-100 text-sm">Activity Details</span>
54
+ </div>
55
+ <a href="javascript:;" class="btn btn-danger btn-sm" {{on "click" (fn this.removeActivity status event)}}>
56
+ <FaIcon @icon="trash" />
57
+ </a>
58
+ </div>
59
+ <div class="grid grid-cols-3 gap-2">
60
+ <InputGroup @name="Status" @value={{event.status}} />
61
+ <InputGroup @name="Code" @value={{event.code}} />
62
+ <InputGroup @name="Details" @value={{event.details}} />
63
+ </div>
64
+ </div>
65
+ <div class="p-3">
66
+ <div class="mb-4 flex items-center justify-between">
67
+ <div>
68
+ <FaIcon @icon="project-diagram" class="mr-2 dark:text-sky-300" />
69
+ <span class="dark:text-gray-100 text-sm">Logic Stack</span>
70
+ </div>
71
+ <Button @text="Add logic condition" @icon="plus" @iconPrefix="fas" @onClick={{fn this.addLogicCondition status event}} />
72
+ </div>
73
+ <div class="space-y-3 mb-3">
74
+ {{#each event.if as |logic conditionIndex|}}
75
+ <div class="grid grid-cols-5 gap-2">
76
+ <div class="flex items-center col-span-2">
77
+ <div class="py-2 px-3 rounded flex items-center justify-center text-center text-sm font-bold text-mono mr-3 dark:text-gray-50 border border-gray-50 dark:border-gray-900">
78
+ if
79
+ </div>
80
+ <Select @options={{this.configFields}} @value={{get logic 0}} @placeholder="Select field" class="flex-1 w-full" @onSelect={{fn this.updateActivityLogic status event conditionIndex 0}} />
81
+ </div>
82
+ <Select @options={{this.logicOperators}} @value={{get logic 1}} @optionLabel="label" @optionValue="value" @onSelect={{fn this.updateActivityLogic status event conditionIndex 1}} @placeholder="Select operator" />
83
+ <div class="flex items-center col-span-2">
84
+ <Input @type="text" @value={{get logic 2}} @onKeyUp={{fn this.updateActivityLogic status event conditionIndex 2}} placeholder="Enter value to compare" class="form-input w-full flex-1 mr-3" />
85
+ <Button @size="sm" @icon="trash" @onClick={{fn this.removeLogicCondition event logic}} />
86
+ </div>
87
+ </div>
88
+ {{else}}
89
+ <div class="flex items-center justify-center">
90
+ <div class="rounded bg-gray-300 dark:bg-gray-700 shadow-sm text-sm text-center px-6 py-3 dark:text-gray-100 border border-dashed border-gray-500 dark:border-gray-900">No logic conditions applied</div>
91
+ </div>
92
+ {{/each}}
93
+ </div>
94
+ </div>
95
+
96
+ </div>
97
+ {{/each}}
98
+ </div>
99
+ </div>
100
+ {{/each-in}}
101
+ </Container>
102
+ </Dragula>
103
+ {{/if}}
104
+ </div>
105
+ {{/if}}
106
+ </div>
107
+ </div>
108
+ </div>
@@ -0,0 +1,374 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
4
+ import { action, computed, set, setProperties } from '@ember/object';
5
+ import { isArray } from '@ember/array';
6
+ import { equal } from '@ember/object/computed';
7
+ import { underscore } from '@ember/string';
8
+ import generateUuid from '@fleetbase/ember-core/utils/generate-uuid';
9
+
10
+ export default class OrderConfigActivityFlowEditorComponent extends Component {
11
+ constructor() {
12
+ super(...arguments);
13
+ const { orderConfig } = this.args;
14
+
15
+ this.orderConfig = orderConfig;
16
+
17
+ if (orderConfig.meta.flow) {
18
+ this.flow = this.fixOrderFlow(orderConfig.meta.flow);
19
+ }
20
+ }
21
+
22
+ @service modalsManager;
23
+ @service notifications;
24
+ @service fetch;
25
+
26
+ @tracked drake;
27
+ @tracked orderConfig = {};
28
+ @tracked flow = {};
29
+ @tracked dynamicMetaFields = [];
30
+ @tracked notify = 0;
31
+ @tracked activeTab = 'order';
32
+
33
+ @tracked logicOperators = [
34
+ { label: 'equals', value: '=' },
35
+ { label: 'not equals', value: '!=' },
36
+ { label: 'contains', value: '$' },
37
+ { label: 'greater than', value: '>' },
38
+ { label: 'less than', value: '<' },
39
+ ];
40
+
41
+ @equal('activeTab', 'order') isOrderTab;
42
+ @equal('activeTab', 'waypoint') isWaypointTab;
43
+ @equal('activeTab', 'entity') isEntityTab;
44
+
45
+ @computed('activeTab', 'flow', 'orderConfig.id') get activeFlow() {
46
+ const activeTab = this.activeTab;
47
+
48
+ return this[`${activeTab}Flow`];
49
+ }
50
+
51
+ @computed('flow', 'orderConfig.id') get waypointFlow() {
52
+ const { flow } = this;
53
+ const keys = Object.keys(flow);
54
+ const waypointFlow = {};
55
+
56
+ for (let i = 0; i < keys.length; i++) {
57
+ const key = keys.objectAt(i);
58
+
59
+ if (key.startsWith('waypoint|')) {
60
+ waypointFlow[key] = flow[key];
61
+ }
62
+ }
63
+
64
+ return waypointFlow;
65
+ }
66
+
67
+ @computed('flow', 'orderConfig.id') get entityFlow() {
68
+ const { flow } = this;
69
+ const keys = Object.keys(flow);
70
+ const entityFlow = {};
71
+
72
+ for (let i = 0; i < keys.length; i++) {
73
+ const key = keys.objectAt(i);
74
+
75
+ if (key.startsWith('waypoint|')) {
76
+ entityFlow[key] = flow[key];
77
+ }
78
+ }
79
+
80
+ return entityFlow;
81
+ }
82
+
83
+ @computed('flow', 'orderConfig.id') get orderFlow() {
84
+ const { flow } = this;
85
+ const keys = Object.keys(flow);
86
+ const orderFlow = {};
87
+
88
+ for (let i = 0; i < keys.length; i++) {
89
+ const key = keys.objectAt(i);
90
+
91
+ if (!key.startsWith('waypoint|') && !key.startsWith('entity|')) {
92
+ orderFlow[key] = flow[key];
93
+ }
94
+ }
95
+
96
+ return orderFlow;
97
+ }
98
+
99
+ @computed('orderConfig', 'flow', 'orderConfig.meta.fields.[]', 'dynamicMetaFields.[]')
100
+ get configFields() {
101
+ const { flow, dynamicMetaFields } = this;
102
+ const defaultLogicFields = ['status', 'type', 'internal_id', 'id', 'adhoc', 'pod_method', 'pod_required', 'scheduled_at'];
103
+ const metaFields = Array.from(this.orderConfig.meta.fields ?? []).map((metaField) => `meta.${metaField.key}`);
104
+ const inheritedFields = [];
105
+
106
+ // loop through and add preset meta fields
107
+ for (let key in flow) {
108
+ const activity = flow[key];
109
+
110
+ if (isArray(activity.events)) {
111
+ for (let i = 0; i < activity.events.length; i++) {
112
+ const event = activity.events.objectAt(i);
113
+
114
+ if (isArray(event.if)) {
115
+ for (let j = 0; j < event.if.length; j++) {
116
+ const logic = event.if.objectAt(j);
117
+
118
+ if (typeof logic[0] === 'string') {
119
+ inheritedFields.pushObject(logic[0]);
120
+ }
121
+ }
122
+ }
123
+ }
124
+ }
125
+ }
126
+
127
+ return [...defaultLogicFields, ...metaFields, ...inheritedFields, ...dynamicMetaFields];
128
+ }
129
+
130
+ @action setupComponent() {
131
+ this.fetchDynamicMetaFields();
132
+ }
133
+
134
+ @action fetchDynamicMetaFields() {
135
+ this.fetch
136
+ .get('fleet-ops/order-configs/dynamic-meta-fields', {
137
+ type: this.orderConfig.key,
138
+ })
139
+ .then((dynamicMetaFields) => {
140
+ this.dynamicMetaFields = dynamicMetaFields ?? [];
141
+ });
142
+ }
143
+
144
+ @action setDragulaInstance(drake) {
145
+ this.drake = drake;
146
+ }
147
+
148
+ @action newStatus() {
149
+ const { flow } = this;
150
+
151
+ this.modalsManager.show('modals/order-config-new-status', {
152
+ title: 'Add new status to flow',
153
+ statusName: null,
154
+ confirm: async (modal) => {
155
+ const statusName = modal.getOption('statusName');
156
+
157
+ if (!statusName) {
158
+ return this.notifications.warning('No status entered.');
159
+ }
160
+
161
+ const format = (status) => underscore(status.toLowerCase());
162
+ const status = this.activeTab === 'order' ? format(statusName) : `${this.activeTab}|${format(statusName)}`;
163
+
164
+ if (flow[status]) {
165
+ await modal.done();
166
+ // prompt to confirm overwrite
167
+ return this.modalsManager.confirm({
168
+ title: 'This will overwrite an existing status!',
169
+ body: `There is another '${statusName}' status already existing in this flow, if you continue this status will be overwritten. Would you like to overwrite the previous '${statusName}' status?`,
170
+ acceptButtonText: 'Yes, overwrite!',
171
+ confirm: (modal) => {
172
+ this.insertNewStatus(status);
173
+ modal.done();
174
+ },
175
+ });
176
+ }
177
+
178
+ this.insertNewStatus(status);
179
+ modal.done();
180
+ },
181
+ });
182
+ }
183
+
184
+ insertNewStatus(statusName) {
185
+ const { flow } = this;
186
+ const status = underscore(statusName.toLowerCase());
187
+
188
+ // insert status
189
+ set(flow, status, {
190
+ id: generateUuid(),
191
+ sequence: Object.keys(flow).length + 1,
192
+ events: [],
193
+ });
194
+ this.flow = flow;
195
+
196
+ // add initial activity
197
+ this.addNewActivity(status);
198
+
199
+ if (typeof this.args.onFlowChanged === 'function') {
200
+ this.args.onFlowChanged(this.flow);
201
+ }
202
+ }
203
+
204
+ @action removeStatus(status) {
205
+ const { flow } = this;
206
+ this.modalsManager.confirm({
207
+ title: 'Remove status',
208
+ body: `Are you sure you wish to delete this status? All related activites and logic will be deleted along with the status.`,
209
+ acceptButtonText: 'Yes, delete',
210
+ confirm: (modal) => {
211
+ delete flow[status];
212
+ set(this, 'flow', flow);
213
+
214
+ if (typeof this.args.onFlowChanged === 'function') {
215
+ this.args.onFlowChanged(this.flow);
216
+ }
217
+ modal.done();
218
+ },
219
+ });
220
+ }
221
+
222
+ @action moveStatus(el, container) {
223
+ const { flow } = this;
224
+ const { status } = el.dataset;
225
+
226
+ if (!status) {
227
+ return;
228
+ }
229
+
230
+ const format = (s) => s.replace(`${this.activeTab}|`, '');
231
+
232
+ // if status is created or dispatched prevent from dragging
233
+ if (['created', 'dispatched', 'completed'].includes(format(status))) {
234
+ this.notifications.warning(`The '${format(status)}' must be in this order of sequence, unable to shift.`);
235
+ this.drake.cancel(true);
236
+ return;
237
+ }
238
+
239
+ const sequence = Array.prototype.indexOf.call(container.children, el);
240
+ const activity = flow[status];
241
+
242
+ // if is not created but attempt to move to sequence 0
243
+ if (format(status) !== 'created' && sequence === 0) {
244
+ this.notifications.warning(`The created status must always be the first sequence of an order flow.`);
245
+ this.drake.cancel(true);
246
+ return;
247
+ }
248
+
249
+ if (!activity) {
250
+ return;
251
+ }
252
+
253
+ setProperties(activity, { sequence });
254
+
255
+ this.flow[status] = activity;
256
+
257
+ if (typeof this.args.onFlowChanged === 'function') {
258
+ this.args.onFlowChanged(this.flow);
259
+ }
260
+ }
261
+
262
+ @action addNewActivity(status) {
263
+ if (!this.flow[status]) {
264
+ return;
265
+ }
266
+
267
+ const event = {
268
+ id: generateUuid(),
269
+ stauts: null,
270
+ code: null,
271
+ details: null,
272
+ if: [],
273
+ };
274
+
275
+ this.flow[status]['events'].pushObject(event);
276
+
277
+ if (typeof this.args.onFlowChanged === 'function') {
278
+ this.args.onFlowChanged(this.flow);
279
+ }
280
+ }
281
+
282
+ @action removeActivity(status, event) {
283
+ if (!this.flow[status]) {
284
+ return;
285
+ }
286
+
287
+ if (this.flow[status]['events'].length === 1) {
288
+ return;
289
+ }
290
+
291
+ this.flow[status]['events'].removeObject(event);
292
+
293
+ if (typeof this.args.onFlowChanged === 'function') {
294
+ this.args.onFlowChanged(this.flow);
295
+ }
296
+ }
297
+
298
+ @action updateActivityLogic(status, event, conditionIndex, index, value) {
299
+ if (!this.flow[status]) {
300
+ return;
301
+ }
302
+
303
+ const eventIndex = this.flow[status]['events'].findIndex((e) => e.code === event.code);
304
+
305
+ if (eventIndex === -1) {
306
+ return;
307
+ }
308
+
309
+ set(this.flow, `${status}.events.${eventIndex}.if.${conditionIndex}.${index}`, value);
310
+
311
+ if (typeof this.args.onFlowChanged === 'function') {
312
+ this.args.onFlowChanged(this.flow);
313
+ }
314
+ }
315
+
316
+ @action addLogicCondition(status, event) {
317
+ if (!this.flow[status]) {
318
+ return;
319
+ }
320
+
321
+ const condition = ['if', '=', ''];
322
+ const index = this.flow[status]['events'].findIndex((e) => e.code === event.code);
323
+
324
+ if (index === -1) {
325
+ return;
326
+ }
327
+
328
+ if (!isArray(event.if)) {
329
+ event.if = [];
330
+ }
331
+
332
+ event.if.pushObject(condition);
333
+
334
+ this.flow[status]['events'][index] = event;
335
+
336
+ if (typeof this.args.onFlowChanged === 'function') {
337
+ this.args.onFlowChanged(this.flow);
338
+ }
339
+ }
340
+
341
+ @action removeLogicCondition(event, condition) {
342
+ event.if.removeObject(condition);
343
+
344
+ if (typeof this.args.onFlowChanged === 'function') {
345
+ this.args.onFlowChanged(this.flow);
346
+ }
347
+ }
348
+
349
+ fixOrderFlow(flow) {
350
+ const patched = {};
351
+
352
+ for (const status in flow) {
353
+ const activity = flow[status];
354
+
355
+ patched[status] = activity;
356
+
357
+ for (let i = 0; i < activity.events.length; i++) {
358
+ const event = activity.events.objectAt(i);
359
+
360
+ if (!event.if) {
361
+ event.if = [];
362
+ }
363
+
364
+ if (!event.post_actions) {
365
+ event.post_actions = [];
366
+ }
367
+
368
+ patched[status]['events'][i] = event;
369
+ }
370
+ }
371
+
372
+ return patched;
373
+ }
374
+ }
@@ -0,0 +1,32 @@
1
+ <div class="order-config-details-editor" ...attributes>
2
+ <div class="content-panel mb-6">
3
+ <div class="content-panel-header items-center">
4
+ <h3 class="text-lg font-semibold dark:text-gray-100">
5
+ {{@orderConfig.name}}
6
+ </h3>
7
+ <div>
8
+ {{#if @orderConfig.installed}}
9
+ <Badge @hideStatusDot={{false}} @disableHumanize={{true}} @status="success">Installed</Badge>
10
+ {{/if}}
11
+ </div>
12
+ </div>
13
+ <div class="content-panel-body">
14
+
15
+ <InputGroup @name="Name" @value={{@orderConfig.name}} />
16
+ <InputGroup @name="Description" @value={{@orderConfig.description}} />
17
+ <InputGroup @name="Key" @value={{@orderConfig.key}} @disabled={{true}} readonly={{true}} @helpText="Pass this key into your order type to configure the order using this config." />
18
+ <InputGroup @name="Namespace" @value={{@orderConfig.namespace}} @disabled={{true}} readonly={{true}} @helpText="Unique namespace for this extension." />
19
+ <InputGroup @name="Extension ID" @value={{@orderConfig.extension_id}} @disabled={{true}} readonly={{true}} @helpText="Unique ID for this extension." />
20
+ <InputGroup @name="Extension Version" @value={{@orderConfig.version}} @disabled={{true}} readonly={{true}} @helpText="Version of this extension." />
21
+ </div>
22
+ </div>
23
+ <div class="flex items-center justify-end">
24
+ <Button @type="default" @icon="clone" @text="Clone Configuration" @size="sm" @wrapperClass="mr-2" @onClick={{fn this.sendAction "clone" @orderConfig}} />
25
+ {{#if @orderConfig.installed}}
26
+ <Button @type="danger" @icon="trash" @text="Uninstall Configuration" @size="sm" @onClick={{fn this.sendAction "uninstall" @orderConfig}} />
27
+ {{else}}
28
+ <Button @type="danger" @icon="trash" @text="Delete Configuration" @size="sm" @onClick={{fn this.sendAction "delete" @orderConfig}} />
29
+ {{/if}}
30
+ </div>
31
+ {{yield}}
32
+ </div>
@@ -0,0 +1,16 @@
1
+ import Component from '@glimmer/component';
2
+ import { action } from '@ember/object';
3
+ import { classify } from '@ember/string';
4
+
5
+ export default class OrderConfigDetailsEditorComponent extends Component {
6
+ @action sendAction(action) {
7
+ const actionName = `on${classify(action)}`;
8
+ const params = [...arguments];
9
+
10
+ params.shift();
11
+
12
+ if (typeof this.args[actionName] === 'function') {
13
+ this.args[actionName](...params);
14
+ }
15
+ }
16
+ }
@@ -0,0 +1,84 @@
1
+ <div class="order-config-entities-editor" ...attributes>
2
+ <div class="content-panel mb-20">
3
+ <div class="content-panel-header items-center">
4
+ <h3 class="text-lg font-semibold dark:text-gray-100">
5
+ Entities
6
+ </h3>
7
+
8
+ <Button @text="New Entity Type" @icon="plus" @iconPrefix="fas" @onClick={{this.newEntity}} />
9
+ </div>
10
+ <div class="content-panel-body">
11
+ <div class="mb-6">
12
+ <p>
13
+ Entities configuration will allow you to define the different type of entities that should be selectable for this order type. These should be used like templates to make manual order creation faster.
14
+ </p>
15
+ </div>
16
+
17
+ <div class="space-y-3">
18
+ {{#if this.orderConfig.meta.entities}}
19
+ {{#each this.orderConfig.meta.entities as |entity index|}}
20
+ <div class="rounded shadow-sm border border-gray-300 dark:border-gray-700">
21
+ <div class="border-b border-gray-300 dark:border-gray-700 dark:bg-gray-900 p-3 ">
22
+ <div class="flex items-center justify-between">
23
+ <div>
24
+ <FaIcon @icon="box-alt" class="mr-2 dark:text-sky-300" />
25
+ <span class="dark:text-gray-100 text-sm mr-1">Entity Type</span>
26
+ <span class="dark:text-gray-100 text-sm">({{entity.name}})</span>
27
+ </div>
28
+ <div class="flex items-center">
29
+ <a href="javascript:;" class="mr-2 btn btn-danger btn-sm" {{on "click" (fn this.removeEntity index)}}>
30
+ <FaIcon @icon="trash" />
31
+ </a>
32
+ <Button @text="Add meta field" @icon="plus" @iconPrefix="fas" @onClick={{fn this.addMetaField index}} />
33
+ </div>
34
+ </div>
35
+ </div>
36
+ <div class="p-3">
37
+ <div class="grid grid-cols-3 gap-2">
38
+ <InputGroup @name="Name" @value={{entity.name}} />
39
+ <InputGroup @name="Type" @value={{entity.type}}>
40
+ <KeyInput @value={{entity.type}} @onChange={{fn (mut entity.type)}} />
41
+ </InputGroup>
42
+ <InputGroup @name="Description" @value={{entity.description}} class="col-span-2" />
43
+ </div>
44
+
45
+ <div class="grid grid-cols-5 gap-2">
46
+ <InputGroup @name="Weight" @value={{entity.weight}} class="col-span-3" />
47
+ <InputGroup @name="Unit">
48
+ <Select @value={{entity.weight_unit}} @options={{this.weightUnits}} @optionLabel="name" @optionValue="value" class="w-full" />
49
+ </InputGroup>
50
+ </div>
51
+
52
+ <div class="grid grid-cols-5 gap-2">
53
+ <InputGroup @name="Length" @value={{entity.length}} />
54
+ <InputGroup @name="Width" @value={{entity.width}} />
55
+ <InputGroup @name="Height" @value={{entity.width}} />
56
+ <InputGroup @name="Unit">
57
+ <Select @value={{entity.dimentions_unit}} @options={{this.lengthUnits}} @optionLabel="name" @optionValue="value" class="w-full" />
58
+ </InputGroup>
59
+ </div>
60
+
61
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-2">
62
+ {{#each-in entity.meta as |key value|}}
63
+ <div class="input-group">
64
+ <div class="flex items-center justify-between mb-1.5">
65
+ <InputLabel @labelText={{humanize key}} class="truncate" />
66
+ <div>
67
+ <button type="button" class="btn btn-danger btn-outline btn-sm" {{on "click" (fn this.removeMetaKey index key)}}>
68
+ <FaIcon @icon="trash" />
69
+ </button>
70
+ </div>
71
+ </div>
72
+ <Input class="form-input w-full" name={{humanize key}} @value={{value}} placeholder={{humanize key}} />
73
+ </div>
74
+ {{/each-in}}
75
+ </div>
76
+ </div>
77
+ </div>
78
+ {{/each}}
79
+ {{/if}}
80
+ </div>
81
+
82
+ </div>
83
+ </div>
84
+ </div>