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.

265 lines
8.3 KiB

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
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
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
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
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
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
3 years ago
3 years ago
3 years ago
3 years ago
  1. <template>
  2. <el-row>
  3. <div :class="{'field-box':true,'small':size=='small','medium':size=='medium'}">
  4. <el-avatar :size="size" 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 :size="size" 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. return obj;
  74. }
  75. },
  76. data(){
  77. return {
  78. myVal:{userid:'',username:'',headimgurl:''},
  79. users:[],
  80. deptUserVisible:false,
  81. projectVisible:false,
  82. }
  83. },
  84. watch:{
  85. value:{
  86. handler(){
  87. this.initData();
  88. },
  89. deep:true,
  90. },
  91. myVal(){
  92. if(!this.myVal||!this.myVal.userid){
  93. if(this.value && this.value[this.useridKey]){
  94. this.value[this.useridKey]=""
  95. this.value[this.usernameKey]=""
  96. this.$emit('input',this.value)
  97. }
  98. }else{
  99. if(this.value){
  100. if(this.value[this.useridKey]!=this.myVal.userid){
  101. this.value[this.useridKey]=this.myVal.userid
  102. this.value[this.usernameKey]=this.myVal.username
  103. this.$emit('input',this.value)
  104. }
  105. }
  106. }
  107. }
  108. },
  109. props: {
  110. size:{
  111. type:String,
  112. default:'small',// medium/small/mini
  113. },
  114. projectId:{
  115. type:String,
  116. default:''
  117. },
  118. disabled:{
  119. type:Boolean,
  120. default:false,
  121. },
  122. label:{
  123. type:String,
  124. default:''
  125. },
  126. clearable:{
  127. type:Boolean,
  128. default:false,
  129. },
  130. value: {
  131. },
  132. useridKey: {
  133. type: String,
  134. default: 'userid'
  135. },
  136. usernameKey: {
  137. type: String,
  138. default: 'username'
  139. },
  140. },
  141. methods: {
  142. ...imtUtil,
  143. isEmpty(v) {
  144. switch (typeof v) {
  145. case 'undefined':
  146. return true;
  147. case 'string':
  148. if(v.length == 0) return true;
  149. break;
  150. case 'object':
  151. if (null === v || v.length === 0) return true;
  152. for (var i in v) {
  153. return false;
  154. }
  155. return true;
  156. }
  157. return false;
  158. },
  159. getMyColor(item){
  160. if(item&&item.userid){
  161. if(this.getColor){
  162. return this.getColor(item.userid)
  163. }
  164. return util.getColor(item.userid)
  165. }else{
  166. if(this.getColor){
  167. return this.getColor("0")
  168. }else{
  169. return util.getColor(0)
  170. }
  171. }
  172. },
  173. getMyIcon(item){
  174. if(item){
  175. if(this.getIcon){
  176. return this.getIcon(item)
  177. }
  178. return "el-icon-user";
  179. }else{
  180. if(this.getIcon){
  181. return this.getIcon(this.myVal)
  182. }else{
  183. return "el-icon-user"
  184. }
  185. }
  186. },
  187. initData(){
  188. var myVal={}
  189. if(this.value){
  190. myVal.userid=this.value[this.useridKey]
  191. myVal.username=this.value[this.usernameKey]
  192. this.myVal=myVal
  193. }else{
  194. this.myVal={userid:'',username:'',headimgurl:''}
  195. }
  196. },
  197. onSelectChange(item){
  198. this.onChange([item])
  199. },
  200. onChange(data){
  201. this.$emit('change',data)
  202. },
  203. onConfirmUsers(users){
  204. this.onChange(users)
  205. this.myVal=users[0]
  206. this.deptUserVisible=false;
  207. var notHad=false;
  208. users.forEach(u=>{
  209. if(!this.users.some(k=>k.userid==u.userid)){
  210. notHad=true;
  211. this.users.unshift(u)
  212. }
  213. })
  214. if(notHad){
  215. var us=JSON.stringify(this.users)
  216. localStorage.setItem("mdp-his-users",us)
  217. }
  218. }
  219. },
  220. mounted(){
  221. var us=localStorage.getItem("mdp-his-users")
  222. this.users=us?JSON.parse(us):[]
  223. this.initData();
  224. }
  225. }
  226. </script>
  227. <style lang="scss" scoped>
  228. @import '../Mdp/index.scss';
  229. </style>