diff --git a/.editorconfig b/.editorconfig index 5d5dea4..2fe4874 100644 --- a/.editorconfig +++ b/.editorconfig @@ -29,5 +29,5 @@ indent_size = 2 indent_style = space indent_size = 2 -[*.md] +[*.{diff,md}] trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore index 5913261..6914ebe 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,4 @@ /libpeerconnection.log npm-debug.log testem.log -.idea/ +.idea diff --git a/.jshintrc b/.jshintrc index 4c93b43..08096ef 100644 --- a/.jshintrc +++ b/.jshintrc @@ -2,11 +2,10 @@ "predef": [ "document", "window", - "-Promise", - "Bootstrap" + "-Promise" ], - "browser" : true, - "boss" : true, + "browser": true, + "boss": true, "curly": true, "debug": false, "devel": true, diff --git a/.travis.yml b/.travis.yml index df6253d..53ccf13 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,3 @@ ---- language: node_js sudo: false @@ -7,6 +6,10 @@ cache: directories: - node_modules +before_install: + - "npm config set spin false" + - "npm install -g npm@^2" + install: - npm install -g bower - npm install @@ -14,3 +17,14 @@ install: script: - npm test + +node_js: + - "0.10" + +deploy: + provider: heroku + api_key: + secure: Bt7t26dMCqf7yXZPWZd/e6hz6N9Fxg83A34lC7sNTaLvIKnM+g54MHjOlIpnZ9LmN3S7/icg/X+twk2ebWPlc7THUWAaBkU5YjXpyNf9UhG30UG7Ihjgcbhn/Qh/Px8NQX5OFIUHTVoLdJGOj68/Czv+jHwpmFQHDoB1xCY2paE= + app: webatrice + on: + repo: thomasjmwb/bbbbbbbbbbbbbbb diff --git a/Brocfile.js b/Brocfile.js index 13d9b94..d2fdb10 100644 --- a/Brocfile.js +++ b/Brocfile.js @@ -3,14 +3,6 @@ var EmberApp = require('ember-cli/lib/broccoli/ember-app'); var app = new EmberApp({ - 'ember-cli-bootstrap': { - 'importBootstrapCSS': false - }, - vendorFiles: { - 'handlebars.js': { - production: 'bower_components/handlebars/handlebars.js' - } - } }); // Use `app.import` to add additional libraries to the generated diff --git a/README.md b/README.md index 2d39399..9c0b588 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,17 @@ This README outlines the details of collaborating on this Ember application. -A short introduction of this app could easily go here. +Webatrice is a web application aspiring to be part of the desktop application called Cockatrice. To read more about Cockatrice, go to https://github.com/Cockatrice/Cockatrice. ## Prerequisites You will need the following things properly installed on your computer. * [Git](http://git-scm.com/) +* [Node.js](http://nodejs.org/) (with NPM) +* [Bower](http://bower.io/) +* [Ember CLI](http://www.ember-cli.com/) +* [PhantomJS](http://phantomjs.org/) * [Node.js](http://nodejs.org/) (with NPM) and [Bower](http://bower.io/) ## Installation @@ -21,7 +25,7 @@ You will need the following things properly installed on your computer. ## Running / Development * `ember server` -* Visit your app at http://localhost:4200. +* Visit your app at [http://localhost:4200](http://localhost:4200). ### Code Generators @@ -34,6 +38,8 @@ Make use of the many generators for code, try `ember help generate` for more det ### Building +[](https://travis-ci.org/thomasjmwb/bbbbbbbbbbbbbbb) + * `ember build` (development) * `ember build --environment production` (production) @@ -43,8 +49,8 @@ Specify what it takes to deploy your app. ## Further Reading / Useful Links -* ember: http://emberjs.com/ -* ember-cli: http://www.ember-cli.com/ +* [ember.js](http://emberjs.com/) +* [ember-cli](http://www.ember-cli.com/) * Development Browser Extensions * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi) * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/) diff --git a/app/components/x-card-deck.js b/app/components/x-card-deck.js new file mode 100644 index 0000000..8a91c4e --- /dev/null +++ b/app/components/x-card-deck.js @@ -0,0 +1,98 @@ +import Ember from 'ember'; + +var basicLands = ['Plains', 'Island', 'Swamp', 'Mountain', 'Forest', 'Snow-Covered Plains', + 'Snow-Covered Island', 'Snow-Covered Swamp', 'Snow-Covered Mountain', 'Snow-Covered Forest']; + +export default Ember.Component.extend({ + classNames: ['row'], + + /** @property {Boolean} - can this card be added to the main deck being built */ + canAddToDeck: function () { + var cardsInDeck = this.get('deck.cards'), + cardsInSideboard = this.get('deck.sideboard'), + currentCardName = this.get('card.name'); + + if (basicLands.contains(currentCardName)) { + return true; + } + + return cardsInDeck.filterBy('name', currentCardName).length + + cardsInSideboard.filterBy('name', currentCardName).length < 4; + }.property('deck.cards.@each', 'deck.sideboard.@each', 'card'), + + /** @property {Boolean} - is this card not allowed to go in the main deck */ + cannotAddToDeck: Ember.computed.not('canAddToDeck'), + + /** @property {Boolean} - can this card be removed from the main deck */ + canRemoveFromMainDeck: function () { + var currentCardName = this.get('card.name'); + + return this.get('deck.cards').filterBy('name', currentCardName).length; + }.property('deck.cards.@each', 'deck'), + + /** @property {Boolean} - is this card allowed to be removed from the main deck */ + cannotRemoveFromMainDeck: Ember.computed.not('canRemoveFromMainDeck'), + + /** @property {Boolean} - can this card be removed from the side deck */ + canRemoveFromSideDeck: function () { + var currentCardName = this.get('card.name'); + + return this.get('deck.sideboard').filterBy('name', currentCardName).length; + }.property('deck.sideboard.@each'), + + /** @property {Boolean} - can this card be removed from the side deck */ + cannotRemoveFromSideDeck: Ember.computed.not('canRemoveFromSideDeck'), + + /** @propert {Boolean} - can this card be removed from any deck */ + cannotRemoveFromAnyDeck: Ember.computed.and('cannotRemoveFromMainDeck', 'cannotRemoveFromSideDeck'), + + actions: { + addToMain: function (card) { + this.get('deck.cards').pushObject(card); + }, + + addToSide: function (card) { + this.get('deck.sideboard').pushObject(card); + }, + + removeAllFromMain: function (card) { + this.get('deck.cards').removeObject(card); + }, + + removeOneFromMain: function (card) { + var cards = this.get('deck.cards'), + cardName = card.get('name'), + i = 0, + index; + + cards.forEach(function (c) { + if (c.get('name') === cardName) { + index = i; + } + i++; + }); + + cards.removeAt(index); + }, + + removeAllFromSide: function (card) { + this.get('deck.sideboard').removeObject(card); + }, + + removeOneFromSide: function (card) { + var cards = this.get('deck.sideboard'), + cardName = card.get('name'), + i = 0, + index; + + cards.forEach(function (c) { + if (c.get('name') === cardName) { + index = i; + } + i++; + }); + + cards.removeAt(index); + } + } +}); diff --git a/app/components/x-modal.js b/app/components/x-modal.js new file mode 100644 index 0000000..b0ea5a5 --- /dev/null +++ b/app/components/x-modal.js @@ -0,0 +1,9 @@ +import Ember from 'ember'; + +export default Ember.Component.extend({ + actions: { + close: function () { + return this.sendAction(); + } + } +}); diff --git a/app/controllers/card.js b/app/controllers/card.js deleted file mode 100644 index 67ef702..0000000 --- a/app/controllers/card.js +++ /dev/null @@ -1,47 +0,0 @@ -import Ember from 'ember'; - -var basicLands = ['Plains', 'Island', 'Swamp', 'Mountain', 'Forest', 'Snow-Covered Plains', - 'Snow-Covered Island', 'Snow-Covered Swamp', 'Snow-Covered Mountain', 'Snow-Covered Forest']; -export default Ember.ObjectController.extend({ - needs: ['deck'], - - /** @property {Boolean} - can this card be added to the main deck being built */ - canAddToDeck: function () { - var cardsInDeck = this.get('controllers.deck.cards'), - cardsInSideboard = this.get('controllers.deck.sideboard'), - currentCardName = this.get('model.name'); - - if (basicLands.contains(currentCardName)) { - return true; - } - - return cardsInDeck.filterBy('name', currentCardName).length + - cardsInSideboard.filterBy('name', currentCardName).length < 4; - }.property('controllers.deck.cards.@each', 'controllers.deck.sideboard.@each', 'model'), - - /** @property {Boolean} - is this card not allowed to go in the main deck */ - cannotAddToDeck: Ember.computed.not('canAddToDeck'), - - /** @property {Boolean} - can this card be removed from the main deck */ - canRemoveFromMainDeck: function () { - var currentCardName = this.get('model.name'); - - return this.get('controllers.deck.cards').filterBy('name', currentCardName).length; - }.property('controllers.deck.cards.@each', 'model'), - - /** @property {Boolean} - is this card allowed to be removed from the main deck */ - cannotRemoveFromMainDeck: Ember.computed.not('canRemoveFromMainDeck'), - - /** @property {Boolean} - can this card be removed from the side deck */ - canRemoveFromSideDeck: function () { - var currentCardName = this.get('model.name'); - - return this.get('controllers.deck.sideboard').filterBy('name', currentCardName).length; - }.property('controllers.deck.sideboard.@each'), - - /** @property {Boolean} - can this card be removed from the side deck */ - cannotRemoveFromSideDeck: Ember.computed.not('canRemoveFromSideDeck'), - - /** @propert {Boolean} - can this card be removed from any deck */ - cannotRemoveFromAnyDeck: Ember.computed.and('cannotRemoveFromMainDeck', 'cannotRemoveFromSideDeck') -}); \ No newline at end of file diff --git a/app/controllers/cards.js b/app/controllers/cards.js index 0129127..23096ad 100644 --- a/app/controllers/cards.js +++ b/app/controllers/cards.js @@ -7,9 +7,9 @@ export default Ember.ArrayController.extend(filterableMixin, { { label: 'Card Types', propertyName: 'mainType', - values: ['Creature', 'Enchantment', 'Land', 'Instant', 'Sorcery'], - possibleValues: ['Creature', 'Enchantment', 'Land', 'Instant', 'Sorcery'], - valuesDisplay: ['Creature', 'Enchantment', 'Land', 'Instant', 'Sorcery'], + values: ['Creature', 'Enchantment', 'Land', 'Instant', 'Sorcery', 'Artifact'], + possibleValues: ['Creature', 'Enchantment', 'Land', 'Instant', 'Sorcery', 'Artifact'], + valuesDisplay: ['Creature', 'Enchantment', 'Land', 'Instant', 'Sorcery', 'Artifact'], and: false }, { @@ -19,6 +19,14 @@ export default Ember.ArrayController.extend(filterableMixin, { possibleValues: [ 'Black', 'Blue', 'Green', 'Red', 'White'], valuesDisplay: [ 'Black', 'Blue', 'Green', 'Red', 'White'], and: false + }, + { + label: 'Legalities', + propertyName: 'legal', + values: [ 'isStandard', 'isModern', 'isLegacy', 'isVintage'], + possibleValues: [ 'isStandard', 'isModern', 'isLegacy', 'isVintage'], + valuesDisplay: [ 'Standard', 'Modern', 'Legacy', 'Vintage'], + and: false } // { // label: 'Format', @@ -40,6 +48,22 @@ export default Ember.ArrayController.extend(filterableMixin, { // } ], displayCards: function () { - return this.get('arrangedContent').slice(0, 100); - }.property('arrangedContent') + return this.get('searchedContent').slice(0, 100); + }.property('searchedContent'), + + searchedContent: function () { + var searchTerm = this.get('searchTerm'), + arrangedContent = this.get('arrangedContent'); + + if (!searchTerm) { + return arrangedContent; + } + + return arrangedContent.filter(function (c) { + return c.name.toLowerCase().indexOf(searchTerm.toLowerCase()) > -1; + }); + }.property('arrangedContent', 'searchTerm'), + + /** @property {String} the current search term */ + searchTerm: '' }); diff --git a/app/controllers/deck/build.js b/app/controllers/deck/build.js index 4ed2130..e003a6d 100644 --- a/app/controllers/deck/build.js +++ b/app/controllers/deck/build.js @@ -7,6 +7,10 @@ export default Ember.ObjectController.extend({ doNotShowTypes: [], + displayCards: Ember.computed.alias('controllers.cards.displayCards'), + + searchTerm: Ember.computed.alias('controllers.cards.searchTerm'), + canShowMainDeck: function () { return !this.get('doNotShowTypes').contains('mainDeck'); }.property('doNotShowTypes.@each'), @@ -34,4 +38,4 @@ export default Ember.ObjectController.extend({ } } } -}); \ No newline at end of file +}); diff --git a/app/controllers/deck/export-modal.js b/app/controllers/deck/export-modal.js new file mode 100644 index 0000000..dc05980 --- /dev/null +++ b/app/controllers/deck/export-modal.js @@ -0,0 +1,9 @@ +import Ember from 'ember'; + +export default Ember.ObjectController.extend({ + actions: { + close: function() { + return this.send('closeModal'); + } + } +}); diff --git a/app/controllers/decks.js b/app/controllers/decks.js index 3a50def..602325d 100644 --- a/app/controllers/decks.js +++ b/app/controllers/decks.js @@ -1,8 +1,5 @@ import Ember from 'ember'; export default Ember.ArrayController.extend({ - importModalButtons: [ - Ember.Object.create({title: 'Import', clicked: 'importDeck'}), - Ember.Object.create({title: 'Cancel', dismiss: 'modal'}) - ] -}); \ No newline at end of file + +}); diff --git a/app/controllers/decks/import-deck.js b/app/controllers/decks/import-deck.js new file mode 100644 index 0000000..65b637d --- /dev/null +++ b/app/controllers/decks/import-deck.js @@ -0,0 +1,20 @@ +import Ember from 'ember'; +import Deck from 'webatrice/models/deck'; + +export default Ember.ObjectController.extend({ + needs: ['cards'], + + actions: { + close: function() { + return this.send('closeModal'); + }, + + importDeck: function () { + var cards = this.get('controllers.cards.model'), + deck = Deck.createDeck(this.get('importContents'), cards); + + this.send('closeModal'); + this.transitionToRoute('deck.build', deck); + } + } +}); diff --git a/app/controllers/sets.js b/app/controllers/sets.js index e4e0bd0..3c9ae74 100644 --- a/app/controllers/sets.js +++ b/app/controllers/sets.js @@ -1,22 +1,17 @@ import Ember from 'ember'; export default Ember.ArrayController.extend({ - cards: function () { - var sets = this.get('model'), - cards = []; - sets.forEach(function (set) { - set.cards.forEach(function (card) { - cards.push({ - name: card.name, - mana: card.manaCost, - set: set.name, - type: card.type, - pt: card.power + '/' + card.toughness - }); - }); + standardSets: function () { + var sets = this.get('model'), + standardSetNames = this.get('standardSetNames'); + return sets.filter(function (s) { + return standardSetNames.contains(s.name); }); + }.property('model', 'standardSetNames'), - return cards; - }.property('model') + /** @property {Array[String]} is the allowed set names currently for standard */ + standardSetNames: function () { + return ['Theros', 'Born of the Gods', 'Journey into Nyx', 'Magic 2015 Core Set', 'Khans of Takir']; + }.property('standardSets') }); diff --git a/app/helpers/pluralize-string.js b/app/helpers/pluralize-string.js new file mode 100644 index 0000000..05da11b --- /dev/null +++ b/app/helpers/pluralize-string.js @@ -0,0 +1,5 @@ +import Ember from 'ember'; + +export default Ember.Handlebars.makeBoundHelper(function(value) { + return value.pluralize(); +}); \ No newline at end of file diff --git a/app/index.html b/app/index.html index f294f0c..ce07a83 100644 --- a/app/index.html +++ b/app/index.html @@ -11,11 +11,15 @@ + + {{content-for 'head-footer'}}
{{content-for 'body'}} + + {{content-for 'body-footer'}}