This blog article will illustrate how the Speakers API is integrated in Open Event Frontend, which allows for the speakers and their associated data to be displayed in the speakers table. Also, it illustrates how the basic semantic UI table is converted into an ember model table to accommodate the fetched data from the API. Our discussion primarily will involve the app/routes/events/view/speakers route to illustrate the process.
The primary end point of Open Event API with which we are concerned with for fetching the the speaker details is:
GET /v1/events/{event_identifier}/speakers
First we need to formulate the filters options while making the API call. There are several tabs present which display all the sessions in a particular state i.e. pending, rejected, accepted and all. Thus the formulated filter options stored in the variable filterOptions are as follows:
let filterOptions = []; if (params.speakers_sessions_state === 'pending') { filterOptions = [ { name : 'state', op : 'eq', val : 'pending' } ]; } else if (params.speakers_sessions_state === 'accepted') { filterOptions = [ { name : 'state', op : 'eq', val : 'accepted' } ]; } else if (params.speakers_sessions_state === 'rejected') { filterOptions = [ { name : 'state', op : 'eq', val : 'rejected' } ]; } else { filterOptions = []; }
Next we need to formulate the required query to actually make the API call. It is important to note here that there is a column for sessions of the speaker in the speaker table. Sessions are a related field for a user and hence we will make use of the include clause while generating the query, Similarly we will make use of the filter clause to pass on the filter options we generated above in filterOptions.
Since the speakers are being fetched for a particular event, and we are in that event’s dashboard, the speakers in question have a hasMany relationship with the aforementioned event. Thus we can make use of the model already fetched in the view route. So the final query call will be as follows:
return this.modelFor('events.view').query('speakers', { include : 'sessions,event', filter : filterOptions, 'page[size]' : 10 });
The page[size] option in the query is for implementing pagination, it ensures that at max 10 speakers are returned at once.
Next, we need to convert the existing table to an ember model table. For this the first step is to delete the entire original table along with the dummy data in it. The events-table ember table component will be re-used to form the base structure of the table as follows:
{{events/events-table columns=columns data=model useNumericPagination=true showGlobalFilter=true showPageSize=true }}
Final steps of conversion table to ember table involve defining the columns of the table. They will be defined in the usual manner, with mandatory title and name attributes. In case the display requirements of the data are in mere simple text, calling a template for displaying the text is not required, however for more complex natured values in the columns, it is advisable to make use of the component, and the technical logic can be handled in the component template itself. For instance, one such field on the speakers table is sessions which are related records and were included especially in the query call. They are not directly accessible by their field names. Thus they must be referred as a child of the record object.
{{#each record.sessions as |session|}} {{session.title}} {{/each}}
Similarly the template for the actions column will have to be created as it requires complex logic to implement actions on those buttons. After defining all the columns in the controller, the final columns are as follows:
columns: [ { propertyName : 'name', title : 'Name' }, { propertyName : 'email', title : 'Email' }, { propertyName : 'mobile', title : 'Phone' }, { propertyName : 'sessions', title : 'Submitted Sessions', template : 'components/ui-table/cell/events/view/speakers/cell-simple-sessions', disableSorting : true }, { propertyName : '', title : 'Actions', template : 'components/ui-table/cell/events/view/speakers/cell-buttons' } ]
After performing all these steps, the static table which was holding dummy data has been converted into an ember table and thus features like inbuilt pagination, searching etc. can be used.
Resources
- Official Ember Model Table docs
- Ember JS-Controller
- Open Event API Docs
- Open Event frontend User permission route