detail.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. <template>
  2. <div class="container" v-loading="loading.page">
  3. <el-form
  4. :model="form"
  5. :rules="rule"
  6. ref="form"
  7. label-position="right"
  8. label-width="150px"
  9. style="width: 100%;">
  10. <div class="flexr">
  11. <div class="content flex1">
  12. <div class="section-title">Service Provider</div>
  13. <el-form-item
  14. label="Provider Name:"
  15. prop="providerName">
  16. <el-input
  17. class="add-text"
  18. maxlength="30"
  19. v-model="form.providerName"/>
  20. </el-form-item>
  21. <el-form-item
  22. label="Country:"
  23. prop="countryCode">
  24. <el-select
  25. v-model="form.countryCode"
  26. class="add-text">
  27. <el-option
  28. v-for="item in options.country"
  29. :key="item.countryCode"
  30. :label="item.countryName"
  31. :value="item.countryCode"/>
  32. </el-select>
  33. </el-form-item>
  34. <el-form-item
  35. label="Party ID:"
  36. prop="partyId">
  37. <el-input
  38. class="add-text"
  39. maxlength="3"
  40. v-model="form.partyId"
  41. @blur="changePartyId"/>
  42. </el-form-item>
  43. <el-form-item
  44. label="Contact Person:"
  45. prop="providerContactPerson">
  46. <el-input
  47. class="add-text"
  48. maxlength="50"
  49. v-model="form.providerContactPerson"/>
  50. </el-form-item>
  51. <el-form-item
  52. label="Contact Number:"
  53. prop="providerContactPhoneNumber">
  54. <div class="add-text flexc">
  55. <el-select
  56. style="min-width: 75px; max-width: 80px;"
  57. v-model="form.providerContactCallingCode">
  58. <el-option
  59. v-for="item in options.country"
  60. :key="item.callingCode"
  61. :label="'+' + item.callingCode"
  62. :value="item.callingCode"/>
  63. </el-select>
  64. <el-input
  65. v-model="form.providerContactPhoneNumber"
  66. style="margin-left: 10px;"
  67. maxlength="15"/>
  68. </div>
  69. </el-form-item>
  70. <el-form-item
  71. label="Payment Gateway:"
  72. prop="paymentGateway">
  73. <el-select
  74. v-model="form.paymentGateway"
  75. class="add-text">
  76. <el-option
  77. v-for="item in options.payment"
  78. :key="item.key"
  79. :label="item.value"
  80. :value="item.key"/>
  81. </el-select>
  82. </el-form-item>
  83. <el-form-item
  84. label="Provider Logo:"
  85. class="is-required">
  86. <el-upload
  87. class="logo-upload"
  88. action
  89. :limit="1"
  90. :show-file-list="false"
  91. :file-list="[]"
  92. :on-remove="file => removeLogo(file)"
  93. :http-request="file => uploadLogo(file)"
  94. accept=".jpg,.jpeg,.png,.gif,.JPG,.JPEG"
  95. v-loading="loading.upload">
  96. <el-image
  97. v-if="logos.length > 0"
  98. :src="logos[0].url"
  99. title="Click to update logo"/>
  100. <i v-else
  101. class="el-icon-plus avatar-uploader-icon"
  102. title="Click to select file"/>
  103. </el-upload>
  104. </el-form-item>
  105. </div>
  106. <div class="content flex1">
  107. <div class="section-title">Company Details</div>
  108. <el-form-item
  109. label="Company Name:"
  110. prop="company.companyName">
  111. <el-input
  112. class="add-text"
  113. maxlength="50"
  114. v-model="form.company.companyName"/>
  115. </el-form-item>
  116. <el-form-item
  117. label="Company UEN:"
  118. prop="company.companyUen">
  119. <el-input
  120. class="add-text"
  121. maxlength="15"
  122. v-model="form.company.companyUen"/>
  123. </el-form-item>
  124. <el-form-item
  125. label="Company Email:"
  126. prop="company.companyEmail">
  127. <el-input
  128. class="add-text"
  129. maxlength="50"
  130. v-model="form.company.companyEmail"/>
  131. </el-form-item>
  132. <el-form-item
  133. label="Company Website:"
  134. prop="company.companyWebsit">
  135. <el-input
  136. class="add-text"
  137. maxlength="50"
  138. v-model="form.company.companyWebsit"/>
  139. </el-form-item>
  140. <el-form-item
  141. label="Company Address:"
  142. prop="company.companyAddress">
  143. <el-input
  144. class="add-text"
  145. maxlength="100"
  146. v-model="form.company.companyAddress"
  147. type="textarea"
  148. :autosize="autoSize"/>
  149. </el-form-item>
  150. </div>
  151. </div>
  152. <div class="content flexcr">
  153. <div class="buttons">
  154. <el-button
  155. type="primary"
  156. class="cancel-button"
  157. @click="onBack">
  158. Cancel
  159. </el-button>
  160. <el-button
  161. style="margin-left: 20px;"
  162. type="primary"
  163. :loading="loading.saving"
  164. @click="onClickSave">
  165. &nbsp;Save&nbsp;
  166. </el-button>
  167. </div>
  168. <audit-view
  169. v-if="form.providerPk"
  170. url="dawn/api/v1/service-provider/audit-pages"
  171. :params="{providerPk: form.providerPk}"
  172. :audit="form.audit"/>
  173. </div>
  174. </el-form>
  175. </div>
  176. </template>
  177. <script>
  178. import setting from '../../settings.js';
  179. import apiBase from '../../api/apiBase.js';
  180. import provider from '../../api/provider.js';
  181. import AuditView from "@/components/AuditView"
  182. export default {
  183. data() {
  184. return {
  185. isEdit: false,
  186. loading: {
  187. page: true,
  188. upload: false,
  189. saving: false
  190. },
  191. options: {
  192. country: [],
  193. payment: []
  194. },
  195. form: {
  196. partyId: "",
  197. providerPk: "",
  198. providerName: "",
  199. countryCode: setting.defaultCountry,
  200. providerLogo: "",
  201. paymentGateway: "",
  202. providerContactPerson: "",
  203. providerContactCallingCode: Number(setting.defaultCalling),
  204. providerContactPhoneNumber: "",
  205. company: {
  206. companyUen: "",
  207. companyName: "",
  208. companyEmail: "",
  209. companyWebsit: "",
  210. companyAddress: "",
  211. providerCompanyPk: ""
  212. }
  213. },
  214. rule: {
  215. providerName: {
  216. required: true,
  217. trigger: 'blur',
  218. message: 'Please type provider name'
  219. },
  220. countryCode: {
  221. required: true,
  222. trigger: 'change',
  223. message: 'Please select country'
  224. },
  225. paymentGateway: {
  226. required: true,
  227. trigger: 'change',
  228. message: 'Please select payment gateway'
  229. },
  230. providerContactPerson: {
  231. required: true,
  232. trigger: 'blur',
  233. message: 'Please type contact person'
  234. },
  235. providerContactPhoneNumber: {
  236. required: true,
  237. trigger: 'blur',
  238. message: 'Please type contact number'
  239. },
  240. partyId: {
  241. required: true,
  242. trigger: 'blur',
  243. message: 'Please type party Id'
  244. },
  245. "company.companyName": {
  246. required: true,
  247. trigger: 'blur',
  248. message: 'Please type company name'
  249. },
  250. "company.companyUen": {
  251. required: true,
  252. trigger: 'blur',
  253. message: 'Please type company UEN'
  254. },
  255. "company.companyAddress": {
  256. required: true,
  257. trigger: 'blur',
  258. message: 'Please type company address'
  259. }
  260. },
  261. logos: [],
  262. autoSize: {
  263. minRows: 3,
  264. maxRows: 8
  265. }
  266. };
  267. },
  268. components: {AuditView},
  269. created() {
  270. if (this.$route.params.id) {
  271. this.isEdit = true;
  272. this.getProviderInfo();
  273. }
  274. this.getCountryOptions();
  275. },
  276. methods: {
  277. onBack() {
  278. this.$nextTick(() => {
  279. this.$router.replace({
  280. path: "/partnership-management/service-provider-mgmt"
  281. })
  282. })
  283. },
  284. getCountryOptions() {
  285. apiBase.getCountryList().then(res => {
  286. if (res.data) {
  287. this.options.country = res.data
  288. }
  289. }).finally(() => {
  290. this.getPaymentOptions();
  291. })
  292. },
  293. getPaymentOptions() {
  294. apiBase.getPaymentGatewayList().then(res => {
  295. if (res.data) {
  296. this.options.payment = res.data
  297. }
  298. }).finally(() => {
  299. this.loading.page = false
  300. })
  301. },
  302. getProviderInfo() {
  303. provider.viewServiceProvider(this.$route.params.id).then(res => {
  304. if (res.data) {
  305. this.form = Object.assign(this.form, res.data);
  306. if (this.form.providerLogo) {
  307. this.logos.push({
  308. path: this.form.providerLogo,
  309. url: this.$imageSrc(this.form.providerLogo)
  310. });
  311. }
  312. }
  313. }).catch(err => {
  314. this.$message({
  315. message: err,
  316. type: 'error'
  317. })
  318. })
  319. },
  320. uploadLogo(file) {
  321. this.loading.upload = true;
  322. const formData = new FormData()
  323. formData.append('file', file.file)
  324. apiBase.uploadImage(formData).then(res => {
  325. if (this.logos.length == 0) {
  326. this.logos.push({
  327. url: ""
  328. })
  329. }
  330. this.logos[0] = ({
  331. path: res.data.picturePath,
  332. url: this.$imageSrc(res.data.picturePath)
  333. })
  334. }).catch(err => {
  335. this.$message({
  336. message: err,
  337. type: 'error'
  338. })
  339. }).finally(() => {
  340. this.loading.upload = false;
  341. })
  342. },
  343. removeLogo(file) {
  344. this.logos = []
  345. this.form.providerLogo = ""
  346. },
  347. onClickSave() {
  348. this.$refs['form'].validate(result => {
  349. if (result) {
  350. if (this.logos.length > 0) {
  351. this.form.providerLogo = this.logos[0].path
  352. } else {
  353. this.form.providerLogo = "";
  354. }
  355. if (!this.form.providerLogo) {
  356. this.$message({
  357. message: "Please upload provider logo",
  358. type: 'error'
  359. });
  360. return
  361. }
  362. this.loading.saving = true;
  363. if (this.isEdit) {
  364. this.updateProvider()
  365. } else {
  366. this.addProvider();
  367. }
  368. }
  369. });
  370. },
  371. addProvider() {
  372. provider.addServiceProvider(this.form).then(res => {
  373. this.$message({
  374. message: 'Add service provider successfully',
  375. type: 'success'
  376. })
  377. this.onBack();
  378. }).catch(err => {
  379. this.loading.saving = false;
  380. this.$message({
  381. message: err,
  382. type: 'error'
  383. })
  384. });
  385. },
  386. updateProvider() {
  387. provider.updateServiceProvider(this.form).then(res => {
  388. this.$message({
  389. message: 'Update service provider successfully',
  390. type: 'success'
  391. })
  392. this.onBack();
  393. }).catch(err => {
  394. this.loading.saving = false;
  395. this.$message({
  396. message: err,
  397. type: 'error'
  398. })
  399. });
  400. },
  401. changePartyId() {
  402. if (this.form.partyId) {
  403. this.form.partyId = this.form.partyId.toUpperCase();
  404. }
  405. }
  406. }
  407. }
  408. </script>
  409. <style scoped lang='scss'>
  410. @import '../../styles/variables.scss';
  411. .container {
  412. width: 100%;
  413. padding: 20px 60px;
  414. min-height: $mainAppMinHeight;
  415. background-color: #F0F5FC;
  416. }
  417. .content {
  418. margin: 0 8px 16px;
  419. padding: 15px 80px;
  420. border-radius: 6px;
  421. background-color: white;
  422. }
  423. .section-title {
  424. color: #333;
  425. margin-top: 20px;
  426. margin-bottom: 30px;
  427. font-size: 15px;
  428. user-select: none;
  429. line-height: 24px;
  430. font-weight: bold;
  431. font-family: sans-serif;
  432. text-transform: uppercase;
  433. }
  434. .add-text {
  435. width: 100%;
  436. max-width: 300px;
  437. }
  438. .add-text ::v-deep .el-textarea__inner {
  439. font-family: sans-serif;
  440. }
  441. .buttons {
  442. padding-top: 15px;
  443. padding-bottom: 15px;
  444. }
  445. @media screen and (max-width: 500px) {
  446. .container {
  447. padding: 0px;
  448. }
  449. .content {
  450. padding: 15px 30px;
  451. }
  452. }
  453. .logo-upload {
  454. width: 300px;
  455. height: 100px;
  456. position: relative;
  457. border-radius: 6px;
  458. background-color: #F8F8F8;
  459. ::v-deep .el-image {
  460. width: 300px;
  461. height: 100px;
  462. border-radius: 6px;
  463. img {
  464. object-fit: contain;
  465. }
  466. }
  467. }
  468. .avatar-uploader-icon {
  469. width: 300px;
  470. height: 100px;
  471. color: #8c939d;
  472. cursor: pointer;
  473. font-size: 28px;
  474. text-align: center;
  475. line-height: 100px;
  476. border-radius: 6px;
  477. border: 1px dashed #d9d9d9;
  478. }
  479. </style>