SiteManagement.vue 7.5 KB

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