ll
liukangdong
2024-09-20 c5b5706cd645440a877c546978751b63bf40d008
h5/pages/staff/meetingSel.vue
@@ -1,378 +1,373 @@
<template>
  <view class="main_app" :class="{ popupShow: isShowSelMem }">
    <view class="search_inp df_ac">
      <image
        class="mr12 search"
        src="../../static/ic_search@2x.png"
        mode="widthFix"
      ></image>
      <input
        v-model="param.keyword"
        @blur="initData()"
        type="text"
        placeholder="搜索"
        placeholder-style="color: #999999;"
      />
    </view>
    <view class="member_list">
      <view v-for="(item, index) in memberList" :key="item.id" class="line">
        <image
          v-if="item.avatar"
          :src="item.prefixUrl + item.avatar"
          class="avatar"
          mode=""
        ></image>
        <view v-else class="avatar">{{ item.realname.slice(0, 1) }}</view>
        <view class="content">
          <view class="info">
            <text class="name">{{ item.realname }}</text>
            <text class="tag" v-if="item.status == '1'">有会议</text>
          </view>
          <view class="depart">{{ item.departmentName }}</view>
        </view>
        <image
          @click="changeMem(item, index)"
          v-if="item.checked"
          src="@/static/checkbox_sel@2x.png"
          mode="widthFix"
          class="checked"
        ></image>
        <image
          @click="changeMem(item, index)"
          v-if="!item.checked"
          src="@/static/meeting/icon/ic_choose@2x.png"
          mode="widthFix"
          class="checked"
        ></image>
        <text></text>
      </view>
      <view class="empty"></view>
    </view>
    <!--  -->
    <view class="sub_wrap">
      <view class="sel_mem">
        <text>已选择:</text>
        <view class="members">
          <text v-for="(item, i) in selList" :key="i"
            >{{ item.realname }};</text
          >
        </view>
        <image
          @click="isShowSelMem = true"
          class="open_icon"
          src="../../static/staff/renyuan_ic_open.png"
          mode=""
        ></image>
      </view>
      <view class="btn" @click="onSubmit"
        >确认({{ selList.length }}/{{ param.limitNum }})</view
      >
    </view>
    <!--  -->
    <u-popup
      catchtouchmove
      :show="isShowSelMem"
      :round="12"
      mode="bottom"
      @close="closeModal"
    >
      <view class="modal">
        <view class="modal_header">
          <text class="status">已选择:{{ selList.length }}人</text>
          <text class="btn" @click="subSelMem">确认</text>
        </view>
        <view class="modal_mem_list">
          <view class="line" v-for="(item, i) in selList" :key="i">
            <image
              v-if="item.avatar"
              :src="item.prefixUrl + item.avatar"
              class="avatar"
              mode=""
            ></image>
            <view v-else class="avatar">{{ item.realname.slice(0, 1) }}</view>
            <view class="content">
              <view class="info">
                <text class="name">{{ item.realname }}</text>
              </view>
              <view class="depart">{{ item.departmentName }}</view>
            </view>
            <view class="btn" @click="handleRemove(i)">移除</view>
          </view>
        </view>
      </view>
    </u-popup>
  </view>
</template>
<script>
import { userPagePost } from '@/api'
import dayjs from 'dayjs'
export default {
  data() {
    return {
      memberList: [],
      selList: [],
      param: {
        limitNum: ''
      },
      pagination: {
        page: 1,
        capacity: 20
      },
      isShowSelMem: false
    }
  },
  onLoad(option) {
    this.param = {
      limitNum: option.limitNum,
      keyword: '',
      startTime: dayjs(Number(option.startTime)).format('YYYY-MM-DD HH:mm:ss'),
      endTime: dayjs(Number(option.endTime)).format('YYYY-MM-DD HH:mm:ss'),
    }
    this.initData()
  },
  mounted() {
    this.$eventBus.$on('meetingPeoDetail', (res) => {
      setTimeout(() => {
        res.forEach(item => {
          this.memberList.forEach(mem => {
            if (item.id == mem.id) {
              mem.checked = true
            }
          })
        })
        this.selList = this.memberList.filter(i => i.checked)
        this.$nextTick(() => {
          this.$forceUpdate()
        })
      }, 1000)
    })
  },
  methods: {
    onSubmit() {
      this.$eventBus.$emit('meetingPeo', this.selList)
      uni.navigateBack()
    },
    changeMem(item, index) {
      const { selList, param } = this
      if (this.selList.length == param.limitNum && !item.checked) return uni.showToast({
        title: `该会议可容纳${param.limitNum}人`,
        icon: 'none'
      })
      item.checked = !item.checked
      this.selList = this.memberList.filter(i => i.checked)
      // const arr = e.detail.value
      // let arrTemp = arr.map(item => {
      //   let obj = {}
      //   this.memberList.forEach(ite => {
      //     if (item == ite.id) {
      //       obj.name = ite.name.split('-')[0]
      //       obj.componey = ite.name.split('-')[1] || ''
      //       obj.id = ite.id
      //     }
      //   })
      //   return obj
      // })
      // this.selList = arrTemp
      this.$forceUpdate()
    },
    initData() {
      const { param, pagination } = this
      userPagePost({
        model: { ...param },
        ...pagination,
      }).then(res => {
        this.memberList = res.data.records || []
        this.memberList.map(i => {
          i.checked = false
        })
      })
    },
    closeModal() {
      this.selList = this.memberList.filter(i => i.checked)
      this.isShowSelMem = false
    },
    subSelMem() {
      const { selList, memberList } = this
      memberList.forEach(ite => {
        ite.checked = false
        selList.forEach(item => {
          if (ite.id === item.id) {
            ite.checked = true
          } else { }
        })
      })
      this.isShowSelMem = false
      this.$forceUpdate()
    },
    handleRemove(i) {
      this.selList.splice(i, 1)
      // console.log(this.memberList);
      this.$forceUpdate()
    },
  }
};
</script>
<style lang="scss">
.modal {
  padding: 40rpx 30rpx;
  max-height: 1000rpx;
  .modal_header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-bottom: 20rpx;
    .status {
      font-weight: 600;
    }
    .btn {
      color: $uni-color-primary;
    }
  }
  .modal_mem_list {
    max-height: 860rpx;
    overflow: auto;
    .line {
      display: flex;
      align-items: center;
      border-bottom: 1rpx solid #e5e5e5;
      padding: 30rpx 0;
      .avatar {
        width: 64rpx;
        height: 64rpx;
        border-radius: 50%;
        overflow: hidden;
        margin-right: 20rpx;
        display: flex;
        justify-content: center;
        align-items: center;
        background-color: $uni-color-primary;
        color: #fff;
      }
      .content {
        flex: 1;
        .depart {
          font-size: 24rpx;
          color: #666666;
        }
        .info {
          display: flex;
          margin-bottom: 16rpx;
          .name {
            font-size: 30rpx;
          }
        }
      }
      .btn {
        width: 80rpx;
        height: 48rpx;
        line-height: 48rpx;
        text-align: center;
        font-size: 24rpx;
        color: #333333;
        border-radius: 4rpx;
        border: 1rpx solid #999999;
      }
    }
  }
}
.sub_wrap {
  position: fixed;
  bottom: 0;
  background-color: #fff;
  left: 0;
  width: 100%;
  box-shadow: 0rpx 0rpx 6rpx 0rpx #b2b2b2;
  padding: 30rpx 30rpx 64rpx;
  .sel_mem {
    display: flex;
    align-items: center;
    .members {
      width: 500rpx;
      color: $uni-color-primary;
      white-space: nowrap;
      overflow: hidden; //文本超出隐藏
      text-overflow: ellipsis;
      margin-right: 20rpx;
    }
    .open_icon {
      width: 44rpx;
      height: 44rpx;
    }
  }
  .btn {
    width: 690rpx;
    height: 88rpx;
    line-height: 88rpx;
    background: $uni-color-primary;
    border-radius: 44rpx;
    color: #fff;
    text-align: center;
    margin-top: 22rpx;
  }
}
.member_list {
  .line {
    display: flex;
    align-items: center;
    border-bottom: 1rpx solid #e5e5e5;
    padding: 30rpx 0;
    .avatar {
      width: 64rpx;
      height: 64rpx;
      border-radius: 50%;
      overflow: hidden;
      margin-right: 20rpx;
    }
    .content {
      flex: 1;
      .depart {
        font-size: 24rpx;
        color: #666666;
      }
      .info {
        display: flex;
        margin-bottom: 16rpx;
        .name {
          font-size: 30rpx;
        }
        .tag {
          font-size: 24rpx;
          border-radius: 4rpx;
          border: 1rpx solid #f62710;
          color: #f62710;
          padding: 0rpx 6rpx;
          margin-left: 8rpx;
          display: flex;
          align-items: center;
        }
      }
    }
    .checked {
      width: 48rpx;
    }
  }
  .empty {
    width: 100%;
    height: 280rpx;
  }
}
.search_inp {
  height: 72rpx;
  background: #f7f7f7;
  border-radius: 4rpx;
  padding-left: 16rpx;
  .search {
    width: 28rpx;
  }
  input {
    flex: 1;
    font-size: 28rpx;
    color: #333333;
  }
}
</style>
<template>
   <view class="main_app" :class="{ popupShow: isShowSelMem }">
      <view class="search_inp df_ac">
         <image class="mr12 search" src="../../static/ic_search@2x.png" mode="widthFix"></image>
         <input v-model="param.keyword" @blur="initData()" type="text" placeholder="搜索"
            placeholder-style="color: #999999;" />
      </view>
      <view class="member_list">
         <view v-for="(item, index) in memberList" :key="item.id" class="line">
            <image v-if="item.avatar" :src="item.prefixUrl + item.avatar" class="avatar" mode=""></image>
            <view v-else class="avatar">{{ item.realname.slice(0, 1) }}</view>
            <view class="content">
               <view class="info">
                  <text class="name">{{ item.realname }}</text>
                  <text class="tag" v-if="item.status == '1'">有会议</text>
               </view>
               <view class="depart">{{ item.departmentName }}</view>
            </view>
            <image @click="changeMem(item, index)" v-if="item.checked" src="@/static/checkbox_sel@2x.png" mode="widthFix"
               class="checked"></image>
            <image @click="changeMem(item, index)" v-if="!item.checked" src="@/static/meeting/icon/ic_choose@2x.png"
               mode="widthFix" class="checked"></image>
            <text></text>
         </view>
         <view class="empty"></view>
      </view>
      <!--  -->
      <view class="sub_wrap">
         <view class="sel_mem">
            <text>已选择:</text>
            <view class="members">
               <text v-for="(item, i) in selList" :key="i">{{ item.realname }};</text>
            </view>
            <image @click="openSeleter" class="open_icon" src="../../static/staff/renyuan_ic_open.png" mode=""></image>
         </view>
         <view class="btn" @click="onSubmit">确认({{ selList.length }}/{{ param.limitNum }})</view>
      </view>
      <!--  -->
      <u-popup catchtouchmove :show="isShowSelMem" :round="12" mode="bottom" @close="closeModal">
         <view class="modal">
            <view class="modal_header">
               <text class="status">已选择:{{ selList.filter(i => i.checkedTemp).length }}人</text>
               <text class="btn" @click="subSelMem">确认</text>
            </view>
            <view class="modal_mem_list">
               <template v-for="(item, i) in selList">
                  <view class="line" v-if="item.checkedTemp">
                     <image v-if="item.avatar" :src="item.prefixUrl + item.avatar" class="avatar" mode=""></image>
                     <view v-else class="avatar">{{ item.realname.slice(0, 1) }}</view>
                     <view class="content">
                        <view class="info">
                           <text class="name">{{ item.realname }}</text>
                        </view>
                        <view class="depart">{{ item.departmentName }}</view>
                     </view>
                     <view class="btn" @click="handleRemove(i)">移除</view>
                  </view>
               </template>
            </view>
         </view>
      </u-popup>
   </view>
</template>
<script>
   import {
      userPagePost
   } from '@/api'
   import dayjs from 'dayjs'
   export default {
      data() {
         return {
            memberList: [],
            selList: [],
            param: {
               limitNum: ''
            },
            pagination: {
               page: 1,
               capacity: 20
            },
            isShowSelMem: false
         }
      },
      onLoad(option) {
         this.param = {
            limitNum: option.limitNum,
            keyword: '',
            startTime: dayjs(Number(option.startTime)).format('YYYY-MM-DD HH:mm:ss'),
            endTime: dayjs(Number(option.endTime)).format('YYYY-MM-DD HH:mm:ss'),
         }
         this.initData()
      },
      mounted() {
         this.$eventBus.$on('meetingPeoDetail', (res) => {
            setTimeout(() => {
               res.forEach(item => {
                  this.memberList.forEach(mem => {
                     if (item.id == mem.id) {
                        mem.checked = true
                     }
                  })
               })
               this.selList = this.memberList.filter(i => i.checked)
               this.$nextTick(() => {
                  this.$forceUpdate()
               })
            }, 1000)
         })
      },
      methods: {
         onSubmit() {
            this.$eventBus.$emit('meetingPeo', this.selList)
            uni.navigateBack()
         },
         changeMem(item, index) {
            // const { selList, param } = this
            // if (this.selList.length == param.limitNum && !item.checked) return uni.showToast({
            //   title: `该会议可容纳${param.limitNum}人`,
            //   icon: 'none'
            // })
            // item.checked = !item.checked
            // this.selList = this.memberList.filter(i => i.checked)
            // //
            item.checked = !item.checked
            const i = this.selList.findIndex(a => a.id === item.id)
            if (item.checked && i === -1) {
               this.selList.push(item)
            } else {
               this.selList.splice(i, 1)
            }
            this.$forceUpdate()
         },
         openSeleter() {
            this.isShowSelMem = true
            this.selList.forEach(item => {
               item.checkedTemp = true
            })
            this.$forceUpdate()
         },
         initData() {
            const {
               param,
               pagination
            } = this
            userPagePost({
               model: {
                  ...param
               },
               ...pagination,
            }).then(res => {
               this.memberList = res.data.records || []
               this.memberList.forEach(i => {
                  const index = this.selList.findIndex(ite => ite.id === i.id)
                  i.checked = index > -1
               })
            })
         },
         closeModal() {
            this.selList.forEach(item => {
               item.checkedTemp = true
            })
            this.isShowSelMem = false
         },
         subSelMem() {
            const {
               memberList
            } = this
            this.selList = this.selList.filter(i => i.checkedTemp)
            memberList.forEach(ite => {
               const index = this.selList.findIndex(i => i.id === ite.id)
               ite.checked = index > -1
            })
            this.isShowSelMem = false
            this.$forceUpdate()
         },
         handleRemove(i) {
            this.selList[i].checkedTemp = false
            this.$forceUpdate()
         },
      }
   };
</script>
<style lang="scss">
   .modal {
      padding: 40rpx 30rpx;
      max-height: 1000rpx;
      .modal_header {
         display: flex;
         justify-content: space-between;
         align-items: center;
         padding-bottom: 20rpx;
         .status {
            font-weight: 600;
         }
         .btn {
            color: $uni-color-primary;
         }
      }
      .modal_mem_list {
         max-height: 860rpx;
         overflow: auto;
         .line {
            display: flex;
            align-items: center;
            border-bottom: 1rpx solid #e5e5e5;
            padding: 30rpx 0;
            .avatar {
               width: 64rpx;
               height: 64rpx;
               border-radius: 50%;
               overflow: hidden;
               margin-right: 20rpx;
               display: flex;
               justify-content: center;
               align-items: center;
               background-color: $uni-color-primary;
               color: #fff;
            }
            .content {
               flex: 1;
               .depart {
                  font-size: 24rpx;
                  color: #666666;
               }
               .info {
                  display: flex;
                  margin-bottom: 16rpx;
                  .name {
                     font-size: 30rpx;
                  }
               }
            }
            .btn {
               width: 80rpx;
               height: 48rpx;
               line-height: 48rpx;
               text-align: center;
               font-size: 24rpx;
               color: #333333;
               border-radius: 4rpx;
               border: 1rpx solid #999999;
            }
         }
      }
   }
   .sub_wrap {
      position: fixed;
      bottom: 0;
      background-color: #fff;
      left: 0;
      width: 100%;
      box-shadow: 0rpx 0rpx 6rpx 0rpx #b2b2b2;
      padding: 30rpx 30rpx 64rpx;
      .sel_mem {
         display: flex;
         align-items: center;
         .members {
            width: 500rpx;
            color: $uni-color-primary;
            white-space: nowrap;
            overflow: hidden; //文本超出隐藏
            text-overflow: ellipsis;
            margin-right: 20rpx;
         }
         .open_icon {
            width: 44rpx;
            height: 44rpx;
         }
      }
      .btn {
         width: 690rpx;
         height: 88rpx;
         line-height: 88rpx;
         background: $uni-color-primary;
         border-radius: 44rpx;
         color: #fff;
         text-align: center;
         margin-top: 22rpx;
      }
   }
   .member_list {
      .line {
         display: flex;
         align-items: center;
         border-bottom: 1rpx solid #e5e5e5;
         padding: 30rpx 0;
         .avatar {
            width: 64rpx;
            height: 64rpx;
            border-radius: 50%;
            overflow: hidden;
            margin-right: 20rpx;
         }
         .content {
            flex: 1;
            .depart {
               font-size: 24rpx;
               color: #666666;
            }
            .info {
               display: flex;
               margin-bottom: 16rpx;
               .name {
                  font-size: 30rpx;
               }
               .tag {
                  font-size: 24rpx;
                  border-radius: 4rpx;
                  border: 1rpx solid #f62710;
                  color: #f62710;
                  padding: 0rpx 6rpx;
                  margin-left: 8rpx;
                  display: flex;
                  align-items: center;
               }
            }
         }
         .checked {
            width: 48rpx;
         }
      }
      .empty {
         width: 100%;
         height: 280rpx;
      }
   }
   .search_inp {
      height: 72rpx;
      background: #f7f7f7;
      border-radius: 4rpx;
      padding-left: 16rpx;
      .search {
         width: 28rpx;
      }
      input {
         flex: 1;
         font-size: 28rpx;
         color: #333333;
      }
   }
</style>