Bugzilla – Attachment 175783 Details for
Bug 38290
Add library group limits to vendors
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 38290: Add fields to the UI for CRUD
Bug-38290-Add-fields-to-the-UI-for-CRUD.patch (text/plain), 25.74 KB, created by
Matt Blenkinsop
on 2024-12-19 16:30:34 UTC
(
hide
)
Description:
Bug 38290: Add fields to the UI for CRUD
Filename:
MIME Type:
Creator:
Matt Blenkinsop
Created:
2024-12-19 16:30:34 UTC
Size:
25.74 KB
patch
obsolete
>From 81b189950cba977afb32b4a6ac6f5b70cbfd5a1a Mon Sep 17 00:00:00 2001 >From: Matt Blenkinsop <matt.blenkinsop@ptfs-europe.com> >Date: Tue, 29 Oct 2024 16:53:18 +0000 >Subject: [PATCH] Bug 38290: Add fields to the UI for CRUD > >--- > acqui/vendors.pl | 3 +- > admin/library_groups.pl | 4 + > api/v1/swagger/definitions/vendor.yaml | 8 + > .../swagger/paths/acquisitions_vendors.yaml | 1 + > .../prog/en/modules/acqui/vendors.tt | 3 + > .../prog/en/modules/admin/library_groups.tt | 25 +++- > .../prog/js/vue/components/Vendors/Main.vue | 24 ++- > .../vue/components/Vendors/VendorDetails.vue | 45 ++++++ > .../vue/components/Vendors/VendorFormAdd.vue | 16 ++ > .../js/vue/fetch/acquisition-api-client.js | 2 +- > .../prog/js/vue/stores/vendors.js | 140 ++++++++++++++++++ > 11 files changed, 263 insertions(+), 8 deletions(-) > >diff --git a/acqui/vendors.pl b/acqui/vendors.pl >index b9d2628e805..a13936c8972 100755 >--- a/acqui/vendors.pl >+++ b/acqui/vendors.pl >@@ -49,7 +49,8 @@ $template->param( > currencies => Koha::Acquisition::Currencies->search->unblessed, > gst_values => \@gst_values, > edifact => C4::Context->preference('EDIFACT'), >- erm_module => C4::Context->preference('ERMModule') >+ erm_module => C4::Context->preference('ERMModule'), >+ logged_in_branch => { branchcode => C4::Context::mybranch }, > ); > > output_html_with_http_headers $query, $cookie, $template->output; >diff --git a/admin/library_groups.pl b/admin/library_groups.pl >index 84dc309c667..23fc929b222 100755 >--- a/admin/library_groups.pl >+++ b/admin/library_groups.pl >@@ -52,6 +52,7 @@ if ( $op eq 'cud-add' ) { > my $ft_search_groups_staff = $cgi->param('ft_search_groups_staff') || 0; > my $ft_local_hold_group = $cgi->param('ft_local_hold_group') || 0; > my $ft_local_float_group = $cgi->param('ft_local_float_group') || 0; >+ my $ft_acquisitions = $cgi->param('ft_acquisitions') || 0; > > if ( !$branchcode && Koha::Library::Groups->search( { title => $title } )->count() ) { > $template->param( error_duplicate_title => $title ); >@@ -69,6 +70,7 @@ if ( $op eq 'cud-add' ) { > ft_local_hold_group => $ft_local_hold_group, > ft_limit_item_editing => $ft_limit_item_editing, > ft_local_float_group => $ft_local_float_group, >+ ft_acquisitions => $ft_acquisitions, > branchcode => $branchcode, > } > )->store(); >@@ -91,6 +93,7 @@ elsif ( $op eq 'cud-edit' ) { > my $ft_search_groups_staff = $cgi->param('ft_search_groups_staff') || 0; > my $ft_local_hold_group = $cgi->param('ft_local_hold_group') || 0; > my $ft_local_float_group = $cgi->param('ft_local_float_group') || 0; >+ my $ft_acquisitions = $cgi->param('ft_acquisitions') || 0; > > if ($id) { > my $group = Koha::Library::Groups->find($id); >@@ -105,6 +108,7 @@ elsif ( $op eq 'cud-edit' ) { > ft_search_groups_staff => $ft_search_groups_staff, > ft_local_hold_group => $ft_local_hold_group, > ft_local_float_group => $ft_local_float_group, >+ ft_acquisitions => $ft_acquisitions, > } > )->store(); > >diff --git a/api/v1/swagger/definitions/vendor.yaml b/api/v1/swagger/definitions/vendor.yaml >index 5ab146b4a2a..c99bb48024e 100644 >--- a/api/v1/swagger/definitions/vendor.yaml >+++ b/api/v1/swagger/definitions/vendor.yaml >@@ -124,6 +124,14 @@ properties: > - string > - "null" > description: Language >+ lib_group_visibility: >+ type: >+ - string >+ - "null" >+ description: Language >+ lib_group_limits: >+ type: array >+ description: Library groups this vendor belongs to > aliases: > type: array > description: List of aliases >diff --git a/api/v1/swagger/paths/acquisitions_vendors.yaml b/api/v1/swagger/paths/acquisitions_vendors.yaml >index 67ce39d8ad1..8932c450556 100644 >--- a/api/v1/swagger/paths/acquisitions_vendors.yaml >+++ b/api/v1/swagger/paths/acquisitions_vendors.yaml >@@ -158,6 +158,7 @@ > - contracts > - extended_attributes > - +strings >+ - lib_group_limits > collectionFormat: csv > produces: > - application/json >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/vendors.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/vendors.tt >index 17d350e1a97..aecf20a8a7e 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/vendors.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/vendors.tt >@@ -34,6 +34,9 @@ > const gstValues = [% To.json(gst_values) | $raw %]; > const edifact = [% To.json(edifact) | $raw %]; > const ermModule = [% To.json(erm_module) | $raw %]; >+ const loggedInUser = [% To.json(logged_in_user.unblessed) | $raw %]; >+ const loggedInBranch = [% To.json(logged_in_branch) | $raw %]; >+ > </script> > > >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/library_groups.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/library_groups.tt >index 8120dd647a2..7034f661e38 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/library_groups.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/library_groups.tt >@@ -166,6 +166,12 @@ > Is local float group > </label> > </p> >+ <p> >+ <label> >+ <input type="checkbox" name="ft_acquisitions" id="add-group-modal-ft_acquisitions" value="1" /> >+ Use in the acquisitions module >+ </label> >+ </p> > </div> > </div> > </div> >@@ -244,6 +250,12 @@ > Is local float group > </label> > </p> >+ <p> >+ <label> >+ <input type="checkbox" id="edit-group-modal-ft_acquisitions" name="ft_acquisitions" value="1" /> >+ Use in the acquisitions module >+ </label> >+ </p> > </div> > </div> > </div> >@@ -330,7 +342,8 @@ > var ft_search_groups_staff = $(this).data('groupFt_search_groups_staff'); > var ft_local_hold_group = $(this).data('groupFt_local_hold_group'); > var ft_local_float_group = $(this).data('groupFt_local_float_group'); >- edit_group( id, parent_id, title, description, ft_hide_patron_info, ft_search_groups_opac, ft_search_groups_staff, ft_local_hold_group, ft_limit_item_editing, ft_local_float_group ); >+ var ft_acquisitions = $(this).data('groupFt_acquisitions'); >+ edit_group( id, parent_id, title, description, ft_hide_patron_info, ft_search_groups_opac, ft_search_groups_staff, ft_local_hold_group, ft_limit_item_editing, ft_local_float_group, ft_acquisitions ); > }); > > $('.delete-group').on('click', function(e) { >@@ -368,6 +381,7 @@ > $('#add-group-modal-ft_search_groups_staff').prop('checked', false); > $('#add-group-modal-ft_local_hold_group').prop('checked', false); > $('#add-group-modal-ft_local_float_group').prop('checked', false); >+ $('#add-group-modal-ft_acquisitions').prop('checked', false); > if ( parent_id ) { > $('#root-group-features-add').hide(); > } else { >@@ -377,7 +391,7 @@ > > } > >- function edit_group( id, parent_id, title, description, ft_hide_patron_info, ft_search_groups_opac, ft_search_groups_staff, ft_local_hold_group, ft_limit_item_editing, ft_local_float_group ) { >+ function edit_group( id, parent_id, title, description, ft_hide_patron_info, ft_search_groups_opac, ft_search_groups_staff, ft_local_hold_group, ft_limit_item_editing, ft_local_float_group, ft_acquisitions ) { > $('#edit-group-modal-id').val( id ); > $('#edit-group-modal-title').val( title ); > $('#edit-group-modal-description').val( description ); >@@ -388,6 +402,7 @@ > $('#edit-group-modal-ft_search_groups_staff').prop('checked', false); > $('#edit-group-modal-ft_local_hold_group').prop('checked', false); > $('#edit-group-modal-ft_local_float_group').prop('checked', false); >+ $('#edit-group-modal-ft_acquisitions').prop('checked', false); > $('#root-group-features-edit').hide(); > } else { > $('#edit-group-modal-ft_hide_patron_info').prop('checked', ft_hide_patron_info ? true : false ); >@@ -396,6 +411,7 @@ > $('#edit-group-modal-ft_search_groups_staff').prop('checked', ft_search_groups_staff ? true : false ); > $('#edit-group-modal-ft_local_hold_group').prop('checked', ft_local_hold_group ? true : false ); > $('#edit-group-modal-ft_local_float_group').prop('checked', ft_local_float_group ? true : false ); >+ $('#edit-group-modal-ft_acquisitions').prop('checked', ft_acquisitions ? true : false ); > $('#root-group-features-edit').show(); > } > >@@ -457,6 +473,9 @@ > [% IF group.ft_local_float_group %] > <li>Is local float group</li> > [% END %] >+ [% IF group.ft_acquisitions %] >+ <li>Use in the acquisitions module</li> >+ [% END %] > </ul> > [% END %] > </td> >@@ -474,7 +493,7 @@ > </li> > > <li> >- <a class="edit-group dropdown-item" id="edit-group-[% group.id | html %]" href="#" data-group-id="[% group.id | html %]" data-group-parent-id="[% group.parent_id | html %]" data-group-title="[% group.title | html %]" data-group-description="[% group.description | html %]" data-group-ft_hide_patron_info="[% group.ft_hide_patron_info | html %]" data-group-ft_search_groups_opac="[% group.ft_search_groups_opac | html %]" data-group-ft_search_groups_staff="[% group.ft_search_groups_staff | html %]" data-group-ft_local_hold_group="[% group.ft_local_hold_group | html %]" data-group-ft_limit_item_editing="[% group.ft_limit_item_editing | html %]" data-group-ft_local_float_group="[% group.ft_local_float_group | html %]" > >+ <a class="edit-group dropdown-item" id="edit-group-[% group.id | html %]" href="#" data-group-id="[% group.id | html %]" data-group-parent-id="[% group.parent_id | html %]" data-group-title="[% group.title | html %]" data-group-description="[% group.description | html %]" data-group-ft_hide_patron_info="[% group.ft_hide_patron_info | html %]" data-group-ft_search_groups_opac="[% group.ft_search_groups_opac | html %]" data-group-ft_search_groups_staff="[% group.ft_search_groups_staff | html %]" data-group-ft_local_hold_group="[% group.ft_local_hold_group | html %]" data-group-ft_limit_item_editing="[% group.ft_limit_item_editing | html %]" data-group-ft_local_float_group="[% group.ft_local_float_group | html %]" data-group-ft_acquisitions="[% group.ft_acquisitions | html %]" > > <i class="fa-solid fa-pencil" aria-hidden="true"></i> Edit > </a> > </li> >diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/Main.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/Main.vue >index 323e0d8d4c8..ab81e7135a0 100644 >--- a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/Main.vue >+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/Main.vue >@@ -37,7 +37,9 @@ import { APIClient } from "../../fetch/api-client" > export default { > setup() { > const vendorStore = inject("vendorStore") >- const { config } = storeToRefs(vendorStore) >+ const { config, user, currencies, libraryGroups, gstValues } = >+ storeToRefs(vendorStore) >+ const { setLibraryGroups } = vendorStore > > const mainStore = inject("mainStore") > const { loading, loaded, setError } = mainStore >@@ -54,6 +56,11 @@ export default { > userPermissions, > AVStore, > config, >+ user, >+ currencies, >+ libraryGroups, >+ gstValues, >+ setLibraryGroups, > } > }, > beforeCreate() { >@@ -62,6 +69,14 @@ export default { > const fetchConfig = () => { > let promises = [] > >+ const libraryClient = APIClient.libraries >+ libraryClient.libraryGroups.getAll().then( >+ libraryGroups => { >+ this.setLibraryGroups(libraryGroups) >+ }, >+ error => {} >+ ) >+ > const av_client = APIClient.authorised_values > const authorised_values = { > av_vendor_types: "VENDOR_TYPE", >@@ -100,8 +115,11 @@ export default { > this.userPermissions = userPermissions > this.config.settings.edifact = edifact > this.config.settings.ermModule = ermModule >- this.vendorStore.currencies = currencies >- this.vendorStore.gstValues = gstValues.map(gv => { >+ this.currencies = currencies >+ // this.libraryGroups = libraryGroups >+ this.user.loggedInUser = loggedInUser >+ this.user.loggedInUser.loggedInBranch = loggedInBranch.branchcode >+ this.gstValues = gstValues.map(gv => { > return { > label: `${(gv.option * 100).toFixed(2)}%`, > value: gv.option, >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 >index 69333c90250..c8ab8afbc4d 100644 >--- a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorDetails.vue >+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorDetails.vue >@@ -66,6 +66,30 @@ > {{ get_lib_from_av("av_lang", vendor.language) }} > </span> > </li> >+ <li v-if="vendor.lib_group_limits.length"> >+ <label>{{ $__("Library group visibility") }}:</label> >+ <table id="lib_group_visibility_table"> >+ <thead> >+ <tr> >+ <th>{{ $__("ID") }}</th> >+ <th>{{ $__("Title") }}</th> >+ </tr> >+ </thead> >+ <tbody> >+ <tr >+ v-for="(libGroup, key) in vendor.lib_group_limits" >+ v-bind:key="key" >+ > >+ <td>{{ libGroup.id }}</td> >+ <td>{{ libGroup.title }}</td> >+ </tr> >+ </tbody> >+ </table> >+ </li> >+ <li v-else> >+ <label>{{ $__("Library group visibility") }}:</label> >+ <span>{{ $__("All library groups") }}</span> >+ </li> > <li v-if="vendor.aliases.length"> > <label>{{ $__("Aliases") }}:</label> > <ul style="margin-left: 8rem"> >@@ -159,6 +183,21 @@ > /> > <input v-else id="language" v-model="vendor.type" /> > </li> >+ <li> >+ <label for="lib_group_visibility" >+ >{{ $__("Library group visibility") }}:</label >+ > >+ <v-select >+ v-if="av_lang.length" >+ id="lib_group_visibility" >+ v-model="vendor.lib_group_visibility" >+ label="title" >+ :reduce="av => av.id" >+ :options="getVisibleGroups" >+ multiple >+ /> >+ <input v-else id="lib_group_visibility" v-model="vendor.type" /> >+ </li> > <li> > <label for="vendor_aliases">{{ $__("Aliases") }}:</label> > <input id="vendor_aliases" v-model="newAlias" /> >@@ -189,6 +228,7 @@ > <script> > import { inject } from "vue" > import ToolbarButton from "../ToolbarButton.vue" >+import { storeToRefs } from "pinia" > > export default { > props: { >@@ -198,10 +238,15 @@ export default { > setup() { > const AVStore = inject("AVStore") > const { get_lib_from_av, av_vendor_types, av_lang } = AVStore >+ const vendorStore = inject("vendorStore") >+ const { formatLibraryGroupIds } = vendorStore >+ const { getVisibleGroups } = storeToRefs(vendorStore) > return { > get_lib_from_av, > av_vendor_types, > av_lang, >+ getVisibleGroups, >+ formatLibraryGroupIds, > } > }, > data() { >diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorFormAdd.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorFormAdd.vue >index 1265127ced9..98edb530fa8 100644 >--- a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorFormAdd.vue >+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/components/Vendors/VendorFormAdd.vue >@@ -39,8 +39,17 @@ import VendorContacts from "./VendorContacts.vue" > import VendorOrderingInformation from "./VendorOrderingInformation.vue" > import VendorInterfaces from "./VendorInterfaces.vue" > import AdditionalFieldsEntry from "../AdditionalFieldsEntry.vue" >+import { inject } from "vue" > > export default { >+ setup() { >+ const vendorStore = inject("vendorStore") >+ const { formatLibraryGroupIds } = vendorStore >+ >+ return { >+ formatLibraryGroupIds, >+ } >+ }, > data() { > return { > vendor: { >@@ -69,6 +78,7 @@ export default { > external_id: "", > payment_method: [], > language: "", >+ lib_group_visibility: [], > aliases: [], > contacts: [], > interfaces: [], >@@ -101,6 +111,8 @@ export default { > this.vendor.payment_method = vendor.payment_method > ? vendor.payment_method.split("|") > : [] >+ this.vendor.lib_group_visibility = >+ this.formatLibraryGroupIds(vendor.lib_group_visibility) > this.initialized = true > }, > error => {} >@@ -126,6 +138,7 @@ export default { > delete vendor.physical > delete vendor.subscriptions_count > delete vendor._strings >+ delete vendor.lib_group_limits > > vendor.contacts = vendor.contacts.map( > ({ id, booksellerid, ...requiredProperties }) => >@@ -142,6 +155,9 @@ export default { > vendor.payment_method = null > } > >+ const visibility = vendor.lib_group_visibility.join("|") >+ vendor.lib_group_visibility = visibility >+ > const client = APIClient.acquisition > if (vendorId) { > client.vendors.update(vendor, vendorId).then( >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 cf78cab5fee..8e4d4f8601f 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 >@@ -14,7 +14,7 @@ export class AcquisitionAPIClient extends HttpClient { > endpoint: "vendors/" + id, > headers: { > "x-koha-embed": >- "aliases,subscriptions+count,interfaces,contacts,contracts,extended_attributes,+strings", >+ "aliases,subscriptions+count,interfaces,contacts,contracts,extended_attributes,+strings,lib_group_limits", > }, > }), > getAll: (query, params) => >diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/stores/vendors.js b/koha-tmpl/intranet-tmpl/prog/js/vue/stores/vendors.js >index 34b3351af89..4e78f5be8ca 100644 >--- a/koha-tmpl/intranet-tmpl/prog/js/vue/stores/vendors.js >+++ b/koha-tmpl/intranet-tmpl/prog/js/vue/stores/vendors.js >@@ -5,10 +5,150 @@ export const useVendorStore = defineStore("vendors", { > vendors: [], > currencies: [], > gstValues: [], >+ libraryGroups: null, >+ visibleGroups: null, >+ user: { >+ loggedInUser: null, >+ userflags: null, >+ }, > config: { > settings: { > edifact: false, > }, > }, > }), >+ actions: { >+ determineBranch(code) { >+ if (code) { >+ return code; >+ } >+ const { >+ loggedInUser: { loggedInBranch, branchcode }, >+ } = this.user; >+ return loggedInBranch ? loggedInBranch : branchcode; >+ }, >+ _matchSubGroups(group, filteredGroups, branch, groupsToCheck) { >+ let matched = false; >+ if (group.libraries.find(lib => lib.branchcode === branch)) { >+ if ( >+ groupsToCheck && >+ groupsToCheck.length && >+ groupsToCheck.includes(group.id) >+ ) { >+ filteredGroups[group.id] = group; >+ matched = true; >+ } >+ if (!groupsToCheck || groupsToCheck.length === 0) { >+ filteredGroups[group.id] = group; >+ matched = true; >+ } >+ } >+ if (group.subGroups && group.subGroups.length) { >+ group.subGroups.forEach(grp => { >+ const result = this._matchSubGroups( >+ grp, >+ filteredGroups, >+ branch, >+ groupsToCheck >+ ); >+ matched = matched ? matched : result; >+ }); >+ } >+ return matched; >+ }, >+ filterLibGroupsByUsersBranchcode(branchcode, groupsToCheck) { >+ const branch = this.determineBranch(branchcode); >+ const filteredGroups = {}; >+ if (!this.libraryGroups) { >+ return []; >+ } >+ this.libraryGroups.forEach(group => { >+ const matched = this._matchSubGroups( >+ group, >+ filteredGroups, >+ branch, >+ groupsToCheck >+ ); >+ // If a sub group has been matched but the parent level group did not, then we should add the parent level group as well >+ // This happens when a parent group doesn't have any branchcodes assigned to it, only sub groups >+ if ( >+ matched && >+ !Object.keys(filteredGroups).find(id => id === group.id) >+ ) { >+ filteredGroups[group.id] = group; >+ } >+ }); >+ return Object.keys(filteredGroups) >+ .map(key => { >+ return filteredGroups[key]; >+ }) >+ .sort((a, b) => a.id - b.id); >+ }, >+ formatLibraryGroupIds(ids) { >+ if (!ids) { >+ return []; >+ } >+ const groups = ids.includes("|") ? ids.split("|") : [ids]; >+ const groupIds = groups.map(group => { >+ return parseInt(group); >+ }); >+ return groupIds; >+ }, >+ setLibraryGroups(groups) { >+ if (!groups?.length) { >+ return; >+ } >+ const topLevelGroups = groups.filter( >+ group => !group.parent_id && group.ft_acquisitions >+ ); >+ if (!topLevelGroups?.length) { >+ return; >+ } >+ this.libraryGroups = topLevelGroups.map(group => { >+ return this._mapLibraryGroup(group, groups); >+ }); >+ }, >+ _mapLibraryGroup(group, groups) { >+ const groupInfo = { >+ id: group.id, >+ title: group.title, >+ libraries: [], >+ subGroups: [], >+ }; >+ const libsOrSubGroups = groups.filter( >+ grp => grp.parent_id == group.id >+ ); >+ libsOrSubGroups.forEach(libOrSubGroup => { >+ if (libOrSubGroup.branchcode) { >+ groupInfo.libraries.push(libOrSubGroup); >+ } else { >+ const subGroupInfo = this._mapLibraryGroup( >+ libOrSubGroup, >+ groups, >+ true >+ ); >+ groupInfo.subGroups.push(subGroupInfo); >+ } >+ }); >+ groupInfo.subGroups.forEach(subGroup => { >+ subGroup.libraries.forEach(lib => { >+ if ( >+ !groupInfo.libraries.find( >+ g => g.branchcode === lib.branchcode >+ ) >+ ) { >+ groupInfo.libraries.push(lib); >+ } >+ }); >+ }); >+ return groupInfo; >+ }, >+ }, >+ getters: { >+ getVisibleGroups() { >+ return this.visibleGroups?.length >+ ? this.visibleGroups >+ : this.filterLibGroupsByUsersBranchcode(); >+ }, >+ }, > }); >-- >2.39.5 (Apple Git-154)
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 38290
:
175155
|
175156
|
175157
|
175158
|
175159
|
175160
|
175161
|
175779
|
175780
|
175781
|
175782
| 175783 |
175784
|
175785
|
175786
|
175787