@fleetbase/fleetops-engine 0.3.0 → 0.3.2

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 (235) hide show
  1. package/addon/components/contact-form-panel.hbs +82 -0
  2. package/addon/components/contact-form-panel.js +195 -0
  3. package/addon/components/contact-panel/details.hbs +36 -0
  4. package/addon/components/contact-panel/details.js +3 -0
  5. package/addon/components/contact-panel.hbs +52 -0
  6. package/addon/components/contact-panel.js +161 -0
  7. package/addon/components/driver-form-panel.hbs +39 -55
  8. package/addon/components/driver-form-panel.js +41 -0
  9. package/addon/components/driver-panel/details.hbs +2 -2
  10. package/addon/components/driver-panel.hbs +12 -10
  11. package/addon/components/driver-panel.js +13 -0
  12. package/addon/components/fleet-form-panel.hbs +28 -28
  13. package/addon/components/fleet-form-panel.js +150 -1
  14. package/addon/components/fleet-listing-panel.hbs +8 -0
  15. package/addon/components/fleet-listing-panel.js +34 -0
  16. package/addon/components/fleet-panel/details.hbs +30 -0
  17. package/addon/components/fleet-panel/driver-listing.hbs +72 -0
  18. package/addon/components/fleet-panel/driver-listing.js +149 -0
  19. package/addon/components/fleet-panel/vehicle-listing.hbs +72 -0
  20. package/addon/components/fleet-panel/vehicle-listing.js +149 -0
  21. package/addon/components/fleet-panel.hbs +12 -58
  22. package/addon/components/fleet-panel.js +148 -26
  23. package/addon/components/fleet-vehicle-listing.hbs +0 -1
  24. package/addon/components/fuel-report-form-panel.hbs +41 -0
  25. package/addon/components/fuel-report-form-panel.js +122 -0
  26. package/addon/components/fuel-report-panel/details.hbs +38 -0
  27. package/addon/components/fuel-report-panel.hbs +30 -0
  28. package/addon/components/fuel-report-panel.js +161 -0
  29. package/addon/components/issue-form-panel.hbs +85 -0
  30. package/addon/components/issue-form-panel.js +211 -0
  31. package/addon/components/issue-panel/details.hbs +48 -0
  32. package/addon/components/issue-panel.hbs +30 -0
  33. package/addon/components/issue-panel.js +160 -0
  34. package/addon/components/layout/fleet-ops-sidebar.hbs +2 -2
  35. package/addon/components/live-map.js +2 -0
  36. package/addon/components/map-container/toolbar.hbs +9 -9
  37. package/addon/components/map-container/topbar.hbs +1 -1
  38. package/addon/components/modals/issue-details.hbs +38 -0
  39. package/addon/components/modals/issue-from.hbs +138 -0
  40. package/addon/components/place-form-panel.hbs +50 -0
  41. package/addon/components/place-form-panel.js +134 -0
  42. package/addon/components/place-panel/details.hbs +95 -0
  43. package/addon/components/place-panel.hbs +30 -0
  44. package/addon/components/place-panel.js +161 -0
  45. package/addon/components/vehicle-form-panel.hbs +35 -44
  46. package/addon/components/vehicle-form-panel.js +41 -0
  47. package/addon/components/vehicle-panel/details.hbs +8 -2
  48. package/addon/components/vehicle-panel.hbs +8 -6
  49. package/addon/components/vendor-form-panel/create-form.hbs +114 -0
  50. package/addon/components/vendor-form-panel/create-form.js +158 -0
  51. package/addon/components/vendor-form-panel/edit-form.hbs +98 -0
  52. package/addon/components/vendor-form-panel/edit-form.js +51 -0
  53. package/addon/components/vendor-form-panel.hbs +48 -0
  54. package/addon/components/vendor-form-panel.js +226 -0
  55. package/addon/components/vendor-panel/details.hbs +77 -0
  56. package/addon/components/vendor-panel/details.js +12 -0
  57. package/addon/components/vendor-panel.hbs +58 -0
  58. package/addon/components/vendor-panel.js +161 -0
  59. package/addon/controllers/management/contacts/index/details.js +55 -0
  60. package/addon/controllers/management/contacts/index/edit.js +111 -0
  61. package/addon/controllers/management/contacts/index/new.js +88 -0
  62. package/addon/controllers/management/contacts/index.js +23 -128
  63. package/addon/controllers/management/drivers/index/new.js +2 -2
  64. package/addon/controllers/management/drivers/index.js +18 -32
  65. package/addon/controllers/management/fleets/index/details.js +53 -0
  66. package/addon/controllers/management/fleets/index/edit.js +75 -41
  67. package/addon/controllers/management/fleets/index/new.js +42 -57
  68. package/addon/controllers/management/fleets/index.js +0 -1
  69. package/addon/controllers/management/fuel-reports/index/details.js +63 -0
  70. package/addon/controllers/management/fuel-reports/index/edit.js +111 -0
  71. package/addon/controllers/management/fuel-reports/index/new.js +95 -0
  72. package/addon/controllers/management/fuel-reports/index.js +57 -127
  73. package/addon/controllers/management/issues/index/details.js +54 -0
  74. package/addon/controllers/management/issues/index/edit.js +111 -0
  75. package/addon/controllers/management/issues/index/new.js +94 -0
  76. package/addon/controllers/management/issues/index.js +131 -26
  77. package/addon/controllers/management/places/index/details.js +55 -0
  78. package/addon/controllers/management/places/index/edit.js +111 -0
  79. package/addon/controllers/management/places/index/new.js +88 -0
  80. package/addon/controllers/management/places/index.js +21 -182
  81. package/addon/controllers/management/vehicles/index/new.js +2 -6
  82. package/addon/controllers/management/vendors/index/details.js +55 -0
  83. package/addon/controllers/management/vendors/index/edit.js +111 -0
  84. package/addon/controllers/management/vendors/index/new.js +88 -0
  85. package/addon/controllers/management/vendors/index.js +43 -247
  86. package/addon/routes/management/contacts/index/details.js +14 -0
  87. package/addon/routes/management/contacts/index/edit.js +10 -0
  88. package/addon/routes/management/contacts/index/new.js +3 -0
  89. package/addon/routes/management/contacts/index.js +1 -1
  90. package/addon/routes/management/fleets/index/details.js +1 -1
  91. package/addon/routes/management/fleets/index/edit.js +1 -1
  92. package/addon/routes/management/fleets/index.js +1 -1
  93. package/addon/routes/management/fuel-reports/index/details.js +14 -0
  94. package/addon/routes/management/fuel-reports/index/edit.js +10 -0
  95. package/addon/routes/management/fuel-reports/index/new.js +3 -0
  96. package/addon/routes/management/fuel-reports/index.js +3 -1
  97. package/addon/routes/management/issues/index/details.js +14 -0
  98. package/addon/routes/management/issues/index/edit.js +10 -0
  99. package/addon/routes/management/issues/index/new.js +3 -0
  100. package/addon/routes/management/issues/index.js +1 -1
  101. package/addon/routes/management/places/index/details.js +14 -0
  102. package/addon/routes/management/places/index/edit.js +10 -0
  103. package/addon/routes/management/places/index/new.js +3 -0
  104. package/addon/routes/management/places/index.js +6 -1
  105. package/addon/routes/management/vendors/index/details.js +15 -0
  106. package/addon/routes/management/vendors/index/edit.js +11 -0
  107. package/addon/routes/management/vendors/index/new.js +3 -0
  108. package/addon/routes/management/vendors/index.js +1 -0
  109. package/addon/routes.js +27 -7
  110. package/addon/services/context-panel.js +60 -0
  111. package/addon/templates/management/contacts/index/details.hbs +1 -0
  112. package/addon/templates/management/contacts/index/edit.hbs +1 -0
  113. package/addon/templates/management/contacts/index/new.hbs +1 -0
  114. package/addon/templates/management/contacts/index.hbs +22 -3
  115. package/addon/templates/management/drivers/index.hbs +29 -5
  116. package/addon/templates/management/fleets/index/details.hbs +1 -1
  117. package/addon/templates/management/fleets/index/edit.hbs +1 -1
  118. package/addon/templates/management/fleets/index/new.hbs +1 -1
  119. package/addon/templates/management/fuel-reports/index/details.hbs +1 -0
  120. package/addon/templates/management/fuel-reports/index/edit.hbs +1 -0
  121. package/addon/templates/management/fuel-reports/index/new.hbs +1 -0
  122. package/addon/templates/management/fuel-reports/index.hbs +25 -4
  123. package/addon/templates/management/issues/index/details.hbs +1 -0
  124. package/addon/templates/management/issues/index/edit.hbs +1 -0
  125. package/addon/templates/management/issues/index/new.hbs +1 -0
  126. package/addon/templates/management/issues/index.hbs +5 -3
  127. package/addon/templates/management/places/index/details.hbs +1 -0
  128. package/addon/templates/management/places/index/edit.hbs +1 -0
  129. package/addon/templates/management/places/index/new.hbs +1 -0
  130. package/addon/templates/management/vendors/index/details.hbs +1 -0
  131. package/addon/templates/management/vendors/index/edit.hbs +1 -0
  132. package/addon/templates/management/vendors/index/new.hbs +1 -0
  133. package/addon/templates/operations/orders/index.hbs +3 -3
  134. package/app/components/contact-form-panel.js +1 -0
  135. package/app/components/contact-panel/details.js +1 -0
  136. package/app/components/contact-panel.js +1 -0
  137. package/app/components/fleet-listing-panel.js +1 -0
  138. package/app/components/fleet-panel/details.js +1 -0
  139. package/app/components/fleet-panel/driver-listing.js +1 -0
  140. package/app/components/fleet-panel/vehicle-listing.js +1 -0
  141. package/app/components/fuel-report-form-panel.js +1 -0
  142. package/app/components/fuel-report-panel.js +1 -0
  143. package/app/components/issue-form-panel.js +1 -0
  144. package/app/components/issue-panel.js +1 -0
  145. package/app/components/place-form-panel.js +1 -0
  146. package/app/components/place-panel.js +1 -0
  147. package/app/components/vendor-form-panel/create-form.js +1 -0
  148. package/app/components/vendor-form-panel/edit-form.js +1 -0
  149. package/app/components/vendor-form-panel.js +1 -0
  150. package/app/components/vendor-panel/details.js +1 -0
  151. package/app/components/vendor-panel.js +1 -0
  152. package/app/controllers/management/contacts/index/details.js +1 -0
  153. package/app/controllers/management/contacts/index/edit.js +1 -0
  154. package/app/controllers/management/contacts/index/new.js +1 -0
  155. package/app/controllers/management/fuel-reports/index/details.js +1 -0
  156. package/app/controllers/management/fuel-reports/index/edit.js +1 -0
  157. package/app/controllers/management/fuel-reports/index/new.js +1 -0
  158. package/app/controllers/management/issues/index/details.js +1 -0
  159. package/app/controllers/management/issues/index/edit.js +1 -0
  160. package/app/controllers/management/issues/index/new.js +1 -0
  161. package/app/controllers/management/places/index/details.js +1 -0
  162. package/app/controllers/management/places/index/edit.js +1 -0
  163. package/app/controllers/management/places/index/new.js +1 -0
  164. package/app/controllers/management/vendors/index/edit.js +1 -0
  165. package/app/controllers/management/vendors/index/new.js +1 -0
  166. package/app/routes/addon/routes/management/places/index/new.js +1 -0
  167. package/app/routes/management/contacts/index/details.js +1 -0
  168. package/app/routes/management/contacts/index/edit.js +1 -0
  169. package/app/routes/management/contacts/index/new.js +1 -0
  170. package/app/routes/management/fuel-reports/index/details.js +1 -0
  171. package/app/routes/management/fuel-reports/index/edit.js +1 -0
  172. package/app/routes/management/fuel-reports/index/new.js +1 -0
  173. package/app/routes/management/issues/index/details.js +1 -0
  174. package/app/routes/management/issues/index/edit.js +1 -0
  175. package/app/routes/management/issues/index/new.js +1 -0
  176. package/app/routes/management/places/index/details.js +1 -0
  177. package/app/routes/management/places/index/edit.js +1 -0
  178. package/app/routes/management/places/index/new.js +1 -0
  179. package/app/routes/management/vendors/index/details.js +1 -0
  180. package/app/routes/management/vendors/index/edit.js +1 -0
  181. package/app/routes/management/vendors/index/new.js +1 -0
  182. package/app/templates/addon/routes/management/places/index/new.js +1 -0
  183. package/app/templates/management/contacts/index/details.js +1 -0
  184. package/app/templates/management/contacts/index/edit.js +1 -0
  185. package/app/templates/management/contacts/index/new.js +1 -0
  186. package/app/templates/management/fuel-reports/index/details.js +1 -0
  187. package/app/templates/management/fuel-reports/index/edit.js +1 -0
  188. package/app/templates/management/fuel-reports/index/new.js +1 -0
  189. package/app/templates/management/issues/index/details.js +1 -0
  190. package/app/templates/management/issues/index/edit.js +1 -0
  191. package/app/templates/management/issues/index/new.js +1 -0
  192. package/app/templates/management/places/index/details.js +1 -0
  193. package/app/templates/management/places/index/edit.js +1 -0
  194. package/app/templates/management/places/index/new.js +1 -0
  195. package/app/templates/management/vendors/index/details.js +1 -0
  196. package/app/templates/management/vendors/index/edit.js +1 -0
  197. package/app/templates/management/vendors/index/new.js +1 -0
  198. package/composer.json +2 -2
  199. package/config/environment.js +2 -1
  200. package/extension.json +1 -1
  201. package/package.json +4 -3
  202. package/server/migrations/2023_11_03_072503_refactor_issues_table_columns.php +42 -0
  203. package/server/migrations/2023_11_06_040645_refactor_fuel_reports_table.php +38 -0
  204. package/server/src/Casts/Point.php +15 -1
  205. package/server/src/Http/Controllers/Internal/v1/DriverController.php +33 -15
  206. package/server/src/Http/Filter/FleetFilter.php +7 -0
  207. package/server/src/Http/Filter/FuelReportFilter.php +58 -0
  208. package/server/src/Http/Filter/IssueFilter.php +69 -0
  209. package/server/src/Http/Filter/VehicleFilter.php +10 -0
  210. package/server/src/Http/Middleware/TransformLocationMiddleware.php +48 -0
  211. package/server/src/Http/Resources/v1/Driver.php +1 -0
  212. package/server/src/Http/Resources/v1/Fleet.php +20 -21
  213. package/server/src/Http/Resources/v1/FuelReport.php +37 -35
  214. package/server/src/Http/Resources/v1/Issue.php +77 -0
  215. package/server/src/Http/Resources/v1/ParentFleet.php +60 -0
  216. package/server/src/Http/Resources/v1/SubFleet.php +60 -0
  217. package/server/src/Http/Resources/v1/Vehicle.php +4 -2
  218. package/server/src/Integrations/Lalamove/Lalamove.php +6 -6
  219. package/server/src/Models/Contact.php +7 -0
  220. package/server/src/Models/Driver.php +1 -1
  221. package/server/src/Models/Fleet.php +37 -4
  222. package/server/src/Models/FuelReport.php +53 -3
  223. package/server/src/Models/Issue.php +106 -7
  224. package/server/src/Models/Vehicle.php +1 -1
  225. package/server/src/Models/VehicleDevice.php +3 -1
  226. package/server/src/Models/VehicleDeviceEvent.php +7 -3
  227. package/server/src/Notifications/OrderAssigned.php +15 -0
  228. package/server/src/Notifications/OrderCanceled.php +15 -0
  229. package/server/src/Notifications/OrderDispatchFailed.php +15 -0
  230. package/server/src/Notifications/OrderDispatched.php +15 -0
  231. package/server/src/Notifications/OrderPing.php +15 -0
  232. package/server/src/Notifications/OrderSplit.php +26 -5
  233. package/server/src/Providers/FleetOpsServiceProvider.php +22 -0
  234. package/server/src/Providers/NotificationServiceProvider.php +43 -0
  235. package/server/src/routes.php +2 -2
@@ -0,0 +1,138 @@
1
+ <Modal::Default @modalIsOpened={{@modalIsOpened}} @options={{@options}} @confirm={{@onConfirm}} @decline={{@onDecline}}>
2
+ <div class="modal-body-container">
3
+ <div class="grid grid-cols-1 text-xs dark:text-gray-100">
4
+ <InputGroup @name="Reported By">
5
+ <ModelSelect
6
+ @modelName="user"
7
+ @selectedModel={{this.issue.reporter}}
8
+ @placeholder="Select Reporter"
9
+ @triggerClass="form-select form-input"
10
+ @infiniteScroll={{false}}
11
+ @renderInPlace={{true}}
12
+ @onChange={{fn (mut this.issue.reporter)}}
13
+ as |model|
14
+ >
15
+ {{model.name}}
16
+ </ModelSelect>
17
+ </InputGroup>
18
+
19
+ <InputGroup @name="Assigned To">
20
+ <ModelSelect
21
+ @modelName="user"
22
+ @selectedModel={{this.issue.assignee}}
23
+ @placeholder="Select Assignee"
24
+ @triggerClass="form-select form-input"
25
+ @infiniteScroll={{false}}
26
+ @renderInPlace={{true}}
27
+ @onChange={{fn (mut this.issue.assignee)}}
28
+ as |model|
29
+ >
30
+ {{model.name}}
31
+ </ModelSelect>
32
+ </InputGroup>
33
+
34
+ <InputGroup @name="Driver">
35
+ <ModelSelect
36
+ @modelName="driver"
37
+ @selectedModel={{this.issue.driver}}
38
+ @placeholder="Select Driver"
39
+ @triggerClass="form-select form-input"
40
+ @infiniteScroll={{false}}
41
+ @renderInPlace={{true}}
42
+ @onChange={{fn (mut this.issue.driver)}}
43
+ as |model|
44
+ >
45
+ {{model.name}}
46
+ </ModelSelect>
47
+ </InputGroup>
48
+
49
+ <InputGroup @name="Vehicle">
50
+ <ModelSelect
51
+ @modelName="vehicle"
52
+ @selectedModel={{this.issue.vehicle}}
53
+ @placeholder="Select Vehicle"
54
+ @triggerClass="form-select form-input"
55
+ @infiniteScroll={{false}}
56
+ @renderInPlace={{true}}
57
+ @onChange={{fn (mut this.issue.vehicle)}}
58
+ as |model|
59
+ >
60
+ {{model.displayName}}
61
+ </ModelSelect>
62
+ </InputGroup>
63
+
64
+ <InputGroup @name="Issue Type">
65
+ <div class="fleetbase-model-select fleetbase-power-select ember-model-select">
66
+ <PowerSelect
67
+ @options={{this.issueTypes}}
68
+ @selected={{this.issue.type}}
69
+ @onChange={{this.onSelectIssueType}}
70
+ @placeholder="Select issue type"
71
+ @triggerClass="form-select form-input"
72
+ as |type|
73
+ >
74
+ {{smart-humanize type}}
75
+ </PowerSelect>
76
+ </div>
77
+ </InputGroup>
78
+
79
+ <InputGroup @name="Issue Category">
80
+ <div class="fleetbase-model-select fleetbase-power-select ember-model-select">
81
+ <PowerSelect
82
+ @options={{this.issueCategories}}
83
+ @selected={{this.issue.category}}
84
+ @onChange={{fn (mut this.issue.category)}}
85
+ @placeholder="Select issue category"
86
+ @triggerClass="form-select form-input"
87
+ @disabled={{not this.issueCategories}}
88
+ as |category|
89
+ >
90
+ {{smart-humanize category}}
91
+ </PowerSelect>
92
+ </div>
93
+ </InputGroup>
94
+
95
+ <InputGroup @name="Issue Report">
96
+ <Textarea @value={{this.issue.report}} aria-label="Issue Report" class="w-full form-input" placeholder="Issue Report" rows={{5}} />
97
+ </InputGroup>
98
+
99
+ <InputGroup @name="Issue Tags">
100
+ <TagInput
101
+ class="form-input"
102
+ @placeholder="Add tags"
103
+ @allowSpacesInTags={{true}}
104
+ @tags={{this.issue.tags}}
105
+ @addTag={{this.addTag}}
106
+ @removeTagAtIndex={{this.removeTag}}
107
+ as |tag|
108
+ >
109
+ {{tag}}
110
+ </TagInput>
111
+ </InputGroup>
112
+
113
+ <InputGroup @name="Priority">
114
+ <Input @value={{this.issue.priority}} @type="text" class="w-full form-input" placeholder="Priority" />
115
+ </InputGroup>
116
+
117
+ <InputGroup @name="Status">
118
+ <div class="fleetbase-model-select fleetbase-power-select ember-model-select">
119
+ <PowerSelect
120
+ @options={{this.issueStatusOptions}}
121
+ @selected={{this.issue.status}}
122
+ @onChange={{fn (mut this.issue.status)}}
123
+ @placeholder="Select issue status"
124
+ @triggerClass="form-select form-input"
125
+ as |status|
126
+ >
127
+ {{smart-humanize status}}
128
+ </PowerSelect>
129
+ </div>
130
+ </InputGroup>
131
+
132
+ <InputGroup @name="Coordinates">
133
+ <CoordinatesInput @value={{this.issue.location}} @onChange={{fn (mut this.issue.location)}} />
134
+ </InputGroup>
135
+ </div>
136
+ </div>
137
+ {{yield}}
138
+ </Modal::Default>
@@ -0,0 +1,50 @@
1
+ <Overlay
2
+ @onLoad={{this.setOverlayContext}}
3
+ @position="right"
4
+ @noBackdrop={{true}}
5
+ @fullHeight={{true}}
6
+ @isResizeble={{or this.isResizable @isResizable}}
7
+ @width={{or this.width @width "600px"}}
8
+ >
9
+ <Overlay::Header @title={{if this.place.public_id this.place.name "New Place"}} @status={{this.place.public_id}} @hideStatusDot={{true}} @createdAt={{this.place.createdAt}} @titleWrapperClass="leading-5">
10
+ <div class="flex flex-1 justify-end">
11
+ <Button @icon={{if this.place.id "save" "check"}} @type="primary" @text={{if this.place.id "Save Place" "Create Place"}} @onClick={{this.save}} @wrapperClass="mr-2" />
12
+ <Button @type="default" @icon="times" @helpText={{if this.place.id "Cancel edit place" "Cancel new place"}} @onClick={{this.onPressCancel}} />
13
+ </div>
14
+ </Overlay::Header>
15
+
16
+ <Overlay::Body @wrapperClass="new-service-rate-overlay-body px-4 space-y-4 pt-4" @increaseInnerBodyHeightBy={{1000}}>
17
+ <div class="grid grid-cols-3 gap-1 text-xs dark:text-gray-100">
18
+ <InputGroup @name="Name" @autocomplete="nope" @value={{this.place.name}} @wrapperClass="col-span-3" />
19
+ <InputGroup @name="Street 1" @value={{this.place.street1}} @wrapperClass="col-span-3">
20
+ <AutocompleteInput @value={{this.place.street1}} @fetchUrl="places/lookup" @onSelect={{this.autocomplete}} placeholder="Street 1" class="w-full" as |result|>
21
+ {{result.address}}
22
+ </AutocompleteInput>
23
+ </InputGroup>
24
+ <InputGroup @name="Street 2" @autocomplete="nope" @value={{this.place.street2}} @wrapperClass="col-span-3" />
25
+ <InputGroup @name="Neighborhood" @autocomplete="nope" @value={{this.place.neighborhood}} />
26
+ <InputGroup @name="Building" @autocomplete="nope" @value={{this.place.building}} />
27
+ <InputGroup @name="Security Access Code" @autocomplete="nope" @value={{this.place.security_access_code}} />
28
+ <InputGroup @name="Postal Code" @autocomplete="nope" @value={{this.place.postal_code}} />
29
+ <InputGroup @name="City" @autocomplete="nope" @value={{this.place.city}} />
30
+ <InputGroup @name="State" @autocomplete="nope" @value={{this.place.province}} />
31
+ <InputGroup @name="Country" @wrapperClass="col-span-2">
32
+ <CountrySelect class="w-full form-input form-select form-datalist" @value={{this.place.country}} @onChange={{this.place.country}} placeholder="Country" />
33
+ </InputGroup>
34
+ <InputGroup @name="Coordinates" @wrapperClass="col-span-2">
35
+ <CoordinatesInput
36
+ @value={{this.place.location}}
37
+ @onChange={{this.updatePlaceCoordinates}}
38
+ @onGeocode={{this.autocomplete}}
39
+ @onUpdatedFromMap={{this.reverseGeocode}}
40
+ @onInit={{this.setCoordinatesInput}}
41
+ />
42
+ </InputGroup>
43
+ <div class="col-span-1"></div>
44
+ <InputGroup @name="Phone">
45
+ <PhoneInput @value={{this.place.phone}} @autocomplete="nope" @onInput={{this.phone}} class="form-input w-full" />
46
+ </InputGroup>
47
+ <InputGroup @name="Email" @autocomplete="nope" @value={{this.place.email}} />
48
+ </div>
49
+ </Overlay::Body>
50
+ </Overlay>
@@ -0,0 +1,134 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
4
+ import { action } from '@ember/object';
5
+ import contextComponentCallback from '../utils/context-component-callback';
6
+ import applyContextComponentArguments from '../utils/apply-context-component-arguments';
7
+
8
+ export default class PlaceFormPanelComponent extends Component {
9
+ /**
10
+ * @service store
11
+ */
12
+ @service store;
13
+
14
+ /**
15
+ * @service fetch
16
+ */
17
+ @service fetch;
18
+
19
+ /**
20
+ * @service notifications
21
+ */
22
+ @service notifications;
23
+
24
+ /**
25
+ * @service hostRouter
26
+ */
27
+ @service hostRouter;
28
+
29
+ /**
30
+ * @service loader
31
+ */
32
+ @service loader;
33
+
34
+ /**
35
+ * @service contextPanel
36
+ */
37
+ @service contextPanel;
38
+
39
+ /**
40
+ * Overlay context.
41
+ * @type {any}
42
+ */
43
+ @tracked context;
44
+
45
+ /**
46
+ * Indicates whether the component is in a loading state.
47
+ * @type {boolean}
48
+ */
49
+ @tracked isLoading = false;
50
+
51
+ /**
52
+ * All possible place types
53
+ *
54
+ * @var {String}
55
+ */
56
+ @tracked placeTypes = ['place', 'customer'];
57
+
58
+ /**
59
+ * Constructs the component and applies initial state.
60
+ */
61
+ constructor() {
62
+ super(...arguments);
63
+ this.place = this.args.place;
64
+ applyContextComponentArguments(this);
65
+ }
66
+
67
+ /**
68
+ * Sets the overlay context.
69
+ *
70
+ * @action
71
+ * @param {OverlayContextObject} overlayContext
72
+ */
73
+ @action setOverlayContext(overlayContext) {
74
+ this.context = overlayContext;
75
+ contextComponentCallback(this, 'onLoad', ...arguments);
76
+ }
77
+
78
+ /**
79
+ * Saves the place changes.
80
+ *
81
+ * @action
82
+ * @returns {Promise<any>}
83
+ */
84
+ @action save() {
85
+ const { place } = this;
86
+
87
+ this.loader.showLoader('.next-content-overlay-panel-container', { loadingMessage: 'Saving place...', preserveTargetPosition: true });
88
+ this.isLoading = true;
89
+
90
+ contextComponentCallback(this, 'onBeforeSave', place);
91
+
92
+ try {
93
+ return place
94
+ .save()
95
+ .then((place) => {
96
+ this.notifications.success(`place (${place.address}) saved successfully.`);
97
+ contextComponentCallback(this, 'onAfterSave', place);
98
+ })
99
+ .catch((error) => {
100
+ this.notifications.serverError(error);
101
+ })
102
+ .finally(() => {
103
+ this.loader.removeLoader('.next-content-overlay-panel-container ');
104
+ this.isLoading = false;
105
+ });
106
+ } catch (error) {
107
+ this.loader.removeLoader('.next-content-overlay-panel-container ');
108
+ this.isLoading = false;
109
+ }
110
+ }
111
+
112
+ /**
113
+ * View the details of the place.
114
+ *
115
+ * @action
116
+ */
117
+ @action onViewDetails() {
118
+ const isActionOverrided = contextComponentCallback(this, 'onViewDetails', this.place);
119
+
120
+ if (!isActionOverrided) {
121
+ this.contextPanel.focus(this.place, 'viewing');
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Handles cancel button press.
127
+ *
128
+ * @action
129
+ * @returns {any}
130
+ */
131
+ @action onPressCancel() {
132
+ return contextComponentCallback(this, 'onPressCancel', this.place);
133
+ }
134
+ }
@@ -0,0 +1,95 @@
1
+ <div class="p-4 space-y-4">
2
+ <ContentPanel @title="Map" @open={{true}}>
3
+ <LeafletMap class="w-full h-48 rounded-b-md shadow-md" @lat={{@place.latitude}} @lng={{@place.longitude}} @zoom={{17}} as |layers|>
4
+ <layers.tile @url="https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png" />
5
+ <layers.marker @id={{@place.id}} @icon={{icon iconUrl="/engines-dist/images/building-marker.png" iconSize=(array 16 16)}} @location={{point-to-coordinates @place.location}} @riseOnHover={{true}} @title={{@place.address}} @alt={{@place.address}} as |marker|>
6
+ <marker.popup>
7
+ <div>{{@place.address}}</div>
8
+ <div>{{format-point @place.location}}</div>
9
+ </marker.popup>
10
+ <marker.tooltip @permanent={{false}} @sticky={{true}} @direction="bottom">{{@place.name}}</marker.tooltip>
11
+ </layers.marker>
12
+ </LeafletMap>
13
+ </ContentPanel>
14
+ <ContentPanel @title="Details" @open={{true}} @pad={{true}} @panelBodyClass="bg-white dark:bg-gray-900">
15
+ <div class="grid grid-cols-1 lg:grid-cols-3 gap-2 text-xs dark:text-gray-100">
16
+ <div class="field-info-container col-span-3">
17
+ <div class="field-name">Name</div>
18
+ <div class="field-value">{{n-a @place.name}}</div>
19
+ </div>
20
+
21
+ <div class="field-info-container col-span-3">
22
+ <div class="field-name">Street</div>
23
+ <div class="field-value">{{n-a @place.street1}}</div>
24
+ </div>
25
+
26
+ <div class="field-info-container">
27
+ <div class="field-name">Neighborhood</div>
28
+ <div class="field-value">{{n-a @place.neighborhood}}</div>
29
+ </div>
30
+
31
+ <div class="field-info-container">
32
+ <div class="field-name">Building</div>
33
+ <div class="field-value">{{n-a @place.building}}</div>
34
+ </div>
35
+
36
+ <div class="field-info-container">
37
+ <div class="field-name">Security Access Code</div>
38
+ <div class="field-value">{{n-a @place.security_access_code}}</div>
39
+ </div>
40
+
41
+ <div class="field-info-container">
42
+ <div class="field-name">City</div>
43
+ <div class="field-value">{{n-a @place.city}}</div>
44
+ </div>
45
+
46
+ <div class="field-info-container">
47
+ <div class="field-name">State</div>
48
+ <div class="field-value">{{n-a @place.province}}</div>
49
+ </div>
50
+
51
+ <div class="field-info-container">
52
+ <div class="field-name">Country</div>
53
+ <div class="field-value">
54
+ <CountryName @country={{@place.country}} @showFlag={{true}} />
55
+ </div>
56
+ </div>
57
+
58
+ <div class="field-info-container">
59
+ <div class="field-name">Phone</div>
60
+ <div class="field-value">{{n-a @place.phone}}</div>
61
+ </div>
62
+
63
+ <div class="field-info-container">
64
+ <div class="field-name">Email</div>
65
+ <div class="field-value">{{n-a @place.email}}</div>
66
+ </div>
67
+
68
+ <div class="field-info-container">
69
+ <div class="field-name">Vendor</div>
70
+ <div class="field-value">
71
+ {{#if @place.vendor_uuid}}
72
+ <a href="javascript:;" {{on "click" @place.viewVendor}}>
73
+ {{@place.vendor_name}}
74
+ </a>
75
+ {{else}}
76
+ {{@place.vendor_name}}
77
+ {{/if}}
78
+ </div>
79
+ </div>
80
+
81
+ <div class="field-info-container col-span-3">
82
+ <div class="field-name">
83
+ Coordinates
84
+ {{!-- <a href="javascript:;" class="block ml-3" {{on "click" @place.viewPlaceOnMap}}>
85
+ <FaIcon @icon="map" class="mr-1" />
86
+ View on map
87
+ </a> --}}
88
+ </div>
89
+ <div class="field-value">
90
+ {{point-coordinates @place.location}}
91
+ </div>
92
+ </div>
93
+ </div>
94
+ </ContentPanel>
95
+ </div>
@@ -0,0 +1,30 @@
1
+ <Overlay
2
+ @onLoad={{this.setOverlayContext}}
3
+ @position="right"
4
+ @noBackdrop={{true}}
5
+ @fullHeight={{true}}
6
+ @isResizable={{or this.isResizable @isResizable}}
7
+ @width={{or this.width @width "600px"}}
8
+ >
9
+ <Overlay::Header @title={{this.place.name}} @status={{this.place.public_id}} @hideStatusDot={{true}} @createdAt={{this.place.createdAt}}>
10
+ <Button @type="default" @icon="pen" @helpText="Edit place" @onClick={{this.onEdit}} @wrapperClass="mr-2" />
11
+ <Button @type="default" @icon="times" @helpText={{if this.place.id "Cancel edit place" "Cancel new place"}} @onClick={{this.onPressCancel}} />
12
+ </Overlay::Header>
13
+ <Overlay::Body class="no-padding" @increaseInnerBodyHeightBy={{1000}}>
14
+ <div class="section-header-actions w-full overflow-x-scroll lg:overflow-x-auto">
15
+ <div class="ui-tabs mt-4">
16
+ <nav>
17
+ {{#each this.tabs as |tab|}}
18
+ <a href="javascript:;" class="ui-tab {{if (eq this.tab.slug tab.slug) 'active'}}" {{on "click" (fn this.onTabChanged tab.slug)}}>
19
+ <FaIcon @icon={{tab.icon}} class="mr-1" />
20
+ <span>{{tab.title}}</span>
21
+ </a>
22
+ {{/each}}
23
+ </nav>
24
+ </div>
25
+ </div>
26
+ <div class="tab-content tab-{{this.tab.slug}}">
27
+ {{component this.tab.component place=this.place tabOptions=this.tab options=this.tab.componentParams}}
28
+ </div>
29
+ </Overlay::Body>
30
+ </Overlay>
@@ -0,0 +1,161 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { action } from '@ember/object';
4
+ import { inject as service } from '@ember/service';
5
+ import { isArray } from '@ember/array';
6
+ import PlacePanelDetailComponent from './place-panel/details';
7
+ import contextComponentCallback from '../utils/context-component-callback';
8
+ import applyContextComponentArguments from '../utils/apply-context-component-arguments';
9
+
10
+ export default class PlacePanelComponent extends Component {
11
+ /**
12
+ * Service for fetching data.
13
+ *
14
+ * @type {Service}
15
+ */
16
+ @service fetch;
17
+
18
+ /**
19
+ * Service for managing modals.
20
+ *
21
+ * @type {Service}
22
+ */
23
+ @service modalsManager;
24
+
25
+ /**
26
+ * Universe service for managing global data and settings.
27
+ *
28
+ * @type {Service}
29
+ */
30
+ @service universe;
31
+
32
+ /**
33
+ * Ember data store service.
34
+ *
35
+ * @type {Service}
36
+ */
37
+ @service store;
38
+
39
+ /**
40
+ * Service for managing routing within the host app.
41
+ *
42
+ * @type {Service}
43
+ */
44
+ @service hostRouter;
45
+
46
+ /**
47
+ * Service for managing the context panel.
48
+ *
49
+ * @type {Service}
50
+ */
51
+ @service contextPanel;
52
+
53
+ /**
54
+ * The current active tab.
55
+ *
56
+ * @type {Object}
57
+ * @tracked
58
+ */
59
+ @tracked tab;
60
+
61
+ /**
62
+ * The place being displayed or edited.
63
+ *
64
+ * @type {placeModel}
65
+ * @tracked
66
+ */
67
+ @tracked place;
68
+
69
+ /**
70
+ * Returns the array of tabs available for the panel.
71
+ *
72
+ * @type {Array}
73
+ */
74
+ get tabs() {
75
+ const registeredTabs = this.universe.getMenuItemsFromRegistry('component:place-panel');
76
+ // this.universe._createMenuItem('Tracking', null, { icon: 'satellite-dish', component: placePanelTrackingComponent }),
77
+ const defaultTabs = [this.universe._createMenuItem('Details', null, { icon: 'circle-info', component: PlacePanelDetailComponent })];
78
+
79
+ if (isArray(registeredTabs)) {
80
+ return [...defaultTabs, ...registeredTabs];
81
+ }
82
+
83
+ return defaultTabs;
84
+ }
85
+
86
+ /**
87
+ * Initializes the place panel component.
88
+ */
89
+ constructor() {
90
+ super(...arguments);
91
+ this.place = this.args.place;
92
+ this.tab = this.getTabUsingSlug(this.args.tab);
93
+ applyContextComponentArguments(this);
94
+ }
95
+
96
+ /**
97
+ * Sets the overlay context.
98
+ *
99
+ * @action
100
+ * @param {OverlayContextObject} overlayContext
101
+ */
102
+ @action setOverlayContext(overlayContext) {
103
+ this.context = overlayContext;
104
+ contextComponentCallback(this, 'onLoad', ...arguments);
105
+ }
106
+
107
+ /**
108
+ * Handles changing the active tab.
109
+ *
110
+ * @method
111
+ * @param {String} tab - The new tab to switch to.
112
+ * @action
113
+ */
114
+ @action onTabChanged(tab) {
115
+ this.tab = this.getTabUsingSlug(tab);
116
+ contextComponentCallback(this, 'onTabChanged', tab);
117
+ }
118
+
119
+ /**
120
+ * Handles edit action for the place.
121
+ *
122
+ * @method
123
+ * @action
124
+ */
125
+ @action onEdit() {
126
+ const isActionOverrided = contextComponentCallback(this, 'onEdit', this.place);
127
+
128
+ if (!isActionOverrided) {
129
+ this.contextPanel.focus(this.place, 'editing', {
130
+ onAfterSave: () => {
131
+ this.contextPanel.clear();
132
+ },
133
+ });
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Handles the cancel action.
139
+ *
140
+ * @method
141
+ * @action
142
+ * @returns {Boolean} Indicates whether the cancel action was overridden.
143
+ */
144
+ @action onPressCancel() {
145
+ return contextComponentCallback(this, 'onPressCancel', this.place);
146
+ }
147
+
148
+ /**
149
+ * Finds and returns a tab based on its slug.
150
+ *
151
+ * @param {String} tabSlug - The slug of the tab.
152
+ * @returns {Object|null} The found tab or null.
153
+ */
154
+ getTabUsingSlug(tabSlug) {
155
+ if (tabSlug) {
156
+ return this.tabs.find(({ slug }) => slug === tabSlug);
157
+ }
158
+
159
+ return this.tabs[0];
160
+ }
161
+ }