Bug 32939: Have a generic fetch function for POST and PUT requests in vue modules
Rebase to 32806 and prior to 32925. Squash
More updates. Ready for review, for now.
JD amended patch:
* prettier
* remove changes to AgreementRelationships.vue and EHoldingsLocalPackageAgreements.vue to have less files to update in upcoming patches
Signed-off-by: Matt Blenkinsop <matt.blenkinsop@ptfs-europe.com>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
(cherry picked from commit 866cc641d9
)
Signed-off-by: Matt Blenkinsop <matt.blenkinsop@ptfs-europe.com>
This commit is contained in:
parent
43421f0791
commit
6d3df54862
7 changed files with 168 additions and 81 deletions
|
@ -190,7 +190,7 @@ import AgreementLicenses from "./AgreementLicenses.vue"
|
|||
import AgreementRelationships from "./AgreementRelationships.vue"
|
||||
import Documents from "./Documents.vue"
|
||||
import { setMessage, setError, setWarning } from "../../messages"
|
||||
import { fetchAgreement, checkError } from "../../fetch/erm.js"
|
||||
import { ERMAPIClient } from "../../fetch/erm-api-client.js"
|
||||
import { storeToRefs } from "pinia"
|
||||
|
||||
export default {
|
||||
|
@ -245,7 +245,7 @@ export default {
|
|||
beforeRouteEnter(to, from, next) {
|
||||
next(vm => {
|
||||
if (to.params.agreement_id) {
|
||||
vm.agreement = vm.getAgreement(to.params.agreement_id)
|
||||
vm.getAgreement(to.params.agreement_id)
|
||||
} else {
|
||||
vm.initialized = true
|
||||
}
|
||||
|
@ -253,9 +253,15 @@ export default {
|
|||
},
|
||||
methods: {
|
||||
async getAgreement(agreement_id) {
|
||||
const agreement = await fetchAgreement(agreement_id)
|
||||
this.agreement = agreement
|
||||
this.initialized = true
|
||||
const client = new ERMAPIClient()
|
||||
try {
|
||||
await client.agreements.get(agreement_id).then(data => {
|
||||
this.agreement = data
|
||||
this.initialized = true
|
||||
})
|
||||
} catch (err) {
|
||||
setError(err.message || err.statusText)
|
||||
}
|
||||
},
|
||||
checkForm(agreement) {
|
||||
let errors = []
|
||||
|
@ -326,18 +332,12 @@ export default {
|
|||
|
||||
//let agreement= Object.assign( {} ,this.agreement); // copy
|
||||
let agreement = JSON.parse(JSON.stringify(this.agreement)) // copy
|
||||
let agreement_id = agreement.agreement_id
|
||||
|
||||
if (!this.checkForm(agreement)) {
|
||||
return false
|
||||
}
|
||||
|
||||
let apiUrl = "/api/v1/erm/agreements"
|
||||
|
||||
let method = "POST"
|
||||
if (agreement.agreement_id) {
|
||||
method = "PUT"
|
||||
apiUrl += "/" + agreement.agreement_id
|
||||
}
|
||||
delete agreement.agreement_id
|
||||
delete agreement.vendor
|
||||
agreement.is_perpetual = agreement.is_perpetual ? true : false
|
||||
|
@ -375,30 +375,23 @@ export default {
|
|||
|
||||
delete agreement.agreement_packages
|
||||
|
||||
const options = {
|
||||
method: method,
|
||||
body: JSON.stringify(agreement),
|
||||
headers: {
|
||||
"Content-Type": "application/json;charset=utf-8",
|
||||
},
|
||||
}
|
||||
|
||||
fetch(apiUrl, options)
|
||||
.then(response => checkError(response, 1))
|
||||
.then(response => {
|
||||
if (response.status == 200) {
|
||||
this.$router.push("/cgi-bin/koha/erm/agreements")
|
||||
setMessage(this.$__("Agreement updated"))
|
||||
} else if (response.status == 201) {
|
||||
this.$router.push("/cgi-bin/koha/erm/agreements")
|
||||
setMessage(this.$__("Agreement created"))
|
||||
const client = new ERMAPIClient()
|
||||
;(async () => {
|
||||
try {
|
||||
if (agreement_id) {
|
||||
await client.agreements
|
||||
.update(agreement, agreement_id)
|
||||
.then(setMessage(this.$__("Agreement updated")))
|
||||
} else {
|
||||
setError(response.message || response.statusText)
|
||||
await client.agreements
|
||||
.create(agreement)
|
||||
.then(setMessage(this.$__("Agreement created")))
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
setError(error)
|
||||
})
|
||||
this.$router.push("/cgi-bin/koha/erm/agreements")
|
||||
} catch (err) {
|
||||
setError(err.message || err.statusText)
|
||||
}
|
||||
})()
|
||||
},
|
||||
onStatusChanged(e) {
|
||||
if (e.authorised_value != "closed") {
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import { fetchAgreement, checkError } from "../../fetch/erm.js"
|
||||
import { ERMAPIClient } from "../../fetch/erm-api-client.js"
|
||||
import { setMessage, setError } from "../../messages"
|
||||
|
||||
export default {
|
||||
|
@ -53,35 +53,30 @@ export default {
|
|||
},
|
||||
methods: {
|
||||
async getAgreement(agreement_id) {
|
||||
const agreement = await fetchAgreement(agreement_id)
|
||||
this.agreement = agreement
|
||||
this.initialized = true
|
||||
const client = new ERMAPIClient()
|
||||
try {
|
||||
await client.agreements.get(agreement_id).then(data => {
|
||||
this.agreement = data
|
||||
this.initialized = true
|
||||
})
|
||||
} catch (err) {
|
||||
setError(err.message || err.statusText)
|
||||
}
|
||||
},
|
||||
onSubmit(e) {
|
||||
e.preventDefault()
|
||||
|
||||
let apiUrl = "/api/v1/erm/agreements/" + this.agreement.agreement_id
|
||||
|
||||
const options = {
|
||||
method: "DELETE",
|
||||
headers: {
|
||||
"Content-Type": "application/json;charset=utf-8",
|
||||
},
|
||||
}
|
||||
|
||||
fetch(apiUrl, options)
|
||||
.then(response => checkError(response, 1))
|
||||
.then(response => {
|
||||
if (response.status == 204) {
|
||||
setMessage(this.$__("Agreement deleted"))
|
||||
this.$router.push("/cgi-bin/koha/erm/agreements")
|
||||
} else {
|
||||
setError(response.message || response.statusText)
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
setError(error)
|
||||
})
|
||||
const client = new ERMAPIClient()
|
||||
;(async () => {
|
||||
try {
|
||||
await client.agreements
|
||||
.delete(this.agreement.agreement_id)
|
||||
.then(setMessage(this.$__("Agreement deleted")))
|
||||
this.$router.push("/cgi-bin/koha/erm/agreements")
|
||||
} catch (err) {
|
||||
setError(err)
|
||||
}
|
||||
})()
|
||||
},
|
||||
},
|
||||
name: "AgreementsFormConfirmDelete",
|
||||
|
|
|
@ -37,8 +37,8 @@
|
|||
import flatPickr from "vue-flatpickr-component"
|
||||
import Toolbar from "./AgreementsToolbar.vue"
|
||||
import { inject, createVNode, render } from "vue"
|
||||
import { ERMAPIClient } from "../../fetch/erm-api-client.js"
|
||||
import { storeToRefs } from "pinia"
|
||||
import { fetchAgreements } from "../../fetch/erm.js"
|
||||
import { useDataTable, build_url } from "../../composables/datatables"
|
||||
|
||||
export default {
|
||||
|
@ -93,7 +93,8 @@ export default {
|
|||
},
|
||||
methods: {
|
||||
async getAgreements() {
|
||||
const agreements = await fetchAgreements()
|
||||
const client = new ERMAPIClient()
|
||||
const agreements = await client.agreements.getAll()
|
||||
this.agreements = agreements
|
||||
this.initialized = true
|
||||
},
|
||||
|
|
|
@ -300,7 +300,8 @@
|
|||
|
||||
<script>
|
||||
import { inject } from "vue"
|
||||
import { fetchAgreement } from "../../fetch/erm.js"
|
||||
import { ERMAPIClient } from "../../fetch/erm-api-client.js"
|
||||
import { setError } from "../../messages"
|
||||
|
||||
export default {
|
||||
setup() {
|
||||
|
@ -346,9 +347,15 @@ export default {
|
|||
},
|
||||
methods: {
|
||||
async getAgreement(agreement_id) {
|
||||
const agreement = await fetchAgreement(agreement_id)
|
||||
this.agreement = agreement
|
||||
this.initialized = true
|
||||
const client = new ERMAPIClient()
|
||||
try {
|
||||
await client.agreements.get(agreement_id).then(data => {
|
||||
this.agreement = data
|
||||
this.initialized = true
|
||||
})
|
||||
} catch (err) {
|
||||
setError(err.message || err.statusText)
|
||||
}
|
||||
},
|
||||
},
|
||||
name: "AgreementsShow",
|
||||
|
|
46
koha-tmpl/intranet-tmpl/prog/js/vue/fetch/erm-api-client.js
Normal file
46
koha-tmpl/intranet-tmpl/prog/js/vue/fetch/erm-api-client.js
Normal file
|
@ -0,0 +1,46 @@
|
|||
import HttpClient from "./http-client";
|
||||
|
||||
export class ERMAPIClient extends HttpClient {
|
||||
constructor() {
|
||||
super({
|
||||
baseURL: "/api/v1/erm/",
|
||||
});
|
||||
}
|
||||
|
||||
get agreements() {
|
||||
return {
|
||||
get: (id) =>
|
||||
this.get({
|
||||
endpoint: "agreements/" + id,
|
||||
headers: {
|
||||
"x-koha-embed":
|
||||
"periods,user_roles,user_roles.patron,agreement_licenses,agreement_licenses.license,agreement_relationships,agreement_relationships.related_agreement,documents,agreement_packages,agreement_packages.package,vendor",
|
||||
},
|
||||
}),
|
||||
getAll: (query) =>
|
||||
this.get({
|
||||
endpoint: "agreements?" + (query || "_per_page=-1"),
|
||||
}),
|
||||
delete: (id) =>
|
||||
this.delete({
|
||||
endpoint: "agreements/" + id,
|
||||
headers: this.getDefaultJSONPayloadHeader(),
|
||||
}),
|
||||
create: (agreement) =>
|
||||
this.post({
|
||||
endpoint: "agreements",
|
||||
body: agreement,
|
||||
headers: this.getDefaultJSONPayloadHeader(),
|
||||
}),
|
||||
update: (agreement, id) =>
|
||||
this.put({
|
||||
endpoint: "agreements/" + id,
|
||||
body: agreement,
|
||||
headers: this.getDefaultJSONPayloadHeader(),
|
||||
}),
|
||||
//count: () => this.count("agreements"), //TODO: Implement count method
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export default ERMAPIClient;
|
|
@ -1,20 +1,6 @@
|
|||
import { setError } from "../messages";
|
||||
|
||||
export const fetchAgreement = function (agreement_id) {
|
||||
if (!agreement_id) return;
|
||||
const apiUrl = "/api/v1/erm/agreements/" + agreement_id;
|
||||
return myFetch(apiUrl, {
|
||||
headers: {
|
||||
"x-koha-embed":
|
||||
"periods,user_roles,user_roles.patron,agreement_licenses,agreement_licenses.license,agreement_relationships,agreement_relationships.related_agreement,documents,agreement_packages,agreement_packages.package,vendor",
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
export const fetchAgreements = function () {
|
||||
const apiUrl = "/api/v1/erm/agreements?_per_page=-1";
|
||||
return myFetch(apiUrl);
|
||||
};
|
||||
//TODO: all of these functions should be deleted and reimplemented in the components using ERMAPIClient
|
||||
|
||||
export const fetchLicense = function (license_id) {
|
||||
if (!license_id) return;
|
||||
|
|
59
koha-tmpl/intranet-tmpl/prog/js/vue/fetch/http-client.js
Normal file
59
koha-tmpl/intranet-tmpl/prog/js/vue/fetch/http-client.js
Normal file
|
@ -0,0 +1,59 @@
|
|||
class HttpClient {
|
||||
constructor(options = {}) {
|
||||
this._baseURL = options.baseURL || "";
|
||||
}
|
||||
|
||||
async _fetchJSON(endpoint, headers = {}, options = {}) {
|
||||
const res = await fetch(this._baseURL + endpoint, {
|
||||
...options,
|
||||
headers: headers,
|
||||
});
|
||||
|
||||
if (!res.ok) throw new Error(res.statusText);
|
||||
|
||||
if (options.parseResponse !== false && res.status !== 204)
|
||||
return res.json();
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
get(params = {}) {
|
||||
console.log(params);
|
||||
return this._fetchJSON(params.endpoint, params.headers, {
|
||||
...params.options,
|
||||
method: "GET",
|
||||
});
|
||||
}
|
||||
|
||||
post(params = {}) {
|
||||
return this._fetchJSON(params.endpoint, params.headers, {
|
||||
...params.options,
|
||||
body: params.body ? JSON.stringify(params.body) : undefined,
|
||||
method: "POST",
|
||||
});
|
||||
}
|
||||
|
||||
put(params = {}) {
|
||||
return this._fetchJSON(params.endpoint, params.headers, {
|
||||
...params.options,
|
||||
body: params.body ? JSON.stringify(params.body) : undefined,
|
||||
method: "PUT",
|
||||
});
|
||||
}
|
||||
|
||||
delete(params = {}) {
|
||||
return this._fetchJSON(params.endpoint, params.headers, {
|
||||
parseResponse: false,
|
||||
...params.options,
|
||||
method: "DELETE",
|
||||
});
|
||||
}
|
||||
|
||||
//TODO: Implement count method
|
||||
|
||||
getDefaultJSONPayloadHeader() {
|
||||
return { "Content-Type": "application/json;charset=utf-8" };
|
||||
}
|
||||
}
|
||||
|
||||
export default HttpClient;
|
Loading…
Reference in a new issue