SiteManagement.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. <template>
  2. <div class="app-container">
  3. <div class="filter-container">
  4. <el-form
  5. ref="filter-form"
  6. :model="filter"
  7. v-bind:inline="true"
  8. label-position="left"
  9. label-width="70px"
  10. style="width: 100%;">
  11. <div class="filter-view">
  12. <div class="flex1" style="min-width: 200px; max-width: 350px;">
  13. <el-input
  14. v-model="filter.criteria"
  15. placeholder="Search by Site Name or Address"
  16. @keyup.enter.native="handleFilter" />
  17. </div>
  18. <div>
  19. <el-button
  20. v-waves
  21. type="primary"
  22. icon="el-icon-search"
  23. @click="handleFilter">
  24. Search
  25. </el-button>
  26. </div>
  27. <div class="filter-flex-button">
  28. <el-button
  29. v-if="visible.addButton"
  30. type="primary"
  31. icon="el-icon-plus"
  32. @click="handleClickAddSiteButton">
  33. Add Site
  34. </el-button>
  35. </div>
  36. </div>
  37. </el-form>
  38. </div>
  39. <el-table
  40. :key="tableKey"
  41. v-loading="listLoading"
  42. :data="list"
  43. fit
  44. style="width: 100%;">
  45. <!--el-table-column
  46. label="Site ID"
  47. prop="sitePk"
  48. align="center"
  49. width="80">
  50. <template slot-scope="{row}">
  51. <span>{{ row.sitePk }}</span>
  52. </template>
  53. </el-table-column-->
  54. <el-table-column
  55. label="Site Name"
  56. prop="siteName"
  57. align="center"
  58. width="260">
  59. <template slot-scope="{row}">
  60. <span>{{ row.siteName }}</span>
  61. </template>
  62. </el-table-column>
  63. <el-table-column
  64. label="Address"
  65. prop="siteAddress"
  66. align="center"
  67. min-width="280">
  68. <template slot-scope="{row}">
  69. <span>{{ row.siteAddress }}</span>
  70. </template>
  71. </el-table-column>
  72. <el-table-column
  73. label="Service Provider"
  74. prop="siteName"
  75. align="center">
  76. <template slot-scope="{row}">
  77. <div v-for="item in row.serviceProviders" :key="item">{{item}}</div>
  78. </template>
  79. </el-table-column>
  80. <el-table-column
  81. label="Total Stations"
  82. prop="stationNo"
  83. align="center"
  84. width="100">
  85. <template slot="header" slot-scope="scope">
  86. <div>Stations</div>
  87. <div style="font-size: 0.8em; margin-top: -5px;">(In Use/Total)</div>
  88. </template>
  89. <template slot-scope="{row}">
  90. <span>{{ row.stationInUse || "0" }}/{{ row.stationNo || "0" }}</span>
  91. </template>
  92. </el-table-column>
  93. <!--el-table-column
  94. label="Stations in Use"
  95. prop="stationNo"
  96. align="center">
  97. <template slot-scope="{row}">
  98. <span>{{ row.stationInUse || "0" }}</span>
  99. </template>
  100. </el-table-column-->
  101. <el-table-column
  102. label="Total Connectors"
  103. prop="connectorNo"
  104. align="center"
  105. width="100"
  106. class-name="fixed-width">
  107. <template slot="header" slot-scope="scope">
  108. <div>Connectors</div>
  109. <div style="font-size: 0.8em; margin-top: -5px;">(In Use/Total)</div>
  110. </template>
  111. <template slot-scope="{row}">
  112. <span>{{ row.connectorInUse || "0" }}/{{ row.connectorNo || "0"}}</span>
  113. </template>
  114. </el-table-column>
  115. <!--el-table-column
  116. label="Connectors in Use"
  117. prop="connectorNo"
  118. align="center"
  119. class-name="fixed-width">
  120. <template slot-scope="{row}">
  121. <span>{{ row.connectorInUse || "0" }}</span>
  122. </template>
  123. </el-table-column-->
  124. <el-table-column
  125. v-if="visible.actions"
  126. label="Action"
  127. align="center"
  128. width="200">
  129. <template slot-scope="{row, $index}">
  130. <TableAction
  131. :showDel="visible.actionDelete"
  132. @edit="handleUpdateSite(row, $index)"
  133. @delete="handleDeleteSite(row, $index)"/>
  134. </template>
  135. </el-table-column>
  136. </el-table>
  137. <div class="right">
  138. <pagination
  139. v-show="total > 0"
  140. :total="total"
  141. :page.sync="listQuery.page"
  142. :limit.sync="listQuery.limit"
  143. @pagination="handlePageChange" />
  144. </div>
  145. </div>
  146. </template>
  147. <script>
  148. // waves directive
  149. import waves from '@/directive/waves'
  150. // secondary package based on el-pagination
  151. import Pagination from '@/components/Pagination'
  152. import TableAction from '@/components/TableAction.vue'
  153. import site from '../../http/api/site'
  154. import { getRoleName } from '@/utils/auth'
  155. const {
  156. deleteSite,
  157. getSiteList
  158. } = site;
  159. export default {
  160. name: 'SiteManagement',
  161. components: { Pagination, TableAction },
  162. directives: { waves },
  163. data() {
  164. return {
  165. tableKey: 0,
  166. list: null,
  167. total: 0,
  168. listLoading: true,
  169. filter: {
  170. criteria: '',
  171. },
  172. listQuery: {
  173. page: 1,
  174. limit: 10,
  175. },
  176. visible: {
  177. actions: true,
  178. actionDelete: true,
  179. addButton: true,
  180. },
  181. }
  182. },
  183. created() {
  184. this.getList()
  185. this.setVisible()
  186. },
  187. methods: {
  188. setVisible() {
  189. const role = getRoleName()
  190. if (role === "MCST") {
  191. this.visible.actionDelete = false
  192. this.visible.addButton = false
  193. } else if (this.$route.meta.onlyView) {
  194. this.visible.actions = false
  195. this.visible.addButton = false
  196. }
  197. },
  198. getList() {
  199. this.listLoading = true
  200. getSiteList({
  201. pageSize: this.listQuery.limit,
  202. pageNo: this.listQuery.page,
  203. pageVo: {
  204. criteria: this.filter.criteria,
  205. }
  206. }).then((response) => {
  207. this.list = response.data
  208. this.total = response.total
  209. }).catch(err => {
  210. this.$message({
  211. message: err,
  212. type: 'error'
  213. })
  214. }).finally(() => {
  215. this.listLoading = false
  216. })
  217. },
  218. handlePageChange(value) {
  219. const {limit, page} = value;
  220. this.listQuery.limit = limit;
  221. this.listQuery.page = page;
  222. this.getList();
  223. },
  224. handleFilter() {
  225. this.listQuery.page = 1
  226. this.getList()
  227. },
  228. handleClickAddSiteButton() {
  229. //this.$router.push({ path: '/site-management/add-site' })
  230. this.$router.push({ path: '/site-management/add' })
  231. },
  232. handleUpdateSite(row, index) {
  233. /*this.$store.commit('site/SET_SELECTED_SITE', row)
  234. this.$router.push({ path: '/site-management/update-site' })*/
  235. this.$router.push({ path: '/site-management/edit/' + row.sitePk })
  236. },
  237. handleDeleteSite(row, index) {
  238. this.$confirm(
  239. 'Are you sure you want to delete this site ?',
  240. 'Delete',
  241. {
  242. confirmButtonText: 'OK',
  243. cancelButtonText: 'Cancel',
  244. type: 'warning'
  245. },
  246. ).then(res => {
  247. deleteSite({ sitePk: row.sitePk }).then(() => {
  248. this.$message({
  249. message: `delete site success ${row.siteName}`,
  250. type: "success",
  251. duration: 3000,
  252. })
  253. this.list.splice(index, 1)
  254. }).catch(error => {
  255. this.$message({
  256. message: error,
  257. type: "error",
  258. duration: 3000,
  259. })
  260. })
  261. })
  262. },
  263. }
  264. }
  265. </script>