@fleetbase/fleetops-engine
Version:
Fleet & Transport Management Extension for Fleetbase
141 lines (128 loc) • 5.13 kB
JavaScript
import ResourceActionService from '@fleetbase/ember-core/services/resource-action';
import { inject as service } from '@ember/service';
import { action } from '@ember/object';
import { normalizeProvider, buildIntegrationPayload } from '../utils/vendor-integration';
export default class VendorActionsService extends ResourceActionService {
placeActions;
constructor() {
super(...arguments);
this.initialize('vendor', {
defaultAttributes: { status: 'active' },
});
}
transition = {
view: (vendor) => this.transitionTo('management.vendors.index.details', vendor),
edit: (vendor) => this.transitionTo('management.vendors.index.edit', vendor),
create: () => this.transitionTo('management.vendors.index.new'),
};
panel = {
create: (attributes = {}) => {
const vendor = this.createNewInstance(attributes);
return this.resourceContextPanel.open({
content: 'vendor/form',
title: this.intl.t('common.create-a-new-resource', { resource: this.intl.t('resource.vendor')?.toLowerCase() }),
useDefaultSaveTask: true,
saveOptions: {
callback: this.refresh,
},
vendor,
});
},
edit: (vendor) => {
return this.resourceContextPanel.open({
content: 'vendor/form',
title: this.intl.t('common.edit-resource-name', { resourceName: vendor.name }),
useDefaultSaveTask: true,
vendor,
});
},
view: (vendor) => {
return this.resourceContextPanel.open({
vendor,
header: 'vendor/panel-header',
tabs: [
{
key: 'overview',
id: 'overview',
label: this.intl.t('common.overview'),
component: 'vendor/details',
},
],
});
},
};
modal = {
create: (attributes = {}, options = {}, saveOptions = {}) => {
const vendor = this.createNewInstance(attributes);
return this.modalsManager.show('modals/resource', {
resource: vendor,
title: this.intl.t('common.create-a-new-resource', { resource: this.intl.t('resource.vendor')?.toLowerCase() }),
acceptButtonText: this.intl.t('common.create-resource', { resource: this.intl.t('resource.vendor') }),
component: 'vendor/form',
confirm: (modal) => this.modalTask.perform(modal, 'saveTask', vendor, { refresh: true, ...saveOptions }),
...options,
});
},
edit: (vendor, options = {}, saveOptions = {}) => {
return this.modalsManager.show('modals/resource', {
resource: vendor,
title: this.intl.t('common.edit-resource-name', { resourceName: vendor.name }),
acceptButtonText: this.intl.t('common.save-changes'),
saveButtonIcon: 'save',
component: 'vendor/form',
confirm: (modal) => this.modalTask.perform(modal, 'saveTask', vendor, { refresh: true, ...saveOptions }),
...options,
});
},
view: (vendor, options = {}) => {
return this.modalsManager.show('modals/resource', {
resource: vendor,
title: vendor.name,
component: 'vendor/details',
...options,
});
},
};
createVendorIntegration(provider, opts = {}) {
const normalized = normalizeProvider(provider);
if (!normalized) {
this.notifications.error('Invalid vendor provider configuration.');
return null;
}
const payload = buildIntegrationPayload(normalized);
const record = this.store.createRecord('integrated-vendor', { ...payload, provider_options: provider });
if (opts.autoSave) {
// Return a promise if caller wants immediate persistence
return record.save().catch((e) => {
this.notifications.error('Failed to create integration.');
// bubble up so caller can handle
throw e;
});
}
return record;
}
async viewPlace(vendor) {
const place = await vendor.place;
if (place) {
this.placeActions.modal.view(place);
}
}
async editPlace(vendor) {
const place = await vendor.place;
if (place) {
this.placeActions.modal.edit(place);
}
}
async createPlace(vendor) {
return this.placeActions.modal.create(
{},
{},
{
callback: async (place) => {
vendor.set('place_uuid', place.id);
await vendor.save();
},
}
);
}
}