/* 型号过滤器部分 包括两个部分,一个是下拉菜单,另一个是显示的列表 */ (function() { define(['restful', 'utils', 'async', 'i18n'], function(_restful, _utils, _async, _i18n) { var ModelFilter; return ModelFilter = (function() { function ModelFilter(_at_product_id, $container) { this.product_id = _at_product_id != null ? _at_product_id : 0; this.data = null; this.product = null; this.group = []; this.shownFilter = null; this.initElements($container); this.groupChecked = {}; this.dimension = {}; } ModelFilter.prototype.cancelFilter = function($row) { var rowIndex; rowIndex = parseInt($row.attr('data-row-index')); delete this.groupChecked[rowIndex]; return $row.trigger('filter:group:change', { selected: [], rowIndex: rowIndex }); }; ModelFilter.prototype.filterOnChange = function($row) { var isChanged, list, rowIndex; rowIndex = parseInt($row.attr('data-row-index')); isChanged = $row.attr('data-changed') === 'true'; if (!isChanged) { return; } $row.removeAttr('data-changed'); list = []; $row.find('input:checked').each(function() { var $this, fieldIndex, group_id; $this = $(this); fieldIndex = parseInt($this.attr('data-field-index')); group_id = parseInt($this.attr('data-group-id')); return list.push({ fieldIndex: fieldIndex, group_id: group_id, rowIndex: rowIndex, type: $this.attr('data-type'), text: $this.attr('data-text'), value: $this.val() }); }); this.groupChecked[rowIndex] = list; $row.trigger('filter:group:change', { selected: list, rowIndex: rowIndex }); if (this.shownFilter) { return this.shownFilter.hide(); } }; ModelFilter.prototype.hideStandFilter = function() { this.elements.stand.hide(); return this.elements.control.hide(); }; ModelFilter.prototype.setDimensionText = function() { var $el, text, unit; $el = this.elements.dimension; if (this.dimension.indexes.length) { $el.show(); } else { $el.hide(); } unit = this.dimension.customUnit || this.dimension.unit; text = _i18n.product["dimension_" + (unit === 'mm' ? 'inch' : 'mm')]; return $el.text(text); }; ModelFilter.prototype.initFilterEvent = function() { var els, self; els = this.elements; self = this; els.stand.bind('click', function(e) { var $parent, $target, field; $target = $(e.target); $parent = $target.closest('div'); if ($target.is('a')) { field = $target.attr('data-field'); if (field === 'filter') { return self.filterOnChange($parent); } if (field === 'cancel') { return self.cancelFilter($parent); } } if (!$target.is('input')) { return; } return $parent.attr('data-changed', true); }); return els.popMenu.bind('click', function(e) { var $parent, $target; $target = $(e.target); if (!$target.is('input')) { return; } $parent = $target.closest('div'); return self.filterOnChange($parent); }); }; ModelFilter.prototype.initElements = function($o) { var els, self; self = this; els = this.elements = { container: $o, popMenu: $("
"), stand: $(''), control: $("") }; els.dimension = els.control.find('li.dimension a'); els.dimension.bind('click', function() { var originalUnit, unit; originalUnit = self.dimension.customUnit || self.dimension.unit; unit = originalUnit === 'mm' ? 'inch' : 'mm'; _utils.setCookie('dimension', unit); return els.container.trigger('product:dimension:changed'); }); els.control.find('li.collapse a').bind('click', function() { var text; els.stand.toggle(); text = els.stand.is(':visible') ? _i18n.product.hideFilter : _i18n.product.showFilter; return $(this).html(text); }); $o.append(els.popMenu).append(els.stand).append(els.control); return this.initFilterEvent(); }; ModelFilter.prototype.popFilter = function($event, index) { var available, flag, offset, shownFilter; if (this.shownFilter) { this.shownFilter.fadeOut('fast'); } shownFilter = this.shownFilter = this.findFilter(index); available = parseInt(shownFilter.attr('data-available')); if (available === 0) { return; } offset = $event.offset(); this.shownFilter.fadeIn('fast').css({ top: offset.top + $event.height() + 7, left: offset.left }); flag = false; this.shownFilter.one('mouseenter', function() { return flag = true; }); return setTimeout(function() { if (!flag) { return shownFilter.fadeOut(); } }, 3000); }; ModelFilter.prototype.findFilter = function(index) { return $("#header-filter-" + index); }; ModelFilter.prototype.isChecked = function(rowIndex, group_id, value) { var data, result; data = this.groupChecked[rowIndex] || []; result = _.find(data, function(current) { return current.group_id == group_id && current.value == value; }); return !!result; }; ModelFilter.prototype.loadGroup = function(fieldIndex, cb) { var api, self; self = this; api = "product/" + this.product_id + "/model/group/" + fieldIndex + "?"; api += $.param(this.condition); return _restful.get(api, function(result) { var data, item, _i, _len; data = []; for (_i = 0, _len = result.length; _i < _len; _i++) { item = result[_i]; data.push({ text: item.name, value: item.name, fieldIndex: fieldIndex, type: 'group', checked: self.isChecked(fieldIndex, fieldIndex, item.name) }); } return cb(data, fieldIndex); }); }; ModelFilter.prototype.buildGroupFilter = function(fieldIndex, isRange) { var self; self = this; return this.loadGroup(fieldIndex, function(data, index) { self.createPopFilterMenu(data, index, isRange); self.createStandFilter(data, index); return self.elements.container.trigger('filter:group:loaded', { group: data, rowIndex: index }); }); }; ModelFilter.prototype.addModelNoFilter = function(groupedIndexes) { var data, group, groups, index, key, rowIndex, rule, self, _i, _j, _len, _len1; data = []; groups = this.product.model_filter; if (!groups) { groups = []; } for (index = _i = 0, _len = groups.length; _i < _len; index = ++_i) { group = groups[index]; for (_j = 0, _len1 = group.length; _j < _len1; _j++) { rule = group[_j]; key = "title_" + _utils.language; data.push({ text: rule[key], value: rule.id, type: 'filter', group_id: rule.model_filter_id }); } } self = this; index = 0; rowIndex = 0; return _async.whilst(function() { return index < groupedIndexes.length; }, function(done) { return self.loadGroup(groupedIndexes[index++], function(groupData, fieldIndex) { var item, langs, _k, _len2; for (_k = 0, _len2 = groupData.length; _k < _len2; _k++) { item = groupData[_k]; langs = item.text.split('/'); item.text = langs.length === 2 ? langs[~~!_utils.isChineseEnv()] : item.text; data.push({ text: item.text, value: item.value, type: item.type, fieldIndex: fieldIndex, checked: self.isChecked(rowIndex, fieldIndex) }); } return done(null); }); }, function(err) { if (data.length === 0) { return; } self.createPopFilterMenu(data, rowIndex); self.createStandFilter(data, rowIndex); return self.elements.container.trigger('filter:group:loaded', { group: data, rowIndex: rowIndex }); }); }; ModelFilter.prototype.getTitle = function(index) { var title, _ref, _ref1; if (index === 0) { return _i18n.product.modelNoFilter; } title = (_ref = this.data.subtitle[_utils.language]) != null ? _ref[index] : void 0; title = title || ((_ref1 = this.data.title[_utils.language]) != null ? _ref1[index] : void 0); if (title) { title = _utils.subHandler(title); } return title; }; ModelFilter.prototype.syncCheckStatus = function($o) { var $allCheckbox, self; $allCheckbox = $o.find('input[type="checkbox"]'); $allCheckbox.prop('checked', false); self = this; return $allCheckbox.each(function() { var $current, group_id, rowIndex, value; $current = $(this); rowIndex = $current.attr('data-row-index'); group_id = $current.attr('data-group-id'); value = $current.val(); if (self.isChecked(rowIndex, group_id, value)) { return $current.prop('checked', true); } }); }; ModelFilter.prototype.getFilterCheckboxInput = function(data, rowIndex) { return ""; }; ModelFilter.prototype.getStandRowContainer = function(rowIndex) { var $o, id, self; self = this; id = "header-stand-" + rowIndex; $o = $("#" + id); if ($o.length > 0) { return $o; } $o = $(""); $o.bind('mouseleave', function() { return self.filterOnChange($o); }); this.elements.stand.append($o); return $o; }; ModelFilter.prototype.createStandFilter = function(data, rowIndex) { var $rowContainer, html, lastGroupId, self, _ref; self = this; $rowContainer = this.getStandRowContainer(rowIndex); if ($rowContainer.attr('data-loaded') === 'true') { return this.setFilter(data, $rowContainer, rowIndex, true); } $rowContainer.attr('data-loaded', true).attr('data-available', data.length); lastGroupId = ((_ref = data[0]) != null ? _ref.group_id : void 0) || rowIndex; html = "" + (this.getFilterCheckboxInput(item, rowIndex)) + " | "; } html += '