View | Details | Raw Unified | Return to bug 32474
Collapse All | Expand All

(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/AgreementLicenses.vue (-16 / +9 lines)
Lines 19-40 Link Here
19
                    <label :for="`license_id_${counter}`"
19
                    <label :for="`license_id_${counter}`"
20
                        >{{ $__("License") }}:</label
20
                        >{{ $__("License") }}:</label
21
                    >
21
                    >
22
                    <v-select
22
                    <InfiniteScrollSelect 
23
                        :id="`license_id_${counter}`"
23
                        :id="`license_id_${counter}`"
24
                        v-model="agreement_license.license_id"
24
                        v-model="agreement_license.license_id"
25
                        label="name"
25
                        :dataType="'licenses'"
26
                        :reduce="l => l.license_id"
26
                    />
27
                        :options="licenses"
28
                    >
29
                        <template #search="{ attributes, events }">
30
                            <input
31
                                :required="!agreement_license.license_id"
32
                                class="vs__search"
33
                                v-bind="attributes"
34
                                v-on="events"
35
                            />
36
                        </template>
37
                    </v-select>
38
                    <span class="required">{{ $__("Required") }}</span>
27
                    <span class="required">{{ $__("Required") }}</span>
39
                </li>
28
                </li>
40
                <li>
29
                <li>
Lines 102-112 Link Here
102
91
103
<script>
92
<script>
104
import { fetchLicenses } from "../../fetch"
93
import { fetchLicenses } from "../../fetch"
94
import InfiniteScrollSelect from "./InfiniteScrollSelect.vue"
105
export default {
95
export default {
106
    name: "AgreementLicenses",
96
    name: "AgreementLicenses",
107
    data() {
97
    data() {
108
        return {
98
        return {
109
            licenses: [],
99
            licenses: [], 
110
        }
100
        }
111
    },
101
    },
112
    props: {
102
    props: {
Lines 115-121 export default { Link Here
115
        agreement_licenses: Array,
105
        agreement_licenses: Array,
116
    },
106
    },
117
    beforeCreate() {
107
    beforeCreate() {
118
        fetchLicenses().then(licenses => (this.licenses = licenses))
108
        fetchLicenses(1).then(licenses => (this.licenses = licenses))
119
    },
109
    },
120
    methods: {
110
    methods: {
121
        addLicense() {
111
        addLicense() {
Lines 131-135 export default { Link Here
131
            this.agreement_licenses.splice(counter, 1)
121
            this.agreement_licenses.splice(counter, 1)
132
        },
122
        },
133
    },
123
    },
124
    components: {
125
        InfiniteScrollSelect
126
    },
134
}
127
}
135
</script>
128
</script>
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/AgreementRelationships.vue (-20 / +9 lines)
Lines 19-40 Link Here
19
                    <label :for="`related_agreement_id_${counter}`"
19
                    <label :for="`related_agreement_id_${counter}`"
20
                        >{{ $__("Related agreement") }}:
20
                        >{{ $__("Related agreement") }}:
21
                    </label>
21
                    </label>
22
                    <v-select
22
                    <InfiniteScrollSelect 
23
                        :id="`related_agreement_id_${counter}`"
23
                        :id="`related_agreement_id_${counter}`"
24
                        v-model="relationship.related_agreement_id"
24
                        v-model="relationship.related_agreement_id"
25
                        label="name"
25
                        :dataType="'agreements'"
26
                        :reduce="a => a.agreement_id"
26
                    />
27
                        :options="agreements"
28
                    >
29
                        <template #search="{ attributes, events }">
30
                            <input
31
                                :required="!relationship.related_agreement_id"
32
                                class="vs__search"
33
                                v-bind="attributes"
34
                                v-on="events"
35
                            />
36
                        </template>
37
                    </v-select>
38
                    <span class="required">{{ $__("Required") }}</span>
27
                    <span class="required">{{ $__("Required") }}</span>
39
                </li>
28
                </li>
40
                <li>
29
                <li>
Lines 85-91 Link Here
85
</template>
74
</template>
86
75
87
<script>
76
<script>
88
import { fetchAgreements } from "../../fetch"
77
import { fetchAgreements } from '../../fetch'
78
import InfiniteScrollSelect from "./InfiniteScrollSelect.vue"
89
79
90
export default {
80
export default {
91
    data() {
81
    data() {
Lines 94-104 export default { Link Here
94
        }
84
        }
95
    },
85
    },
96
    beforeCreate() {
86
    beforeCreate() {
97
        fetchAgreements().then(agreements => {
87
        fetchAgreements(1).then(agreements => (this.agreements = agreements))
98
            this.agreements = agreements.filter(
99
                agreement => agreement.agreement_id !== this.agreement_id
100
            )
101
        })
102
    },
88
    },
103
    methods: {
89
    methods: {
104
        addRelationship() {
90
        addRelationship() {
Lines 112-117 export default { Link Here
112
            this.relationships.splice(counter, 1)
98
            this.relationships.splice(counter, 1)
113
        },
99
        },
114
    },
100
    },
101
    components: {
102
        InfiniteScrollSelect
103
    },
115
    props: {
104
    props: {
116
        agreement_id: Number,
105
        agreement_id: Number,
117
        av_agreement_relationships: Array,
106
        av_agreement_relationships: Array,
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/AgreementsFormAdd.vue (-57 / +6 lines)
Lines 28-49 Link Here
28
                                <label for="agreement_vendor_id"
28
                                <label for="agreement_vendor_id"
29
                                    >{{ $__("Vendor") }}:</label
29
                                    >{{ $__("Vendor") }}:</label
30
                                >
30
                                >
31
                                <v-select
31
                                <InfiniteScrollSelect 
32
                                    id="agreement_vendor_id"
32
                                    :id="'agreement_vendor_id'"
33
                                    v-model="agreement.vendor_id"
33
                                    v-model="agreement.vendor_id"
34
                                    label="name"
34
                                    :dataType="'vendors'"
35
                                    :reduce="vendor => vendor.id"
35
                                />
36
                                    :options="paginated"
37
                                    @open="onOpen"
38
                                    @close="onClose"
39
                                    @search="(query) => (search = query)"
40
                                >
41
                                <template #list-footer>
42
                                    <li v-show="hasNextPage" ref="load" class="loader">
43
                                        {{ $__("Loading more options...") }}
44
                                    </li>
45
                                </template>
46
                                </v-select>
47
                            </li>
36
                            </li>
48
                            <li>
37
                            <li>
49
                                <label for="agreement_description"
38
                                <label for="agreement_description"
Lines 198-212 import UserRoles from "./UserRoles.vue" Link Here
198
import AgreementLicenses from "./AgreementLicenses.vue"
187
import AgreementLicenses from "./AgreementLicenses.vue"
199
import AgreementRelationships from "./AgreementRelationships.vue"
188
import AgreementRelationships from "./AgreementRelationships.vue"
200
import Documents from "./Documents.vue"
189
import Documents from "./Documents.vue"
190
import InfiniteScrollSelect from "./InfiniteScrollSelect.vue"
201
import { setMessage, setError, setWarning } from "../../messages"
191
import { setMessage, setError, setWarning } from "../../messages"
202
import { fetchAgreement } from "../../fetch"
192
import { fetchAgreement } from "../../fetch"
203
import { storeToRefs } from "pinia"
193
import { storeToRefs } from "pinia"
204
194
205
export default {
195
export default {
206
    setup() {
196
    setup() {
207
        const vendorStore = inject("vendorStore")
208
        const { vendors } = storeToRefs(vendorStore)
209
210
        const AVStore = inject("AVStore")
197
        const AVStore = inject("AVStore")
211
        const {
198
        const {
212
            av_agreement_statuses,
199
            av_agreement_statuses,
Lines 219-225 export default { Link Here
219
        } = storeToRefs(AVStore)
206
        } = storeToRefs(AVStore)
220
207
221
        return {
208
        return {
222
            vendors,
223
            av_agreement_statuses,
209
            av_agreement_statuses,
224
            av_agreement_closure_reasons,
210
            av_agreement_closure_reasons,
225
            av_agreement_renewal_priorities,
211
            av_agreement_renewal_priorities,
Lines 249-276 export default { Link Here
249
                documents: [],
235
                documents: [],
250
            },
236
            },
251
            initialized: false,
237
            initialized: false,
252
            observer: null,
253
            limit: 20,
254
            search: ''
255
        }
238
        }
256
    },
239
    },
257
    computed: {
258
        filtered() {
259
            if(this.vendors){
260
                return this.vendors.filter((vendor) => vendor.name.includes(this.search))
261
            }
262
            filtered()
263
        },
264
        paginated() {
265
            return this.filtered.slice(0, this.limit)
266
        },
267
        hasNextPage() {
268
            return this.paginated.length < this.filtered.length
269
        },
270
    },
271
    mounted() {
272
        this.observer = new IntersectionObserver(this.infiniteScroll)
273
    },
274
    beforeRouteEnter(to, from, next) {
240
    beforeRouteEnter(to, from, next) {
275
        next(vm => {
241
        next(vm => {
276
            if (to.params.agreement_id) {
242
            if (to.params.agreement_id) {
Lines 433-456 export default { Link Here
433
                this.agreement.closure_reason = ""
399
                this.agreement.closure_reason = ""
434
            }
400
            }
435
        },
401
        },
436
        async onOpen() {
437
            if (this.hasNextPage) {
438
                await this.$nextTick()
439
                this.observer.observe(this.$refs.load)
440
            }
441
        },
442
        onClose() {
443
            this.observer.disconnect()
444
        },
445
        async infiniteScroll([{ isIntersecting, target }]) {
446
            if (isIntersecting) {
447
                const ul = target.offsetParent
448
                const scrollTop = target.offsetParent.scrollTop
449
                this.limit += 10
450
                await this.$nextTick()
451
                ul.scrollTop = scrollTop
452
            }
453
        },
454
    },
402
    },
455
    components: {
403
    components: {
456
        AgreementPeriods,
404
        AgreementPeriods,
Lines 458-463 export default { Link Here
458
        AgreementLicenses,
406
        AgreementLicenses,
459
        AgreementRelationships,
407
        AgreementRelationships,
460
        Documents,
408
        Documents,
409
        InfiniteScrollSelect
461
    },
410
    },
462
    name: "AgreementsFormAdd",
411
    name: "AgreementsFormAdd",
463
}
412
}
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackageAgreements.vue (-15 / +8 lines)
Lines 22-43 Link Here
22
                    <label :for="`agreement_id_${counter}`" class="required"
22
                    <label :for="`agreement_id_${counter}`" class="required"
23
                        >{{ $__("Agreement") }}:
23
                        >{{ $__("Agreement") }}:
24
                    </label>
24
                    </label>
25
                    <v-select
25
                    <InfiniteScrollSelect 
26
                        :id="`agreement_id_${counter}`"
26
                        :id="`agreement_id_${counter}`"
27
                        v-model="package_agreement.agreement_id"
27
                        v-model="package_agreement.agreement_id"
28
                        label="name"
28
                        :dataType="'agreements'"
29
                        :reduce="a => a.agreement_id"
29
                    />
30
                        :options="agreements"
31
                    >
32
                        <template #search="{ attributes, events }">
33
                            <input
34
                                :required="!package_agreement.agreement_id"
35
                                class="vs__search"
36
                                v-bind="attributes"
37
                                v-on="events"
38
                            />
39
                        </template>
40
                    </v-select>
41
                    <span class="required">{{ $__("Required") }}</span>
30
                    <span class="required">{{ $__("Required") }}</span>
42
                </li>
31
                </li>
43
            </ol>
32
            </ol>
Lines 56-61 Link Here
56
45
57
<script>
46
<script>
58
import { fetchAgreements } from "../../fetch"
47
import { fetchAgreements } from "../../fetch"
48
import InfiniteScrollSelect from "./InfiniteScrollSelect.vue"
59
49
60
export default {
50
export default {
61
    data() {
51
    data() {
Lines 65-71 export default { Link Here
65
        }
55
        }
66
    },
56
    },
67
    beforeCreate() {
57
    beforeCreate() {
68
        fetchAgreements().then(agreements => {
58
        fetchAgreements(1).then(agreements => {
69
            this.agreements = agreements
59
            this.agreements = agreements
70
            this.initialized = true
60
            this.initialized = true
71
        })
61
        })
Lines 83-88 export default { Link Here
83
    props: {
73
    props: {
84
        package_agreements: Array,
74
        package_agreements: Array,
85
    },
75
    },
76
    components: {
77
        InfiniteScrollSelect
78
    },
86
    name: "EHoldingsLocalPackageAgreements",
79
    name: "EHoldingsLocalPackageAgreements",
87
}
80
}
88
</script>
81
</script>
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesFormAdd.vue (-8 / +5 lines)
Lines 25-36 Link Here
25
                            <label for="package_vendor_id"
25
                            <label for="package_vendor_id"
26
                                >{{ $__("Vendor") }}:</label
26
                                >{{ $__("Vendor") }}:</label
27
                            >
27
                            >
28
                            <v-select
28
                            <InfiniteScrollSelect 
29
                                id="package_vendor_id"
29
                                :id="'package_vendor_id'"
30
                                v-model="erm_package.vendor_id"
30
                                v-model="erm_package.vendor_id"
31
                                label="name"
31
                                :dataType="'vendors'"
32
                                :reduce="vendor => vendor.id"
33
                                :options="vendors"
34
                            />
32
                            />
35
                        </li>
33
                        </li>
36
                        <li>
34
                        <li>
Lines 87-106 Link Here
87
<script>
85
<script>
88
import { inject } from "vue"
86
import { inject } from "vue"
89
import EHoldingsPackageAgreements from "./EHoldingsLocalPackageAgreements.vue"
87
import EHoldingsPackageAgreements from "./EHoldingsLocalPackageAgreements.vue"
88
import InfiniteScrollSelect from "./InfiniteScrollSelect.vue"
90
import { setMessage, setError, setWarning } from "../../messages"
89
import { setMessage, setError, setWarning } from "../../messages"
91
import { fetchLocalPackage, createPackage, editPackage } from "../../fetch"
90
import { fetchLocalPackage, createPackage, editPackage } from "../../fetch"
92
import { storeToRefs } from "pinia"
91
import { storeToRefs } from "pinia"
93
92
94
export default {
93
export default {
95
    setup() {
94
    setup() {
96
        const vendorStore = inject("vendorStore")
97
        const { vendors } = storeToRefs(vendorStore)
98
        const AVStore = inject("AVStore")
95
        const AVStore = inject("AVStore")
99
        const { av_package_types, av_package_content_types } =
96
        const { av_package_types, av_package_content_types } =
100
            storeToRefs(AVStore)
97
            storeToRefs(AVStore)
101
98
102
        return {
99
        return {
103
            vendors,
104
            av_package_types,
100
            av_package_types,
105
            av_package_content_types,
101
            av_package_content_types,
106
        }
102
        }
Lines 190-195 export default { Link Here
190
    },
186
    },
191
    components: {
187
    components: {
192
        EHoldingsPackageAgreements,
188
        EHoldingsPackageAgreements,
189
        InfiniteScrollSelect
193
    },
190
    },
194
    name: "EHoldingsEBSCOPackagesFormAdd",
191
    name: "EHoldingsEBSCOPackagesFormAdd",
195
}
192
}
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesFormAddResources.vue (-21 / +11 lines)
Lines 20-54 Link Here
20
                        class="required"
20
                        class="required"
21
                        >{{ $__("Package") }}:
21
                        >{{ $__("Package") }}:
22
                    </label>
22
                    </label>
23
                    <!-- Parse to integer, resource.package_id is an integer, but GET /packages return package_id as string -->
23
                    <InfiniteScrollSelect 
24
                    <v-select
25
                        :id="`resource_package_id_${counter}`"
24
                        :id="`resource_package_id_${counter}`"
26
                        v-model="resource.package_id"
25
                        v-model="resource.package_id"
27
                        label="name"
26
                        :dataType="'localpackages'"
28
                        :reduce="p => parseInt(p.package_id)"
27
                    />
29
                        :options="packages"
30
                    >
31
                        <template #search="{ attributes, events }">
32
                            <input
33
                                :required="!resource.package_id"
34
                                class="vs__search"
35
                                v-bind="attributes"
36
                                v-on="events"
37
                            />
38
                        </template>
39
                    </v-select>
40
                    <span class="required">{{ $__("Required") }}</span>
28
                    <span class="required">{{ $__("Required") }}</span>
41
                </li>
29
                </li>
42
                <li>
30
                <li>
43
                    <label :for="`resource_vendor_id_${counter}`"
31
                    <label :for="`resource_vendor_id_${counter}`"
44
                        >{{ $__("Vendor") }}:</label
32
                        >{{ $__("Vendor") }}:</label
45
                    >
33
                    >
46
                    <v-select
34
                    <InfiniteScrollSelect 
47
                        :id="`resource_vendor_id_${counter}`"
35
                        :id="`resource_vendor_id_${counter}`"
48
                        v-model="resource.vendor_id"
36
                        v-model="resource.vendor_id"
49
                        label="name"
37
                        :dataType="'vendors'"
50
                        :reduce="vendor => vendor.id"
51
                        :options="vendors"
52
                    />
38
                    />
53
                </li>
39
                </li>
54
40
Lines 96-101 import { inject } from "vue" Link Here
96
import flatPickr from "vue-flatpickr-component"
82
import flatPickr from "vue-flatpickr-component"
97
import { storeToRefs } from "pinia"
83
import { storeToRefs } from "pinia"
98
import { fetchLocalPackages } from "../../fetch"
84
import { fetchLocalPackages } from "../../fetch"
85
import InfiniteScrollSelect from "./InfiniteScrollSelect.vue"
99
86
100
export default {
87
export default {
101
    setup() {
88
    setup() {
Lines 110-116 export default { Link Here
110
        }
97
        }
111
    },
98
    },
112
    beforeCreate() {
99
    beforeCreate() {
113
        fetchLocalPackages().then(packages => (this.packages = packages))
100
        fetchLocalPackages(1).then(packages => (this.packages = packages))
114
    },
101
    },
115
    methods: {
102
    methods: {
116
        addPackage() {
103
        addPackage() {
Lines 129-135 export default { Link Here
129
    props: {
116
    props: {
130
        resources: Array,
117
        resources: Array,
131
    },
118
    },
132
    components: { flatPickr },
119
    components: { 
120
        flatPickr,
121
        InfiniteScrollSelect
122
    },
133
    name: "EHoldingsLocalTitlesFormAddResources",
123
    name: "EHoldingsLocalTitlesFormAddResources",
134
}
124
}
135
</script>
125
</script>
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesFormImport.vue (-8 / +9 lines)
Lines 8-21 Link Here
8
    </div>
8
    </div>
9
    <fieldset id="package_list" class="rows">
9
    <fieldset id="package_list" class="rows">
10
        {{ $__("To the following local package") }}:
10
        {{ $__("To the following local package") }}:
11
        <v-select
11
        <InfiniteScrollSelect 
12
            :id="''"
12
            v-model="package_id"
13
            v-model="package_id"
13
            label="name"
14
            :dataType="'localpackages'"
14
            :reduce="p => p.package_id"
15
        />
15
            :options="packages"
16
            :clearable="false"
17
        >
18
        </v-select>
19
    </fieldset>
16
    </fieldset>
20
    <div id="import_list_result" class="page-section">
17
    <div id="import_list_result" class="page-section">
21
        <table :id="table_id"></table>
18
        <table :id="table_id"></table>
Lines 27-32 import { setMessage, setError, setWarning } from "../../messages" Link Here
27
import { createVNode, render } from "vue"
24
import { createVNode, render } from "vue"
28
import { useDataTable } from "../../composables/datatables"
25
import { useDataTable } from "../../composables/datatables"
29
import { checkError, fetchLocalPackages } from "../../fetch.js"
26
import { checkError, fetchLocalPackages } from "../../fetch.js"
27
import InfiniteScrollSelect from "./InfiniteScrollSelect.vue"
30
28
31
export default {
29
export default {
32
    setup() {
30
    setup() {
Lines 46-52 export default { Link Here
46
        }
44
        }
47
    },
45
    },
48
    beforeCreate() {
46
    beforeCreate() {
49
        fetchLocalPackages().then(packages => {
47
        fetchLocalPackages(1).then(packages => {
50
            this.packages = packages
48
            this.packages = packages
51
            if (this.packages.length) {
49
            if (this.packages.length) {
52
                this.package_id = packages[0].package_id
50
                this.package_id = packages[0].package_id
Lines 151-156 export default { Link Here
151
    mounted() {
149
    mounted() {
152
        this.build_datatable()
150
        this.build_datatable()
153
    },
151
    },
152
    components: {
153
        InfiniteScrollSelect
154
    },
154
    name: "EHoldingsLocalTitlesFormImport",
155
    name: "EHoldingsLocalTitlesFormImport",
155
}
156
}
156
</script>
157
</script>
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/InfiniteScrollSelect.vue (+126 lines)
Line 0 Link Here
1
<template>
2
    <v-select
3
        v-bind:id="id"
4
        v-bind="$attrs"
5
        v-model="model"
6
        label="name"
7
        :reduce="item => item[this.dataIdentifier]"
8
        :options="paginated"
9
        @open="onOpen"
10
        @close="onClose"
11
        @search="(query) => (search = query)"
12
    >
13
        <template #list-footer>
14
            <li v-show="hasNextPage" ref="load" class="loader">
15
                {{ $__("Loading more options...") }}
16
            </li>
17
        </template>
18
    </v-select>
19
</template>
20
21
<script>
22
import { 
23
    fetchVendors, 
24
    fetchAgreements, 
25
    fetchLicenses, 
26
    fetchLocalPackages 
27
} from "../../fetch"
28
29
export default {
30
    beforeCreate() {
31
        switch (this.dataType) {
32
            case 'vendors':
33
                fetchVendors(1).then(items => (this.data = items))
34
                this.dataIdentifier = 'id'
35
                break;
36
            case 'agreements':
37
                fetchAgreements(1).then(items => (this.data = items))
38
                this.dataIdentifier = 'agreement_id'
39
                break;
40
            case 'licenses':
41
                fetchLicenses(1).then(items => (this.data = items))
42
                this.dataIdentifier = 'license_id'
43
                break;
44
            case 'localpackages':
45
                fetchLocalPackages(1).then(items => (this.data = items))
46
                this.dataIdentifier = 'package_id'
47
                break;
48
            default:
49
                break;
50
        }
51
    },
52
    props: {
53
        id: String,
54
        dataType: String,
55
    },
56
    data() {
57
        return {
58
            observer: null,
59
            limit: 10,
60
            search: '',
61
            scrollPage: 1,
62
            data:[],
63
        }
64
    },
65
    computed: {
66
        model: {
67
            get() { 
68
                return this.$attrs.value 
69
            },
70
            set(val) { 
71
                this.$emit('input', val) 
72
            }
73
        },
74
        filtered() {
75
            return this.data.filter((item) => item.name.includes(this.search)) 
76
        },
77
        paginated() {
78
            return this.filtered.slice(0, this.limit)
79
        },
80
        hasNextPage() {
81
            return this.paginated.length < this.filtered.length
82
        },
83
    },
84
    mounted() {
85
        this.observer = new IntersectionObserver(this.infiniteScroll)
86
    },
87
    methods: {
88
        async onOpen() {
89
            if (this.hasNextPage) {
90
                await this.$nextTick()
91
                this.observer.observe(this.$refs.load)
92
            }
93
        },
94
        onClose() {
95
            this.observer.disconnect()
96
        },
97
        async infiniteScroll([{ isIntersecting, target }]) {
98
            if (isIntersecting) {
99
                const ul = target.offsetParent
100
                const scrollTop = target.offsetParent.scrollTop
101
                this.limit += 10
102
                this.scrollPage++
103
                await this.$nextTick()
104
                switch (this.dataType) {
105
                    case 'vendors':
106
                        fetchVendors(this.scrollPage).then(items => (this.data.push(...items)))
107
                        break;
108
                    case 'agreements':
109
                        fetchAgreements(this.scrollPage).then(items => (this.data.push(...items)))
110
                        break;
111
                    case 'licenses':
112
                        fetchLicenses(this.scrollPage).then(items => (this.data.push(...items)))
113
                        break;
114
                    case 'localpackages':
115
                        fetchLocalPackages(this.scrollPage).then(items => (this.data.push(...items)))
116
                        break;
117
                    default:
118
                        break;
119
                }
120
                ul.scrollTop = scrollTop
121
            }
122
        },
123
    },
124
    name: "InfiniteScrollSelect"
125
}
126
</script>
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/LicensesFormAdd.vue (-5 / +5 lines)
Lines 28-39 Link Here
28
                                <label for="license_vendor_id"
28
                                <label for="license_vendor_id"
29
                                    >{{ $__("Vendor") }}:</label
29
                                    >{{ $__("Vendor") }}:</label
30
                                >
30
                                >
31
                                <v-select
31
                                <InfiniteScrollSelect 
32
                                    id="license_vendor_id"
32
                                    :id="'license_vendor_id'"
33
                                    v-model="license.vendor_id"
33
                                    v-model="license.vendor_id"
34
                                    label="name"
34
                                    :dataType="'vendors'"
35
                                    :reduce="vendor => vendor.id"
36
                                    :options="vendors"
37
                                />
35
                                />
38
                            </li>
36
                            </li>
39
                            <li>
37
                            <li>
Lines 148-153 Link Here
148
import { inject } from "vue"
146
import { inject } from "vue"
149
import flatPickr from "vue-flatpickr-component"
147
import flatPickr from "vue-flatpickr-component"
150
import UserRoles from "./UserRoles.vue"
148
import UserRoles from "./UserRoles.vue"
149
import InfiniteScrollSelect from "./InfiniteScrollSelect.vue"
151
import Documents from "./Documents.vue"
150
import Documents from "./Documents.vue"
152
import { setMessage, setError, setWarning } from "../../messages"
151
import { setMessage, setError, setWarning } from "../../messages"
153
import { fetchLicense } from "../../fetch"
152
import { fetchLicense } from "../../fetch"
Lines 290-295 export default { Link Here
290
        flatPickr,
289
        flatPickr,
291
        UserRoles,
290
        UserRoles,
292
        Documents,
291
        Documents,
292
        InfiniteScrollSelect
293
    },
293
    },
294
    name: "LicensesFormAdd",
294
    name: "LicensesFormAdd",
295
}
295
}
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/fetch.js (-11 / +29 lines)
Lines 1-5 Link Here
1
import { setError } from "./messages";
1
import { setError } from "./messages";
2
2
3
const returnedValuesPerPage = 20
4
3
export const fetchAgreement = async function (agreement_id) {
5
export const fetchAgreement = async function (agreement_id) {
4
    if (!agreement_id) return;
6
    if (!agreement_id) return;
5
    const apiUrl = "/api/v1/erm/agreements/" + agreement_id;
7
    const apiUrl = "/api/v1/erm/agreements/" + agreement_id;
Lines 22-29 export const fetchAgreement = async function (agreement_id) { Link Here
22
    return agreement;
24
    return agreement;
23
};
25
};
24
26
25
export const fetchAgreements = async function () {
27
export const fetchAgreements = async function (page) {
26
    const apiUrl = "/api/v1/erm/agreements?_per_page=-1";
28
    const apiUrl = page ? 
29
        `/api/v1/erm/agreements?_page=${page}&_per_page=${returnedValuesPerPage}`
30
        :
31
        "/api/v1/erm/agreements?_per_page=-1"
27
    let agreements;
32
    let agreements;
28
    await fetch(apiUrl)
33
    await fetch(apiUrl)
29
        .then(checkError)
34
        .then(checkError)
Lines 59-66 export const fetchLicense = async function (license_id) { Link Here
59
    return license;
64
    return license;
60
};
65
};
61
66
62
export const fetchLicenses = async function () {
67
export const fetchLicenses = async function (page) {
63
    const apiUrl = "/api/v1/erm/licenses?_per_page=-1";
68
    const apiUrl = page ? 
69
        `/api/v1/erm/licenses?_page=${page}&_per_page=${returnedValuesPerPage}`
70
        :
71
        "/api/v1/erm/licenses?_per_page=-1";
64
    let licenses;
72
    let licenses;
65
    await fetch(apiUrl, {
73
    await fetch(apiUrl, {
66
        headers: {
74
        headers: {
Lines 96-103 export const fetchPatron = async function (patron_id) { Link Here
96
    return patron;
104
    return patron;
97
};
105
};
98
106
99
export const fetchVendors = async function () {
107
export const fetchVendors = async function (page) {
100
    const apiUrl = "/api/v1/acquisitions/vendors?_per_page=-1";
108
    const apiUrl = page ? 
109
        `/api/v1/acquisitions/vendors?_page=${page}&_per_page=${returnedValuesPerPage}`
110
        :
111
        "/api/v1/acquisitions/vendors?_per_page=-1";
101
    let vendors;
112
    let vendors;
102
    await fetch(apiUrl)
113
    await fetch(apiUrl)
103
        .then(checkError)
114
        .then(checkError)
Lines 206-217 export const _fetchPackages = async function (apiUrl) { Link Here
206
        );
217
        );
207
    return packages;
218
    return packages;
208
};
219
};
209
export const fetchLocalPackages = function () {
220
export const fetchLocalPackages = function (page) {
210
    const apiUrl = "/api/v1/erm/eholdings/local/packages?_per_page=-1";
221
    const apiUrl = page ? 
222
        `/api/v1/erm/eholdings/local/packages?_page=${page}&_per_page=${returnedValuesPerPage}`
223
        :
224
        "/api/v1/erm/eholdings/local/packages?_per_page=-1"
225
211
    return _fetchPackages(apiUrl);
226
    return _fetchPackages(apiUrl);
212
};
227
};
213
export const fetchEBSCOPackages = function () {
228
export const fetchEBSCOPackages = function (page) {
214
    const apiUrl = "/api/v1/erm/eholdings/ebsco/packages";
229
    const apiUrl = page ? 
230
        `/api/v1/erm/eholdings/ebsco/packages?_page=${page}&_per_page=${returnedValuesPerPage}`
231
        :
232
        "/api/v1/erm/eholdings/ebsco/packages?_per_page=-1"
233
215
    return _fetchPackages(apiUrl);
234
    return _fetchPackages(apiUrl);
216
};
235
};
217
236
218
- 

Return to bug 32474