UNPKG

toloframework

Version:

Javascript/HTML/CSS compiler for Firefox OS or nodewebkit apps using modules in the nodejs style.

114 lines (103 loc) 2.74 kB
/** * @module wdg.layout-stack * * @description * * * @example * var Layout = require('wdg.layout-stack'); * var layout = new Layout({ * value: "main", * content: { * main: ..., * page: ... * } * }); */ var $ = require( "dom" ); var DB = require( "tfw.data-binding" ); var Hash = require( "tfw.hash-watcher" ); var LayoutStack = function ( opts ) { var that = this; var elem = $.elem( this, 'div', 'wdg-layout-stack' ); var children = {}; var onHashChange = function ( args, hash ) { var rx = that.hash; if ( !rx ) return; var m = rx.exec( hash ); if ( !m ) return; if ( m.length < 2 ) return; that.value = m[ 1 ]; that.args = args; }; DB.propArray( this, 'args' ); DB.propString( this, 'value' )( function ( v ) { var key, val; for ( key in children ) { val = children[ key ]; if ( typeof val.element === 'function' ) { val = val.element(); } else if ( typeof val.element !== 'undefined' ) { val = val.element; } val = val.parentNode; if ( val ) { if ( key == v ) { $.addClass( val, 'fade-in' ); $.removeClass( val, 'fade-out' ); } else { $.addClass( val, 'fade-out' ); $.removeClass( val, 'fade-in' ); } } } } ); DB.propRegexp( this, 'hash' )( function () { Hash( onHashChange ); } ); DB.prop( this, 'content' )( function ( v ) { if ( Array.isArray( v ) ) { // Convert array into map. // Each item should have the `$key` property. // If not, an incremental ID will be provided. var obj = {}; var firstKey; v.forEach( function ( itm, idx ) { if ( typeof itm.$key === 'undefined' ) itm.$key = idx; obj[ itm.$key ] = itm; if ( typeof firstKey === 'undefined' ) firstKey = itm.$key; } ); v = obj; DB.set( that, 'value', firstKey ); } // Clearing current element to add children. $.clear( elem ); var key, val, container; for ( key in v ) { val = v[ key ]; if ( typeof val.element === 'function' ) { val = val.element(); } else if ( typeof val.element !== 'undefined' ) { val = val.element; } container = $.div( [ val ] ); if ( typeof val.$scroll !== 'undefined' ) { $.addClass( container, 'scroll' ); } $.add( elem, container ); } children = v; DB.fire( that, 'value' ); } ); DB.propAddClass( this, 'wide' ); DB.propRemoveClass( this, 'visible', 'hide' ); opts = DB.extend( { args: [], value: '', content: {}, hash: null, wide: false, visible: true }, opts, this ); }; module.exports = LayoutStack;