index.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. <template>
  2. <el-card>
  3. <div>
  4. <pure-table
  5. row-key="id"
  6. align-whole="center"
  7. :header-cell-style="{
  8. background: 'var(--el-fill-color-light)',
  9. color: 'var(--el-text-color-primary)'
  10. }"
  11. :columns="columns"
  12. :table-key="tableKey"
  13. border
  14. adaptive
  15. :adaptiveConfig="adaptiveConfig"
  16. showOverflowTooltip
  17. :loading="false"
  18. :loading-config="loadingConfig"
  19. :data="
  20. dataList.slice(
  21. (pagination.currentPage - 1) * pagination.pageSize,
  22. pagination.currentPage * pagination.pageSize
  23. )
  24. "
  25. :pagination="pagination"
  26. @page-size-change="onSizeChange"
  27. @page-current-change="onCurrentChange"
  28. >
  29. <template #operation="{ row, index }">
  30. <div v-if="!editMap[index]?.editable">
  31. <el-button
  32. v-if="
  33. useUserStoreHook().existsRole(['opt', 'admin', 'eng', 'root'])
  34. "
  35. class="reset-margin"
  36. link
  37. type="primary"
  38. :icon="useRenderIcon(Delete)"
  39. @click="handleDeleteProject(row)"
  40. >
  41. 删除
  42. </el-button>
  43. <el-button
  44. v-if="
  45. useUserStoreHook().existsRole(['opt', 'admin', 'eng', 'root'])
  46. "
  47. class="reset-margin"
  48. link
  49. type="primary"
  50. @click="handleEditProject(row)"
  51. :icon="useRenderIcon(EditFill)"
  52. >
  53. 修改
  54. </el-button>
  55. <el-button
  56. class="reset-margin"
  57. link
  58. type="primary"
  59. :icon="useRenderIcon(OpenPreview)"
  60. @click="handleViewProject(row)"
  61. >
  62. 查看
  63. </el-button>
  64. </div>
  65. <div v-if="editMap[index]?.editable">
  66. <el-button
  67. class="reset-margin"
  68. link
  69. type="primary"
  70. @click="onSave(index)"
  71. :icon="useRenderIcon(SaveFill)"
  72. >
  73. 保存
  74. </el-button>
  75. <el-button
  76. class="reset-margin"
  77. link
  78. @click="onCancel(index)"
  79. :icon="useRenderIcon(Close)"
  80. >
  81. 取消
  82. </el-button>
  83. </div>
  84. </template>
  85. </pure-table>
  86. </div>
  87. <el-dialog
  88. v-model="dlgAddProjectVisible"
  89. title="项目信息"
  90. width="60%"
  91. :before-close="handleDlgClose"
  92. destroy-on-close
  93. top="6vh"
  94. >
  95. <EditProject
  96. :selProject="selProject"
  97. :swEditable="swEditable"
  98. @onSubmitData="onSubmitProjectData"
  99. />
  100. <!-- <template #footer>
  101. <span class="dialog-footer">
  102. <el-button @click="dlgAddProjectVisible = false">取消</el-button>
  103. <el-button type="primary" @click="handleDlgConfirm">
  104. 导入
  105. </el-button>
  106. </span>
  107. </template> -->
  108. </el-dialog>
  109. </el-card>
  110. </template>
  111. <script setup lang="ts">
  112. import { ref, onMounted } from "vue";
  113. import { useColumns } from "./columns";
  114. import Empty from "../empty.svg?component";
  115. import { useRenderIcon } from "@/components/ReIcon/src/hooks";
  116. import AddFill from "~icons/ep/plus";
  117. import Delete from "~icons/ep/delete";
  118. import EditFill from "~icons/ep/edit";
  119. import SaveFill from "~icons/bi/save";
  120. import Close from "~icons/ep/close";
  121. import OpenPreview from "~icons/codicon/open-preview";
  122. import { ElMessage, ElMessageBox, ElNotification } from "element-plus";
  123. import * as XLSX from "xlsx";
  124. import importExcel from "./importExcel.vue";
  125. import EditProject from "./edit.vue";
  126. import Project from "@/model/project.js";
  127. import { useUserStoreHook } from "@/store/modules/user";
  128. const {
  129. loading,
  130. editMap,
  131. columns,
  132. dataList,
  133. options,
  134. pagination,
  135. loadingConfig,
  136. adaptiveConfig,
  137. onSave,
  138. onCancel,
  139. onDel,
  140. onSizeChange,
  141. onCurrentChange
  142. } = useColumns();
  143. const swEditable = ref(true);
  144. const tableKey = ref(0);
  145. const vGlobal = window.vueGlobal;
  146. const dlgAddProjectVisible = ref(false);
  147. const selProject = ref(new Project());
  148. const reloadProjects = () => {
  149. vGlobal.refreshProjects(() => {
  150. dataList.value = [];
  151. dataList.value = vGlobal.vecProject.filter(item => item.status == 2); // 深拷贝,触发视图更新
  152. console.log("reloadProjects", dataList.value);
  153. tableKey.value += 1;
  154. pagination.total = dataList.value.length;
  155. });
  156. };
  157. const handleAddProject = () => {
  158. swEditable.value = true;
  159. selProject.value = new Project();
  160. dlgAddProjectVisible.value = true;
  161. };
  162. const handleEditProject = (row: Project) => {
  163. swEditable.value = true;
  164. selProject.value = row;
  165. dlgAddProjectVisible.value = true;
  166. };
  167. const handleViewProject = (row: Project) => {
  168. swEditable.value = false;
  169. selProject.value = new Project(row);
  170. dlgAddProjectVisible.value = true;
  171. };
  172. const handleDeleteProject = (row: Project) => {
  173. ElMessageBox.confirm("确定删除项目?删除后将无法撤回", "Warning", {
  174. confirmButtonText: "确认",
  175. cancelButtonText: "取消",
  176. type: "warning"
  177. })
  178. .then(() => {
  179. vGlobal.deleteProject(row, () => {
  180. ElNotification.success({
  181. message: "删除成功"
  182. });
  183. reloadProjects();
  184. });
  185. })
  186. .catch(() => {});
  187. };
  188. const onSubmitProjectData = (data: Project) => {
  189. const proj = new Project(data);
  190. ElMessageBox.confirm("确定更新项目数据?更新后将无法撤回", "Warning", {
  191. confirmButtonText: "确认",
  192. cancelButtonText: "取消",
  193. type: "warning"
  194. })
  195. .then(() => {
  196. ElNotification.info({
  197. message: "开始更新"
  198. });
  199. const vec = [];
  200. for (const v of dataList.value) {
  201. vec.push(v);
  202. }
  203. vGlobal.updateProject(proj, () => {
  204. ElNotification.success({
  205. message: "更新成功"
  206. });
  207. reloadProjects();
  208. dlgAddProjectVisible.value = false;
  209. });
  210. })
  211. .catch(() => {
  212. // ElMessage({
  213. // type: 'info',
  214. // message: 'Delete canceled',
  215. // })
  216. });
  217. };
  218. const handleDlgClose = (done: () => void) => {
  219. ElMessageBox.confirm("确定要关闭这个对话框吗?")
  220. .then(() => {
  221. done();
  222. })
  223. .catch(() => {
  224. // catch error
  225. });
  226. };
  227. onMounted(() => {
  228. reloadProjects();
  229. });
  230. </script>