assignment.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <template>
  2. <el-dialog
  3. :title="title"
  4. :visible="visible"
  5. :before-close="onHide"
  6. class="assign-label-dialog">
  7. <div class="filter-container filter-view">
  8. <el-select
  9. style="min-width: 70px; max-width: 120px;"
  10. clearable
  11. v-model="filter.pageVo.assignmentStatus"
  12. placeholder="Status"
  13. @change="onSearch">
  14. <el-option
  15. v-for="(item, index) in statusOptions"
  16. :key="index"
  17. :label="item"
  18. :value="item"/>
  19. </el-select>
  20. <div style="flex: 1; min-width: 150px; max-width: 300px;">
  21. <el-input
  22. clearable
  23. v-model="filter.pageVo.criteria"
  24. placeholder="Search by Site Name"
  25. @keyup.enter.native="onSearch"/>
  26. </div>
  27. <el-button
  28. type="primary"
  29. @click="onSearch">
  30. Search
  31. </el-button>
  32. </div>
  33. <div class="assign-label-actions">
  34. <el-button
  35. type="danger"
  36. :disabled="selectRow.length == 0"
  37. :loading="loading.unassign"
  38. @click="onClickUnassign">
  39. Batch Un-assign
  40. </el-button>
  41. <el-button
  42. type="accent"
  43. :disabled="selectRow.length == 0"
  44. :loading="loading.assign"
  45. @click="onClickAssign">
  46. Batch Assign
  47. </el-button>
  48. </div>
  49. <div class="table-view" v-loading="table.loading">
  50. <el-table
  51. :data="table.data"
  52. height="100%"
  53. class="no-border"
  54. @selection-change="changeSelection">
  55. <template v-if="isGroup">
  56. <el-table-column
  57. align="center"
  58. label="Name"
  59. prop="name"
  60. min-width="140"/>
  61. <el-table-column
  62. align="center"
  63. label="Type"
  64. prop="type"
  65. min-width="120"/>
  66. <el-table-column
  67. align="center"
  68. label="Country"
  69. prop="country"
  70. min-width="120"/>
  71. <el-table-column
  72. align="center"
  73. label="Approved"
  74. prop="approved"
  75. min-width="100"/>
  76. <el-table-column
  77. align="center"
  78. label="Pending"
  79. prop="pending"
  80. min-width="100"/>
  81. </template>
  82. <template v-else>
  83. <el-table-column
  84. align="center"
  85. label="Site Name"
  86. prop="siteName"
  87. min-width="120"/>
  88. <el-table-column
  89. align="center"
  90. label="Address"
  91. prop="address"
  92. min-width="120"/>
  93. <el-table-column
  94. align="center"
  95. label="Service Provider"
  96. min-width="140">
  97. <template slot-scope="{row}">
  98. <div v-for="item in row.serviceProviders" :key="item">{{item}}</div>
  99. </template>
  100. </el-table-column>
  101. </template>
  102. <el-table-column
  103. align="center"
  104. label="Assignment Status"
  105. prop="assignmentStatus"
  106. min-width="150"/>
  107. <el-table-column
  108. align="center"
  109. label="Select"
  110. type="selection"
  111. width="50"
  112. v-if="visible"/>
  113. </el-table>
  114. </div>
  115. <div class="center" style="margin-bottom: -20px;">
  116. <Pagination
  117. v-show="table.total"
  118. :total="table.total"
  119. :page.sync="filter.pageNo"
  120. :limit.sync="filter.pageSize"
  121. @pagination="getTableData"/>
  122. </div>
  123. </el-dialog>
  124. </template>
  125. <script>
  126. import api from '../../http/api/financial.js'
  127. import Pagination from '@/components/Pagination'
  128. export default {
  129. name: "AssignmentSiteSettle",
  130. props: {
  131. visible: {
  132. type: Boolean,
  133. default: false
  134. },
  135. isGroup: {
  136. type: Boolean,
  137. default: false
  138. },
  139. item: {
  140. type: Object,
  141. default: () => ({})
  142. }
  143. },
  144. data() {
  145. return {
  146. filter: {
  147. pageSize: 10,
  148. pageNo: 1,
  149. pageVo: {
  150. criteria: "",
  151. entityId: "",
  152. countryCode: "",
  153. assignmentStatus: ""
  154. }
  155. },
  156. table: {
  157. data: [],
  158. total: 0,
  159. loading: false
  160. },
  161. loading: {
  162. assign: false,
  163. unassign: false
  164. },
  165. statusOptions: [],
  166. selectRow: []
  167. };
  168. },
  169. components: {Pagination},
  170. computed: {
  171. title() {
  172. return this.isGroup ? "ASSIGN GROUPS" : "ASSIGN SITES";
  173. }
  174. },
  175. watch: {
  176. visible: {
  177. handler(n, o) {
  178. console.log("watch.visible", n, this.item);
  179. if (n) {
  180. this.filter.pageVo.entityId = this.item.entityId;
  181. this.filter.pageVo.countryCode = this.item.entityCountryCode;
  182. this.filter.pageVo.assignmentStatus = "";
  183. this.onSearch()
  184. }
  185. }
  186. }
  187. },
  188. mounted() {
  189. this.getStatusOptions();
  190. },
  191. methods: {
  192. onHide() {
  193. this.$emit("hide", true);
  194. },
  195. onSearch() {
  196. this.filter.pageNo = 1;
  197. this.getTableData();
  198. },
  199. getStatusOptions() {
  200. api.getAssignStatusOptions().then(res => {
  201. if (res.data) {
  202. this.statusOptions = res.data
  203. }
  204. }).catch(error => {
  205. this.$message({
  206. type: 'error',
  207. message: error
  208. })
  209. })
  210. },
  211. getTableData() {
  212. const promise = this.isGroup
  213. ? api.getAssignGroupPages(this.filter)
  214. : api.getAssignSitePages(this.filter)
  215. promise.then(res => {
  216. if (res.total && res.data) {
  217. this.table.total = res.total;
  218. this.table.data = res.data;
  219. } else {
  220. this.table.total = 0;
  221. this.table.data = [];
  222. }
  223. this.table.loading = false;
  224. }).catch(error => {
  225. this.$message({
  226. type: 'error',
  227. message: error
  228. })
  229. this.table.total = 0;
  230. this.table.data = [];
  231. this.table.loading = false;
  232. })
  233. },
  234. changeSelection(val) {
  235. this.selectRow = val;
  236. },
  237. getSelectIds() {
  238. const ids = [];
  239. this.selectRow.forEach(item => {
  240. if (item.sitePk) {
  241. ids.push(item.sitePk)
  242. } else {
  243. ids.push(item.id)
  244. }
  245. })
  246. return ids;
  247. },
  248. onClickAssign() {
  249. const params = {
  250. entityId: this.item.entityId,
  251. eligibleRefIds: this.getSelectIds()
  252. }
  253. this.loading.assign = true;
  254. api.assignEligible(params).then(res => {
  255. this.$message({
  256. type: 'success',
  257. message: res.msg || "Success"
  258. })
  259. this.getTableData()
  260. }).catch(error => {
  261. this.$message({
  262. type: 'error',
  263. message: error
  264. })
  265. }).finally(() => {
  266. this.loading.assign = false;
  267. })
  268. },
  269. onClickUnassign() {
  270. const params = {
  271. entityId: this.item.entityId,
  272. eligibleRefIds: this.getSelectIds()
  273. }
  274. this.loading.unassign = true;
  275. api.unassignEligible(params).then(res => {
  276. this.$message({
  277. type: 'success',
  278. message: res.msg || "Success"
  279. })
  280. this.getTableData()
  281. }).catch(error => {
  282. this.$message({
  283. type: 'error',
  284. message: error
  285. })
  286. }).finally(() => {
  287. this.loading.unassign = false;
  288. })
  289. },
  290. }
  291. }
  292. </script>
  293. <style lang="scss" scoped>
  294. .assign-label-dialog
  295. ::v-deep .el-dialog {
  296. width: 65vw;
  297. height: 90vh;
  298. display: flex;
  299. max-width: 1200px;
  300. flex-direction: column;
  301. margin-top: 5vh !important;
  302. .el-dialog__header {
  303. padding: 20px 20px 0;
  304. font-weight: bold;
  305. }
  306. .el-dialog__body {
  307. flex: 1;
  308. padding: 20px;
  309. display: flex;
  310. overflow: hidden;
  311. flex-direction: column;
  312. }
  313. @media screen and (max-width: 1200px) {
  314. & {
  315. width: 70vw;
  316. }
  317. }
  318. @media screen and (max-width: 1000px) {
  319. & {
  320. width: 80vw;
  321. }
  322. }
  323. @media screen and (max-width: 800px) {
  324. & {
  325. width: 90vw;
  326. }
  327. }
  328. @media screen and (max-width: 700px) {
  329. & {
  330. width: 99vw;
  331. }
  332. }
  333. @media screen and (max-width: 320px) {
  334. & {
  335. width: 100%;
  336. min-width: 300px;
  337. }
  338. }
  339. }
  340. .assign-label-dialog .table-view {
  341. flex: 1;
  342. overflow-y: auto;
  343. padding-top: 10px;
  344. margin-bottom: -10px;
  345. }
  346. .assign-label-actions {
  347. display: flex;
  348. padding-top: 5px;
  349. flex-wrap: wrap-reverse;
  350. align-items: center;
  351. justify-content: flex-end;
  352. }
  353. </style>