<template>
	<u-popup :maskCloseAble="maskCloseAble" mode="right" :popup="false" v-model="value" length="auto"
		:safeAreaInsetBottom="safeAreaInsetBottom" @close="close" :z-index="uZIndex" width="100%">
		<view class="user-select u-flex-col ">
			<view class="user-select-hd">
				<view class="user-select-hd-inner u-flex">
					<view class="icon-ym icon-ym-report-icon-preview-pagePre u-font-40 backIcon"
						@tap="getResult('cancel')">
					</view>
					<view class="user-select-hd-title u-font-32">
						选择用户
					</view>
				</view>
			</view>
			<view class="user-select-search">
				<u-search placeholder="请输入关键词搜索" v-model="keyword" height="72" :show-action="false"
					@change="search(swiperCurrent)" bg-color="#f0f2f6" shape="square">
				</u-search>
			</view>
			<view class="user-select-content">
				<view class="alreadySelect">
					<view class="alreadySelect__box u-flex-col">
						<view class="alreadySelect_hd u-flex">
							<view>已选</view>
							<view v-if="clearable" @click="cleanAll" style="color: #2979ff;">清空列表
							</view>
						</view>
						<view class="select__box u-flex-col" id="box">
							<scroll-view scroll-y="true" style="max-height: 240rpx;">
								<view class="u-flex select__list">
									<view class="u-selectTag u-flex" v-for="(list,index) in selectList" :key="index">
										<view class="avatar">
											<u-avatar :src="baseURL+list.headIcon" mode="circle" size="mini">
											</u-avatar>
										</view>
										<view class="u-font-24 select__content">
											<view class="nameSty u-flex">
												<view class="nameUp">
													{{list.fullName}}
												</view>
												<u-icon name="close" class="close" @click='delSelect(index)'>
												</u-icon>
											</view>
											<view class="organizeSty">{{list.organize}}</view>
										</view>
									</view>
								</view>
							</scroll-view>
						</view>
					</view>
				</view>
				<view class="content">
					<ly-tree ref="tree" :node-key="realProps.value" :expand-on-click-node="true" :tree-data="options0"
						check-on-click-node :show-checkbox="false" :default-expand-all="false" :highlight-current="true"
						@node-click="handleNodeClick" :props="realProps" :show-node-icon="true" :show-radio="false"
						:load="loadNode" lazy class="ly-tree" />
				</view>

			</view>
		</view>
		<!-- 底部按钮 -->
		<view class="flowBefore-actions">
			<template>
				<u-button class="buttom-btn" @click="getResult('cancel')">
					{{'取消'}}
				</u-button>
				<u-button class="buttom-btn" type="primary" @click.stop="getResult('confirm')">
					{{'确定'}}
				</u-button>
			</template>
		</view>
	</u-popup>
</template>
<script>
	/**
	 * tree-select 树形选择器
	 * @property {Boolean} v-model 布尔值变量，用于控制选择器的弹出与收起
	 * @property {Boolean} safe-area-inset-bottom 是否开启底部安全区适配(默认false)
	 * @property {String} cancel-color 取消按钮的颜色（默认#606266）
	 * @property {String} confirm-color 确认按钮的颜色(默认#2979ff)
	 * @property {String} confirm-text 确认按钮的文字
	 * @property {String} cancel-text 取消按钮的文字
	 * @property {Boolean} mask-close-able 是否允许通过点击遮罩关闭Picker(默认true)
	 * @property {String Number} z-index 弹出时的z-index值(默认10075)
	 * @event {Function} confirm 点击确定按钮，返回当前选择的值
	 */
	const defaultProps = {
		label: 'fullName',
		value: 'id',
		icon: 'icon',
		children: 'children'
	}
	import {
		getListByAuthorize
	} from '@/api/common.js'
	import resources from '@/libs/resources.js'
	import LyTree from '@/components/ly-tree/ly-tree.vue'
	export default {
		name: "tree-select",
		components: {
			LyTree
		},
		props: {
			selectType: {
				type: String,
				default: 'all'
			},
			clearable: {
				type: Boolean,
				default: false
			},
			query: {
				type: Object,
				default: () => ({})
			},
			selectedData: {
				type: Array,
				default () {
					return [];
				}
			},
			// 是否显示边框
			border: {
				type: Boolean,
				default: true
			},
			// 通过双向绑定控制组件的弹出与收起
			value: {
				type: Boolean,
				default: false
			},
			// "取消"按钮的颜色
			cancelColor: {
				type: String,
				default: '#606266'
			},
			// "确定"按钮的颜色
			confirmColor: {
				type: String,
				default: '#2979ff'
			},
			// 弹出的z-index值
			zIndex: {
				type: [String, Number],
				default: 0
			},
			safeAreaInsetBottom: {
				type: Boolean,
				default: false
			},
			// 是否允许通过点击遮罩关闭Picker
			maskCloseAble: {
				type: Boolean,
				default: true
			},
			bh: {
				default: 450
			},
			props: {
				type: Object,
				default: () => ({
					label: 'fullName',
					value: 'id',
					icon: 'icon',
					children: 'children',
					isLeaf: 'isLeaf'
				})
			},
			//多选
			multiple: {
				type: Boolean,
				default: false
			},
			// 顶部标题
			title: {
				type: String,
				default: ''
			},
			// 取消按钮的文字
			cancelText: {
				type: String,
				default: '取消'
			},
			// 确认按钮的文字
			confirmText: {
				type: String,
				default: '确认'
			}
		},
		data() {
			return {
				noDataIcon: resources.message.nodata,
				triggered: false,
				moving: false,
				selectList: [],
				keyword: '',
				tabsList: [{
						name: '全部数据'
					},
					{
						name: '当前组织'
					},
					{
						name: '我的下属'
					}
				],
				current: 0,
				swiperCurrent: 0,
				options: [],
				options0: [],
				list: [],
				pagination: {
					currentPage: 1,
					pageSize: 20
				},
				total: 0,
				height: 0
			};
		},
		watch: {
			// 在select弹起的时候，重新初始化所有数据
			value: {
				immediate: true,
				handler(val) {
					if (val) setTimeout(() => this.init(), 10);
				}
			},
		},
		computed: {
			baseURL() {
				return this.define.baseURL
			},
			uZIndex() {
				// 如果用户有传递z-index值，优先使用
				return this.zIndex ? this.zIndex : this.$u.zIndex.popup;
			},
			realProps() {
				return {
					...defaultProps,
					...this.props
				}
			}
		},
		created() {
			this._freshing = false;
			setTimeout(() => {
				this.triggered = true;
			}, 1000)
		},
		methods: {
			rsetHeight() {
				this.$nextTick(() => {
					this.$uGetRect('#box').then(res => {
						let h = 0
						if (this.selectList.length < 1) return this.height = 0
						h = (Number(res.height.toFixed(0)) * 2)
						this.height = h
					})
				})
			},
			handleScrollToLower() {
				if (this.pagination.pageSize * this.pagination.currentPage < this.total) {
					this.pagination.currentPage = this.pagination.currentPage + 1;
					this.getInfoList()
				} else {
					uni.showToast({
						title: '没有更多信息啦！',
						icon: 'none'
					});
				}
			},
			getInfoList() {
				let query = this.query;
				this.pagination.keyword = this.keyword
				query.pagination = this.pagination
				getListByAuthorize(query).then(res => {
					const list = res.data.list;
					this.list = this.list.concat(list);
					this.pagination = res.data.pagination
					this.total = this.pagination.total
				})
			},
			init() {
				if (this.selectType !== 'all') this.getInfoList()
				this.selectList = JSON.parse(JSON.stringify(this.selectedData))
			},
			loadNode(node, resolve) {
				if (node.level === 0) {
					getListByAuthorize(node.level).then(res => {
						resolve(res.data.list)
					})
				} else {
					getListByAuthorize(node.data.id).then(res => {
						const data = res.data.list
						resolve(data)
					})
				}
			},
			search(index) {
				this.searchTimer && clearTimeout(this.searchTimer)
				this.searchTimer = setTimeout(() => {
					getListByAuthorize(0, this.keyword).then(res => {
						this.options0 = res.data.list
					})
				}, 300)
			},
			handleNodeClick(obj) {
				if (this.swiperCurrent === 0 && obj.data.type !== 'user') return
				if (!this.multiple) {
					this.selectList = []
				}
				var isExist = false;
				for (var i = 0; i < this.selectList.length; i++) {
					if (this.selectList[i].id == obj.data.id) {
						isExist = true;
						break;
					}
				}!isExist && this.selectList.push(obj.data);
				this.rsetHeight()
			},
			delSelect(index) {
				this.rsetHeight();
				this.selectList.splice(index, 1);
				this.rsetHeight()
			},
			cleanAll() {
				this.selectList = [];
				this.rsetHeight()
			},

			// 点击确定或者取消
			getResult(event = null) {
				// #ifdef MP-WEIXIN
				if (this.moving) return;
				// #endif
				this.keyword = '';
				if (event === 'cancel') return this.close();
				// if(this.selectList.length === 0) return this.$u.toast('还未选择人员！')
				this.$emit(event, this.selectList);
				this.close();
			},
			// 标识滑动开始，只有微信小程序才有这样的事件
			pickstart() {
				// #ifdef MP-WEIXIN
				this.moving = true;
				// #endif
			},
			// 标识滑动结束
			pickend() {
				// #ifdef MP-WEIXIN
				this.moving = false;
				// #endif
			},
			filterNode(value, data) {
				if (!value) return true;
				// #ifndef MP
				return data[this.realProps.label].indexOf(value) !== -1;
				// #endif
				// #ifdef MP
				return this.label.indexOf(value) !== -1;
				// #endif
			},
			close() {
				this.$emit('input', false);
			},
			resetData() {
				this.list = []
				this.pagination = {
					currentPage: 1,
					pageSize: 20
				}
			}
		}
	};
</script>
<style scoped lang="scss">
	.u-popup {}

	.user-select {
		.user-select-hd {
			height: 80rpx;

			.user-select-hd-inner {
				width: calc(100% - 56rpx);
				box-sizing: border-box;
				align-items: center;
				font-weight: bh;
				letter-spacing: 2rpx;

				.backIcon {
					width: 56rpx;
					height: 70rpx;
					text-align: center;
					font-weight: 400;
					margin-left: 16rpx;
				}

				.user-select-hd-title {
					width: 100%;
					height: 80rpx;
					text-align: center;
				}
			}
		}

		.user-select-search {
			padding: 20rpx 24rpx;
		}

		.user-select-content {
			width: 100%;
			padding: 0 24rpx 38rpx;

			.alreadySelect {
				width: 100%;

				.alreadySelect__box {
					.alreadySelect_hd {
						width: 100%;
						height: 60rpx;
						justify-content: space-between;
					}

					.select__box {
						width: 100%;
						justify-content: center;
						border-bottom: 1rpx solid #c0c4cc;

						.select__list {
							justify-content: flex-start;
							flex-wrap: wrap;
							padding-top: 10rpx;

							.u-selectTag {
								width: 310rpx;
								border: 1px solid #2194fa;
								background-color: #e8f4fe;
								line-height: 40rpx;
								margin: 10rpx;
								padding-left: 10rpx;
								align-items: center;
								border-radius: 8rpx;

								.select__content {
									width: 74%;
									margin-left: 10rpx;

									.nameSty {
										color: #353535;

										.nameUp {
											white-space: nowrap;
											overflow: hidden; //超出的文本隐藏
											text-overflow: ellipsis;
										}

										.close {
											width: 26px;
											justify-content: flex-end;
											color: #2194fa;
										}
									}

									.organizeSty {
										color: #a0a1a1;
										white-space: nowrap;
										overflow: hidden; //超出的文本隐藏
										text-overflow: ellipsis
									}
								}
							}

							.u-size-default {
								padding: 6rpx 12rpx;
							}
						}
					}
				}
			}

			.content {

				.scroll-view2 {
					height: calc(100vh - 430rpx);

					.lists_box {
						height: 100%;

						.nodata {
							height: 100%;
							margin: auto;
							align-items: center;
							justify-content: center;
							color: #909399;

							.noDataIcon {
								width: 300rpx;
								height: 210rpx;
							}
						}

						.list-cell-txt {
							display: flex;
							box-sizing: border-box;
							width: 100%;
							padding: 20rpx 32rpx;
							overflow: hidden;
							color: $u-content-color;
							font-size: 28rpx;
							line-height: 24px;
							background-color: #fff;

							.content {
								width: 85%;
								margin-left: 15rpx;

								.nameSty {}

								.organizeSty {
									white-space: nowrap;
									overflow: hidden; //超出的文本隐藏
									text-overflow: ellipsis
								}
							}

							.department {
								color: #9A9A9A;
							}
						}
					}
				}
			}
		}
	}
</style>
