table.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <!--
  2. * @Author : yuanrunwei
  3. * @Date : 2021-11-01 18:02:58
  4. * @LastEditors: daiqisheng
  5. * @LastEditTime: 2022-04-07 15:21:38
  6. * @FilePath : /spfm-market-front/src/pages/main/performance/components/table.vue
  7. -->
  8. <template>
  9. <el-table
  10. class="simple-table"
  11. :data="computed_list"
  12. v-loading="loading"
  13. @selection-change="handleSelectionChange"
  14. >
  15. <el-table-column
  16. type="selection"
  17. width="55"
  18. :selectable="selectable"
  19. v-if="multiple"
  20. />
  21. <el-table-column
  22. v-for="(
  23. { props, label, type, width, align, children, dictionary, control },
  24. index
  25. ) in config"
  26. :key="index"
  27. :prop="props"
  28. :width="width"
  29. :label="label"
  30. :align="align || 'center'"
  31. >
  32. <template #default="scope">
  33. <div v-if="type === 'edit'">
  34. <el-input
  35. v-if="scope.row[`edit`]"
  36. v-model="scope.row[props]"
  37. autosize
  38. type="textarea"
  39. @change="handleModify"
  40. />
  41. </div>
  42. <div v-if="type === 'number'">{{ scope.$index + 1 }}</div>
  43. <div v-else-if="type === 'textarea'">
  44. <pre class="simple-table-break">{{ scope.row[props] }}</pre>
  45. </div>
  46. <div v-else-if="type === 'date'">
  47. <div>{{ $formatDate(scope.row[props], "YYYY-MM-DD") }}</div>
  48. </div>
  49. <div v-else-if="type === 'time'">
  50. <div>
  51. {{ $formatDate(scope.row[props], "YYYY-MM-DD HH:00:00") }}
  52. </div>
  53. </div>
  54. <div v-else-if="type === 'click'">
  55. <div
  56. v-if="control && Number(scope.row[control]) < 1 && scope.row[props]"
  57. >
  58. <span
  59. v-for="(item, index) in scope.row[props].split(',')"
  60. :key="index"
  61. class="simple-table-click cursor-pointer"
  62. @click="handleClick(props, { ...scope.row, index })"
  63. >
  64. {{ scope.row[props].split(",")[index] }}
  65. </span>
  66. </div>
  67. <div
  68. v-else-if="!control"
  69. class="simple-table-click cursor-pointer"
  70. @click="handleClick(props, scope.row)"
  71. >
  72. {{ scope.row[props] }}
  73. </div>
  74. <div v-else class="cursor-pointer">
  75. {{ scope.row[props] }}
  76. </div>
  77. </div>
  78. <div v-else-if="type === 'dictionary'">
  79. {{ dictionary[scope.row[props]] }}
  80. </div>
  81. <div v-else-if="type === 'file'">
  82. <div v-if="scope.row[props] && scope.row[props].length">
  83. <div
  84. v-for="({ fileName }, index) in scope.row[props]"
  85. :key="index"
  86. @click="downloadFile({ index, rows: scope.row })"
  87. class="simple-table-click cursor-pointer margin-left-10"
  88. >
  89. {{ fileName }}
  90. </div>
  91. </div>
  92. <div v-else></div>
  93. </div>
  94. <div v-else>{{ scope.row[props] }}</div>
  95. </template>
  96. <template v-if="children">
  97. <el-table-column
  98. v-for="({ props, label, width, align, type }, index) in children"
  99. :key="index"
  100. :prop="props"
  101. :width="width"
  102. :label="label"
  103. :align="align || 'center'"
  104. >
  105. <template #default="scope">
  106. <div v-if="type === 'edit'">
  107. <el-input
  108. v-model="scope.row[props]"
  109. @change="handleModify"
  110. autosize
  111. type="textarea"
  112. />
  113. </div>
  114. <div v-else>{{ scope.row[props] }}</div>
  115. </template>
  116. <!-- <template v-if="variable">
  117. <div>{{ scope.row[props] }}</div>
  118. </template> -->
  119. </el-table-column>
  120. </template>
  121. </el-table-column>
  122. <el-table-column
  123. v-if="handleRow.length"
  124. label="操作"
  125. :align="'center'"
  126. :width="handleRow.length * 50"
  127. >
  128. <template slot-scope="scope">
  129. <span
  130. v-for="({ label, props, popconfirm, visible }, index) in handleRow"
  131. :key="index"
  132. class="padding-right-5"
  133. >
  134. <span v-if="handleFormat(visible, scope.row)">
  135. <!-- <el-popconfirm
  136. v-if="popconfirm"
  137. :title="`确定要${label}吗?`"
  138. @confirm="handleClick(props, scope.row)"
  139. @cancel="handleCancel"
  140. >
  141. <el-button slot="reference" type="text" size="small">{{
  142. label
  143. }}</el-button>
  144. </el-popconfirm> -->
  145. <el-button
  146. v-if="popconfirm"
  147. type="text"
  148. size="small"
  149. @click="handleConfirm(label, props, scope.row)"
  150. >{{ label }}</el-button
  151. >
  152. <el-button
  153. v-else
  154. @click="handleClick(props, scope.row)"
  155. type="text"
  156. size="small"
  157. >{{ label }}</el-button
  158. >
  159. </span>
  160. </span>
  161. </template>
  162. </el-table-column>
  163. </el-table>
  164. </template>
  165. <script>
  166. export default {
  167. props: {
  168. list: {
  169. type: Array,
  170. default: () => [],
  171. },
  172. config: {
  173. type: Array,
  174. default: () => [],
  175. },
  176. multiple: {
  177. type: Boolean,
  178. default: false,
  179. },
  180. selectable: {
  181. type: Function,
  182. },
  183. loading: {
  184. type: Boolean,
  185. default: false,
  186. },
  187. handleRow: {
  188. type: Array,
  189. default: () => [],
  190. },
  191. },
  192. computed: {
  193. computed_list() {
  194. return this.list.map((element) => ({
  195. ...element,
  196. }));
  197. },
  198. },
  199. methods: {
  200. handleFormat(params, data) {
  201. let visible = true;
  202. if (params) {
  203. visible = false;
  204. if (Object.keys(params).length === 1) {
  205. Object.keys(params).forEach((element) => {
  206. if (params[element].includes(data[element])) {
  207. visible = true;
  208. }
  209. });
  210. } else {
  211. let sum = 0;
  212. if (Object.keys(params).indexOf("flag") && params["flag"] === "or") {
  213. Object.keys(params).forEach((element) => {
  214. if (params[element].includes(data[element])) {
  215. visible = true;
  216. }
  217. });
  218. } else {
  219. Object.keys(params).forEach((element) => {
  220. if (params[element].includes(data[element])) {
  221. sum = sum + 1;
  222. }
  223. });
  224. if (Object.keys(params).length === sum) {
  225. visible = true;
  226. } else {
  227. visible = false;
  228. }
  229. }
  230. }
  231. }
  232. return visible;
  233. },
  234. handleConfirm(label, props, row) {
  235. this.$confirm(`确定要${label}吗?`, "提示", {
  236. confirmButtonText: "确定",
  237. cancelButtonText: "取消",
  238. type: "error",
  239. })
  240. .then(() => {
  241. this.$emit(props, row);
  242. })
  243. .catch(() => {
  244. console.log("error");
  245. });
  246. },
  247. handleClick(props, row) {
  248. this.$emit(props, row);
  249. },
  250. handleCancel() {
  251. console.log("我被关闭了");
  252. },
  253. handleSelectionChange(val) {
  254. this.$emit("selection", val);
  255. },
  256. downloadFile(val) {
  257. this.$emit("download", val);
  258. },
  259. handleModify() {
  260. this.$emit("modify", this.computed_list);
  261. },
  262. },
  263. };
  264. </script>