This blog post will illustrate how to add edit route to access code to allow organizers editing an access code. Editing access codes deals with the following API on Open Event Server.
PATCH /v1/access-codes/{id}
First of all we need to add a route to allow editing of access codes. Our route will be /events/{event_id}/tickets/access-codes/edit/{access_code_id}. To generate a new route we need to run the command
ember g route events/view/tickets/access-codes/edit
This will generate new routes files and templates. Also this will add this route in router.js. In router.js we need to specify what we are passing as a parameter to route. For this we specify access_code_id to let ember know that this parameter will be passed with the URL. This is done so as to know which access code to update. Our route should look something like this /events/{event_id}/tickets/access-codes/edit/{access_code_id}. Final router.js file for access-codes part is given below:
// app/router.js this.route('access-codes', function() { this.route('list', { path: '/:access_status' }); this.route('create'); this.route('edit', { path: '/edit/:access_code_id' }); });
Next we need to pass model (data) to our edit route template. In our model we will be looking for a particular access code with an id and event tickets. After we get our event tickets, we then look for the event tickets which are already present in that access code. This is done so as to check the tickets in the template which are already present in that access code. So for this in afterModel hook we loop over all event tickets and whichever ticket is included in the access code tickets array we mark its isChecked property as true. This helps us to mark those tickets as checked in multiple select checkboxes of template.
// app/routes/events/view/tickets/access-codes/edit.js model(params) { return RSVP.hash({ accessCode : this.store.findRecord('access-code', params.access_code_id, {}), tickets : this.modelFor('events.view').query('tickets', {}) }); }, async afterModel(model) { let tickets = await model.accessCode.tickets; let allTickets = model.tickets; allTickets.forEach(ticket => { if (tickets.includes(ticket)) { ticket.set('isChecked', true); } else { ticket.set('isChecked', false); } });
The information about multiple select checkboxes in frontend has been discussed in this blog post. Now after we are done setting our edit route we need to redirect user to edit page when he/she clicks on the edit button in access code list. For this we define the necessary actions in template which will be triggered when user clicks on the icon. Code for the edit icon in access code list is given below.
// templates/components/ui-table/cell/events/view/tickets/access-codes/cell-actions.hbs
class="ui vertical compact basic buttons">
{{#ui-popup content=(t 'Edit') click=(action editAccessCode record.id) class='ui icon button' position='left center'}}
class="edit icon">
{{/ui-popup}}
The editAccessCode action looks something like this.
// controller/events/view/tickets/access-codes/edit.js editAccessCode(id) { this.transitionToRoute('events.view.tickets.access-codes.edit', id); }
After clicking on the edit icon user is redirected to edit route where he/she can edit access code choosen. We use the same component that we chose for creating access code. To know more about create access code template component refer to this blog. Finally when saving the edited access code we call save action. This action is defined in the controllers. The action looks something like this.
// controllers/events/view/tickets/access-codes/edit.js export default Controller.extend({ actions: { save(accessCode) { accessCode.save() .then(() => { this.get('notify').success(this.get('l10n').t('Access code has been successfully updated.')); this.transitionToRoute('events.view.tickets.access-codes'); }) .catch(() => { this.get('notify').error(this.get('l10n').t('An unexpected error has occured. Discount code cannot be created.')); }); } } });
After the access code is saved. We redirect user back to access code list.