@fleetbase/fleetops-engine 0.4.15 → 0.4.17
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/.php-cs-fixer.php +2 -0
- package/addon/components/activity-event-selector.hbs +35 -0
- package/addon/components/activity-event-selector.js +85 -0
- package/addon/components/activity-form-panel.hbs +23 -0
- package/addon/components/activity-form-panel.js +90 -0
- package/addon/components/activity-logic-builder.hbs +80 -0
- package/addon/components/activity-logic-builder.js +260 -0
- package/addon/components/contact-form-panel.hbs +1 -1
- package/addon/components/contact-panel.hbs +1 -1
- package/addon/components/custom-entity-form-panel.hbs +43 -0
- package/addon/components/custom-entity-form-panel.js +129 -0
- package/addon/components/custom-field-form-panel/options-input.hbs +12 -0
- package/addon/components/custom-field-form-panel/options-input.js +139 -0
- package/addon/components/custom-field-form-panel.hbs +77 -0
- package/addon/components/custom-field-form-panel.js +144 -0
- package/addon/components/custom-field.hbs +63 -41
- package/addon/components/custom-field.js +123 -25
- package/addon/components/driver-form-panel.hbs +1 -1
- package/addon/components/driver-panel.hbs +1 -1
- package/addon/components/edit-order-route-panel.hbs +1 -1
- package/addon/components/fleet-form-panel.hbs +1 -1
- package/addon/components/fleet-panel.hbs +1 -1
- package/addon/components/fuel-report-form-panel.hbs +1 -1
- package/addon/components/fuel-report-panel.hbs +1 -1
- package/addon/components/issue-form-panel.hbs +1 -1
- package/addon/components/issue-panel.hbs +1 -1
- package/addon/components/joint-graph.hbs +1 -0
- package/addon/components/joint-graph.js +103 -0
- package/addon/components/layout/fleet-ops-sidebar.hbs +3 -3
- package/addon/components/layout/fleet-ops-sidebar.js +1 -0
- package/addon/components/live-map.js +71 -28
- package/addon/components/modals/new-custom-field-group.hbs +5 -0
- package/addon/components/modals/new-order-config.hbs +3 -3
- package/addon/components/modals/order-new-activity.hbs +1 -1
- package/addon/components/order-config-manager/activity-flow.hbs +11 -0
- package/addon/components/order-config-manager/activity-flow.js +964 -0
- package/addon/components/order-config-manager/custom-fields.hbs +50 -0
- package/addon/components/order-config-manager/custom-fields.js +276 -0
- package/addon/components/order-config-manager/details.hbs +23 -0
- package/addon/components/order-config-manager/details.js +97 -0
- package/addon/components/order-config-manager/entities.hbs +54 -0
- package/addon/components/order-config-manager/entities.js +227 -0
- package/addon/components/order-config-manager-overlay.hbs +26 -0
- package/addon/components/order-config-manager-overlay.js +60 -0
- package/addon/components/order-config-manager.hbs +15 -0
- package/addon/components/order-config-manager.js +285 -0
- package/addon/components/order-flow.hbs +1 -0
- package/addon/components/order-flow.js +3 -0
- package/addon/components/place-form-panel.hbs +1 -1
- package/addon/components/place-panel.hbs +1 -1
- package/addon/components/vehicle-form-panel.hbs +1 -1
- package/addon/components/vehicle-panel.hbs +1 -1
- package/addon/components/vendor-form-panel.hbs +1 -1
- package/addon/components/vendor-panel.hbs +1 -1
- package/addon/controllers/application.js +5 -1
- package/addon/controllers/operations/order-config.js +42 -0
- package/addon/controllers/operations/orders/index/new.js +125 -21
- package/addon/controllers/operations/orders/index/view.js +87 -4
- package/addon/controllers/operations/orders/index.js +2 -2
- package/addon/engine.js +10 -1
- package/addon/initializers/load-jointjs.js +16 -0
- package/addon/routes/application.js +1 -1
- package/addon/routes/operations/order-config.js +28 -0
- package/addon/routes/operations/orders/index/new.js +2 -3
- package/addon/routes/operations/orders/index/view.js +1 -1
- package/addon/routes.js +1 -0
- package/addon/services/context-panel.js +65 -3
- package/addon/styles/fleetops-engine.css +268 -0
- package/addon/templates/application.hbs +1 -1
- package/addon/templates/operations/order-config.hbs +55 -0
- package/addon/templates/operations/orders/index/new.hbs +98 -339
- package/addon/templates/operations/orders/index/view.hbs +36 -96
- package/addon/templates/operations/orders/index.hbs +0 -1
- package/addon/utils/apply-context-component-arguments.js +4 -2
- package/addon/utils/create-custom-entity.js +22 -0
- package/addon/utils/create-flow-activity.js +31 -0
- package/addon/utils/get-custom-field-type-map.js +34 -0
- package/app/components/activity-event-selector.js +1 -0
- package/app/components/activity-form-panel.js +1 -0
- package/app/components/activity-logic-builder.js +1 -0
- package/app/components/custom-entity-form-panel.js +1 -0
- package/app/components/custom-field-form-panel/options-input.js +1 -0
- package/app/components/custom-field-form-panel.js +1 -0
- package/app/components/joint-graph.js +1 -0
- package/app/components/modals/new-custom-field-group.js +1 -0
- package/app/components/order-config-manager/activity-flow.js +1 -0
- package/app/components/order-config-manager/custom-fields.js +1 -0
- package/app/components/order-config-manager/details.js +1 -0
- package/app/components/order-config-manager/entities.js +1 -0
- package/app/components/order-config-manager-overlay.js +1 -0
- package/app/components/order-config-manager.js +1 -0
- package/app/components/order-flow.js +1 -0
- package/app/controllers/operations/order-config.js +1 -0
- package/app/routes/operations/order-config.js +1 -0
- package/app/templates/operations/order-config.js +1 -0
- package/app/utils/create-custom-entity.js +1 -0
- package/app/utils/create-flow-activity.js +1 -0
- package/app/utils/get-custom-field-type-map.js +1 -0
- package/composer.json +4 -3
- package/config/environment.js +1 -0
- package/extension.json +1 -1
- package/index.js +20 -0
- package/package.json +7 -5
- package/server/migrations/2023_04_27_053456_create_contacts_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_drivers_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_entities_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_fleet_drivers_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_fleets_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_fuel_reports_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_integrated_vendors_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_issues_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_orders_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_payloads_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_places_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_positions_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_proofs_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_purchase_rates_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_routes_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_service_areas_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_service_quote_items_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_service_quotes_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_service_rate_fees_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_service_rate_parcel_fees_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_service_rates_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_tracking_numbers_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_tracking_statuses_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_vehicles_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_vendors_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_waypoints_table.php +1 -2
- package/server/migrations/2023_04_27_053456_create_zones_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_companies_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_contacts_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_drivers_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_entities_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleet_drivers_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fleets_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_fuel_reports_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_integrated_vendors_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_issues_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_orders_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_payloads_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_places_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_positions_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_proofs_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_purchase_rates_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_routes_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_areas_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quote_items_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_quotes_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_fees_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rate_parcel_fees_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_service_rates_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_numbers_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_tracking_statuses_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vehicles_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_vendors_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_waypoints_table.php +1 -2
- package/server/migrations/2023_04_27_053459_add_foreign_keys_to_zones_table.php +1 -2
- package/server/migrations/2023_09_14_074512_update_vehicles_table.php +1 -2
- package/server/migrations/2023_09_14_074619_create_vehicle_devices_table.php +35 -36
- package/server/migrations/2023_09_26_071205_add_online_column_to_vehicles_table.php +1 -2
- package/server/migrations/2023_09_26_083957_create_fleet_vehicles_table.php +1 -2
- package/server/migrations/2023_09_27_023757_add_column_to_fleets_table.php +1 -2
- package/server/migrations/2023_10_05_074811_update_vehicle.php +1 -2
- package/server/migrations/2023_10_25_093014_create_vehicle_device_events_table.php +1 -2
- package/server/migrations/2023_11_03_072503_refactor_issues_table_columns.php +1 -2
- package/server/migrations/2023_11_06_040645_refactor_fuel_reports_table.php +1 -2
- package/server/migrations/2023_11_09_041807_add_status_column_to_fuel_reports_table.php +1 -2
- package/server/migrations/2023_11_15_062814_add_comments_column_and_resolved_at_column_to_vehicle_device_events_table.php +1 -2
- package/server/migrations/2023_11_17_053001_add_category_uuid_to_entities_table.php +1 -2
- package/server/migrations/2023_11_28_074244_add_supplier_uuid_column_to_entities_table.php +1 -2
- package/server/migrations/2023_12_14_100209_add_meta_column_on_driver_table copy.php +1 -2
- package/server/migrations/2024_02_18_100209_add_avatar_url_columns_table.php +3 -4
- package/server/migrations/2024_02_27_093648_create_order_configs_table.php +43 -0
- package/server/migrations/2024_03_07_075508_add_order_config_uuid_column_to_orders_table.php +28 -0
- package/server/seeders/OrderConfigSeeder.php +151 -0
- package/server/src/Casts/OrderConfigEntities.php +53 -0
- package/server/src/Console/Commands/FixLegacyOrderConfigs.php +66 -0
- package/server/src/Events/DriverLocationChanged.php +1 -1
- package/server/src/Events/DriverSimulatedLocationChanged.php +1 -1
- package/server/src/Expansions/UserExpansion.php +4 -4
- package/server/src/Flow/Activity.php +232 -6
- package/server/src/Flow/Condition.php +84 -0
- package/server/src/Flow/Event.php +88 -0
- package/server/src/Flow/Flow.php +50 -0
- package/server/src/Flow/FlowResource.php +143 -0
- package/server/src/Flow/Logic.php +57 -1
- package/server/src/Http/Controllers/Api/v1/DriverController.php +2 -2
- package/server/src/Http/Controllers/Api/v1/IssueController.php +132 -0
- package/server/src/Http/Controllers/Api/v1/OrderController.php +130 -57
- package/server/src/Http/Controllers/Api/v1/OrganizationController.php +27 -0
- package/server/src/Http/Controllers/Api/v1/PlaceController.php +2 -3
- package/server/src/Http/Controllers/Controller.php +9 -0
- package/server/src/Http/Controllers/FleetOpsController.php +7 -0
- package/server/src/Http/Controllers/Internal/v1/OrderConfigController.php +5 -259
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +56 -35
- package/server/src/Http/Controllers/Internal/v1/SettingController.php +20 -0
- package/server/src/Http/Filter/OrderConfigFilter.php +13 -0
- package/server/src/Http/Requests/CreateIssueRequest.php +19 -0
- package/server/src/Http/Requests/UpdateIssueRequest.php +7 -0
- package/server/src/Http/Resources/v1/Order.php +3 -0
- package/server/src/Http/Resources/v1/Payload.php +1 -1
- package/server/src/Listeners/HandleOrderCanceled.php +8 -4
- package/server/src/Listeners/HandleOrderDispatched.php +14 -12
- package/server/src/Models/Order.php +527 -31
- package/server/src/Models/OrderConfig.php +419 -0
- package/server/src/Models/Payload.php +8 -7
- package/server/src/Notifications/OrderAssigned.php +1 -1
- package/server/src/Notifications/OrderCanceled.php +1 -1
- package/server/src/Notifications/OrderDispatchFailed.php +1 -1
- package/server/src/Notifications/OrderDispatched.php +1 -1
- package/server/src/Notifications/OrderPing.php +1 -1
- package/server/src/Providers/FleetOpsServiceProvider.php +3 -1
- package/server/src/Providers/NotificationServiceProvider.php +2 -1
- package/server/src/Support/Utils.php +17 -0
- package/server/src/Traits/HasTrackingNumber.php +9 -9
- package/server/src/routes.php +19 -11
- package/translations/en-us.yaml +137 -0
- package/server/src/Flow/Config.php +0 -7
- package/server/src/Support/Flow.php +0 -653
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<div class="px-6 space-y-4">
|
|
2
|
+
<div class="flex flex-row items-center py-2 space-x-4">
|
|
3
|
+
<Button @type="primary" @icon="square-plus" @text={{t "fleet-ops.component.order-config-manager.custom-fields.new-field-group"}} @onClick={{this.createNewFieldGroup}} />
|
|
4
|
+
</div>
|
|
5
|
+
{{#each this.groups as |group|}}
|
|
6
|
+
<ContentPanel @title={{group.name}} @open={{true}} @pad={{true}} @panelBodyClass="bg-white dark:bg-gray-900">
|
|
7
|
+
<div class="flex flex-row items-center py-2 space-x-4 mb-3">
|
|
8
|
+
<Button @type="primary" @icon="square-plus" @text={{t "fleet-ops.component.order-config-manager.custom-fields.new-custom-field"}} @onClick={{fn this.createNewCustomField group}} />
|
|
9
|
+
<DropdownButton @text={{concat (t "fleet-ops.component.order-config-manager.custom-fields.grid-size") ": " (or group.meta.grid_size 1)}} @textClass="text-sm mr-2" @buttonClass="flex-row-reverse w-44 justify-between" @icon="caret-down" @iconClass="mr-0i" @size="sm" @iconPrefix="fas" @triggerClass="hidden md:flex" as |dd|>
|
|
10
|
+
<div class="next-dd-menu mt-1 mx-0" aria-labelledby="user-menu">
|
|
11
|
+
<div class="p-1">
|
|
12
|
+
{{#each this.gridSizeOptions as |size|}}
|
|
13
|
+
<a href="javascript:;" class="next-dd-item" {{on "click" (dropdown-fn dd this.selectGridSize group size)}}>
|
|
14
|
+
<div class="flex-1 flex flex-row items-center">
|
|
15
|
+
<div class="w-6">
|
|
16
|
+
<FaIcon @icon="grip" />
|
|
17
|
+
</div>
|
|
18
|
+
<span>{{size}}</span>
|
|
19
|
+
</div>
|
|
20
|
+
<div>
|
|
21
|
+
{{#if (eq size (or group.meta.grid_size 1))}}
|
|
22
|
+
<FaIcon @icon="check" class="text-green-500" />
|
|
23
|
+
{{/if}}
|
|
24
|
+
</div>
|
|
25
|
+
</a>
|
|
26
|
+
{{/each}}
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
</DropdownButton>
|
|
30
|
+
<Button @type="danger" @icon="trash" @onClick={{fn this.deleteCustomFieldGroup group}} />
|
|
31
|
+
</div>
|
|
32
|
+
<div class="grid grid-cols-{{or group.meta.grid_size 1}} gap-2">
|
|
33
|
+
{{#each group.customFields as |customField|}}
|
|
34
|
+
<div class="rounded-lg border border-gray-200 dark:border-gray-700 px-3 py-1.5 flex flex-row items-center justify-between {{unless customField.id 'opacity-50'}}">
|
|
35
|
+
<div class="flex items-center space-x-2">
|
|
36
|
+
<div class="font-semibold text-sm">{{customField.label}}</div>
|
|
37
|
+
<div class="order-config-custom-field-type-pill rounded-lg bg-gray-300 dark:bg-gray-700 text-black dark:text-gray-300 px-2 py-0.5 text-xs truncate font-mono">
|
|
38
|
+
{{customField.type}}
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
<div class="flex flex-row items-center space-x-2">
|
|
42
|
+
<Button @type="default" @icon="pencil" @onClick={{fn this.editCustomField customField}} />
|
|
43
|
+
<Button @type="danger" @icon="trash" @onClick={{fn this.deleteCustomField customField}} />
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
{{/each}}
|
|
47
|
+
</div>
|
|
48
|
+
</ContentPanel>
|
|
49
|
+
{{/each}}
|
|
50
|
+
</div>
|
|
@@ -0,0 +1,276 @@
|
|
|
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 { isArray } from '@ember/array';
|
|
6
|
+
import { later } from '@ember/runloop';
|
|
7
|
+
import { task } from 'ember-concurrency-decorators';
|
|
8
|
+
import isObject from '@fleetbase/ember-core/utils/is-object';
|
|
9
|
+
import contextComponentCallback from '../../utils/context-component-callback';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Component class for managing custom fields within an order configuration.
|
|
13
|
+
* This component allows for creating, editing, grouping, and managing custom fields,
|
|
14
|
+
* along with their associated field groups in the context of an order configuration.
|
|
15
|
+
*
|
|
16
|
+
* @extends Component
|
|
17
|
+
*/
|
|
18
|
+
export default class OrderConfigManagerCustomFieldsComponent extends Component {
|
|
19
|
+
/**
|
|
20
|
+
* Store service for handling data operations.
|
|
21
|
+
* @service
|
|
22
|
+
*/
|
|
23
|
+
@service store;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Notifications service for displaying user feedback.
|
|
27
|
+
* @service
|
|
28
|
+
*/
|
|
29
|
+
@service notifications;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Modals manager service for handling modal dialogs.
|
|
33
|
+
* @service
|
|
34
|
+
*/
|
|
35
|
+
@service modalsManager;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Context panel service for managing UI contexts.
|
|
39
|
+
* @service
|
|
40
|
+
*/
|
|
41
|
+
@service contextPanel;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Internationalization service for handling translations.
|
|
45
|
+
* @service
|
|
46
|
+
*/
|
|
47
|
+
@service intl;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Tracked array of field groups.
|
|
51
|
+
* @tracked
|
|
52
|
+
*/
|
|
53
|
+
@tracked groups = [];
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Tracked property for the configuration being managed.
|
|
57
|
+
* @tracked
|
|
58
|
+
*/
|
|
59
|
+
@tracked config;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Tracked array of grid size options for the custom field groups.
|
|
63
|
+
* @tracked
|
|
64
|
+
*/
|
|
65
|
+
@tracked gridSizeOptions = [1, 2, 3];
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Constructor for OrderConfigManagerCustomFieldsComponent.
|
|
69
|
+
* Initializes the component with the provided configuration and loads custom fields.
|
|
70
|
+
* @param {Object} owner - The owner of the component.
|
|
71
|
+
* @param {Object} args - The arguments passed to the component, including the configuration.
|
|
72
|
+
*/
|
|
73
|
+
constructor(owner, { config, configManagerContext }) {
|
|
74
|
+
super(...arguments);
|
|
75
|
+
this.config = config;
|
|
76
|
+
this.loadCustomFields.perform();
|
|
77
|
+
|
|
78
|
+
configManagerContext.on('onConfigChanged', (newConfig) => {
|
|
79
|
+
this.changeConfig(newConfig);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Action method to select a grid size for a custom field group.
|
|
85
|
+
* @param {Object} group - The custom field group to update.
|
|
86
|
+
* @param {number} size - The selected grid size.
|
|
87
|
+
* @action
|
|
88
|
+
*/
|
|
89
|
+
@action selectGridSize(group, size) {
|
|
90
|
+
if (!isObject(group.meta)) {
|
|
91
|
+
group.set('meta', {});
|
|
92
|
+
}
|
|
93
|
+
group.meta.grid_size = size;
|
|
94
|
+
|
|
95
|
+
return group.save();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Action method to create a new custom field within a group.
|
|
100
|
+
* @param {Object} group - The group to add the new custom field to.
|
|
101
|
+
* @action
|
|
102
|
+
*/
|
|
103
|
+
@action createNewCustomField(group) {
|
|
104
|
+
const customField = this.store.createRecord('custom-field', {
|
|
105
|
+
category_uuid: group.id,
|
|
106
|
+
subject_uuid: this.config.id,
|
|
107
|
+
subject_type: 'order-config',
|
|
108
|
+
required: 0,
|
|
109
|
+
options: [],
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
this.addCustomFieldToGroup(customField, group);
|
|
113
|
+
this.editCustomField(customField);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Action method to edit an existing custom field.
|
|
118
|
+
* @param {Object} customField - The custom field to edit.
|
|
119
|
+
* @action
|
|
120
|
+
*/
|
|
121
|
+
@action editCustomField(customField) {
|
|
122
|
+
contextComponentCallback(this, 'onContextChanged', customField);
|
|
123
|
+
this.contextPanel.focus(customField, 'editing', {
|
|
124
|
+
args: {
|
|
125
|
+
customField,
|
|
126
|
+
onCustomFieldSaved: () => {
|
|
127
|
+
this.loadCustomFields.perform();
|
|
128
|
+
this.contextPanel.clear();
|
|
129
|
+
contextComponentCallback(this, 'onContextChanged', null);
|
|
130
|
+
},
|
|
131
|
+
onPressCancel: () => {
|
|
132
|
+
this.contextPanel.clear();
|
|
133
|
+
contextComponentCallback(this, 'onContextChanged', null);
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Action method to delete a custom field.
|
|
141
|
+
* @param {Object} customField - The custom field to delete.
|
|
142
|
+
* @action
|
|
143
|
+
*/
|
|
144
|
+
@action deleteCustomField(customField) {
|
|
145
|
+
this.modalsManager.confirm({
|
|
146
|
+
title: this.intl.t('fleet-ops.component.order-config-manager.custom-fields.delete-custom-field-prompt.modal-title'),
|
|
147
|
+
body: this.intl.t('fleet-ops.component.order-config-manager.custom-fields.delete-custom-field-prompt.delete-body-message'),
|
|
148
|
+
acceptButtonText: this.intl.t('fleet-ops.component.order-config-manager.custom-fields.delete-custom-field-prompt.confirm-delete'),
|
|
149
|
+
confirm: () => {
|
|
150
|
+
return customField.destroyRecord();
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Action method to create a new field group for custom fields.
|
|
157
|
+
* @action
|
|
158
|
+
*/
|
|
159
|
+
@action createNewFieldGroup() {
|
|
160
|
+
const customFieldGroup = this.store.createRecord('category', {
|
|
161
|
+
owner_uuid: this.config.id,
|
|
162
|
+
owner_type: 'order-config',
|
|
163
|
+
for: 'custom_field_group',
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
this.modalsManager.show('modals/new-custom-field-group', {
|
|
167
|
+
title: this.intl.t('fleet-ops.component.modals.new-custom-field-group.modal-title'),
|
|
168
|
+
acceptButtonIcon: 'check',
|
|
169
|
+
acceptButtonIconPrefix: 'fas',
|
|
170
|
+
declineButtonIcon: 'times',
|
|
171
|
+
declineButtonIconPrefix: 'fas',
|
|
172
|
+
customFieldGroup,
|
|
173
|
+
confirm: (modal) => {
|
|
174
|
+
if (!customFieldGroup.name) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
modal.startLoading();
|
|
179
|
+
return customFieldGroup
|
|
180
|
+
.save()
|
|
181
|
+
.then(() => {
|
|
182
|
+
this.loadCustomFields.perform();
|
|
183
|
+
})
|
|
184
|
+
.catch((error) => {
|
|
185
|
+
this.notifications.serverError(error);
|
|
186
|
+
});
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Action method to delete a custom field group.
|
|
193
|
+
* @param {Object} group - The field group to delete.
|
|
194
|
+
* @action
|
|
195
|
+
*/
|
|
196
|
+
@action deleteCustomFieldGroup(group) {
|
|
197
|
+
this.modalsManager.confirm({
|
|
198
|
+
title: this.intl.t('fleet-ops.component.order-config-manager.custom-fields.delete-custom-field-group-prompt.modal-title'),
|
|
199
|
+
body: this.intl.t('fleet-ops.component.order-config-manager.custom-fields.delete-custom-field-group-prompt.delete-body-message'),
|
|
200
|
+
acceptButtonText: this.intl.t('fleet-ops.component.order-config-manager.custom-fields.delete-custom-field-group-prompt.confirm-delete'),
|
|
201
|
+
confirm: () => {
|
|
202
|
+
return group.destroyRecord();
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* A task method to load custom fields from the store and group them.
|
|
209
|
+
* @task
|
|
210
|
+
*/
|
|
211
|
+
@task *loadCustomFields() {
|
|
212
|
+
this.groups = yield this.store.query('category', { owner_uuid: this.config.id, for: 'custom_field_group' });
|
|
213
|
+
this.customFields = yield this.store.query('custom-field', { subject_uuid: this.config.id });
|
|
214
|
+
this.groupCustomFields();
|
|
215
|
+
this.initializeContext();
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* If any context is provided then initialize the state.
|
|
220
|
+
*
|
|
221
|
+
* @memberof OrderConfigManagerCustomFieldsComponent
|
|
222
|
+
*/
|
|
223
|
+
initializeContext() {
|
|
224
|
+
later(
|
|
225
|
+
this,
|
|
226
|
+
() => {
|
|
227
|
+
const { context, contextModel } = this.args;
|
|
228
|
+
if (typeof context === 'string' && contextModel === 'custom-field') {
|
|
229
|
+
const contextCustomField = this.store.peekRecord('custom-field', context);
|
|
230
|
+
if (contextCustomField) {
|
|
231
|
+
this.editCustomField(contextCustomField);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
300
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Handle the change of config.
|
|
241
|
+
*
|
|
242
|
+
* @param {OrderConfigModel} newConfig
|
|
243
|
+
* @memberof OrderConfigManagerCustomFieldsComponent
|
|
244
|
+
*/
|
|
245
|
+
changeConfig(newConfig) {
|
|
246
|
+
this.config = newConfig;
|
|
247
|
+
this.loadCustomFields.perform();
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Adds a custom field to a specified group.
|
|
252
|
+
* @param {Object} customField - The custom field to add.
|
|
253
|
+
* @param {Object} group - The group to add the custom field to.
|
|
254
|
+
*/
|
|
255
|
+
addCustomFieldToGroup(customField, group) {
|
|
256
|
+
if (!isArray(group.customFields)) {
|
|
257
|
+
group.customFields = [];
|
|
258
|
+
}
|
|
259
|
+
group.set('customFields', [...group.customFields, customField]);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Organizes custom fields into their respective groups.
|
|
264
|
+
*/
|
|
265
|
+
groupCustomFields() {
|
|
266
|
+
for (let i = 0; i < this.groups.length; i++) {
|
|
267
|
+
const group = this.groups[i];
|
|
268
|
+
group.set(
|
|
269
|
+
'customFields',
|
|
270
|
+
this.customFields.filter((customField) => {
|
|
271
|
+
return customField.category_uuid === group.id;
|
|
272
|
+
})
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<div class="px-6 py-2 space-y-4">
|
|
2
|
+
<ContentPanel @title={{t "fleet-ops.component.order-config-manager.details.details"}} @open={{true}} @pad={{true}} @panelBodyClass="bg-white dark:bg-gray-900">
|
|
3
|
+
<InputGroup @name={{t "fleet-ops.component.order-config-manager.details.name"}} @value={{@config.name}} @disabled={{@config.core_service}} />
|
|
4
|
+
<InputGroup @name={{t "fleet-ops.component.order-config-manager.details.description"}} @value={{@config.description}} @disabled={{@config.core_service}} />
|
|
5
|
+
<InputGroup @name={{t "fleet-ops.component.order-config-manager.details.tags"}}>
|
|
6
|
+
<TagInput class="form-input" @placeholder={{t "fleet-ops.component.order-config-manager.details.add-tags"}} @allowSpacesInTags={{true}} @tags={{@config.tags}} @addTag={{@config.addTag}} @removeTagAtIndex={{@config.removeTag}} @disabled={{@config.core_service}} as |tag|>
|
|
7
|
+
{{tag}}
|
|
8
|
+
</TagInput>
|
|
9
|
+
</InputGroup>
|
|
10
|
+
<InputGroup @name={{t "fleet-ops.component.order-config-manager.details.key"}} @value={{@config.key}} @disabled={{true}} />
|
|
11
|
+
<InputGroup @name={{t "fleet-ops.component.order-config-manager.details.namespace"}} @value={{@config.namespace}} @disabled={{true}} />
|
|
12
|
+
<InputGroup @name={{t "fleet-ops.component.order-config-manager.details.version"}} @value={{@config.version}} @disabled={{true}} />
|
|
13
|
+
</ContentPanel>
|
|
14
|
+
|
|
15
|
+
{{#unless @config.core_service}}
|
|
16
|
+
<ContentPanel @title={{t "fleet-ops.component.order-config-manager.details.controls"}} @open={{true}} @pad={{true}} @panelBodyClass="bg-white dark:bg-gray-900">
|
|
17
|
+
<div class="flex flex-row items-center py-2 space-x-4">
|
|
18
|
+
<Button @type="primary" @icon="save" @text={{t "common.save-changes"}} @onClick={{this.save}} @disabled={{not @config.hasDirtyAttributes}} />
|
|
19
|
+
<Button @type="danger" @icon="trash" @text={{t "fleet-ops.component.order-config-manager.details.delete-config"}} @onClick={{this.delete}} />
|
|
20
|
+
</div>
|
|
21
|
+
</ContentPanel>
|
|
22
|
+
{{/unless}}
|
|
23
|
+
</div>
|
|
@@ -0,0 +1,97 @@
|
|
|
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
|
+
/**
|
|
7
|
+
* Component class for managing the details of an order configuration.
|
|
8
|
+
* This component allows for saving and deleting order configurations,
|
|
9
|
+
* with user feedback through notifications and confirmation modals.
|
|
10
|
+
*
|
|
11
|
+
* @extends Component
|
|
12
|
+
*/
|
|
13
|
+
export default class OrderConfigManagerDetailsComponent extends Component {
|
|
14
|
+
/**
|
|
15
|
+
* Modals manager service for handling modal dialogs.
|
|
16
|
+
* @service
|
|
17
|
+
*/
|
|
18
|
+
@service modalsManager;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Notifications service for displaying user feedback.
|
|
22
|
+
* @service
|
|
23
|
+
*/
|
|
24
|
+
@service notifications;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Internationalization service for handling translations.
|
|
28
|
+
* @service
|
|
29
|
+
*/
|
|
30
|
+
@service intl;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Store service for handling data storage and retrieval.
|
|
34
|
+
* @service
|
|
35
|
+
*/
|
|
36
|
+
@service store;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Tracked property for the configuration being managed.
|
|
40
|
+
* @tracked
|
|
41
|
+
*/
|
|
42
|
+
@tracked config;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Constructor for OrderConfigManagerDetailsComponent.
|
|
46
|
+
* Initializes the component with the provided configuration.
|
|
47
|
+
* @param {Object} owner - The owner of the component.
|
|
48
|
+
* @param {Object} args - The arguments passed to the component, including the configuration.
|
|
49
|
+
*/
|
|
50
|
+
constructor(owner, { config }) {
|
|
51
|
+
super(...arguments);
|
|
52
|
+
this.config = config;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Action method to save the current configuration.
|
|
57
|
+
* Provides user feedback and executes callback on successful update.
|
|
58
|
+
* @action
|
|
59
|
+
*/
|
|
60
|
+
@action save() {
|
|
61
|
+
return this.config
|
|
62
|
+
.save()
|
|
63
|
+
.then(() => {
|
|
64
|
+
this.notifications.success(this.intl.t('fleet-ops.component.order-config-manager.saved-success-message', { orderConfigName: this.config.name }));
|
|
65
|
+
if (typeof this.args.onConfigUpdated === 'function') {
|
|
66
|
+
this.args.onConfigUpdated(this.config);
|
|
67
|
+
}
|
|
68
|
+
})
|
|
69
|
+
.catch((error) => {
|
|
70
|
+
this.notifications.serverError(error);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Action method to delete the current configuration.
|
|
76
|
+
* Provides a confirmation modal and executes callback on successful deletion.
|
|
77
|
+
* @action
|
|
78
|
+
*/
|
|
79
|
+
@action delete() {
|
|
80
|
+
this.modalsManager.confirm({
|
|
81
|
+
title: this.intl.t('fleet-ops.component.order-config-manager.details.delete.delete-title'),
|
|
82
|
+
body: this.intl.t('fleet-ops.component.order-config-manager.details.delete.delete-body-message'),
|
|
83
|
+
acceptButtonText: this.intl.t('fleet-ops.component.order-config-manager.details.delete.confirm-delete'),
|
|
84
|
+
confirm: () => {
|
|
85
|
+
if (typeof this.args.onConfigDeleting === 'function') {
|
|
86
|
+
this.args.onConfigDeleting(this.config);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return this.config.destroyRecord().then(() => {
|
|
90
|
+
if (typeof this.args.onConfigDeleted === 'function') {
|
|
91
|
+
this.args.onConfigDeleted(this.config);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<div class="px-6 space-y-4">
|
|
2
|
+
<div class="flex flex-row items-center py-2 space-x-4">
|
|
3
|
+
<Button @type="primary" @icon="plus" @text={{t "fleet-ops.component.order-config-manager.entities.new-custom-entity"}} @onClick={{this.createNewCustomEntity}} />
|
|
4
|
+
</div>
|
|
5
|
+
{{#each this.customEntities as |customEntity index|}}
|
|
6
|
+
<ContentPanel @title={{customEntity.name}} @subtitle={{customEntity.description}} @panelSubtitleInlineClass="text-xs" @open={{true}} @pad={{true}} @panelBodyClass="bg-white dark:bg-gray-900">
|
|
7
|
+
<div class="flex flex-row items-center py-2 space-x-2 mb-4">
|
|
8
|
+
<Button @type="default" @icon="pencil" @onClick={{fn this.editCustomEntity customEntity index}} />
|
|
9
|
+
<Button @type="danger" @icon="trash" @onClick={{fn this.deleteCustomEntity customEntity index}} />
|
|
10
|
+
</div>
|
|
11
|
+
<div class="flex">
|
|
12
|
+
<div class="pr-4">
|
|
13
|
+
<div class="w-32 flex flex-col items-center">
|
|
14
|
+
<Image src={{customEntity.photo_url}} alt={{customEntity.name}} height="128" width="128" class="h-32 w-32 rounded-md" />
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="flex-1 space-y-4 pl-2">
|
|
18
|
+
<div class="grid grid-cols-4 gap-2">
|
|
19
|
+
<div>
|
|
20
|
+
<div class="font-semibold text-sm mb-2">{{t "fleet-ops.component.order-config-manager.entities.name"}}</div>
|
|
21
|
+
<div class="text-xs">{{customEntity.name}}</div>
|
|
22
|
+
</div>
|
|
23
|
+
<div>
|
|
24
|
+
<div class="font-semibold text-sm mb-2">{{t "fleet-ops.component.order-config-manager.entities.description"}}</div>
|
|
25
|
+
<div class="text-xs">{{customEntity.description}}</div>
|
|
26
|
+
</div>
|
|
27
|
+
<div>
|
|
28
|
+
<div class="font-semibold text-sm mb-2">{{t "fleet-ops.component.order-config-manager.entities.type"}}</div>
|
|
29
|
+
<div class="text-xs"><Badge @type="default">{{customEntity.type}}</Badge></div>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
<div class="grid grid-cols-4 gap-2">
|
|
33
|
+
<div>
|
|
34
|
+
<div class="font-semibold text-sm mb-2">{{t "fleet-ops.component.order-config-manager.entities.length"}}</div>
|
|
35
|
+
<div class="text-xs">{{customEntity.length}} {{customEntity.dimensions_unit}}</div>
|
|
36
|
+
</div>
|
|
37
|
+
<div>
|
|
38
|
+
<div class="font-semibold text-sm mb-2">{{t "fleet-ops.component.order-config-manager.entities.width"}}</div>
|
|
39
|
+
<div class="text-xs">{{customEntity.width}} {{customEntity.dimensions_unit}}</div>
|
|
40
|
+
</div>
|
|
41
|
+
<div>
|
|
42
|
+
<div class="font-semibold text-sm mb-2">{{t "fleet-ops.component.order-config-manager.entities.height"}}</div>
|
|
43
|
+
<div class="text-xs">{{customEntity.height}} {{customEntity.dimensions_unit}}</div>
|
|
44
|
+
</div>
|
|
45
|
+
<div>
|
|
46
|
+
<div class="font-semibold text-sm mb-2">{{t "fleet-ops.component.order-config-manager.entities.weight"}}</div>
|
|
47
|
+
<div class="text-xs">{{customEntity.weight}} {{customEntity.weight_unit}}</div>
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</ContentPanel>
|
|
53
|
+
{{/each}}
|
|
54
|
+
</div>
|