appSkin.js 6.47 KB
define('appSkin', ['modal', 'components/common'], function (modal, common) {
    var constants = SystemEnv.getHtmlNoteName;
    var template = "\
        <div class='skins'>\
            <div class='search'>\
                <input type='text' placeholder='Search...' />\
                <a href='javascript:;' class='clean-icon'><i class='iconfont icon-del fa-normal-1x'></i></a>\
                <a href='javascript:;' class='search-icon'><i class='iconfont icon-search fa-normal-2x'></i></a>\
            </div>\
            <ul class='skin-list'></ul>\
        </div>";

    var skinTmeplate = "\
<li class='skin {{inuse == 0 ? \'\' : \'selected\'}}' data-id='{{id}}'>\
    <img src='{{previewImg || \'/mobilemode/images/e9/default-pic.png\'}}'>\
    <p title={{replaceMutilLanguage(name,_userLanguage)}}>{{ replaceMutilLanguage(name,_userLanguage)}}</p>\
    <span>" + constants(4708) /* 当前使用 */ + "</span>\
</li>";

    var skinsCssText = "\
        .skins { background: #eee; padding: 5px; width: 100%; height: 100%; box-sizing: border-box;}\
        .skins .search {text-align:right;margin:10px 0;padding-right:37px;}\
        .skins .search input {width:170px}\
        .skins .search .clean-icon{top:5px;right: 61px;}\
        .skins .search a{right: 44px;}\
        .skins .skins-nothing{text-align:center;color:#999;padding-top:170px}\
        .skins .icon-file-search{font-size:100px;}\
        .skins .skins-nothing p{font-size:30px;}\
        .skins ul { height: calc(100% - 50px); margin: 0; overflow-y: auto; }\
        .skins ul li { position: relative; width: calc(25% - 25px); height: 55%; margin: 0 10px 20px 10px; background: #f5f5f5; box-shadow: 0 1px 4px rgba(0,0,0,0.1); border: 1px solid #efefef; outline: 1px solid transparent; box-sizing: content-box; display: inline-block; padding-bottom: 5px;vertical-align: top;}\
        .skins ul li.selected { border: 1px solid #2690e3; outline: 1px solid #2690e3; }\
        .skins ul li.selected:after { content: ' '; border-bottom: 55px solid transparent; border-right: 55px solid #2690e3; position: absolute; right: 0; top: 0;  }\
        .skins ul li img { width: 100%; height: calc(100% - 1.5em);overflow:hidden;}\
        .skins ul li img.default { padding: 0 20px; height: auto; padding-top: 50%;}\
        .skins ul li p { position:absolute; bottom: 3px; color: #666;width: 100%; padding: 0 1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap; }\
        .skins ul li span { font-size: 12px; position: absolute; right: -4px; top: 15px; color: #fff; transform: rotate(46deg); -ms-transform: rotate(46deg); z-index: 1; display: none; }\
        .skins ul li.selected span { display: block; }";

    common.importCssText("skins", skinsCssText, document);

    return {
        index: -1,
        skinListTemp: "",
        result: null,
        searchText: "",
        skinMapping: {}, // 缓存appid : skinId
        afterSave: function() {},
        show: function(appid, afterSave) {
            var vm = this, $container;

            appid = parseInt(appid);
            afterSave && (vm.afterSave = afterSave);
            vm.index = modal.open({
                area: ['800px', '600px'],
                content: template,
                yes: function(index, layero) {
                    var selectedId = layero.find(".selected").data("id");
                    
                    vm.saveSkin(appid, selectedId);
                    modal.close(index);
                },
                title: constants(4718) //皮肤
            }, function($modal, index) {
                $container = $modal;
                vm.initEvent($modal, appid);
                vm.index = index;
            });

            vm.initSkinList(appid, $container);
        },
        initEvent: function($modal, appid) {
            var vm = this;
            
            $modal.find(".search").on("input", "input", function () {//皮肤搜索
                var $input = $(this),
                    $clean = $input.siblings(".clean-icon");
                var value = $input.val();

                $clean.toggleClass("visible", !!value);
                vm.searchText = value;
                vm.renderSkin(vm.filter(),$modal);
            }).on("click", ".clean-icon", function () {
                var $clean = $(this);
                var $input = $clean.siblings("input");

                $clean.removeClass("visible");
                $input.val("").focus();
                vm.searchText = "";
                vm.renderSkin(vm.filter(),$modal);
            });
            $modal.find('.skins')
                .on("click.selected", "li", function() { // 初始化皮肤选中事件
                    $(this).toggleClass('selected').siblings().removeClass('selected');
                });
        },
        initSkinList: function(appid, $container) {
            var that = this;

            common.api("skin", {
                action: 'list',
                type: "get",
                data: { 
                    appid: appid, 
                    isChoose: true,
                }
            }, function(res) {
                that.result = res.data;
                if(res.data.length){
                    that.renderSkin(res.data, $container);
                }else{
                    $container.find('.skins')
                        .html('<div class="skins-nothing"><i class="iconfont icon-file-search"></i>\
                            <p>'+constants(6009)+'</p></div>');
                }
            });
        },
        filter: function () {
            if (!this.result) return;

            var searchText = this.searchText;
            return this.result.filter(function (v) {
                return !!~v.name.toLowerCase().indexOf(searchText.trim().toLowerCase())
            });
        },
        renderSkin: function(data, $container){
            var skinListTemp = common.tempEngine(skinTmeplate, data);

            $container.find('.skin-list').html($(skinListTemp));
        },
        saveSkin: function(appid, selectedId) {
            var vm = this;
                
            if(vm.skinMapping.hasOwnProperty(appid) && vm.skinMapping[appid] == selectedId) return;

            common.api("app", {
                action: "setSkin",
                data: {
                    appid: appid,
                    skinid: selectedId
                },
            }, function() {
                var url = selectedId ? "/mobilemode/skin/"+ selectedId +"/_.css" : "";
                vm.skinMapping[appid] = selectedId;
                vm.afterSave(url);
            });
        }
    };
});