index.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <template>
  2. <span class="ibps-actions">
  3. <template v-for="(button,index) in actions">
  4. <!--只显示图标-->
  5. <template v-if="type === 'icon'">
  6. <el-tooltip
  7. v-if="handleActionHidden(button.hidden)"
  8. :key="button.key+index"
  9. v-permission="button.permission"
  10. :content="getLabel(button)"
  11. :disabled="handleActionDisabled(button.disabled)"
  12. placement="bottom-start"
  13. >
  14. <el-button
  15. :key="button.key+index"
  16. :name="button.key"
  17. :size="button.size|| $ELEMENT.size "
  18. :type="getType(button)"
  19. :icon="getIcon(button)"
  20. :disabled="handleActionDisabled(button.disabled)"
  21. class="action-icon"
  22. @click="emitEventHandler('action-event',button,position,data,index)"
  23. />
  24. </el-tooltip>
  25. </template>
  26. <template v-else-if="type==='link'">
  27. <el-link
  28. v-if="handleActionHidden(button.hidden)"
  29. :key="button.key+index"
  30. :type="getType(button)"
  31. :icon="getIcon(button)"
  32. :disabled="handleActionDisabled(button.disabled)"
  33. @click="emitEventHandler('action-event',button,position,data,index)"
  34. >
  35. {{ button.label }}
  36. </el-link>
  37. <el-divider v-if="(actions.length == 2 && index == 0) || (actions.length == 3 && index != 2)" :key="index" direction="vertical" />
  38. </template>
  39. <template v-else-if="type==='linkHide'">
  40. <p>
  41. <el-link
  42. v-if="handleActionHidden(button.hidden)"
  43. :key="button.key+index"
  44. :type="getType(button)"
  45. :icon="getIcon(button)"
  46. :disabled="handleActionDisabled(button.disabled)"
  47. @click="emitEventHandler('action-event',button,position,data,index)"
  48. >
  49. {{ button.label }}
  50. </el-link>
  51. </p>
  52. </template>
  53. <template v-else>
  54. <!--下拉-->
  55. <template v-if="button.mode === 'dropdown'">
  56. <el-dropdown
  57. :key="button.key"
  58. :hide-on-click="false"
  59. @command="(action)=> { emitEventHandler('action-event',action,position,data,index) }"
  60. >
  61. <span v-if="button.buttonType==='link'" class="el-dropdown-link">
  62. {{ button.label }}<i v-if="hasRighticon(button.rightIcon)" class="el-icon-arrow-down el-icon--right" />
  63. </span>
  64. <el-button v-else :type="getType(button)" size="mini" :icon="getIcon(button)">
  65. {{ button.label }}<i v-if="hasRighticon(button.rightIcon)" class="el-icon-arrow-down el-icon--right" />
  66. </el-button>
  67. <el-dropdown-menu v-if="button.menus && button.menus.length >0" slot="dropdown">
  68. <el-dropdown-item
  69. v-for="menu in button.menus"
  70. :key="menu.key"
  71. :command="menu"
  72. :icon="getIcon(menu)"
  73. >{{ getLabel(menu) }}</el-dropdown-item>
  74. </el-dropdown-menu>
  75. </el-dropdown>
  76. </template>
  77. <!--默认-->
  78. <template v-else>
  79. <el-button
  80. v-if="handleActionHidden(button.hidden)"
  81. :key="button.key+index"
  82. v-permission="button.permission"
  83. :name="button.key"
  84. :size="button.size|| 'mini' "
  85. :type="getType(button)"
  86. :icon="getIcon(button)"
  87. :disabled="handleActionDisabled(button.disabled)"
  88. :autofocus="false"
  89. @click="emitEventHandler('action-event',button,position,data,index)"
  90. >{{ getLabel(button) }}</el-button>
  91. </template>
  92. </template>
  93. </template>
  94. </span>
  95. </template>
  96. <script>
  97. import { getButtonIcon, getButtonType } from '@/utils/button'
  98. import permission from '@/directives/permission/index.js' // 权限判断指令
  99. // 工具类
  100. export default {
  101. name: 'ibps-toolbar',
  102. directives: { permission },
  103. props: {
  104. type: {
  105. type: String,
  106. default: 'button'
  107. },
  108. actions: {
  109. type: Array,
  110. default: () => { return [] }
  111. },
  112. position: {
  113. type: String,
  114. default: 'toolbar'
  115. },
  116. data: Object,
  117. socpe: {
  118. type: Object,
  119. default: () => { return this }
  120. }
  121. },
  122. data() {
  123. return {
  124. buttonStatus: true,
  125. stopTime: null
  126. }
  127. },
  128. methods: {
  129. emitEventHandler(event) {
  130. if (this.buttonStatus) {
  131. this.buttonStatus = false
  132. this.$emit(event, ...Array.from(arguments).slice(1))
  133. }
  134. this.setButton()
  135. },
  136. setButton() { // 添加一个定时器,点击之后延时100ms,防二次点击
  137. clearTimeout(this.stopTime)
  138. this.stopTime = setTimeout(() => {
  139. this.buttonStatus = true
  140. }, 100)
  141. },
  142. /**
  143. * 处理按钮隐藏,显示
  144. */
  145. handleActionHidden(hidden = false) {
  146. let isHidden = !hidden
  147. if (typeof hidden === 'boolean') {
  148. isHidden = !hidden
  149. } else if (typeof hidden === 'function') {
  150. isHidden = !hidden.call(this.socpe, this.data)
  151. }
  152. return isHidden
  153. },
  154. /**
  155. * 处理按钮禁用,显示disabled 的方法
  156. */
  157. handleActionDisabled(disabled = false) {
  158. if (typeof disabled === 'boolean') {
  159. return disabled
  160. } else if (typeof disabled === 'function') {
  161. return disabled.call(this.socpe, this.data)
  162. }
  163. return Boolean(disabled)
  164. },
  165. getLabel({ label, key }) {
  166. if (label) return label =='搜索' ? '查询': label
  167. return this.$te('common.buttons.' + key) ? this.$t('common.buttons.' + key) : key
  168. },
  169. getIcon({ icon, key }) {
  170. if (icon) { return icon }
  171. return getButtonIcon(key)
  172. },
  173. getType({ type, key }) {
  174. if (type) { return type }
  175. return getButtonType(key)
  176. },
  177. hasRighticon(rightIcon) {
  178. if (rightIcon) { return true }
  179. return true
  180. }
  181. }
  182. }
  183. </script>