In this blog I discuss how we implemented sponsors layout in Open Event Front-end. The sponsors are fetched from Orga Server API and is handled using Ember JS in the Front-end.
The fetched sponsor is an array of JSON objects which need to be grouped based on the type of the sponsor which is done using the lodash library. How do we implement it?
Creating sponsor-list & sponsor-item components
We create two components sponsor-list which contains all the sponsors & sponsor-item which is used to render each sponsor.
ember g component sponsor-list
ember g component sponsor-item
Grouping the sponsors by type
The API response return an array of the sponsors of the event as :
sponsors: [ { name: 'Sponsor 2', Url: '#', logoUrl: 'http://placehold.it/150x60', level: 2, type: 'Gold Sponsor', description: '' }, { name: 'Sponsor 1', url: '#', logoUrl: 'http://placehold.it/150x60', level: 1, type: 'Silver Sponsor', description: '' } ]
This response is the list of all sponsors, which is not grouped by the type of the sponsor. We sort and group the array and return a JSON object in the sponsor-list component.
import Ember from 'ember'; import { orderBy, groupBy } from 'lodash'; const { Component, computed } = Ember; export default Component.extend({ sponsorsGrouped: computed('sponsors.[]', function() { return groupBy(orderBy(this.get('sponsors'), 'level'), 'type'); }) });
We use lodash orderBy to sort the sponsors by the level and groupBy to convert the array into an JSON object of the grouped sponsors. We compute the grouped object using ember computed property.
Rendering sponsors in public event route
The sponsor array is passed to the sponsors-list component where the sponsors are sorted and grouped. We pass each sponsor from the sponsorsGrouped to the sponsor-item component which renders the logo of the sponsor.
sponsor-list.hbs
<h3 class="ui header">{{t 'Sponsors'}}</h3> {{#each-in sponsorsGrouped as |key sponsors|}} <h4 class="ui header">{{key}}</h4> <div class="ui three column stackable grid"> {{#each sponsors as |sponsor|}} {{public/sponsor-item sponsor=sponsor}} {{/each}} </div> {{/each-in}}
sponsor-item.hbs
<a href="{{sponsor.url}}"> <img src="{{sponsor.logoUrl}}" class="ui image sponsor-image" alt="{{sponsor.name}}"> </a>
The outcome of this change on the Open Event Front-end now looks like this:
Thank you for reading the blog, you can check the source code for the example here.
Resources: