Ember Starter Kit

by carpeliam

HTML

<link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/normalize/2.1.0/normalize.css">
<script src="http://builds.handlebarsjs.com.s3.amazonaws.com/handlebars-v1.1.2.js"></script>
<script src="http://builds.emberjs.com/release/ember.min.js"></script>
<script src="http://builds.emberjs.com/beta/ember-data.min.js"></script>
<script type="text/x-handlebars">
    <h2>Welcome to Ember.js</h2>

    {{outlet}}
  </script>

  <script type="text/x-handlebars" data-template-name="index">
      {{selectedWidgetCount}} widgets selected
    <ul>
        <li>
            <a {{action 'selectAll'}} {{bind-attr class=":btn :btn-default isAllSelected:active"}}>
              All
            </a>
        </li>
    {{#each itemController="widget"}}
      <li>
          <a {{action 'select'}} {{bind-attr class=":btn :btn-default isSelected:active"}}>
              {{name}}
          </a>
      </li>
    {{/each}}
    </ul>
  </script>

CSS

@import url('http://getbootstrap.com/dist/css/bootstrap.css');
/* Put your CSS here */
 html, body {
    margin: 20px;
}

JavaScript

App = Ember.Application.create();

App.ApplicationAdapter = DS.FixtureAdapter;

App.User = DS.Model.extend({
  username: DS.attr(),
  email: DS.attr(),
  preferences: DS.attr()
});

App.Widget = DS.Model.extend({
  name: DS.attr()
});

App.initializer({
    name: 'loadCurrentUser',
    initialize: function(container) {
        var store = container.lookup('store:main');
        var user = store.push('user', {"id":"1", "preferences": {"selectedIds": ["1"]}});
        container.optionsForType('user', {instantiate: false});
        container.register('user:current', store.find('user', user.id));
        container.typeInjection('controller', 'currentUser', 'user:current');
        container.typeInjection('route', 'currentUser', 'user:current');
    }
});

App.initializer({
    name: 'loadWidgets',
    initialize: function(container) {
        var store = container.lookup('store:main');
        store.pushMany('widget', [
            {"id": "1", "name": "Red"}, {"id": "2", "name": "Yellow"}, {"id": "3", "name": "Blue"}
        ]);
    }
});
App.IndexRoute = Ember.Route.extend({
    setupController: function(controller) {
        var store = this.get('store');
        controller.set('model', store.all('widget'));
    }
});

App.IndexController = Ember.ArrayController.extend({
  selectedWidgets: function() {
    var ids = this.get('currentUser.preferences.selectedIds.[]');
    return this.get('model').filter(function(widget) {
      return ids.contains(widget.get('id'));
    });
  }.property('currentUser.preferences.selectedIds.[]'),
  isAllSelected: function() {
    return this.get('selectedWidgets.length') === this.get('model.length');
  }.property('selectedWidgets.length','model.length'),
  selectedWidgetCount: function() {
    return this.get('selectedWidgets.length');
  }.property('selectedWidgets.length'),
  actions: {
      selectAll: function() {
          var ids;
          if (this.get('isAllSelected')) {
              ids = [];
          } else {
             ...