@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.
- package/addon/components/contact-form-panel.hbs +82 -0
- package/addon/components/contact-form-panel.js +195 -0
- package/addon/components/contact-panel/details.hbs +36 -0
- package/addon/components/contact-panel/details.js +3 -0
- package/addon/components/contact-panel.hbs +52 -0
- package/addon/components/contact-panel.js +161 -0
- package/addon/components/driver-form-panel.hbs +39 -55
- package/addon/components/driver-form-panel.js +41 -0
- package/addon/components/driver-panel/details.hbs +2 -2
- package/addon/components/driver-panel.hbs +12 -10
- package/addon/components/driver-panel.js +13 -0
- package/addon/components/fleet-form-panel.hbs +28 -28
- package/addon/components/fleet-form-panel.js +150 -1
- package/addon/components/fleet-listing-panel.hbs +8 -0
- package/addon/components/fleet-listing-panel.js +34 -0
- package/addon/components/fleet-panel/details.hbs +30 -0
- package/addon/components/fleet-panel/driver-listing.hbs +72 -0
- package/addon/components/fleet-panel/driver-listing.js +149 -0
- package/addon/components/fleet-panel/vehicle-listing.hbs +72 -0
- package/addon/components/fleet-panel/vehicle-listing.js +149 -0
- package/addon/components/fleet-panel.hbs +12 -58
- package/addon/components/fleet-panel.js +148 -26
- package/addon/components/fleet-vehicle-listing.hbs +0 -1
- package/addon/components/fuel-report-form-panel.hbs +41 -0
- package/addon/components/fuel-report-form-panel.js +122 -0
- package/addon/components/fuel-report-panel/details.hbs +38 -0
- package/addon/components/fuel-report-panel.hbs +30 -0
- package/addon/components/fuel-report-panel.js +161 -0
- package/addon/components/issue-form-panel.hbs +85 -0
- package/addon/components/issue-form-panel.js +211 -0
- package/addon/components/issue-panel/details.hbs +48 -0
- package/addon/components/issue-panel.hbs +30 -0
- package/addon/components/issue-panel.js +160 -0
- package/addon/components/layout/fleet-ops-sidebar.hbs +2 -2
- package/addon/components/live-map.js +2 -0
- package/addon/components/map-container/toolbar.hbs +9 -9
- package/addon/components/map-container/topbar.hbs +1 -1
- package/addon/components/modals/issue-details.hbs +38 -0
- package/addon/components/modals/issue-from.hbs +138 -0
- package/addon/components/place-form-panel.hbs +50 -0
- package/addon/components/place-form-panel.js +134 -0
- package/addon/components/place-panel/details.hbs +95 -0
- package/addon/components/place-panel.hbs +30 -0
- package/addon/components/place-panel.js +161 -0
- package/addon/components/vehicle-form-panel.hbs +35 -44
- package/addon/components/vehicle-form-panel.js +41 -0
- package/addon/components/vehicle-panel/details.hbs +8 -2
- package/addon/components/vehicle-panel.hbs +8 -6
- package/addon/components/vendor-form-panel/create-form.hbs +114 -0
- package/addon/components/vendor-form-panel/create-form.js +158 -0
- package/addon/components/vendor-form-panel/edit-form.hbs +98 -0
- package/addon/components/vendor-form-panel/edit-form.js +51 -0
- package/addon/components/vendor-form-panel.hbs +48 -0
- package/addon/components/vendor-form-panel.js +226 -0
- package/addon/components/vendor-panel/details.hbs +77 -0
- package/addon/components/vendor-panel/details.js +12 -0
- package/addon/components/vendor-panel.hbs +58 -0
- package/addon/components/vendor-panel.js +161 -0
- package/addon/controllers/management/contacts/index/details.js +55 -0
- package/addon/controllers/management/contacts/index/edit.js +111 -0
- package/addon/controllers/management/contacts/index/new.js +88 -0
- package/addon/controllers/management/contacts/index.js +23 -128
- package/addon/controllers/management/drivers/index/new.js +2 -2
- package/addon/controllers/management/drivers/index.js +18 -32
- package/addon/controllers/management/fleets/index/details.js +53 -0
- package/addon/controllers/management/fleets/index/edit.js +75 -41
- package/addon/controllers/management/fleets/index/new.js +42 -57
- package/addon/controllers/management/fleets/index.js +0 -1
- package/addon/controllers/management/fuel-reports/index/details.js +63 -0
- package/addon/controllers/management/fuel-reports/index/edit.js +111 -0
- package/addon/controllers/management/fuel-reports/index/new.js +95 -0
- package/addon/controllers/management/fuel-reports/index.js +57 -127
- package/addon/controllers/management/issues/index/details.js +54 -0
- package/addon/controllers/management/issues/index/edit.js +111 -0
- package/addon/controllers/management/issues/index/new.js +94 -0
- package/addon/controllers/management/issues/index.js +131 -26
- package/addon/controllers/management/places/index/details.js +55 -0
- package/addon/controllers/management/places/index/edit.js +111 -0
- package/addon/controllers/management/places/index/new.js +88 -0
- package/addon/controllers/management/places/index.js +21 -182
- package/addon/controllers/management/vehicles/index/new.js +2 -6
- package/addon/controllers/management/vendors/index/details.js +55 -0
- package/addon/controllers/management/vendors/index/edit.js +111 -0
- package/addon/controllers/management/vendors/index/new.js +88 -0
- package/addon/controllers/management/vendors/index.js +43 -247
- package/addon/routes/management/contacts/index/details.js +14 -0
- package/addon/routes/management/contacts/index/edit.js +10 -0
- package/addon/routes/management/contacts/index/new.js +3 -0
- package/addon/routes/management/contacts/index.js +1 -1
- package/addon/routes/management/fleets/index/details.js +1 -1
- package/addon/routes/management/fleets/index/edit.js +1 -1
- package/addon/routes/management/fleets/index.js +1 -1
- package/addon/routes/management/fuel-reports/index/details.js +14 -0
- package/addon/routes/management/fuel-reports/index/edit.js +10 -0
- package/addon/routes/management/fuel-reports/index/new.js +3 -0
- package/addon/routes/management/fuel-reports/index.js +3 -1
- package/addon/routes/management/issues/index/details.js +14 -0
- package/addon/routes/management/issues/index/edit.js +10 -0
- package/addon/routes/management/issues/index/new.js +3 -0
- package/addon/routes/management/issues/index.js +1 -1
- package/addon/routes/management/places/index/details.js +14 -0
- package/addon/routes/management/places/index/edit.js +10 -0
- package/addon/routes/management/places/index/new.js +3 -0
- package/addon/routes/management/places/index.js +6 -1
- package/addon/routes/management/vendors/index/details.js +15 -0
- package/addon/routes/management/vendors/index/edit.js +11 -0
- package/addon/routes/management/vendors/index/new.js +3 -0
- package/addon/routes/management/vendors/index.js +1 -0
- package/addon/routes.js +27 -7
- package/addon/services/context-panel.js +60 -0
- package/addon/templates/management/contacts/index/details.hbs +1 -0
- package/addon/templates/management/contacts/index/edit.hbs +1 -0
- package/addon/templates/management/contacts/index/new.hbs +1 -0
- package/addon/templates/management/contacts/index.hbs +22 -3
- package/addon/templates/management/drivers/index.hbs +29 -5
- package/addon/templates/management/fleets/index/details.hbs +1 -1
- package/addon/templates/management/fleets/index/edit.hbs +1 -1
- package/addon/templates/management/fleets/index/new.hbs +1 -1
- package/addon/templates/management/fuel-reports/index/details.hbs +1 -0
- package/addon/templates/management/fuel-reports/index/edit.hbs +1 -0
- package/addon/templates/management/fuel-reports/index/new.hbs +1 -0
- package/addon/templates/management/fuel-reports/index.hbs +25 -4
- package/addon/templates/management/issues/index/details.hbs +1 -0
- package/addon/templates/management/issues/index/edit.hbs +1 -0
- package/addon/templates/management/issues/index/new.hbs +1 -0
- package/addon/templates/management/issues/index.hbs +5 -3
- package/addon/templates/management/places/index/details.hbs +1 -0
- package/addon/templates/management/places/index/edit.hbs +1 -0
- package/addon/templates/management/places/index/new.hbs +1 -0
- package/addon/templates/management/vendors/index/details.hbs +1 -0
- package/addon/templates/management/vendors/index/edit.hbs +1 -0
- package/addon/templates/management/vendors/index/new.hbs +1 -0
- package/addon/templates/operations/orders/index.hbs +3 -3
- package/app/components/contact-form-panel.js +1 -0
- package/app/components/contact-panel/details.js +1 -0
- package/app/components/contact-panel.js +1 -0
- package/app/components/fleet-listing-panel.js +1 -0
- package/app/components/fleet-panel/details.js +1 -0
- package/app/components/fleet-panel/driver-listing.js +1 -0
- package/app/components/fleet-panel/vehicle-listing.js +1 -0
- package/app/components/fuel-report-form-panel.js +1 -0
- package/app/components/fuel-report-panel.js +1 -0
- package/app/components/issue-form-panel.js +1 -0
- package/app/components/issue-panel.js +1 -0
- package/app/components/place-form-panel.js +1 -0
- package/app/components/place-panel.js +1 -0
- package/app/components/vendor-form-panel/create-form.js +1 -0
- package/app/components/vendor-form-panel/edit-form.js +1 -0
- package/app/components/vendor-form-panel.js +1 -0
- package/app/components/vendor-panel/details.js +1 -0
- package/app/components/vendor-panel.js +1 -0
- package/app/controllers/management/contacts/index/details.js +1 -0
- package/app/controllers/management/contacts/index/edit.js +1 -0
- package/app/controllers/management/contacts/index/new.js +1 -0
- package/app/controllers/management/fuel-reports/index/details.js +1 -0
- package/app/controllers/management/fuel-reports/index/edit.js +1 -0
- package/app/controllers/management/fuel-reports/index/new.js +1 -0
- package/app/controllers/management/issues/index/details.js +1 -0
- package/app/controllers/management/issues/index/edit.js +1 -0
- package/app/controllers/management/issues/index/new.js +1 -0
- package/app/controllers/management/places/index/details.js +1 -0
- package/app/controllers/management/places/index/edit.js +1 -0
- package/app/controllers/management/places/index/new.js +1 -0
- package/app/controllers/management/vendors/index/edit.js +1 -0
- package/app/controllers/management/vendors/index/new.js +1 -0
- package/app/routes/addon/routes/management/places/index/new.js +1 -0
- package/app/routes/management/contacts/index/details.js +1 -0
- package/app/routes/management/contacts/index/edit.js +1 -0
- package/app/routes/management/contacts/index/new.js +1 -0
- package/app/routes/management/fuel-reports/index/details.js +1 -0
- package/app/routes/management/fuel-reports/index/edit.js +1 -0
- package/app/routes/management/fuel-reports/index/new.js +1 -0
- package/app/routes/management/issues/index/details.js +1 -0
- package/app/routes/management/issues/index/edit.js +1 -0
- package/app/routes/management/issues/index/new.js +1 -0
- package/app/routes/management/places/index/details.js +1 -0
- package/app/routes/management/places/index/edit.js +1 -0
- package/app/routes/management/places/index/new.js +1 -0
- package/app/routes/management/vendors/index/details.js +1 -0
- package/app/routes/management/vendors/index/edit.js +1 -0
- package/app/routes/management/vendors/index/new.js +1 -0
- package/app/templates/addon/routes/management/places/index/new.js +1 -0
- package/app/templates/management/contacts/index/details.js +1 -0
- package/app/templates/management/contacts/index/edit.js +1 -0
- package/app/templates/management/contacts/index/new.js +1 -0
- package/app/templates/management/fuel-reports/index/details.js +1 -0
- package/app/templates/management/fuel-reports/index/edit.js +1 -0
- package/app/templates/management/fuel-reports/index/new.js +1 -0
- package/app/templates/management/issues/index/details.js +1 -0
- package/app/templates/management/issues/index/edit.js +1 -0
- package/app/templates/management/issues/index/new.js +1 -0
- package/app/templates/management/places/index/details.js +1 -0
- package/app/templates/management/places/index/edit.js +1 -0
- package/app/templates/management/places/index/new.js +1 -0
- package/app/templates/management/vendors/index/details.js +1 -0
- package/app/templates/management/vendors/index/edit.js +1 -0
- package/app/templates/management/vendors/index/new.js +1 -0
- package/composer.json +1 -1
- package/config/environment.js +2 -1
- package/extension.json +1 -1
- package/package.json +4 -3
- package/server/migrations/2023_11_03_072503_refactor_issues_table_columns.php +42 -0
- package/server/migrations/2023_11_06_040645_refactor_fuel_reports_table.php +38 -0
- package/server/src/Casts/Point.php +15 -1
- package/server/src/Http/Controllers/Internal/v1/DriverController.php +33 -15
- package/server/src/Http/Filter/FleetFilter.php +7 -0
- package/server/src/Http/Filter/FuelReportFilter.php +58 -0
- package/server/src/Http/Filter/IssueFilter.php +69 -0
- package/server/src/Http/Filter/VehicleFilter.php +10 -0
- package/server/src/Http/Middleware/TransformLocationMiddleware.php +48 -0
- package/server/src/Http/Resources/v1/Driver.php +1 -0
- package/server/src/Http/Resources/v1/Fleet.php +20 -21
- package/server/src/Http/Resources/v1/FuelReport.php +37 -35
- package/server/src/Http/Resources/v1/Issue.php +77 -0
- package/server/src/Http/Resources/v1/ParentFleet.php +60 -0
- package/server/src/Http/Resources/v1/SubFleet.php +60 -0
- package/server/src/Http/Resources/v1/Vehicle.php +4 -2
- package/server/src/Integrations/Lalamove/Lalamove.php +6 -6
- package/server/src/Models/Contact.php +7 -0
- package/server/src/Models/Driver.php +1 -1
- package/server/src/Models/Fleet.php +35 -4
- package/server/src/Models/FuelReport.php +53 -3
- package/server/src/Models/Issue.php +106 -7
- package/server/src/Models/Vehicle.php +1 -1
- package/server/src/Models/VehicleDevice.php +3 -1
- package/server/src/Models/VehicleDeviceEvent.php +7 -3
- package/server/src/Notifications/OrderAssigned.php +0 -6
- package/server/src/Notifications/OrderCanceled.php +0 -6
- package/server/src/Notifications/OrderDispatchFailed.php +0 -6
- package/server/src/Notifications/OrderDispatched.php +0 -6
- package/server/src/Notifications/OrderPing.php +0 -6
- package/server/src/Notifications/OrderSplit.php +0 -6
- package/server/src/Providers/NotificationServiceProvider.php +1 -1
- 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
|
+
}
|