Bugzilla – Attachment 174120 Details for
Bug 38010
Migrate vendors to Vue
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 38010: Add the component to display a vendor
Bug-38010-Add-the-component-to-display-a-vendor.patch (text/plain), 23.57 KB, created by
Matt Blenkinsop
on 2024-11-07 11:48:30 UTC
(
hide
)
Description:
Bug 38010: Add the component to display a vendor
Filename:
MIME Type:
Creator:
Matt Blenkinsop
Created:
2024-11-07 11:48:30 UTC
Size:
23.57 KB
patch
obsolete
>From c36ad70e05dbc54d723d7e8f74377030b41b3de9 Mon Sep 17 00:00:00 2001 >From: Matt Blenkinsop <matt.blenkinsop@ptfs-europe.com> >Date: Wed, 11 Sep 2024 13:33:10 +0000 >Subject: [PATCH] Bug 38010: Add the component to display a vendor > >--- > Koha/Acquisition/Bookseller.pm | 21 +++ > api/v1/swagger/definitions/vendor.yaml | 9 ++ > .../swagger/paths/acquisitions_vendors.yaml | 15 +++ > .../vue/components/Vendors/VendorContacts.vue | 97 ++++++++++++++ > .../components/Vendors/VendorContracts.vue | 64 +++++++++ > .../vue/components/Vendors/VendorDetails.vue | 78 +++++++++++ > .../components/Vendors/VendorInterfaces.vue | 54 ++++++++ > .../Vendors/VendorOrderingInformation.vue | 75 +++++++++++ > .../js/vue/components/Vendors/VendorShow.vue | 123 ++++++++++++++++++ > .../Vendors/VendorSubscriptions.vue | 27 ++++ > .../js/vue/fetch/acquisition-api-client.js | 6 +- > 11 files changed, 565 insertions(+), 4 deletions(-) > create mode 100644 koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorContacts.vue > create mode 100644 koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorContracts.vue > create mode 100644 koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorDetails.vue > create mode 100644 koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorInterfaces.vue > create mode 100644 koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorOrderingInformation.vue > create mode 100644 koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorShow.vue > create mode 100644 koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorSubscriptions.vue > >diff --git a/Koha/Acquisition/Bookseller.pm b/Koha/Acquisition/Bookseller.pm >index 098a0be19bd..3a77d324d10 100644 >--- a/Koha/Acquisition/Bookseller.pm >+++ b/Koha/Acquisition/Bookseller.pm >@@ -23,6 +23,8 @@ use Koha::Acquisition::Bookseller::Interfaces; > use Koha::Acquisition::Bookseller::Issues; > use Koha::Subscriptions; > >+use C4::Contract qw( GetContracts ); >+ > use base qw( Koha::Object ); > > =head1 NAME >@@ -63,6 +65,25 @@ sub contacts { > return Koha::Acquisition::Bookseller::Contacts->_new_from_dbic( $contacts_rs ); > } > >+=head3 contracts >+ >+ my $vendor = Koha::Acquisition::Booksellers->find( $id ); >+ my @contracts = $vendor->contracts(); >+ >+Returns the list of contracts for the vendor >+ >+=cut >+ >+sub contracts { >+ my ($self) = @_; >+ return GetContracts( >+ { >+ booksellerid => $self->id, >+ } >+ ); >+} >+ >+ > =head3 subscriptions > > my $vendor = Koha::Acquisition::Booksellers->find( $id ); >diff --git a/api/v1/swagger/definitions/vendor.yaml b/api/v1/swagger/definitions/vendor.yaml >index 87a5c4440dc..5698ba970d1 100644 >--- a/api/v1/swagger/definitions/vendor.yaml >+++ b/api/v1/swagger/definitions/vendor.yaml >@@ -125,6 +125,15 @@ properties: > subscriptions: > type: array > description: List of subscriptions >+ interfaces: >+ type: array >+ description: List of interfaces >+ contacts: >+ type: array >+ description: List of contacts >+ contracts: >+ type: array >+ description: List of contracts > additionalProperties: false > required: > - name >diff --git a/api/v1/swagger/paths/acquisitions_vendors.yaml b/api/v1/swagger/paths/acquisitions_vendors.yaml >index e671dea9742..6a091cb318f 100644 >--- a/api/v1/swagger/paths/acquisitions_vendors.yaml >+++ b/api/v1/swagger/paths/acquisitions_vendors.yaml >@@ -137,6 +137,21 @@ > summary: Get vendor > parameters: > - $ref: "../swagger.yaml#/parameters/vendor_id_pp" >+ - name: x-koha-embed >+ in: header >+ required: false >+ description: Embed list sent as a request header >+ type: array >+ items: >+ type: string >+ enum: >+ - aliases >+ - baskets >+ - subscriptions >+ - interfaces >+ - contacts >+ - contracts >+ collectionFormat: csv > produces: > - application/json > responses: >diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorContacts.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorContacts.vue >new file mode 100644 >index 00000000000..61a56e3e7d3 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorContacts.vue >@@ -0,0 +1,97 @@ >+<template> >+ <fieldset class="rows"> >+ <h2> >+ {{ $__("Contact") }} >+ </h2> >+ <span v-if="vendor.contacts.length === 0">{{ >+ $__("No contacts") >+ }}</span> >+ <ol v-for="contact in vendor.contacts" :key="contact.id"> >+ <legend>{{ contact.name }}</legend> >+ <li> >+ <label>{{ $__("Position") }}:</label> >+ <span>{{ contact.position }}</span> >+ </li> >+ <li> >+ <label>{{ $__("Phone") }}:</label> >+ <span>{{ contact.phone }}</span> >+ </li> >+ <li> >+ <label>{{ $__("Alternative phone") }}:</label> >+ <span>{{ contact.altphone }}</span> >+ </li> >+ <li> >+ <label>{{ $__("Fax") }}:</label> >+ <span>{{ contact.fax }}</span> >+ </li> >+ <li v-if="contact.email"> >+ <label>{{ $__("Email") }}:</label> >+ <span> >+ <a :href="`mailto:${contact.email}`" target="_blank">{{ >+ contact.email >+ }}</a> >+ </span> >+ </li> >+ <li v-if="contact.notes"> >+ <label>{{ $__("Notes") }}:</label> >+ <span>{{ contact.notes }}</span> >+ </li> >+ <li >+ v-if=" >+ contact.acqprimary || >+ contact.orderacquisition || >+ contact.claimacquisition >+ " >+ > >+ <span class="label">{{ $__("Acquisitions options") }}:</span> >+ <ol> >+ <li v-if="contact.acqprimary"> >+ <span >+ ><i class="fa fa-check"></i> >+ {{ $__("Primary acquisitions contact") }}</span >+ > >+ </li> >+ <li v-if="contact.orderacquisition"> >+ <span >+ ><i class="fa fa-check"></i> >+ {{ $__("Receives orders") }}</span >+ > >+ </li> >+ <li v-if="contact.claimacquisition"> >+ <span >+ ><i class="fa fa-check"></i> >+ {{ $__("Receives claims for late orders") }}</span >+ > >+ </li> >+ </ol> >+ </li> >+ <li v-if="contact.serialsprimary || contact.claimissues"> >+ <span class="label">{{ $__("Serials options") }}:</span> >+ <ol> >+ <li v-if="contact.serialsprimary"> >+ <span >+ ><i class="fa fa-check"></i> >+ {{ $__("Primary serials contact") }}</span >+ > >+ </li> >+ <li v-if="contact.claimissues"> >+ <span >+ ><i class="fa fa-check"></i> >+ {{ $__("Receives claims for late issues") }}</span >+ > >+ </li> >+ </ol> >+ </li> >+ </ol> >+ </fieldset> >+</template> >+ >+<script> >+export default { >+ props: { >+ vendor: Object, >+ }, >+} >+</script> >+ >+<style></style> >diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorContracts.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorContracts.vue >new file mode 100644 >index 00000000000..068d7a549c8 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorContracts.vue >@@ -0,0 +1,64 @@ >+<template> >+ <h2>{{ $__("Contract(s)") }}</h2> >+ <div class="dataTables_wrapper no-footer"> >+ <table id="contractst"> >+ <thead> >+ <tr> >+ <th scope="col">{{ $__("Name") }}</th> >+ <th scope="col">{{ $__("Description") }}</th> >+ <th scope="col">{{ $__("Start date") }}</th> >+ <th scope="col">{{ $__("End date") }}</th> >+ <!-- PERMISSION CAN_user_acquisition_contracts_manage --> >+ <th v-if="false" scope="col" class="NoSort noExport"> >+ {{ $__("Actions") }} >+ </th> >+ </tr> >+ </thead> >+ <tbody> >+ <tr v-for="(contract, i) in vendor.contracts" :key="i"> >+ <td> >+ <a >+ :href="`/cgi-bin/koha/admin/aqcontract.pl?op=add_form&contractnumber=${contract.contractnumber}&booksellerid=${contract.booksellerid}`" >+ >{{ contract.contractname }}</a >+ > >+ </td> >+ <td>{{ contract.contractdescription }}</td> >+ <td :data-order="contract.contractstartdate"> >+ {{ contract.contractstartdate }} >+ </td> >+ <td :data-order="contract.contractenddate"> >+ {{ contract.contractenddate }} >+ </td> >+ <!-- PERMISSION CAN_user_acquisition_contracts_manage --> >+ <td class="actions" v-if="false"> >+ <a >+ class="btn btn-default btn-xs" >+ :href="`/cgi-bin/koha/admin/aqcontract.pl?op=add_form&contractnumber=${contract.contractnumber}&booksellerid=${contract.booksellerid}`" >+ ><i >+ class="fa-solid fa-pencil" >+ aria-hidden="true" >+ ></i> >+ {{ $__("Edit") }}</a >+ > >+ <a >+ class="btn btn-default btn-xs" >+ :href="`/cgi-bin/koha/admin/aqcontract.pl?op=delete_confirm&contractnumber=${contract.contractnumber}&booksellerid=${contract.booksellerid}`" >+ ><i class="fa fa-trash-can"></i> >+ {{ $__("Delete") }}</a >+ > >+ </td> >+ </tr> >+ </tbody> >+ </table> >+ </div> >+</template> >+ >+<script> >+export default { >+ props: { >+ vendor: Object, >+ }, >+} >+</script> >+ >+<style></style> >diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorDetails.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorDetails.vue >new file mode 100644 >index 00000000000..dfafd08075d >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorDetails.vue >@@ -0,0 +1,78 @@ >+<template> >+ <fieldset class="rows"> >+ <h2> >+ {{ $__("Vendor details") }} >+ </h2> >+ <ol> >+ <li> >+ <label>{{ $__("Type") }}:</label> >+ <span> >+ {{ vendor.type }} >+ </span> >+ </li> >+ <li> >+ <label>{{ $__("Company name") }}:</label> >+ <span> >+ {{ vendor.name }} >+ </span> >+ </li> >+ <li> >+ <label>{{ $__("Postal address") }}:</label> >+ <span> >+ {{ vendor.postal }} >+ </span> >+ </li> >+ <li> >+ <label>{{ $__("Physical address") }}:</label> >+ <span> >+ {{ vendor.address1 }} >+ {{ vendor.address2 }} >+ {{ vendor.address3 }} >+ {{ vendor.address4 }} >+ </span> >+ </li> >+ <li> >+ <label>{{ $__("Phone") }}:</label> >+ <span> >+ {{ vendor.phone }} >+ </span> >+ </li> >+ <li> >+ <label>{{ $__("Fax") }}:</label> >+ <span> >+ {{ vendor.fax }} >+ </span> >+ </li> >+ <li v-if="vendor.url"> >+ <label>{{ $__("Website") }}:</label> >+ <span> >+ {{ vendor.url }} >+ </span> >+ </li> >+ <li v-if="vendor.accountnumber"> >+ <label>{{ $__("Account number") }}:</label> >+ <span> >+ {{ vendor.accountnumber }} >+ </span> >+ </li> >+ <li v-if="vendor.aliases.count"> >+ <label>{{ $__("Aliases") }}:</label> >+ <ul> >+ <li v-for="alias in vendor.aliases" :key="alias"> >+ {{ alias }} >+ </li> >+ </ul> >+ </li> >+ </ol> >+ </fieldset> >+</template> >+ >+<script> >+export default { >+ props: { >+ vendor: Object, >+ }, >+} >+</script> >+ >+<style></style> >diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorInterfaces.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorInterfaces.vue >new file mode 100644 >index 00000000000..2df655378b5 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorInterfaces.vue >@@ -0,0 +1,54 @@ >+<template> >+ <fieldset class="rows"> >+ <h2> >+ {{ $__("Interfaces") }} >+ </h2> >+ <ol v-for="vi in vendor.interfaces" :key="vi.id"> >+ <legend>{{ vi.name }}</legend> >+ <li> >+ <label>{{ $__("Type") }}:</label> >+ <span> NEED AUTHORISED VALUES </span> >+ </li> >+ <li v-if="vi.uri"> >+ <label>{{ $__("URI") }}:</label> >+ <span> >+ <a :href="vi.uri" target="_blank">{{ vi.uri }}</a> >+ </span> >+ </li> >+ <li v-if="vi.login"> >+ <label>{{ $__("Login") }}:</label> >+ <span> >+ {{ vi.login }} >+ </span> >+ </li> >+ <li v-if="vi.password"> >+ <label>{{ $__("Password") }}:</label> >+ <span> >+ {{ vi.password }} >+ </span> >+ </li> >+ <li v-if="vi.account_email"> >+ <label>{{ $__("Account email") }}:</label> >+ <span> >+ {{ vi.account_email }} >+ </span> >+ </li> >+ <li v-if="vi.notes"> >+ <label>{{ $__("Notes") }}:</label> >+ <span> >+ {{ vi.notes }} >+ </span> >+ </li> >+ </ol> >+ </fieldset> >+</template> >+ >+<script> >+export default { >+ props: { >+ vendor: Object, >+ }, >+} >+</script> >+ >+<style></style> >diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorOrderingInformation.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorOrderingInformation.vue >new file mode 100644 >index 00000000000..60a3e621570 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorOrderingInformation.vue >@@ -0,0 +1,75 @@ >+<template> >+ <fieldset class="rows"> >+ <h2> >+ {{ $__("Ordering information") }} >+ </h2> >+ <ol> >+ <li> >+ <label>{{ $__("Vendor is") }}:</label> >+ <span> >+ {{ vendor.active ? $__("Active") : $__("Inactive") }} >+ </span> >+ </li> >+ <li> >+ <label>{{ $__("List prices are") }}:</label> >+ <span> >+ {{ vendor.listprice }} >+ </span> >+ </li> >+ <li> >+ <label>{{ $__("Invoice prices are") }}:</label> >+ <span> >+ {{ vendor.invoiceprice }} >+ </span> >+ </li> >+ <li v-if="vendor.tax_rate"> >+ <label>{{ $__("Tax number registered") }}:</label> >+ <span> >+ {{ vendor.gstreg ? $__("Yes") : $__("No") }} >+ </span> >+ </li> >+ <li v-if="vendor.tax_rate"> >+ <label>{{ $__("List item price includes tax") }}:</label> >+ <span> >+ {{ vendor.listincgst ? $__("Yes") : $__("No") }} >+ </span> >+ </li> >+ <li v-if="vendor.tax_rate"> >+ <label>{{ $__("Invoice item price includes tax") }}:</label> >+ <span> >+ {{ vendor.invoiceincgst ? $__("Yes") : $__("No") }} >+ </span> >+ </li> >+ <li> >+ <label>{{ $__("Discount") }}:</label> >+ <span> >+ {{ vendor.discount || 0 }} >+ </span> >+ </li> >+ <li> >+ <label>{{ $__("Tax rate") }}:</label> >+ <span> >+ {{ (vendor.tax_rate || 0) * 100 }} >+ </span> >+ </li> >+ <li v-if="vendor.deliverytime"> >+ <label>{{ $__("Delivery time") }}:</label> >+ <span> {{ vendor.deliverytime }} days </span> >+ </li> >+ <li v-if="vendor.notes"> >+ <label>{{ $__("Notes") }}:</label> >+ <span> {{ vendor.notes }} days </span> >+ </li> >+ </ol> >+ </fieldset> >+</template> >+ >+<script> >+export default { >+ props: { >+ vendor: Object, >+ }, >+} >+</script> >+ >+<style></style> >diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorShow.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorShow.vue >new file mode 100644 >index 00000000000..bb4b06a05b2 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorShow.vue >@@ -0,0 +1,123 @@ >+<template> >+ <div v-if="!initialized">{{ $__("Loading") }}</div> >+ <div v-else id="vendors_show"> >+ <Toolbar> >+ <ToolbarButton >+ :to="{ name: 'VendorList' }" >+ icon="plus" >+ :title="$__('New vendor')" >+ /> >+ <ToolbarButton >+ :to="{ name: 'VendorList' }" >+ icon="pencil" >+ :title="$__('Edit vendor')" >+ /> >+ <ExternalLinkButton >+ :to="{ >+ path: '/cgi-bin/koha/acqui/parcels.pl', >+ query: { booksellerid: vendor.id }, >+ }" >+ icon="plus" >+ :title="$__('Receive shipments')" >+ /> >+ </Toolbar> >+ <h1> >+ {{ vendor.name }} >+ </h1> >+ <div class="row"> >+ <div class="col-sm-6"> >+ <VendorDetails :vendor="vendor" /> >+ <VendorOrderingInformation :vendor="vendor" /> >+ <VendorInterfaces >+ :vendor="vendor" >+ v-if="vendor.interfaces.length > 0" >+ /> >+ </div> >+ <div class="col-sm-6"> >+ <VendorContacts :vendor="vendor" /> >+ <VendorSubscriptions :vendor="vendor" /> >+ </div> >+ </div> >+ <div >+ class="page-section rows" >+ v-if="vendor.contracts && vendor.contracts.length > 0" >+ > >+ <VendorContracts :vendor="vendor" /> >+ </div> >+ </div> >+</template> >+ >+<script> >+import Toolbar from "../Toolbar.vue" >+import ToolbarButton from "../ToolbarButton.vue" >+import { inject } from "vue" >+import { APIClient } from "../../fetch/api-client.js" >+import ExternalLinkButton from "../ExternalLinkButton.vue" >+import VendorDetails from "./VendorDetails.vue" >+import VendorOrderingInformation from "./VendorOrderingInformation.vue" >+import VendorInterfaces from "./VendorInterfaces.vue" >+import VendorContacts from "./VendorContacts.vue" >+import VendorSubscriptions from "./VendorSubscriptions.vue" >+import VendorContracts from "./VendorContracts.vue" >+ >+export default { >+ setup() { >+ const format_date = $date >+ const patron_to_html = $patron_to_html >+ >+ const { setConfirmationDialog, setMessage } = inject("mainStore") >+ >+ // const AVStore = inject("AVStore") >+ // const { get_lib_from_av } = AVStore >+ >+ return { >+ format_date, >+ patron_to_html, >+ // get_lib_from_av, >+ setConfirmationDialog, >+ setMessage, >+ } >+ }, >+ data() { >+ return { >+ vendor: null, >+ initialized: false, >+ } >+ }, >+ beforeRouteEnter(to, from, next) { >+ next(vm => { >+ vm.getVendor(to.params.vendor_id) >+ }) >+ }, >+ methods: { >+ async getVendor(vendor_id) { >+ const client = APIClient.acquisition >+ client.vendors.get(vendor_id).then( >+ vendor => { >+ this.vendor = vendor >+ this.initialized = true >+ }, >+ error => {} >+ ) >+ }, >+ }, >+ components: { >+ Toolbar, >+ ToolbarButton, >+ ExternalLinkButton, >+ VendorDetails, >+ VendorOrderingInformation, >+ VendorInterfaces, >+ VendorContacts, >+ VendorSubscriptions, >+ VendorContracts, >+ }, >+ name: "VendorShow", >+} >+</script> >+ >+<style> >+.vendor_info { >+ display: grid; >+} >+</style> >diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorSubscriptions.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorSubscriptions.vue >new file mode 100644 >index 00000000000..a0b7650ea33 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorSubscriptions.vue >@@ -0,0 +1,27 @@ >+<template> >+ <fieldset class="rows"> >+ <h2> >+ {{ $__("Subscription details") }} >+ </h2> >+ <!-- PERMISSION --> >+ <p> >+ <strong>{{ $__("Number of subscriptions") }}: </strong> >+ <a >+ v-if="false" >+ :href="`/cgi-bin/koha/serials/serials-search.pl?bookseller_filter=${vendor.name}&searched=1`" >+ >{{ vendor.subscriptions.length }}</a >+ > >+ <span v-if="true">{{ vendor.subscriptions.length }}</span> >+ </p> >+ </fieldset> >+</template> >+ >+<script> >+export default { >+ props: { >+ vendor: Object, >+ }, >+} >+</script> >+ >+<style></style> >diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/fetch/acquisition-api-client.js b/koha-tmpl/intranet-tmpl/prog/js/vue/fetch/acquisition-api-client.js >index 2f1417fe4c2..37c265f545e 100644 >--- a/koha-tmpl/intranet-tmpl/prog/js/vue/fetch/acquisition-api-client.js >+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/fetch/acquisition-api-client.js >@@ -13,7 +13,8 @@ export class AcquisitionAPIClient extends HttpClient { > this.get({ > endpoint: "vendors/" + id, > headers: { >- "x-koha-embed": "aliases", >+ "x-koha-embed": >+ "baskets,aliases,subscriptions,interfaces,contacts,contracts", > }, > }), > getAll: (query, params) => >@@ -21,9 +22,6 @@ export class AcquisitionAPIClient extends HttpClient { > endpoint: "vendors", > query, > params, >- headers: { >- "x-koha-embed": "aliases,baskets", >- }, > }), > delete: id => > this.delete({ >-- >2.39.3 (Apple Git-146)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 38010
:
174119
|
174120
|
174121
|
174122
|
174123
|
174124
|
174125
|
174126
|
174128
|
174129
|
174130
|
174131
|
174132
|
174133
|
174134
|
174135
|
174136
|
174137
|
174138
|
174139
|
174140
|
174141
|
174142
|
174143
|
174144
|
174145
|
174146
|
174147
|
174148
|
174151
|
174152
|
174153
|
174154
|
174155
|
174156
|
174157
|
174158
|
174159
|
174160
|
174161
|
174162
|
174163
|
174164
|
174165
|
174166
|
174167
|
174168
|
174169
|
174170
|
174171
|
174172
|
174173
|
174174
|
174175
|
174176
|
174177
|
174178
|
174179
|
174194
|
174196
|
174197
|
174198
|
174199
|
174200
|
174201
|
174202
|
174203
|
174204
|
174205
|
174206
|
174207
|
174208
|
174209
|
174210
|
174211
|
174212
|
174213
|
174214
|
174215
|
174216
|
174217
|
174218
|
174220
|
174221
|
174222
|
174223
|
174224
|
174225
|
174226
|
174248
|
174266
|
174267
|
174269
|
174270
|
174273
|
174327
|
174328
|
174329
|
174330
|
174331
|
174332
|
174333
|
174334
|
174335
|
174336
|
174337
|
174338
|
174339
|
174340
|
174341
|
174342
|
174343
|
174344
|
174345
|
174346
|
174347
|
174348
|
174349
|
174350
|
174351
|
174352
|
174353
|
174354
|
174355
|
174356
|
174357
|
174358
|
174359
|
174360
|
174603