chat-at-box.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <template>
  2. <uni-popup ref="popup" type="bottom" @change="onChange">
  3. <view class="chat-at-box">
  4. <view class="chat-at-top">
  5. <view class="chat-at-tip"> 选择要提醒的人</view>
  6. <button class="chat-at-btn" type="warn" size="mini" @click="onClean()">清空 </button>
  7. <button class="chat-at-btn" type="primary" size="mini" @click="onOk()">确定({{atUserIds.length}})
  8. </button>
  9. </view>
  10. <scroll-view v-show="atUserIds.length>0" scroll-x="true" scroll-left="120">
  11. <view class="at-user-items">
  12. <view v-for="m in showMembers" v-show="m.checked" class="at-user-item">
  13. <head-image :name="m.aliasName" :url="m.headImage" :size="60"></head-image>
  14. </view>
  15. </view>
  16. </scroll-view>
  17. <view class="search-bar">
  18. <uni-search-bar v-model="searchText" cancelButton="none" placeholder="搜索"></uni-search-bar>
  19. </view>
  20. <view class="member-items">
  21. <scroll-view class="scroll-bar" scroll-with-animation="true" scroll-y="true">
  22. <view v-for="m in showMembers" v-show="m.aliasName.startsWith(searchText)"
  23. :key="m.userId">
  24. <view class="member-item" @click="onSwitchChecked(m)">
  25. <head-image :name="m.aliasName" :online="m.online" :url="m.headImage"
  26. :size="90"></head-image>
  27. <view class="member-name">{{ m.aliasName}}</view>
  28. <view class="member-checked">
  29. <radio :checked="m.checked" @click.stop="onSwitchChecked(m)" />
  30. </view>
  31. </view>
  32. </view>
  33. </scroll-view>
  34. </view>
  35. </view>
  36. </uni-popup>
  37. </template>
  38. <script>
  39. export default {
  40. name: "chat-at-box",
  41. props: {
  42. ownerId: {
  43. type: Number,
  44. },
  45. members: {
  46. type: Array
  47. }
  48. },
  49. data() {
  50. return {
  51. searchText: "",
  52. showMembers:[]
  53. };
  54. },
  55. methods: {
  56. init(atUserIds) {
  57. this.showMembers = [];
  58. let userId = this.$store.state.userStore.userInfo.id;
  59. if(this.ownerId == userId){
  60. this.showMembers.push({
  61. userId:-1,
  62. aliasName: "全体成员"
  63. })
  64. }
  65. this.members.forEach((m) => {
  66. if(m.userId != userId){
  67. m.checked = atUserIds.indexOf(m.userId) >= 0;
  68. this.showMembers.push(m);
  69. }
  70. });
  71. },
  72. open() {
  73. this.$refs.popup.open();
  74. },
  75. onSwitchChecked(member) {
  76. member.checked = !member.checked;
  77. },
  78. onClean() {
  79. this.showMembers.forEach((m) => {
  80. m.checked = false;
  81. })
  82. },
  83. onOk() {
  84. this.$refs.popup.close();
  85. },
  86. onChange(e) {
  87. if (!e.show) {
  88. this.$emit("complete", this.atUserIds)
  89. }
  90. }
  91. },
  92. computed: {
  93. atUserIds() {
  94. let ids = [];
  95. this.showMembers.forEach((m) => {
  96. if (m.checked) {
  97. ids.push(m.userId);
  98. }
  99. })
  100. return ids;
  101. }
  102. }
  103. }
  104. </script>
  105. <style lang="scss" scoped>
  106. .chat-at-box {
  107. position: relative;
  108. border: #dddddd solid 1rpx;
  109. display: flex;
  110. flex-direction: column;
  111. background-color: white;
  112. padding: 10rpx;
  113. border-radius: 15rpx;
  114. .chat-at-top {
  115. display: flex;
  116. align-items: center;
  117. height: 70rpx;
  118. padding: 10rpx;
  119. .chat-at-tip {
  120. flex: 1;
  121. }
  122. .chat-at-btn {
  123. margin-left: 10rpx;
  124. }
  125. }
  126. .at-user-items {
  127. display: flex;
  128. align-items: center;
  129. height: 90rpx;
  130. .at-user-item {
  131. padding: 3rpx;
  132. }
  133. }
  134. .member-items {
  135. position: relative;
  136. flex: 1;
  137. overflow: hidden;
  138. .member-item {
  139. height: 120rpx;
  140. display: flex;
  141. position: relative;
  142. padding: 0 30rpx;
  143. align-items: center;
  144. background-color: white;
  145. white-space: nowrap;
  146. .member-name {
  147. flex: 1;
  148. padding-left: 20rpx;
  149. font-size: 30rpx;
  150. font-weight: 600;
  151. line-height: 60rpx;
  152. white-space: nowrap;
  153. overflow: hidden;
  154. }
  155. }
  156. .scroll-bar {
  157. height: 800rpx;
  158. }
  159. }
  160. }
  161. </style>