Jdrewniak has uploaded a new change for review. https://gerrit.wikimedia.org/r/310892
Change subject: Preliminary refactor of solitaire UI code. Breaking apart a few functions and changing some variable names. No functional changes. ...................................................................... Preliminary refactor of solitaire UI code. Breaking apart a few functions and changing some variable names. No functional changes. Change-Id: I8cb55b60301ed1fe5177e3e717dadae8a2375e27 --- M public/js/discernadeck.js 1 file changed, 117 insertions(+), 82 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/wikimedia/discovery/discernatron refs/changes/92/310892/1 diff --git a/public/js/discernadeck.js b/public/js/discernadeck.js index fa01437..d3f081e 100644 --- a/public/js/discernadeck.js +++ b/public/js/discernadeck.js @@ -2,16 +2,6 @@ var stacks = document.querySelectorAll( '.drop-area' ); -/** - * State machine fun time - * stack has many cards - * card has stack || deck - * - * Card can move - * - * Stack can click - */ - var Stack = { domEl: Element, DROP_GAP: 25, @@ -23,9 +13,7 @@ addCard: function( card ){ this.cards.push( card ); }, - removeCard: function( card ) { - //( this.gap - this.DROP_GAP < 0 ) ? this.gap = 15 : this.gap -= this.DROP_GAP ; - this.cards.splice( this.cards.indexOf( card ), 1 ); + reorganizeCardsInStack: function() { var stack = this; var stackXY = this.getStackPos(); @@ -36,11 +24,16 @@ TweenLite.to( card.domEl, 0.8,{x: stackXY.x, y: stackXY.y - (stack.DROP_GAP * (reverseIndex -1 ) ), zIndex: stack.cards.length - reverseIndex, ease:Elastic.easeOut} ); card.setCardXY( stackXY.x, stackXY.y + stack.gap - (( reverseIndex - 1) * stack.DROP_GAP )); } + + }, + removeCard: function( card ) { + this.cards.splice( this.cards.indexOf( card ), 1 ); + this.reorganizeCardsInStack(); }, onTap: function ( stack ) { return function( ev ) { if ( stack.deck.currentCard ) { - stack.deck.currentCard.moveCardToStack( false, stack ); + stack.deck.currentCard.moveCardToStack( stack.deck, stack ); } else { stack.deck.revealCard(stack.deck)(); } @@ -59,6 +52,9 @@ var Card = { cardData: {id: '', title:'', snippet:''}, + id: '', + title: '', + snippet: '', domEl: Element, formEl: Element, hammerCard: {}, @@ -70,7 +66,7 @@ this.x = x; this.y = y; }, - isCollision: function ( dropAreaEl ) { + hasCollidedWith: function ( dropAreaEl ) { var a = this.domEl.getBoundingClientRect(); var b = dropAreaEl.getBoundingClientRect(); @@ -89,7 +85,7 @@ findDropCollision: function ( dropAreas ) { var droppedArea = false; for ( var i = 0; i < dropAreas.length; i++ ) { - droppedArea = this.isCollision( dropAreas[i] ); + droppedArea = this.hasCollidedWith( dropAreas[i] ); if (droppedArea) break; } return droppedArea; @@ -118,12 +114,28 @@ } }, moveCardToStack: function( oldStack, newStack ){ - this.deck.removeFromDeck( this ); + + if ( this.deck === oldStack || !oldStack) { + this.deck.removeFromDeck( this ); + } + + + if ( this.deck === newStack ) { + this.deck.addCardToDeck( this ); + } + + + if ( oldStack && this.deck !== oldStack ) { + this.stack.removeCard( this ); + } + newStack.addCard(this); + this.stack = newStack; - var droppedAreaXY = newStack.getStackPos(); - this.setCardXY( droppedAreaXY.x, droppedAreaXY.y ); - TweenLite.to( this.domEl, 0.2,{x: this.x, y: this.y, zIndex:this.stack.getCards().length - 1, ease:Power4.easeOut} ); + + var newStackXY = newStack.getStackPos(); + this.setCardXY( newStackXY.x, newStackXY.y ); + TweenLite.to( this.domEl, 0.2,{x: newStackXY.x, y: newStackXY.y, zIndex:newStack.getCards().length - 1, ease:Power4.easeOut} ); this.formEl.value = newStack.domEl.attributes.getNamedItem('data-score').value; }, onPanEnd: function( card ) { @@ -136,7 +148,6 @@ if ( droppedArea ) { card.moveCardToStack( card.stack, droppedArea.stack ); } else { - // jump back to deck if ( card.stack ) { card.stack.removeCard(); @@ -147,8 +158,8 @@ deck.moveCardToBottom(); } deck.currentCard = card; - deck.cardsInDeck.unshift(card.cardData); - card.formEl.value = ""; + deck.addCardToDeck( card ); + card.formEl.value = ""; } card.setCardXY( 0, 0 ); TweenLite.to( card.domEl, 0.8,{ x:"0", y:"0", ease:Elastic.easeOut } ); @@ -161,14 +172,15 @@ createCardDOM: function() { var i, b, el = document.createElement('div'), - snippetPieces = this.cardData.snippet.split('\uE000').map(function (s) { return s.split('\uE001') }), + snippetPieces = this.snippet.split('\uE000').map(function (s) { return s.split('\uE001') }); - a = document.createElement('a'), - p = document.createElement('p'); + + var a = document.createElement('a'); + var p = document.createElement('p'); a.setAttribute('target', '_blank'); - a.setAttribute('href', window.scoringData.baseWikiUrl + '/' + this.cardData.title); - a.appendChild(document.createTextNode(this.cardData.title)); + a.setAttribute('href', window.scoringData.baseWikiUrl + '/' + this.title); + a.appendChild(document.createTextNode(this.title)); /** * The snippet has markers that indicate which part should be bolded, @@ -184,7 +196,7 @@ p.appendChild(document.createTextNode(snippetPieces[i][0])); } } else { - b = document.createElement('b'); + b = document.createElement('strong'); b.appendChild(document.createTextNode(snippetPieces[i][0])); p.appendChild(b); if (snippetPieces[i][1].length > 0) { @@ -198,11 +210,13 @@ el.classList.add('card'); this.domEl = el; - document.querySelector( '.stack' ).appendChild( this.domEl ); + }, + renderCardIn: function( domEl ) { + domEl.appendChild( this.domEl ); }, initialize: function(){ this.createCardDOM(); - this.formEl = document.getElementById( 'result_' + this.cardData.id ); + this.formEl = document.getElementById( 'result_' + this.id ); var hammerCard = this.hammerCard = new Hammer( this.domEl ); hammerCard.get( 'pan' ).set( { direction: Hammer.DIRECTION_ALL } ); hammerCard.on( 'panstart', this.onPanStart( this ) ); @@ -215,32 +229,53 @@ var Deck = { domEl: Element, counterEl: Element, + flippedDomEl: Element, cardsInDeck: [], hammerDeck: Object, currentCard: false, - initializeDeck: function( onDone ) { - // maybe do some ajax stuff? + initializeDeck: function() { var deck = this; - window.setTimeout( function(){ + //deck.cardsInDeck = window.scoringData.results; - deck.cardsInDeck = window.scoringData.results; - deck.setCardCounter(); - deck.hammerDeck = new Hammer( deck.domEl ); - deck.hammerDeck.on( 'tap', deck.revealCard( deck ) ); - onDone && onDone(); - deck.revealCard(deck)(); - }, 500 ) + window.scoringData.results.forEach(function( cardObj, i) { + deck.addCardToDeck( cardObj ); + } ); + deck.hammerDeck = new Hammer( deck.domEl ); + deck.hammerDeck.on( 'tap', deck.revealCard( deck ) ); + //reveal the first card + + deck.revealCard(deck)(); + deck.setCardCounter(); + deck.assignExistingScores(); + }, + assignExistingScores: function() { + // assign already scored cards + var inputs = document.querySelectorAll( 'input.result-score' ), + stacksByScore = {}; + if (inputs.length === 0) { + return; + } + for ( var i = 0; i < stacks.length; i++) { + var stackEl = stacks[i]; + stacksByScore[stackEl.attributes.getNamedItem('data-score').value] = stackEl.stack; + } + for ( var i = inputs.length -1; i >= 0; i-- ) { + switch(inputs[i].value) { + case '0': + case '1': + case '2': + case '3': + var position = deck.findPosition(deck, parseInt( inputs[i].dataset.id ) ), + score = inputs[i].value; + var card = deck.cardsInDeck[position]; + card.renderCardIn( deck.flippedDomEl ); + card.moveCardToStack(this, stacksByScore[score]); + break; + } + } }, setCardCounter: function() { this.counterEl.innerHTML = this.cardsInDeck.length; - }, - createCard: function( deck, position ) { - var card = Object.create(Card, { - cardData: {writable: true, configurable: true, value: deck.cardsInDeck[position]}, - deck: {writable: true, configurable: true, value: deck} - }); - card.initialize(); - return card; }, findPosition: function( deck, id ) { for (var i = 0; i < deck.cardsInDeck.length; i++) { @@ -258,29 +293,54 @@ } if ( deck.cardsInDeck.length > 0 ) { - var card = deck.createCard(deck, 0); - deck.currentCard = card; + deck.cardsInDeck[0].renderCardIn( deck.flippedDomEl ); + deck.currentCard = deck.cardsInDeck[0]; } - if ( deck.cardsInDeck.length <= 1 ) { + if ( deck.cardsInDeck.length < 1 ) { deck.domEl.classList.add( 'empty' ); } } }, removeFromDeck: function( card ) { - var cardIndex = this.cardsInDeck.indexOf( card.cardData ); + var cardIndex = this.findPosition( this, card.id); if ( cardIndex >= 0 ) { - this.cardsInDeck.splice( this.cardsInDeck.indexOf( card.cardData ), 1 ); + this.cardsInDeck.splice( this.cardsInDeck.indexOf( card ), 1 ); this.currentCard = false; this.setCardCounter(); this.revealCard( this )(); } + + if ( this.cardsInDeck.length >= 0 ) { + this.currentCard = this.cardsInDeck[0]; + } + }, + addCardToDeck: function( cardData ) { + + if ( cardData.isPrototypeOf( Card ) ) { + this.cardsInDeck.push( cardData ); + this.currentCard = cardData; + } else { + var card = Object.create(Card, { + cardData: {writable: true, configurable: true, value: cardData }, + deck: {writable: true, configurable: true, value: deck}, + id : {writable: true, configurable: true, value: cardData.id}, + title: {writable: true, configurable: true, value: cardData.title}, + snippet: {writable: true, configurable: true, value: cardData.snippet} + }); + card.initialize(); + this.cardsInDeck.push( card ); + } + + this.setCardCounter(); }, moveCardToBottom: function(){ var cards = this.cardsInDeck; var currentCard = cards.shift(); this.cardsInDeck.push(currentCard); - this.currentCard.domEl.parentNode.removeChild( this.currentCard.domEl ); + if ( this.currentCard.domEl.parentNode ) { + this.currentCard.domEl.parentNode.removeChild( this.currentCard.domEl ); + } this.currentCard = false; } }; @@ -288,34 +348,8 @@ var deck = Object.create( Deck, { domEl: {writable: true, configurable: true, value: document.querySelector('.card-deck') }, counterEl: {writable: true, configurable: true, value: document.querySelector('.deck-counter') }, + flippedDomEl: {writable: true, configurable: true, value: document.querySelector('.card-deck').nextElementSibling } }); - -deck.initializeDeck( function () { - // assign already scored cards - var inputs = document.querySelectorAll( 'input.result-score' ), - stacksByScore = {}; - if (inputs.length === 0) { - return; - } - for ( var i = 0; i < stacks.length; i++) { - var stackEl = stacks[i]; - stacksByScore[stackEl.attributes.getNamedItem('data-score').value] = stackEl.stack; - } - for ( var i = 0; i < inputs.length; i++ ) { - switch(inputs[i].value) { - case '0': - case '1': - case '2': - case '3': - var position = deck.findPosition(deck, inputs[i].attributes.getNamedItem('data-id').value), - card = deck.createCard(deck, position), - score = inputs[i].value; - card.moveCardToStack(false, stacksByScore[score]); - break; - } - } -}); - for ( var i = 0; i < stacks.length; i++ ) { var stack = Object.create( Stack, { @@ -327,3 +361,4 @@ stacks[i].stack.initialize(); } +deck.initializeDeck(); -- To view, visit https://gerrit.wikimedia.org/r/310892 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I8cb55b60301ed1fe5177e3e717dadae8a2375e27 Gerrit-PatchSet: 1 Gerrit-Project: wikimedia/discovery/discernatron Gerrit-Branch: master Gerrit-Owner: Jdrewniak <jdrewn...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits