You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

259 lines
8.2 KiB

4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
  1. <template>
  2. <el-row>
  3. <div class="field-box">
  4. <el-avatar class="avater" :class="{'dashed-circle':avaterCpd.isNull}" :style="{backgroundColor:avaterCpd.color}" :src="getHeadimgurl(avaterCpd.userid,avaterCpd.headimgurl)" @error="onImgError(avaterCpd.userid,$event)">{{avaterCpd.innerText}}</el-avatar>
  5. <div class="field-info" :class="{disabled:disabled===true,enabled:disabled!==true}">
  6. <slot name="info" :value="myVal">
  7. <span class="field-value" v-if="!avaterCpd.isNull">{{avaterCpd.innerText}} </span>
  8. <span class="field-value" v-else><span class="label-font-color"></span></span>
  9. <slot name="label">
  10. <span class="field-label">{{label}}</span>
  11. </slot>
  12. </slot>
  13. </div>
  14. <div v-if="disabled!==true" class="field-oper" :value="myVal" :class="{disabled:disabled===true,enabled:disabled!==true}">
  15. <slot name="oper">
  16. <el-select v-model="myVal" @change="onSelectChange" :clearable="clearable" value-key="userid" @visible-change="$emit('visible-change',$event)" @focus="$emit('focus',$event)" @blur="$emit('blur',$event)" @clear="$emit('blur',$event)" @click="$emit('click',$event)">
  17. <el-option disabled value="" style="margin-bottom:5px;">
  18. <el-row><el-button :type="deptUserVisible?'':'primary'" @click.stop="deptUserVisible=false">常用用户</el-button> <el-button :type="deptUserVisible?'primary':''" @click.stop="deptUserVisible=true"></el-button><el-button v-if="projectId" :type="projectVisible?'primary':''" @click.stop="projectVisible=true"></el-button> </el-row>
  19. </el-option>
  20. <el-option class="avatar-container" v-for="(item,index) in users" :key="index" :value="item" :label="item.username">
  21. <div class="avatar-wrapper">
  22. <el-avatar class="user-avatar" :style="{backgroundColor:getMyColor(item)}" :src="getHeadimgurl(item.userid,item.headimgurl)" @error="onImgError(item.userid,$event)">{{item.username}}</el-avatar>
  23. <span class="username">{{item.username}}</span>
  24. <i v-if=" myVal && myVal.userid==item.userid" class="el-icon-check"></i>
  25. <i v-else>&nbsp;&nbsp;</i>
  26. </div>
  27. </el-option>
  28. </el-select>
  29. <slot name="extOper">
  30. </slot>
  31. </slot>
  32. </div>
  33. </div>
  34. <el-dialog :visible.sync="deptUserVisible" append-to-body top="20px" width="60%">
  35. <users-select :visible="deptUserVisible" :isSingleUser="true" :isSelectByDept="true" @confirm="onConfirmUsers"></users-select>
  36. </el-dialog>
  37. </el-row>
  38. </template>
  39. <script>
  40. import util from '@/common/js/util';//全局公共库
  41. import imtUtil from '@/api/imgUtil';//全局公共库
  42. import UsersSelect from '@/views/mdp/sys/user/UsersSelectOnly.vue'
  43. export default {
  44. name: 'mdp-select-user-x',
  45. components: { UsersSelect, },
  46. computed: {
  47. avaterCpd(){
  48. var isEmpty=this.isEmpty(this.myVal)
  49. var username=isEmpty?"":(this.myVal.username?this.myVal.username:this.myVal.userid)
  50. var obj={isNull:isEmpty,icon:'el-icon-user',color:'#E4E7ED',innerText:username,userid:'',headimgurl:''}
  51. if(!isEmpty){
  52. obj.headimgurl=this.myVal.headimgurl
  53. obj.userid=this.myVal.userid
  54. }
  55. if(this.getColor||this.color){
  56. if(this.getColor){
  57. obj.color= this.getColor(this.myVal)
  58. }else{
  59. obj.color=this.color
  60. }
  61. }else{
  62. if(!isEmpty){
  63. obj.color= util.getColor(this.myVal.userid)
  64. }
  65. }
  66. if(this.getIcon||this.icon){
  67. if(this.getIcon){
  68. obj.icon= this.getIcon(this.myVal)
  69. }else if(this.icon){
  70. obj.icon=this.icon
  71. }
  72. }
  73. debugger;
  74. return obj;
  75. }
  76. },
  77. data(){
  78. return {
  79. myVal:{userid:'',username:'',headimgurl:''},
  80. users:[],
  81. deptUserVisible:false,
  82. projectVisible:false,
  83. }
  84. },
  85. watch:{
  86. value:{
  87. handler(){
  88. this.initData();
  89. },
  90. deep:true,
  91. },
  92. myVal(){
  93. if(!this.myVal||!this.myVal.userid){
  94. if(this.value && this.value[this.useridKey]){
  95. this.value[this.useridKey]=""
  96. this.value[this.usernameKey]=""
  97. this.$emit('input',this.value)
  98. }
  99. }else{
  100. if(this.value){
  101. if(this.value[this.useridKey]!=this.myVal.userid){
  102. this.value[this.useridKey]=this.myVal.userid
  103. this.value[this.usernameKey]=this.myVal.username
  104. this.$emit('input',this.value)
  105. }
  106. }
  107. }
  108. }
  109. },
  110. props: {
  111. projectId:{
  112. type:String,
  113. default:''
  114. },
  115. disabled:{
  116. type:Boolean,
  117. default:false,
  118. },
  119. label:{
  120. type:String,
  121. default:''
  122. },
  123. clearable:{
  124. type:Boolean,
  125. default:false,
  126. },
  127. value: {
  128. },
  129. useridKey: {
  130. type: String,
  131. default: 'userid'
  132. },
  133. usernameKey: {
  134. type: String,
  135. default: 'username'
  136. },
  137. },
  138. methods: {
  139. ...imtUtil,
  140. isEmpty(v) {
  141. switch (typeof v) {
  142. case 'undefined':
  143. return true;
  144. case 'string':
  145. if(v.length == 0) return true;
  146. break;
  147. case 'object':
  148. if (null === v || v.length === 0) return true;
  149. for (var i in v) {
  150. return false;
  151. }
  152. return true;
  153. }
  154. return false;
  155. },
  156. getMyColor(item){
  157. if(item&&item.userid){
  158. if(this.getColor){
  159. return this.getColor(item.userid)
  160. }
  161. return util.getColor(item.userid)
  162. }else{
  163. if(this.getColor){
  164. return this.getColor("0")
  165. }else{
  166. return util.getColor(0)
  167. }
  168. }
  169. },
  170. getMyIcon(item){
  171. if(item){
  172. if(this.getIcon){
  173. return this.getIcon(item)
  174. }
  175. return "el-icon-user";
  176. }else{
  177. if(this.getIcon){
  178. return this.getIcon(this.myVal)
  179. }else{
  180. return "el-icon-user"
  181. }
  182. }
  183. },
  184. initData(){
  185. var myVal={}
  186. if(this.value){
  187. myVal.userid=this.value[this.useridKey]
  188. myVal.username=this.value[this.usernameKey]
  189. this.myVal=myVal
  190. }else{
  191. this.myVal={userid:'',username:'',headimgurl:''}
  192. }
  193. },
  194. onSelectChange(item){
  195. this.onChange([item])
  196. },
  197. onChange(data){
  198. this.$emit('change',data)
  199. },
  200. onConfirmUsers(users){
  201. this.onChange(users)
  202. this.myVal=users[0]
  203. this.deptUserVisible=false;
  204. var notHad=false;
  205. users.forEach(u=>{
  206. if(!this.users.some(k=>k.userid==u.userid)){
  207. notHad=true;
  208. this.users.unshift(u)
  209. }
  210. })
  211. if(notHad){
  212. var us=JSON.stringify(this.users)
  213. localStorage.setItem("mdp-his-users",us)
  214. }
  215. }
  216. },
  217. mounted(){
  218. var us=localStorage.getItem("mdp-his-users")
  219. this.users=us?JSON.parse(us):[]
  220. this.initData();
  221. }
  222. }
  223. </script>
  224. <style lang="scss" scoped>
  225. @import '../Mdp/index.scss';
  226. </style>