Open Event Frontend – Updating Ember Models Table from V1 to V2

FOSSASIA‘s Open Event Frontend uses the Ember Models Table for rendering all its tables. This provides features like easy sorting, pagination etc. Another major feature is that it can be modified to meet our styling needs. As we use Semantic UI for styling, we added the required CSS classes to our table. In version 1 this was done by overriding the classes, as shown below : const defaultMessages = {  searchLabel            : 'Search:',  searchPlaceholder      : 'Search',  ..... more to follow }; const defaultIcons = {  sortAsc         : 'caret down icon',  sortDesc        : 'caret up icon',  columnVisible   : 'checkmark box icon',    ..... more to follow   }; const defaultCssClasses = {  outerTableWrapper              : 'ui ui-table',  innerTableWrapper              : 'ui segment column sixteen wide inner-table-wrapper',  table                          : 'ui tablet stackable very basic table',  globalFilterWrapper            : 'ui row', ... more to follow }; const assign = Object.assign || assign; export default TableComponent.extend({  layout,  _setupMessages: observer('customMessages', function() {    const customIcons = getWithDefault(this, 'customMessages', {});    let newMessages = {};    assign(newMessages, defaultMessages, customIcons);    set(this, 'messages', O.create(newMessages));  }),  _setupIcons() {    const customIcons = getWithDefault(this, 'customIcons', {});    let newIcons = {};    assign(newIcons, defaultIcons, customIcons);    set(this, 'icons', O.create(newIcons));  },  _setupClasses() {    const customClasses = getWithDefault(this, 'customClasses', {});    let newClasses = {};    assign(newClasses, defaultCssClasses, customClasses);    set(this, 'classes', O.create(newClasses));  },  simplePaginationTemplate: 'components/ui-table/simple-pagination',  ........ }); And was used in the template as follows: <div class="{{classes.outerTableWrapper}}">  <div class="{{classes.globalFilterDropdownWrapper}}"> But in version 2, some major changes were introduced as follows: All partials inside a models-table were replaced with components models-table can now be used with block content New themes mechanism introduced for styling Here, I will talk about how the theming mechanism has been changed. As I mentioned above, in version 1 we used custom classes and icons. In version 2 the idea itself has changed. A new type called Theme was added. It provides four themes out of the box - SemanticUI, Bootstrap4, Bootstrap3, Default. We can create our custom theme based on any of the predefined themes. To suit our requirements we decided to modify the SemanticUI theme. We created a separate file to keep our custom theme so that code remains clean and short. import Default from 'ember-models-table/themes/semanticui'; export default Default.extend({ components: {   'pagination-simple'    : 'components/ui-table/simple-pagination',   'numericPagination'    : 'components/ui-table/numeric-pagination',   .....   }, classes: {   outerTableWrapper              : 'ui ui-table',   innerTableWrapper              : 'ui segment column sixteen wide inner-table-wrapper',   ..... }, icons: {   sortAsc         : 'caret down icon',   sortDesc        : 'caret up icon',   ...... }, messages: {   searchLabel            : 'Search:',   ..... } }); So a theme mostly consists of four main parts: Components Classes Icons Messages The last three are same as customClasses and customIcons and customMessages in version 1. Components is the map for components used internally in the models-table. In case you need to use a custom component, that can be done as follows: Make a new JavaScript file and provide its path in your theme file. import DefaultDropdown from '../../columns-dropdown'; import layout from 'your layout file path'; export default DefaultDropdown.extend({  layout }); Now just create the theme file object and pass…

Continue ReadingOpen Event Frontend – Updating Ember Models Table from V1 to V2

Adding JSON API support to ember-models-table in Open Event Front-end

Open Event Front-end project uses ember-models-table for handling all the table components in the application. Although ember-models-table is great for handling server requests for operations like pagination, sorting & filtering, but it does not support JSON API used in the Front-end project. In this blog we will see how we integrated JSON API standards to ember-models-table. Lets see how we added support for JSON API to table and made requests to the Open Event Orga-server. Adding JSON API support for filtering & sorting The JSON API specs follow a strict structure for supporting meta data & filtering options, the server expects an array of objects for specifying the name of the field, operation and the value for filtering. The name attribute specifies the column for which we need to apply the filter. eg we use `name` for the events name in the. `op` attribute specifies the operation to be used for filtration, `val` attribute is used to provide a value for comparison. You can check the list of all the supported operations here. For implementation of filter we will check if the column filter is being used i.e if the filter string is empty or not, if the string is not empty we add a filter object of the column using the specified specs, else we remove the filter object of the column. if (filter) { query.filter.pushObject({ name : filterTitle, op : 'ilike', val : `%${filter}%` }); } else { query.filter.removeObject({ name : filterTitle, op : 'ilike', val : `%${filter}%` }); } For sort functionally we need to pass a query parameter called `sort` which is a string value in the URL. Sorting can be done in ascending or descending order for which the server expects different values. We pass `sort=name` & `sort=-name` for sorting in ascending order & descending order respectively. const sortSign = { none : '', asc : '-', desc : '' }; let sortedBy = get(column, 'sortedBy'); if (typeOf(sortedBy) === 'undefined') { sortedBy = get(column, 'propertyName'); } Adding support for pagination The pagination in JSON API is implemented using query parameters `page[size]` & `page[number]` which specify the size of the page & the current page number respectively eg page[size]=10&page[number]=1 This will load the first ten events from the server in the application. Once the data is loaded in the application we calculate the number of pages to be rendered. The response from the server has attached meta-data which contains the total number of the events in the following structure: meta: { count: 100 } We calculate the number of pages by dividing the total count by the size of the page. We check if the number of items is greater than the pageSize, and calculate the number of the pages using the formula `items / pagesize + (items % pagesize ? 1 : 0)`. If the items are less than the pageSize we do not have to calculate the pages and we simply hide the pagination in the footer. if (pageSize > items) { this.$('.pagination').css({ display:…

Continue ReadingAdding JSON API support to ember-models-table in Open Event Front-end