@fleetbase/fleetops-engine 0.3.1 → 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 (234) 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 +1 -1
  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 +35 -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 +0 -6
  228. package/server/src/Notifications/OrderCanceled.php +0 -6
  229. package/server/src/Notifications/OrderDispatchFailed.php +0 -6
  230. package/server/src/Notifications/OrderDispatched.php +0 -6
  231. package/server/src/Notifications/OrderPing.php +0 -6
  232. package/server/src/Notifications/OrderSplit.php +0 -6
  233. package/server/src/Providers/NotificationServiceProvider.php +1 -1
  234. package/server/src/routes.php +2 -2
@@ -0,0 +1,51 @@
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
+
6
+ export default class VendorFormPanelEditFormComponent extends Component {
7
+ @service store;
8
+ @service contextPanel;
9
+ @tracked isIntegratedVendor;
10
+ @tracked isEditingCredentials = false;
11
+ @tracked showAdvancedOptions = false;
12
+
13
+ constructor() {
14
+ super(...arguments);
15
+ this.vendor = this.args.vendor;
16
+ this.isIntegratedVendor = this.vendor && this.vendor.type === 'integrated-vendor';
17
+ }
18
+
19
+ @action toggleCredentialsReset() {
20
+ if (this.isEditingCredentials) {
21
+ this.isEditingCredentials = false;
22
+ } else {
23
+ this.isEditingCredentials = true;
24
+ }
25
+ }
26
+
27
+ @action toggleAdvancedOptions() {
28
+ if (this.showAdvancedOptions) {
29
+ this.showAdvancedOptions = false;
30
+ } else {
31
+ this.showAdvancedOptions = true;
32
+ }
33
+ }
34
+
35
+ @action selectVendorAddress(place) {
36
+ this.vendor.place = place;
37
+ this.vendor.place_uuid = place.id;
38
+ }
39
+
40
+ @action async editAddress() {
41
+ let place;
42
+
43
+ if (this.vendor.has_place) {
44
+ place = await this.vendor.place;
45
+ } else {
46
+ place = this.store.createRecord('place');
47
+ }
48
+
49
+ return this.contextPanel.focus(place);
50
+ }
51
+ }
@@ -0,0 +1,48 @@
1
+ <Overlay @onLoad={{this.setOverlayContext}} @position="right" @noBackdrop={{true}} @fullHeight={{true}} @isResizeble={{or this.isResizable @isResizable}} @width={{or this.width @width "600px"}}>
2
+ <Overlay::Header @hideLeftSection={{true}} @actionsWrapperClass="flex-1 flex-col py-3" class="h-auto-i">
3
+ <div class="flex flex-row justify-between w-full">
4
+ <div class="flex flex-1 flex-row">
5
+ <div class="w-14">
6
+ <div class="upload-avatar-overlay w-12 h-12 flex items-center justify-start rounded-lg">
7
+ <img src={{this.vendor.logo_url}} alt={{this.vendor.name}} height="48" width="48" class="h-12 w-12 rounded-lg shadow-sm" />
8
+ <Attach::Tooltip @class="clean" @animation="scale" @placement="top">
9
+ <InputInfo @text="Upload new photo" />
10
+ </Attach::Tooltip>
11
+ <div class="upload-avatar-button-wrapper rounded-lg">
12
+ <UploadButton @name="photos" @accept="image/*" @onFileAdded={{this.onUploadNewPhoto}} @icon="upload" @hideButtonText={{true}} @labelClass="upload-avatar-label-overlay" class="w-12 btn-reset" />
13
+ </div>
14
+ </div>
15
+ </div>
16
+ <div class="flex flex-col">
17
+ <h1 class="text-gray-900 dark:text-white text-2xl">
18
+ {{#if this.vendor.id}}
19
+ {{this.vendor.name}}
20
+ {{else}}
21
+ <span>New Vendor</span>
22
+ {{/if}}
23
+ </h1>
24
+ <div class="-mt-1">
25
+ <div class="flex flex-row items-center">
26
+ <span class="text-sm dark:text-gray-500 text-gray-700 mr-3">{{n-a (smart-humanize this.vendor.type)}}</span>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ <div>
32
+ <Button @icon={{if this.vendor.id "save" "check"}} @type="primary" @text={{if this.vendor.id "Save Vendor" "Create Vendor"}} @onClick={{this.save}} @wrapperClass="mr-2" />
33
+ {{#if this.vendor.id}}
34
+ <Button @type="default" @icon="id-card" @helpText="View fleet details" @onClick={{this.onViewDetails}} @wrapperClass="mr-2" />
35
+ {{/if}}
36
+ <Button @type="default" @icon="times" @helpText={{if this.vendor.id "Cancel edit vendor" "Cancel new vendor"}} @onClick={{this.onPressCancel}} />
37
+ </div>
38
+ </div>
39
+ </Overlay::Header>
40
+
41
+ <Overlay::Body @wrapperClass="new-service-rate-overlay-body px-4 space-y-4 pt-4" @increaseInnerBodyHeightBy={{1000}}>
42
+ {{#if this.isEditing}}
43
+ <VendorFormPanel::EditForm @vendor={{this.vendor}} @vendorTypes={{this.vendorTypeOptions}} @vendorStatusOptions={{this.vendorStatusOptions}} @onVendorChanged={{this.onVendorChanged}} />
44
+ {{else}}
45
+ <VendorFormPanel::CreateForm @vendor={{this.vendor}} @vendorTypes={{this.vendorTypeOptions}} @vendorStatusOptions={{this.vendorStatusOptions}} @onVendorChanged={{this.onVendorChanged}} />
46
+ {{/if}}
47
+ </Overlay::Body>
48
+ </Overlay>
@@ -0,0 +1,226 @@
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 VendorFormPanelComponent extends Component {
9
+ /**
10
+ * @service store
11
+ */
12
+ @service store;
13
+
14
+ /**
15
+ * @service fetch
16
+ */
17
+ @service fetch;
18
+
19
+ /**
20
+ * @service currentUser
21
+ */
22
+ @service currentUser;
23
+
24
+ /**
25
+ * @service notifications
26
+ */
27
+ @service notifications;
28
+
29
+ /**
30
+ * @service hostRouter
31
+ */
32
+ @service hostRouter;
33
+
34
+ /**
35
+ * @service loader
36
+ */
37
+ @service loader;
38
+
39
+ /**
40
+ * @service contextPanel
41
+ */
42
+ @service contextPanel;
43
+
44
+ /**
45
+ * Overlay context.
46
+ * @type {any}
47
+ */
48
+ @tracked context;
49
+
50
+ /**
51
+ * Indicates whether the component is in a loading state.
52
+ * @type {boolean}
53
+ */
54
+ @tracked isLoading = false;
55
+
56
+ /**
57
+ * The users vendor instance.
58
+ * @type {VendorModel|IntegratedVendorModel}
59
+ */
60
+ @tracked vendor;
61
+
62
+ /**
63
+ * Specific types of vendors which can be set as the type.
64
+ *
65
+ * @memberof VendorFormPanelComponent
66
+ */
67
+ @tracked vendorTypeOptions = [
68
+ 'carrier-trucking-company',
69
+ 'carrier-shipping-line',
70
+ 'carrier-air-cargo',
71
+ 'carrier-rail',
72
+ 'freight-forwarder',
73
+ 'warehouse-provider',
74
+ 'broker',
75
+ 'maintenance-repair-facility',
76
+ 'fuel-station',
77
+ 'tire-service-provider',
78
+ 'equipment-rental',
79
+ 'customs-broker',
80
+ 'third-party-logistics-provider',
81
+ 'technology-provider',
82
+ 'consultant',
83
+ 'insurance-provider',
84
+ 'last-mile-delivery-service',
85
+ 'packing-crating-service',
86
+ 'intermodal-operator',
87
+ 'drayage-service-provider',
88
+ 'cold-chain-provider',
89
+ 'hazardous-material-specialist',
90
+ 'parcel-courier',
91
+ 'bulk-material-handler',
92
+ 'towing-service',
93
+ 'cargo-inspector',
94
+ 'pallet-provider',
95
+ 'label-packaging-material-supplier',
96
+ 'driver-leasing-service',
97
+ 'vehicle-manufacturer',
98
+ 'vehicle-dealership',
99
+ 'parts-supplier',
100
+ 'logistics-association',
101
+ 'regulatory-body',
102
+ 'training-certification-provider',
103
+ 'general-vendor',
104
+ 'ecommerce',
105
+ ];
106
+
107
+ /**
108
+ * Applicable status options for vendor.
109
+ *
110
+ * @memberof VendorFormPanelComponent
111
+ */
112
+ @tracked vendorStatusOptions = ['pending', 'active', 'do-not-contact', 'prospective', 'archived'];
113
+
114
+ /**
115
+ * Constructs the component and applies initial state.
116
+ */
117
+ constructor() {
118
+ super(...arguments);
119
+ this.vendor = this.args.vendor;
120
+ this.isEditing = typeof this.vendor.id === 'string';
121
+ applyContextComponentArguments(this);
122
+ }
123
+
124
+ /**
125
+ * Sets the overlay context.
126
+ *
127
+ * @action
128
+ * @param {OverlayContextObject} overlayContext
129
+ */
130
+ @action setOverlayContext(overlayContext) {
131
+ this.context = overlayContext;
132
+ contextComponentCallback(this, 'onLoad', ...arguments);
133
+ }
134
+
135
+ /**
136
+ * Saves the vendor changes.
137
+ *
138
+ * @action
139
+ * @returns {Promise<any>}
140
+ */
141
+ @action save() {
142
+ const { vendor } = this;
143
+
144
+ this.loader.showLoader('.next-content-overlay-panel-container', { loadingMessage: 'Saving vendor...', preserveTargetPosition: true });
145
+ this.isLoading = true;
146
+
147
+ contextComponentCallback(this, 'onBeforeSave', vendor);
148
+
149
+ try {
150
+ return vendor
151
+ .save()
152
+ .then((vendor) => {
153
+ this.notifications.success(`Vendor (${vendor.displayName}) saved successfully.`);
154
+ contextComponentCallback(this, 'onAfterSave', vendor);
155
+ })
156
+ .catch((error) => {
157
+ this.notifications.serverError(error);
158
+ })
159
+ .finally(() => {
160
+ this.loader.removeLoader('.next-content-overlay-panel-container ');
161
+ this.isLoading = false;
162
+ });
163
+ } catch (error) {
164
+ this.loader.removeLoader('.next-content-overlay-panel-container ');
165
+ this.isLoading = false;
166
+ }
167
+ }
168
+
169
+ /**
170
+ * Uploads a new logo for the vendor.
171
+ *
172
+ * @param {File} file
173
+ * @memberof DriverFormPanelComponent
174
+ */
175
+ @action onUploadNewPhoto(file) {
176
+ this.fetch.uploadFile.perform(
177
+ file,
178
+ {
179
+ path: `uploads/${this.currentUser.companyId}/vendors/${this.vendor.id}`,
180
+ subject_uuid: this.vendor.id,
181
+ subject_type: 'vendor',
182
+ type: 'vendor_logo',
183
+ },
184
+ (uploadedFile) => {
185
+ this.vendor.setProperties({
186
+ logo_uuid: uploadedFile.id,
187
+ logo_url: uploadedFile.url,
188
+ logo: uploadedFile,
189
+ });
190
+ }
191
+ );
192
+ }
193
+
194
+ /**
195
+ * Handle when vendor changed.
196
+ *
197
+ * @param {VendorModel} vendor
198
+ * @memberof VendorFormPanelComponent
199
+ */
200
+ @action onVendorChanged(vendor) {
201
+ this.vendor = vendor;
202
+ }
203
+
204
+ /**
205
+ * View the details of the vendor.
206
+ *
207
+ * @action
208
+ */
209
+ @action onViewDetails() {
210
+ const isActionOverrided = contextComponentCallback(this, 'onViewDetails', this.vendor);
211
+
212
+ if (!isActionOverrided) {
213
+ this.contextPanel.focus(this.vendor, 'viewing');
214
+ }
215
+ }
216
+
217
+ /**
218
+ * Handles cancel button press.
219
+ *
220
+ * @action
221
+ * @returns {any}
222
+ */
223
+ @action onPressCancel() {
224
+ return contextComponentCallback(this, 'onPressCancel', this.vendor);
225
+ }
226
+ }
@@ -0,0 +1,77 @@
1
+ <div class="p-4">
2
+ <ContentPanel @title="Details" @open={{true}} @pad={{true}} @panelBodyClass="bg-white dark:bg-gray-900">
3
+ {{#if this.isIntegratedVendor}}
4
+ <div class="integrated-vendor-button border-0 mb-4">
5
+ <div>
6
+ <img src={{this.vendor.provider_settings.logo}} alt={{this.vendor.provider_settings.code}} class="w-20 h-20" width="80" height="80" />
7
+ </div>
8
+ <div>
9
+ <h3 class="text-sm font-semibold dark:text-white">{{this.vendor.provider_settings.name}}</h3>
10
+ </div>
11
+ </div>
12
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-2 text-xs dark:text-gray-100">
13
+ <div class="field-info-container">
14
+ <div class="field-name">Sandbox</div>
15
+ <div class="field-value">{{if this.vendor.sandbox "Yes" "No"}}</div>
16
+ </div>
17
+ <div class="field-info-container">
18
+ <div class="field-name">Host</div>
19
+ <div class="field-value">{{n-a this.vendor.host}}</div>
20
+ </div>
21
+ <div class="field-info-container">
22
+ <div class="field-name">Namespace</div>
23
+ <div class="field-value">{{n-a this.vendor.namespace}}</div>
24
+ </div>
25
+ {{#if (is-object this.vendor.options)}}
26
+ {{#each-in this.vendor.options as |key value|}}
27
+ <div class="field-info-container">
28
+ <div class="field-name">{{smart-humanize key}}</div>
29
+ <div class="field-value">{{n-a value}}</div>
30
+ </div>
31
+ {{/each-in}}
32
+ {{/if}}
33
+ </div>
34
+ {{else}}
35
+ <div class="grid grid-cols-3 md:grid-cols-2 gap-2 text-xs dark:text-gray-100">
36
+ <div class="field-info-container">
37
+ <div class="field-name">Name</div>
38
+ <div class="field-value">{{n-a this.vendor.name}}</div>
39
+ </div>
40
+
41
+ <div class="field-info-container">
42
+ <div class="field-name">Email</div>
43
+ <div class="field-value">{{n-a this.vendor.email}}</div>
44
+ </div>
45
+
46
+ <div class="field-info-container">
47
+ <div class="field-name">Phone</div>
48
+ <div class="field-value">{{n-a this.vendor.phone}}</div>
49
+ </div>
50
+
51
+ <div class="field-info-container">
52
+ <div class="field-name">Website URL</div>
53
+ <div class="field-value">{{n-a this.vendor.website_url}}</div>
54
+ </div>
55
+
56
+ <div class="field-info-container">
57
+ <div class="field-name">Country</div>
58
+ <div class="field-value">
59
+ <CountryName @country={{this.vendor.country}} @showFlag={{true}} />
60
+ </div>
61
+ </div>
62
+
63
+ <div class="field-info-container">
64
+ <div class="field-name">Status</div>
65
+ <div class="field-value">
66
+ <Badge @status={{this.vendor.status}} />
67
+ </div>
68
+ </div>
69
+
70
+ <div class="field-info-container">
71
+ <div class="field-name">Address</div>
72
+ <div class="field-value">{{n-a this.vendor.address}}</div>
73
+ </div>
74
+ </div>
75
+ {{/if}}
76
+ </ContentPanel>
77
+ </div>
@@ -0,0 +1,12 @@
1
+ import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+
4
+ export default class VendorPanelDetailsComponent extends Component {
5
+ @tracked isIntegratedVendor = false;
6
+ @tracked vendor;
7
+ constructor() {
8
+ super(...arguments);
9
+ this.vendor = this.args.vendor;
10
+ this.isIntegratedVendor = this.vendor && this.vendor.type === 'integrated-vendor';
11
+ }
12
+ }
@@ -0,0 +1,58 @@
1
+ <Overlay @onLoad={{this.setOverlayContext}} @position="right" @noBackdrop={{true}} @fullHeight={{true}} @isResizable={{or this.isResizable @isResizable}} @width={{or this.width @width "600px"}}>
2
+ <Overlay::Header @hideLeftSection={{true}} @actionsWrapperClass="flex-1 flex-col py-3" class="h-auto-i">
3
+ <div class="flex flex-row items-center justify-between w-full mb-4">
4
+ <div class="flex flex-1 space-x-2">
5
+ <Button @type="default" @icon="pen" @helpText="Edit vendor" @onClick={{this.onEdit}} />
6
+ </div>
7
+ <div class="flex flex-1 justify-end">
8
+ <Button @type="default" @icon="times" @helpText="Close vendor details" @onClick={{this.onPressCancel}} />
9
+ </div>
10
+ </div>
11
+ <div class="flex flex-row justify-between w-full">
12
+ <div class="flex flex-1 flex-row">
13
+ <div class="w-14">
14
+ <div class="w-12 h-12 flex items-center justify-start rounded-lg">
15
+ <Image src={{this.vendor.logo_url}} @fallbackSrc={{config "defaultValues.vendorImage"}} alt={{this.vendor.name}} height="48" width="48" class="h-12 w-12 rounded-lg shadow-sm" />
16
+ <Attach::Tooltip @class="clean" @animation="scale" @placement="top">
17
+ <InputInfo @text={{this.vendor.name}} />
18
+ </Attach::Tooltip>
19
+ </div>
20
+ </div>
21
+ <div class="flex flex-col">
22
+ <h1 class="text-gray-900 dark:text-white text-2xl">
23
+ {{#if this.vendor.id}}
24
+ {{this.vendor.name}}
25
+ {{else}}
26
+ <span>New Vendor</span>
27
+ {{/if}}
28
+ </h1>
29
+ <div class="-mt-1">
30
+ <div class="flex flex-row items-center">
31
+ <span class="text-sm dark:text-gray-500 text-gray-700 mr-3">{{n-a (smart-humanize this.vendor.type)}}</span>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ </div>
36
+ <div class="flex justify-end">
37
+ <Badge @status={{this.vendor.status}} />
38
+ </div>
39
+ </div>
40
+ </Overlay::Header>
41
+ <Overlay::Body class="no-padding" @increaseInnerBodyHeightBy={{1000}}>
42
+ <div class="section-header-actions w-full overflow-x-scroll lg:overflow-x-auto">
43
+ <div class="ui-tabs mt-4">
44
+ <nav>
45
+ {{#each this.tabs as |tab|}}
46
+ <a href="javascript:;" class="ui-tab {{if (eq this.tab.slug tab.slug) 'active'}}" {{on "click" (fn this.onTabChanged tab.slug)}}>
47
+ <FaIcon @icon={{tab.icon}} class="mr-1" />
48
+ <span>{{tab.title}}</span>
49
+ </a>
50
+ {{/each}}
51
+ </nav>
52
+ </div>
53
+ </div>
54
+ <div class="tab-content tab-{{this.tab.slug}}">
55
+ {{component this.tab.component vendor=this.vendor tabOptions=this.tab params=this.tab.componentParams}}
56
+ </div>
57
+ </Overlay::Body>
58
+ </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 VendorPanelDetailComponent from './vendor-panel/details';
7
+ import contextComponentCallback from '../utils/context-component-callback';
8
+ import applyContextComponentArguments from '../utils/apply-context-component-arguments';
9
+
10
+ export default class VendorPanelComponent 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 vendor being displayed or edited.
63
+ *
64
+ * @type {VendorModel}
65
+ * @tracked
66
+ */
67
+ @tracked vendor;
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:vendor-panel');
76
+ // this.universe._createMenuItem('Tracking', null, { icon: 'satellite-dish', component: VendorPanelTrackingComponent }),
77
+ const defaultTabs = [this.universe._createMenuItem('Details', null, { icon: 'circle-info', component: VendorPanelDetailComponent })];
78
+
79
+ if (isArray(registeredTabs)) {
80
+ return [...defaultTabs, ...registeredTabs];
81
+ }
82
+
83
+ return defaultTabs;
84
+ }
85
+
86
+ /**
87
+ * Initializes the vendor panel component.
88
+ */
89
+ constructor() {
90
+ super(...arguments);
91
+ this.vendor = this.args.vendor;
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 vendor.
121
+ *
122
+ * @method
123
+ * @action
124
+ */
125
+ @action onEdit() {
126
+ const isActionOverrided = contextComponentCallback(this, 'onEdit', this.vendor);
127
+
128
+ if (!isActionOverrided) {
129
+ this.contextPanel.focus(this.vendor, '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.vendor);
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
+ }
@@ -0,0 +1,55 @@
1
+ import Controller from '@ember/controller';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { action } from '@ember/object';
4
+
5
+ export default class ManagementContactsIndexDetailsController extends Controller {
6
+ /**
7
+ * The currently active view tab ('details' by default).
8
+ *
9
+ * @type {String}
10
+ * @tracked
11
+ */
12
+ @tracked view = 'details';
13
+
14
+ /**
15
+ * An array of query parameters to be serialized in the URL.
16
+ *
17
+ * @type {String[]}
18
+ * @tracked
19
+ */
20
+ @tracked queryParams = ['view'];
21
+
22
+ /**
23
+ * Transitions back to the "management.contacts.index" route.
24
+ *
25
+ * @method
26
+ * @action
27
+ * @returns {Transition} The transition object representing the route change.
28
+ */
29
+ @action transitionBack() {
30
+ return this.transitionToRoute('management.contacts.index');
31
+ }
32
+
33
+ /**
34
+ * Transitions to the edit view for a specific contact.
35
+ *
36
+ * @method
37
+ * @param {contactModel} contact - The contact to be edited.
38
+ * @action
39
+ * @returns {Transition} The transition object representing the route change.
40
+ */
41
+ @action onEdit(contact) {
42
+ return this.transitionToRoute('management.contacts.index.edit', contact);
43
+ }
44
+
45
+ /**
46
+ * Updates the active view tab.
47
+ *
48
+ * @method
49
+ * @param {String} tab - The name of the tab to activate.
50
+ * @action
51
+ */
52
+ @action onTabChanged(tab) {
53
+ this.view = tab;
54
+ }
55
+ }