UNPKG

element-ui-for-gov

Version:

element-ui for gov

262 lines (244 loc) 7.65 kB
import ElDialog from 'element-ui-for-gov/packages/dialog'; import ElTabs from 'element-ui-for-gov/packages/tabs'; import ElTabPane from 'element-ui-for-gov/packages/tabs/src/tab-pane'; import ElButton from 'element-ui-for-gov/packages/button'; import Message from 'element-ui-for-gov/packages/message'; import PickerPanel from './picker-panel'; export default { name: 'UserPicker', components: {ElDialog, ElTabs, ElTabPane, ElButton, PickerPanel}, props: { title: { type: String, default: '选择人员' }, visible: { type: Boolean }, required: { type: Boolean, default: true }, requiredTips: { type: String, default: '请选择人员' }, userUniqueId: {type: String, default: 'id'}, defaultChecked: { type: Array, default: () => [] }, tabs: { type: Array, default: () => [] }, confirmText: { type: String, default: '确定' }, cancelText: { type: String, default: '取消' }, renderChecked: { type: Function }, renderCheckedItem: { type: Function }, selectPanelButton: { type: Function }, radio: { type: Boolean, default: false }, isSearchCheckAll: { type: Boolean, default: true }, dialogProps: { type: Object, default: () => {} }, poppable: { type: Boolean, default: true }, loading: Boolean, height: String, checkOnClickNode: { type: Boolean, default: false } }, data() { return { checkedUsers: [], defaultCheckUsers: [], treeInstances: {}, currTabsVal: this.tabs[0] ? this.tabs[0].key : '0' }; }, provide() { return { handleChangeUser: this.handleChangeUser, clearChecked: this.clearChecked, nodeKey: this.userUniqueId, setTreeInstance: this.setTreeInstance }; }, watch: { visible: { handler(val) { if (val) { this.defaultCheckUsers = this.defaultChecked.slice(); } }, immediate: true }, defaultChecked: { handler() { if (!this.poppable) { this.defaultCheckUsers = this.defaultChecked.slice(); } }, immediate: true }, checkedUsers: { handler(val) { // console.log('watch-checkedUsers', val); this.$emit('changeUser', val); }, immediate: true }, tabs(val, old) { if (old.length === 0 && val.length > 0) { if (val[0]) this.currTabsVal = val[0].key; } } }, methods: { getTreeInstance() { return this.treeInstances; }, setTreeInstance(key, $tree) { // console.log('setTreeInstance', key); this.treeInstances[key] = $tree; this.$emit('mounted-tree', {key, $tree}); }, handleChangeUser(users, deleteUsers = []) { if (this.radio) { this.checkedUsers = users; } else { const arr = []; let unique = {}; // console.log('handleChangeUser-this.checkedUsers', this.checkedUsers); this.checkedUsers.concat(users).forEach(user => { let del = deleteUsers.find(del => del[this.userUniqueId] === user[this.userUniqueId]); if (!unique[user[this.userUniqueId]] && !del) { arr.push(user); unique[user[this.userUniqueId]] = user; } }); this.checkedUsers = arr; } }, clearChecked() { this.checkedUsers = []; this.defaultCheckUsers = []; }, handleCancel(e) { this.checkedUsers = []; this.$emit('cancel'); }, handleConfirm() { if (this.required && this.checkedUsers.length === 0) { Message.error(this.requiredTips); return; } this.$emit('confirm', this.checkedUsers.slice(0)); this.checkedUsers = []; }, onTabClick(tab) { try { if (tab.$children && tab.$children[0] && tab.$children[0].$refs.tree) { tab.$children[0].$refs.tree.adjustFilterHeight(); } } catch (e) {} }, onTabsChange(val) { this.currTabsVal = val; } }, render() { const { title, visible, checkedUsers, defaultCheckUsers, tabs, confirmText, cancelText, renderChecked, renderCheckedItem, selectPanelButton, radio, isSearchCheckAll, dialogProps, poppable, loading, checkOnClickNode } = this; const HEADER_HEIGHT = 59; const TAB_HEIGHT = tabs.length > 1 ? 56 : 0; const TRAN_HEIGHT = this.height ? Number(this.height.replace('px', '')) - TAB_HEIGHT - HEADER_HEIGHT : null; if (poppable) { return <ElDialog append-to-body={true} close-on-click-modal={false} title={title} visible={visible} {...{on: {'update:visible': this.handleCancel}, props: {...dialogProps}}} width={'1000px'} > { this.$slots.header && <template slot="header">{this.$slots.header}</template> } <div class="el-user-picker" style={{height: this.height}} v-loading={loading}> {tabs.length > 1 && <ElTabs value={this.currTabsVal} onInput={this.onTabsChange} {...{ on: { 'tab-click': this.onTabClick } }}> {tabs.map((tab, i) => (<ElTabPane key={tab.key} label={tab.title} name={tab.key || (i + '')}> <PickerPanel checkOnClickNode={checkOnClickNode} height={TRAN_HEIGHT} defaultChecked={defaultCheckUsers} checkedUsers={checkedUsers} treeProps={tab} renderChecked={renderChecked} renderCheckedItem={renderCheckedItem} selectPanelButton={selectPanelButton} radio={radio} isSearchCheckAll={isSearchCheckAll} /> </ElTabPane>))} </ElTabs> } {tabs.length === 1 && <PickerPanel checkOnClickNode={checkOnClickNode} height={TRAN_HEIGHT} defaultChecked={defaultCheckUsers} checkedUsers={checkedUsers} treeProps={tabs[0]} renderChecked={renderChecked} renderCheckedItem={renderCheckedItem} selectPanelButton={selectPanelButton} radio={radio} isSearchCheckAll={isSearchCheckAll} />} </div> <span class="dialog-footer" slot="footer"> <ElButton {...{ on: { click: this.handleCancel } }}>{cancelText}</ElButton> <ElButton type="primary" {...{ on: { click: this.handleConfirm } }}>{confirmText}</ElButton> </span> </ElDialog>; } else { return <div class="el-user-picker" style={{height: this.height}} v-loading={loading}> {tabs.length > 1 && <ElTabs value={this.currTabsVal} onInput={this.onTabsChange}> {tabs.map((tab, i) => (<ElTabPane key={tab.key} label={tab.title} name={tab.key || (i + '')}> <PickerPanel height={TRAN_HEIGHT} defaultChecked={defaultCheckUsers} checkOnClickNode={checkOnClickNode} checkedUsers={checkedUsers} treeProps={tab} renderChecked={renderChecked} selectPanelButton={selectPanelButton} renderCheckedItem={renderCheckedItem} radio={radio} isSearchCheckAll={isSearchCheckAll}/> </ElTabPane>))} </ElTabs>} {tabs.length === 1 && <PickerPanel height={TRAN_HEIGHT} defaultChecked={defaultCheckUsers} checkOnClickNode={checkOnClickNode} checkedUsers={checkedUsers} treeProps={tabs[0]} renderChecked={renderChecked} renderCheckedItem={renderCheckedItem} selectPanelButton={selectPanelButton} radio={radio} isSearchCheckAll={isSearchCheckAll}/>} </div>; } } };