SiteManagement.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. <template>
  2. <div class="app-container">
  3. <div class="filter-container">
  4. <div class="filter-view">
  5. <el-select
  6. class="filter-view-item"
  7. v-model="filter.pageVo.providerPk"
  8. placeholder="Service Provider"
  9. @change="handleFilter"
  10. clearable>
  11. <el-option
  12. v-for="(item, index) in providerOptions"
  13. :key="index"
  14. :label="item.providerName"
  15. :value="item.providerPk"/>
  16. </el-select>
  17. <div class="flex1" style="max-width: 350px;">
  18. <el-input
  19. v-model="filter.pageVo.criteria"
  20. prefix-icon="el-icon-search"
  21. placeholder="Search by Site Name, Address, Carpark Code"
  22. @keyup.enter.native="handleFilter"
  23. @change="handleFilter"
  24. clearable/>
  25. </div>
  26. <div>
  27. <el-button
  28. v-waves
  29. type="primary"
  30. icon="el-icon-search"
  31. @click="handleFilter">
  32. Search
  33. </el-button>
  34. </div>
  35. <div class="filter-flex-button">
  36. <el-button
  37. v-if="visible.addButton"
  38. type="primary"
  39. icon="el-icon-plus"
  40. @click="handleClickAddSiteButton">
  41. Add Site
  42. </el-button>
  43. </div>
  44. </div>
  45. </div>
  46. <el-table
  47. :key="tableKey"
  48. v-loading="listLoading"
  49. :data="list"
  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. min-width="260">
  65. <template slot-scope="{row}">
  66. <span>{{ row.siteName }}</span>
  67. </template>
  68. </el-table-column>
  69. <el-table-column
  70. label="Carpark Code"
  71. prop="carParkCode"
  72. align="center"
  73. min-width="125"/>
  74. <el-table-column
  75. label="Address"
  76. prop="siteAddress"
  77. align="center"
  78. min-width="280">
  79. <template slot-scope="{row}">
  80. <span>{{ row.siteAddress }}</span>
  81. </template>
  82. </el-table-column>
  83. <el-table-column
  84. label="Service Provider"
  85. prop="siteName"
  86. align="center"
  87. min-width="180">
  88. <template slot-scope="{row}">
  89. <div
  90. v-for="item in row.serviceProviders"
  91. :key="item">
  92. {{item}}
  93. </div>
  94. </template>
  95. </el-table-column>
  96. <el-table-column
  97. label="Rate Plan"
  98. prop="siteName"
  99. align="center"
  100. min-width="200">
  101. <template slot-scope="{row}" v-if="row.dynamicRates">
  102. <div
  103. v-for="(item,index) in row.dynamicRates"
  104. :key="index"
  105. style="cursor: alias;"
  106. @click="viewRateDialog(row)">
  107. {{item}}
  108. </div>
  109. </template>
  110. </el-table-column>
  111. <el-table-column
  112. label="Total Stations"
  113. prop="stationNo"
  114. align="center"
  115. min-width="100">
  116. <template slot="header" slot-scope="scope">
  117. <div>Stations</div>
  118. <div style="font-size: 0.8em; margin-top: -5px;">(In Use/Total)</div>
  119. </template>
  120. <template slot-scope="{row}">
  121. <span>{{ row.stationInUse || "0" }}/{{ row.stationNo || "0" }}</span>
  122. </template>
  123. </el-table-column>
  124. <el-table-column
  125. label="Total Connectors"
  126. prop="connectorNo"
  127. align="center"
  128. min-width="100"
  129. class-name="fixed-width">
  130. <template slot="header" slot-scope="scope">
  131. <div>Connectors</div>
  132. <div style="font-size: 0.8em; margin-top: -5px;">(In Use/Total)</div>
  133. </template>
  134. <template slot-scope="{row}">
  135. <span>{{ row.connectorInUse || "0" }}/{{ row.connectorNo || "0"}}</span>
  136. </template>
  137. </el-table-column>
  138. <!--el-table-column
  139. label="Connectors in Use"
  140. prop="connectorNo"
  141. align="center"
  142. class-name="fixed-width">
  143. <template slot-scope="{row}">
  144. <span>{{ row.connectorInUse || "0" }}</span>
  145. </template>
  146. </el-table-column-->
  147. <el-table-column
  148. v-if="visible.actions"
  149. label="Action"
  150. align="center"
  151. min-width="70">
  152. <template slot-scope="{row, $index}">
  153. <!-- <TableAction
  154. :showDel="visible.actionDelete"
  155. @edit="handleUpdateSite(row, $index)"
  156. @delete="handleDeleteSite(row, $index)"/> -->
  157. <el-dropdown
  158. class="action-dropdown"
  159. @command="(v) => handleCommand(v, row)">
  160. <i class="el-icon-more icon-action"></i>
  161. <el-dropdown-menu slot="dropdown">
  162. <el-dropdown-item
  163. command="handleUpdateSite">
  164. Edit
  165. </el-dropdown-item>
  166. <el-dropdown-item
  167. command="handleDeleteSite">
  168. Delete
  169. </el-dropdown-item>
  170. <el-dropdown-item
  171. command="viewRateDialog">
  172. View Rate
  173. </el-dropdown-item>
  174. </el-dropdown-menu>
  175. </el-dropdown>
  176. </template>
  177. </el-table-column>
  178. </el-table>
  179. <div class="right">
  180. <pagination
  181. v-show="total > 0"
  182. :total="total"
  183. :page.sync="filter.pageNo"
  184. :limit.sync="filter.pageSize"
  185. @pagination="getList" />
  186. </div>
  187. <history-rate
  188. v-bind="actionRate"
  189. @hide="hideRateDialog"
  190. />
  191. </div>
  192. </template>
  193. <script>
  194. // waves directive
  195. import waves from '@/directive/waves'
  196. // secondary package based on el-pagination
  197. import Pagination from '@/components/Pagination'
  198. import TableAction from '@/components/TableAction.vue'
  199. import site from '../../http/api/site'
  200. import { getRoleName } from '@/utils/auth'
  201. import historyRate from './historyRate.vue'
  202. import {getServiceProviderOptions} from '../../utils'
  203. export default {
  204. name: 'SiteManagement',
  205. components: { Pagination, TableAction, historyRate },
  206. directives: { waves },
  207. data() {
  208. return {
  209. tableKey: 0,
  210. list: null,
  211. total: 0,
  212. listLoading: true,
  213. filter: {
  214. pageNo: 1,
  215. pageSize: 10,
  216. pageVo: {
  217. criteria: '',
  218. providerPk: ''
  219. }
  220. },
  221. providerOptions: [],
  222. visible: {
  223. actions: true,
  224. actionDelete: true,
  225. addButton: true,
  226. },
  227. actionRate: {
  228. id: 0,
  229. visible: false
  230. }
  231. }
  232. },
  233. created() {
  234. this.getAllProvider();
  235. this.getList();
  236. this.setVisible();
  237. },
  238. methods: {
  239. setVisible() {
  240. const role = getRoleName()
  241. if (role === "MCST") {
  242. this.visible.actionDelete = false
  243. this.visible.addButton = false
  244. } else if (this.$route.meta.onlyView) {
  245. this.visible.actions = false
  246. this.visible.addButton = false
  247. }
  248. },
  249. getAllProvider() {
  250. getServiceProviderOptions(list => {
  251. this.providerOptions = list;
  252. });
  253. },
  254. getList() {
  255. this.listLoading = true
  256. site.getSiteList(this.filter).then(res => {
  257. if (res.data && res.total) {
  258. this.list = res.data
  259. this.total = res.total
  260. } else {
  261. this.list = []
  262. this.total = 0
  263. }
  264. }).catch(err => {
  265. this.$message({
  266. message: err,
  267. type: 'error'
  268. })
  269. this.list = []
  270. this.total = 0
  271. }).finally(() => {
  272. this.listLoading = false
  273. })
  274. },
  275. handleFilter() {
  276. this.filter.pageNo = 1
  277. this.getList()
  278. },
  279. handleClickAddSiteButton() {
  280. //this.$router.push({ path: '/site-management/add-site' })
  281. this.$router.push({ path: '/site-management/add' })
  282. },
  283. handleUpdateSite(row) {
  284. /*this.$store.commit('site/SET_SELECTED_SITE', row)
  285. this.$router.push({ path: '/site-management/update-site' })*/
  286. this.$router.push({ path: '/site-management/edit/' + row.sitePk })
  287. },
  288. handleDeleteSite(row) {
  289. this.$confirm(
  290. 'Are you sure you want to delete this site ?',
  291. 'Delete', {
  292. confirmButtonText: 'OK',
  293. cancelButtonText: 'Cancel',
  294. type: 'warning'
  295. }).then(res => {
  296. site.deleteSite({ sitePk: row.sitePk }).then(() => {
  297. this.$message({
  298. message: `delete site success ${row.siteName}`,
  299. type: "success",
  300. duration: 3000,
  301. })
  302. this.getList();
  303. }).catch(error => {
  304. this.$message({
  305. message: error,
  306. type: "error",
  307. duration: 3000,
  308. })
  309. })
  310. })
  311. },
  312. handleCommand(cb, item) {
  313. this[cb](item)
  314. },
  315. viewRateDialog(row) {
  316. this.actionRate.visible = true;
  317. this.actionRate.id = row.sitePk;
  318. },
  319. hideRateDialog() {
  320. this.actionRate.visible = false;
  321. }
  322. }
  323. }
  324. </script>