UNPKG

vue-ant-patterns

Version:

vue-ant-patterns

407 lines (366 loc) 11.7 kB
import _extends from 'babel-runtime/helpers/extends'; import DContainer from '../../es/d-container'; import { Select, AutoComplete, Input, Icon, Spin } from 'ant-design-vue'; import PropTypes from 'ant-design-vue/es/_util/vue-types'; import { hasProp } from 'ant-design-vue/es/_util/props-util'; import { listToTree, treeToList, isEmptyObj, debounceHandler, relationHandler } from '../../es/_utils'; import extend from 'extend'; import moment from 'moment'; import LocaleReceiver from 'ant-design-vue/es/locale-provider/LocaleReceiver'; import request from '../_biz-utils/request'; import EN from './locale/en_US'; import CN from './locale/zh_CN'; var Horizontal = DContainer.Horizontal, Vertical = DContainer.Vertical; // const { RangePicker } = DatePicker; var Option = Select.Option; var AutoCompleteOption = AutoComplete.Option; var InputSearch = Input.Search; var langType = { 'zh-cn': CN, 'en-us': EN }; // const dateDefault = { // type: 'dataPicker', // value: 'now', // format: 'YYYY/MM/DD', // }; export default { name: 'BTreeHeader', props: { // 树节点父子关系关联字段 rel: PropTypes.array.def([['data', 'hid'], ['data', 'parentHid']]), // 树节点, 显示字段 renderKey: PropTypes.oneOfType([PropTypes.string, PropTypes.array]).def(['data', 'name']), // 维度 dimensionOptions: PropTypes.object, // 搜索 searchOptions: PropTypes.object, // 搜索选择后的查询参数 searchSelectOptions: PropTypes.object, // 时间戳 queryDate: PropTypes.number, dimensionDisabled: Boolean, treeFilter: Boolean }, searchCache: {}, created: function created() { var _this = this; var _$props = this.$props, dimensionOptions = _$props.dimensionOptions, searchOptions = _$props.searchOptions, treeFilter = _$props.treeFilter; /** * 判断是否传入维度 prop, 如果传入则查询维度下拉菜单的数据 * 查询完成后, 触发父级 dimensionLoad 事件 */ if (dimensionOptions) { var vDimensionValue = dimensionOptions.defaultValue, keyName = dimensionOptions.keyName; this.getDimension().then(function (res) { var data = res.data; var code = data.code, msg = data.msg, resData = data.data; if (code === 200) { _this.dimensionData = resData; _this.dimensionValue = vDimensionValue || (resData[0] || {})[keyName]; _this.$emit('dimensionLoad', resData); } else { _this.$message.error(msg); } return res; })['finally'](function () { _this.$root.isLoading = false; }); } this.searchDelayHandler = function () {}; // if (searchOptions) { this.searchFetch = debounceHandler(this.searchFetch); // } // if (treeFilter) { this.treeFilterDebounceHandler = debounceHandler(this.treeFilterHandler); // } }, data: function data() { return { localeCode: 'zh-cn', searchResult: [], // select 搜索框的默认值如果是空字符串, 失去焦点时, placeholder 不能正常显示 // 参考官方文档使用[] searchVal: [], fetching: false, // 维度列表 dimensionData: [], // 维度默认选中 dimensionValue: '' }; }, methods: { /** * 获取默认语言 */ getDefaultLocale: function getDefaultLocale() { var result = { lang: _extends({}, CN) }; return result; }, /** * 获取维度列表 */ getDimension: function getDimension() { var dimensionOptions = this.$props.dimensionOptions; var vDimensionValue = dimensionOptions.defaultValue, url = dimensionOptions.url, method = dimensionOptions.method, data = dimensionOptions.data; this.dimensionValue = vDimensionValue; this.$root.isLoading = true; var reqParams = { url: url, method: method, data: data }; return request(reqParams); }, /** * 搜索 * 根据输入关键词搜索查询结果 * 并在下拉列表中显示 * @param { String } val */ searchFetch: function searchFetch(val) { var _this2 = this; if (!val) return; var _$props2 = this.$props, searchOptions = _$props2.searchOptions, queryDate = _$props2.queryDate, rel = _$props2.rel, renderKey = _$props2.renderKey; var keyName = searchOptions.keyName, showName = searchOptions.showName, url = searchOptions.url, method = searchOptions.method, data = searchOptions.data; var dimensionValue = this.dimensionValue; var searchQueryParam = { url: url, method: method, data: _extends({ viewInvalid: false }, data, { // 关键词 dimHid: dimensionValue, date: queryDate, nameStr: val }) }; this.fetching = true; request(searchQueryParam).then(function (res) { var resData = res.data; var code = resData.code, msg = resData.msg, data = resData.data; if (code !== 200) { return Promise.reject(msg); } var tmpData = data.map(function (it) { var k = relationHandler(rel[0], it); // const pk = relationHandler(rel[1], it); var n = relationHandler(renderKey, it); _this2.$options.searchCache[k] = it; return { hid: k, name: n // parentHid: pk, }; }); _this2.searchResult = tmpData; _this2.$emit('search', { data: resData }); })['catch'](function (e) { console.error(e); _this2.$message.error(e); })['finally'](function () { _this2.fetching = false; }); }, treeFilterHandler: function treeFilterHandler(e) { // console.log(e); this.$emit('treeFilter', e); }, /** * 渲染维度下拉菜单 */ renderDimension: function renderDimension() { var _this3 = this; var h = this.$createElement; var _$props3 = this.$props, dimensionOptions = _$props3.dimensionOptions, dimensionDisabled = _$props3.dimensionDisabled; if (!dimensionOptions) return null; var dimensionData = this.dimensionData, localeCode = this.localeCode; var defaultValue = dimensionOptions.defaultValue, showName = dimensionOptions.showName, keyName = dimensionOptions.keyName, _dimensionOptions$pro = dimensionOptions.props, props = _dimensionOptions$pro === undefined ? {} : _dimensionOptions$pro; var selectProps = { props: _extends({ defaultValue: defaultValue, value: this.dimensionValue, placeholder: langType[localeCode].placeholder }, props, { disabled: dimensionDisabled }), 'class': 'margin-bottom-xs', on: { change: function change(value) { var selectItem = dimensionData.find(function (it) { return relationHandler(keyName, it) === value; }); _this3.dimensionValue = value; _this3.$emit('dimensionChange', { value: value, selectData: selectItem }); } } }; return h( Select, selectProps, [dimensionData.map(function (it) { var key = relationHandler(keyName, it); var name = relationHandler(showName, it); return h( Option, { attrs: { value: key } }, [name] ); })] ); }, /** * 搜索下拉回调函数 * @param { String } value 选中的key * @param {vNode} option */ searchSelect: function searchSelect(value) { this.searchVal = value; this.getSelectNodes(value); }, /** * 根据搜索下拉菜单选中项查询相关节点数据 * 并触发父组件绑定事件 * @param { String } value 下拉菜单中选中的 key */ getSelectNodes: function getSelectNodes(val) { var _$props4 = this.$props, searchSelectOptions = _$props4.searchSelectOptions, rel = _$props4.rel; var searchResult = this.searchResult; // const { rel } = searchSelectOptions; var itemData = searchResult.find(function (it) { return relationHandler(rel[0], it) === val; }); var k = relationHandler(rel[0], itemData); this.$emit('searchSelect', { key: val, itemData: this.$options.searchCache[k] }); }, /** * 渲染搜索下拉菜单 */ renderSearch: function renderSearch() { var _this4 = this; var h = this.$createElement; var _$props5 = this.$props, searchOptions = _$props5.searchOptions, rel = _$props5.rel, renderKey = _$props5.renderKey, treeFilter = _$props5.treeFilter; var searchResult = this.searchResult, localeCode = this.localeCode, fetching = this.fetching; if (!searchOptions) return null; // const { keyName, showName, props = {} } = searchOptions; var searchOrops = { props: { value: this.searchVal, allowClear: true, showArrow: false, filterOption: false, notFoundContent: fetching ? undefined : null, showSearch: true, placeholder: langType[localeCode].search // ...props, }, on: { search: this.searchFetch, select: this.searchSelect, focus: function focus() { _this4.searchVal = []; } }, 'class': 'margin-bottom-xs', style: { height: '32px', overflow: 'hidden' } }; return h( Select, searchOrops, [fetching ? h(Spin, { slot: 'notFoundContent' }) : null, searchResult.map(function (it, idx) { var key = relationHandler(rel[0], it); var name = relationHandler(renderKey, it); return h( Option, { attrs: { title: name }, key: key }, [name] ); })] ); }, renderFilter: function renderFilter() { var h = this.$createElement; var searchResult = this.searchResult, localeCode = this.localeCode, fetching = this.fetching; var inputProps = { props: { placeholder: langType[localeCode].search }, 'class': 'margin-bottom-xs', on: { change: this.treeFilterDebounceHandler } }; return h(InputSearch, inputProps); }, renderComponent: function renderComponent(contextLocale, locale) { var h = this.$createElement; this.localeCode = locale; var _$props6 = this.$props, searchOptions = _$props6.searchOptions, rel = _$props6.rel, renderKey = _$props6.renderKey, treeFilter = _$props6.treeFilter; return h(Vertical, [this.renderDimension(), treeFilter ? this.renderFilter() : this.renderSearch()]); } }, render: function render() { var h = arguments[0]; return h(LocaleReceiver, { attrs: { componentName: 'BTreeHead', defaultLocale: this.getDefaultLocale }, scopedSlots: { 'default': this.renderComponent } }); } };