diff --git a/app/.DS_Store b/app/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/app/.DS_Store differ diff --git a/app/controllers/group.js b/app/controllers/group.js new file mode 100644 index 0000000..8cbc9ed --- /dev/null +++ b/app/controllers/group.js @@ -0,0 +1,6 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + displaySuccessMsg: false, + successMsg: null +}); diff --git a/app/controllers/settings.js b/app/controllers/settings.js new file mode 100644 index 0000000..a3b1e3e --- /dev/null +++ b/app/controllers/settings.js @@ -0,0 +1,36 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + needs: ['user'], + actions: { + createAddress: function() { + var self = this, + currentUser = this.get('controllers.user').get('currentUser'); + var newAddress = this.store.createRecord('address', { + street : this.get('street'), + postcode : this.get('postcode'), + city : this.get('city'), + country : this.get('country'), + user: currentUser + }); + newAddress.save().then(function(){ + currentUser.save(); + self.setProperties({ + street: null, + postcode: null, + city: null, + country: null, + }); + self.set('addAddress', !self.get('addAddress')); + }); + }, + removeAddress: function(address) { + var currentUser = this.get('controllers.user').get('currentUser'); + address.destroyRecord(); + currentUser.save(); + }, + toggleAddAddress: function() { + this.set('addAddress', !this.get('addAddress')); + } + } +}); diff --git a/app/controllers/setup.js b/app/controllers/setup.js new file mode 100644 index 0000000..eb571c3 --- /dev/null +++ b/app/controllers/setup.js @@ -0,0 +1,35 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + needs: ['group'], + errorMsg: null, + displayErrorMsg: false, + fakeInit: function() { + if(this.get('model').get('username')) { + this.transitionToRoute('group'); + } + }, + actions: { + setupUser: function() { + var self = this, + currentUser = this.get('model'); + if(!this.get('content.username')) { + this.set('errorMsg', 'Please enter your username.'); + this.set('displayErrorMsg', true); + } else { + currentUser.setProperties({ username: this.get('content.username'), phone: this.get('content.phone') }); + currentUser.save().then(function(){ + self.set('displayErrorMsg', false); + self.get('controllers.group').set('displaySuccessMsg', true); + self.get('controllers.group').set('successMsg', 'Your information was saved. Thank you for subscribing.'); + window.setTimeout(function() { + window.$(".js-success").fadeTo(500, 0).slideUp(500, function() { + self.get('controllers.group').set('displaySuccessMsg', false); + }); + }, 4500); + self.transitionToRoute('group'); + }); + } + } + } +}); diff --git a/app/controllers/user.js b/app/controllers/user.js index 4faf7d7..d52ae41 100644 --- a/app/controllers/user.js +++ b/app/controllers/user.js @@ -133,6 +133,9 @@ export default Ember.Controller.extend({ if (exists) { self.store.find('user', userId).then(function(appUser) { self.set('currentUser', appUser); + if(!appUser.get('username')) { + self.transitionToRoute('setup'); + } }); } else { self.createNewUser(email, token); @@ -151,6 +154,9 @@ export default Ember.Controller.extend({ var appUser = self.store.find('user', authData.facebook.id).then(function(value) { self.set('currentUser', value); self.get('controllers.friend').fetchFriends(value); + if(!value.get('username')) { + self.transitionToRoute('setup'); + } return value; }); diff --git a/app/models/address.js b/app/models/address.js new file mode 100644 index 0000000..652cf45 --- /dev/null +++ b/app/models/address.js @@ -0,0 +1,11 @@ +import DS from 'ember-data'; + +export default DS.Model.extend({ + street : DS.attr('string'), + postcode : DS.attr('string'), + city : DS.attr('string'), + country : DS.attr('string'), + primary : DS.attr('boolean'), + group : DS.belongsTo("group", { async: true }), + user : DS.belongsTo("user", { async: true }) +}); diff --git a/app/models/group.js b/app/models/group.js index 03fce65..9074594 100644 --- a/app/models/group.js +++ b/app/models/group.js @@ -5,5 +5,6 @@ export default DS.Model.extend({ picture : DS.attr('string'), members : DS.hasMany("user", { async: true }), restaurants : DS.hasMany("restaurant", { async: true }), + addresses : DS.hasMany("address", { async: true }), user : DS.belongsTo("user", { async: true }), }); diff --git a/app/models/order.js b/app/models/order.js index 08500e7..72d1f0a 100644 --- a/app/models/order.js +++ b/app/models/order.js @@ -1,10 +1,11 @@ import DS from 'ember-data'; export default DS.Model.extend({ - timer : DS.attr('number'), - createdAt : DS.attr('date'), - items : DS.hasMany("order-item", { async: true }), - restaurant : DS.belongsTo("restaurant", { async: true }), - group : DS.belongsTo("group", { async: true }), - organizer : DS.belongsTo("user", { async: true }) + timer : DS.attr('number'), + createdAt : DS.attr('date'), + deliveryInfo : DS.attr('string'), + items : DS.hasMany("order-item", { async: true }), + restaurant : DS.belongsTo("restaurant", { async: true }), + group : DS.belongsTo("group", { async: true }), + organizer : DS.belongsTo("user", { async: true }) }); diff --git a/app/models/restaurant.js b/app/models/restaurant.js index b7d0b09..8c07641 100644 --- a/app/models/restaurant.js +++ b/app/models/restaurant.js @@ -7,6 +7,7 @@ export default DS.Model.extend({ website : DS.attr('string'), menuLink : DS.attr('string'), deliveryCharge : DS.attr('number'), + deliveryArea : DS.attr('string'), minimumOrder : DS.attr('number'), items : DS.hasMany("menu-item", { async: true }), group : DS.belongsTo("group", { async: true }), diff --git a/app/models/user.js b/app/models/user.js index e6bd1a7..959fdcf 100644 --- a/app/models/user.js +++ b/app/models/user.js @@ -1,10 +1,14 @@ import DS from 'ember-data'; export default DS.Model.extend({ - name : DS.attr('string'), - email : DS.attr('string'), - username : DS.attr('string'), - friends : DS.hasMany("user", { async: true }), - favItems : DS.hasMany("menu-item", { inverse: 'favUsers', async: true }), - groups : DS.hasMany("group", { inverse: 'members', async: true }) + name : DS.attr('string'), + email : DS.attr('string'), + username : DS.attr('string'), + phone : DS.attr('string'), + roles : DS.attr('string'), + friends : DS.hasMany("user", { async: true }), + favItems : DS.hasMany("menu-item", { inverse: 'favUsers', async: true }), + addresses : DS.hasMany("address", { async: true }), + orders : DS.hasMany("orders", { async: true }), + groups : DS.hasMany("group", { inverse: 'members', async: true }) }); diff --git a/app/router.js b/app/router.js index bb884d0..ccf04e7 100644 --- a/app/router.js +++ b/app/router.js @@ -24,6 +24,8 @@ Router.map(function() { this.route('group/timer', { path: 'group/:group_id/restaurant/:restaurant_id/timer' }); this.route('group/order', { path: 'group/:group_id/restaurant/:restaurant_id/order/:order_id' }); this.route('group/summary', { path: 'group/:group_id/restaurant/:restaurant_id/order/:order_id/summary' }); + this.route('setup'); + this.route('settings'); }); Router.reopen({ diff --git a/app/routes/application.js b/app/routes/application.js index 6d4bcfd..2a9647a 100644 --- a/app/routes/application.js +++ b/app/routes/application.js @@ -5,7 +5,7 @@ export default Ember.Route.extend(ApplicationRouteMixin, { init: function() { this._super(); if(this.get('session').isAuthenticated) { - var self = this, + var self = this, token = this.get('session').content.accessToken; window.FB.api('/me/', function(r) { self.controllerFor('user').login(r.email, token); }); } diff --git a/app/routes/group/restaurants.js b/app/routes/group/restaurants.js index d8d4b56..8a0dbe0 100644 --- a/app/routes/group/restaurants.js +++ b/app/routes/group/restaurants.js @@ -1,6 +1,7 @@ import Ember from 'ember'; +import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin'; -export default Ember.Route.extend({ +export default Ember.Route.extend(AuthenticatedRouteMixin, { model: function(params) { // var userID = this.get('session').content.userID; return this.store.find('group', params.id); diff --git a/app/routes/index.js b/app/routes/index.js index cc3c3ba..a70f067 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -1,7 +1,9 @@ import Ember from 'ember'; export default Ember.Route.extend({ - // redirect: function() { - // this.transitionTo('group'); - // } + redirect: function() { + if(this.get('session').isAuthenticated) { + this.transitionTo('group'); + } + } }); diff --git a/app/routes/settings.js b/app/routes/settings.js new file mode 100644 index 0000000..291de02 --- /dev/null +++ b/app/routes/settings.js @@ -0,0 +1,9 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model: function() { + var userID = this.get('session').content.userID; + return this.store.find('user', userID); + } +}); diff --git a/app/routes/setup.js b/app/routes/setup.js new file mode 100644 index 0000000..66ef1d6 --- /dev/null +++ b/app/routes/setup.js @@ -0,0 +1,14 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model: function() { + var userID = this.get('session').content.userID; + return this.store.find('user', userID); + }, + setupController: function (controller, model) { + // debugger; + this._super(controller, model); + this.controller.fakeInit(); + } +}); diff --git a/app/styles/app.scss b/app/styles/app.scss index 2f7adf6..56c2f5c 100644 --- a/app/styles/app.scss +++ b/app/styles/app.scss @@ -482,3 +482,7 @@ address > a { text-decoration: none; } } + +.user-logo { + max-width: 128px; +} diff --git a/app/templates/-header.hbs b/app/templates/-header.hbs index d5fcd92..c415572 100644 --- a/app/templates/-header.hbs +++ b/app/templates/-header.hbs @@ -25,7 +25,7 @@ {{/link-to}}
  • - {{#link-to '' classNames=''}} + {{#link-to 'settings' classNames=''}} Settings {{/link-to}}
  • diff --git a/app/templates/group.hbs b/app/templates/group.hbs index a6b1b84..4dab263 100644 --- a/app/templates/group.hbs +++ b/app/templates/group.hbs @@ -1,4 +1,10 @@
    + {{#if displaySuccessMsg}} + + {{/if}}

    Groups

    diff --git a/app/templates/group/timer.hbs b/app/templates/group/timer.hbs index dac0b00..c89fe2e 100644 --- a/app/templates/group/timer.hbs +++ b/app/templates/group/timer.hbs @@ -6,18 +6,38 @@
    {{#link-to '' group classNames='group-name capitalize'}} - {{#if content.group.picture }} {{ else }} {{/if}} -

    {{#if content.group.name }} {{ content.group.name }} {{ else }} Untitled {{/if}}

    + {{#if content.group.picture}} + + {{ else }} + + {{/if}} +

    + {{#if content.group.name}} + {{ content.group.name }} + {{ else }} + Untitled + {{/if}} +

    {{/link-to}} - +
    {{ fa-icon "long-arrow-right" classNames="" }}
    {{#link-to '' group classNames='restaurant-name capitalize'}} - {{#if content.picture }} {{ else }} {{/if}} -

    {{#if content.name }} {{ content.name }} {{ else }} Untitled {{/if}}

    + {{#if content.picture}} + + {{ else }} + + {{/if}} +

    + {{#if content.name}} + {{ content.name }} + {{ else }} + Untitled + {{/if}} +

    {{/link-to}}
    diff --git a/app/templates/settings.hbs b/app/templates/settings.hbs new file mode 100644 index 0000000..155d5e7 --- /dev/null +++ b/app/templates/settings.hbs @@ -0,0 +1,75 @@ +
    +
    +
    +
    +
    + + + +
    +
    +

    {{ content.name }}

    + +
    +
    +
    +
    + {{#if displayErrorMsg}} + + {{/if}} +
    + + {{ input name="name" value=content.name classNames='form-control' placeholder="Your name" required="" }} +
    +
    + + {{ input name="username" value=content.username classNames='form-control' placeholder="User name" required="" }} +
    +
    + + {{ input name="phone" value=content.phone classNames='form-control' placeholder="(123) - 555 5555" }} +
    +
    + +
    +
      + {{#each address in content.addresses }} +
    • + {{ fa-icon "trash"}} + {{ address.street }}, {{ address.city }}, {{ address.postcode }}, {{ address.country }} +
    • + {{/each}} +
    +
    +
    + +
    +
    + {{#if addAddress}} +
    +
    +
    + {{ input name="streetname" value=street classNames='form-control' placeholder="Main street" }} +
    +
    + {{ input name="city" value=city classNames='form-control' placeholder="City" }} +
    +
    + {{ input name="postcode" value=postcode classNames='form-control' placeholder="111 11" }} +
    +
    + {{ input name="country" value=country classNames='form-control' placeholder="Country" }} +
    + + + +
    + {{/if}} +
    + +
    +
    +
    +
    diff --git a/app/templates/setup.hbs b/app/templates/setup.hbs new file mode 100644 index 0000000..be3dc0b --- /dev/null +++ b/app/templates/setup.hbs @@ -0,0 +1,21 @@ +
    +
    +
    +

    Please complete your profile

    +
    + {{#if displayErrorMsg}} + + {{/if}} +
    + {{ input name="username" value=content.username classNames='form-control' placeholder="Please pick a username" required="" }} +
    +
    + {{ input name="phone" value=content.phone classNames='form-control' placeholder="Phone number" }} +
    + +
    +
    +
    +
    diff --git a/public/assets/images/default-group-picture.svg b/public/assets/images/default-group-picture.svg index 412165e..51551d3 100644 --- a/public/assets/images/default-group-picture.svg +++ b/public/assets/images/default-group-picture.svg @@ -25,7 +25,7 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.7" - inkscape:cx="-144.51862" + inkscape:cx="-395.94719" inkscape:cy="120.84209" inkscape:document-units="px" inkscape:current-layer="layer1" @@ -53,7 +53,7 @@ id="layer1" transform="translate(0,-802.36218)"> + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/tests/unit/controllers/group-test.js b/tests/unit/controllers/group-test.js new file mode 100644 index 0000000..fc4df83 --- /dev/null +++ b/tests/unit/controllers/group-test.js @@ -0,0 +1,15 @@ +import { + moduleFor, + test +} from 'ember-qunit'; + +moduleFor('controller:group', 'GroupController', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function() { + var controller = this.subject(); + ok(controller); +}); diff --git a/tests/unit/controllers/setup-test.js b/tests/unit/controllers/setup-test.js new file mode 100644 index 0000000..a2899a5 --- /dev/null +++ b/tests/unit/controllers/setup-test.js @@ -0,0 +1,15 @@ +import { + moduleFor, + test +} from 'ember-qunit'; + +moduleFor('controller:setup', 'SetupController', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function() { + var controller = this.subject(); + ok(controller); +}); diff --git a/tests/unit/routes/settings-test.js b/tests/unit/routes/settings-test.js new file mode 100644 index 0000000..da9dcfd --- /dev/null +++ b/tests/unit/routes/settings-test.js @@ -0,0 +1,14 @@ +import { + moduleFor, + test +} from 'ember-qunit'; + +moduleFor('route:settings', 'SettingsRoute', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function() { + var route = this.subject(); + ok(route); +}); diff --git a/tests/unit/routes/setup-test.js b/tests/unit/routes/setup-test.js new file mode 100644 index 0000000..f9cddea --- /dev/null +++ b/tests/unit/routes/setup-test.js @@ -0,0 +1,14 @@ +import { + moduleFor, + test +} from 'ember-qunit'; + +moduleFor('route:setup', 'SetupRoute', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function() { + var route = this.subject(); + ok(route); +});