TopSearch_wev8.js 12.7 KB
define(['mUtil', "Component", "mService", "i18n"],function(mUtil, Component, mService, i18n) {
    var TopSearch = function(options) {
        var _tp = {}, paramStore = {}, $container, $pageHeader, $pageContent, $pageScroll, $comp, $compToFixed, $searchPage, $searchMask, pageid;
        Component.super(this, options);
        
        this.type = "TopSearch";
        this.css = this.type + "_css";
        this.tpl = this.type + "_html";

        var vm = this.viewModel = {
            actionType: 0,
            actionTarget: {},
            onSearch: function(){},
            conditions: [],
            standalone: true
        };
        
        this.beforeMount = function(){
            var navs = [];
            var size = vm.conditions.length;
            var bound = size > 4 ? 3 : size;
            for(var i = 0; i < bound; i++){
                var condition = vm.conditions[i];
                navs.push({
                    id: mUtil.UUID(),
                    text: condition.showname,
                    items: [condition]
                });
            }
            if(size > 4){
                navs.push({
                    id: mUtil.UUID(),
                    text: i18n.FILTER,//筛选
                    cls: "more",
                    items: vm.conditions.slice(3)
                });
            }
            vm.navs = navs;
        };
        
        this.mounted = function(){
            var promise = _tp.initConditions();
            var that = this;
            pageid = this.pageid;
            $container = that.$container;
            $pageHeader = $container.children(".page-header");
            $pageContent = $container.children(".page-content");
            $pageScroll = $pageContent.children(".page-scroller");
            $comp = this.$el.children(".wev-comp-" + vm.compType), 
            $compToFixed = $comp.find(".wev-topsearch-nav");
            var compToFixedSelector = "[data-container='NMEC_"+that.id+"']",
                $tab = $comp.closest(".wev-tab-panel"),
                isInTab = $tab.length == 1,
                scrollEv = "scroll.topsearch_" + that.id,
                fixCls = "fixer", openCls = "open", activeCls = "active";
            
            $searchPage = $(".wev-topsearch-page", $container);
            $searchMask = $(".wev-topsearch-mask", $container);
            if($searchPage.length == 0) {
                $searchPage = $('<div class="wev-topsearch-page out"></div>');
                $searchMask = $('<div class="wev-topsearch-mask out"></div>');
                $container.append($searchMask).append($searchPage);
            }
            
            if (!$pageHeader.length) {
                $pageHeader = $("<div class='page-header'></div>");
                $pageContent.before($pageHeader);
            }

            $pageHeader.children(compToFixedSelector).remove();
            _tp.resetPageTop();

            $pageContent.off(scrollEv).on(scrollEv, function(e){
                if(isInTab && $tab.css("display") === "none" 
                    || $pageHeader.css("visibility") === "hidden"
                    || !_tp.canScrollToFixed()){
                    return;
                }

                var offsetTop = $comp.offset().top;

                var cssTop = parseInt($pageContent.css("top")) + $container.offset().top;
                if(offsetTop <= cssTop && !$pageHeader.children(compToFixedSelector).length){
                    $comp.css("height", 'auto');
                    $pageHeader.find(".wev-topsearch-nav").hide();
                    $pageHeader.append($compToFixed.show());
                }else if(offsetTop > cssTop && !$comp.children(compToFixedSelector).length){
                    $comp.css("height", 'auto');
                    $comp.append($compToFixed.show());
                }
                _tp.resetPageTop();
                $compToFixed[offsetTop <= cssTop ? "addClass" : "removeClass"](fixCls);
            });
            var closeCallback = function(onSearch, navId, params){
                _tp.fixCompAndScrollTarget(false, true);
                $searchMask.removeClass("in").addClass("out");
                $searchPage.removeClass("in").addClass("out");
                var $openItem = $compToFixed.find(".wev-filter-item."+openCls), 
                    $allItem = $compToFixed.find(".wev-filter-item");
                $allItem.removeClass(openCls);
                if(onSearch){
                    $openItem[params.length ? "addClass" : "removeClass"](activeCls);
                    var selectName = "", nav = vm.navs.filter(function (ele) { return ele.id === navId})[0] || {}, conditions = nav.items || [];
                    if(conditions.length == 1){//选择框或下拉框显示所选项名称
                        var condition = conditions[0], selectItems = condition.data || [], param = params[0] || {};
                        if(selectItems.length && condition.htmltype == 5
                            && (condition.type == 1 || condition.type == 3)){
                            if(param.fieldvalue){
                                var selectedItem = selectItems.filter(function (item) { return param.fieldvalue == item.selectvalue; })[0] || {};
                                selectName = selectedItem.selectname || "";
                            }
                            $openItem.find("span").html(selectName || nav.text || "");
                        }
                    }
                }
            };
            var actionTarget = vm.actionTarget, 
                compoid = actionTarget.compoid, 
                sourceType = actionTarget.sourceType,
                useAdvanceSearch = sourceType == 1 || sourceType == 3;
            
            var openServicePage = function(preload, target, conditions, navId){
                promise.then(function(){
                    createPage({
                        preload: preload,
                        classAnimation: "show_hide_topsearch",
                        target: target,
                        conditions: conditions,
                        container: $container,
                        closeCallback : closeCallback,
                        onSearch: function(params){
                            paramStore[navId] = params;
                            closeCallback(true, navId, params);
                            params = Object.keys(paramStore).reduce(function (prev, next) {
                                return prev.concat(paramStore[next]);
                            }, []);
                            if(vm.actionType == 0){
                                var paramObj = {};
                                params.forEach(function (param) {
                                    paramObj[param.fieldname] = param.fieldvalue;
                                });
                                mUtil.eval(vm.onSearch, that.pageid, paramObj);
                            }else{
                                var onTargetLoaded = function(){
                                    _tp.fixCompAndScrollTarget(false, true);
                                };
                                if(useAdvanceSearch){
                                    Mobile_NS.refreshList(compoid, "_asArray=" + encodeURIComponent(JSON.stringify(params)), onTargetLoaded);
                                }else{
                                    var queryStr = params.reduce(function(prev, next){
                                        if(prev) prev += ';';
                                        return prev + next.fieldname + '=' + next.fieldvalue;
                                    }, '');
                                    Mobile_NS.refreshList(compoid, queryStr, onTargetLoaded);
                                }
                            }
                        }
                    });
                });
            };
            $compToFixed.on("click", ".wev-filter-item", function (e) {
                var $this = $(this), rowid = $this.data("rowid"), navData = [];
                if($this.hasClass(openCls)){
                    closeCallback();
                }else{
                    if(!$compToFixed.hasClass(fixCls) || !$pageHeader.find(compToFixedSelector).length){//固定到顶部
                        $compToFixed.addClass(fixCls);
                        _tp.fixCompAndScrollTarget(true, false);
                    }
                    $this.siblings(".wev-filter-item").removeClass(openCls);
                    $this.addClass(openCls);
                    vm.navs.every(function(nav) {
                        if(nav.id === rowid){
                            navData = nav.items;
                            return false;
                        }
                        return true;
                    });
                    openServicePage(false, $compToFixed, navData, rowid);
                }
            });
            $pageHeader.on("click","abbr",function () {
                var openNav = $compToFixed.find(".wev-filter-item."+openCls);
                if (openNav.length > 0){
                    closeCallback();
                }
            });
        };

        _tp.resetPageTop = function(){
            $pageContent.css("top", $pageHeader.height() + "px");
        };

        _tp.canScrollToFixed = function(){
            var pageScrollHeight = $pageContent[0].scrollHeight + $pageScroll.offset().top - $comp.height(),
                canScrollToFixHeight = $pageContent.height() + $comp.offset().top + $comp.height() + 1;
            return pageScrollHeight > canScrollToFixHeight;
        };
        
        _tp.fixCompAndScrollTarget = function(manualFixed, onSearch){
            var $targetComp = $("#NMEC_" + vm.actionTarget.compoid);
            if(_tp.canScrollToFixed()){
                setTimeout(function(){
                    var scrollTargetTop = $targetComp.offset().top + $pageContent.scrollTop() - $compToFixed.height();
                    if(manualFixed){
                        scrollTargetTop -= $pageHeader.height();
                    }else{
                        scrollTargetTop -= $compToFixed.offset().top;
                    }
                    $pageContent.scrollTop(scrollTargetTop);
                    scrollTargetTop == 0 && $pageContent.trigger("scroll");
                }, 10);
            }else{
                $pageHeader.find(".wev-topsearch-nav")[!onSearch ? "hide" : "show"]();
                if(!onSearch){
                    $pageHeader.append($compToFixed.show());
                }else if(onSearch){
                    $comp.append($compToFixed.show());
                }
                _tp.resetPageTop();
            }
        };
        
        _tp.initConditions = function(){
            var that = this, sourceType = vm.actionTarget.sourceType, deferred = $.Deferred();
            var needParseField = sourceType == 1;
            !needParseField && vm.conditions.every(function(condition) {
                if(condition.fieldTypeFace == 'select' && condition.sourceType == 2){
                    needParseField = true;
                    return false;
                }
                return true;
            });
            delete vm.conditions;
            if(!needParseField){
                deferred.resolve();
                return deferred;
            }
            var actionUrl = mUtil.getActionUrl(that.type, {
                action: "getFieldData",
                mec_id: that.id
            }, that.pageid);
            mUtil.getJSON(actionUrl, function (result) {
                var resultData = result.data;
                vm.navs.forEach(function(nav, index) {
                    nav.items.forEach(function(item, i) {
                        if(sourceType == 1 && resultData[item.id]){
                            $.extend(nav.items[i], resultData[item.id]);
                        }else if(item.htmltype == 5 && item.sourceType == 2){
                            item.data = resultData[item.id] || [];
                        }
                    });
                });
                deferred.resolve();
            }, function(errMsg){
                deferred.resolve();
            });
            return deferred;
        };
        function createPage(cfg) {
            $pageHeader.css("z-index", "9");
            $searchMask.removeClass("out").addClass("in");
            $searchPage.removeClass("out").addClass("animation in").empty();

            mService.load('topsearch', function (html, service) {
                $searchPage.html(mUtil.replaceI18n(html));
                $searchPage.on("webkitAnimationEnd animationend", function () {
                    $pageHeader.css("z-index", "");
                    $searchPage.removeClass("animation");
                });
                service.mounted($searchPage, $searchMask, cfg);
            });
        }
        _tp.initConditions = _tp.initConditions.bind(this);
    };

    return Component.init(TopSearch);
});