ProjectAdmin.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <template>
  2. <div class="d-flex align-items-center project-admin">
  3. <list-body-cell-wrap
  4. :row="row"
  5. :onManager="onManager"
  6. field="admin"
  7. :title="row.admin"
  8. hide-field>
  9. <side-page-trigger v-if="row.admin_id && hasPer" permission="users_get" name="UserSidePage" :id="row.admin_id" :vm="this">{{ row.admin }}</side-page-trigger>
  10. <span v-else>{{row.admin || '-'}}</span>
  11. <a-icon v-if="!visiable" type="edit" class="primary-color ml-2 edit-icon" @click="showForm" />
  12. </list-body-cell-wrap>
  13. <a-popover
  14. v-model="visiable"
  15. :title="$t('iam.modify_sth', [$t('iam.project_admin')])"
  16. trigger="click"
  17. :destroyTooltipOnHide="true">
  18. <a-icon v-if="visiable" type="edit" class="primary-color ml-2" />
  19. <div slot="content" style="width: 300px">
  20. <a-form-model ref="form" :model="form" :rules="rules" v-bind="layout">
  21. <a-form-model-item :label="$t('system.text_6')" prop="admin_id">
  22. <base-select
  23. v-model="form.admin_id"
  24. resource="users"
  25. filterable
  26. remote
  27. :params="userParams"
  28. :select-props="{allowClear: true, placeholder: $t('common.tips.select', [$t('iam.project_admin')])}" />
  29. </a-form-model-item>
  30. <div class="text-right">
  31. <a-button type="primary" @click="handleConfirm">{{ $t('dialog.ok') }}</a-button>
  32. <a-button class="ml-3" @click="cancel">{{ $t('dialog.cancel') }}</a-button>
  33. </div>
  34. </a-form-model>
  35. </div>
  36. </a-popover>
  37. </div>
  38. </template>
  39. <script>
  40. import WindowsMixin from '@/mixins/windows'
  41. import { validateModelForm } from '@/utils/validate'
  42. import { hasPermission } from '@/utils/auth'
  43. export default {
  44. mixins: [WindowsMixin],
  45. props: {
  46. row: {
  47. required: true,
  48. type: Object,
  49. },
  50. manager: {
  51. required: true,
  52. type: Function,
  53. },
  54. },
  55. data () {
  56. return {
  57. visiable: false,
  58. userParams: {
  59. limit: 20,
  60. scope: this.$store.getters.scope,
  61. },
  62. layout: {
  63. labelCol: { span: 8 },
  64. wrapperCol: { span: 16 },
  65. },
  66. form: {
  67. admin_id: this.row.admin_id || undefined,
  68. },
  69. rules: {
  70. admin_id: [{ required: false, message: this.$t('common.tips.select', [this.$t('system.text_6')]) }],
  71. },
  72. }
  73. },
  74. computed: {
  75. hasPer () {
  76. return hasPermission({ key: 'users_list' })
  77. },
  78. },
  79. methods: {
  80. showForm () {
  81. this.visiable = true
  82. },
  83. cancel () {
  84. this.visiable = false
  85. },
  86. async handleConfirm () {
  87. try {
  88. await validateModelForm(this.$refs.form)
  89. await this.manager('performAction', {
  90. id: this.row.id,
  91. managerArgs: {
  92. action: 'set-admin',
  93. data: { user_id: this.form.admin_id },
  94. },
  95. })
  96. this.$emit('ok')
  97. this.cancel()
  98. } catch (err) {
  99. throw err
  100. }
  101. },
  102. },
  103. }
  104. </script>
  105. <style lang="less" scoped>
  106. .edit-icon {
  107. display: none;
  108. }
  109. .project-admin:hover{
  110. .edit-icon {
  111. display: inline-block;
  112. }
  113. }
  114. </style>