pushCard: function(type, mode, showMethod, args, placement) { var cardDef = this._cardDefs[type]; args = args || {}; if (!cardDef) { var cbArgs = Array.slice(arguments); this._pendingPush = [type, mode]; // Only eat clicks if the card will be visibly displayed. if (showMethod !== 'none') this.eatEventsUntilNextCard(); require(['cards/' + type], function() { this.pushCard.apply(this, cbArgs); }.bind(this)); return; } this._pendingPush = null; var modeDef = cardDef.modes[mode]; if (!modeDef) throw new Error('No such card mode: ' + mode); console.log('pushCard for type: ' + type); var domNode = args.cachedNode ? args.cachedNode : cardDef.templateNode.cloneNode(true); domNode.setAttribute('data-type', type); domNode.setAttribute('data-mode', mode); var cardImpl = new cardDef.constructor(domNode, mode, args); var cardInst = { domNode: domNode, cardDef: cardDef, modeDef: modeDef, cardImpl: cardImpl }; var cardIndex, insertBuddy; if (!placement) { cardIndex = this._cardStack.length; insertBuddy = null; domNode.classList.add(cardIndex === 0 ? 'before' : 'after'); } else if (placement === 'left') { cardIndex = this.activeCardIndex++; insertBuddy = this._cardsNode.children[cardIndex]; domNode.classList.add('before'); } else if (placement === 'right') { cardIndex = this.activeCardIndex + 1; if (cardIndex >= this._cardStack.length) insertBuddy = null; else insertBuddy = this._cardsNode.children[cardIndex]; domNode.classList.add('after'); } this._cardStack.splice(cardIndex, 0, cardInst); if (!args.cachedNode) { this._cardsNode.insertBefore(domNode, insertBuddy); } // If the card has any <button type="reset"> buttons, // make them clear the field they're next to and not the entire form. // See input_areas.js and shared/style/input_areas.css. hookupInputAreaResetButtons(domNode); if ('postInsert' in cardImpl) cardImpl.postInsert(); if (showMethod !== 'none') { // make sure the reflow sees the new node so that the animation // later is smooth. if (!args.cachedNode) domNode.clientWidth; this._showCard(cardIndex, showMethod, 'forward'); } if (args.onPushed) args.onPushed(cardImpl); },
pushCard: function(type, showMethod, args, placement) { var cardDef = this._cardDefs[type]; args = args || {}; if (!cardDef) { var cbArgs = Array.slice(arguments); this._pendingPush = [type]; // Only eat clicks if the card will be visibly displayed. if (showMethod !== 'none') { this.eatEventsUntilNextCard(); } require(['element!cards/' + type], function(Ctor) { this._cardDefs[type] = Ctor; this.pushCard.apply(this, cbArgs); }.bind(this)); return; } this._pendingPush = null; console.log('pushCard for type: ' + type); var domNode = args.cachedNode || new cardDef(); if (args && domNode.onArgs) { domNode.onArgs(args); } var cardIndex, insertBuddy; if (!placement) { cardIndex = this._cardStack.length; insertBuddy = null; domNode.classList.add(cardIndex === 0 ? 'before' : 'after'); } else if (placement === 'left') { cardIndex = this.activeCardIndex++; insertBuddy = this._cardsNode.children[cardIndex]; domNode.classList.add('before'); } else if (placement === 'right') { cardIndex = this.activeCardIndex + 1; if (cardIndex >= this._cardStack.length) { insertBuddy = null; } else { insertBuddy = this._cardsNode.children[cardIndex]; } domNode.classList.add('after'); } this._cardStack.splice(cardIndex, 0, domNode); if (!args.cachedNode) { this._cardsNode.insertBefore(domNode, insertBuddy); } // If the card has any <button type="reset"> buttons, // make them clear the field they're next to and not the entire form. // See input_areas.js and shared/style/input_areas.css. hookupInputAreaResetButtons(domNode); // Only do auto font size watching for cards that do not have more // complicated needs, like message_list, which modifies children contents // that are not caught by the font_size_util. if (!domNode.callHeaderFontSize) { // We're appending new elements to DOM so to make sure headers are // properly resized and centered, we emit a lazyload event. // This will be removed when the gaia-header web component lands. window.dispatchEvent(new CustomEvent('lazyload', { detail: domNode })); } if ('postInsert' in domNode) { domNode.postInsert(); } if (showMethod !== 'none') { // make sure the reflow sees the new node so that the animation // later is smooth. if (!args.cachedNode) { domNode.clientWidth; } this._showCard(cardIndex, showMethod, 'forward'); } if (args.onPushed) { args.onPushed(domNode); } },