Bumping version numbers, adding Upgrade Script and Changelog
authorMike Rylander <mrylander@gmail.com>
Wed, 27 Apr 2022 21:45:07 +0000 (17:45 -0400)
committerMike Rylander <mrylander@gmail.com>
Thu, 28 Apr 2022 23:18:06 +0000 (19:18 -0400)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
ChangeLog
Open-ILS/src/perlmods/lib/OpenILS/Application.pm
Open-ILS/src/sql/Pg/002.schema.config.sql
Open-ILS/src/sql/Pg/version-upgrade/3.8.0-3.9.0-upgrade-db.sql [new file with mode: 0644]
Open-ILS/xul/staff_client/chrome/content/main/about.html
Open-ILS/xul/staff_client/defaults/preferences/prefs.js
Open-ILS/xul/staff_client/windowssetup.nsi
README [changed from symlink to file mode: 0644]
configure.ac
docs/modules/installation/pages/server_upgrade.adoc

index 1f72b2c..169408d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
-Evergreen doesn't keep a GNU-style ChangeLog except in release tarballs.
-Those seeking a change log are encouraged to run 'git log -v', or read
-it online at: http://git.evergreen-ils.org/?p=Evergreen.git;a=log
+commit 460cd3feb99bf88aa58aa2a39e958074d1e15dd4
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Wed Apr 27 17:24:02 2022 -0400
+
+    bumping Perl version string for 3.9.0
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/perlmods/lib/OpenILS.pm
+
+commit 8028dd256f002609c973f22cd743073cf304a92e
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Wed Apr 27 17:23:03 2022 -0400
+
+    Translation updates - po files
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+33     23      build/i18n/po/bootstrap-opac/fr-CA.po
+4      4       build/i18n/po/fm_IDL.dtd/cs-CZ.po
+4      4       build/i18n/po/multiclass_search_help.html/en-GB.po
+10     6       build/i18n/po/tpac/cs-CZ.po
+40     37      build/i18n/po/webstaff/cs-CZ.po
+
+commit 7857b74a5fac3fb3f862bf0d666848d4c012ac85
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Wed Apr 27 17:18:18 2022 -0400
+
+    Docs version update
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       docs/antora.yml
+
+commit e40c2f5d03a34e18bac6f4b431f1b50b134805b9
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Wed Apr 27 17:18:03 2022 -0400
+
+    Base 3.9 release notes
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+471    0       docs/RELEASE_NOTES_3_9.adoc
+ create mode 100644 docs/RELEASE_NOTES_3_9.adoc
+
+commit bca27df0225705f221ccbca41d294b3c3166c20d
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Wed Apr 27 17:13:55 2022 -0400
+
+    Translation updates - newpot
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+31     31      build/i18n/po/AutoFieldWidget.js/AutoFieldWidget.js.pot
+5      5       build/i18n/po/FlattenerGrid.js/FlattenerGrid.js.pot
+49     49      build/i18n/po/PCrudFilterPane.js/PCrudFilterPane.js.pot
+77     77      build/i18n/po/Searcher.js/Searcher.js.pot
+9      9       build/i18n/po/TranslatorPopup.js/TranslatorPopup.js.pot
+42     42      build/i18n/po/URLVerify.js/URLVerify.js.pot
+287    287     build/i18n/po/acq.js/acq.js.pot
+37     37      build/i18n/po/authority.js/authority.js.pot
+172    132     build/i18n/po/bootstrap-opac/bootstrap-opac.pot
+55     55      build/i18n/po/capture.js/capture.js.pot
+202    202     build/i18n/po/conify.js/conify.js.pot
+12279  12102   build/i18n/po/db.seed/db.seed.pot
+6940   5493    build/i18n/po/fm_IDL.dtd/fm_IDL.dtd.pot
+694    694     build/i18n/po/ils_events.xml/ils_events.xml.pot
+29     29      build/i18n/po/match_set.js/match_set.js.pot
+84     84      build/i18n/po/opac.js/opac.js.pot
+70     70      build/i18n/po/pickup_and_return.js/pickup_and_return.js.pot
+33     33      build/i18n/po/pull_list.js/pull_list.js.pot
+93     93      build/i18n/po/register.js/register.js.pot
+213    213     build/i18n/po/reports.js/reports.js.pot
+128    128     build/i18n/po/reservation.js/reservation.js.pot
+100    100     build/i18n/po/selfcheck.js/selfcheck.js.pot
+25     25      build/i18n/po/serial.js/serial.js.pot
+5      5       build/i18n/po/tpac/tpac.pot
+6      6       build/i18n/po/vandelay.js/vandelay.js.pot
+179    151     build/i18n/po/webstaff/webstaff.pot
+0      10      docs/RELEASE_NOTES_NEXT/API/array-accum-removed.adoc
+0      9       docs/RELEASE_NOTES_NEXT/API/remove_utils_isbn.adoc
+0      26      docs/RELEASE_NOTES_NEXT/Administration/localized_action_triggers.adoc
+0      6       docs/RELEASE_NOTES_NEXT/Administration/staged_search_cleanup.adoc
+0      37      docs/RELEASE_NOTES_NEXT/Cataloging/custom_cover_image.adoc
+0      38      docs/RELEASE_NOTES_NEXT/Circulation/copy_inventory.adoc
+0      57      docs/RELEASE_NOTES_NEXT/Client/Customizable_Staff_Portal.adoc
+0      4       docs/RELEASE_NOTES_NEXT/Client/org-select-styling.adoc
+0      97      docs/RELEASE_NOTES_NEXT/OAI2/new_oai_opensrf_service.adoc
+0      8       docs/RELEASE_NOTES_NEXT/OPAC/jquery_opac_setting.adoc
+0      17      docs/RELEASE_NOTES_NEXT/Reports/simple_reports.adoc
+0      15      docs/RELEASE_NOTES_NEXT/SIP/checkin-hold-phone.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/API/array-accum-removed.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/API/remove_utils_isbn.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Administration/localized_action_triggers.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Administration/staged_search_cleanup.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/custom_cover_image.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/copy_inventory.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Client/Customizable_Staff_Portal.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Client/org-select-styling.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/OAI2/new_oai_opensrf_service.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/jquery_opac_setting.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Reports/simple_reports.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/SIP/checkin-hold-phone.adoc
+
+commit 27d6cc9ab496249b494af53868445e314cc8db8c
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Tue Apr 26 17:33:18 2022 -0400
+
+    LP#1970486: fix SuperCat crash on serial units with stat cats
+    
+    This patch fixes a bug where retrieving a title via SuperCat (in
+    particular, with holdings XML) can crash of the title has a serial
+    unit (i.e., barcoded serial item) attached that also has a statistical
+    category.
+    
+    To test
+    -------
+    [1] Create a title with a barcoded serial item.
+    [2] Attempt to fetch the title via SuperCat:
+    
+    https://EGSERVER/opac/extras/supercat/retrieve/marcxml-full/record/BIBID
+    
+    [3] Note that an internal server error is returned.
+    [4] Apply the patch and repeat step 2. This time, an XML
+        document should be returned that includes the serial item
+        and its stat cat.
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      0       Open-ILS/src/perlmods/lib/OpenILS/Application/SuperCat.pm
+
+commit 4f1a4030660e52282722a2b22165535bf4af7c44
+Author: Garry Collum <gcollum@gmail.com>
+Date:   Thu Apr 15 15:50:55 2021 -0400
+
+    LP1907863 Bootstrap Opac: My Lists formatting
+    
+    This patch moves the buttons for each list row underneath the title and descriptions fields.
+    It makes the create list form collapsible using a button.
+    If there are lists, the create form is collapsed.
+    The create form is expanded on load, if the user selects move bucket to new list, or add rec to new list from a menu or button from another page.
+    The "Move contents of basket to this list?" in the creation form now defaults to 'yes' if an option to move a basket to a new list is chosen from a menu.
+    It adds localization functions to the button texts and removes a dangling </div> in anon-list.tt2
+    It moves the create form from a <table> design and uses Bootstrap elements instead.
+    
+    To Test.
+    
+    1. After applying the patch view the list page and notice that the form is expanded.
+    2. Create a list.  The form is now collapse.
+    3. Perform a search and add some of the titles to a basket.
+    4. From one of the result rows drop-down the Add to My List menu and select 'Add to New List'.
+       The form is expanded and the "Move contents of basket to this list" should be 'yes'.
+    5. From the basket screen or from the lists screen click on the 'Add to New List' button.  The results should be the same as step 4.
+    6. After creating a few lists, notice that the buttons for each list are now displayed under the list title and description and
+       each row is distinguished by a bottom border.
+    
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+110    114     Open-ILS/src/templates-bootstrap/opac/myopac/lists.tt2
+6      7       Open-ILS/src/templates-bootstrap/opac/parts/anon_list.tt2
+1      1       Open-ILS/src/templates-bootstrap/opac/parts/bookbag_actions.tt2
+
+commit d436f5b4a409bdff0d597b596b07f71b63f398fc
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Thu Apr 21 07:50:17 2022 -0400
+
+    Test Followup: Fix Jacket Dir in autogen.sh
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+
+1      1       Open-ILS/src/extras/autogen.sh
+
+commit 3663817ec8c975d09150fef4c578e1fbd7ae0312
+Author: Dan Briem <dbriem@wlsmail.org>
+Date:   Thu Mar 17 16:38:10 2022 -0400
+
+    LP#1965317 Barcode Completion on Traditional Cat Staff Holds
+    
+    This allows the completed barcode to populate in the barcode
+    input when the hold group interface isn't rendered.
+    
+    Signed-off-by: Dan Briem <dbriem@wlsmail.org>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      1       Open-ILS/web/js/ui/default/opac/staff.js
+
+commit ab5478b879e9e34a6fe023c188c7a95c11c425ca
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Tue Apr 19 13:27:17 2022 -0400
+
+    LP1956626 Copy editor loads all needed copy locations
+    
+    The item-location-select component now allows the caller to pass in a
+    set of context org unit IDs (in lieu of just a single id) for loading
+    copy locations across different areas of the org unit tree (without
+    having to load *all* copy locations).
+    
+    Changes applied to the Angular copy location editor to pass the needed
+    context org units to the item location select component.
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+26     4       Open-ILS/src/eg2/src/app/share/item-location-select/item-location-select.component.ts
+1      0       Open-ILS/src/eg2/src/app/staff/cat/volcopy/copy-attrs.component.html
+5      0       Open-ILS/src/eg2/src/app/staff/cat/volcopy/copy-attrs.component.ts
+
+commit 64331490cc4ff6200952c3220b420864d9029bda
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Wed Nov 10 10:06:36 2021 -0500
+
+    LP#1950468: make Replace Barcode from Item Status detect duplicate barcodes
+    
+    This patch makes the Replace Barcode action when invoked from
+    Item Status properly detect and warn if the replacement barcode
+    is a duplicate of one already found in the system. This is a complement
+    to the fix for bug 1890498.
+    
+    To test
+    -------
+    
+    [1] Enter an item barcode into Item Status.
+    [2] Try 'Replace Barcode' from detail view and set the
+        replacement barcode to one that is already active in
+        Evergreen. Note that the dialog closes without
+        updating the barcode or warning about the duplicate and
+        that a error is logged in the browser console.
+    [3] Repeat step 2, but this time from list view. Note
+        the problem remains the same.
+    [4] Apply the patch and repeat steps 2 and 3. Note that
+        now the dialog will remain open and will display an
+        error message complaining about the duplicate barcode.
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Erica Rohlfs <erica.rohlfs@equinoxOLI.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      0       Open-ILS/src/templates/staff/cat/share/t_replace_barcode.tt2
+18     8       Open-ILS/web/js/ui/default/staff/circ/services/item.js
+
+commit 5a808f19768d1992399d9755191647687476c6da
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Fri Apr 15 16:19:36 2022 +0000
+
+    LP1969232 Use fonts-only material icon fonts package
+    
+    This replaces the larger package which caused 'npm install' to take a
+    very long time to complete.
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1418   1649    Open-ILS/src/eg2/package-lock.json
+1      1       Open-ILS/src/eg2/package.json
+1      1       Open-ILS/src/eg2/src/styles.css
+
+commit b5eb3fe1d3a23b8670bb13ba523845bb04f20cb6
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Fri Apr 8 11:10:35 2022 -0400
+
+    LP#1967770: Followup fix for cover image directories
+    
+    In the initial fix we checked for the top level cover image location and
+    error out if it's not there, but this is unnecessary since it will be
+    created if it doesn't yet exist.
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/extras/autogen.sh
+
+commit e35d1254e7608f5067fac23da6e62ecf5ef868c8
+Author: Jane Sandberg <js7389@princeton.edu>
+Date:   Thu Apr 7 15:40:47 2022 -0700
+
+    Stamp upgrade script for MADS update
+    
+    Signed-off-by: Jane Sandberg <js7389@princeton.edu>
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+1      1       Open-ILS/src/sql/Pg/upgrade/{XXXX.data.MADS21-xsl.sql => 1325.data.MADS21-xsl.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.data.MADS21-xsl.sql => 1325.data.MADS21-xsl.sql} (99%)
+
+commit 38dadde8877b56f52d38536001945e7e3676f3dc
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date:   Tue Jan 5 13:27:05 2021 -0800
+
+    LP1800871: small correction to upgrade script
+    
+    Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+
+2      2       Open-ILS/src/sql/Pg/upgrade/XXXX.data.MADS21-xsl.sql
+
+commit 63a3558b3aadd11eba5983314a735ef5dc331374
+Author: Josh Stompro <stompro@stompro.org>
+Date:   Thu Feb 28 08:39:54 2019 -0600
+
+    LP#1800871 - MARC21slim2MADS 2.15 update
+    
+    This update fixes an error when trying to process a 755 tag in
+    and authority record that has a source set.
+    
+    See the discussion on the listserv at:
+    https://georgialibraries.markmail.org/thread/rmwcxkwjzv2qczmu
+    
+    To test, try to import the sample authority record provided
+    by Linda Jansova (https://markmail.org/thread/2ay3j4wg7fecymhz)
+    in evergreen, and see the log files for the import errors.
+    
+    It is also possible to test from the command line.
+    
+    In /openils/var/xsl, copy the example autority marc xml file to
+    that directory, name it americ.xml, then run the command
+    xsltproc ./MARC21slim2MADS.xsl ./americ.xml
+    
+    This will error out.
+    
+    After patch has been applied, try importing the sample authority
+    record and see that it imports successfully.
+    
+    Signed-off-by: Josh Stompro <stompro@stompro.org>
+    Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+
+2      1       Open-ILS/src/sql/Pg/955.data.MADS21-xsl.sql
+1631   0       Open-ILS/src/sql/Pg/upgrade/XXXX.data.MADS21-xsl.sql
+3      2       Open-ILS/xsl/MARC21slim2MADS.xsl
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.MADS21-xsl.sql
+
+commit 63c33ee6ee958ccc61baef18a864d51c5dcc28d2
+Author: Garry Collum <gcollum@gmail.com>
+Date:   Thu Sep 23 14:31:24 2021 -0400
+
+    LP#1942240 Insufficient color contrast in boostrap forms
+    
+    Overrides the bootstrap form-control border color. Also changes the
+    border_standard color in colors.tt2 which is used for the border
+    around some form elements.
+    
+    After this patch is applied the color ratio is 3.54:1
+    
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Jane Sandberg <js7389@princeton.edu>
+
+4      0       Open-ILS/src/templates-bootstrap/opac/css/style.css.tt2
+1      1       Open-ILS/src/templates-bootstrap/opac/parts/css/colors.tt2
+
+commit 7a57a199ecf4a0a6edd38414a00c7c9415d613c1
+Author: Jeff Davis <jdavis@sitka.bclibraries.ca>
+Date:   Mon Mar 28 11:30:26 2022 -0700
+
+    LP#1966802: add Matomo support to Bootstrap OPAC
+    
+    Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
+    Signed-off-by: Jane Sandberg <js7389@princeton.edu>
+
+7      0       Open-ILS/src/templates-bootstrap/opac/parts/base.tt2
+19     0       Open-ILS/src/templates-bootstrap/opac/parts/matomo_analytics.tt2
+ create mode 100644 Open-ILS/src/templates-bootstrap/opac/parts/matomo_analytics.tt2
+
+commit 90abcab3ce2ba11153fc0266992dec9ee5fda063
+Author: Garry Collum <gcollum@gmail.com>
+Date:   Mon Jan 17 13:05:37 2022 -0500
+
+    LP1958163 Bootstrap Opac: the 'Request a Card' link.
+    
+    This fixes the 'Request a Card' link which displays in the bootstrap opac
+     regardless of the 'Allow Patron Self-Registration' library setting in both
+    the login page and the login modal.
+    
+    To Test:
+    1. Click on My Account in the Bootstrap Opac to open the login modal.
+       Notice the Request a Card link.  Click Login without adding a barcode
+       or pin# to see the login page with its link.
+    2. Set the Allow Patron Self_Registration library setting to false for the
+       Consortium.
+    3. Repeat 1, and notice that the link still displays.
+    4. Apply the patch.
+    5. Now the link should not be visible in both forms.
+    6. Set the library setting to true, to verify that the link does display.
+    
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Jane Sandberg <js7389@princeton.edu>
+
+3      0       Open-ILS/src/templates-bootstrap/opac/parts/login/form.tt2
+4      1       Open-ILS/src/templates-bootstrap/opac/parts/login/login_modal.tt2
+
+commit 02fd78a79f6f9e9711862d7a4a61b88eb2042a0e
+Author: Jane Sandberg <js7389@princeton.edu>
+Date:   Thu Apr 7 11:51:01 2022 -0700
+
+    LP1915816 follow-up: one more .gitignore addition
+    
+    Suggestion from Shula Link.  Thanks, Shula!
+    
+    Signed-off-by: Jane Sandberg <js7389@princeton.edu>
+    Co-authored-by: Shula Link <slink@gchrl.org>
+
+1      0       .gitignore
+
+commit 8635c3188fb1df03b0b627ce478278157e75a53d
+Author: Jane Sandberg <js7389@princeton.edu>
+Date:   Thu Apr 7 11:50:06 2022 -0700
+
+    LP1915816 follow-up: update package-lock.json
+
+830    1028    Open-ILS/web/js/ui/default/staff/package-lock.json
+
+commit 4471aee9b6f434e882a39859785356a8bfb8eafe
+Author: Jason Boyer <JBoyer@EquinoxInitiative.org>
+Date:   Tue Feb 16 08:25:29 2021 -0500
+
+    LP1915816: Bonus commit - Remove Old .gitignore Entries
+    
+    There are a few things that were being ignored that could no longer
+    really exist anyway, so we may as well clear some out.
+    
+    Signed-off-by: Jason Boyer <JBoyer@EquinoxInitiative.org>
+    Signed-off-by: Jane Sandberg <js7389@princeton.edu>
+
+0      9       .gitignore
+
+commit 8b0ed0b9391faed49389a22ed9d27e49e5422f0a
+Author: Jason Boyer <JBoyer@EquinoxInitiative.org>
+Date:   Tue Feb 16 07:43:43 2021 -0500
+
+    LP1915816: Add test output to .gitignore and track package-lock.json
+    
+    Just what it says on the tin.
+    
+    Signed-off-by: Jason Boyer <JBoyer@EquinoxInitiative.org>
+    Signed-off-by: Jane Sandberg <js7389@princeton.edu>
+
+7      0       .gitignore
+5887   0       Open-ILS/web/js/ui/default/staff/package-lock.json
+ create mode 100644 Open-ILS/web/js/ui/default/staff/package-lock.json
+
+commit ce0d2f4ab79a062a6f155dfeda1f76a0027ce035
+Author: blake <blake@mobiusconsortium.org>
+Date:   Mon Sep 20 12:32:26 2021 -0500
+
+    LP1944205 Advanced Authority Documentation
+    
+    Added a new document authorities_advanced.adoc
+    
+    Integrated to the nav
+    
+    Signed-off-by: blake <blake@mobiusconsortium.org>
+    Signed-off-by: Lynn Floyd <alynn2671@gmail.com>
+    Signed-off-by: Jane Sandberg <js7389@princeton.edu>
+
+1      0       docs/modules/cataloging/nav.adoc
+397    0       docs/modules/cataloging/pages/authorities_advanced.adoc
+ create mode 100644 docs/modules/cataloging/pages/authorities_advanced.adoc
+
+commit 1623d146d03c136b27bc2e2511105241a58db654
+Author: Josh Stompro <stompro@stompro.org>
+Date:   Thu Feb 28 09:43:49 2019 -0600
+
+    LP#1778783 - Circulate.pm fix log_me correct barcode var
+    
+    The log_me sub wasn't using the correct variable for showing the entered
+    barcode.  It should be $self->copy_barcode instead of $self->barcode.
+    
+    Testing Notes:
+    
+    Before fix:
+    1. Watch the logs with something like
+      tail -f osrfsys.log | fgrep 'circulator: do_permit()'
+    2. Perform a checkout of a non-existant barcode.
+    3. Notice that the entered barcode is missing after 'copy='
+    
+    After fix:
+    1. Restart the circ openils service
+      osrf_control -l --service open-ils.circ --restart
+    2. Watch the logs.
+    3. Perform a checkout of a non-existant barcode.
+    4. Notice that the barcode is now shown after 'copy='
+    
+    Signed-off-by: Josh Stompro <stompro@stompro.org>
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1      1       Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+
+commit 579cbf60090ccbf44f43fcaf69928314e355537e
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Wed Mar 16 16:26:18 2022 -0400
+
+    LP1958265 Holds grid barcode print/csv fix
+    
+    Tweak the barcode print/csv logic to populate the current_item and
+    requested_item values using the same logic as the grid.
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+
+2      2       Open-ILS/src/eg2/src/app/staff/share/holds/grid.component.ts
+
+commit 92eb8b8f00307f136333fde196d79fbf337f7a3c
+Author: Terran McCanna <tmccanna@georgialibraries.org>
+Date:   Mon Jan 31 14:29:16 2022 -0500
+
+    LP1958265 Angular Holds Grids Not Printing Barcode
+    
+    This adds the ability to print (or download CSV) the Current Item
+    and Requested Item barcodes from the Holds Pull List and from the
+    Holds tab of the bib record.
+    
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+
+2      0       Open-ILS/src/eg2/src/app/staff/share/holds/grid.component.ts
+
+commit 7687f572fb300284df4d82530ddaa9d07c2b23f2
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Fri Feb 11 09:44:55 2022 -0500
+
+    LP1959904: Fix Angular Profile Select Component
+    
+    The Angular profile select component has a bug when permission group
+    tree display entries are used.  It will loop forever if the grp and
+    parent have the same value in permission.grp_tree_display_entry
+    because it is comparing permission group tree entries to permission
+    group tree display entries in the groups filter of the grpLabel
+    function.
+    
+    This patch adds a ternary operator to compare display entries to
+    display entries and group tree entries to group tree entries in a
+    manner identical to how the parent value is determined a few lines
+    above.
+    
+    See the bug description for more information:
+    
+        https://bugs.launchpad.net/evergreen/+bug/1959904
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: John Amundson <jamundson@cwmars.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/eg2/src/app/staff/share/patron/profile-select.component.ts
+
+commit 2d76a732f3e21c744d45db774db85e08c1743380
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Wed Mar 16 14:22:13 2022 -0400
+
+    LP1950826 Return error result on contact invalidation
+    
+    If penalty creation fails, return the error/event response to the caller
+    instead of the editor's last event.
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+    Signed-off-by: Christine Burns <christine.burns@bc.libraries.coop>
+
+4      1       Open-ILS/src/perlmods/lib/OpenILS/Utils/BadContact.pm
+
+commit 6eb549a931c8fb234b341e62ba61010b3e47bb65
+Author: Jason Etheridge <jason@EquinoxOLI.org>
+Date:   Mon Nov 15 17:30:17 2021 -0500
+
+    LP1950826 fix invalidate email action
+    
+    and other invalidate contact actions
+    
+    Signed-off-by: Jason Etheridge <jason@EquinoxOLI.org>
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+8      3       Open-ILS/src/perlmods/lib/OpenILS/Utils/BadContact.pm
+
+commit f634116ec3d60302185d7d3a526bc43d55c24ce6
+Author: Kyle Huckins <khuckins@catalyte.io>
+Date:   Sun Mar 13 00:27:16 2022 +0000
+
+    lp1913340 - List All Courses in OPAC
+    
+    - Removed handling preventing an empty query from providing results
+    - Strip * from query to ensure expected behavior
+    
+    Signed-off-by: Kyle Huckins <khuckins@catalyte.io>
+    Signed-off-by: Christine Burns <christine.burns@bc.libraries.coop>
+    Signed-off-by: Jane Sandberg <js7389@princeton.edu>
+
+3      2       Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Course.pm
+
+commit e08d76965aaa5c30d1344e6d778577803b2d0723
+Author: Chris Sharp <csharp@georgialibraries.org>
+Date:   Wed Dec 15 08:49:28 2021 -0500
+
+    LP#1954923: Fix current date issue in Boostrap OPAC Circ History CSV export
+    
+    Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+1      1       Open-ILS/src/templates-bootstrap/opac/myopac/circ_history/export.tt2
+
+commit 9c1855e0b9eac816d982e5e2029115da08f0ea20
+Author: Garry Collum <gcollum@gmail.com>
+Date:   Thu Jan 13 15:02:34 2022 -0500
+
+    LP1920039-Bootstrap Opac: More Details button doesn't change on use.
+    
+    The 'More Details' button in a bib record in the Bootstrap Opac should change
+    to say 'Less Details' when pressed.  This patch fixes that behavior.
+    
+    To Test.
+    1. Go to a bib record in the boostrap opac.
+    2. Press "More Details"
+    3. Notice the button still displays "More Details"
+    4. Apply the patch and repeat.
+    5. The button should now toggle between "More Details" and "Less Details"
+    
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: John Amundson <jamundson@cwmars.org>
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+9      6       Open-ILS/src/templates-bootstrap/opac/parts/record/summary.tt2
+
+commit 4badce58a0e99d5f427724471ec27f87d013cf71
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Tue Apr 5 10:44:25 2022 -0400
+
+    LP#1967770: Fix test for cover image upload
+    
+    The cover image upload test assumes that it will be run from exactly one
+    location, but that's not necessarily true.  This commit uses FindBin to
+    provide the right filesystem context for the test to find the files it
+    needs.
+    
+    [Code by Galen, commit message by Mike]
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+3      2       Open-ILS/src/perlmods/live_t/34-lp1787968-cover-uploader.t
+
+commit a17a6aa05b36c9b78526a354aa92d10217f93b1b
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Tue Apr 5 10:38:55 2022 -0400
+
+    LP#1967770: Make sure cover image dirs exist
+    
+    This commit teaches autogen.sh, which should be run after each upgrade,
+    how to check for and create the required locations for cover image
+    upload.
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+11     1       Open-ILS/src/extras/autogen.sh
+
+commit 6e925ed40778333d4f189bee96ab1fbe4a369f99
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Thu Sep 23 15:49:16 2021 -0400
+
+    LP1930747: Add MARC_NAMESPACE to Const.pm
+    
+    Now that we have 3 separate $MARC_NAMESPACE definitions it's time
+    to just move it into Const.pm and call it done.
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+2      3       Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+2      3       Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/AuthCommon.pm
+5      6       Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/BibCommon.pm
+5      0       Open-ILS/src/perlmods/lib/OpenILS/Const.pm
+
+commit 5de8ef385114f06f8c2532dba7d48e336bef9563
+Author: gmontimantis <86423994+gmontimantis@users.noreply.github.com>
+Date:   Wed Mar 30 15:10:26 2022 -0400
+
+    Update billing.adoc
+    
+    updating link
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      1       docs/modules/circulation/pages/billing.adoc
+
+commit 50d8e9f70005c56b816b6b6e04c08ff96d63ac19
+Author: gmontimantis <86423994+gmontimantis@users.noreply.github.com>
+Date:   Wed Mar 23 14:21:30 2022 -0400
+
+    Updating billing.adoc
+    
+    for the 2022 DIG project
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+8      1       docs/modules/circulation/pages/billing.adoc
+
+commit af427e86085e00d3991996f6422c2728d55df1fe
+Author: Michele Morgan <mmorgan@noblenet.org>
+Date:   Tue Mar 29 13:04:55 2022 -0400
+
+    LP#1919500 - Tweak to Checkout Staff display
+    
+    Displays Checkout Staff's usrname instead of id and adds a link to the
+    record.
+    
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+6      1       Open-ILS/src/templates/staff/cat/item/t_circ_list_pane.tt2
+2      1       Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit 7bb215b73834d5d1b2d13a85a7b798945bbf7ef8
+Author: Josh Stompro <stompro@stompro.org>
+Date:   Wed Mar 17 14:24:34 2021 -0500
+
+    LP#1919500 - Add Checkout Workstation and Checkout Staff to Item Status -> Circ History List
+    
+    Add two more data fields to the Circ History List in Item Status, so that
+    it is possible to see them after an item is renewed.
+    
+    Signed-off-by: Josh Stompro <stompro@stompro.org>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+4      0       Open-ILS/src/templates/staff/cat/item/t_circ_list_pane.tt2
+
+commit c1909c8b7b37453acd14da027b531364f9cdcdf4
+Author: Terran McCanna <tmccanna@georgialibraries.org>
+Date:   Wed Sep 22 14:34:59 2021 -0400
+
+    LP1865062 Add Credit Card Approval Code to Payment Receipt
+    
+    Makes approval code available to Bill Payment print template (when relevant).
+    
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Llewellyn Marshall <lbmarshallv.ncdcr@gmail.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+1      0       Open-ILS/src/templates/staff/share/print_templates/t_bill_payment.tt2
+1      0       Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
+4      3       Open-ILS/web/js/ui/default/staff/circ/patron/bills.js
+
+commit 41edb49f9c83e4d7b3b416a83b293bc014dfc5fd
+Author: Jane Sandberg <sandbergja@gmail.com>
+Date:   Wed Mar 23 19:09:28 2022 -0700
+
+    LP#1965432: follow-up also update package-lock.json
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+124    71      Open-ILS/src/eg2/package-lock.json
+
+commit 233d51a5a914191494cae19c3503e9c2d4f85ad6
+Author: Chris Sharp <csharp@georgialibraries.org>
+Date:   Thu Mar 17 14:37:22 2022 -0400
+
+    LP#1965432: Upgrade karma to latest version.
+    
+    Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      1       Open-ILS/src/eg2/package.json
+1      1       Open-ILS/web/js/ui/default/staff/package.json
+
+commit daf6002e4fc73cb79337754a3f5a94e20437477e
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Tue Mar 15 09:39:54 2022 -0400
+
+    LP 1964963: Improve Customization of BOOPAC topnav logo
+    
+    Move the anchor for the topnav logo from topnav_links.tts to
+    topnav_logo.tt2.  This minor change means that those who wish to move
+    or remove the topnav logo will have fewer files to change and those
+    changes will be less likely to conflict with future changes to BOOPAC.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+1      1       Open-ILS/src/templates-bootstrap/opac/parts/topnav_links.tt2
+1      1       Open-ILS/src/templates-bootstrap/opac/parts/topnav_logo.tt2
+
+commit 97885805462335cbf9086844d5a0ef5243176618
+Author: Jane Sandberg <sandbergja@gmail.com>
+Date:   Mon Mar 28 05:53:32 2022 -0700
+
+    Fix ng lint errors
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      2       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.ts
+2      2       Open-ILS/src/eg2/src/app/staff/catalog/record/actions.component.html
+20     20      Open-ILS/src/eg2/src/app/staff/catalog/record/upload-jacket-image-dialog.component.ts
+
+commit 0c7b13fc33c2c56edcad44771ece3d0cd37c7c09
+Author: Jane Sandberg <sandbergja@gmail.com>
+Date:   Mon Mar 28 05:43:25 2022 -0700
+
+    Stamping upgrade script for localized notifications
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+1      1       Open-ILS/src/sql/Pg/upgrade/{xxxx.schema.preferred_locale_and_alternate_at_templates.sql => 1324.schema.preferred_locale_and_alternate_at_templates.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{xxxx.schema.preferred_locale_and_alternate_at_templates.sql => 1324.schema.preferred_locale_and_alternate_at_templates.sql} (90%)
+
+commit c318a31d41ab2c9dedc05cc18e64c1d9f7c6ca89
+Author: Rogan Hamby <rogan.hamby@gmail.com>
+Date:   Wed Feb 23 13:55:01 2022 -0500
+
+    This feature supplies the ability to create alternate templates for Action Triggers
+    that will generate locale specific out for Action Triggers.  If you send notices in
+    multiple languages, we recommend putting some words to that effect in your notice
+    templates.  The template, message and message title can all be localized.  To use the
+    feature the following new UI elements have been added:
+    
+    - When you double-click on an Event Definition under Notifications / Action Triggers
+      to edit it there will be a tab option for Edit Alternate Template if the reactor is
+      ProcessTemplate, SendEmail or SendSMS.
+    - In the Patron Registration and Patron Editor screens staff members may now select a
+      locale for a patron and edit it in the Patron Preferred Language field.
+    - Patrons may set their own locale in the My Account interface off the OPAC by going to
+      Preferences -> Personal Information and setting the Preferred Language field.
+    
+    The templates used on the Edit Definition tab are the defaults that are used if there are
+    no alternate templates available that match the preferred language.  If alternate templates
+    are available the system will use a locale that is an exact match and then if failing that
+    use one where the language code matches and then fall back to the default one.
+    
+    For example, if a patron has a locale of fr-CA and there are templates for both fr-CA and
+    fr-FR it will use the fr-CA.  If the fr-CA template was deleted it would fall back on using
+    the fr-FR for the patron since it at least shares the same base language.
+    
+    Valid locales are the codes defined in the i18n_locale table in the config schema.
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+36     0       Open-ILS/examples/fm_IDL.xml
+29     1       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.html
+28     1       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.ts
+18     0       Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
+51     0       Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Event.pm
+1      0       Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Reactor.pm
+1      0       Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+41     1       Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
+2      1       Open-ILS/src/sql/Pg/005.schema.actors.sql
+13     1       Open-ILS/src/sql/Pg/400.schema.action_trigger.sql
+20     0       Open-ILS/src/sql/Pg/upgrade/xxxx.schema.preferred_locale_and_alternate_at_templates.sql
+4      0       Open-ILS/src/templates-bootstrap/opac/css/style.css.tt2
+9      0       Open-ILS/src/templates-bootstrap/opac/myopac/prefs.tt2
+38     0       Open-ILS/src/templates-bootstrap/opac/myopac/update_locale.tt2
+14     0       Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+4      0       Open-ILS/src/templates/staff/circ/patron/t_summary.tt2
+9      2       Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+22     2       Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+26     0       docs/RELEASE_NOTES_NEXT/Administration/localized_action_triggers.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.schema.preferred_locale_and_alternate_at_templates.sql
+ create mode 100755 Open-ILS/src/templates-bootstrap/opac/myopac/update_locale.tt2
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/localized_action_triggers.adoc
+
+commit 1a07bfb3bdfca6a10db36e2c92ae7c4ea7af21c3
+Author: Jane Sandberg <sandbergja@gmail.com>
+Date:   Sun Mar 27 20:09:54 2022 -0700
+
+    Stamping upgrade script for OAI-PMH
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+1      1       Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.oai_views.sql => 1323.schema.oai.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.oai_views.sql => 1323.schema.oai.sql} (96%)
+
+commit 4aa99504674c5c502d668b6415e3f128fcc414d7
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Wed Mar 23 18:11:15 2022 -0400
+
+    LP#1729620: Rebase and remove array_accum uses
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+20     7       Open-ILS/src/sql/Pg/600.schema.oai.sql
+2      2       Open-ILS/src/sql/Pg/upgrade/XXXX.schema.oai_views.sql
+
+commit 00eff51ccd2b2fa5a882dea4ceb7c67575ecbe4d
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Wed Jan 26 16:36:27 2022 -0500
+
+    LP#1729620: Polish up sets and visibility tests
+    
+    This commit improves the logic needed to control record inclusion in
+    OAI Sets.  Sets for bib records are currently based on copy visibility,
+    Located URI visibility, or bib source.  Generally useful combinations
+    are generated for item, Located URI, and transcendant [sic] bib sources.
+    
+    Sets for authority records are based on the browse axis of the heading
+    for the record.
+    
+    All generated Sets for bib records currently test for effective search
+    visibilty on the three described components.
+    
+    In order to retrieve item data from a specific branch of the org tree,
+    a harvester must use a Set that contains COPIES:. The hierarchial
+    shortnames of the org units follow the colon, so in a freshly installed
+    system a Set with the setSpec of COPIES:CONS:SYS2:BR3 will retrieve all
+    bib records that have visible copies at BR3, and include only the item
+    data for that org unit.
+    
+    To retrieve records with Located URIs, which behave in the heirarchical
+    reverse of copies by limiting display to those org units "inside" the
+    branch of the tree where the licensing "lives", a harvester should
+    supply a setSpec with an org unit shortname that would display the
+    Located URI. For example: LURIS:CONS:SYS2:BR3
+    
+    Note: the LURI: org unit is also used to restrict any item data that may
+    be available for LURI-filtered records.
+    
+    To retrive records are in a transcendant [sic] bib source, a harvester
+    can used a setSpec starting with SOURCES: followed by the source name.
+    
+    To harvest all records, including deleted records, simply omit the
+    setSpec from the request.  All item data will be included.
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+6      6       Open-ILS/examples/fm_IDL.xml
+1      2       Open-ILS/examples/opensrf.xml.example
+100    43      Open-ILS/src/perlmods/lib/OpenILS/Application/SuperCat/OAI.pm
+71     41      Open-ILS/src/perlmods/lib/OpenILS/WWW/SuperCat/OAI.pm
+20     7       Open-ILS/src/sql/Pg/upgrade/XXXX.schema.oai_views.sql
+0      18      Open-ILS/xsl/OAI2_MARC21slim.xsl
+0      13      Open-ILS/xsl/OAI2_OAIDC.xsl
+ delete mode 100644 Open-ILS/xsl/OAI2_MARC21slim.xsl
+ delete mode 100644 Open-ILS/xsl/OAI2_OAIDC.xsl
+
+commit c5005bfcbb7649e215d14963c8fa76f445df3a8c
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date:   Wed Nov 24 10:26:27 2021 -0800
+
+    LP1729620: Enable org unit OAI sets
+    
+    Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+0      1       Open-ILS/examples/opensrf.xml.example
+21     2       Open-ILS/src/perlmods/lib/OpenILS/Application/SuperCat/OAI.pm
+5      8       Open-ILS/src/perlmods/lib/OpenILS/WWW/SuperCat/OAI.pm
+5      0       Open-ILS/src/sql/Pg/600.schema.oai.sql
+5      0       Open-ILS/src/sql/Pg/upgrade/XXXX.schema.oai_views.sql
+
+commit 6973eac52f5a7f33474f870b923de16de817522e
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date:   Wed Nov 17 19:24:50 2021 -0800
+
+    LP1729620: Fix opensrf.xml syntax
+    
+    Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/examples/opensrf.xml.example
+
+commit b6151ac81e9b8e56f70ea5ff449da6e402967131
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Fri Sep 24 16:14:44 2021 -0400
+
+    LP#1729620: (follow-up) do not suggest timestamp manipulation
+    
+    The suggestion in the upgrade script and the release notes
+    to consider adding triggers to update biblio.record_entry.timestamp
+    upon updates of linked call numbers or items is not a good one:
+    
+    [1] implementing it means that any workflows that require knowing
+        when a bib itself has changed become untrustworthy
+    [2] it would cause tremendous bloating of auditor.biblio_record_entry_history,
+        as every single change to an item -- including ones caused by
+        circulation activity -- would result in a new entry.
+    [3] item changes due to circulation activity aren't necessarily
+        going to want to trigger record updates by the harvester
+    
+    Wanting the update timestamp for OAI harvest to reflect changes
+    to items is a perfectly valid use case, but this is not the way.
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+0      48      Open-ILS/src/sql/Pg/upgrade/XXXX.schema.oai_views.sql
+0      53      docs/RELEASE_NOTES_NEXT/OAI2/new_oai_opensrf_service.adoc
+
+commit 1aa1e20099cd827672a9818ca2740e44554e87f5
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Fri Sep 24 15:59:01 2021 -0400
+
+    LP#1729620: update release notes with an upgrade note
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+14     0       docs/RELEASE_NOTES_NEXT/OAI2/new_oai_opensrf_service.adoc
+
+commit a79b5546f81a9f49c56794ec266ece37813372b8
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Fri Sep 24 15:50:39 2021 -0400
+
+    LP#1729620: add HTTP::OAI to Debian Bullseye deps
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      0       Open-ILS/src/extras/install/Makefile.debian-bullseye
+
+commit a010d01e9cf0293f67d91d5698ab0b0d49c6bcae
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Fri Sep 24 12:47:58 2021 -0400
+
+    LP#1729620: fix a tab consistency issue
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      1       Open-ILS/src/extras/install/Makefile.ubuntu-focal
+
+commit 2592bdb020fc04ff607032b939e7bcb841c629ec
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Fri Sep 24 15:54:53 2021 -0400
+
+    LP#1729620: (follow-up) remove extra child_init that is no longer needed
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+0      5       Open-ILS/src/perlmods/lib/OpenILS/WWW/SuperCat/OAI.pm
+
+commit 51e2eeb32723b9d897ef254cb025cb2db9e50d24
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Fri Sep 24 12:45:10 2021 -0400
+
+    LP#1729620: (follow-up) move OpenILS::WWW::OAI
+    
+    Move the module to Open::WWW::SuperCat::OAI, matching other
+    record export and feed modules.
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      1       Open-ILS/examples/apache_24/eg_vhost.conf.in
+4      0       Open-ILS/src/perlmods/lib/OpenILS/WWW/SuperCat.pm
+3      3       Open-ILS/src/perlmods/lib/OpenILS/WWW/{ => SuperCat}/OAI.pm
+ rename Open-ILS/src/perlmods/lib/OpenILS/WWW/{ => SuperCat}/OAI.pm (98%)
+
+commit e0af9b3603e9a02836621cf886084841c23c16af
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Fri Sep 24 12:40:20 2021 -0400
+
+    LP#1729620: (follow-up) move OAI methods to open-ils.supercat
+    
+    A new service isn't really necessary for the handful
+    of methods that OAI support needs. Since SuperCat is
+    where other record harvesting and export methods live, what
+    was open-ils.oai is moved to SuperCat via this patch.
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+95     114     Open-ILS/examples/opensrf.xml.example
+0      1       Open-ILS/examples/opensrf_core.xml.example
+4      0       Open-ILS/src/perlmods/lib/OpenILS/Application/SuperCat.pm
+10     10      Open-ILS/src/perlmods/lib/OpenILS/Application/{ => SuperCat}/OAI.pm
+7      7       Open-ILS/src/perlmods/lib/OpenILS/WWW/OAI.pm
+6      30      docs/RELEASE_NOTES_NEXT/OAI2/new_oai_opensrf_service.adoc
+ rename Open-ILS/src/perlmods/lib/OpenILS/Application/{ => SuperCat}/OAI.pm (96%)
+
+commit 0b78de8114a5915612c960736b0486681c88bca1
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date:   Sat Sep 11 16:46:09 2021 -0700
+
+    LP#1729620 enable the OAI service by default
+    
+    Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      0       Open-ILS/examples/opensrf.xml.example
+
+commit 61dbbf55cffd543fef7cf3ad6e26185779a4160f
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date:   Wed Aug 25 14:29:53 2021 -0700
+
+    LP#1729620 Follow-up bugfixes
+    
+    * Perl no longer allows the `keys` function to take scalar expressions
+    * Typo in service name in opensrf_core example config file
+    * Added oai schema script to the manifest file so that it is run as part of installation
+    * Unnecessary sigil
+    
+    Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/examples/opensrf_core.xml.example
+2      2       Open-ILS/src/perlmods/lib/OpenILS/WWW/OAI.pm
+1      0       Open-ILS/src/sql/Pg/sql_file_manifest
+1      1       docs/RELEASE_NOTES_NEXT/OAI2/new_oai_opensrf_service.adoc
+
+commit 2ed986a6aaba11803b940ace4c17f9d24f51833b
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date:   Wed Aug 25 12:35:08 2021 -0700
+
+    LP#1729620 Updating modern dependencies to include OAI library
+    
+    Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      0       Open-ILS/src/extras/install/Makefile.debian-buster
+1      0       Open-ILS/src/extras/install/Makefile.ubuntu-bionic
+1      0       Open-ILS/src/extras/install/Makefile.ubuntu-focal
+
+commit c4261e4b804a50baa9477d40905f73d1c7a1c844
+Author: Remington Steed <rjs7@calvin.edu>
+Date:   Thu Nov 2 15:14:51 2017 +0100
+
+    LP#1729620 Cleanup, fix bugs
+    
+      - Rename DB schema file to follow convention
+        - Remove optional DB commands, and leave them in Release Notes (and
+          possibly add to Official Docs)
+      - Create DB upgrade script
+        - Print optional DB commands using \qecho
+      - Change variable "tcn" to "rec_id" everywhere
+      - Move perl API registration to be immediately after related function
+      - Remove unused parameter from sub oai_list_retrieve() in
+        Application/OAI.pm, and from API calls in WWW/OAI.pm
+      - Fix mislabeled parameter in API doc
+      - Add missing end-comment tags in opensrf.xml.example
+      - Add dependency to Ubuntu/Debian makefiles
+      - Add missing init handler in apache/eg.conf.in
+      - Fix reference to sysconfdir in apache/eg_startup.in
+      - Undo extraneous change to .gitignore
+      - Trim/rename release notes, since most of the install process is
+        handled via Evergreen install instructions.
+    
+    Signed-off-by: Remington Steed <rjs7@calvin.edu>
+    Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+0      1       .gitignore
+2      2       Open-ILS/examples/fm_IDL.xml
+2      0       Open-ILS/examples/opensrf.xml.example
+1      0       Open-ILS/src/extras/install/Makefile.debian-buster
+1      0       Open-ILS/src/extras/install/Makefile.debian-stretch
+45     50      Open-ILS/src/perlmods/lib/OpenILS/Application/OAI.pm
+8      8       Open-ILS/src/perlmods/lib/OpenILS/WWW/OAI.pm
+25     0       Open-ILS/src/sql/Pg/600.schema.oai.sql
+0      68      Open-ILS/src/sql/Pg/oai.sql
+79     0       Open-ILS/src/sql/Pg/upgrade/XXXX.schema.oai_views.sql
+0      408     docs/RELEASE_NOTES_NEXT/OAI2/install.adoc
+160    0       docs/RELEASE_NOTES_NEXT/OAI2/new_oai_opensrf_service.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/600.schema.oai.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/oai.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.oai_views.sql
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/OAI2/install.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OAI2/new_oai_opensrf_service.adoc
+
+commit 2aa490118c95457c1f3c3f75ec7bc4036f5e7b10
+Author: Lucien van Wouw <lwo@iisg.nl>
+Date:   Thu Nov 2 15:14:51 2017 +0100
+
+    LP#1729620 New optional feature: an OAI2 provider service.
+    
+    This module is an opensrf service that exposes bibliographic and authority records through the OAI2 protocol.
+    
+    Developer's Certificate of Origin 1.1
+    
+    By making a contribution to this project, I certify that:
+    
+    (a) The contribution was created in whole or in part by me and I
+        have the right to submit it under the open source license
+        indicated in the file; or
+    
+    (b) The contribution is based upon previous work that, to the best
+        of my knowledge, is covered under an appropriate open source
+        license and I have the right under that license to submit that
+        work with modifications, whether created in whole or in part
+        by me, under the same open source license (unless I am
+        permitted to submit under a different license), as indicated
+        in the file; or
+    
+    (c) The contribution was provided directly to me by some other
+        person who certified (a), (b) or (c) and I have not modified
+        it.
+    
+    (d) I understand and agree that this project and the contribution
+        are public and that a record of the contribution (including all
+        personal information I submit with it, including my sign-off) is
+        maintained indefinitely and may be redistributed consistent with
+        this project or the open source license(s) involved.
+    
+    Signed-off-by: Lucien van Wouw, IISG, Amsterdam.
+    Signed-off-by: Remington Steed <rjs7@calvin.edu>
+    Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      0       .gitignore
+9      0       Open-ILS/examples/apache_24/eg_vhost.conf.in
+22     0       Open-ILS/examples/fm_IDL.xml
+112    1       Open-ILS/examples/opensrf.xml.example
+1      0       Open-ILS/examples/opensrf_core.xml.example
+520    0       Open-ILS/src/perlmods/lib/OpenILS/Application/OAI.pm
+478    0       Open-ILS/src/perlmods/lib/OpenILS/WWW/OAI.pm
+68     0       Open-ILS/src/sql/Pg/oai.sql
+18     0       Open-ILS/xsl/OAI2_MARC21slim.xsl
+13     0       Open-ILS/xsl/OAI2_OAIDC.xsl
+408    0       docs/RELEASE_NOTES_NEXT/OAI2/install.adoc
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/Application/OAI.pm
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/WWW/OAI.pm
+ create mode 100644 Open-ILS/src/sql/Pg/oai.sql
+ create mode 100644 Open-ILS/xsl/OAI2_MARC21slim.xsl
+ create mode 100644 Open-ILS/xsl/OAI2_OAIDC.xsl
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OAI2/install.adoc
+
+commit 8d628623b8f2c4d35d7f8633ac55a991732e93ea
+Author: Jason Boyer <JBoyer@equinoxinitiative.org>
+Date:   Thu Oct 15 13:50:18 2020 -0400
+
+    LP1900005: Don't require a specific 'opensrf' user
+    
+    There's no technical reason to require a specific user beyond our
+    instructions stating that it's the default. One thing that we should
+    do is not allow our network services to be run as root.
+    Additionally, autogen.sh is excluded from running as root because while
+    that would work, it may then have to *always* be run by root or
+    require you to change the file owner between runs.
+    
+    NOTE: We check for the user by id rather than name, as there's no rule
+    saying user 0 must be called "root" on Linux.
+    
+    NOTE: This also cleans up and unifies the the coding style and removes
+    some dead code in autogen.sh.
+    
+    To test:
+    Pre-patch:
+    Use oils_ctl.sh to start SIP or z3950 as opensrf, Success.
+    Use oils_ctl.sh to start SIP or z3950 as yourself, Failure.
+    Use oils_ctl.sh to start SIP or z3950 as root, Failure.
+    Run autogen.sh as opensrf, Success.
+    Run autogen.sh as yourself, Failure.
+    Run autogen.sh as root, Failure.
+    
+    Post patch:
+    Use oils_ctl.sh to start SIP or z3950 as opensrf, Success.
+    Use oils_ctl.sh to start SIP or z3950 as your normal user, Success.
+    Use oils_ctl.sh to start SIP or z3950 as root, Failure.
+    Run autogen.sh as opensrf, Success.
+    Run autogen.sh as yourself, potential Success - IF you're able to write to the correct directory / files.
+    Run autogen.sh as root, Failure.
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+2      2       Open-ILS/examples/oils_ctl.sh
+82     49      Open-ILS/src/extras/autogen.sh
+
+commit 60efc98ffe680de07cc270c803c7cdeeac07f1ad
+Author: Terran McCanna <tmccanna@georgialibraries.org>
+Date:   Mon Jan 31 17:26:15 2022 -0500
+
+    LP1956970 Sort Patron Notes - Most Recent First
+    
+    This changes the default sort order of patron notes from oldest
+    first to most recent first.
+    
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+2      2       Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+
+commit e2028ee29bab4f970a8fa6354b64723674b7286e
+Author: Terran McCanna <tmccanna@georgialibraries.org>
+Date:   Wed Jun 2 15:29:53 2021 -0400
+
+    LP1930614 Bootstrap OPAC Summary Block
+    
+    This breaks out the summary (from the 520 field) from the rest
+    of the MARC data so that it displays above/outside of the More
+    Details button on the record page.
+    
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Ruth Frasur <rfrasur@library.in.gov>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    
+    foo
+
+61     0       Open-ILS/src/templates-bootstrap/opac/parts/record/contents-summaryonly.tt2
+0      4       Open-ILS/src/templates-bootstrap/opac/parts/record/contents.tt2
+1      0       Open-ILS/src/templates-bootstrap/opac/parts/record/summary.tt2
+ create mode 100644 Open-ILS/src/templates-bootstrap/opac/parts/record/contents-summaryonly.tt2
+
+commit 3863ed4177da51362969ca4c99d421a2afdf135c
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Fri Mar 25 17:03:06 2022 -0400
+
+    Stamping upgrade script for JQuery YAOUS
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+1      1       Open-ILS/src/sql/Pg/upgrade/{xxxx.data.jquery_opac_library_setting.sql => 1322.data.jquery_opac_library_setting.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{xxxx.data.jquery_opac_library_setting.sql => 1322.data.jquery_opac_library_setting.sql} (86%)
+
+commit 97cbb770058dbd8e360c9a383e6bcc4151831629
+Author: Rogan Hamby <rogan.hamby@gmail.com>
+Date:   Mon Oct 21 09:47:45 2019 -0400
+
+    adding query to opac by library setting
+    
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+9      0       Open-ILS/src/sql/Pg/950.data.seed-values.sql
+16     0       Open-ILS/src/sql/Pg/upgrade/xxxx.data.jquery_opac_library_setting.sql
+5      0       Open-ILS/src/templates-bootstrap/opac/parts/js.tt2
+5      0       Open-ILS/src/templates/opac/parts/js.tt2
+8      0       docs/RELEASE_NOTES_NEXT/OPAC/jquery_opac_setting.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.data.jquery_opac_library_setting.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/jquery_opac_setting.adoc
+
+commit 356790a3bbbd6acaa0c1d17b7e2832372327586a
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Thu Jan 20 17:13:08 2022 -0500
+
+    LP1958581 Copy to clipboard always available
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+0      5       Open-ILS/src/eg2/src/app/share/grid/grid-body.component.ts
+
+commit 647f704c5501602f4ffd668944ecd79b4c26e438
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Thu Jan 20 16:16:10 2022 -0500
+
+    LP1958581 Angular Grid Copy To Clipboard
+    
+    To test, right click on a row in an Angular grid.  A dialog should
+    appear which allows the user to click on a value to select the value
+    into the clipboard.  Once selected, the dialog should close.
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+25     0       Open-ILS/src/eg2/src/app/share/clipboard/clipboard-dialog.component.html
+43     0       Open-ILS/src/eg2/src/app/share/clipboard/clipboard-dialog.component.ts
+3      0       Open-ILS/src/eg2/src/app/share/common-widgets.module.ts
+1      1       Open-ILS/src/eg2/src/app/share/grid/grid-body.component.html
+10     0       Open-ILS/src/eg2/src/app/share/grid/grid-toolbar-actions-menu.component.html
+22     1       Open-ILS/src/eg2/src/app/share/grid/grid-toolbar-actions-menu.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/clipboard/clipboard-dialog.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/clipboard/clipboard-dialog.component.ts
+
+commit 779903d35f8bc04949fd909a475be14e80540472
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Thu Mar 24 19:10:22 2022 -0400
+
+    Fixing merge conflict resolution from Simple Reporter merge
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/eg2/src/app/staff/splash.component.ts
+
+commit fb2c761a1af88f059ba69e5e097a63d414430bd0
+Author: Garry Collum <gcollum@gmail.com>
+Date:   Thu Feb 3 17:57:45 2022 -0500
+
+    LP#1959405: hold status not looking for shelf delay status
+    
+    This patch fixes the blank status display in the opac by treating that
+    status as a 'Waiting for Copy' status.  This commit covers both the TPAC
+    and the Bootstrap OPAC.
+    
+    To Test:
+    As stated by Erica in LP1959405
+    1. Administration->Local Administration->Library Settins Editor
+    set Hold Shelf Status Delay to 1 minute.
+    2. Place a hold for a patron
+    3. Capture the hold.
+       The opac will change from "Waiting for Copy" to a blank column.
+    4. Allow the delay interval to expire
+       The opac will change from a blank status to "Available"
+    
+    5. Apply the patch
+    6. Repeat 2-3.
+       The opac will continue to display "Waiting for Copy"
+    7. Allow the delay interval to expire
+       The opac will change from "Waiting for Copy" to "Available"
+    
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+2      2       Open-ILS/src/templates-bootstrap/opac/parts/hold_status.tt2
+2      2       Open-ILS/src/templates/opac/parts/hold_status.tt2
+
+commit 74ff801c5296a8aebfdf034a022b5ac79363c2d3
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Thu Mar 24 17:32:20 2022 -0400
+
+    Stamping upgrade script for inventory changes
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+1      1       Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.asset.copy_inventory.sql => 1321.schema.asset.copy_inventory.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.asset.copy_inventory.sql => 1321.schema.asset.copy_inventory.sql} (98%)
+
+commit 3911bcba82c5bffe8edfc1c07b90dd1815db27b5
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Thu Dec 30 10:17:58 2021 -0500
+
+    LP1883171 & LP1940663: Add release notes
+    
+    This work was sponsored by NOBLE.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+38     0       docs/RELEASE_NOTES_NEXT/Circulation/copy_inventory.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/copy_inventory.adoc
+
+commit 646fad6662886cd066c81a21a992c7654bd6e743
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Mon Nov 22 22:09:26 2021 -0500
+
+    LP1883171 & LP1940663: Add Perl live test
+    
+    Add live tests to test that invetory dates are added, or not, during
+    checkin and inventory update as appropriate.  These tests cover the
+    basics for the backend Perl methods.  The database tests are slightly
+    more thorough.
+    
+    This work was sponsored by NOBLE.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+400    0       Open-ILS/src/perlmods/live_t/lp1883171-copy-inventory.t
+ create mode 100755 Open-ILS/src/perlmods/live_t/lp1883171-copy-inventory.t
+
+commit 5ded9caa9c310793775a1fdf60310179d62ddecf
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Sun Nov 7 16:00:34 2021 -0500
+
+    LP1883171 & LP1940663: Basic staff client modifications
+    
+    Modify the Item Staus view to check the new return values of the
+    update copy inventory function.
+    
+    Fix toast handling in the list view to properly report success and failure.
+    
+    Add toast handling to the single copy Item Status view to report
+    success and failure.
+    
+    NOTE: More work could be done on the toasts to report number of
+    successful updates, etc.  I tried using the compileContent and trusted
+    HTML, but this lead to new errors that I couldn't decipher.
+    
+    This work was sponsored by NOBLE.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+4      0       Open-ILS/src/templates/staff/cat/item/index.tt2
+9      5       Open-ILS/web/js/ui/default/staff/cat/item/app.js
+1      10      Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+7      5       Open-ILS/web/js/ui/default/staff/circ/services/item.js
+
+commit f3811352554f09dc43cebe3f0929c8678dbf99ba
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Sun Oct 31 16:14:10 2021 -0400
+
+    LP1883171 & LP1940663: Replace circ method to update latest inventory
+    
+    Replace the open-ils.circ.circulation.update_latest_inventory method
+    with open-ils.circ.circulation.update_copy_inventory.
+    
+    Beyond renaming the method and changing the tables it operates on, the
+    following changes are also made:
+    
+    1. Use savepoints to allow some updates to succeed when others fail.
+    
+    2. Modify the return value to include success and failure counts so that
+    these could potentially be used in client feedback.
+    
+    This work was sponsored by NOBLE.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+25     21      Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+
+commit 8ec3e4ade4aededbfaec72374fa9bd4667e19edc
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Sun Oct 31 15:18:22 2021 -0400
+
+    LP1883171 & LP1940663: Modify do_checkin for asset.copy_inventory
+    
+    Modify the do_chekin method of Circulate.pm to create a new
+    asset::copy_inventory object when the do inventory modifier is used.
+    
+    This change necessitates moving the check for a floating copy up to
+    where the do inventory code is run and subsequent modifications to the
+    transit and noop checkin code.
+    
+    Set checkin_changed to true when adding an asset.copy_inventory entry
+    during check-in so that even if there would otherwise be a NO_CHANGE
+    response, the row will still get created.
+    
+    This work was sponsored by NOBLE.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+40     59      Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+
+commit c21c8f591a5140541b111acb0e69d020615c7bb6
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Sun Oct 24 12:54:31 2021 -0400
+
+    LP1883171 & LP1940663: Database & IDL updates for copy inventory table
+    
+    Add new asset.copy_inventory table with constraints:
+      * Foreign Key on copy -> asset.copy.id
+      * Unique index on inventory_date and copy
+      * Require that copy is at home or may float to inventory_workstation org.
+    
+    Add IDL entry for asset.copy_inventory table (aci).
+    
+    Change asset.latest_inventory table into a view.
+    
+    Mark the asset.latest_inventory IDL entry (alci) read-only.
+    
+    Provide database upgrade script to make the database changes and move
+    entries from the asset.latest_inventory table to the
+    asset.copy_inventory table.
+    
+    Add pgtap schema tests to validate that the above tables, views, and
+    constraints exist.
+    
+    Add pgtap live tests to validate that the table and view constraints
+    work as intended.
+    
+    MERGE NOTE: IDL permissions on the new real table were updated to
+    match previously modified permissions on the old real table.
+    
+    This work was sponsored by NOBLE.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+25     5       Open-ILS/examples/fm_IDL.xml
+40     4       Open-ILS/src/sql/Pg/040.schema.asset.sql
+4      4       Open-ILS/src/sql/Pg/800.fkeys.sql
+98     0       Open-ILS/src/sql/Pg/live_t/lp1883171-copy_inventory.pg
+30     0       Open-ILS/src/sql/Pg/t/lp1883171-copy_inventory-schema.pg
+86     0       Open-ILS/src/sql/Pg/upgrade/XXXX.schema.asset.copy_inventory.sql
+ create mode 100644 Open-ILS/src/sql/Pg/live_t/lp1883171-copy_inventory.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1883171-copy_inventory-schema.pg
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.asset.copy_inventory.sql
+
+commit b3b256184d59702c488d8f05f1029cee799e17e9
+Author: Michele Morgan <mmorgan@noblenet.org>
+Date:   Tue Mar 2 11:46:42 2021 -0500
+
+    LP1907123 Angular Catalog View Holds missing columns
+    
+    Teaches the t_holds.tt2 TPAC file to save columns with the same names as
+    the Angular Catalog.
+    
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Elaine Hardy <ehardy@georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+134    134     Open-ILS/src/templates/staff/cat/catalog/t_holds.tt2
+
+commit 15ecabc43187a85e9913adb880832f430a7d6ed2
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Thu Mar 24 15:17:39 2022 -0400
+
+    Stamping upgrade script for Simple Reporter (permission ID adjusted)
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+2      2       Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.simple_reporter.sql => 1320.schema.simple_reporter.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.simple_reporter.sql => 1320.schema.simple_reporter.sql} (95%)
+
+commit 958255612746720593c564f10b7b92cb77764cb2
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Fri Mar 18 12:14:06 2022 -0400
+
+    Make the "ignore this boolean" option more clear
+    
+    Change Bool Either to Both
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: rfrasur <rfrasur@library.in.gov>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-field.component.html
+
+commit daba96820a3c35ad05f32e266c8cc9f4158d0c9e
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Fri Mar 11 12:45:33 2022 -0500
+
+    Update Promise instantiation to deal with TypeScript changes
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: rfrasur <rfrasur@library.in.gov>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+3      3       Open-ILS/src/eg2/src/app/staff/reporter/simple/simple-reporter.service.ts
+
+commit c23f1a1e8da806602be10af4c988010a31bdf123
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Tue Dec 21 16:30:42 2021 -0500
+
+    Add release note
+    
+    Sponsored-by: C/W MARS
+    Sponsored-by: Missouri Evergreen Consortium
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: rfrasur <rfrasur@library.in.gov>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+17     0       docs/RELEASE_NOTES_NEXT/Reports/simple_reports.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Reports/simple_reports.adoc
+
+commit 9a7cddc13a0d70d74b91dbbc882b4f7e36bff9b6
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Tue Dec 14 14:15:13 2021 -0500
+
+    Wire up Simple Reporter into the Staff Client Interface
+    
+    Sponsored-by: C/W MARS
+    Sponsored-by: Missouri Evergreen Consortium
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: rfrasur <rfrasur@library.in.gov>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+4      0       Open-ILS/src/eg2/src/app/staff/nav.component.html
+7      0       Open-ILS/src/eg2/src/app/staff/routing.module.ts
+1      0       Open-ILS/src/eg2/src/app/staff/splash.component.html
+13     1       Open-ILS/src/eg2/src/app/staff/splash.component.ts
+7      0       Open-ILS/src/templates/staff/navbar.tt2
+
+commit a0aaffbe54df3a1a30162016239068b6e2fb234d
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Tue Dec 14 14:14:35 2021 -0500
+
+    Simple Reporter Angular App
+    
+    Simply put, it reports.
+    
+    Sponsored-by: C/W MARS
+    Sponsored-by: Missouri Evergreen Consortium
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: rfrasur <rfrasur@library.in.gov>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+15     0       Open-ILS/src/eg2/package-lock.json
+2      1       Open-ILS/src/eg2/package.json
+18     0       Open-ILS/src/eg2/src/app/staff/reporter/routing.module.ts
+40     0       Open-ILS/src/eg2/src/app/staff/reporter/simple/routing.module.ts
+18     0       Open-ILS/src/eg2/src/app/staff/reporter/simple/simple-reporter.component.html
+34     0       Open-ILS/src/eg2/src/app/staff/reporter/simple/simple-reporter.component.ts
+34     0       Open-ILS/src/eg2/src/app/staff/reporter/simple/simple-reporter.module.ts
+914    0       Open-ILS/src/eg2/src/app/staff/reporter/simple/simple-reporter.service.ts
+7      0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-editor.component.css
+102    0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-editor.component.html
+239    0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-editor.component.ts
+9      0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-field-chooser.component.css
+108    0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-field-chooser.component.html
+97     0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-field-chooser.component.ts
+29     0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-field.component.css
+210    0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-field.component.html
+187    0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-field.component.ts
+72     0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-my-outputs.component.html
+90     0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-my-outputs.component.ts
+66     0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-my-reports.component.html
+165    0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-my-reports.component.ts
+65     0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-output-options.component.html
+34     0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-output-options.component.ts
+5      0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-sort-order.component.css
+59     0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-sort-order.component.html
+83     0       Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-sort-order.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/simple-reporter.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/simple-reporter.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/simple-reporter.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/simple-reporter.service.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-editor.component.css
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-editor.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-editor.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-field-chooser.component.css
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-field-chooser.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-field-chooser.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-field.component.css
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-field.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-field.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-my-outputs.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-my-outputs.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-my-reports.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-my-reports.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-output-options.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-output-options.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-sort-order.component.css
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-sort-order.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/reporter/simple/sr-sort-order.component.ts
+
+commit bc3b0b7eba63c2e52ad023c39ea8d3152d37e9cf
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Thu Oct 28 13:22:06 2021 -0400
+
+    add component for general text multi-select
+    
+    Sponsored-by: C/W MARS
+    Sponsored-by: Missouri Evergreen Consortium
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: rfrasur <rfrasur@library.in.gov>
+
+10     0       Open-ILS/src/eg2/src/app/share/text-multi-select/text-multi-select.component.html
+58     0       Open-ILS/src/eg2/src/app/share/text-multi-select/text-multi-select.component.ts
+3      0       Open-ILS/src/eg2/src/app/staff/common.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/share/text-multi-select/text-multi-select.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/share/text-multi-select/text-multi-select.component.ts
+
+commit adf950c9ecdf54d4a7f94e9527c1a32b1cf47adc
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Thu Oct 28 13:21:30 2021 -0400
+
+    improve existing components for use in SR
+    
+    Add onChange emitter to eg-org-family-select, and augment the output so we can reconstruct it
+    Add @sr:org_filter_field capability to eg-multi-select and eg-combobox
+    
+    Sponsored-by: C/W MARS
+    Sponsored-by: Missouri Evergreen Consortium
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: rfrasur <rfrasur@library.in.gov>
+
+7      0       Open-ILS/src/eg2/src/app/share/interval-input/interval-input.component.ts
+1      1       Open-ILS/src/eg2/src/app/share/multi-select/multi-select.component.html
+11     3       Open-ILS/src/eg2/src/app/share/multi-select/multi-select.component.ts
+6      1       Open-ILS/src/eg2/src/app/share/org-family-select/org-family-select.component.ts
+
+commit d87a70078848bf62e360748dcb8e39f0370d4cd9
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Fri Oct 29 10:26:41 2021 -0400
+
+    Make disused "= any" and "<> any" useful
+    
+    Allow caller to supply a PG-encoded array string to test against a column value.
+    
+    Also, repair relative week transform that has never worked.
+    
+    Sponsored-by: C/W MARS
+    Sponsored-by: Missouri Evergreen Consortium
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: rfrasur <rfrasur@library.in.gov>
+
+3      3       Open-ILS/src/perlmods/lib/OpenILS/Reporter/SQLBuilder.pm
+
+commit 6252e40d64105f3775c3d977f95943b89975a994
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Tue Dec 14 12:51:16 2021 -0500
+
+    Teach Current Reporter to Ignore Simple Reporter Folders
+    
+    Sponsored-by: C/W MARS
+    Sponsored-by: Missouri Evergreen Consortium
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: rfrasur <rfrasur@library.in.gov>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/perlmods/lib/OpenILS/Application/Reporter.pm
+
+commit fccf131adfccc36ae90fe89cf0e1f418d773a1b2
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Tue Dec 14 12:48:32 2021 -0500
+
+    Validate IDL Against XSD
+    
+    Largely field name typos.
+    
+    Sponsored-by: C/W MARS
+    Sponsored-by: Missouri Evergreen Consortium
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: rfrasur <rfrasur@library.in.gov>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+44     53      Open-ILS/examples/fm_IDL.xml
+
+commit e9c8c58374fdb0bdd801d901188ea9de230acaca
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Tue Dec 14 10:57:58 2021 -0500
+
+    Add Simple Reporter IDL definitions
+    
+    Add SR IDL classes, update reporter.*, add xsl2js transforms,
+    and add sr namespace to fm_IDL.xsd. Overall IDL tidying to come.
+    
+    Sponsored-by: C/W MARS
+    Sponsored-by: Missouri Evergreen Consortium
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: rfrasur <rfrasur@library.in.gov>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1445   26      Open-ILS/examples/fm_IDL.xml
+31     1       Open-ILS/examples/fm_IDL.xsd
+40     0       Open-ILS/examples/simple-reporter.xsd
+44     3       Open-ILS/xsl/fm_IDL2js.xsl
+ create mode 100644 Open-ILS/examples/simple-reporter.xsd
+
+commit 61f63bd3d32c07f02a6a1f9148a2e7694cf6931d
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Tue Dec 14 10:33:32 2021 -0500
+
+    Add Simple Reporter Schema Changes
+    
+    New permission for Simple Reporter: RUN_SIMPLE_REPORTS
+    
+    A simple_reporter field on reporter folder tables to maintain separation
+    between Simple Reporter and It's Complicated. Also adjust indexes to allow
+    duplicate names between reporters if for some reason you want to do that.
+    
+    And a reporter.completed_reports view to compliment reporter.currently_running.
+    
+    Sponsored-by: C/W MARS
+    Sponsored-by: Missouri Evergreen Consortium
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: rfrasur <rfrasur@library.in.gov>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+20     2       Open-ILS/src/sql/Pg/950.data.seed-values.sql
+33     3       Open-ILS/src/sql/Pg/reporter-schema.sql
+71     0       Open-ILS/src/sql/Pg/upgrade/XXXX.schema.simple_reporter.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.simple_reporter.sql
+
+commit d21a319bfca295149f597760620a3c7446d01730
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Thu Mar 24 14:34:57 2022 -0400
+
+    Stamping upgrade script
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+1      1       Open-ILS/src/sql/Pg/upgrade/{XXXX.data.angular-copy-templates.sql => 1319.data.angular-copy-templates.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.data.angular-copy-templates.sql => 1319.data.angular-copy-templates.sql} (91%)
+
+commit f5cb4995bc9e3c073ce54aa9218cf13cc5a071b2
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Fri Dec 3 13:27:01 2021 -0500
+
+    LP1951162 Migrate copy templates setting
+    
+    Rename the user setting "webstaff.cat.copy.templates" to
+    "cat.copy.templates" and migrate any existing values.  This operation is
+    not performed for any databases where a "cat.copy.templates" user or
+    workstation setting type already exists.
+    
+    Teach the Angular copy editor to avoid looking up templates in local
+    storage, since only XUL templates are stored there, which are not
+    compatible.
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      10      Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.service.ts
+3      3       Open-ILS/src/sql/Pg/950.data.seed-values.sql
+33     0       Open-ILS/src/sql/Pg/upgrade/XXXX.data.angular-copy-templates.sql
+8      8       Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.angular-copy-templates.sql
+
+commit 268b96c2d4b8be034d209db457afeb4e6d67609e
+Author: Dan Briem <dbriem@wlsmail.org>
+Date:   Wed Mar 16 16:45:37 2022 -0400
+
+    LP#1746800 Exclude empty records on filtered staff searches
+    
+    Excludes empty bibs on staff searches when filtering on location
+    or location group or when using the availability modifier.
+    
+    Signed-off-by: Dan Briem <dbriem@wlsmail.org>
+    Signed-off-by: Jennifer Weston <jennifer.weston@equinoxoli.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+
+commit 8c07c06939d2b460fdfe828ec3253945a17b9d23
+Author: Terran McCanna <tmccanna@georgialibraries.org>
+Date:   Fri Dec 31 13:37:09 2021 -0500
+
+    LP1909681 Open hold grid links in new tab
+    
+    This updates the holds grid used by Hopeless Holds, the Holds Pull
+    List, and the staff catalog record View Holds tab.
+    
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+3      3       Open-ILS/src/eg2/src/app/staff/share/holds/grid.component.html
+
+commit 4e61c9e2d05947cb49bb6c673fd41892b549e60e
+Author: Tiffany Little <tlittle@georgialibraries.org>
+Date:   Fri Jun 18 14:33:50 2021 -0400
+
+    LP1928003 Protect real copies from auto-deletion by cancelling acq line items
+    
+    Signed-off-by: Tiffany Little <tlittle@georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Order.pm
+
+commit 6cd0aea29906e4e12d52c0aa3f3c86368b350a2d
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Wed Mar 2 06:54:29 2022 -0500
+
+    Hide username and password in eg2 when screen is narrow
+    
+    The Angular staff client navbar doesn't collapse when the screen is narrow
+    but currently the username and password can wrap, pushing the navbar over
+    the content. This patch doesn't add a collapsing navbar but hiding the user
+    information does at least stop the navbar from growing.
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: rfrasur <rfrasur@library.in.gov>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+7      0       Open-ILS/src/eg2/src/app/staff/nav.component.css
+1      1       Open-ILS/src/eg2/src/app/staff/nav.component.html
+
+commit 49a0a18b1a1381e4913dc63be91a020177eab932
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Tue Mar 1 14:34:55 2022 -0500
+
+    LP1724008: Hide User@workstation when screen is narrow
+    
+    As an intermediate step between the "full" navbar and the
+    collapsed navbar we hide the username and workstation of
+    the current user. This helps prevent the wrapping that can
+    cause the navbar to cover some of the page.
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: rfrasur <rfrasur@library.in.gov>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/templates/staff/navbar.tt2
+
+commit b5d7ccd8b30e9a2b9adbf653777fc059e69809be
+Author: Jeff Davis <jdavis@sitka.bclibraries.ca>
+Date:   Fri Nov 5 16:41:55 2021 -0700
+
+    LP#1951318: API call to retrieve (publicly-visible) carousel contents
+    
+    Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+44     0       Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/Carousel.pm
+5      31      Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+
+commit 9ecdc4a6f42344a47283cc7da99c74013869a13f
+Author: Terran McCanna <tmccanna@georgialibraries.org>
+Date:   Thu Sep 23 12:53:54 2021 -0400
+
+    LP1944755 Add ability to embed carousels on external pages
+    
+    This displays carousels on an otherwise blank page, allowing
+    libraries to very easily embed them on their web sites using iframes.
+    
+    Example iframe code:
+    <iframe src="(my opac domain)/eg/opac/carousel?carousel_loc=4" title="Carousel"
+    width="80%" height="500px;" frameborder="0"></iframe>
+    
+    The base_simple code could also be used by other future features
+    that are driven by Evergreen but that shouldn't display the headers and
+    footers.
+    
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      0       Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+8      0       Open-ILS/src/templates-bootstrap/opac/carousel.tt2
+84     0       Open-ILS/src/templates-bootstrap/opac/parts/base_simple.tt2
+1      1       Open-ILS/src/templates-bootstrap/opac/parts/misc_util.tt2
+ create mode 100644 Open-ILS/src/templates-bootstrap/opac/carousel.tt2
+ create mode 100644 Open-ILS/src/templates-bootstrap/opac/parts/base_simple.tt2
+
+commit cec56b83daae43aaf9874b6caada06218d418c61
+Author: Michele Morgan <mmorgan@noblenet.org>
+Date:   Thu Mar 24 11:01:13 2022 -0400
+
+    lp1787968 Stamping upgrade script
+    
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+0      0       Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.jacket_uploader.sql => 1318.schema.jacket_uploader.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.jacket_uploader.sql => 1318.schema.jacket_uploader.sql} (100%)
+
+commit ef74487f93446ae9a506aa907165eb1d27934ff1
+Author: Michele Morgan <mmorgan@noblenet.org>
+Date:   Thu Mar 24 10:26:02 2022 -0400
+
+    lp1787968 Release Notes Addendum
+    
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+5      0       docs/RELEASE_NOTES_NEXT/Cataloging/custom_cover_image.adoc
+
+commit 74b4c1a156b318809255283a28b9f9994d432f22
+Author: Jason Etheridge <jason@EquinoxOLI.org>
+Date:   Mon Oct 11 18:24:16 2021 -0400
+
+    lp1787968 jacket_upload: release notes
+    
+    Signed-off-by: Jason Etheridge <jason@EquinoxOLI.org>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+32     0       docs/RELEASE_NOTES_NEXT/Cataloging/custom_cover_image.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/custom_cover_image.adoc
+
+commit f23fd208955cb039131e0772744396feacc718f9
+Author: Jason Etheridge <jason@EquinoxOLI.org>
+Date:   Mon Oct 11 17:52:00 2021 -0400
+
+    lp1787968 jacket_upload: tests
+    
+    Signed-off-by: Jason Etheridge <jason@EquinoxOLI.org>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+72     0       Open-ILS/src/perlmods/live_t/34-lp1787968-cover-uploader.t
+ create mode 100644 Open-ILS/src/perlmods/live_t/34-lp1787968-cover-uploader.t
+
+commit 135cfa2ee3c7570c95d947cdce6796e0299ee2be
+Author: Jason Etheridge <jason@EquinoxOLI.org>
+Date:   Fri Sep 3 11:25:14 2021 -0400
+
+    lp1787968 jacket_upload: UI
+    
+    Signed-off-by: Jason Etheridge <jason@EquinoxOLI.org>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+5      1       Open-ILS/src/eg2/src/app/staff/catalog/catalog.module.ts
+6      0       Open-ILS/src/eg2/src/app/staff/catalog/record/actions.component.html
+43     0       Open-ILS/src/eg2/src/app/staff/catalog/record/upload-jacket-image-dialog.component.html
+138    0       Open-ILS/src/eg2/src/app/staff/catalog/record/upload-jacket-image-dialog.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/record/upload-jacket-image-dialog.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/record/upload-jacket-image-dialog.component.ts
+
+commit 6e5146ca49a2430ade1ff3ff456db177b187f8fc
+Author: Jason Etheridge <jason@EquinoxOLI.org>
+Date:   Fri Aug 13 12:23:49 2021 -0400
+
+    lp1787968 jacket_upload: server-side
+    
+    Signed-off-by: Jason Etheridge <jason@EquinoxOLI.org>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+6      0       Open-ILS/examples/apache_24/eg_vhost.conf.in
+2      0       Open-ILS/examples/opensrf.xml.example
+206    1       Open-ILS/src/perlmods/lib/OpenILS/WWW/Vandelay.pm
+
+commit 69f221cd3a24a3aadfc26dd3323b758ca297639b
+Author: Jason Etheridge <jason@EquinoxOLI.org>
+Date:   Mon Sep 6 21:54:50 2021 -0400
+
+    lp1787968 jacket_upload: schema
+    
+    Changed permission id due to conflict.
+    
+    Signed-off-by: Jason Etheridge <jason@EquinoxOLI.org>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+29     0       Open-ILS/src/sql/Pg/950.data.seed-values.sql
+38     0       Open-ILS/src/sql/Pg/upgrade/XXXX.schema.jacket_uploader.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.jacket_uploader.sql
+
+commit 6baae38c6adfacacf7e6ae624a5b20b4b9cefd83
+Author: Tiffany Little <tlittle@georgialibraries.org>
+Date:   Fri Dec 3 13:53:40 2021 -0500
+
+    LP1953193 Add autofilter to funding sources
+    
+    Adds an autofilter on the active column.
+    
+    Signed-off-by: Tiffany Little <tlittle@georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Mary Llewellyn <mllewell@biblio.org>
+
+1      1       Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funding-sources.component.html
+
+commit 11e7e6ec6c8c6d8077dc1fe21a5b6d2a800add95
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Thu Mar 24 09:01:34 2022 -0400
+
+    Stamping upgrade script
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+2      0       Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.portal_page_table.sql => 1315.schema.portal_page_table.sql}
+2      0       Open-ILS/src/sql/Pg/upgrade/{YYYY.data.default_portal_page.sql => 1316.data.default_portal_page.sql}
+2      0       Open-ILS/src/sql/Pg/upgrade/{ZZZZ.data.portal_admin_perm.sql => 1317.data.portal_admin_perm.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.portal_page_table.sql => 1315.schema.portal_page_table.sql} (95%)
+ rename Open-ILS/src/sql/Pg/upgrade/{YYYY.data.default_portal_page.sql => 1316.data.default_portal_page.sql} (97%)
+ rename Open-ILS/src/sql/Pg/upgrade/{ZZZZ.data.portal_admin_perm.sql => 1317.data.portal_admin_perm.sql} (76%)
+
+commit 0e23332d226b0ad83fd1d2ed7138c7b4f475e05d
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Wed Dec 22 16:54:22 2021 -0500
+
+    LP#1938835: release notes for the customizable staff portal
+    
+    To test
+    -------
+    [1] Apply the patch.
+    [2] Verify that the Angular staff portal is now the default
+        and that it displays the stock portal entries.
+    [3] In the new Staff Portal Page local administration interface,
+        make changes to add, subtract, or modify portal page entries.
+    [4] Verify that those changes appear on the staff portal page and
+        that they are sensitive to the workstation that the staff
+        user is logged in as.
+    
+    Sponsored-by: Pioneer Library System
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Shula Link <slink@gchrl.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Dan Guarracino <dguarracino@pls-net.org>
+
+57     0       docs/RELEASE_NOTES_NEXT/Client/Customizable_Staff_Portal.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/Customizable_Staff_Portal.adoc
+
+commit e5944fc1db8197de45dff4de10d4efa3877b3047
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Tue Aug 3 18:59:51 2021 -0400
+
+    LP#1938835: admin interface for customizing the staff portal
+    
+    Sponsored-by: Pioneer Library System
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+2      0       Open-ILS/src/eg2/src/app/staff/admin/local/admin-local-splash.component.html
+5      1       Open-ILS/src/eg2/src/app/staff/admin/local/admin-local.module.ts
+4      0       Open-ILS/src/eg2/src/app/staff/admin/local/routing.module.ts
+50     0       Open-ILS/src/eg2/src/app/staff/admin/local/staff_portal_page/clone-portal-entries-dialog.component.html
+34     0       Open-ILS/src/eg2/src/app/staff/admin/local/staff_portal_page/clone-portal-entries-dialog.component.ts
+111    0       Open-ILS/src/eg2/src/app/staff/admin/local/staff_portal_page/staff-portal-page.component.html
+114    0       Open-ILS/src/eg2/src/app/staff/admin/local/staff_portal_page/staff-portal-page.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/local/staff_portal_page/clone-portal-entries-dialog.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/local/staff_portal_page/clone-portal-entries-dialog.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/local/staff_portal_page/staff-portal-page.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/local/staff_portal_page/staff-portal-page.component.ts
+
+commit c0a44748f260138472f0f0ffbfbb14468a8fc91b
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Mon Aug 2 19:06:44 2021 -0400
+
+    LP#1938835: make the Angular staff portal/home page dynamic
+    
+    Details and test plan will be in the commit with the release
+    notes.
+    
+    Sponsored-by: Pioneer Library System
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+43     99      Open-ILS/src/eg2/src/app/staff/splash.component.html
+81     3       Open-ILS/src/eg2/src/app/staff/splash.component.ts
+2      1       Open-ILS/src/eg2/src/app/staff/staff.module.ts
+
+commit c6468303741e59a58b86f8584a7c68ffb29962e4
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Mon Aug 2 18:34:02 2021 -0400
+
+    LP#1938835: always display the Angular portal, not the AngularJS one
+    
+    This patch ensures that when a user navigates to the staff home page,
+    they will always see the Angular version, not the AngularJS version.
+    
+    Consequently, the AngularJS staff portal is now deprecated (and also
+    does not need to learn how to be dynamic.)
+    
+    Sponsored-by: Pioneer Library System
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+2      5       Open-ILS/src/eg2/src/app/staff/login.component.ts
+1      1       Open-ILS/src/eg2/src/app/staff/nav.component.html
+1      1       Open-ILS/src/templates/staff/navbar.tt2
+2      14      Open-ILS/web/js/ui/default/staff/app.js
+1      1       Open-ILS/web/js/ui/default/staff/services/auth.js
+
+commit cd67e1f34059882bdb595e3dbb91650c9b0b8cce
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Mon Aug 2 18:12:57 2021 -0400
+
+    LP#1938835: customizable staff portal - schema, IDL, and seed data
+    
+    This patch adds two new database tables and corresponding IDL classes:
+    
+    * config.ui_staff_portal_page_entry_type (types of portal widgets)
+    * config.ui_staff_portal_page_entry (entries/widgets for the portal)
+    
+    It also adds a new permission, ADMIN_STAFF_PORTAL_PAGE, for managing
+    the new entries, seed data for the stock portal, and a grid setting
+    for the portal admin interface.
+    
+    Sponsored-by: Pioneer Library System
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+38     0       Open-ILS/examples/fm_IDL.xml
+17     0       Open-ILS/src/sql/Pg/002.schema.config.sql
+5      0       Open-ILS/src/sql/Pg/800.fkeys.sql
+43     3       Open-ILS/src/sql/Pg/950.data.seed-values.sql
+34     0       Open-ILS/src/sql/Pg/upgrade/XXXX.schema.portal_page_table.sql
+34     0       Open-ILS/src/sql/Pg/upgrade/YYYY.data.default_portal_page.sql
+8      0       Open-ILS/src/sql/Pg/upgrade/ZZZZ.data.portal_admin_perm.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.portal_page_table.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.data.default_portal_page.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/ZZZZ.data.portal_admin_perm.sql
+
+commit 28d18146ce075bc6f2ff015e9efd032dfbe9b746
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Wed Mar 23 18:49:17 2022 -0400
+
+    Stamping PG10+ upgrade script
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+1      1       Open-ILS/src/sql/Pg/upgrade/{XXXX.function.lp1937244-postgresql-changes.sql => 1314.function.lp1937244-postgresql-changes.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.function.lp1937244-postgresql-changes.sql => 1314.function.lp1937244-postgresql-changes.sql} (99%)
+
+commit 7d2793f82e21747ef0af9ad94e41c770d319e435
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Tue Feb 22 13:17:04 2022 -0500
+
+    LP1937294: Fix another invalid XPath expression error
+    
+    There was a typo further down in authority.generate_overlay_template
+    that was missed when the previous error was corrected.  This commit
+    replaces an erroneous ( with the correct *.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/sql/Pg/011.schema.authority.sql
+
+commit bd487d3003cc4bb99ec51ea94db8df38ef299287
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Tue Feb 22 12:35:13 2022 -0500
+
+    LP1937294: Fix XPath invalid XPath expression Error
+    
+    One of the XPath expressions in authority.generate_overly_template()
+    was missing an * (asterisk).  This commit restores the omitted *.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/sql/Pg/011.schema.authority.sql
+
+commit 5a48914ad9d915975fbd3b08a40151542f7d8a8f
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Thu Dec 16 14:04:58 2021 -0500
+
+    LP1937294: Update Installation Documentation
+    
+    Update the server installation and upgrade documents to reflect the
+    status of the newer PostgreSQL version and removal of PostgreSQL
+    version 9.6.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+69     22      docs/modules/installation/pages/server_installation.adoc
+1      1       docs/modules/installation/pages/server_upgrade.adoc
+
+commit 09d021bc336b18799968313f79d4c22371e577ed
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Thu Dec 16 13:39:55 2021 -0500
+
+    LP1937294: Update Prerequisite Installation for PostgreSQL Server
+    
+    Add targets to install PostgreSQL server version 11 through 14 via the
+    Makefile.install prerequisite installer.
+    
+    Drop PostgreSQL version 9.6 as an installation target.
+    
+    Use PostgreSQL 14 client as it should be backwards compatible and is
+    required if using the PostgreSQL 14 server.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+41     11      Open-ILS/src/extras/Makefile.install
+47     13      Open-ILS/src/extras/install/Makefile.debian-bullseye
+47     13      Open-ILS/src/extras/install/Makefile.debian-buster
+50     16      Open-ILS/src/extras/install/Makefile.debian-stretch
+47     13      Open-ILS/src/extras/install/Makefile.ubuntu-bionic
+47     13      Open-ILS/src/extras/install/Makefile.ubuntu-focal
+
+commit a75d7a34ee5fd4b3bb5f32c7a36b9a131913c016
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Fri Nov 19 17:44:37 2021 -0500
+
+    LP1937294: Fix the unaccent and squash tests
+    
+    Changes in Pg 12 and Pg 14 character handling necessitate changes to
+    two of the tests in t/lp1501781-unaccent_and_squash.pg.  These are
+    similar to changes made for PostgreSQL 9.6.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+4      2       Open-ILS/src/sql/Pg/t/lp1501781-unaccent_and_squash.pg
+
+commit b035da7435ced7f7beca36a742fa9a80b62ac410
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Fri Nov 19 14:44:43 2021 -0500
+
+    LP1937294: Fix metarecord master record choice predictability issue
+    
+    The metabib master record was being chosen using indeterminant code.
+    In the case of a quality tie, which record would be chosen depends on
+    the order that they were returned from the database.  This commit adds
+    an additional order by on the biblio.record_entry.id to ensure that
+    the best matching record with the lowest id is chosen.
+    
+    The live_t/lp1145213_test_func_asset.merge_record_assets.pg tests are
+    also adjusted to take this into account and should now pass on all Pg
+    versions and regardless of the order that the data is inserted.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+3      3       Open-ILS/src/sql/Pg/030.schema.metabib.sql
+1      1       Open-ILS/src/sql/Pg/live_t/lp1145213_test_func_asset.merge_record_assets.pg
+94     0       Open-ILS/src/sql/Pg/upgrade/XXXX.function.lp1937244-postgresql-changes.sql
+
+commit 171f873a72275bfb554f03e9ccd27d38b4326982
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Thu Nov 18 16:06:37 2021 -0500
+
+    LP1937294: Fix Functions for XML/XPath changes
+    
+    Use local-name() in XPath where necessitated by XML bug fixes in
+    PostgreSQL 11 and later.  Relative XPath no longer works as it used
+    to.
+    
+    Fix authority.generate_overlay_template()
+    
+    Fix authority.normalize_heading()
+    
+    Fix vandelay.ingest_items()
+    
+    Fix biblio.extract_quality()
+    
+    Fix authority.simple_heading_set()
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+22     20      Open-ILS/src/sql/Pg/011.schema.authority.sql
+1      1       Open-ILS/src/sql/Pg/030.schema.metabib.sql
+44     45      Open-ILS/src/sql/Pg/999.functions.global.sql
+740    0       Open-ILS/src/sql/Pg/upgrade/XXXX.function.lp1937244-postgresql-changes.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.lp1937244-postgresql-changes.sql
+
+commit 0ab42b1702ae0797dc9247b5a4258edbe27d6c74
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Mon Nov 15 14:21:17 2021 -0500
+
+    LP1937294: Fix Sample Data Load Predictability Issue
+    
+    Add "ORDER BY id" to the main queries in the functions used to create
+    call numbers and copies when loading the sample data.  This change
+    allows the call numbers and copies to be created in a predictable
+    manner.
+    
+    The necessity of this change was revealed by the failure of the
+    20-hold-targeter.t Perl live test on PostgreSQL 11+.  After this
+    change, that test passes on newer PostgreSQL versions and continues to
+    pass on PostgreSQL 10.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+4      2       Open-ILS/tests/datasets/sql/env_create.sql
+
+commit c7d525f4a5b7839b1ce13457184359e27430596e
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Wed Nov 10 11:16:56 2021 -0500
+
+    LP1937294: Add FTS Config for PostgreSQL 11 - 14
+    
+    Add links to 000.english.pg94.fts-config.sql for PostgreSQL version 11
+    through 14:
+    
+      * 000.english.pg11.fts-config.sql
+      * 000.english.pg12.fts-config.sql
+      * 000.english.pg13.fts-config.sql
+      * 000.english.pg14.fts-config.sql
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      0       Open-ILS/src/sql/Pg/000.english.pg11.fts-config.sql
+1      0       Open-ILS/src/sql/Pg/000.english.pg12.fts-config.sql
+1      0       Open-ILS/src/sql/Pg/000.english.pg13.fts-config.sql
+1      0       Open-ILS/src/sql/Pg/000.english.pg14.fts-config.sql
+ create mode 120000 Open-ILS/src/sql/Pg/000.english.pg11.fts-config.sql
+ create mode 120000 Open-ILS/src/sql/Pg/000.english.pg12.fts-config.sql
+ create mode 120000 Open-ILS/src/sql/Pg/000.english.pg13.fts-config.sql
+ create mode 120000 Open-ILS/src/sql/Pg/000.english.pg14.fts-config.sql
+
+commit 5b7187ce79dd13cc567d6dee5c46554333b9b5e1
+Author: Garry Collum <gcollum@gmail.com>
+Date:   Sun Jan 23 21:05:16 2022 -0500
+
+    LP1010494 - More Details button is not translatable.
+    
+    Surrounds the text in the More Details and Less Details button in the
+    bootstrap opac bib record screen and changes 'Less Details' to
+    'Fewer Details'.
+    
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+3      3       Open-ILS/src/templates-bootstrap/opac/parts/record/summary.tt2
+
+commit 65baa507bb9037a244bf05cf5aabe8c331799ed5
+Author: Lynn Floyd <alynn2671@gmail.com>
+Date:   Thu Dec 30 15:56:29 2021 -0500
+
+    Added Author to Pending view in Item Buckets
+    
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+2      1       Open-ILS/src/templates/staff/cat/bucket/copy/t_pending.tt2
+
+commit 864193e981ac8387e0d64c07d53586b6a5b3bffe
+Author: Lynn Floyd <alynn2671@gmail.com>
+Date:   Thu Dec 30 12:22:17 2021 -0500
+
+    Add Author field to Item buckets.
+    
+    Signed-off-by: Lynn Floyd <alynn2671@gmail.com>
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+2      0       Open-ILS/src/templates/staff/cat/bucket/copy/t_view.tt2
+
+commit 93646c82129e6399251f7c9d795877cf86b0bb55
+Author: Garry Collum <gcollum@gmail.com>
+Date:   Sun Dec 26 17:56:51 2021 -0500
+
+    LP1863196-Add series title to holds pull list.
+    
+    This adds the series title as an column option in the holds pull list.
+    
+    In the Hold Pull List template in the server print template adminstration
+    the variable 'hold.series_title' can be used.
+    
+    One possible option would be to add series_title to the title cell.
+    
+    Example:
+    <td style="width: 30%">[% hold.title %]<br>
+    [%IF hold.series_title %] Series: [% hold.series_title %][% END %]</td>
+    
+    To Test the display:
+    1. Apply the patch.
+    2. Place a hold on a record with a series title.
+    3. Pull up the Holds Pull list and display the Series Title column.
+    
+    To Test the Print Template:
+    1. Add the series_title variable to the hold pull list server template.
+    2. Display the Holds Pull list and click on the Print Full List button.
+    3. The print preview should display the series title information.
+    
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Shula Link <slink@gchrl.org>
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1      0       Open-ILS/src/eg2/src/app/staff/share/holds/grid.component.html
+5      1       Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+
+commit fddcefb2fb0db58ff5357f205034bc62f20dbac8
+Author: Josh Stompro <stompro@stompro.org>
+Date:   Mon Dec 13 13:58:02 2021 -0600
+
+    LP1847827 - Evergreen Web Based Self Check - Use prefered first name in header.
+    
+    Thank you to Suzanne Paterno for showing me what to edit.
+    
+    After this is installed, just set and unset a preferred first name for an account
+    and make sure it shows up correctly in the web based self check interface.
+    https://example.com/eg/circ/selfcheck/main
+    
+    Signed-off-by: Josh Stompro <stompro@stompro.org>
+    Signed-off-by: Jennifer Pringle <jennifer.pringle@bclibraries.coop>
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+2      1       Open-ILS/web/js/ui/default/circ/selfcheck/selfcheck.js
+
+commit 48771af5ae7d6292eef763f9a5677acc93ecacc9
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Wed Sep 15 10:21:25 2021 -0400
+
+    LP1846552 Shelving location Order handle new locations
+    
+    Ensure that copy locations added since the last time location order
+    entries were saved are displayed.
+    
+    Show when a location is "unsaved" in the UI.
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+2      1       Open-ILS/src/eg2/src/app/staff/admin/local/copy-loc-order/copy-loc-order.component.html
+14     8       Open-ILS/src/eg2/src/app/staff/admin/local/copy-loc-order/copy-loc-order.component.ts
+
+commit 6516659d05dc80d3169462ee91a62e5cfd134292
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Mon Sep 13 14:17:16 2021 -0400
+
+    LP1846552 Shelving Location Order Angular UI
+    
+    Ports the copy shelving location order interface to Angular.
+    
+    Admin => Local Admin => Shelving Location Order.
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/eg2/src/app/core/pcrud.service.ts
+1      1       Open-ILS/src/eg2/src/app/staff/admin/local/admin-local-splash.component.html
+15     0       Open-ILS/src/eg2/src/app/staff/admin/local/copy-loc-order/copy-loc-order-routing.module.ts
+7      0       Open-ILS/src/eg2/src/app/staff/admin/local/copy-loc-order/copy-loc-order.component.css
+59     0       Open-ILS/src/eg2/src/app/staff/admin/local/copy-loc-order/copy-loc-order.component.html
+198    0       Open-ILS/src/eg2/src/app/staff/admin/local/copy-loc-order/copy-loc-order.component.ts
+23     0       Open-ILS/src/eg2/src/app/staff/admin/local/copy-loc-order/copy-loc-order.module.ts
+4      0       Open-ILS/src/eg2/src/app/staff/admin/local/routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/local/copy-loc-order/copy-loc-order-routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/local/copy-loc-order/copy-loc-order.component.css
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/local/copy-loc-order/copy-loc-order.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/local/copy-loc-order/copy-loc-order.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/local/copy-loc-order/copy-loc-order.module.ts
+
+commit f61f1e147b1d4ed288554c88ff72d040c924a0f1
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Wed Mar 16 13:29:09 2022 -0400
+
+    LP1965161: Sort Monograph Parts in Holds Metadata
+    
+    When placing a hold in the Angular Staff Catalog, parts are not sorted
+    in the proper order.  This patch corrects the sort order.
+    
+    To verify the bug:
+    
+     1. Find a record with parts in your catalog.
+     2. Place a hold on a specific part using the Angular Staff Catalog.
+     3. Notice that the entries int he parts drop down are likely not
+        sorted in the correct order. (If they are you lucked out and
+        should try again with a different record.)
+    
+    To verify the fix after applying the patch and re-installing
+    Evergreen, repeat the above steps.  The parts should display in the
+    proper sort order by label.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+5      1       Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+
+commit 91fa2ee5f2ad75a5ad480d92c74fe91f3ddfbbeb
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Wed Mar 16 16:10:29 2022 -0400
+
+    LP1956003 Stamping DB upgrade / hold group grids
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+1      1       Open-ILS/src/sql/Pg/upgrade/{xxxx.data.hold_group_ws_settings.sql => 1313.data.hold_group_ws_settings.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{xxxx.data.hold_group_ws_settings.sql => 1313.data.hold_group_ws_settings.sql} (94%)
+
+commit 4d667aa09ff61496c9f60a0cfae34c13566a5a61
+Author: Lynn Floyd <alynn2671@gmail.com>
+Date:   Thu Dec 30 11:38:07 2021 -0500
+
+    LP1956003 Hold Group Workstation Settings to Server Settings.
+    
+    add Group Holds to grid settings in Seeded Values.
+    
+    Signed-off-by: Lynn Floyd <alynn2671@gmail.com>
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+31     0       Open-ILS/src/sql/Pg/950.data.seed-values.sql
+36     0       Open-ILS/src/sql/Pg/upgrade/xxxx.data.hold_group_ws_settings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.data.hold_group_ws_settings.sql
+
+commit 64803ff1fbca0fc24d649eb10b31cf7f26a19019
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Wed Mar 16 16:05:19 2022 -0400
+
+    LP1960956 Stamping DB upgrade / usr message index (fix)
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1      1       Open-ILS/src/sql/Pg/upgrade/1312.schema.add_editor_index_to_usr_message.sql
+
+commit 9ab97eb8d80d4f1d5852ea30ee64dbffc32766e1
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Wed Mar 16 15:52:34 2022 -0400
+
+    LP1922975 Build scripts python3 minor fixes
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+5      4       build/i18n/scripts/dojo_resource.py
+
+commit e4a07d8f825c986774a11bf52a7d20a23062163e
+Author: Jane Sandberg <sandbergja@gmail.com>
+Date:   Sat Nov 27 21:23:06 2021 -0800
+
+    LP#1922975: install python3 dependencies, rather than python2
+    
+    Also specifies python3 in the shebang lines of python scripts,
+    and improves the documentation for translators about installing
+    these dependencies.
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+6      6       Open-ILS/src/extras/install/Makefile.debian-bullseye
+6      6       Open-ILS/src/extras/install/Makefile.debian-buster
+6      6       Open-ILS/src/extras/install/Makefile.debian-stretch
+6      6       Open-ILS/src/extras/install/Makefile.ubuntu-bionic
+1      1       build/i18n/scripts/basel10n.py
+1      1       build/i18n/scripts/db-seed-i18n.py
+1      1       build/i18n/scripts/dojo_resource.py
+1      1       build/i18n/scripts/fieldmapper.py
+1      1       build/i18n/scripts/ils_events.py
+1      1       build/i18n/scripts/marc_tooltip_maker.py
+1      1       build/i18n/scripts/merge_ils_events.py
+1      1       build/i18n/tests/check_entities.py
+1      1       build/i18n/tests/check_properties.py
+1      1       build/i18n/tests/testIDL.py
+1      1       build/i18n/tests/testSQL.py
+1      1       build/i18n/tests/testbase.py
+1      1       build/i18n/tests/testpo.py
+12     0       docs/modules/development/pages/updating_translations_launchpad.adoc
+
+commit b49185fd713b3ea27a023cf30f0b1fc4d1940f71
+Author: Jeff Davis <jdavis@sitka.bclibraries.ca>
+Date:   Wed Apr 7 15:33:04 2021 -0700
+
+    LP#1922975: update i18n scripts for Python 3
+    
+    Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+2      2       build/i18n/scripts/db-seed-i18n.py
+3      3       build/i18n/scripts/dojo_resource.py
+2      2       build/i18n/scripts/fieldmapper.py
+1      1       build/i18n/scripts/ils_events.py
+7      7       build/i18n/scripts/marc_tooltip_maker.py
+3      3       build/i18n/scripts/merge_ils_events.py
+
+commit ff3db82ca0022234d46cc9c8f1cd1e91862f7696
+Author: Jane Sandberg <sandbergja@gmail.com>
+Date:   Thu Nov 18 20:19:40 2021 -0800
+
+    LP1843970: Refactor Coded Value Map grid to use eg-admin-page
+    
+    Also adds a new @Input to eg-admin-page that accepts arbitrary
+    columns based on <ng-template>s
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+9      41      Open-ILS/src/eg2/src/app/staff/admin/server/coded-value-maps/coded-value-maps.component.html
+2      101     Open-ILS/src/eg2/src/app/staff/admin/server/coded-value-maps/coded-value-maps.component.ts
+2      0       Open-ILS/src/eg2/src/app/staff/admin/server/coded-value-maps/coded-value-maps.module.ts
+4      0       Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.html
+9      0       Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.ts
+
+commit 2248140fe3af54901d8702f0ee5974e0f6c0cb22
+Author: Garry Collum <gcollum@gmail.com>
+Date:   Tue Nov 16 13:43:17 2021 -0500
+
+    LP1838580: Holds Shelf detail view record summary doesn't populate
+    
+    Fixes the record summary of the detail view from the holds shelf. After
+    the patch is applied the bibliographic data displays in the detail view.
+    
+    To test:
+    
+    1. Go to Holds Shelf
+    2. Select a line
+    3. Click on the Detail View button, and notice that the bibliographic
+    information doesn't populate.
+    4. Click on the MARC link, to see to that the link does not take you to the
+    MARC view.
+    5. Apply patch.
+    6. Repeat 1-4.  The bibliographic information now displays, and the MARC link
+    takes you to the correct page.
+    
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1      1       Open-ILS/web/js/ui/default/staff/circ/holds/app.js
+
+commit af5a4094349360083e9ab116693d013d2ec78c9f
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Wed Mar 16 14:36:28 2022 -0400
+
+    LP1960956 Stamping DB upgrade / usr message index
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+0      0       Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.add_editor_index_to_usr_message.sql => 1312.schema.add_editor_index_to_usr_message.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.add_editor_index_to_usr_message.sql => 1312.schema.add_editor_index_to_usr_message.sql} (100%)
+
+commit 951a51dcd395dbea0bb3918641d82646b4812919
+Author: Chris Sharp <csharp@georgialibraries.org>
+Date:   Tue Feb 15 15:15:37 2022 -0500
+
+    LP#1960956: Fix slow user merges/deletes
+    
+    Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1      0       Open-ILS/src/sql/Pg/005.schema.actors.sql
+7      0       Open-ILS/src/sql/Pg/upgrade/XXXX.schema.add_editor_index_to_usr_message.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.add_editor_index_to_usr_message.sql
+
+commit dad5e6f01f18f4eb7dff0b088eb9b6cb5922c655
+Author: Tiffany Little <tlittle@georgialibraries.org>
+Date:   Fri Jul 23 12:24:48 2021 -0400
+
+    LP1916600 Add Create Date as a column in Holdings View
+    
+    Splits out Active Date and Create Date into two separate columns in holdings view.
+    
+    Signed-off-by: Tiffany Little <tlittle@georgialibraries.org>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+4      1       Open-ILS/src/eg2/src/app/staff/catalog/record/holdings.component.html
+
+commit caef876670021fec21dd2e3a95951fd71c25233a
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Tue Nov 9 18:22:07 2021 -0500
+
+    LP#1950394: isolate attribute extraction of metarecord
+    
+    This patch ensures that calling the Template Toolkit block
+    get_marc_attrs() on the metarecord's lead record's MARCXML
+    does not interfere with attributes already parsed from the
+    current bib's MARCXML on the record summary page in the Bootstrap
+    OPAC.
+    
+    This fixes an issue where electronic resource links could fail to
+    be displayed under the following conditions:
+    
+    - the MARC record has an 856 field with ind1 = 4 and ind2 = 0 or 1
+      and is NOT a located URI
+    - the bib is part of a metarecord set with at least one other member
+    - the master record in the metarecord set does not have 856 fields
+    
+    To test
+    -------
+    [1] Create a setup where two bibs are in the same metarecord set, one
+        with 856 fields and one without. Arrange that the one without
+        856 fields is the lead record in the metarecord.
+    [2] View the one that has 856 fields in the Bootstrap OPAC's record
+        summary page. Note that the electronic resource links do not
+        appear.
+    [3] Apply the patch and repeat step 2. This time, the links should
+        appear.
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+4      0       Open-ILS/src/templates-bootstrap/opac/parts/record/summary.tt2
+
+commit ef12f9565c8afb5b2502f6881c440782457c1155
+Author: Dan Briem <dbriem@wlsmail.org>
+Date:   Sat Nov 20 15:14:36 2021 -0500
+
+    LP#1939426 Traditional Catalog Holds: Patron Info Not Populating
+    
+    When no hold groups exist, its interface isn't present. When
+    placing volume holds, the advanced link isn't present.
+    
+    This checks that those elements exist before accessing their
+    attributes and adds a missing name attribute to the Bootstrap
+    catalog to display the email address.
+    
+    Signed-off-by: Dan Briem <dbriem@wlsmail.org>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1      1       Open-ILS/src/templates-bootstrap/opac/parts/place_hold.tt2
+12     7       Open-ILS/web/js/ui/default/opac/staff.js
+
+commit 73ed6694dcfef2e3ee4b3dafd5987193c657624a
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Fri Mar 11 09:03:02 2022 -0500
+
+    LP1964019: Change span tag to div to work around a Chrome bug
+    
+    For some reason the span tag wrapping the contents of the Holdable? column
+    began to cause problems with Chrome 99 on Windows. Changing the spans to divs
+    works everywhere without turning off tooltips.
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+3      3       Open-ILS/src/eg2/src/app/staff/catalog/record/copies.component.html
+
+commit baf0bf696aca4999a48e4e1dbf06bfc8aa37eff7
+Author: gmontimantis <86423994+gmontimantis@users.noreply.github.com>
+Date:   Wed Jan 26 12:20:40 2022 -0500
+
+    Revising 'Using the Public Access Catalog' page
+    
+    Updating screenshots and information in this doc to match Bootstrap.  Some areas need updating still.
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+-      -       docs/modules/opac/assets/images/opac/advanced_search_ex.jpg
+-      -       docs/modules/opac/assets/images/opac/advanced_search_filters.jpg
+-      -       docs/modules/opac/assets/images/opac/back_to_results.jpg
+-      -       docs/modules/opac/assets/images/opac/branch_search.jpg
+-      -       docs/modules/opac/assets/images/opac/did_you_mean_no_results.jpg
+-      -       docs/modules/opac/assets/images/opac/email_records_screen.jpg
+-      -       docs/modules/opac/assets/images/opac/highlighting.jpg
+-      -       docs/modules/opac/assets/images/opac/more_details_record.jpg
+-      -       docs/modules/opac/assets/images/opac/permalink.jpg
+-      -       docs/modules/opac/assets/images/opac/placing_holds.jpg
+-      -       docs/modules/opac/assets/images/opac/print_email_records.jpg
+-      -       docs/modules/opac/assets/images/opac/print_records_screen.jpg
+-      -       docs/modules/opac/assets/images/opac/record_details.jpg
+-      -       docs/modules/opac/assets/images/opac/search_facets.JPG
+-      -       docs/modules/opac/assets/images/opac/search_results.jpg
+-      -       docs/modules/opac/assets/images/opac/search_results_quantity.JPG
+-      -       docs/modules/opac/assets/images/opac/viewing_record.jpg
+45     56      docs/modules/opac/pages/using_the_public_access_catalog.adoc
+ create mode 100644 docs/modules/opac/assets/images/opac/advanced_search_ex.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac/advanced_search_filters.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac/back_to_results.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac/branch_search.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac/did_you_mean_no_results.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac/email_records_screen.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac/highlighting.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac/more_details_record.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac/permalink.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac/placing_holds.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac/print_email_records.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac/print_records_screen.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac/record_details.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac/search_facets.JPG
+ create mode 100644 docs/modules/opac/assets/images/opac/search_results.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac/search_results_quantity.JPG
+ create mode 100644 docs/modules/opac/assets/images/opac/viewing_record.jpg
+
+commit 4e6fe743271992347686a113c390b208c162942b
+Author: Dan Briem <dbriem@wlsmail.org>
+Date:   Thu Dec 30 09:51:34 2021 -0500
+
+    LP#1955931 Staff catalog show more details - add due date
+    
+    Adds a due date column to the show more details view in
+    the Angular staff catalog.
+    
+    Signed-off-by: Dan Briem <dbriem@wlsmail.org>
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+8      4       Open-ILS/src/eg2/src/app/staff/catalog/result/record.component.html
+10     3       Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+
+commit e9c6750312c9c1ba001119e918ac84f4bcd017a6
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Tue Mar 1 07:55:16 2022 -0500
+
+    Update Test for LP1722827 After LP1482757
+    
+    The 4th part of the old test is incorrect as not deleting these is
+    the point of 1482757. Test has been updated to reflect that.
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+
+3      3       Open-ILS/src/sql/Pg/t/lp1722827_trim_spaces_from_located_uris.pg
+
+commit 6320dc8b23380faafa5e1fb621424cf695ef9174
+Author: Michele Morgan <mmorgan@noblenet.org>
+Date:   Fri Feb 25 15:48:01 2022 -0500
+
+    LP#1482757: stamp upgrade script
+    
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+0      163     Open-ILS/src/sql/Pg/upgrade/XXXX.function.biblio.extract_located_uris.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.biblio.extract_located_uris.sql
+
+commit e35463f5591bff73eb23b984f3cc449e5922a889
+Author: Michele Morgan <mmorgan@noblenet.org>
+Date:   Fri Feb 25 15:17:29 2022 -0500
+
+    LP#1482757: stamp upgrade script
+    
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+165    0       Open-ILS/src/sql/Pg/upgrade/1311.function.biblio.extract_located_uris.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1311.function.biblio.extract_located_uris.sql
+
+commit 300acbf91ea60ddd3fc9e76eecb6aac7f64e98fe
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Thu Sep 24 12:31:23 2020 -0400
+
+    LP#1482757: Speed Up the Delete of Orphaned URIs in upgrade script
+    
+    Modify the code that deletes orphaned asset.uri table entries in the
+    upgrade script to use IN logic on the subquery, because IN is much
+    faster than NOT IN.  Also take into account the link between
+    serial.item and asset.uri so that we don't accidentally delete URIs
+    used by serial items.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Jessica Woolford <jwoolford@biblio.org>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+9      3       Open-ILS/src/sql/Pg/upgrade/XXXX.function.biblio.extract_located_uris.sql
+
+commit 60a20d54c5e690bb927a56f84b86c76d7181ce22
+Author: Michele Morgan <mmorgan@noblenet.org>
+Date:   Wed Jul 29 16:40:06 2020 -0400
+
+    LP#1482757: Delete URIs and call numbers when all 856 fields are removed
+    
+    This patch assures that URIs and call numbers are deleted as appropriate
+    when all 856 fields are removed from the MARC.
+    
+    Also provides for tracking editor and edit_date when call numbers are
+    deleted.
+    
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+9      5       Open-ILS/src/sql/Pg/030.schema.metabib.sql
+10     6       Open-ILS/src/sql/Pg/upgrade/XXXX.function.biblio.extract_located_uris.sql
+
+commit 9299ba72c2bf94a6ea34b8b7ed21eee1f5875f62
+Author: Michele Morgan <mmorgan@noblenet.org>
+Date:   Fri Apr 24 13:03:23 2020 -0400
+
+    LP#1482757: Amend upgrade script to remove existing orphaned URIs
+    
+    Remove orphaned URIs from the database that have accumulated from past
+    additions, updates and deletions of records with located URIs.
+    
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+8      0       Open-ILS/src/sql/Pg/upgrade/XXXX.function.biblio.extract_located_uris.sql
+
+commit c22457a92e3e9b44d0aaa5d9e94e00f58b08a7d7
+Author: Michele Morgan <mmorgan@noblenet.org>
+Date:   Fri Apr 24 12:43:39 2020 -0400
+
+    LP#1482757: Remove 'orphaned_uri_list' and 'NOT cn.deleted' criteria
+    
+    Per Dan Wells' suggestions.
+    
+    1) One possible "crack" I see for data to fall through is the dead map
+    selector. The "AND cn.label = '##URI##' AND NOT cn.deleted" seems overly
+    restrictive. Now, I realize we *shouldn't* have mappings to deleted or
+    non-##URI## call numbers, but it isn't impossible, and I don't think we'd
+    have harm in leaving those restrictions out. If a map isn't used, let's
+    get rid of it regardless, I think.
+    
+    2) (side note) orphaned_uri_list doesn't seems to be used any more, so
+    should be removed.
+    
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+1      2       Open-ILS/src/sql/Pg/030.schema.metabib.sql
+1      2       Open-ILS/src/sql/Pg/upgrade/XXXX.function.biblio.extract_located_uris.sql
+
+commit 892a7bf054f511ddf3b9fd3fa855d8b500ce25c0
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Fri May 19 15:33:03 2017 -0400
+
+    LP#1482757: Be sure to remove all orphaned URI
+    
+    As reported by Michele Morgan, URIs can be orphaned in some cases, such
+    as when a location drops one of several 856 entries.  This commit tracks
+    objects at the mapping level, to identify disused URIs even where the
+    call number level is not changed.
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+25     19      Open-ILS/src/sql/Pg/030.schema.metabib.sql
+26     20      Open-ILS/src/sql/Pg/upgrade/XXXX.function.biblio.extract_located_uris.sql
+
+commit 22b4abd1ddf06acae25b4dcfb2adb9b56e0e2846
+Author: Mike Rylander <mrylander@gmail.com>
+Date:   Fri Aug 5 08:56:05 2016 -0400
+
+    LP#1482757: More careful Located URI remapping
+    
+    Instead of recreating all Located URI mappings, we will add any new
+    ones and remember all those (existing and new) that are in use. Any
+    existing maps that we don't see in this record, and whose URI is only
+    used once previously and therefore about to be orphaned, we remove.
+    
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+33     8       Open-ILS/src/sql/Pg/030.schema.metabib.sql
+140    0       Open-ILS/src/sql/Pg/upgrade/XXXX.function.biblio.extract_located_uris.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.biblio.extract_located_uris.sql
+
+commit 7fb2ccc551797063aa2cb220a3ad33a2d9f405fb
+Author: gmontimantis <86423994+gmontimantis@users.noreply.github.com>
+Date:   Thu Feb 17 09:55:10 2022 -0500
+
+    Update to Batch Search page
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+-      -       docs/modules/opac/assets/images/opac_basket/add_to_basket.jpg
+-      -       docs/modules/opac/assets/images/opac_basket/basket_icon.jpg
+-      -       docs/modules/opac/assets/images/opac_basket/drop_down_actions.jpg
+-      -       docs/modules/opac/assets/images/opac_basket/select_checkboxes.jpg
+-      -       docs/modules/opac/assets/images/opac_basket/view_basket.jpg
+1      1       docs/modules/opac/nav.adoc
+78     0       docs/modules/opac/pages/baskets.adoc
+0      108     docs/modules/opac/pages/batch_actions_from_search.adoc
+ create mode 100644 docs/modules/opac/assets/images/opac_basket/add_to_basket.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac_basket/basket_icon.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac_basket/drop_down_actions.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac_basket/select_checkboxes.jpg
+ create mode 100644 docs/modules/opac/assets/images/opac_basket/view_basket.jpg
+ create mode 100644 docs/modules/opac/pages/baskets.adoc
+ delete mode 100644 docs/modules/opac/pages/batch_actions_from_search.adoc
+
+commit c4489e045238388ff9f66d2b7e254a5f79c8b186
+Author: Jeff Godin <jgodin@tadl.org>
+Date:   Fri Jan 28 17:54:38 2022 -0500
+
+    Avoid fleshing standing penalty org unit children
+    
+    When fleshing the org unit on standing penalties, exclude child org
+    units. We don't need them, and they can cause issues when your
+    standing penalty has a Depth of "Everywhere": you end up with a full
+    copy of the org unit tree, and you will include this when editing
+    and saving the user.
+    
+    Signed-off-by: Jeff Godin <jgodin@tadl.org>
+    Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+
+4      1       Open-ILS/web/js/ui/default/staff/services/patron_search.js
+
+commit fd9a16d3f416d2966bf03746bcc71562d5aabdad
+Author: Terran McCanna <tmccanna@georgialibraries.org>
+Date:   Mon Jun 21 12:55:57 2021 -0400
+
+    LP1927990 Bootstrap OPAC: Patron messages lose line breaks
+    
+    Fixes problem where messages added to the Patron Message Center
+    lose their line breaks in the Bootstrap OPAC and makes them
+    difficult to read.
+    
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+1      1       Open-ILS/src/templates-bootstrap/opac/myopac/messages/single_message.tt2
+
+commit b2cd5140602c7cfd84ec864a673377a042d8d732
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Mon Nov 1 12:36:31 2021 -0400
+
+    LP#1949389: reduce number of PCRUD requests by subscription manager
+    
+    This patch changes how the AngularJS subscription manager fetches
+    serial item templates. In particular, rather than issuing a PCRUD
+    request for every org unit in the system, it fetches them in one
+    fell swoop. This fixes an issue where loading the subscription manager
+    in a large Evergreen consortium could lead to so many requests that
+    it drives PCRUD into backlog mode, resulting in higher request
+    latency across the board.
+    
+    To test
+    -------
+    [1] Apply the patch.
+    [2] Verify that the subscription manager lets you set the receiving
+        template for each distribution and that the drop-down's contents
+        changes if the distribution library is changed.
+    [3] Verify that the Apply Binding Template action works and that
+        the binding template drop-down(s) include the relevant copy templates.
+    
+    Note that if a binding template has been set already, the current
+    binding template is _not_ displayed as the selected value in the drop-down.
+    This is existing behavior that this patch does not aim to fix.
+    
+    Sponsored-by: BC Libraries Cooperative
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Mike Rylander <mrylander@gmail.com>
+    Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
+
+7      8       Open-ILS/web/js/ui/default/staff/serials/directives/subscription_manager.js
+34     4       Open-ILS/web/js/ui/default/staff/serials/services/core.js
+
+commit 03a4869a57428fe97780dcf4397d14447b24b67a
+Author: Steven Callender <stevecallender@esilibrary.com>
+Date:   Mon Oct 4 13:20:56 2021 -0400
+
+    LP#1946019: copyloc.js change to clear locations on new branch select.
+    
+    Signed-off-by: Steven Callender <stevecallender@esilibrary.com>
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+1      0       Open-ILS/web/js/ui/default/opac/copyloc.js
+
+commit 9966f5cbfac5289faf4e16a849498ef0a669ab81
+Author: Garry Collum <gcollum@gmail.com>
+Date:   Wed Dec 29 14:29:41 2021 -0500
+
+    LP1955927_Barcode_search_fails_in_patron_search_modal
+    
+    Fixes the barcode search in the patron search modal in the holds screen.
+    
+    To test:
+    1. Navigate to the 'place a hold' screen in a bib record and open
+    the patron search modal.
+    2. Enter a patron barcode.
+    3. The search for the patron fails.
+    4. Apply the patch and repeat.
+    
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+1      1       Open-ILS/src/eg2/src/app/staff/share/patron/search.component.html
+
+commit 42583567a482e74669c52b40108d57834a3abae8
+Author: Terran McCanna <tmccanna@georgialibraries.org>
+Date:   Thu Jan 13 17:10:32 2022 -0500
+
+    LP1957840 Typo fix in mcrp class in fm_IDL.xml
+    
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+1      1       Open-ILS/examples/fm_IDL.xml
+
+commit 9582ea41ef57dbc6068a5c9eb6a4c9400f8c3c89
+Author: Jane Sandberg <sandbergja@gmail.com>
+Date:   Thu Feb 10 19:30:06 2022 -0800
+
+    LP1947595: stamp upgrade script
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+1      1       Open-ILS/src/sql/Pg/upgrade/{XXXX.function.remove-array_accum.sql => 1310.function.remove-array_accum.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.function.remove-array_accum.sql => 1310.function.remove-array_accum.sql} (53%)
+
+commit 77f5851552b65637855449e79b6ab166498ac291
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Wed Oct 20 12:38:46 2021 -0400
+
+    Lp 1947595: Remove the array_accum aggregate function
+    
+    Remove the array_accum aggregate from Evergreen because it will need
+    to be dropped and redefined when upgrading to PostgreSQL 14.
+    
+    Replace any uses of array_accum with array_agg in the code.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+2      2       Open-ILS/src/perlmods/lib/OpenILS/Application/Booking.pm
+0      8       Open-ILS/src/sql/Pg/002.functions.aggregate.sql
+1      1       Open-ILS/src/sql/Pg/t/search_limit_facet_fetch.pg
+7      0       Open-ILS/src/sql/Pg/upgrade/XXXX.function.remove-array_accum.sql
+10     0       docs/RELEASE_NOTES_NEXT/API/array-accum-removed.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.remove-array_accum.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/API/array-accum-removed.adoc
+
+commit ed14ad6edaf5a7c76b168ca2e624e05719830162
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Fri Jan 7 18:50:04 2022 -0500
+
+    LP#1951021: account for change in OverDrive checkout response
+    
+    The OverDrive circulation API soon will stop providing a direct
+    download link in favor of displaying a separate fulfillment page
+    (either as an iframe or a redirect). This patch implements this
+    change with the redirect option.
+    
+    Additional information on the API change can be found at
+    
+    http://developer.overdrive.com/overdrive-api-notices/01-sep-2021-coming-soon-changes-to-overdrive-checkouts-api
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
+    Signed-off-by: Garry Collum <gcollum@gmail.com>
+
+6      2       Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI.pm
+31     3       Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI/OverDrive.pm
+4      1       Open-ILS/src/perlmods/lib/OpenILS/Utils/HTTPClient.pm
+8      1       Open-ILS/web/js/ui/default/opac/ebook_api/loggedin.js
+
+commit bb054da22808bce0cbfbf1628ef568d89dcf685e
+Author: Lynn Floyd <alynn2671@gmail.com>
+Date:   Mon Sep 6 12:13:13 2021 -0400
+
+    Adding videos from Conferences
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+3      0       docs/modules/circulation/pages/basic_holds.adoc
+8      0       docs/modules/reports/pages/introduction.adoc
+2      0       docs/modules/shared/pages/how_to_contribute_docs.adoc
+
+commit ad42342d11d69f152a55259d27068fea6790b493
+Author: gmontimantis <86423994+gmontimantis@users.noreply.github.com>
+Date:   Wed Feb 2 11:54:44 2022 -0500
+
+    Docs: Updating Opac Lists doc
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+-      -       docs/modules/opac/assets/images/lists_opac/add_to_basket.jpg
+-      -       docs/modules/opac/assets/images/lists_opac/add_to_list_basket.jpg
+-      -       docs/modules/opac/assets/images/lists_opac/basket_checkbox.jpg
+-      -       docs/modules/opac/assets/images/lists_opac/call_number.jpg
+-      -       docs/modules/opac/assets/images/lists_opac/home_list_link.jpg
+-      -       docs/modules/opac/assets/images/lists_opac/list_notes.jpg
+-      -       docs/modules/opac/assets/images/lists_opac/list_options.jpg
+-      -       docs/modules/opac/assets/images/lists_opac/list_preferences.jpg
+-      -       docs/modules/opac/assets/images/lists_opac/move_selected_to_list.jpg
+-      -       docs/modules/opac/assets/images/lists_opac/my_account_list_options.jpg
+-      -       docs/modules/opac/assets/images/lists_opac/search_results_list_button.jpg
+37     17      docs/modules/opac/pages/my_lists.adoc
+ create mode 100644 docs/modules/opac/assets/images/lists_opac/add_to_basket.jpg
+ create mode 100644 docs/modules/opac/assets/images/lists_opac/add_to_list_basket.jpg
+ create mode 100644 docs/modules/opac/assets/images/lists_opac/basket_checkbox.jpg
+ create mode 100644 docs/modules/opac/assets/images/lists_opac/call_number.jpg
+ create mode 100644 docs/modules/opac/assets/images/lists_opac/home_list_link.jpg
+ create mode 100644 docs/modules/opac/assets/images/lists_opac/list_notes.jpg
+ create mode 100644 docs/modules/opac/assets/images/lists_opac/list_options.jpg
+ create mode 100644 docs/modules/opac/assets/images/lists_opac/list_preferences.jpg
+ create mode 100644 docs/modules/opac/assets/images/lists_opac/move_selected_to_list.jpg
+ create mode 100644 docs/modules/opac/assets/images/lists_opac/my_account_list_options.jpg
+ create mode 100644 docs/modules/opac/assets/images/lists_opac/search_results_list_button.jpg
+
+commit e7b98ca69a9d58d47fc71ea13d14ef1478c5afb2
+Author: Jane Sandberg <sandbergja@gmail.com>
+Date:   Tue Jan 25 12:37:10 2022 -0800
+
+    LP1948035 (follow-up): don't use commonjs in spec tsconfig
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+0      1       Open-ILS/src/eg2/src/tsconfig.spec.json
+
+commit 9b7d6dd4f6305fce2111271fa4c7b525a2e02ccd
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Thu Oct 21 11:54:13 2021 -0400
+
+    LP1948035 Angular 12 updates
+    
+    Run ng upgrade from 10 -> 11 -> 12.
+    
+    Updates package.json deps for Angular 12.
+    
+    Removes deprecated angular/http dependency
+    
+    Fix a couple of cases where Promise<any> now requires resolve(something)
+    instead of resolve() (which would be Promise<void>).
+    
+    Fix some CSS syntax issues.
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+21     7       Open-ILS/src/eg2/angular.json
+7420   7304    Open-ILS/src/eg2/package-lock.json
+32     33      Open-ILS/src/eg2/package.json
+1      1       Open-ILS/src/eg2/src/app/core/db-store.service.ts
+3      2       Open-ILS/src/eg2/src/app/routing.module.ts
+2      2       Open-ILS/src/eg2/src/app/share/eg-help-popover/eg-help-popover.component.spec.ts
+1      1       Open-ILS/src/eg2/src/app/share/grid/grid.ts
+2      2       Open-ILS/src/eg2/src/app/share/util/bool.component.spec.ts
+1      1       Open-ILS/src/eg2/src/app/staff/acq/provider/provider-record.service.ts
+2      2       Open-ILS/src/eg2/src/app/staff/cat/vandelay/import.component.ts
+1      1       Open-ILS/src/eg2/src/app/staff/catalog/hold/hold.component.ts
+1      1       Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.ts
+4      4       Open-ILS/src/eg2/src/app/staff/share/marc-edit/fixed-field.component.css
+1      1       Open-ILS/src/eg2/src/polyfills.ts
+0      1       Open-ILS/src/eg2/tsconfig.json
+
+commit a46938ae4ef20bbff1ecc3e37cbaa27f2b5b0556
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Thu Oct 21 11:03:13 2021 -0400
+
+    LP1948035 Update Node/Angular Deps for Ang 12
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      1       Open-ILS/src/extras/Makefile.install
+1      1       Open-ILS/src/extras/install/Makefile.common
+
+commit 7ad46acdab58262ce6a92884740321f0751d0b34
+Author: Jane Sandberg <sandbergja@gmail.com>
+Date:   Tue Jan 25 09:50:47 2022 -0800
+
+    Docs: use asciidoc ordered list rather than adding numbers manually
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+23     38      docs/modules/cataloging/pages/overlay_record_3950_import.adoc
+
+commit 0e977d4a008e25e08921f99e8b326db6e204f70b
+Author: gmontimantis <86423994+gmontimantis@users.noreply.github.com>
+Date:   Wed Nov 10 14:37:40 2021 -0500
+
+    Docs: updating z39.50 overlay doc and images
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+-      -       docs/modules/cataloging/assets/images/overlay/mark_local_overlay.jpg
+-      -       docs/modules/cataloging/assets/images/overlay/overlay.jpg
+-      -       docs/modules/cataloging/assets/images/overlay/overlay_confirmation.jpg
+-      -       docs/modules/cataloging/assets/images/overlay/search.png
+-      -       docs/modules/cataloging/assets/images/overlay/view_marc.jpg
+14     19      docs/modules/cataloging/pages/overlay_record_3950_import.adoc
+ create mode 100644 docs/modules/cataloging/assets/images/overlay/mark_local_overlay.jpg
+ create mode 100644 docs/modules/cataloging/assets/images/overlay/overlay.jpg
+ create mode 100644 docs/modules/cataloging/assets/images/overlay/overlay_confirmation.jpg
+ create mode 100644 docs/modules/cataloging/assets/images/overlay/search.png
+ create mode 100644 docs/modules/cataloging/assets/images/overlay/view_marc.jpg
+
+commit be24afa2bf9ffb82d5e87c9ace333488cc83cf7f
+Author: gmontimantis <86423994+gmontimantis@users.noreply.github.com>
+Date:   Mon Jan 24 14:04:16 2022 -0500
+
+    Docs: Update barcode_completion_grid.jpg
+    
+    Updated barcode grid screenshot; other one was too blurry
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+-      -       docs/modules/admin/assets/images/barcode_completion/barcode_completion_grid.jpg
+
+commit 3a298713fd540778ed2c60fac7cd37b9558754e0
+Author: gmontimantis <86423994+gmontimantis@users.noreply.github.com>
+Date:   Fri Jul 30 10:15:46 2021 -0400
+
+    Docs: Update basic_holds.adoc
+    
+    removing Print full pull list alternative reference
+    
+    https://bugs.launchpad.net/evergreen/+bug/1775402
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+0      2       docs/modules/circulation/pages/basic_holds.adoc
+
+commit c9461cc516fbadaaa60fae285c4efa2489a9913e
+Author: gmontimantis <86423994+gmontimantis@users.noreply.github.com>
+Date:   Fri Jul 30 10:14:01 2021 -0400
+
+    Docs: Update basic_holds.adoc to include updated screenshot
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+-      -       docs/modules/circulation/assets/images/media/holds-managing-16.png
+-      -       docs/modules/circulation/assets/images/media/queue_positions.jpg
+2      2       docs/modules/circulation/pages/basic_holds.adoc
+ delete mode 100644 docs/modules/circulation/assets/images/media/holds-managing-16.png
+ create mode 100644 docs/modules/circulation/assets/images/media/queue_positions.jpg
+
+commit 6afec54da538a46b0bdd91942c421d60401f7938
+Author: Jane Sandberg <sandbergja@gmail.com>
+Date:   Fri Jan 14 15:58:02 2022 -0800
+
+    Docs: add a chapter about the course materials module
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      0       docs/antora.yml
+4      0       docs/modules/course_materials/_attributes.adoc
+3      0       docs/modules/course_materials/nav.adoc
+2      0       docs/modules/course_materials/pages/_attributes.adoc
+74     0       docs/modules/course_materials/pages/administration.adoc
+4      0       docs/modules/course_materials/pages/introduction.adoc
+66     0       docs/modules/course_materials/pages/materials.adoc
+ create mode 100644 docs/modules/course_materials/_attributes.adoc
+ create mode 100644 docs/modules/course_materials/nav.adoc
+ create mode 100644 docs/modules/course_materials/pages/_attributes.adoc
+ create mode 100644 docs/modules/course_materials/pages/administration.adoc
+ create mode 100644 docs/modules/course_materials/pages/introduction.adoc
+ create mode 100644 docs/modules/course_materials/pages/materials.adoc
+
+commit 9f6ddd07a8e8c39c85a58ae3f0a2e00fe0364047
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Wed Jan 12 07:17:19 2022 -0500
+
+    LP1903476 Followup; Remove perl action, limit to docs/
+    
+    Since the 'ubuntu-latest' image includes perl 5.30 the
+    actions-setup-perl step just adds more time to the process.
+    
+    GitHub Actions can be limited to (or exclude) paths so now
+    docs will only be built when pushes or PRs happen under docs/.
+    
+    Also added a couple name tags for the interface.
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+
+12     7       .github/workflows/docs.yml
+
+commit c9c1041c4d20dc8319c92ba461ac43543513e073
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date:   Wed Oct 27 10:16:30 2021 -0700
+
+    LP1903476: Use Github Actions to build antora documentation
+    
+    This allows documenters to submit a pull request and get a
+    preview version where they can view their changes.  The goal
+    is to provide quick feedback to documenters on whether their
+    changes build correctly and appear as desired, without them
+    having to have a full docs building setup locally.
+    
+    To test:
+    1. Use the Github Web site to fork the Evergreen repository.
+    2. Take the .github/workflows/docs.yml file from this commit.
+    Add it to any branch of your fork of the Evergreen repository.
+    3. Click on the Actions tab of your fork in the Github Web
+    site.
+    4. Click on the most recent run (at the top of the list).
+    5. When the build process is done (should take 3-4 minutes),
+    download and unzip the artifact that appears at the bottom of
+    the screen.  Open index.html in your browser.  Confirm that
+    the docs built properly.
+    6. On the same branch, make some changes to the documentation
+    in the docs/modules directory.
+    7. Repeat steps 3-5.  Confirm that your changes are reflected
+    in the new artifact.
+    
+    Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+
+18     0       .github/workflows/docs.yml
+ create mode 100644 .github/workflows/docs.yml
+
+commit e79df5dd87a895a61d15fdc569d904d2642091a8
+Author: Jane Sandberg <sandbergja@gmail.com>
+Date:   Tue Dec 14 13:02:15 2021 -0800
+
+    LP 1942645: stamp upgrade script
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+1      1       Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.update_course_module_term_constraints.sql => 1309.schema.update_course_module_term_constraints.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.update_course_module_term_constraints.sql => 1309.schema.update_course_module_term_constraints.sql} (74%)
+
+commit a11ce4760ec45d6d914980bf5604bd3d82cb370b
+Author: malexander <malexander@catalyte.io>
+Date:   Wed Dec 8 19:12:23 2021 +0000
+
+    lp-1942645 term name uniqueness
+    
+    dropped name uniqueness between orgs, added constraint to owning lib and name
+    
+    Includes syntax corrections from Martha Driscoll -- thank you, Martha!
+    
+    Signed-off-by: malexander <malexander@catalyte.io>
+    Signed-off-by: Beth Willis <willis@noblenet.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+3      2       Open-ILS/src/sql/Pg/040.schema.asset.sql
+11     0       Open-ILS/src/sql/Pg/upgrade/XXXX.schema.update_course_module_term_constraints.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.update_course_module_term_constraints.sql
+
+commit 5ac76ef7ebaecea134b34bfc6e33b004324c1474
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Mon Feb 10 11:09:37 2020 -0500
+
+    Lp 1862652: pingest.pl reingest record attributes fix
+    
+    Use the rdeleted parameter when reingesting record attributes in
+    pingest.pl support script so that passing argument values to the
+    --attr option makes sense.
+    
+    Prior to this patch, arguments of the --attr option would be ignored,
+    and all record attribute fields were reingested for all records,
+    deleted and not deleted alike.
+    
+    With this patch, the arguments of the --attr option are respected for
+    not deleted records.  Deleted records still have all attributes
+    reingested.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      1       Open-ILS/src/support-scripts/pingest.pl
+
+commit dd4931bca6b660227a1e540725ba60351cdbb0b4
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Thu Jul 8 10:19:43 2021 -0400
+
+    LP1933275 Staff catalog holdings view shows correct counts
+    
+    teaches the Holdings view to determine the number of copies and call
+    numbers attached to each org unit based on the full data set (via new
+    API) instead of copies in hand, since we may only have copies in hand
+    for a subset of child org units.
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+    Signed-off-by: Mary Llewellyn <mllewell@biblio.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+33     25      Open-ILS/src/eg2/src/app/staff/catalog/record/holdings.component.ts
+72     0       Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+
+commit b0a744e9695ce4d1f4982f0db7bdf365e6114755
+Author: Jane Sandberg <sandbergja@gmail.com>
+Date:   Wed Dec 1 16:08:52 2021 -0800
+
+    Docs: remove outdated screenshots
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+-      -       docs/modules/admin/assets/images/media/lsa-barcode_completion_admin.png
+-      -       docs/modules/admin/assets/images/media/lsa-barcode_completion_fields.png
+ delete mode 100644 docs/modules/admin/assets/images/media/lsa-barcode_completion_admin.png
+ delete mode 100644 docs/modules/admin/assets/images/media/lsa-barcode_completion_fields.png
+
+commit 5c3f61cf2c7290b600788ccac73cdadccd955268
+Author: gmontimantis <86423994+gmontimantis@users.noreply.github.com>
+Date:   Thu Nov 18 08:57:26 2021 -0500
+
+    Docs: update lsa-barcode-completion
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+-      -       docs/modules/admin/assets/images/barcode_completion/barcode_completion_grid.jpg
+-      -       docs/modules/admin/assets/images/barcode_completion/barcode_record_editor.jpg
+2      2       docs/modules/admin/pages/lsa-barcode_completion.adoc
+ create mode 100644 docs/modules/admin/assets/images/barcode_completion/barcode_completion_grid.jpg
+ create mode 100644 docs/modules/admin/assets/images/barcode_completion/barcode_record_editor.jpg
+
+commit ad168bc19daa925996377ba63262c98ea8be3146
+Author: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+Date:   Tue Nov 30 10:36:01 2021 -0500
+
+    Docs: correction to 3.7.2 release notes
+    
+    Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+
+1      1       docs/RELEASE_NOTES_3_7.adoc
+
+commit af939795b108ce0948c57f8f7431c8bffdd1fc21
+Author: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+Date:   Tue Nov 30 10:29:43 2021 -0500
+
+    Docs: correction to Override Action docs
+    
+    Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+
+1      1       docs/modules/circulation/pages/circulating_items_web_client.adoc
+
+commit 26dfb7c6ab66ff339d73dbfc7e4d059c5ce3558a
+Author: Shula Link <slink@gchrl.org>
+Date:   Fri May 14 14:14:15 2021 -0400
+
+    LP1772631 Untranslatable Strings
+    
+    Changes as suggested have been made in t_bills_historical.tt2, marking
+    appropriate lines for translation.
+    
+    Signed-off-by: Shula Link <slink@gchrl.org>
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+3      3       Open-ILS/src/templates/staff/share/print_templates/t_bills_historical.tt2
+
+commit 8a568b09f9af275127ef0b9e459e5ddb31c638e8
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Thu Nov 11 11:21:11 2021 -0500
+
+    LP#1949910: serialize deleting items from item bucket
+    
+    This patch serializes the fetching and fleshing of items to delete
+    when the delete-from-item-bucket action is invoked, thereby
+    avoiding possible drone starvation from open-ils.search. It
+    also throws up the progress dialog for good measure while
+    the deletion occurs.
+    
+    To test
+    -------
+    [1] Set up an item bucket with 25-50 items.
+    [2] From the item bucket intervace, invoke the action to delete
+        all of the items.
+    [3] Note that the open-ils.search.asset.copy.fleshed2.retrieve calls,
+        one for each item, are all made simultaneously. Assuming stock
+        max_children settings, this will cause open-ils.search to log
+        that some requests are hitting the backlog.
+    [4] Apply the patch and refresh the item bucket page, then repeat
+        step 2 (it doesn't matter for this purpose that the items have
+        already been deleted). This time, the open-ils.search API calls
+        are made serially and a progress bar is displayed while the
+        deletion takes place. Verify that no requests hit the backlog.
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+12     8       Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js
+
+commit 0cb608626604be0349856f2025af47b2b43d4bda
+Author: gmontimantis <86423994+gmontimantis@users.noreply.github.com>
+Date:   Wed Nov 17 13:40:16 2021 -0500
+
+    docs: updating batch_importing_MARC.adoc
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+-      -       docs/modules/cataloging/assets/images/batch_importing_MARC/import_item_attribute_def.jpg
+-      -       docs/modules/cataloging/assets/images/batch_importing_MARC/import_record.jpg
+-      -       docs/modules/cataloging/assets/images/batch_importing_MARC/marc_tag_and_subfield.jpg
+-      -       docs/modules/cataloging/assets/images/batch_importing_MARC/match_set_quality.jpg
+-      -       docs/modules/cataloging/assets/images/batch_importing_MARC/new_record_match.jpg
+-      -       docs/modules/cataloging/assets/images/batch_importing_MARC/operator.jpg
+-      -       docs/modules/cataloging/assets/images/batch_importing_MARC/record_attribute.jpg
+-      -       docs/modules/cataloging/assets/images/batch_importing_MARC/replace_node.jpg
+58     64      docs/modules/cataloging/pages/batch_importing_MARC.adoc
+ create mode 100644 docs/modules/cataloging/assets/images/batch_importing_MARC/import_item_attribute_def.jpg
+ create mode 100644 docs/modules/cataloging/assets/images/batch_importing_MARC/import_record.jpg
+ create mode 100644 docs/modules/cataloging/assets/images/batch_importing_MARC/marc_tag_and_subfield.jpg
+ create mode 100644 docs/modules/cataloging/assets/images/batch_importing_MARC/match_set_quality.jpg
+ create mode 100644 docs/modules/cataloging/assets/images/batch_importing_MARC/new_record_match.jpg
+ create mode 100644 docs/modules/cataloging/assets/images/batch_importing_MARC/operator.jpg
+ create mode 100644 docs/modules/cataloging/assets/images/batch_importing_MARC/record_attribute.jpg
+ create mode 100644 docs/modules/cataloging/assets/images/batch_importing_MARC/replace_node.jpg
+
+commit 8046fb432226afd3bde45f47eb1be523e79565e6
+Author: Kyle Huckins <khuckins@catalyte.io>
+Date:   Wed Jul 31 16:42:35 2019 +0000
+
+    Docs: lp1739277 Release Notes for Org Selector Styling
+    
+    - Add release notes for new Org Selector Styling functionality.
+    
+    Signed-off-by: Kyle Huckins <khuckins@catalyte.io>
+    
+     Changes to be committed:
+            new file:   docs/RELEASE_NOTES_NEXT/Client/org-select-styling.adoc
+    
+    Signed-off-by: Jennifer Bruch <jbruch@sparkpa.org>
+    Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+4      0       docs/RELEASE_NOTES_NEXT/Client/org-select-styling.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/org-select-styling.adoc
+
+commit 625c862c27777451517a256e78aa8c304a0ec283
+Author: Kyle Huckins <khuckins@catalyte.io>
+Date:   Tue Jul 30 19:00:14 2019 +0000
+
+    lp1739277 OrgSelect Class Callback Holdings Implementation
+    
+    - Implement OrgSelectClassCallback in Angular Catalog Holdings UI
+    
+    Signed-off-by: Kyle Huckins <khuckins@catalyte.io>
+    
+     Changes to be committed:
+            modified:   Open-ILS/src/eg2/src/app/staff/catalog/record/holdings.component.html
+            modified:   Open-ILS/src/eg2/src/app/staff/catalog/record/holdings.component.ts
+    
+    Signed-off-by: Jennifer Bruch <jbruch@sparkpa.org>
+    Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+4      2       Open-ILS/src/eg2/src/app/staff/catalog/record/holdings.component.html
+21     0       Open-ILS/src/eg2/src/app/staff/catalog/record/holdings.component.ts
+
+commit d51454b497e1d7ea01ebeac533259820f4a6786e
+Author: Bill Erickson <berickxx@gmail.com>
+Date:   Tue Jul 30 12:12:12 2019 -0400
+
+    LP1739277 Angular org selector style callback
+    
+    Allow the caller of an <eg-org-select> to pass a function which is
+    called against each org unit in the list to determine what CSS class(es)
+    should be applied to the org unit label in the list.
+    
+    Includes sandbox example.
+    
+    Signed-off-by: Bill Erickson <berickxx@gmail.com>
+    Signed-off-by: Jennifer Bruch <jbruch@sparkpa.org>
+    Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+1      1       Open-ILS/src/eg2/src/app/share/org-select/org-select.component.html
+8      1       Open-ILS/src/eg2/src/app/share/org-select/org-select.component.ts
+6      0       Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.html
+6      1       Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.ts
+
+commit 654b02f1e9c1ee6f14a5d43233ef675b5684f1be
+Author: Jane Sandberg <sandbergja@gmail.com>
+Date:   Wed Nov 17 11:53:52 2021 -0800
+
+    lp1855780 stamp upgrade script
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+1      1       Open-ILS/src/sql/Pg/upgrade/{XXXX.data.trigger_ui_grid_settings.sql => 1308.data.trigger_ui_grid_settings.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.data.trigger_ui_grid_settings.sql => 1308.data.trigger_ui_grid_settings.sql} (92%)
+
+commit 9d73f5191d6d9daee36580cee8e60eab48633518
+Author: Jane Sandberg <sandbergja@gmail.com>
+Date:   Wed Nov 17 11:39:04 2021 -0800
+
+    lp1855780 preload values for comboboxes in angular event definition editor
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      0       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers.component.html
+
+commit 1eeb05186388debf6a46495107a3a6938dd22b0c
+Author: Jane Sandberg <sandbergja@gmail.com>
+Date:   Wed Nov 17 11:22:16 2021 -0800
+
+    lp1855780 remove unnecessary whitespace
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+11     11      Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.html
+16     16      Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers.component.html
+
+commit 24e1f36cca7c6861fa46d799c1097819d2e5277a
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Tue Nov 9 10:53:58 2021 -0500
+
+    LP#1855780: add release notes entry
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+2      0       docs/RELEASE_NOTES_NEXT/miscellaneous.adoc
+
+commit 3ac25b250a0deadb1142f22d5cf843b483310a2b
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Tue Nov 9 10:51:27 2021 -0500
+
+    LP#1855780: add grid config settings
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+2      1       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.html
+1      1       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers.component.html
+24     0       Open-ILS/src/sql/Pg/950.data.seed-values.sql
+29     0       Open-ILS/src/sql/Pg/upgrade/XXXX.data.trigger_ui_grid_settings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.trigger_ui_grid_settings.sql
+
+commit 2600680797b7943ba28f474779eb2fcac1fff30f
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Tue Nov 9 10:41:58 2021 -0500
+
+    LP#1855780: improve reporting of event test errors
+    
+    - make error title/caption strings available to i18n
+    - catch and report on exceptions, not just ILS events
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+5      0       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.html
+8      1       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.ts
+
+commit de6feb37440ece9344405975d4f655a967dd1b76
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Tue Nov 9 10:24:04 2021 -0500
+
+    LP#1855780: adjustments to cloning
+    
+    - set the owning OU to null in the clone
+    - reduce console noise when cloning environment entries
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      0       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers.component.html
+4      4       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers.component.ts
+
+commit 037ced54ca9714dcfb7abae0ed93e4c5068d113b
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Mon Nov 8 15:58:04 2021 -0500
+
+    LP#1855780: tweaks to grids
+    
+    - make main A/T event definition grid header sticky
+    - do not display environment ID and parameter ID
+      columns by default in the event definition
+      editor
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+2      2       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.html
+1      1       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers.component.html
+
+commit ba8365e9732279c435a2b539e4acc12759665be6
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Mon Nov 8 12:28:19 2021 -0500
+
+    LP#1855780: add option to include environment in clone of an event
+    
+    This recovers a patch from Mike Risher that got dropped
+    when attempting to get a clean rebase from a branch merge.
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+7      2       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers.component.html
+47     5       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers.component.ts
+
+commit f7e96d742e64d89e7aaa71d83c79beaf65bf3b77
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Mon Nov 8 12:00:42 2021 -0500
+
+    LP#1855780: avoid race condition when deleting env or params
+    
+    When deleting from a grid using pcrud.autoApply, the grid
+    should be refreshed only at the very end. Otherwise, even if you're
+    deleting only one row, the grid reload could occur before the
+    deletion is committed, yielding a grid fetch error when
+    pcrud complains about verifying access to a row that is
+    no longer in the database.
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+7      1       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.ts
+
+commit 1ba9de787b7721a4c219ee76182af7a5b7673392
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Mon Nov 8 11:51:15 2021 -0500
+
+    LP#1855780: updates to IDL
+    
+    - mark various action/trigger record fields as required
+      for the sake of the Angular record editor
+    - make atcol retrievable via pcrud
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+18     13      Open-ILS/examples/fm_IDL.xml
+
+commit 248d5f603c0cb88845283dafa7f6251a55b62e93
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Mon Nov 8 11:26:47 2021 -0500
+
+    LP#1855780: fix lint
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      1       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.ts
+
+commit fa802945b2badbde7c822f60be710b7476d9cb28
+Author: Rogan Hamby <rogan.hamby@gmail.com>
+Date:   Fri Sep 24 19:21:47 2021 +0000
+
+    LP#1855780: adding the go-back button from Mike Risher's code
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+7      1       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.html
+6      1       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.ts
+
+commit da3fff6cf5f075ab02ea991ebe38f8600f848b7e
+Author: Mike Risher <mrisher@catalyte.io>
+Date:   Thu Dec 19 17:56:41 2019 +0000
+
+    LP#1855780 Angular Notification/Action Triggers port
+    
+    Port Notification Action Triggers from DOJO to Angular.  This consists of 4 grids, each
+    navigated to by its corresponding tab. The Trigger Event Definitions grid allows
+    cloning of records.  When editing an event defintion one can also edit parameters,
+    environments, and run tests.
+    
+    Signed-off-by: Mike Risher <mrisher@catalyte.io>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+1      1       Open-ILS/src/eg2/src/app/staff/admin/local/admin-local-splash.component.html
+4      0       Open-ILS/src/eg2/src/app/staff/admin/local/routing.module.ts
+91     0       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.html
+199    0       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.ts
+123    0       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers.component.html
+251    0       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers.component.ts
+23     0       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers.module.ts
+20     0       Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers_routing.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/local/triggers/trigger-edit.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers.module.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/admin/local/triggers/triggers_routing.module.ts
+
+commit f4e4bdb702d369d3117042180598c7f8625e0369
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Mon Nov 15 17:50:25 2021 -0500
+
+    LP1951030: Remove OpenILS/Utils/ISBN from Manifest
+    
+    Remove a remnant of the OpenILS::Utils::ISBN module that was removed
+    in the branch for Launchpad bug 1856906.
+    
+    To test this fix, run make check in Open-ILS/src/perlmods on a test
+    system to run the tests.  Before this patch, you get the following
+    message:
+    
+    WARNING: the following files are missing in your kit:
+            lib/OpenILS/Utils/ISBN.pm
+    Please inform the author.
+    
+    After applying this patch, the message goes away.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+0      1       Open-ILS/src/perlmods/MANIFEST
+
+commit 9d72b7184f6e706d1bcbd352d3cc8f8f73d4700b
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Fri Nov 12 15:38:17 2021 -0500
+
+    LP1856906: (follow-up) fix unit test count
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1      1       Open-ILS/src/perlmods/t/14-OpenILS-Utils.t
+
+commit a3a23273e94137dbac1780a769819f236da3c9d7
+Author: Jennifer Pringle <jennifer.pringle@bc.libraries.coop>
+Date:   Thu Oct 7 11:46:13 2021 -0700
+
+    Docs: Adding latency test and disable sounds to workstation admin.
+    
+    Signed-off-by: Jennifer Pringle <jennifer.pringle@bc.libraries.coop>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+-      -       docs/modules/admin/assets/images/workstation/latency-test.png
+34     0       docs/modules/admin/pages/latency.adoc
+1      0       docs/modules/admin/pages/workstation_admin.adoc
+ create mode 100644 docs/modules/admin/assets/images/workstation/latency-test.png
+ create mode 100644 docs/modules/admin/pages/latency.adoc
+
+commit 7c0a57c249aeeb8310824d3a9aa9813fa23bee10
+Author: Lynn Floyd <alynn2671@gmail.com>
+Date:   Fri Jun 4 15:41:31 2021 -0400
+
+    Docs: Transit List
+    
+    Documentation on Transit List.
+    
+    Signed-off-by: Lynn Floyd <alynn2671@gmail.com>
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+-      -       docs/modules/local_admin/assets/images/transit_list/transit_list_from.png
+-      -       docs/modules/local_admin/assets/images/transit_list/transit_list_to.png
+1      0       docs/modules/local_admin/nav.adoc
+35     0       docs/modules/local_admin/pages/transit_list.adoc
+ create mode 100644 docs/modules/local_admin/assets/images/transit_list/transit_list_from.png
+ create mode 100644 docs/modules/local_admin/assets/images/transit_list/transit_list_to.png
+ create mode 100644 docs/modules/local_admin/pages/transit_list.adoc
+
+commit 016c8d81f31189d2b5c11c08cf0dff0f5b715ea9
+Author: gmontimantis <86423994+gmontimantis@users.noreply.github.com>
+Date:   Mon Jun 28 12:22:57 2021 -0400
+
+    Docs: Update receipt_template_editor.adoc
+    
+    Fixes https://bugs.launchpad.net/evergreen/+bug/1929592
+    
+    Signed-off-by: Jane Sandberg <sandbergja@gmail.com>
+
+3      1       docs/modules/admin/pages/receipt_template_editor.adoc
+
+commit 66f457a9c30298bb8935a9dfdbef14a4df8fbb9e
+Author: Terran McCanna <tmccanna@georgialibraries.org>
+Date:   Tue Sep 21 16:48:50 2021 -0400
+
+    LP1766726 Clarify Field Hints on Print Templates
+    
+    Adds 'patron.' to beginning of patron field hints in Checkout and Items Out
+    templates to make it easier for users to understand.
+    
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Jennifer Weston <jennifer.weston@equinoxOLI.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+19     19      Open-ILS/src/templates/staff/share/print_templates/t_checkout.tt2
+14     14      Open-ILS/src/templates/staff/share/print_templates/t_items_out.tt2
+
+commit 5307b2b7d1e10381e4a7ccf93657f709d7954cfe
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Thu Nov 11 10:16:19 2021 -0500
+
+    LP#1528301: minor tweaks to release notes
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+8      4       docs/RELEASE_NOTES_NEXT/SIP/checkin-hold-phone.adoc
+
+commit 1121842858acbe01a374b4c0573a07b413212df9
+Author: Jason Boyer <jboyer@equinoxinitiative.org>
+Date:   Fri Sep 6 14:22:30 2019 -0400
+
+    LP1528301: Release Note for Phone in Checkin Response
+    
+    Have to tell people about it if they're going to use it.
+    
+    Signed-off-by: Jason Boyer <jboyer@equinoxinitiative.org>
+    Signed-off-by: Martha Driscoll <driscoll@noblenet.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+11     0       docs/RELEASE_NOTES_NEXT/SIP/checkin-hold-phone.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/SIP/checkin-hold-phone.adoc
+
+commit d26078c20109c738ebfe3af2c7210a16757f3c94
+Author: Jason Boyer <jboyer@equinoxinitiative.org>
+Date:   Fri Sep 6 14:10:45 2019 -0400
+
+    LP1528301: Hold Notify Phone in Checkin Response
+    
+    Adds a setting to oils_sip.xml.sample to en/dis-able
+    the extention of including the hold notify phone number
+    for captured holds in the SIP Checkin Response.
+    Defaults to false.
+    
+    Signed-off-by: Jason Boyer <jboyer@equinoxinitiative.org>
+    Signed-off-by: Martha Driscoll <driscoll@noblenet.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+8      0       Open-ILS/examples/oils_sip.xml.example
+
+commit d3a3e8f1eb15805fc258f3330aa1a740ce100036
+Author: blake <blake@mobiusconsortium.org>
+Date:   Thu Jun 9 09:04:56 2016 -0500
+
+    LP1528301 Add SIP Support for BF field on type 10 checkin responses
+    
+    This little patch will append the BF field in the SIP response during
+    checkin when the item is for another hold. Some self check software vendors
+    (ahem Bibliotheca) implement the hold phone number for the next patron this way.
+    You will need this patch as well as the code change to the SIPServer repo
+    LP1528301_Add_SIP_Support_for_BF_field_on_type_10_checkin_responses
+    
+    Signed-off-by: blake <blake@mobiusconsortium.org>
+    Signed-off-by: Martha Driscoll <driscoll@noblenet.org>
+    Signed-off-by: Jason Boyer <jboyer@equinoxinitiative.org>
+    Signed-off-by: Martha Driscoll <driscoll@noblenet.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+2      0       Open-ILS/src/perlmods/lib/OpenILS/SIP/Item.pm
+2      1       Open-ILS/src/perlmods/lib/OpenILS/SIP/Transaction/Checkin.pm
+
+commit 09a3f03bb6296356db5834fc56a93ddb9e6260a2
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date:   Thu Jul 15 13:58:43 2021 -0700
+
+    LP1856906: remove unused OpenILS::Utils::ISBN perl module
+    
+    Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+    Signed-off-by: blake <blake@mobiusconsortium.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+0      96      Open-ILS/src/perlmods/lib/OpenILS/Utils/ISBN.pm
+0      1       Open-ILS/src/perlmods/t/14-OpenILS-Utils.t
+9      0       docs/RELEASE_NOTES_NEXT/API/remove_utils_isbn.adoc
+ delete mode 100644 Open-ILS/src/perlmods/lib/OpenILS/Utils/ISBN.pm
+ create mode 100644 docs/RELEASE_NOTES_NEXT/API/remove_utils_isbn.adoc
+
+commit 90e34e77b780424750404fabf13ec069498dd4fb
+Author: Mike Risher <mrisher@catalyte.io>
+Date:   Wed May 20 23:27:20 2020 +0000
+
+    LP#1819233 improve AngularJS eg-basic-combo-box filtering
+    
+    Adjust the eg-basic-combo-box so that it doesn’t give console errors
+    when typing characters such as [. Fix the bug that causes it to
+    sometimes show no results when there are valid results that match.
+    
+    To test
+    -------
+    [1] Apply the patch, then create a new report template, add a
+        display field, then open the Change Transform modal.
+    [2] Verify that the selection box will accept characters like '['
+        as input without browser console noise, that the filtering
+        is case-insensitive, and that filtering continues to work
+        after clicking on the selector.
+    [3] Instances of this combo box can also be found in the AngularJS
+        volume/copy editor.
+    
+    Signed-off-by: Mike Risher <mrisher@catalyte.io>
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+13     3       Open-ILS/web/js/ui/default/staff/services/ui.js
+
+commit 96866a62d9cf555336b8622983173d94e069a452
+Author: Steven Callender <stevecallender@esilibrary.com>
+Date:   Fri Dec 4 09:59:25 2020 -0500
+
+    LP1906842 PLACE_UNFILLABLE_HOLD permission not working if no titles exist
+    
+    This fix will correct an issue where the screen just keeps looping to
+    the override screen when trying to place a hold that has no titles
+    available for it.
+    
+    Patch courtesy of Mike Rylander.
+    
+    Signed-off-by: Steven Callender <stevecallender@esilibrary.com>
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1      1       Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+
+commit 4e2d6a2011a90b545062f2de53289f475c5fffa0
+Author: Angela Kilsdonk <akilsdonk@equinoxinitiative.org>
+Date:   Mon Oct 18 09:38:28 2021 -0400
+
+    docs: 3.8 Triggered Events Log Rewrite
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk@equinoxinitiative.org>
+    Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+-      -       docs/modules/circulation/assets/images/media/item_tel_display.png
+-      -       docs/modules/circulation/assets/images/media/item_tel_location.png
+-      -       docs/modules/circulation/assets/images/media/patron_tel_display.png
+-      -       docs/modules/circulation/assets/images/media/patron_tel_location.png
+-      -       docs/modules/circulation/assets/images/media/patron_tel_tabs.png
+162    65      docs/modules/circulation/pages/triggered_events.adoc
+ create mode 100644 docs/modules/circulation/assets/images/media/item_tel_display.png
+ create mode 100644 docs/modules/circulation/assets/images/media/item_tel_location.png
+ create mode 100644 docs/modules/circulation/assets/images/media/patron_tel_display.png
+ create mode 100644 docs/modules/circulation/assets/images/media/patron_tel_location.png
+ create mode 100644 docs/modules/circulation/assets/images/media/patron_tel_tabs.png
+
+commit ab941171f73be11da12adbe3d52d1401facf81f3
+Author: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+Date:   Mon Oct 18 09:35:33 2021 -0400
+
+    docs: 3.8 hold copy ratio reports
+    
+    Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+3      10      docs/modules/reports/pages/report_sources.adoc
+
+commit 983b436d0fd1a25a2f907701fb72724a0b20dfc0
+Author: Angela Kilsdonk <akilsdonk@equinoxinitiative.org>
+Date:   Mon Oct 18 09:32:24 2021 -0400
+
+    docs: 3.8 Acq Admin
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk@equinoxinitiative.org>
+    Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+-      -       docs/modules/admin/assets/images/media/acq_fy_closeout.png
+-      -       docs/modules/admin/assets/images/media/allocate_credit_ang.png
+-      -       docs/modules/admin/assets/images/media/allocate_credit_funds_ang.png
+-      -       docs/modules/admin/assets/images/media/allocate_to_fund_ang.png
+-      -       docs/modules/admin/assets/images/media/claiming1.PNG
+-      -       docs/modules/admin/assets/images/media/currency1.PNG
+-      -       docs/modules/admin/assets/images/media/currency2.PNG
+-      -       docs/modules/admin/assets/images/media/currency3.PNG
+-      -       docs/modules/admin/assets/images/media/distformula1.PNG
+-      -       docs/modules/admin/assets/images/media/edi_attribute_sets_ang.png
+-      -       docs/modules/admin/assets/images/media/fund_tags_ang_1.png
+-      -       docs/modules/admin/assets/images/media/fund_tags_ang_2.png
+-      -       docs/modules/admin/assets/images/media/funds1.PNG
+-      -       docs/modules/admin/assets/images/media/funds2.PNG
+-      -       docs/modules/admin/assets/images/media/funds3.PNG
+-      -       docs/modules/admin/assets/images/media/library_san_angular.png
+-      -       docs/modules/admin/assets/images/media/new_edi_account_ang.png
+-      -       docs/modules/admin/assets/images/media/new_edi_account_ang_2.png
+-      -       docs/modules/admin/assets/images/media/propagate_rollover_ang.png
+-      -       docs/modules/admin/assets/images/media/provider_san_ang_1.png
+-      -       docs/modules/admin/assets/images/media/provider_san_ang_2.png
+-      -       docs/modules/admin/assets/images/media/transfer_funds_ang.png
+-      -       docs/modules/admin/assets/images/media/view_allocations_ang.png
+-      -       docs/modules/admin/assets/images/media/view_credits_ang.png
+443    529     docs/modules/admin/pages/acquisitions_admin.adoc
+7      110     docs/modules/admin_initial_setup/pages/ordering_materials.adoc
+5      48      docs/modules/installation/pages/edi_setup.adoc
+ create mode 100644 docs/modules/admin/assets/images/media/acq_fy_closeout.png
+ create mode 100644 docs/modules/admin/assets/images/media/allocate_credit_ang.png
+ create mode 100644 docs/modules/admin/assets/images/media/allocate_credit_funds_ang.png
+ create mode 100644 docs/modules/admin/assets/images/media/allocate_to_fund_ang.png
+ create mode 100644 docs/modules/admin/assets/images/media/claiming1.PNG
+ create mode 100644 docs/modules/admin/assets/images/media/currency1.PNG
+ create mode 100644 docs/modules/admin/assets/images/media/currency2.PNG
+ create mode 100644 docs/modules/admin/assets/images/media/currency3.PNG
+ create mode 100644 docs/modules/admin/assets/images/media/distformula1.PNG
+ create mode 100644 docs/modules/admin/assets/images/media/edi_attribute_sets_ang.png
+ create mode 100644 docs/modules/admin/assets/images/media/fund_tags_ang_1.png
+ create mode 100644 docs/modules/admin/assets/images/media/fund_tags_ang_2.png
+ create mode 100644 docs/modules/admin/assets/images/media/funds1.PNG
+ create mode 100644 docs/modules/admin/assets/images/media/funds2.PNG
+ create mode 100644 docs/modules/admin/assets/images/media/funds3.PNG
+ create mode 100644 docs/modules/admin/assets/images/media/library_san_angular.png
+ create mode 100644 docs/modules/admin/assets/images/media/new_edi_account_ang.png
+ create mode 100644 docs/modules/admin/assets/images/media/new_edi_account_ang_2.png
+ create mode 100644 docs/modules/admin/assets/images/media/propagate_rollover_ang.png
+ create mode 100644 docs/modules/admin/assets/images/media/provider_san_ang_1.png
+ create mode 100644 docs/modules/admin/assets/images/media/provider_san_ang_2.png
+ create mode 100644 docs/modules/admin/assets/images/media/transfer_funds_ang.png
+ create mode 100644 docs/modules/admin/assets/images/media/view_allocations_ang.png
+ create mode 100644 docs/modules/admin/assets/images/media/view_credits_ang.png
+
+commit c03dd3311ba53210c72922fd7961315b56d684b6
+Author: Angela Kilsdonk <akilsdonk@equinoxinitiative.org>
+Date:   Mon Oct 18 09:25:51 2021 -0400
+
+    docs: 3.8 Patron Photo URL + Consolidate Patron Notes
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk@equinoxinitiative.org>
+    Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+-      -       docs/modules/circulation/assets/images/media/actions_menu.png
+-      -       docs/modules/circulation/assets/images/media/alert_note.png
+-      -       docs/modules/circulation/assets/images/media/block.png
+-      -       docs/modules/circulation/assets/images/media/myaccount_boopac.png
+-      -       docs/modules/circulation/assets/images/media/note_modal.png
+-      -       docs/modules/circulation/assets/images/media/notes_counter.png
+-      -       docs/modules/circulation/assets/images/media/notes_tab_full.png
+-      -       docs/modules/circulation/assets/images/media/patron_photo_sidebar.png
+-      -       docs/modules/circulation/assets/images/media/patron_photo_url.png
+-      -       docs/modules/circulation/assets/images/media/stopsign_alert.png
+-      -       docs/modules/circulation/assets/images/media/stopsign_block.png
+130    113     docs/modules/circulation/pages/circulation_patron_records_web_client.adoc
+ create mode 100644 docs/modules/circulation/assets/images/media/actions_menu.png
+ create mode 100644 docs/modules/circulation/assets/images/media/alert_note.png
+ create mode 100644 docs/modules/circulation/assets/images/media/block.png
+ create mode 100644 docs/modules/circulation/assets/images/media/myaccount_boopac.png
+ create mode 100644 docs/modules/circulation/assets/images/media/note_modal.png
+ create mode 100644 docs/modules/circulation/assets/images/media/notes_counter.png
+ create mode 100644 docs/modules/circulation/assets/images/media/notes_tab_full.png
+ create mode 100644 docs/modules/circulation/assets/images/media/patron_photo_sidebar.png
+ create mode 100644 docs/modules/circulation/assets/images/media/patron_photo_url.png
+ create mode 100644 docs/modules/circulation/assets/images/media/stopsign_alert.png
+ create mode 100644 docs/modules/circulation/assets/images/media/stopsign_block.png
+
+commit 77afc459cae9502fc6a59c19eb627086652e5eea
+Author: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+Date:   Mon Oct 18 09:19:53 2021 -0400
+
+    docs: 3.8 selected new Library Settings
+    
+    Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+5      0       docs/modules/admin/pages/librarysettings.adoc
+
+commit e6b6c123c3e4bbe0f1ab85544d6ee3fed1ff9442
+Author: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+Date:   Mon Oct 18 09:16:12 2021 -0400
+
+    docs: 3.8 Override Actions
+    
+    Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+-      -       docs/modules/circulation/assets/images/media/new_override_modal.png
+41     0       docs/modules/circulation/pages/circulating_items_web_client.adoc
+ create mode 100644 docs/modules/circulation/assets/images/media/new_override_modal.png
+
+commit ebad99aa0b774fca65e35547d775cdcc1832c587
+Author: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+Date:   Mon Oct 18 09:13:36 2021 -0400
+
+    docs: 3.8 Stripe Payment Intents
+    
+    Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+25     2       docs/modules/admin/pages/accepting_credit_card_payments.adoc
+-      -       docs/modules/opac/assets/images/media/opac_cc_config_error.png
+-      -       docs/modules/opac/assets/images/media/opac_cc_declined.png
+-      -       docs/modules/opac/assets/images/media/opac_cc_entry.png
+-      -       docs/modules/opac/assets/images/media/opac_cc_inprocess.png
+-      -       docs/modules/opac/assets/images/media/opac_cc_receipt.png
+-      -       docs/modules/opac/assets/images/media/opac_current_charges.png
+-      -       docs/modules/opac/assets/images/media/opac_select_charges.png
+43     0       docs/modules/opac/pages/my_account.adoc
+ create mode 100644 docs/modules/opac/assets/images/media/opac_cc_config_error.png
+ create mode 100644 docs/modules/opac/assets/images/media/opac_cc_declined.png
+ create mode 100644 docs/modules/opac/assets/images/media/opac_cc_entry.png
+ create mode 100644 docs/modules/opac/assets/images/media/opac_cc_inprocess.png
+ create mode 100644 docs/modules/opac/assets/images/media/opac_cc_receipt.png
+ create mode 100644 docs/modules/opac/assets/images/media/opac_current_charges.png
+ create mode 100644 docs/modules/opac/assets/images/media/opac_select_charges.png
+
+commit a8681139ec54ad985f80903e3071fd45fbca8949
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Fri Nov 5 18:30:53 2021 -0400
+
+    LP#1831803: stamp schema update
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1      1       Open-ILS/src/sql/Pg/002.schema.config.sql
+1      1       Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.staged_search_cleanup.sql => 1307.schema.staged_search_cleanup.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.staged_search_cleanup.sql => 1307.schema.staged_search_cleanup.sql} (84%)
+
+commit 065e24b98c32c03ccb8892819528f8a6a6492244
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Fri Nov 5 18:27:03 2021 -0400
+
+    LP#1831803: (follow-up) update release notes formatting
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+2      2       docs/RELEASE_NOTES_NEXT/Administration/staged_search_cleanup.adoc
+
+commit 8c9114839185e30c4ea139fae05b6f22efa00a3c
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Fri Nov 5 18:25:41 2021 -0400
+
+    LP#1831803: drop the disused search-related types during upgrade
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+3      0       Open-ILS/src/sql/Pg/upgrade/XXXX.schema.staged_search_cleanup.sql
+
+commit ab080c44847986358ad6b41a09c446fdf442096e
+Author: Jason Boyer <JBoyer@equinoxOLI.org>
+Date:   Fri Sep 24 09:12:20 2021 -0400
+
+    LP1831803: Remove unused data types
+    
+    The search.search_args and search.search_result types appear to have only
+    been used in combination with search.query_parser_qts, so they can also
+    be retired.
+    
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+0      4       Open-ILS/src/sql/Pg/300.schema.staged_search.sql
+
+commit 33ea045b7e2dc8dbf8ccb5f47423a6eafd325f12
+Author: Jeff Davis <jeff.davis@bc.libraries.coop>
+Date:   Fri Oct 18 12:44:52 2019 -0700
+
+    LP#1831803: release note for removing old staged search stuff from db
+    
+    Signed-off-by: Jeff Davis <jeff.davis@bc.libraries.coop>
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+6      0       docs/RELEASE_NOTES_NEXT/Administration/staged_search_cleanup.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/staged_search_cleanup.adoc
+
+commit b82206dd6e8914bdc190495dd4181d1c76330d6b
+Author: Jeff Davis <jeff.davis@bc.libraries.coop>
+Date:   Fri Oct 18 12:26:03 2019 -0700
+
+    LP#1831803: remove asset.refresh_opac_visible_copies_mat_view if it exists too
+    
+    Signed-off-by: Jeff Davis <jeff.davis@bc.libraries.coop>
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+2      0       Open-ILS/src/sql/Pg/upgrade/XXXX.schema.staged_search_cleanup.sql
+
+commit 1a824a37535f9698e72440083a2f2f44f533eaec
+Author: Jeff Davis <jeff.davis@bc.libraries.coop>
+Date:   Wed Jun 5 14:30:11 2019 -0700
+
+    LP#1831803: remove obsolete asset.opac_visible_copies and search.query_parser_fts from database
+    
+    Signed-off-by: Jeff Davis <jeff.davis@bc.libraries.coop>
+    Signed-off-by: Jason Boyer <JBoyer@equinoxOLI.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+0      19      Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
+0      15      Open-ILS/src/sql/Pg/040.schema.asset.sql
+1      373     Open-ILS/src/sql/Pg/300.schema.staged_search.sql
+22     0       Open-ILS/src/sql/Pg/upgrade/XXXX.schema.staged_search_cleanup.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.staged_search_cleanup.sql
+
+commit dfa2eccfbd130e27b9656df59718fb762e8c56ab
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Fri Nov 5 18:19:55 2021 -0400
+
+    LP#1830387: add release notes entry
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+2      0       docs/RELEASE_NOTES_NEXT/miscellaneous.adoc
+
+commit ddc6710e27439e42e36df4f6bf26cba26b1d4543
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Fri Nov 5 18:18:59 2021 -0400
+
+    LP#1830387: (follow-up) normalize whitespace
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1      1       Open-ILS/web/js/ui/default/staff/circ/patron/checkout.js
+1      1       Open-ILS/web/js/ui/default/staff/circ/patron/items_out.js
+
+commit cb54628520a3edbd6aef18beccfaa43010f80516
+Author: Terran McCanna <tmccanna@georgialibraries.org>
+Date:   Tue Sep 21 16:18:51 2021 -0400
+
+    LP1830387 Add access to juvenile flag in print templates
+    
+    Adds juvenile t/f flag to print templates for checkout and
+    items out.
+    
+    Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+    Signed-off-by: Jennifer Weston <jennifer.weston@equinoxOLI.org>
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1      0       Open-ILS/src/templates/staff/share/print_templates/t_checkout.tt2
+1      0       Open-ILS/src/templates/staff/share/print_templates/t_items_out.tt2
+2      1       Open-ILS/web/js/ui/default/staff/circ/patron/checkout.js
+2      1       Open-ILS/web/js/ui/default/staff/circ/patron/items_out.js
+
+commit 2a51ce6c218b4421d46ad7419640e86649b6033b
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date:   Fri Nov 5 17:21:39 2021 -0400
+
+    docs: add 3.8 to target branches for Antora
+    
+    Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1      1       docs/site.yml
+
+commit c67ca10b6ee9b54ffd8868ec9e406f2e401a674b
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Fri Oct 29 12:30:11 2021 -0400
+
+    Forward-port the 3.6.5  db upgrade script
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+502    0       Open-ILS/src/sql/Pg/version-upgrade/3.6.4-3.6.5-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/3.6.4-3.6.5-upgrade-db.sql
+
+commit 341159fe45062cce14bc3d303c2b668ee0d69d99
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Fri Oct 29 11:17:36 2021 -0400
+
+    Forward-port 3.7.2 version upgrade script
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+781    0       Open-ILS/src/sql/Pg/version-upgrade/3.7.1-3.7.2-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/3.7.1-3.7.2-upgrade-db.sql
+
+commit 542f7a90a2e6bd3c7e9e93fa85a82d5d3c986af3
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Mon Oct 25 13:16:18 2021 -0400
+
+    Docs: More 3.6.5 and 3.7.2 release notes cleanup
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+6      5       docs/RELEASE_NOTES_3_6.adoc
+6      4       docs/RELEASE_NOTES_3_7.adoc
+
+commit bad5300785913fbea0b8207b3f65866e1816b011
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Mon Oct 25 13:04:29 2021 -0400
+
+    Docs: Fix previous release notes addition
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+1      1       docs/RELEASE_NOTES_3_6.adoc
+1      1       docs/RELEASE_NOTES_3_7.adoc
+
+commit 3f2a01764b99ab9e5e9e4e1833706379fe4dc20f
+Author: Jason Stephenson <jason@sigio.com>
+Date:   Mon Oct 25 12:52:54 2021 -0400
+
+    Docs: Add an upgrade note to the 3.7.2 and 3.6.5 release notes
+    
+    Add a note mentioning that upgrading sites should make sure to run
+    autogen.sh to update the fm_IDL.xml files.
+    
+    Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+2      0       docs/RELEASE_NOTES_3_6.adoc
+2      0       docs/RELEASE_NOTES_3_7.adoc
+
+commit ba3b50cce18802d54bbae9e8f2929585ac7e619f
+Author: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+Date:   Mon Oct 25 09:26:46 2021 -0400
+
+    Docs: updates to 3.7.2 and 3.6.5 release notes
+    
+    Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+
+6      0       docs/RELEASE_NOTES_3_6.adoc
+9      0       docs/RELEASE_NOTES_3_7.adoc
+
+commit 504f866a387e1d8e4e9c309ca9444f4b4afea7ab
+Author: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+Date:   Fri Oct 22 15:51:17 2021 -0400
+
+    docs: edit to 3.7.2 release notes
+    
+    Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+
+0      5       docs/RELEASE_NOTES_3_7.adoc
+
+commit 6cac263b296d2f51e2897effbeedce8d47582bd3
+Author: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+Date:   Fri Oct 22 15:45:50 2021 -0400
+
+    docs: release notes 3.6.5
+    
+    Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+    Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+
+157    0       docs/RELEASE_NOTES_3_6.adoc
+
+commit 62c7a2312f611f6a483339a44ea0d757e727a264
+Author: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+Date:   Fri Oct 22 15:43:11 2021 -0400
+
+    docs: release notes 3.7.2
+    
+    Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+
+172    0       docs/RELEASE_NOTES_3_7.adoc
index d750216..e6b53c8 100644 (file)
@@ -7,7 +7,7 @@ use OpenILS::Utils::Fieldmapper;
 sub ils_version {
     # version format is "x-y-z", for example "2-0-0" for Evergreen 2.0.0
     # For branches, format is "x-y"
-    return "HEAD";
+    return "3-9-0";
 }
 
 __PACKAGE__->register_method(
index 161dd7b..b9ce52f 100644 (file)
@@ -93,6 +93,7 @@ CREATE TRIGGER no_overlapping_deps
     FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates');
 
 INSERT INTO config.upgrade_log (version, applied_to) VALUES ('1325', :eg_version); -- stompro/sandbergja/JBoyer
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('3.9.0', :eg_version);
 
 CREATE TABLE config.bib_source (
        id              SERIAL  PRIMARY KEY,
diff --git a/Open-ILS/src/sql/Pg/version-upgrade/3.8.0-3.9.0-upgrade-db.sql b/Open-ILS/src/sql/Pg/version-upgrade/3.8.0-3.9.0-upgrade-db.sql
new file mode 100644 (file)
index 0000000..f8ec2ca
--- /dev/null
@@ -0,0 +1,3114 @@
+--Upgrade Script for 3.8.0 to 3.9.0
+\set eg_version '''3.9.0'''
+BEGIN;
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('3.9.0', :eg_version);
+
+SELECT evergreen.upgrade_deps_block_check('1307', :eg_version);
+
+DROP FUNCTION search.query_parser_fts (
+    INT,
+    INT,
+    TEXT,
+    INT[],
+    INT[],
+    INT,
+    INT,
+    INT,
+    BOOL,
+    BOOL,
+    BOOL,
+    INT 
+);
+
+DROP TABLE asset.opac_visible_copies;
+
+DROP FUNCTION IF EXISTS asset.refresh_opac_visible_copies_mat_view();
+
+DROP TYPE search.search_result;
+DROP TYPE search.search_args;
+
+
+SELECT evergreen.upgrade_deps_block_check('1308', :eg_version);
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.grid.admin.local.triggers.atevdef', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.local.triggers.atevdef',
+        'Grid Config: eg.grid.admin.local.triggers.atevdef',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.local.triggers.atenv', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.local.triggers.atenv',
+        'Grid Config: eg.grid.admin.local.triggers.atenv',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.admin.local.triggers.atevparam', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.local.triggers.atevparam',
+        'Grid Config: eg.grid.admin.local.triggers.atevparam',
+        'cwst', 'label'
+    )
+);
+
+
+SELECT evergreen.upgrade_deps_block_check('1309', :eg_version);
+
+ALTER TABLE asset.course_module_term
+        DROP CONSTRAINT course_module_term_name_key;
+
+ALTER TABLE asset.course_module_term
+        ADD CONSTRAINT cmt_once_per_owning_lib UNIQUE (owning_lib, name);
+
+
+SELECT evergreen.upgrade_deps_block_check('1311', :eg_version);
+
+CREATE OR REPLACE FUNCTION biblio.extract_located_uris( bib_id BIGINT, marcxml TEXT, editor_id INT ) RETURNS VOID AS $func$
+DECLARE
+    uris            TEXT[];
+    uri_xml         TEXT;
+    uri_label       TEXT;
+    uri_href        TEXT;
+    uri_use         TEXT;
+    uri_owner_list  TEXT[];
+    uri_owner       TEXT;
+    uri_owner_id    INT;
+    uri_id          INT;
+    uri_cn_id       INT;
+    uri_map_id      INT;
+    current_uri     INT;
+    current_map     INT;
+    uri_map_count   INT;
+    current_uri_map_list    INT[];
+    current_map_owner_list  INT[];
+
+BEGIN
+
+    uris := oils_xpath('//*[@tag="856" and (@ind1="4" or @ind1="1") and (@ind2="0" or @ind2="1")]',marcxml);
+    IF ARRAY_UPPER(uris,1) > 0 THEN
+        FOR i IN 1 .. ARRAY_UPPER(uris, 1) LOOP
+            -- First we pull info out of the 856
+            uri_xml     := uris[i];
+
+            uri_href    := (oils_xpath('//*[@code="u"]/text()',uri_xml))[1];
+            uri_label   := (oils_xpath('//*[@code="y"]/text()|//*[@code="3"]/text()',uri_xml))[1];
+            uri_use     := (oils_xpath('//*[@code="z"]/text()|//*[@code="2"]/text()|//*[@code="n"]/text()',uri_xml))[1];
+
+            IF uri_label IS NULL THEN
+                uri_label := uri_href;
+            END IF;
+            CONTINUE WHEN uri_href IS NULL;
+
+            -- Get the distinct list of libraries wanting to use 
+            SELECT  ARRAY_AGG(
+                        DISTINCT REGEXP_REPLACE(
+                            x,
+                            $re$^.*?\((\w+)\).*$$re$,
+                            E'\\1'
+                        )
+                    ) INTO uri_owner_list
+              FROM  UNNEST(
+                        oils_xpath(
+                            '//*[@code="9"]/text()|//*[@code="w"]/text()|//*[@code="n"]/text()',
+                            uri_xml
+                        )
+                    )x;
+
+            IF ARRAY_UPPER(uri_owner_list,1) > 0 THEN
+
+                -- look for a matching uri
+                IF uri_use IS NULL THEN
+                    SELECT id INTO uri_id
+                        FROM asset.uri
+                        WHERE label = uri_label AND href = uri_href AND use_restriction IS NULL AND active
+                        ORDER BY id LIMIT 1;
+                    IF NOT FOUND THEN -- create one
+                        INSERT INTO asset.uri (label, href, use_restriction) VALUES (uri_label, uri_href, uri_use);
+                        SELECT id INTO uri_id
+                            FROM asset.uri
+                            WHERE label = uri_label AND href = uri_href AND use_restriction IS NULL AND active;
+                    END IF;
+                ELSE
+                    SELECT id INTO uri_id
+                        FROM asset.uri
+                        WHERE label = uri_label AND href = uri_href AND use_restriction = uri_use AND active
+                        ORDER BY id LIMIT 1;
+                    IF NOT FOUND THEN -- create one
+                        INSERT INTO asset.uri (label, href, use_restriction) VALUES (uri_label, uri_href, uri_use);
+                        SELECT id INTO uri_id
+                            FROM asset.uri
+                            WHERE label = uri_label AND href = uri_href AND use_restriction = uri_use AND active;
+                    END IF;
+                END IF;
+
+                FOR j IN 1 .. ARRAY_UPPER(uri_owner_list, 1) LOOP
+                    uri_owner := uri_owner_list[j];
+
+                    SELECT id INTO uri_owner_id FROM actor.org_unit WHERE shortname = BTRIM(REPLACE(uri_owner,chr(160),''));
+                    CONTINUE WHEN NOT FOUND;
+
+                    -- we need a call number to link through
+                    SELECT id INTO uri_cn_id FROM asset.call_number WHERE owning_lib = uri_owner_id AND record = bib_id AND label = '##URI##' AND NOT deleted;
+                    IF NOT FOUND THEN
+                        INSERT INTO asset.call_number (owning_lib, record, create_date, edit_date, creator, editor, label)
+                            VALUES (uri_owner_id, bib_id, 'now', 'now', editor_id, editor_id, '##URI##');
+                        SELECT id INTO uri_cn_id FROM asset.call_number WHERE owning_lib = uri_owner_id AND record = bib_id AND label = '##URI##' AND NOT deleted;
+                    END IF;
+
+                    -- now, link them if they're not already
+                    SELECT id INTO uri_map_id FROM asset.uri_call_number_map WHERE call_number = uri_cn_id AND uri = uri_id;
+                    IF NOT FOUND THEN
+                        INSERT INTO asset.uri_call_number_map (call_number, uri) VALUES (uri_cn_id, uri_id);
+                        SELECT id INTO uri_map_id FROM asset.uri_call_number_map WHERE call_number = uri_cn_id AND uri = uri_id;
+                    END IF;
+
+                    current_uri_map_list := current_uri_map_list || uri_map_id;
+                    current_map_owner_list := current_map_owner_list || uri_cn_id;
+
+                END LOOP;
+
+            END IF;
+
+        END LOOP;
+    END IF;
+
+    -- Clear any orphaned URIs, URI mappings and call
+    -- numbers for this bib that weren't mapped above.
+    FOR current_map IN
+        SELECT  m.id
+          FROM  asset.uri_call_number_map m
+                LEFT JOIN asset.call_number cn ON (cn.id = m.call_number)
+          WHERE cn.record = bib_id
+                AND cn.label = '##URI##'
+                AND (NOT (m.id = ANY (current_uri_map_list))
+                     OR current_uri_map_list is NULL)
+    LOOP
+        SELECT uri INTO current_uri FROM asset.uri_call_number_map WHERE id = current_map;
+        DELETE FROM asset.uri_call_number_map WHERE id = current_map;
+
+        SELECT COUNT(*) INTO uri_map_count FROM asset.uri_call_number_map WHERE uri = current_uri;
+        IF uri_map_count = 0 THEN
+            DELETE FROM asset.uri WHERE id = current_uri;
+        END IF;
+    END LOOP;
+
+    UPDATE asset.call_number
+    SET deleted = TRUE, edit_date = now(), editor = editor_id
+    WHERE id IN (
+        SELECT  id
+          FROM  asset.call_number
+          WHERE record = bib_id
+                AND label = '##URI##'
+                AND NOT deleted
+                AND (NOT (id = ANY (current_map_owner_list))
+                     OR current_map_owner_list is NULL)
+    );
+
+    RETURN;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+-- Remove existing orphaned URIs from the database.
+DELETE FROM asset.uri
+WHERE id IN
+(
+SELECT uri.id
+FROM asset.uri
+LEFT JOIN asset.uri_call_number_map
+ON uri_call_number_map.uri = uri.id
+LEFT JOIN serial.item
+ON item.uri = uri.id
+WHERE uri_call_number_map IS NULL
+AND item IS NULL
+);
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1312', :eg_version);
+
+CREATE INDEX aum_editor ON actor.usr_message (editor);
+
+
+SELECT evergreen.upgrade_deps_block_check('1313', :eg_version); -- alynn26
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.grid.cat.bucket.batch_hold.view', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.bucket.batch_hold.view',
+        'Grid Config: eg.grid.cat.bucket.batch_hold.view',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.bucket.batch_hold.pending', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.bucket.batch_hold.pending',
+        'Grid Config: eg.grid.cat.bucket.batch_hold.pending',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.bucket.batch_hold.events', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.bucket.batch_hold.events',
+        'Grid Config: eg.grid.cat.bucket.batch_hold.events',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.bucket.batch_hold.list', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.cat.bucket.batch_hold.list',
+        'Grid Config: eg.grid.cat.bucket.batch_hold.list',
+        'cwst', 'label'
+    )
+);
+
+
+SELECT evergreen.upgrade_deps_block_check('1314', :eg_version);
+
+CREATE OR REPLACE FUNCTION authority.generate_overlay_template (source_xml TEXT) RETURNS TEXT AS $f$
+DECLARE
+    cset                INT;
+    main_entry          authority.control_set_authority_field%ROWTYPE;
+    bib_field           authority.control_set_bib_field%ROWTYPE;
+    auth_id             INT DEFAULT oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', source_xml)::INT;
+    tmp_data            XML;
+    replace_data        XML[] DEFAULT '{}'::XML[];
+    replace_rules       TEXT[] DEFAULT '{}'::TEXT[];
+    auth_field          XML[];
+    auth_i1             TEXT;
+    auth_i2             TEXT;
+BEGIN
+    IF auth_id IS NULL THEN
+        RETURN NULL;
+    END IF;
+
+    -- Default to the LoC controll set
+    SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
+
+    -- if none, make a best guess
+    IF cset IS NULL THEN
+        SELECT  control_set INTO cset
+          FROM  authority.control_set_authority_field
+          WHERE tag IN (
+                    SELECT  UNNEST(XPATH('//*[local-name()="datafield" and starts-with(@tag,"1")]/@tag',marc::XML)::TEXT[])
+                      FROM  authority.record_entry
+                      WHERE id = auth_id
+                )
+          LIMIT 1;
+    END IF;
+
+    -- if STILL none, no-op change
+    IF cset IS NULL THEN
+        RETURN XMLELEMENT(
+            name record,
+            XMLATTRIBUTES('http://www.loc.gov/MARC21/slim' AS xmlns),
+            XMLELEMENT( name leader, '00881nam a2200193   4500'),
+            XMLELEMENT(
+                name datafield,
+                XMLATTRIBUTES( '905' AS tag, ' ' AS ind1, ' ' AS ind2),
+                XMLELEMENT(
+                    name subfield,
+                    XMLATTRIBUTES('d' AS code),
+                    '901c'
+                )
+            )
+        )::TEXT;
+    END IF;
+
+    FOR main_entry IN SELECT * FROM authority.control_set_authority_field acsaf WHERE acsaf.control_set = cset AND acsaf.main_entry IS NULL LOOP
+        auth_field := XPATH('//*[local-name()="datafield" and @tag="'||main_entry.tag||'"][1]',source_xml::XML);
+        auth_i1 := (XPATH('//*[local-name()="datafield"]/@ind1',auth_field[1]))[1];
+        auth_i2 := (XPATH('//*[local-name()="datafield"]/@ind2',auth_field[1]))[1];
+        IF ARRAY_LENGTH(auth_field,1) > 0 THEN
+            FOR bib_field IN SELECT * FROM authority.control_set_bib_field WHERE authority_field = main_entry.id LOOP
+                SELECT XMLELEMENT( -- XMLAGG avoids magical <element> creation, but requires unnest subquery
+                    name datafield,
+                    XMLATTRIBUTES(bib_field.tag AS tag, auth_i1 AS ind1, auth_i2 AS ind2),
+                    XMLAGG(UNNEST)
+                ) INTO tmp_data FROM UNNEST(XPATH('//*[local-name()="subfield"]', auth_field[1]));
+                replace_data := replace_data || tmp_data;
+                replace_rules := replace_rules || ( bib_field.tag || main_entry.sf_list || E'[0~\\)' || auth_id || '$]' );
+                tmp_data = NULL;
+            END LOOP;
+            EXIT;
+        END IF;
+    END LOOP;
+
+    SELECT XMLAGG(UNNEST) INTO tmp_data FROM UNNEST(replace_data);
+
+    RETURN XMLELEMENT(
+        name record,
+        XMLATTRIBUTES('http://www.loc.gov/MARC21/slim' AS xmlns),
+        XMLELEMENT( name leader, '00881nam a2200193   4500'),
+        tmp_data,
+        XMLELEMENT(
+            name datafield,
+            XMLATTRIBUTES( '905' AS tag, ' ' AS ind1, ' ' AS ind2),
+            XMLELEMENT(
+                name subfield,
+                XMLATTRIBUTES('r' AS code),
+                ARRAY_TO_STRING(replace_rules,',')
+            )
+        )
+    )::TEXT;
+END;
+$f$ STABLE LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION authority.normalize_heading( marcxml TEXT, no_thesaurus BOOL ) RETURNS TEXT AS $func$
+DECLARE
+    acsaf           authority.control_set_authority_field%ROWTYPE;
+    tag_used        TEXT;
+    nfi_used        TEXT;
+    sf              TEXT;
+    sf_node         TEXT;
+    tag_node        TEXT;
+    thes_code       TEXT;
+    cset            INT;
+    heading_text    TEXT;
+    tmp_text        TEXT;
+    first_sf        BOOL;
+    auth_id         INT DEFAULT COALESCE(NULLIF(oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml), ''), '0')::INT;
+BEGIN
+    SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
+
+    IF cset IS NULL THEN
+        SELECT  control_set INTO cset
+          FROM  authority.control_set_authority_field
+          WHERE tag IN (SELECT UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]))
+          LIMIT 1;
+    END IF;
+
+    heading_text := '';
+    FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset AND main_entry IS NULL LOOP
+        tag_used := acsaf.tag;
+        nfi_used := acsaf.nfi;
+        first_sf := TRUE;
+
+        FOR tag_node IN SELECT unnest(oils_xpath('//*[@tag="'||tag_used||'"]',marcxml))
+        LOOP
+            FOR sf_node IN SELECT unnest(oils_xpath('//*[local-name() = "subfield" and contains("'||acsaf.sf_list||'",@code)]',tag_node))
+            LOOP
+
+                tmp_text := oils_xpath_string('.', sf_node);
+                sf := oils_xpath_string('//*/@code', sf_node);
+
+                IF first_sf AND tmp_text IS NOT NULL AND nfi_used IS NOT NULL THEN
+
+                    tmp_text := SUBSTRING(
+                        tmp_text FROM
+                        COALESCE(
+                            NULLIF(
+                                REGEXP_REPLACE(
+                                    oils_xpath_string('//*[local-name() = "datafield"]/@ind'||nfi_used, tag_node),
+                                    $$\D+$$,
+                                    '',
+                                    'g'
+                                ),
+                                ''
+                            )::INT,
+                            0
+                        ) + 1
+                    );
+
+                END IF;
+
+                first_sf := FALSE;
+
+                IF tmp_text IS NOT NULL AND tmp_text <> '' THEN
+                    heading_text := heading_text || E'\u2021' || sf || ' ' || tmp_text;
+                END IF;
+            END LOOP;
+
+            EXIT WHEN heading_text <> '';
+        END LOOP;
+
+        EXIT WHEN heading_text <> '';
+    END LOOP;
+
+    IF heading_text <> '' THEN
+        IF no_thesaurus IS TRUE THEN
+            heading_text := tag_used || ' ' || public.naco_normalize(heading_text);
+        ELSE
+            thes_code := authority.extract_thesaurus(marcxml);
+            heading_text := tag_used || '_' || COALESCE(nfi_used,'-') || '_' || thes_code || ' ' || public.naco_normalize(heading_text);
+        END IF;
+    ELSE
+        heading_text := 'NOHEADING_' || thes_code || ' ' || MD5(marcxml);
+    END IF;
+
+    RETURN heading_text;
+END;
+$func$ LANGUAGE PLPGSQL STABLE STRICT;
+
+CREATE OR REPLACE FUNCTION vandelay.ingest_items ( import_id BIGINT, attr_def_id BIGINT ) RETURNS SETOF vandelay.import_item AS $$
+DECLARE
+
+    owning_lib      TEXT;
+    circ_lib        TEXT;
+    call_number     TEXT;
+    copy_number     TEXT;
+    status          TEXT;
+    location        TEXT;
+    circulate       TEXT;
+    deposit         TEXT;
+    deposit_amount  TEXT;
+    ref             TEXT;
+    holdable        TEXT;
+    price           TEXT;
+    barcode         TEXT;
+    circ_modifier   TEXT;
+    circ_as_type    TEXT;
+    alert_message   TEXT;
+    opac_visible    TEXT;
+    pub_note        TEXT;
+    priv_note       TEXT;
+    internal_id     TEXT;
+    stat_cat_data   TEXT;
+    parts_data      TEXT;
+
+    attr_def        RECORD;
+    tmp_attr_set    RECORD;
+    attr_set        vandelay.import_item%ROWTYPE;
+
+    xpaths          TEXT[];
+    tmp_str         TEXT;
+
+BEGIN
+
+    SELECT * INTO attr_def FROM vandelay.import_item_attr_definition WHERE id = attr_def_id;
+
+    IF FOUND THEN
+
+        attr_set.definition := attr_def.id;
+
+        -- Build the combined XPath
+
+        owning_lib :=
+            CASE
+                WHEN attr_def.owning_lib IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.owning_lib ) = 1 THEN '//*[@code="' || attr_def.owning_lib || '"]'
+                ELSE '//*' || attr_def.owning_lib
+            END;
+
+        circ_lib :=
+            CASE
+                WHEN attr_def.circ_lib IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.circ_lib ) = 1 THEN '//*[@code="' || attr_def.circ_lib || '"]'
+                ELSE '//*' || attr_def.circ_lib
+            END;
+
+        call_number :=
+            CASE
+                WHEN attr_def.call_number IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.call_number ) = 1 THEN '//*[@code="' || attr_def.call_number || '"]'
+                ELSE '//*' || attr_def.call_number
+            END;
+
+        copy_number :=
+            CASE
+                WHEN attr_def.copy_number IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.copy_number ) = 1 THEN '//*[@code="' || attr_def.copy_number || '"]'
+                ELSE '//*' || attr_def.copy_number
+            END;
+
+        status :=
+            CASE
+                WHEN attr_def.status IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.status ) = 1 THEN '//*[@code="' || attr_def.status || '"]'
+                ELSE '//*' || attr_def.status
+            END;
+
+        location :=
+            CASE
+                WHEN attr_def.location IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.location ) = 1 THEN '//*[@code="' || attr_def.location || '"]'
+                ELSE '//*' || attr_def.location
+            END;
+
+        circulate :=
+            CASE
+                WHEN attr_def.circulate IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.circulate ) = 1 THEN '//*[@code="' || attr_def.circulate || '"]'
+                ELSE '//*' || attr_def.circulate
+            END;
+
+        deposit :=
+            CASE
+                WHEN attr_def.deposit IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.deposit ) = 1 THEN '//*[@code="' || attr_def.deposit || '"]'
+                ELSE '//*' || attr_def.deposit
+            END;
+
+        deposit_amount :=
+            CASE
+                WHEN attr_def.deposit_amount IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.deposit_amount ) = 1 THEN '//*[@code="' || attr_def.deposit_amount || '"]'
+                ELSE '//*' || attr_def.deposit_amount
+            END;
+
+        ref :=
+            CASE
+                WHEN attr_def.ref IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.ref ) = 1 THEN '//*[@code="' || attr_def.ref || '"]'
+                ELSE '//*' || attr_def.ref
+            END;
+
+        holdable :=
+            CASE
+                WHEN attr_def.holdable IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.holdable ) = 1 THEN '//*[@code="' || attr_def.holdable || '"]'
+                ELSE '//*' || attr_def.holdable
+            END;
+
+        price :=
+            CASE
+                WHEN attr_def.price IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.price ) = 1 THEN '//*[@code="' || attr_def.price || '"]'
+                ELSE '//*' || attr_def.price
+            END;
+
+        barcode :=
+            CASE
+                WHEN attr_def.barcode IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.barcode ) = 1 THEN '//*[@code="' || attr_def.barcode || '"]'
+                ELSE '//*' || attr_def.barcode
+            END;
+
+        circ_modifier :=
+            CASE
+                WHEN attr_def.circ_modifier IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.circ_modifier ) = 1 THEN '//*[@code="' || attr_def.circ_modifier || '"]'
+                ELSE '//*' || attr_def.circ_modifier
+            END;
+
+        circ_as_type :=
+            CASE
+                WHEN attr_def.circ_as_type IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.circ_as_type ) = 1 THEN '//*[@code="' || attr_def.circ_as_type || '"]'
+                ELSE '//*' || attr_def.circ_as_type
+            END;
+
+        alert_message :=
+            CASE
+                WHEN attr_def.alert_message IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.alert_message ) = 1 THEN '//*[@code="' || attr_def.alert_message || '"]'
+                ELSE '//*' || attr_def.alert_message
+            END;
+
+        opac_visible :=
+            CASE
+                WHEN attr_def.opac_visible IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.opac_visible ) = 1 THEN '//*[@code="' || attr_def.opac_visible || '"]'
+                ELSE '//*' || attr_def.opac_visible
+            END;
+
+        pub_note :=
+            CASE
+                WHEN attr_def.pub_note IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.pub_note ) = 1 THEN '//*[@code="' || attr_def.pub_note || '"]'
+                ELSE '//*' || attr_def.pub_note
+            END;
+        priv_note :=
+            CASE
+                WHEN attr_def.priv_note IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.priv_note ) = 1 THEN '//*[@code="' || attr_def.priv_note || '"]'
+                ELSE '//*' || attr_def.priv_note
+            END;
+
+        internal_id :=
+            CASE
+                WHEN attr_def.internal_id IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.internal_id ) = 1 THEN '//*[@code="' || attr_def.internal_id || '"]'
+                ELSE '//*' || attr_def.internal_id
+            END;
+
+        stat_cat_data :=
+            CASE
+                WHEN attr_def.stat_cat_data IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.stat_cat_data ) = 1 THEN '//*[@code="' || attr_def.stat_cat_data || '"]'
+                ELSE '//*' || attr_def.stat_cat_data
+            END;
+
+        parts_data :=
+            CASE
+                WHEN attr_def.parts_data IS NULL THEN 'null()'
+                WHEN LENGTH( attr_def.parts_data ) = 1 THEN '//*[@code="' || attr_def.parts_data || '"]'
+                ELSE '//*' || attr_def.parts_data
+            END;
+
+
+
+        xpaths := ARRAY[owning_lib, circ_lib, call_number, copy_number, status, location, circulate,
+                        deposit, deposit_amount, ref, holdable, price, barcode, circ_modifier, circ_as_type,
+                        alert_message, pub_note, priv_note, internal_id, stat_cat_data, parts_data, opac_visible];
+
+        FOR tmp_attr_set IN
+                SELECT  *
+                  FROM  oils_xpath_tag_to_table( (SELECT marc FROM vandelay.queued_bib_record WHERE id = import_id), attr_def.tag, xpaths)
+                            AS t( ol TEXT, clib TEXT, cn TEXT, cnum TEXT, cs TEXT, cl TEXT, circ TEXT,
+                                  dep TEXT, dep_amount TEXT, r TEXT, hold TEXT, pr TEXT, bc TEXT, circ_mod TEXT,
+                                  circ_as TEXT, amessage TEXT, note TEXT, pnote TEXT, internal_id TEXT,
+                                  stat_cat_data TEXT, parts_data TEXT, opac_vis TEXT )
+        LOOP
+
+            attr_set.import_error := NULL;
+            attr_set.error_detail := NULL;
+            attr_set.deposit_amount := NULL;
+            attr_set.copy_number := NULL;
+            attr_set.price := NULL;
+            attr_set.circ_modifier := NULL;
+            attr_set.location := NULL;
+            attr_set.barcode := NULL;
+            attr_set.call_number := NULL;
+
+            IF tmp_attr_set.pr != '' THEN
+                tmp_str = REGEXP_REPLACE(tmp_attr_set.pr, E'[^0-9\\.]', '', 'g');
+                IF tmp_str = '' THEN
+                    attr_set.import_error := 'import.item.invalid.price';
+                    attr_set.error_detail := tmp_attr_set.pr; -- original value
+                    RETURN NEXT attr_set; CONTINUE;
+                END IF;
+                attr_set.price := tmp_str::NUMERIC(8,2);
+            END IF;
+
+            IF tmp_attr_set.dep_amount != '' THEN
+                tmp_str = REGEXP_REPLACE(tmp_attr_set.dep_amount, E'[^0-9\\.]', '', 'g');
+                IF tmp_str = '' THEN
+                    attr_set.import_error := 'import.item.invalid.deposit_amount';
+                    attr_set.error_detail := tmp_attr_set.dep_amount;
+                    RETURN NEXT attr_set; CONTINUE;
+                END IF;
+                attr_set.deposit_amount := tmp_str::NUMERIC(8,2);
+            END IF;
+
+            IF tmp_attr_set.cnum != '' THEN
+                tmp_str = REGEXP_REPLACE(tmp_attr_set.cnum, E'[^0-9]', '', 'g');
+                IF tmp_str = '' THEN
+                    attr_set.import_error := 'import.item.invalid.copy_number';
+                    attr_set.error_detail := tmp_attr_set.cnum;
+                    RETURN NEXT attr_set; CONTINUE;
+                END IF;
+                attr_set.copy_number := tmp_str::INT;
+            END IF;
+
+            IF tmp_attr_set.ol != '' THEN
+                SELECT id INTO attr_set.owning_lib FROM actor.org_unit WHERE shortname = UPPER(tmp_attr_set.ol); -- INT
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.owning_lib';
+                    attr_set.error_detail := tmp_attr_set.ol;
+                    RETURN NEXT attr_set; CONTINUE;
+                END IF;
+            END IF;
+
+            IF tmp_attr_set.clib != '' THEN
+                SELECT id INTO attr_set.circ_lib FROM actor.org_unit WHERE shortname = UPPER(tmp_attr_set.clib); -- INT
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.circ_lib';
+                    attr_set.error_detail := tmp_attr_set.clib;
+                    RETURN NEXT attr_set; CONTINUE;
+                END IF;
+            END IF;
+
+            IF tmp_attr_set.cs != '' THEN
+                SELECT id INTO attr_set.status FROM config.copy_status WHERE LOWER(name) = LOWER(tmp_attr_set.cs); -- INT
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.status';
+                    attr_set.error_detail := tmp_attr_set.cs;
+                    RETURN NEXT attr_set; CONTINUE;
+                END IF;
+            END IF;
+
+            IF COALESCE(tmp_attr_set.circ_mod, '') = '' THEN
+
+                -- no circ mod defined, see if we should apply a default
+                SELECT INTO attr_set.circ_modifier TRIM(BOTH '"' FROM value)
+                    FROM actor.org_unit_ancestor_setting(
+                        'vandelay.item.circ_modifier.default',
+                        attr_set.owning_lib
+                    );
+
+                -- make sure the value from the org setting is still valid
+                PERFORM 1 FROM config.circ_modifier WHERE code = attr_set.circ_modifier;
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.circ_modifier';
+                    attr_set.error_detail := tmp_attr_set.circ_mod;
+                    RETURN NEXT attr_set; CONTINUE;
+                END IF;
+
+            ELSE
+
+                SELECT code INTO attr_set.circ_modifier FROM config.circ_modifier WHERE code = tmp_attr_set.circ_mod;
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.circ_modifier';
+                    attr_set.error_detail := tmp_attr_set.circ_mod;
+                    RETURN NEXT attr_set; CONTINUE;
+                END IF;
+            END IF;
+
+            IF tmp_attr_set.circ_as != '' THEN
+                SELECT code INTO attr_set.circ_as_type FROM config.coded_value_map WHERE ctype = 'item_type' AND code = tmp_attr_set.circ_as;
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.circ_as_type';
+                    attr_set.error_detail := tmp_attr_set.circ_as;
+                    RETURN NEXT attr_set; CONTINUE;
+                END IF;
+            END IF;
+
+            IF COALESCE(tmp_attr_set.cl, '') = '' THEN
+                -- no location specified, see if we should apply a default
+
+                SELECT INTO attr_set.location TRIM(BOTH '"' FROM value)
+                    FROM actor.org_unit_ancestor_setting(
+                        'vandelay.item.copy_location.default',
+                        attr_set.owning_lib
+                    );
+
+                -- make sure the value from the org setting is still valid
+                PERFORM 1 FROM asset.copy_location
+                    WHERE id = attr_set.location AND NOT deleted;
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.location';
+                    attr_set.error_detail := tmp_attr_set.cs;
+                    RETURN NEXT attr_set; CONTINUE;
+                END IF;
+            ELSE
+
+                -- search up the org unit tree for a matching copy location
+                WITH RECURSIVE anscestor_depth AS (
+                    SELECT  ou.id,
+                        out.depth AS depth,
+                        ou.parent_ou
+                    FROM  actor.org_unit ou
+                        JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+                    WHERE ou.id = COALESCE(attr_set.owning_lib, attr_set.circ_lib)
+                        UNION ALL
+                    SELECT  ou.id,
+                        out.depth,
+                        ou.parent_ou
+                    FROM  actor.org_unit ou
+                        JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+                        JOIN anscestor_depth ot ON (ot.parent_ou = ou.id)
+                ) SELECT  cpl.id INTO attr_set.location
+                    FROM  anscestor_depth a
+                        JOIN asset.copy_location cpl ON (cpl.owning_lib = a.id)
+                    WHERE LOWER(cpl.name) = LOWER(tmp_attr_set.cl)
+                        AND NOT cpl.deleted
+                    ORDER BY a.depth DESC
+                    LIMIT 1;
+
+                IF NOT FOUND THEN
+                    attr_set.import_error := 'import.item.invalid.location';
+                    attr_set.error_detail := tmp_attr_set.cs;
+                    RETURN NEXT attr_set; CONTINUE;
+                END IF;
+            END IF;
+
+            attr_set.circulate      :=
+                LOWER( SUBSTRING( tmp_attr_set.circ, 1, 1)) IN ('t','y','1')
+                OR LOWER(tmp_attr_set.circ) = 'circulating'; -- BOOL
+
+            attr_set.deposit        :=
+                LOWER( SUBSTRING( tmp_attr_set.dep, 1, 1 ) ) IN ('t','y','1')
+                OR LOWER(tmp_attr_set.dep) = 'deposit'; -- BOOL
+
+            attr_set.holdable       :=
+                LOWER( SUBSTRING( tmp_attr_set.hold, 1, 1 ) ) IN ('t','y','1')
+                OR LOWER(tmp_attr_set.hold) = 'holdable'; -- BOOL
+
+            attr_set.opac_visible   :=
+                LOWER( SUBSTRING( tmp_attr_set.opac_vis, 1, 1 ) ) IN ('t','y','1')
+                OR LOWER(tmp_attr_set.opac_vis) = 'visible'; -- BOOL
+
+            attr_set.ref            :=
+                LOWER( SUBSTRING( tmp_attr_set.r, 1, 1 ) ) IN ('t','y','1')
+                OR LOWER(tmp_attr_set.r) = 'reference'; -- BOOL
+
+            attr_set.call_number    := tmp_attr_set.cn; -- TEXT
+            attr_set.barcode        := tmp_attr_set.bc; -- TEXT,
+            attr_set.alert_message  := tmp_attr_set.amessage; -- TEXT,
+            attr_set.pub_note       := tmp_attr_set.note; -- TEXT,
+            attr_set.priv_note      := tmp_attr_set.pnote; -- TEXT,
+            attr_set.alert_message  := tmp_attr_set.amessage; -- TEXT,
+            attr_set.internal_id    := tmp_attr_set.internal_id::BIGINT;
+            attr_set.stat_cat_data  := tmp_attr_set.stat_cat_data; -- TEXT,
+            attr_set.parts_data     := tmp_attr_set.parts_data; -- TEXT,
+
+            RETURN NEXT attr_set;
+
+        END LOOP;
+
+    END IF;
+
+    RETURN;
+
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION biblio.extract_quality ( marc TEXT, best_lang TEXT, best_type TEXT ) RETURNS INT AS $func$
+DECLARE
+    qual        INT;
+    ldr         TEXT;
+    tval        TEXT;
+    tval_rec    RECORD;
+    bval        TEXT;
+    bval_rec    RECORD;
+    type_map    RECORD;
+    ff_pos      RECORD;
+    ff_tag_data TEXT;
+BEGIN
+
+    IF marc IS NULL OR marc = '' THEN
+        RETURN NULL;
+    END IF;
+
+    -- First, the count of tags
+    qual := ARRAY_UPPER(oils_xpath('//*[local-name()="datafield"]', marc), 1);
+
+    -- now go through a bunch of pain to get the record type
+    IF best_type IS NOT NULL THEN
+        ldr := (oils_xpath('//*[local-name()="leader"]/text()', marc))[1];
+
+        IF ldr IS NOT NULL THEN
+            SELECT * INTO tval_rec FROM config.marc21_ff_pos_map WHERE fixed_field = 'Type' LIMIT 1; -- They're all the same
+            SELECT * INTO bval_rec FROM config.marc21_ff_pos_map WHERE fixed_field = 'BLvl' LIMIT 1; -- They're all the same
+
+
+            tval := SUBSTRING( ldr, tval_rec.start_pos + 1, tval_rec.length );
+            bval := SUBSTRING( ldr, bval_rec.start_pos + 1, bval_rec.length );
+
+            -- RAISE NOTICE 'type %, blvl %, ldr %', tval, bval, ldr;
+
+            SELECT * INTO type_map FROM config.marc21_rec_type_map WHERE type_val LIKE '%' || tval || '%' AND blvl_val LIKE '%' || bval || '%';
+
+            IF type_map.code IS NOT NULL THEN
+                IF best_type = type_map.code THEN
+                    qual := qual + qual / 2;
+                END IF;
+
+                FOR ff_pos IN SELECT * FROM config.marc21_ff_pos_map WHERE fixed_field = 'Lang' AND rec_type = type_map.code ORDER BY tag DESC LOOP
+                    ff_tag_data := SUBSTRING((oils_xpath('//*[@tag="' || ff_pos.tag || '"]/text()',marc))[1], ff_pos.start_pos + 1, ff_pos.length);
+                    IF ff_tag_data = best_lang THEN
+                            qual := qual + 100;
+                    END IF;
+                END LOOP;
+            END IF;
+        END IF;
+    END IF;
+
+    -- Now look for some quality metrics
+    -- DCL record?
+    IF ARRAY_UPPER(oils_xpath('//*[@tag="040"]/*[@code="a" and contains(.,"DLC")]', marc), 1) = 1 THEN
+        qual := qual + 10;
+    END IF;
+
+    -- From OCLC?
+    IF (oils_xpath('//*[@tag="003"]/text()', marc))[1] ~* E'oclo?c' THEN
+        qual := qual + 10;
+    END IF;
+
+    RETURN qual;
+
+END;
+$func$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION authority.simple_heading_set( marcxml TEXT ) RETURNS SETOF authority.simple_heading AS $func$
+DECLARE
+    res             authority.simple_heading%ROWTYPE;
+    acsaf           authority.control_set_authority_field%ROWTYPE;
+    heading_row     authority.heading%ROWTYPE;
+    tag_used        TEXT;
+    nfi_used        TEXT;
+    sf              TEXT;
+    cset            INT;
+    heading_text    TEXT;
+    joiner_text     TEXT;
+    sort_text       TEXT;
+    tmp_text        TEXT;
+    tmp_xml         TEXT;
+    first_sf        BOOL;
+    auth_id         INT DEFAULT COALESCE(NULLIF(oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml), ''), '0')::INT;
+BEGIN
+
+    SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
+
+    IF cset IS NULL THEN
+        SELECT  control_set INTO cset
+          FROM  authority.control_set_authority_field
+          WHERE tag IN ( SELECT  UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]))
+          LIMIT 1;
+    END IF;
+
+    res.record := auth_id;
+    res.thesaurus := authority.extract_thesaurus(marcxml);
+
+    FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset LOOP
+        res.atag := acsaf.id;
+
+        IF acsaf.heading_field IS NULL THEN
+            tag_used := acsaf.tag;
+            nfi_used := acsaf.nfi;
+            joiner_text := COALESCE(acsaf.joiner, ' ');
+
+            FOR tmp_xml IN SELECT UNNEST(XPATH('//*[@tag="'||tag_used||'"]', marcxml::XML)::TEXT[]) LOOP
+
+                heading_text := COALESCE(
+                    oils_xpath_string('//*[local-name()="subfield" and contains("'||acsaf.display_sf_list||'",@code)]', tmp_xml, joiner_text),
+                    ''
+                );
+
+                IF nfi_used IS NOT NULL THEN
+
+                    sort_text := SUBSTRING(
+                        heading_text FROM
+                        COALESCE(
+                            NULLIF(
+                                REGEXP_REPLACE(
+                                    oils_xpath_string('//*[local-name()="datafield"]/@ind'||nfi_used, tmp_xml::TEXT),
+                                    $$\D+$$,
+                                    '',
+                                    'g'
+                                ),
+                                ''
+                            )::INT,
+                            0
+                        ) + 1
+                    );
+
+                ELSE
+                    sort_text := heading_text;
+                END IF;
+
+                IF heading_text IS NOT NULL AND heading_text <> '' THEN
+                    res.value := heading_text;
+                    res.sort_value := public.naco_normalize(sort_text);
+                    res.index_vector = to_tsvector('keyword'::regconfig, res.sort_value);
+                    RETURN NEXT res;
+                END IF;
+
+            END LOOP;
+        ELSE
+            FOR heading_row IN SELECT * FROM authority.extract_headings(marcxml, ARRAY[acsaf.heading_field]) LOOP
+                res.value := heading_row.heading;
+                res.sort_value := heading_row.normalized_heading;
+                res.index_vector = to_tsvector('keyword'::regconfig, res.sort_value);
+                RETURN NEXT res;
+            END LOOP;
+        END IF;
+    END LOOP;
+
+    RETURN;
+END;
+$func$ LANGUAGE PLPGSQL STABLE STRICT;
+
+CREATE OR REPLACE FUNCTION metabib.remap_metarecord_for_bib(
+    bib_id bigint,
+    fp text,
+    bib_is_deleted boolean DEFAULT false,
+    retain_deleted boolean DEFAULT false
+) RETURNS bigint AS $function$
+DECLARE
+    new_mapping     BOOL := TRUE;
+    source_count    INT;
+    old_mr          BIGINT;
+    tmp_mr          metabib.metarecord%ROWTYPE;
+    deleted_mrs     BIGINT[];
+BEGIN
+
+    -- We need to make sure we're not a deleted master record of an MR
+    IF bib_is_deleted THEN
+        IF NOT retain_deleted THEN -- Go away for any MR that we're master of, unless retained
+            DELETE FROM metabib.metarecord_source_map WHERE source = bib_id;
+        END IF;
+
+        FOR old_mr IN SELECT id FROM metabib.metarecord WHERE master_record = bib_id LOOP
+
+            -- Now, are there any more sources on this MR?
+            SELECT COUNT(*) INTO source_count FROM metabib.metarecord_source_map WHERE metarecord = old_mr;
+
+            IF source_count = 0 AND NOT retain_deleted THEN -- No other records
+                deleted_mrs := ARRAY_APPEND(deleted_mrs, old_mr); -- Just in case...
+                DELETE FROM metabib.metarecord WHERE id = old_mr;
+
+            ELSE -- indeed there are. Update it with a null cache and recalcualated master record
+                UPDATE  metabib.metarecord
+                  SET   mods = NULL,
+                        master_record = (SELECT id FROM biblio.record_entry WHERE fingerprint = fp AND NOT deleted ORDER BY quality DESC, id ASC LIMIT 1)
+                  WHERE id = old_mr;
+            END IF;
+        END LOOP;
+
+    ELSE -- insert or update
+
+        FOR tmp_mr IN SELECT m.* FROM metabib.metarecord m JOIN metabib.metarecord_source_map s ON (s.metarecord = m.id) WHERE s.source = bib_id LOOP
+
+            -- Find the first fingerprint-matching
+            IF old_mr IS NULL AND fp = tmp_mr.fingerprint THEN
+                old_mr := tmp_mr.id;
+                new_mapping := FALSE;
+
+            ELSE -- Our fingerprint changed ... maybe remove the old MR
+                DELETE FROM metabib.metarecord_source_map WHERE metarecord = tmp_mr.id AND source = bib_id; -- remove the old source mapping
+                SELECT COUNT(*) INTO source_count FROM metabib.metarecord_source_map WHERE metarecord = tmp_mr.id;
+                IF source_count = 0 THEN -- No other records
+                    deleted_mrs := ARRAY_APPEND(deleted_mrs, tmp_mr.id);
+                    DELETE FROM metabib.metarecord WHERE id = tmp_mr.id;
+                END IF;
+            END IF;
+
+        END LOOP;
+
+        -- we found no suitable, preexisting MR based on old source maps
+        IF old_mr IS NULL THEN
+            SELECT id INTO old_mr FROM metabib.metarecord WHERE fingerprint = fp; -- is there one for our current fingerprint?
+
+            IF old_mr IS NULL THEN -- nope, create one and grab its id
+                INSERT INTO metabib.metarecord ( fingerprint, master_record ) VALUES ( fp, bib_id );
+                SELECT id INTO old_mr FROM metabib.metarecord WHERE fingerprint = fp;
+
+            ELSE -- indeed there is. update it with a null cache and recalcualated master record
+                UPDATE  metabib.metarecord
+                  SET   mods = NULL,
+                        master_record = (SELECT id FROM biblio.record_entry WHERE fingerprint = fp AND NOT deleted ORDER BY quality DESC, id ASC LIMIT 1)
+                  WHERE id = old_mr;
+            END IF;
+
+        ELSE -- there was one we already attached to, update its mods cache and master_record
+            UPDATE  metabib.metarecord
+              SET   mods = NULL,
+                    master_record = (SELECT id FROM biblio.record_entry WHERE fingerprint = fp AND NOT deleted ORDER BY quality DESC, id ASC LIMIT 1)
+              WHERE id = old_mr;
+        END IF;
+
+        IF new_mapping THEN
+            INSERT INTO metabib.metarecord_source_map (metarecord, source) VALUES (old_mr, bib_id); -- new source mapping
+        END IF;
+
+    END IF;
+
+    IF ARRAY_UPPER(deleted_mrs,1) > 0 THEN
+        UPDATE action.hold_request SET target = old_mr WHERE target IN ( SELECT unnest(deleted_mrs) ) AND hold_type = 'M'; -- if we had to delete any MRs above, make sure their holds are moved
+    END IF;
+
+    RETURN old_mr;
+
+END;
+$function$ LANGUAGE plpgsql;
+
+
+SELECT evergreen.upgrade_deps_block_check('1315', :eg_version);
+
+CREATE TABLE config.ui_staff_portal_page_entry_type (
+    code        TEXT PRIMARY KEY,
+    label       TEXT NOT NULL
+);
+
+INSERT INTO config.ui_staff_portal_page_entry_type (code, label)
+VALUES
+    ('link', oils_i18n_gettext('link', 'Link', 'cusppet', 'label')),
+    ('menuitem', oils_i18n_gettext('menuitem', 'Menu Item', 'cusppet', 'label')),
+    ('text', oils_i18n_gettext('text', 'Text and/or HTML', 'cusppet', 'label')),
+    ('header', oils_i18n_gettext('header', 'Header', 'cusppet', 'label')),
+    ('catalogsearch', oils_i18n_gettext('catalogsearch', 'Catalog Search Box', 'cusppet', 'label'));
+
+
+CREATE TABLE config.ui_staff_portal_page_entry (
+    id          SERIAL PRIMARY KEY,
+    page_col    INTEGER NOT NULL,
+    col_pos     INTEGER NOT NULL,
+    entry_type  TEXT NOT NULL, -- REFERENCES config.ui_staff_portal_page_entry_type(code)
+    label       TEXT,
+    image_url   TEXT,
+    target_url  TEXT,
+    entry_text  TEXT,
+    owner       INT NOT NULL -- REFERENCES actor.org_unit (id)
+);
+
+ALTER TABLE config.ui_staff_portal_page_entry ADD CONSTRAINT cusppe_entry_type_fkey
+    FOREIGN KEY (entry_type) REFERENCES  config.ui_staff_portal_page_entry_type(code) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE config.ui_staff_portal_page_entry ADD CONSTRAINT cusppe_owner_fkey
+    FOREIGN KEY (owner) REFERENCES  actor.org_unit(id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+
+
+SELECT evergreen.upgrade_deps_block_check('1316', :eg_version);
+
+INSERT INTO config.ui_staff_portal_page_entry
+    (id, page_col, col_pos, entry_type, label, image_url, target_url, owner)
+VALUES
+    ( 1, 1, 0, 'header',        oils_i18n_gettext( 1, 'Circulation and Patrons', 'cusppe', 'label'), NULL, NULL, 1)
+,   ( 2, 1, 1, 'menuitem',      oils_i18n_gettext( 2, 'Check Out Items', 'cusppe', 'label'), '/images/portal/forward.png', '/eg/staff/circ/patron/bcsearch', 1)
+,   ( 3, 1, 2, 'menuitem',      oils_i18n_gettext( 3, 'Check In Items', 'cusppe', 'label'), '/images/portal/back.png', '/eg/staff/circ/checkin/index', 1)
+,   ( 4, 1, 3, 'menuitem',      oils_i18n_gettext( 4, 'Search For Patron By Name', 'cusppe', 'label'), '/images/portal/retreivepatron.png', '/eg/staff/circ/patron/search', 1)
+,   ( 5, 2, 0, 'header',        oils_i18n_gettext( 5, 'Item Search and Cataloging', 'cusppe', 'label'), NULL, NULL, 1)
+,   ( 6, 2, 1, 'catalogsearch', oils_i18n_gettext( 6, 'Search Catalog', 'cusppe', 'label'), NULL, NULL, 1)
+,   ( 7, 2, 2, 'menuitem',      oils_i18n_gettext( 7, 'Record Buckets', 'cusppe', 'label'), '/images/portal/bucket.png', '/eg/staff/cat/bucket/record/', 1)
+,   ( 8, 2, 3, 'menuitem',      oils_i18n_gettext( 8, 'Item Buckets', 'cusppe', 'label'), '/images/portal/bucket.png', '/eg/staff/cat/bucket/copy/', 1)
+,   ( 9, 3, 0, 'header',        oils_i18n_gettext( 9, 'Administration', 'cusppe', 'label'), NULL, NULL, 1)
+,   (10, 3, 1, 'link',          oils_i18n_gettext(10, 'Evergreen Documentation', 'cusppe', 'label'), '/images/portal/helpdesk.png', 'https://docs.evergreen-ils.org', 1)
+,   (11, 3, 2, 'menuitem',      oils_i18n_gettext(11, 'Workstation Administration', 'cusppe', 'label'), '/images/portal/helpdesk.png', '/eg/staff/admin/workstation/index', 1)
+,   (12, 3, 3, 'menuitem',      oils_i18n_gettext(12, 'Reports', 'cusppe', 'label'), '/images/portal/reports.png', '/eg/staff/reporter/legacy/main', 1)
+;
+
+SELECT setval('config.ui_staff_portal_page_entry_id_seq', 100);
+
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.grid.admin.config.ui_staff_portal_page_entry', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.admin.config.ui_staff_portal_page_entry',
+        'Grid Config: admin.config.ui_staff_portal_page_entry',
+        'cwst', 'label'
+    )
+);
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1317', :eg_version);
+
+INSERT INTO permission.perm_list ( id, code, description ) VALUES
+( 636, 'ADMIN_STAFF_PORTAL_PAGE', oils_i18n_gettext( 636,
+   'Update the staff client portal page', 'ppl', 'description' ))
+;
+
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('1318', :eg_version);
+
+-- 950.data.seed-values.sql
+
+INSERT INTO config.global_flag (name, value, enabled, label)
+VALUES (
+    'opac.cover_upload_compression',
+    0,
+    TRUE,
+    oils_i18n_gettext(
+        'opac.cover_upload_compression',
+        'Cover image uploads are converted to PNG files with this compression, on a scale of 0 (no compression) to 9 (maximum compression), or -1 for the zlib default.',
+        'cgf', 'label'
+    )
+);
+
+INSERT INTO config.org_unit_setting_type (name, label, grp, description, datatype)
+VALUES (
+    'opac.cover_upload_max_file_size',
+    oils_i18n_gettext('opac.cover_upload_max_file_size',
+        'Maximum file size for uploaded cover image files (at time of upload, prior to rescaling).',
+        'coust', 'label'),
+    'opac',
+    oils_i18n_gettext('opac.cover_upload_max_file_size',
+        'The number of bytes to allow for a cover image upload.  If unset, defaults to 10737418240 (roughly 10GB).',
+        'coust', 'description'),
+    'integer'
+);
+
+INSERT INTO permission.perm_list ( id, code, description ) VALUES
+ ( 637, 'UPLOAD_COVER_IMAGE', oils_i18n_gettext(637,
+    'Upload local cover images for added content.', 'ppl', 'description'))
+;
+
+
+SELECT evergreen.upgrade_deps_block_check('1319', :eg_version);
+
+DO $SQL$
+BEGIN
+    
+    PERFORM TRUE FROM config.usr_setting_type WHERE name = 'cat.copy.templates';
+
+    IF NOT FOUND THEN -- no matching user setting
+
+        PERFORM TRUE FROM config.workstation_setting_type WHERE name = 'cat.copy.templates';
+
+        IF NOT FOUND THEN
+            -- no matching workstation setting
+            -- Migrate the existing user setting and its data to the new name.
+
+            UPDATE config.usr_setting_type 
+            SET name = 'cat.copy.templates' 
+            WHERE name = 'webstaff.cat.copy.templates';
+
+            UPDATE actor.usr_setting
+            SET name = 'cat.copy.templates' 
+            WHERE name = 'webstaff.cat.copy.templates';
+
+        END IF;
+    END IF;
+
+END; 
+$SQL$;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1320', :eg_version); -- jboyer /  / 
+
+ALTER TABLE reporter.template_folder ADD COLUMN simple_reporter BOOLEAN DEFAULT FALSE;
+ALTER TABLE reporter.report_folder ADD COLUMN simple_reporter BOOLEAN DEFAULT FALSE;
+ALTER TABLE reporter.output_folder ADD COLUMN simple_reporter BOOLEAN DEFAULT FALSE;
+
+DROP INDEX reporter.rpt_template_folder_once_idx;
+DROP INDEX reporter.rpt_report_folder_once_idx;
+DROP INDEX reporter.rpt_output_folder_once_idx;
+
+CREATE UNIQUE INDEX rpt_template_folder_once_idx ON reporter.template_folder (name,owner,simple_reporter) WHERE parent IS NULL;
+CREATE UNIQUE INDEX rpt_report_folder_once_idx ON reporter.report_folder (name,owner,simple_reporter) WHERE parent IS NULL;
+CREATE UNIQUE INDEX rpt_output_folder_once_idx ON reporter.output_folder (name,owner,simple_reporter) WHERE parent IS NULL;
+
+-- Private "transform" to allow for simple report permissions verification
+CREATE OR REPLACE FUNCTION reporter.intersect_user_perm_ou(context_ou BIGINT, staff_id BIGINT, perm_code TEXT)
+RETURNS BOOLEAN AS $$
+  SELECT CASE WHEN context_ou IN (SELECT * FROM permission.usr_has_perm_at_all(staff_id::INT, perm_code)) THEN TRUE ELSE FALSE END;
+$$ LANGUAGE SQL;
+
+-- Hey committer, make sure this id is good to go and also in 950.data.seed-values.sql
+INSERT INTO permission.perm_list (id, code, description) VALUES
+ ( 638, 'RUN_SIMPLE_REPORTS', oils_i18n_gettext(638,
+    'Build and run simple reports', 'ppl', 'description'));
+
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.grid.reporter.simple.reports', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.reporter.simple.reports',
+        'Grid Config: eg.grid.reporter.simple.reports',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.reporter.simple.outputs', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.reporter.simple.outputs',
+        'Grid Config: eg.grid.reporter.simple.outputs',
+        'cwst', 'label'
+    )
+);
+
+-- new view parallel to reporter.currently_running
+-- and reporter.overdue_reports
+CREATE OR REPLACE VIEW reporter.completed_reports AS
+  SELECT s.id AS run,
+         r.id AS report,
+         t.id AS template,
+         t.owner AS template_owner,
+         r.owner AS report_owner,
+         s.runner AS runner,
+         t.folder AS template_folder,
+         r.folder AS report_folder,
+         s.folder AS output_folder,
+         r.name AS report_name,
+         t.name AS template_name,
+         s.start_time,
+         s.run_time,
+         s.complete_time,
+         s.error_code,
+         s.error_text
+  FROM reporter.schedule s
+    JOIN reporter.report r ON r.id = s.report
+    JOIN reporter.template t ON t.id = r.template
+  WHERE s.complete_time IS NOT NULL;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1321', :eg_version);
+
+CREATE TABLE asset.copy_inventory (
+    id                          SERIAL                      PRIMARY KEY,
+    inventory_workstation       INTEGER                     REFERENCES actor.workstation (id) DEFERRABLE INITIALLY DEFERRED,
+    inventory_date              TIMESTAMP WITH TIME ZONE    NOT NULL DEFAULT NOW(),
+    copy                        BIGINT                      NOT NULL
+);
+CREATE INDEX copy_inventory_copy_idx ON asset.copy_inventory (copy);
+CREATE UNIQUE INDEX asset_copy_inventory_date_once_per_copy ON asset.copy_inventory (inventory_date, copy);
+
+CREATE OR REPLACE FUNCTION evergreen.asset_copy_inventory_copy_inh_fkey() RETURNS TRIGGER AS $f$
+BEGIN
+        PERFORM 1 FROM asset.copy WHERE id = NEW.copy;
+        IF NOT FOUND THEN
+                RAISE foreign_key_violation USING MESSAGE = FORMAT(
+                        $$Referenced asset.copy id not found, copy:%s$$, NEW.copy
+                );
+        END IF;
+        RETURN NEW;
+END;
+$f$ LANGUAGE PLPGSQL VOLATILE COST 50;
+
+CREATE CONSTRAINT TRIGGER inherit_asset_copy_inventory_copy_fkey
+        AFTER UPDATE OR INSERT ON asset.copy_inventory
+        DEFERRABLE FOR EACH ROW EXECUTE PROCEDURE evergreen.asset_copy_inventory_copy_inh_fkey();
+
+CREATE OR REPLACE FUNCTION asset.copy_may_float_to_inventory_workstation() RETURNS TRIGGER AS $func$
+DECLARE
+    copy asset.copy%ROWTYPE;
+    workstation actor.workstation%ROWTYPE;
+BEGIN
+    SELECT * INTO copy FROM asset.copy WHERE id = NEW.copy;
+    IF FOUND THEN
+        SELECT * INTO workstation FROM actor.workstation WHERE id = NEW.inventory_workstation;
+        IF FOUND THEN
+           IF copy.floating IS NULL THEN
+              IF copy.circ_lib <> workstation.owning_lib THEN
+                 RAISE EXCEPTION 'Inventory workstation owning lib (%) does not match copy circ lib (%).',
+                       workstation.owning_lib, copy.circ_lib;
+              END IF;
+           ELSE
+              IF NOT evergreen.can_float(copy.floating, copy.circ_lib, workstation.owning_lib) THEN
+                 RAISE EXCEPTION 'Copy (%) cannot float to inventory workstation owning lib (%).',
+                       copy.id, workstation.owning_lib;
+              END IF;
+           END IF;
+        END IF;
+    END IF;
+    RETURN NEW;
+END;
+$func$ LANGUAGE PLPGSQL VOLATILE COST 50;
+
+CREATE CONSTRAINT TRIGGER asset_copy_inventory_allowed_trig
+        AFTER UPDATE OR INSERT ON asset.copy_inventory
+        DEFERRABLE FOR EACH ROW EXECUTE PROCEDURE asset.copy_may_float_to_inventory_workstation();
+
+INSERT INTO asset.copy_inventory
+(inventory_workstation, inventory_date, copy)
+SELECT DISTINCT ON (inventory_date, copy) inventory_workstation, inventory_date, copy
+FROM asset.latest_inventory
+JOIN asset.copy acp ON acp.id = latest_inventory.copy
+JOIN actor.workstation ON workstation.id = latest_inventory.inventory_workstation
+WHERE acp.circ_lib = workstation.owning_lib
+UNION
+SELECT DISTINCT ON (inventory_date, copy) inventory_workstation, inventory_date, copy
+FROM asset.latest_inventory
+JOIN asset.copy acp ON acp.id = latest_inventory.copy
+JOIN actor.workstation ON workstation.id = latest_inventory.inventory_workstation
+WHERE acp.circ_lib <> workstation.owning_lib
+AND acp.floating IS NOT NULL
+AND evergreen.can_float(acp.floating, acp.circ_lib, workstation.owning_lib)
+ORDER by inventory_date;
+
+DROP TABLE asset.latest_inventory;
+
+CREATE VIEW asset.latest_inventory (id, inventory_workstation, inventory_date, copy) AS
+SELECT DISTINCT ON (copy) id, inventory_workstation, inventory_date, copy
+FROM asset.copy_inventory
+ORDER BY copy, inventory_date DESC;
+
+DROP FUNCTION evergreen.asset_latest_inventory_copy_inh_fkey();
+
+
+SELECT evergreen.upgrade_deps_block_check('1322', :eg_version);
+
+INSERT into config.org_unit_setting_type
+( name, grp, label, description, datatype, fm_class ) VALUES
+( 'opac.patron.custom_jquery', 'opac',
+    oils_i18n_gettext('opac.patron.custom_jquery',
+        'Custom jQuery for the OPAC',
+        'coust', 'label'),
+    oils_i18n_gettext('opac.patron.custom_jquery',
+        'Custom jQuery for the OPAC',
+        'coust', 'description'),
+    'string', NULL);
+
+
+SELECT evergreen.upgrade_deps_block_check('1323', :eg_version);
+
+-- VIEWS for the oai service
+CREATE SCHEMA oai;
+
+-- The view presents a lean table with unique bre.tc-numbers for oai paging;
+CREATE VIEW oai.biblio AS
+  SELECT
+    bre.id                             AS rec_id,
+    bre.edit_date AT TIME ZONE 'UTC'   AS datestamp,
+    bre.deleted                        AS deleted
+  FROM
+    biblio.record_entry bre
+  ORDER BY
+    bre.id;
+
+-- The view presents a lean table with unique are.tc-numbers for oai paging;
+CREATE VIEW oai.authority AS
+  SELECT
+    are.id                           AS rec_id,
+    are.edit_date AT TIME ZONE 'UTC' AS datestamp,
+    are.deleted                      AS deleted
+  FROM
+    authority.record_entry AS are
+  ORDER BY
+    are.id;
+
+CREATE OR REPLACE function oai.bib_is_visible_at_org_by_copy(bib BIGINT, org INT) RETURNS BOOL AS $F$
+WITH corgs AS (SELECT array_agg(id) AS list FROM actor.org_unit_descendants(org))
+  SELECT EXISTS (SELECT 1 FROM asset.copy_vis_attr_cache, corgs WHERE vis_attr_vector @@ search.calculate_visibility_attribute_test('circ_lib', corgs.list)::query_int AND bib=record)
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE function oai.bib_is_visible_at_org_by_luri(bib BIGINT, org INT) RETURNS BOOL AS $F$
+WITH lorgs AS(SELECT array_agg(id) AS list FROM actor.org_unit_ancestors(org))
+  SELECT EXISTS (SELECT 1 FROM biblio.record_entry, lorgs WHERE vis_attr_vector @@ search.calculate_visibility_attribute_test('luri_org', lorgs.list)::query_int AND bib=id)
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE function oai.bib_is_visible_by_source(bib BIGINT, src TEXT) RETURNS BOOL AS $F$
+  SELECT EXISTS (SELECT 1 FROM biblio.record_entry b JOIN config.bib_source s ON (b.source = s.id) WHERE transcendant AND s.source = src AND bib=b.id)
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE function oai.auth_is_visible_by_axis(auth BIGINT, ax TEXT) RETURNS BOOL AS $F$
+  SELECT EXISTS (SELECT 1 FROM authority.browse_axis_authority_field_map m JOIN authority.simple_heading r on (r.atag = m.field AND r.record = auth AND m.axis = ax))
+$F$ LANGUAGE SQL STABLE;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1324', :eg_version);
+
+CREATE TABLE action_trigger.alternate_template (
+      id               SERIAL,
+      event_def        INTEGER REFERENCES action_trigger.event_definition(id) INITIALLY DEFERRED,
+      template         TEXT,
+      active           BOOLEAN DEFAULT TRUE,
+      message_title    TEXT,
+      message_template TEXT,
+      locale           TEXT REFERENCES config.i18n_locale(code) INITIALLY DEFERRED,
+      UNIQUE (event_def,locale)
+);
+
+ALTER TABLE actor.usr ADD COLUMN locale TEXT REFERENCES config.i18n_locale(code) INITIALLY DEFERRED;
+
+ALTER TABLE action_trigger.event_output ADD COLUMN locale TEXT;
+
+
+SELECT evergreen.upgrade_deps_block_check('1325', :eg_version);
+
+UPDATE config.xml_transform SET xslt=$XSLT$<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:mads="http://www.loc.gov/mads/v2"
+       xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:marc="http://www.loc.gov/MARC21/slim"
+       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="marc">
+       <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
+       <xsl:strip-space elements="*"/>
+
+       <xsl:variable name="ascii">
+               <xsl:text> !"#$%&amp;'()*+,-./0123456789:;&lt;=&gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~</xsl:text>
+       </xsl:variable>
+
+       <xsl:variable name="latin1">
+               <xsl:text> ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ</xsl:text>
+       </xsl:variable>
+       <!-- Characters that usually don't need to be escaped -->
+       <xsl:variable name="safe">
+               <xsl:text>!'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~</xsl:text>
+       </xsl:variable>
+
+       <xsl:variable name="hex">0123456789ABCDEF</xsl:variable>
+
+
+       <xsl:template name="datafield">
+               <xsl:param name="tag"/>
+               <xsl:param name="ind1">
+                       <xsl:text> </xsl:text>
+               </xsl:param>
+               <xsl:param name="ind2">
+                       <xsl:text> </xsl:text>
+               </xsl:param>
+               <xsl:param name="subfields"/>
+               <xsl:element name="marc:datafield">
+                       <xsl:attribute name="tag">
+                               <xsl:value-of select="$tag"/>
+                       </xsl:attribute>
+                       <xsl:attribute name="ind1">
+                               <xsl:value-of select="$ind1"/>
+                       </xsl:attribute>
+                       <xsl:attribute name="ind2">
+                               <xsl:value-of select="$ind2"/>
+                       </xsl:attribute>
+                       <xsl:copy-of select="$subfields"/>
+               </xsl:element>
+       </xsl:template>
+
+       <xsl:template name="subfieldSelect">
+               <xsl:param name="codes">abcdefghijklmnopqrstuvwxyz</xsl:param>
+               <xsl:param name="delimeter">
+                       <xsl:text> </xsl:text>
+               </xsl:param>
+               <xsl:variable name="str">
+                       <xsl:for-each select="marc:subfield">
+                               <xsl:if test="contains($codes, @code)">
+                                       <xsl:value-of select="text()"/>
+                                       <xsl:value-of select="$delimeter"/>
+                               </xsl:if>
+                       </xsl:for-each>
+               </xsl:variable>
+               <xsl:value-of select="substring($str,1,string-length($str)-string-length($delimeter))"/>
+       </xsl:template>
+
+       <xsl:template name="buildSpaces">
+               <xsl:param name="spaces"/>
+               <xsl:param name="char">
+                       <xsl:text> </xsl:text>
+               </xsl:param>
+               <xsl:if test="$spaces>0">
+                       <xsl:value-of select="$char"/>
+                       <xsl:call-template name="buildSpaces">
+                               <xsl:with-param name="spaces" select="$spaces - 1"/>
+                               <xsl:with-param name="char" select="$char"/>
+                       </xsl:call-template>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="chopPunctuation">
+               <xsl:param name="chopString"/>
+               <xsl:param name="punctuation">
+                       <xsl:text>.:,;/ </xsl:text>
+               </xsl:param>
+               <xsl:variable name="length" select="string-length($chopString)"/>
+               <xsl:choose>
+                       <xsl:when test="$length=0"/>
+                       <xsl:when test="contains($punctuation, substring($chopString,$length,1))">
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
+                                       <xsl:with-param name="punctuation" select="$punctuation"/>
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:when test="not($chopString)"/>
+                       <xsl:otherwise>
+                               <xsl:value-of select="$chopString"/>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+
+       <xsl:template name="chopPunctuationFront">
+               <xsl:param name="chopString"/>
+               <xsl:variable name="length" select="string-length($chopString)"/>
+               <xsl:choose>
+                       <xsl:when test="$length=0"/>
+                       <xsl:when test="contains('.:,;/[ ', substring($chopString,1,1))">
+                               <xsl:call-template name="chopPunctuationFront">
+                                       <xsl:with-param name="chopString" select="substring($chopString,2,$length - 1)"
+                                       />
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:when test="not($chopString)"/>
+                       <xsl:otherwise>
+                               <xsl:value-of select="$chopString"/>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+
+       <xsl:template name="chopPunctuationBack">
+               <xsl:param name="chopString"/>
+               <xsl:param name="punctuation">
+                       <xsl:text>.:,;/] </xsl:text>
+               </xsl:param>
+               <xsl:variable name="length" select="string-length($chopString)"/>
+               <xsl:choose>
+                       <xsl:when test="$length=0"/>
+                       <xsl:when test="contains($punctuation, substring($chopString,$length,1))">
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
+                                       <xsl:with-param name="punctuation" select="$punctuation"/>
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:when test="not($chopString)"/>
+                       <xsl:otherwise>
+                               <xsl:value-of select="$chopString"/>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+
+       <!-- nate added 12/14/2007 for lccn.loc.gov: url encode ampersand, etc. -->
+       <xsl:template name="url-encode">
+
+               <xsl:param name="str"/>
+
+               <xsl:if test="$str">
+                       <xsl:variable name="first-char" select="substring($str,1,1)"/>
+                       <xsl:choose>
+                               <xsl:when test="contains($safe,$first-char)">
+                                       <xsl:value-of select="$first-char"/>
+                               </xsl:when>
+                               <xsl:otherwise>
+                                       <xsl:variable name="codepoint">
+                                               <xsl:choose>
+                                                       <xsl:when test="contains($ascii,$first-char)">
+                                                               <xsl:value-of
+                                                                       select="string-length(substring-before($ascii,$first-char)) + 32"
+                                                               />
+                                                       </xsl:when>
+                                                       <xsl:when test="contains($latin1,$first-char)">
+                                                               <xsl:value-of
+                                                                       select="string-length(substring-before($latin1,$first-char)) + 160"/>
+                                                               <!-- was 160 -->
+                                                       </xsl:when>
+                                                       <xsl:otherwise>
+                                                               <xsl:message terminate="no">Warning: string contains a character
+                                                                       that is out of range! Substituting "?".</xsl:message>
+                                                               <xsl:text>63</xsl:text>
+                                                       </xsl:otherwise>
+                                               </xsl:choose>
+                                       </xsl:variable>
+                                       <xsl:variable name="hex-digit1"
+                                               select="substring($hex,floor($codepoint div 16) + 1,1)"/>
+                                       <xsl:variable name="hex-digit2" select="substring($hex,$codepoint mod 16 + 1,1)"/>
+                                       <!-- <xsl:value-of select="concat('%',$hex-digit2)"/> -->
+                                       <xsl:value-of select="concat('%',$hex-digit1,$hex-digit2)"/>
+                               </xsl:otherwise>
+                       </xsl:choose>
+                       <xsl:if test="string-length($str) &gt; 1">
+                               <xsl:call-template name="url-encode">
+                                       <xsl:with-param name="str" select="substring($str,2)"/>
+                               </xsl:call-template>
+                       </xsl:if>
+               </xsl:if>
+       </xsl:template>
+
+
+<!--
+2.15  reversed genre and setAuthority template order under relatedTypeAttribute                       tmee 11/13/2018
+2.14    Fixed bug in mads:geographic attributes syntax                                      ws   05/04/2016            
+2.13   fixed repeating <geographic>                                                                                                            tmee 01/31/2014
+2.12   added $2 authority for <classification>                                                                                         tmee 09/18/2012
+2.11   added delimiters between <classification> subfields                                                                     tmee 09/18/2012
+2.10   fixed type="other" and type="otherType" for mads:related                                                        tmee 09/16/2011
+2.09   fixed professionTerm and genreTerm empty tag error                                                                      tmee 09/16/2011
+2.08   fixed marc:subfield @code='i' matching error                                                                            tmee 09/16/2011
+2.07   fixed 555 duplication error                                                                                                                     tmee 08/10/2011 
+2.06   fixed topic subfield error                                                                                                                      tmee 08/10/2011 
+2.05   fixed title subfield error                                                                                                                      tmee 06/20/2011 
+2.04   fixed geographicSubdivision mapping for authority element                                                       tmee 06/16/2011
+2.03   added classification for 053, 055, 060, 065, 070, 080, 082, 083, 086, 087                       tmee 06/03/2011         
+2.02   added descriptionStandard for 008/10                                                                                            tmee 04/27/2011
+2.01   added extensions for 046, 336, 370, 374, 375, 376                                                                       tmee 04/08/2011
+2.00   redefined imported MODS elements in version 1.0 to MADS elements in version 2.0         tmee 02/08/2011
+1.08   added 372 subfields $a $s $t for <fieldOfActivity>                                                                      tmee 06/24/2010
+1.07   removed role/roleTerm 100, 110, 111, 400, 410, 411, 500, 510, 511, 700, 710, 711        tmee 06/24/2010
+1.06   added strip-space                                                                                                                                       tmee 06/24/2010
+1.05   added subfield $a for 130, 430, 530                                                                                                     tmee 06/21/2010
+1.04   fixed 550 z omission                                                                                                                            ntra 08/11/2008
+1.03   removed duplication of 550 $a text                                                                                                      tmee 11/01/2006
+1.02   fixed namespace references between mads and mods                                                                        ntra 10/06/2006
+1.01   revised                                                                                                                                                         rgue/jrad 11/29/05
+1.00   adapted from MARC21Slim2MODS3.xsl                                                                                                       ntra 07/06/05
+-->
+
+       <!-- authority attribute defaults to 'naf' if not set using this authority parameter, for <authority> descriptors: name, titleInfo, geographic -->
+       <xsl:param name="authority"/>
+       <xsl:variable name="auth">
+               <xsl:choose>
+                       <xsl:when test="$authority">
+                               <xsl:value-of select="$authority"/>
+                       </xsl:when>
+                       <xsl:otherwise>naf</xsl:otherwise>
+               </xsl:choose>
+       </xsl:variable>
+       <xsl:variable name="controlField008" select="marc:controlfield[@tag='008']"/>
+       <xsl:variable name="controlField008-06"
+               select="substring(descendant-or-self::marc:controlfield[@tag=008],7,1)"/>
+       <xsl:variable name="controlField008-11"
+               select="substring(descendant-or-self::marc:controlfield[@tag=008],12,1)"/>
+       <xsl:variable name="controlField008-14"
+               select="substring(descendant-or-self::marc:controlfield[@tag=008],15,1)"/>
+       <xsl:template match="/">
+               <xsl:choose>
+                       <xsl:when test="descendant-or-self::marc:collection">
+                               <mads:madsCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                                       xsi:schemaLocation="http://www.loc.gov/mads/v2 http://www.loc.gov/standards/mads/v2/mads-2-0.xsd">
+                                       <xsl:for-each select="descendant-or-self::marc:collection/marc:record">
+                                               <mads:mads version="2.0">
+                                                       <xsl:call-template name="marcRecord"/>
+                                               </mads:mads>
+                                       </xsl:for-each>
+                               </mads:madsCollection>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <mads:mads version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                                       xsi:schemaLocation="http://www.loc.gov/mads/v2 http://www.loc.gov/standards/mads/mads-2-0.xsd">
+                                       <xsl:for-each select="descendant-or-self::marc:record">
+                                               <xsl:call-template name="marcRecord"/>
+                                       </xsl:for-each>
+                               </mads:mads>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+
+       <xsl:template name="marcRecord">
+               <mads:authority>
+                       <!-- 2.04 -->
+                       <xsl:choose>
+                               <xsl:when test="$controlField008-06='d'">
+                                       <xsl:attribute name="geographicSubdivision">
+                                               <xsl:text>direct</xsl:text>
+                                       </xsl:attribute>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-06='i'">
+                                       <xsl:attribute name="geographicSubdivision">
+                                               <xsl:text>indirect</xsl:text>
+                                       </xsl:attribute>
+                               </xsl:when>
+                               <xsl:when test="$controlField008-06='n'">
+                                       <xsl:attribute name="geographicSubdivision">
+                                               <xsl:text>not applicable</xsl:text>
+                                       </xsl:attribute>
+                               </xsl:when>
+                       </xsl:choose>
+                       
+                       <xsl:apply-templates select="marc:datafield[100 &lt;= @tag  and @tag &lt; 200]"/>               
+               </mads:authority>
+
+               <!-- related -->
+               <xsl:apply-templates
+                       select="marc:datafield[500 &lt;= @tag and @tag &lt;= 585]|marc:datafield[700 &lt;= @tag and @tag &lt;= 785]"/>
+
+               <!-- variant -->
+               <xsl:apply-templates select="marc:datafield[400 &lt;= @tag and @tag &lt;= 485]"/>
+
+               <!-- notes -->
+               <xsl:apply-templates select="marc:datafield[667 &lt;= @tag and @tag &lt;= 688]"/>
+
+               <!-- url -->
+               <xsl:apply-templates select="marc:datafield[@tag=856]"/>
+               <xsl:apply-templates select="marc:datafield[@tag=010]"/>
+               <xsl:apply-templates select="marc:datafield[@tag=024]"/>
+               <xsl:apply-templates select="marc:datafield[@tag=372]"/>
+               
+               <!-- classification -->
+               <xsl:apply-templates select="marc:datafield[@tag=053]"/>
+               <xsl:apply-templates select="marc:datafield[@tag=055]"/>
+               <xsl:apply-templates select="marc:datafield[@tag=060]"/>
+               <xsl:apply-templates select="marc:datafield[@tag=065]"/>
+               <xsl:apply-templates select="marc:datafield[@tag=070]"/>
+               <xsl:apply-templates select="marc:datafield[@tag=080]"/>
+               <xsl:apply-templates select="marc:datafield[@tag=082]"/>
+               <xsl:apply-templates select="marc:datafield[@tag=083]"/>
+               <xsl:apply-templates select="marc:datafield[@tag=086]"/>
+               <xsl:apply-templates select="marc:datafield[@tag=087]"/>
+
+               <!-- affiliation-->
+               <xsl:for-each select="marc:datafield[@tag=373]">
+                       <mads:affiliation>
+                               <mads:position>
+                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                               </mads:position>
+                               <mads:dateValid point="start">
+                                       <xsl:value-of select="marc:subfield[@code='s']"/>
+                               </mads:dateValid>
+                               <mads:dateValid point="end">
+                                       <xsl:value-of select="marc:subfield[@code='t']"/>
+                               </mads:dateValid>
+                       </mads:affiliation>
+               </xsl:for-each>
+               <xsl:for-each select="marc:datafield[@tag=371]">
+                       <mads:affiliation>
+                               <mads:address>
+                                       <mads:street>
+                                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                                       </mads:street>
+                                       <mads:city>
+                                               <xsl:value-of select="marc:subfield[@code='b']"/>
+                                       </mads:city>
+                                       <mads:state>
+                                               <xsl:value-of select="marc:subfield[@code='c']"/>
+                                       </mads:state>
+                                       <mads:country>
+                                               <xsl:value-of select="marc:subfield[@code='d']"/>
+                                       </mads:country>
+                                       <mads:postcode>
+                                               <xsl:value-of select="marc:subfield[@code='e']"/>
+                                       </mads:postcode>
+                               </mads:address>
+                               <mads:email>
+                                       <xsl:value-of select="marc:subfield[@code='m']"/>
+                               </mads:email>
+                       </mads:affiliation>
+               </xsl:for-each>
+
+               <!-- extension-->
+               <xsl:for-each select="marc:datafield[@tag=336]">
+                       <mads:extension>
+                               <mads:contentType>
+                                       <mads:contentType type="text">
+                                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                                       </mads:contentType>
+                                       <mads:contentType type="code">
+                                               <xsl:value-of select="marc:subfield[@code='b']"/>
+                                       </mads:contentType>
+                               </mads:contentType>
+                       </mads:extension>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=374]">
+                       <mads:extension>
+                               <mads:profession>
+                                       <xsl:choose>
+                                               <xsl:when test="marc:subfield[@code='a']">
+                                                       <mads:professionTerm>
+                                                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                                                       </mads:professionTerm>
+                                               </xsl:when>
+                                               <xsl:when test="marc:subfield[@code='s']">
+                                                       <mads:dateValid point="start">
+                                                               <xsl:value-of select="marc:subfield[@code='s']"/>
+                                                       </mads:dateValid>
+                                               </xsl:when>
+                                               <xsl:when test="marc:subfield[@code='t']">
+                                                       <mads:dateValid point="end">
+                                                               <xsl:value-of select="marc:subfield[@code='t']"/>
+                                                       </mads:dateValid>
+                                               </xsl:when>
+                                       </xsl:choose>
+                               </mads:profession>
+                       </mads:extension>
+               </xsl:for-each>
+               
+               <xsl:for-each select="marc:datafield[@tag=375]">
+                       <mads:extension>
+                               <mads:gender>
+                                       <xsl:choose>
+                                               <xsl:when test="marc:subfield[@code='a']">
+                                                       <mads:genderTerm>
+                                                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                                                       </mads:genderTerm>
+                                               </xsl:when>
+                                               <xsl:when test="marc:subfield[@code='s']">
+                                                       <mads:dateValid point="start">
+                                                               <xsl:value-of select="marc:subfield[@code='s']"/>
+                                                       </mads:dateValid>
+                                               </xsl:when>
+                                               <xsl:when test="marc:subfield[@code='t']">
+                                                       <mads:dateValid point="end">
+                                                               <xsl:value-of select="marc:subfield[@code='t']"/>
+                                                       </mads:dateValid>
+                                               </xsl:when>
+                                       </xsl:choose>
+                               </mads:gender>
+                       </mads:extension>
+               </xsl:for-each>
+
+               <xsl:for-each select="marc:datafield[@tag=376]">
+                       <mads:extension>
+                               <mads:familyInformation>
+                                       <mads:typeOfFamily>
+                                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                                       </mads:typeOfFamily>
+                                       <mads:nameOfProminentMember>
+                                               <xsl:value-of select="marc:subfield[@code='b']"/>
+                                       </mads:nameOfProminentMember>
+                                       <mads:hereditaryTitle>
+                                               <xsl:value-of select="marc:subfield[@code='c']"/>
+                                       </mads:hereditaryTitle>
+                                       <mads:dateValid point="start">
+                                               <xsl:value-of select="marc:subfield[@code='s']"/>
+                                       </mads:dateValid>
+                                       <mads:dateValid point="end">
+                                               <xsl:value-of select="marc:subfield[@code='t']"/>
+                                       </mads:dateValid>
+                               </mads:familyInformation>
+                       </mads:extension>
+               </xsl:for-each>
+
+               <mads:recordInfo>
+                       <mads:recordOrigin>Converted from MARCXML to MADS version 2.0 (Revision 2.13)</mads:recordOrigin>
+                       <!-- <xsl:apply-templates select="marc:datafield[@tag=024]"/> -->
+
+                       <xsl:apply-templates select="marc:datafield[@tag=040]/marc:subfield[@code='a']"/>
+                       <xsl:apply-templates select="marc:controlfield[@tag=005]"/>
+                       <xsl:apply-templates select="marc:controlfield[@tag=001]"/>
+                       <xsl:apply-templates select="marc:datafield[@tag=040]/marc:subfield[@code='b']"/>
+                       <xsl:apply-templates select="marc:datafield[@tag=040]/marc:subfield[@code='e']"/>
+                       <xsl:for-each select="marc:controlfield[@tag=008]">
+                               <xsl:if test="substring(.,11,1)='a'">
+                                       <mads:descriptionStandard>
+                                               <xsl:text>earlier rules</xsl:text>
+                                       </mads:descriptionStandard>
+                               </xsl:if>
+                               <xsl:if test="substring(.,11,1)='b'">
+                                       <mads:descriptionStandard>
+                                               <xsl:text>aacr1</xsl:text>
+                                       </mads:descriptionStandard>
+                               </xsl:if>
+                               <xsl:if test="substring(.,11,1)='c'">
+                                       <mads:descriptionStandard>
+                                               <xsl:text>aacr2</xsl:text>
+                                       </mads:descriptionStandard>
+                               </xsl:if>
+                               <xsl:if test="substring(.,11,1)='d'">
+                                       <mads:descriptionStandard>
+                                               <xsl:text>aacr2 compatible</xsl:text>
+                                       </mads:descriptionStandard>
+                               </xsl:if>
+                               <xsl:if test="substring(.,11,1)='z'">
+                                       <mads:descriptionStandard>
+                                               <xsl:text>other rules</xsl:text>
+                                       </mads:descriptionStandard>
+                               </xsl:if>
+                       </xsl:for-each>
+               </mads:recordInfo>
+       </xsl:template>
+
+       <!-- start of secondary templates -->
+
+       <!-- ======== xlink ======== -->
+
+       <!-- <xsl:template name="uri"> 
+    <xsl:for-each select="marc:subfield[@code='0']">
+      <xsl:attribute name="xlink:href">
+       <xsl:value-of select="."/>
+      </xsl:attribute>
+    </xsl:for-each>
+     </xsl:template> 
+   -->
+       <xsl:template match="marc:subfield[@code='i']">
+               <xsl:attribute name="otherType">
+                       <xsl:value-of select="."/>
+               </xsl:attribute>
+       </xsl:template>
+
+       <!-- No role/roleTerm mapped in MADS 06/24/2010
+       <xsl:template name="role">
+               <xsl:for-each select="marc:subfield[@code='e']">
+                       <mads:role>
+                               <mads:roleTerm type="text">
+                                       <xsl:value-of select="."/>
+                               </mads:roleTerm>
+                       </mads:role>
+               </xsl:for-each>
+       </xsl:template>
+-->
+
+       <xsl:template name="part">
+               <xsl:variable name="partNumber">
+                       <xsl:call-template name="specialSubfieldSelect">
+                               <xsl:with-param name="axis">n</xsl:with-param>
+                               <xsl:with-param name="anyCodes">n</xsl:with-param>
+                               <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
+                       </xsl:call-template>
+               </xsl:variable>
+               <xsl:variable name="partName">
+                       <xsl:call-template name="specialSubfieldSelect">
+                               <xsl:with-param name="axis">p</xsl:with-param>
+                               <xsl:with-param name="anyCodes">p</xsl:with-param>
+                               <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
+                       </xsl:call-template>
+               </xsl:variable>
+               <xsl:if test="string-length(normalize-space($partNumber))">
+                       <mads:partNumber>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="$partNumber"/>
+                               </xsl:call-template>
+                       </mads:partNumber>
+               </xsl:if>
+               <xsl:if test="string-length(normalize-space($partName))">
+                       <mads:partName>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="$partName"/>
+                               </xsl:call-template>
+                       </mads:partName>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="nameABCDN">
+               <xsl:for-each select="marc:subfield[@code='a']">
+                       <mads:namePart>
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="."/>
+                               </xsl:call-template>
+                       </mads:namePart>
+               </xsl:for-each>
+               <xsl:for-each select="marc:subfield[@code='b']">
+                       <mads:namePart>
+                               <xsl:value-of select="."/>
+                       </mads:namePart>
+               </xsl:for-each>
+               <xsl:if
+                       test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
+                       <mads:namePart>
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">cdn</xsl:with-param>
+                               </xsl:call-template>
+                       </mads:namePart>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="nameABCDQ">
+               <mads:namePart>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString">
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">aq</xsl:with-param>
+                                       </xsl:call-template>
+                               </xsl:with-param>
+                       </xsl:call-template>
+               </mads:namePart>
+               <xsl:call-template name="termsOfAddress"/>
+               <xsl:call-template name="nameDate"/>
+       </xsl:template>
+
+       <xsl:template name="nameACDENQ">
+               <mads:namePart>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">acdenq</xsl:with-param>
+                       </xsl:call-template>
+               </mads:namePart>
+       </xsl:template>
+
+       <xsl:template name="nameDate">
+               <xsl:for-each select="marc:subfield[@code='d']">
+                       <mads:namePart type="date">
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString" select="."/>
+                               </xsl:call-template>
+                       </mads:namePart>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template name="specialSubfieldSelect">
+               <xsl:param name="anyCodes"/>
+               <xsl:param name="axis"/>
+               <xsl:param name="beforeCodes"/>
+               <xsl:param name="afterCodes"/>
+               <xsl:variable name="str">
+                       <xsl:for-each select="marc:subfield">
+                               <xsl:if
+                                       test="contains($anyCodes, @code) or (contains($beforeCodes,@code) and following-sibling::marc:subfield[@code=$axis]) or (contains($afterCodes,@code) and preceding-sibling::marc:subfield[@code=$axis])">
+                                       <xsl:value-of select="text()"/>
+                                       <xsl:text> </xsl:text>
+                               </xsl:if>
+                       </xsl:for-each>
+               </xsl:variable>
+               <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+       </xsl:template>
+
+       <xsl:template name="termsOfAddress">
+               <xsl:if test="marc:subfield[@code='b' or @code='c']">
+                       <mads:namePart type="termsOfAddress">
+                               <xsl:call-template name="chopPunctuation">
+                                       <xsl:with-param name="chopString">
+                                               <xsl:call-template name="subfieldSelect">
+                                                       <xsl:with-param name="codes">bc</xsl:with-param>
+                                               </xsl:call-template>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </mads:namePart>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="displayLabel">
+               <xsl:if test="marc:subfield[@code='z']">
+                       <xsl:attribute name="displayLabel">
+                               <xsl:value-of select="marc:subfield[@code='z']"/>
+                       </xsl:attribute>
+               </xsl:if>
+               <xsl:if test="marc:subfield[@code='3']">
+                       <xsl:attribute name="displayLabel">
+                               <xsl:value-of select="marc:subfield[@code='3']"/>
+                       </xsl:attribute>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="isInvalid">
+               <xsl:if test="@code='z'">
+                       <xsl:attribute name="invalid">yes</xsl:attribute>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="sub2Attribute">
+               <!-- 024 -->
+               <xsl:if test="../marc:subfield[@code='2']">
+                       <xsl:attribute name="type">
+                               <xsl:value-of select="../marc:subfield[@code='2']"/>
+                       </xsl:attribute>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template match="marc:controlfield[@tag=001]">
+               <mads:recordIdentifier>
+                       <xsl:if test="../marc:controlfield[@tag=003]">
+                               <xsl:attribute name="source">
+                                       <xsl:value-of select="../marc:controlfield[@tag=003]"/>
+                               </xsl:attribute>
+                       </xsl:if>
+                       <xsl:value-of select="."/>
+               </mads:recordIdentifier>
+       </xsl:template>
+
+       <xsl:template match="marc:controlfield[@tag=005]">
+               <mads:recordChangeDate encoding="iso8601">
+                       <xsl:value-of select="."/>
+               </mads:recordChangeDate>
+       </xsl:template>
+
+       <xsl:template match="marc:controlfield[@tag=008]">
+               <mads:recordCreationDate encoding="marc">
+                       <xsl:value-of select="substring(.,1,6)"/>
+               </mads:recordCreationDate>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=010]">
+               <xsl:for-each select="marc:subfield">
+                       <mads:identifier type="lccn">
+                               <xsl:call-template name="isInvalid"/>
+                               <xsl:value-of select="."/>
+                       </mads:identifier>
+               </xsl:for-each>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=024]">
+               <xsl:for-each select="marc:subfield[not(@code=2)]">
+                       <mads:identifier>
+                               <xsl:call-template name="isInvalid"/>
+                               <xsl:call-template name="sub2Attribute"/>
+                               <xsl:value-of select="."/>
+                       </mads:identifier>
+               </xsl:for-each>
+       </xsl:template>
+
+       <!-- ========== 372 ========== -->
+       <xsl:template match="marc:datafield[@tag=372]">
+               <mads:fieldOfActivity>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">a</xsl:with-param>
+                       </xsl:call-template>
+                       <xsl:text>-</xsl:text>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">st</xsl:with-param>
+                       </xsl:call-template>
+               </mads:fieldOfActivity>
+       </xsl:template>
+
+
+       <!-- ========== 040 ========== -->
+       <xsl:template match="marc:datafield[@tag=040]/marc:subfield[@code='a']">
+               <mads:recordContentSource authority="marcorg">
+                       <xsl:value-of select="."/>
+               </mads:recordContentSource>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=040]/marc:subfield[@code='b']">
+               <mads:languageOfCataloging>
+                       <mads:languageTerm authority="iso639-2b" type="code">
+                               <xsl:value-of select="."/>
+                       </mads:languageTerm>
+               </mads:languageOfCataloging>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=040]/marc:subfield[@code='e']">
+               <mads:descriptionStandard>
+                       <xsl:value-of select="."/>
+               </mads:descriptionStandard>
+       </xsl:template>
+       
+       <!-- ========== classification 2.03 ========== -->
+       
+       <xsl:template match="marc:datafield[@tag=053]">
+               <mads:classification>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">abcdxyz</xsl:with-param>
+                               <xsl:with-param name="delimeter">-</xsl:with-param>
+                       </xsl:call-template>
+               </mads:classification>
+       </xsl:template>
+       
+       <xsl:template match="marc:datafield[@tag=055]">
+               <mads:classification>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">abcdxyz</xsl:with-param>
+                               <xsl:with-param name="delimeter">-</xsl:with-param>
+                       </xsl:call-template>
+               </mads:classification>
+       </xsl:template>
+       
+       <xsl:template match="marc:datafield[@tag=060]">
+               <mads:classification>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">abcdxyz</xsl:with-param>
+                               <xsl:with-param name="delimeter">-</xsl:with-param>
+                       </xsl:call-template>
+               </mads:classification>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=065]">
+               <mads:classification>
+                       <xsl:attribute name="authority">
+                               <xsl:value-of select="marc:subfield[@code='2']"/>
+                       </xsl:attribute>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">abcdxyz</xsl:with-param>
+                               <xsl:with-param name="delimeter">-</xsl:with-param>
+                       </xsl:call-template>
+               </mads:classification>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=070]">
+               <mads:classification>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+                               <xsl:with-param name="delimeter">-</xsl:with-param>
+                       </xsl:call-template>
+               </mads:classification>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=080]">
+               <mads:classification>
+                       <xsl:attribute name="authority">
+                               <xsl:value-of select="marc:subfield[@code='2']"/>
+                       </xsl:attribute>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+                               <xsl:with-param name="delimeter">-</xsl:with-param>
+                       </xsl:call-template>
+               </mads:classification>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=082]">
+               <mads:classification>
+                       <xsl:attribute name="authority">
+                               <xsl:value-of select="marc:subfield[@code='2']"/>
+                       </xsl:attribute>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+                               <xsl:with-param name="delimeter">-</xsl:with-param>
+                       </xsl:call-template>
+               </mads:classification>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=083]">
+               <mads:classification>
+                       <xsl:attribute name="authority">
+                               <xsl:value-of select="marc:subfield[@code='2']"/>
+                       </xsl:attribute>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+                               <xsl:with-param name="delimeter">-</xsl:with-param>
+                       </xsl:call-template>
+               </mads:classification>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=086]">
+               <mads:classification>
+                       <xsl:attribute name="authority">
+                               <xsl:value-of select="marc:subfield[@code='2']"/>
+                       </xsl:attribute>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+                               <xsl:with-param name="delimeter">-</xsl:with-param>
+                       </xsl:call-template>
+               </mads:classification>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=087]">
+               <mads:classification>
+                       <xsl:attribute name="authority">
+                               <xsl:value-of select="marc:subfield[@code='2']"/>
+                       </xsl:attribute>
+                       <xsl:call-template name="subfieldSelect">
+                               <xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+                               <xsl:with-param name="delimeter">-</xsl:with-param>
+                       </xsl:call-template>
+               </mads:classification>
+       </xsl:template>
+       
+
+       <!-- ========== names  ========== -->
+       <xsl:template match="marc:datafield[@tag=100]">
+               <mads:name type="personal">
+                       <xsl:call-template name="setAuthority"/>
+                       <xsl:call-template name="nameABCDQ"/>
+               </mads:name>
+               <xsl:apply-templates select="*[marc:subfield[not(contains('abcdeq',@code))]]"/>
+               <xsl:call-template name="title"/>
+               <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=110]">
+               <mads:name type="corporate">
+                       <xsl:call-template name="setAuthority"/>
+                       <xsl:call-template name="nameABCDN"/>
+               </mads:name>
+               <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=111]">
+               <mads:name type="conference">
+                       <xsl:call-template name="setAuthority"/>
+                       <xsl:call-template name="nameACDENQ"/>
+               </mads:name>
+               <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=400]">
+               <mads:variant>
+                       <xsl:call-template name="variantTypeAttribute"/>
+                       <mads:name type="personal">
+                               <xsl:call-template name="nameABCDQ"/>
+                       </mads:name>
+                       <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+                       <xsl:call-template name="title"/>
+               </mads:variant>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=410]">
+               <mads:variant>
+                       <xsl:call-template name="variantTypeAttribute"/>
+                       <mads:name type="corporate">
+                               <xsl:call-template name="nameABCDN"/>
+                       </mads:name>
+                       <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+               </mads:variant>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=411]">
+               <mads:variant>
+                       <xsl:call-template name="variantTypeAttribute"/>
+                       <mads:name type="conference">
+                               <xsl:call-template name="nameACDENQ"/>
+                       </mads:name>
+                       <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+               </mads:variant>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=500]|marc:datafield[@tag=700]">
+               <mads:related>
+                       <xsl:call-template name="relatedTypeAttribute"/>
+                       <!-- <xsl:call-template name="uri"/> -->
+                       <mads:name type="personal">
+                               <xsl:call-template name="setAuthority"/>
+                               <xsl:call-template name="nameABCDQ"/>
+                       </mads:name>
+                       <xsl:call-template name="title"/>
+                       <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+               </mads:related>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=510]|marc:datafield[@tag=710]">
+               <mads:related>
+                       <xsl:call-template name="relatedTypeAttribute"/>
+                       <!-- <xsl:call-template name="uri"/> -->
+                       <mads:name type="corporate">
+                               <xsl:call-template name="setAuthority"/>
+                               <xsl:call-template name="nameABCDN"/>
+                       </mads:name>
+                       <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+               </mads:related>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=511]|marc:datafield[@tag=711]">
+               <mads:related>
+                       <xsl:call-template name="relatedTypeAttribute"/>
+                       <!-- <xsl:call-template name="uri"/> -->
+                       <mads:name type="conference">
+                               <xsl:call-template name="setAuthority"/>
+                               <xsl:call-template name="nameACDENQ"/>
+                       </mads:name>
+                       <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+               </mads:related>
+       </xsl:template>
+
+       <!-- ========== titles  ========== -->
+       <xsl:template match="marc:datafield[@tag=130]">
+               <xsl:call-template name="uniform-title"/>
+               <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=430]">
+               <mads:variant>
+                       <xsl:call-template name="variantTypeAttribute"/>
+                       <xsl:call-template name="uniform-title"/>
+                       <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+               </mads:variant>
+       </xsl:template>
+
+       <xsl:template match="marc:datafield[@tag=530]|marc:datafield[@tag=730]">
+               <mads:related>
+                       <xsl:call-template name="relatedTypeAttribute"/>
+                       <xsl:call-template name="uniform-title"/>
+                       <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+               </mads:related>
+       </xsl:template>
+
+       <xsl:template name="title">
+               <xsl:variable name="hasTitle">
+                       <xsl:for-each select="marc:subfield">
+                               <xsl:if test="(contains('tfghklmors',@code) )">
+                                       <xsl:value-of select="@code"/>
+                               </xsl:if>
+                       </xsl:for-each>
+               </xsl:variable>
+               <xsl:if test="string-length($hasTitle) &gt; 0 ">
+                       <mads:titleInfo>
+                               <xsl:call-template name="setAuthority"/>
+                               <mads:title>
+                                       <xsl:variable name="str">
+                                               <xsl:for-each select="marc:subfield">
+                                                       <xsl:if test="(contains('atfghklmors',@code) )">
+                                                               <xsl:value-of select="text()"/>
+                                                               <xsl:text> </xsl:text>
+                                                       </xsl:if>
+                                               </xsl:for-each>
+                                       </xsl:variable>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </mads:title>
+                               <xsl:call-template name="part"/>
+                               <!-- <xsl:call-template name="uri"/> -->
+                       </mads:titleInfo>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template name="uniform-title">
+               <xsl:variable name="hasTitle">
+                       <xsl:for-each select="marc:subfield">
+                               <xsl:if test="(contains('atfghklmors',@code) )">
+                                       <xsl:value-of select="@code"/>
+                               </xsl:if>
+                       </xsl:for-each>
+               </xsl:variable>
+               <xsl:if test="string-length($hasTitle) &gt; 0 ">
+                       <mads:titleInfo>
+                               <xsl:call-template name="setAuthority"/>
+                               <mads:title>
+                                       <xsl:variable name="str">
+                                               <xsl:for-each select="marc:subfield">
+                                                       <xsl:if test="(contains('adfghklmors',@code) )">
+                                                               <xsl:value-of select="text()"/>
+                                                               <xsl:text> </xsl:text>
+                                                       </xsl:if>
+                                               </xsl:for-each>
+                                       </xsl:variable>
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </mads:title>
+                               <xsl:call-template name="part"/>
+                               <!-- <xsl:call-template name="uri"/> -->
+                       </mads:titleInfo>
+               </xsl:if>
+       </xsl:template>
+
+
+       <!-- ========== topics  ========== -->
+       <xsl:template match="marc:subfield[@code='x']">
+               <mads:topic>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString">
+                                       <xsl:value-of select="."/>
+                               </xsl:with-param>
+                       </xsl:call-template>
+               </mads:topic>
+       </xsl:template>
+       
+       <!-- 2.06 fix -->
+       <xsl:template
+               match="marc:datafield[@tag=150][marc:subfield[@code='a' or @code='b']]|marc:datafield[@tag=180][marc:subfield[@code='x']]">
+               <xsl:call-template name="topic"/>
+               <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+       </xsl:template>
+       <xsl:template
+               match="marc:datafield[@tag=450][marc:subfield[@code='a' or @code='b']]|marc:datafield[@tag=480][marc:subfield[@code='x']]">
+               <mads:variant>
+                       <xsl:call-template name="variantTypeAttribute"/>
+                       <xsl:call-template name="topic"/>
+               </mads:variant>
+       </xsl:template>
+       <xsl:template
+               match="marc:datafield[@tag=550 or @tag=750][marc:subfield[@code='a' or @code='b']]">
+               <mads:related>
+                       <xsl:call-template name="relatedTypeAttribute"/>
+                       <!-- <xsl:call-template name="uri"/> -->
+                       <xsl:call-template name="topic"/>
+                       <xsl:apply-templates select="marc:subfield[@code='z']"/>
+               </mads:related>
+       </xsl:template>
+       <xsl:template name="topic">
+               <mads:topic>
+                       <xsl:call-template name="setAuthority"/>
+                       <!-- tmee2006 dedupe 550a
+                       <xsl:if test="@tag=550 or @tag=750">
+                               <xsl:call-template name="subfieldSelect">
+                                       <xsl:with-param name="codes">ab</xsl:with-param>
+                               </xsl:call-template>
+                       </xsl:if>       
+                       -->
+                       <xsl:choose>
+                               <xsl:when test="@tag=180 or @tag=480 or @tag=580 or @tag=780">
+                                       <xsl:call-template name="chopPunctuation">
+                                               <xsl:with-param name="chopString">
+                                                       <xsl:apply-templates select="marc:subfield[@code='x']"/>
+                                               </xsl:with-param>
+                                       </xsl:call-template>
+                               </xsl:when>
+                       </xsl:choose>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString">
+                                       <xsl:choose>
+                                               <xsl:when test="@tag=180 or @tag=480 or @tag=580 or @tag=780">
+                                                       <xsl:apply-templates select="marc:subfield[@code='x']"/>
+                                               </xsl:when>
+                                               <xsl:otherwise>
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">ab</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:otherwise>
+                                       </xsl:choose>
+                               </xsl:with-param>
+                       </xsl:call-template>
+               </mads:topic>
+       </xsl:template>
+
+       <!-- ========= temporals  ========== -->
+       <xsl:template match="marc:subfield[@code='y']">
+               <mads:temporal>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString">
+                                       <xsl:value-of select="."/>
+                               </xsl:with-param>
+                       </xsl:call-template>
+               </mads:temporal>
+       </xsl:template>
+       <xsl:template
+               match="marc:datafield[@tag=148][marc:subfield[@code='a']]|marc:datafield[@tag=182 ][marc:subfield[@code='y']]">
+               <xsl:call-template name="temporal"/>
+       </xsl:template>
+       <xsl:template
+               match="marc:datafield[@tag=448][marc:subfield[@code='a']]|marc:datafield[@tag=482][marc:subfield[@code='y']]">
+               <mads:variant>
+                       <xsl:call-template name="variantTypeAttribute"/>
+                       <xsl:call-template name="temporal"/>
+               </mads:variant>
+       </xsl:template>
+       <xsl:template
+               match="marc:datafield[@tag=548 or @tag=748][marc:subfield[@code='a']]|marc:datafield[@tag=582 or @tag=782][marc:subfield[@code='y']]">
+               <mads:related>
+                       <xsl:call-template name="relatedTypeAttribute"/>
+                       <!-- <xsl:call-template name="uri"/> -->
+                       <xsl:call-template name="temporal"/>
+               </mads:related>
+       </xsl:template>
+       <xsl:template name="temporal">
+               <mads:temporal>
+                       <xsl:call-template name="setAuthority"/>
+                       <xsl:if test="@tag=548 or @tag=748">
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                       </xsl:if>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString">
+                                       <xsl:choose>
+                                               <xsl:when test="@tag=182 or @tag=482 or @tag=582 or @tag=782">
+                                                       <xsl:apply-templates select="marc:subfield[@code='y']"/>
+                                               </xsl:when>
+                                               <xsl:otherwise>
+                                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                                               </xsl:otherwise>
+                                       </xsl:choose>
+                               </xsl:with-param>
+                       </xsl:call-template>
+               </mads:temporal>
+               <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+       </xsl:template>
+
+       <!-- ========== genre  ========== -->
+       <xsl:template match="marc:subfield[@code='v']">
+               <mads:genre>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString">
+                                       <xsl:value-of select="."/>
+                               </xsl:with-param>
+                       </xsl:call-template>
+               </mads:genre>
+       </xsl:template>
+       <xsl:template
+               match="marc:datafield[@tag=155][marc:subfield[@code='a']]|marc:datafield[@tag=185][marc:subfield[@code='v']]">
+               <xsl:call-template name="genre"/>
+       </xsl:template>
+       <xsl:template
+               match="marc:datafield[@tag=455][marc:subfield[@code='a']]|marc:datafield[@tag=485 ][marc:subfield[@code='v']]">
+               <mads:variant>
+                       <xsl:call-template name="variantTypeAttribute"/>
+                       <xsl:call-template name="genre"/>
+               </mads:variant>
+       </xsl:template>
+       <!--
+       <xsl:template match="marc:datafield[@tag=555]">
+               <mads:related>
+                       <xsl:call-template name="relatedTypeAttribute"/>
+                       <xsl:call-template name="uri"/>
+                       <xsl:call-template name="genre"/>
+               </mads:related>
+       </xsl:template>
+       -->
+       <xsl:template
+               match="marc:datafield[@tag=555 or @tag=755][marc:subfield[@code='a']]|marc:datafield[@tag=585][marc:subfield[@code='v']]">
+               <mads:related>
+                       <xsl:call-template name="relatedTypeAttribute"/>
+                       <xsl:call-template name="genre"/>
+               </mads:related>
+       </xsl:template>
+       <xsl:template name="genre">
+               <mads:genre>
+                       <xsl:if test="@tag=555">
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                       </xsl:if>
+                       <xsl:call-template name="setAuthority"/>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString">
+                                       <xsl:choose>
+                                               <!-- 2.07 fix -->
+                                               <xsl:when test="@tag='555'"/>
+                                               <xsl:when test="@tag=185 or @tag=485 or @tag=585">
+                                                       <xsl:apply-templates select="marc:subfield[@code='v']"/>
+                                               </xsl:when>
+                                               <xsl:otherwise>
+                                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                                               </xsl:otherwise>
+                                       </xsl:choose>
+                               </xsl:with-param>
+                       </xsl:call-template>
+               </mads:genre>
+               <xsl:apply-templates/>
+       </xsl:template>
+
+       <!-- ========= geographic  ========== -->
+       <xsl:template match="marc:subfield[@code='z']">
+               <mads:geographic>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString">
+                                       <xsl:value-of select="."/>
+                               </xsl:with-param>
+                       </xsl:call-template>
+               </mads:geographic>
+       </xsl:template>
+       <xsl:template name="geographic">
+               <mads:geographic>
+                       <!-- 2.14 -->
+                       <xsl:call-template name="setAuthority"/>
+                       <!-- 2.13 -->
+                       <xsl:if test="@tag=151 or @tag=551">
+                               <xsl:value-of select="marc:subfield[@code='a']"/>
+                       </xsl:if>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString">
+                                               <xsl:if test="@tag=181 or @tag=481 or @tag=581">
+                                                               <xsl:apply-templates select="marc:subfield[@code='z']"/>
+                                               </xsl:if>
+                                               <!-- 2.13
+                                                       <xsl:choose>
+                                               <xsl:when test="@tag=181 or @tag=481 or @tag=581">
+                                                       <xsl:apply-templates select="marc:subfield[@code='z']"/>
+                                               </xsl:when>
+                                       
+                                               <xsl:otherwise>
+                                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                                               </xsl:otherwise>
+                                               </xsl:choose>
+                                               -->
+                               </xsl:with-param>
+                       </xsl:call-template>
+               </mads:geographic>
+               <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+       </xsl:template>
+       <xsl:template
+               match="marc:datafield[@tag=151][marc:subfield[@code='a']]|marc:datafield[@tag=181][marc:subfield[@code='z']]">
+               <xsl:call-template name="geographic"/>
+       </xsl:template>
+       <xsl:template
+               match="marc:datafield[@tag=451][marc:subfield[@code='a']]|marc:datafield[@tag=481][marc:subfield[@code='z']]">
+               <mads:variant>
+                       <xsl:call-template name="variantTypeAttribute"/>
+                       <xsl:call-template name="geographic"/>
+               </mads:variant>
+       </xsl:template>
+       <xsl:template
+               match="marc:datafield[@tag=551]|marc:datafield[@tag=581][marc:subfield[@code='z']]">
+               <mads:related>
+                       <xsl:call-template name="relatedTypeAttribute"/>
+                       <!-- <xsl:call-template name="uri"/> -->
+                       <xsl:call-template name="geographic"/>
+               </mads:related>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=580]">
+               <mads:related>
+                       <xsl:call-template name="relatedTypeAttribute"/>
+                       <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+               </mads:related>
+       </xsl:template>
+       <xsl:template
+               match="marc:datafield[@tag=751][marc:subfield[@code='z']]|marc:datafield[@tag=781][marc:subfield[@code='z']]">
+               <mads:related>
+                       <xsl:call-template name="relatedTypeAttribute"/>
+                       <xsl:call-template name="geographic"/>
+               </mads:related>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=755]">
+               <mads:related>
+                       <xsl:call-template name="relatedTypeAttribute"/>
+                       <xsl:call-template name="setAuthority"/>
+                       <xsl:call-template name="genre"/>
+                       <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+               </mads:related>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=780]">
+               <mads:related>
+                       <xsl:call-template name="relatedTypeAttribute"/>
+                       <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+               </mads:related>
+       </xsl:template>
+       <xsl:template match="marc:datafield[@tag=785]">
+               <mads:related>
+                       <xsl:call-template name="relatedTypeAttribute"/>
+                       <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+               </mads:related>
+       </xsl:template>
+
+       <!-- ========== notes  ========== -->
+       <xsl:template match="marc:datafield[667 &lt;= @tag and @tag &lt;= 688]">
+               <mads:note>
+                       <xsl:choose>
+                               <xsl:when test="@tag=667">
+                                       <xsl:attribute name="type">nonpublic</xsl:attribute>
+                               </xsl:when>
+                               <xsl:when test="@tag=670">
+                                       <xsl:attribute name="type">source</xsl:attribute>
+                               </xsl:when>
+                               <xsl:when test="@tag=675">
+                                       <xsl:attribute name="type">notFound</xsl:attribute>
+                               </xsl:when>
+                               <xsl:when test="@tag=678">
+                                       <xsl:attribute name="type">history</xsl:attribute>
+                               </xsl:when>
+                               <xsl:when test="@tag=681">
+                                       <xsl:attribute name="type">subject example</xsl:attribute>
+                               </xsl:when>
+                               <xsl:when test="@tag=682">
+                                       <xsl:attribute name="type">deleted heading information</xsl:attribute>
+                               </xsl:when>
+                               <xsl:when test="@tag=688">
+                                       <xsl:attribute name="type">application history</xsl:attribute>
+                               </xsl:when>
+                       </xsl:choose>
+                       <xsl:call-template name="chopPunctuation">
+                               <xsl:with-param name="chopString">
+                                       <xsl:choose>
+                                               <xsl:when test="@tag=667 or @tag=675">
+                                                       <xsl:value-of select="marc:subfield[@code='a']"/>
+                                               </xsl:when>
+                                               <xsl:when test="@tag=670 or @tag=678">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">ab</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:when>
+                                               <xsl:when test="680 &lt;= @tag and @tag &lt;=688">
+                                                       <xsl:call-template name="subfieldSelect">
+                                                               <xsl:with-param name="codes">ai</xsl:with-param>
+                                                       </xsl:call-template>
+                                               </xsl:when>
+                                       </xsl:choose>
+                               </xsl:with-param>
+                       </xsl:call-template>
+               </mads:note>
+       </xsl:template>
+
+       <!-- ========== url  ========== -->
+       <xsl:template match="marc:datafield[@tag=856][marc:subfield[@code='u']]">
+               <mads:url>
+                       <xsl:if test="marc:subfield[@code='z' or @code='3']">
+                               <xsl:attribute name="displayLabel">
+                                       <xsl:call-template name="subfieldSelect">
+                                               <xsl:with-param name="codes">z3</xsl:with-param>
+                                       </xsl:call-template>
+                               </xsl:attribute>
+                       </xsl:if>
+                       <xsl:value-of select="marc:subfield[@code='u']"/>
+               </mads:url>
+       </xsl:template>
+
+       <xsl:template name="relatedTypeAttribute">
+               <xsl:choose>
+                       <xsl:when
+                               test="@tag=500 or @tag=510 or @tag=511 or @tag=548 or @tag=550 or @tag=551 or @tag=555 or @tag=580 or @tag=581 or @tag=582 or @tag=585">
+                               <xsl:if test="substring(marc:subfield[@code='w'],1,1)='a'">
+                                       <xsl:attribute name="type">earlier</xsl:attribute>
+                               </xsl:if>
+                               <xsl:if test="substring(marc:subfield[@code='w'],1,1)='b'">
+                                       <xsl:attribute name="type">later</xsl:attribute>
+                               </xsl:if>
+                               <xsl:if test="substring(marc:subfield[@code='w'],1,1)='t'">
+                                       <xsl:attribute name="type">parentOrg</xsl:attribute>
+                               </xsl:if>
+                               <xsl:if test="substring(marc:subfield[@code='w'],1,1)='g'">
+                                       <xsl:attribute name="type">broader</xsl:attribute>
+                               </xsl:if>
+                               <xsl:if test="substring(marc:subfield[@code='w'],1,1)='h'">
+                                       <xsl:attribute name="type">narrower</xsl:attribute>
+                               </xsl:if>
+                               <xsl:if test="substring(marc:subfield[@code='w'],1,1)='r'">
+                                       <xsl:attribute name="type">other</xsl:attribute>
+                               </xsl:if>
+                               <xsl:if test="contains('fin|', substring(marc:subfield[@code='w'],1,1))">
+                                       <xsl:attribute name="type">other</xsl:attribute>
+                               </xsl:if>
+                       </xsl:when>
+                       <xsl:when test="@tag=530 or @tag=730">
+                               <xsl:attribute name="type">other</xsl:attribute>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <!-- 7xx -->
+                               <xsl:attribute name="type">equivalent</xsl:attribute>
+                       </xsl:otherwise>
+               </xsl:choose>
+               <xsl:apply-templates select="marc:subfield[@code='i']"/>
+       </xsl:template>
+       
+
+
+       <xsl:template name="variantTypeAttribute">
+               <xsl:choose>
+                       <xsl:when
+                               test="@tag=400 or @tag=410 or @tag=411 or @tag=451 or @tag=455 or @tag=480 or @tag=481 or @tag=482 or @tag=485">
+                               <xsl:if test="substring(marc:subfield[@code='w'],1,1)='d'">
+                                       <xsl:attribute name="type">acronym</xsl:attribute>
+                               </xsl:if>
+                               <xsl:if test="substring(marc:subfield[@code='w'],1,1)='n'">
+                                       <xsl:attribute name="type">other</xsl:attribute>
+                               </xsl:if>
+                               <xsl:if test="contains('fit', substring(marc:subfield[@code='w'],1,1))">
+                                       <xsl:attribute name="type">other</xsl:attribute>
+                               </xsl:if>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <!-- 430  -->
+                               <xsl:attribute name="type">other</xsl:attribute>
+                       </xsl:otherwise>
+               </xsl:choose>
+               <xsl:apply-templates select="marc:subfield[@code='i']"/>
+       </xsl:template>
+
+       <xsl:template name="setAuthority">
+               <xsl:choose>
+                       <!-- can be called from the datafield or subfield level, so "..//@tag" means
+                       the tag can be at the subfield's parent level or at the datafields own level -->
+
+                       <xsl:when
+                               test="ancestor-or-self::marc:datafield/@tag=100 and (@ind1=0 or @ind1=1) and $controlField008-11='a' and $controlField008-14='a'">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>naf</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="ancestor-or-self::marc:datafield/@tag=100 and (@ind1=0 or @ind1=1) and $controlField008-11='a' and $controlField008-14='b'">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>lcsh</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="ancestor-or-self::marc:datafield/@tag=100 and (@ind1=0 or @ind1=1) and $controlField008-11='k'">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>lacnaf</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="ancestor-or-self::marc:datafield/@tag=100 and @ind1=3 and $controlField008-11='a' and $controlField008-14='b'">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>lcsh</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="ancestor-or-self::marc:datafield/@tag=100 and @ind1=3 and $controlField008-11='k' and $controlField008-14='b'">
+                               <xsl:attribute name="authority">cash</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="ancestor-or-self::marc:datafield/@tag=110 and $controlField008-11='a' and $controlField008-14='a'">
+                               <xsl:attribute name="authority">naf</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="ancestor-or-self::marc:datafield/@tag=110 and $controlField008-11='a' and $controlField008-14='b'">
+                               <xsl:attribute name="authority">lcsh</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="ancestor-or-self::marc:datafield/@tag=110 and $controlField008-11='k' and $controlField008-14='a'">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>lacnaf</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="ancestor-or-self::marc:datafield/@tag=110 and $controlField008-11='k' and $controlField008-14='b'">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>cash</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="100 &lt;= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag &lt;= 155 and $controlField008-11='b'">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>lcshcl</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=100 or ancestor-or-self::marc:datafield/@tag=110 or ancestor-or-self::marc:datafield/@tag=111 or ancestor-or-self::marc:datafield/@tag=130 or ancestor-or-self::marc:datafield/@tag=151) and $controlField008-11='c'">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>nlmnaf</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=100 or ancestor-or-self::marc:datafield/@tag=110 or ancestor-or-self::marc:datafield/@tag=111 or ancestor-or-self::marc:datafield/@tag=130 or ancestor-or-self::marc:datafield/@tag=151) and $controlField008-11='d'">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>nalnaf</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="100 &lt;= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag &lt;= 155 and $controlField008-11='r'">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>aat</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="100 &lt;= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag &lt;= 155 and $controlField008-11='s'">
+                               <xsl:attribute name="authority">sears</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="100 &lt;= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag &lt;= 155 and $controlField008-11='v'">
+                               <xsl:attribute name="authority">rvm</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="100 &lt;= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag &lt;= 155 and $controlField008-11='z'">
+                               <xsl:attribute name="authority">
+                                       <xsl:value-of
+                                               select="../marc:datafield[ancestor-or-self::marc:datafield/@tag=040]/marc:subfield[@code='f']"
+                                       />
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=111 or ancestor-or-self::marc:datafield/@tag=130) and $controlField008-11='a' and $controlField008-14='a'">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>naf</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=111 or ancestor-or-self::marc:datafield/@tag=130) and $controlField008-11='a' and $controlField008-14='b'">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>lcsh</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=111 or ancestor-or-self::marc:datafield/@tag=130) and $controlField008-11='k' ">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>lacnaf</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=148 or ancestor-or-self::marc:datafield/@tag=150  or ancestor-or-self::marc:datafield/@tag=155) and $controlField008-11='a' ">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>lcsh</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=148 or ancestor-or-self::marc:datafield/@tag=150  or ancestor-or-self::marc:datafield/@tag=155) and $controlField008-11='a' ">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>lcsh</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=148 or ancestor-or-self::marc:datafield/@tag=150  or ancestor-or-self::marc:datafield/@tag=155) and $controlField008-11='c' ">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>mesh</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=148 or ancestor-or-self::marc:datafield/@tag=150  or ancestor-or-self::marc:datafield/@tag=155) and $controlField008-11='d' ">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>nal</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=148 or ancestor-or-self::marc:datafield/@tag=150  or ancestor-or-self::marc:datafield/@tag=155) and $controlField008-11='k' ">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>cash</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="ancestor-or-self::marc:datafield/@tag=151 and $controlField008-11='a' and $controlField008-14='a'">
+                               <xsl:attribute name="authority">
+                                       <xsl:text>naf</xsl:text>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="ancestor-or-self::marc:datafield/@tag=151 and $controlField008-11='a' and $controlField008-14='b'">
+                               <xsl:attribute name="authority">lcsh</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="ancestor-or-self::marc:datafield/@tag=151 and $controlField008-11='k' and $controlField008-14='a'">
+                               <xsl:attribute name="authority">lacnaf</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="ancestor-or-self::marc:datafield/@tag=151 and $controlField008-11='k' and $controlField008-14='b'">
+                               <xsl:attribute name="authority">cash</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(..//ancestor-or-self::marc:datafield/@tag=180 or ..//ancestor-or-self::marc:datafield/@tag=181 or ..//ancestor-or-self::marc:datafield/@tag=182 or ..//ancestor-or-self::marc:datafield/@tag=185) and $controlField008-11='a'">
+                               <xsl:attribute name="authority">lcsh</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="ancestor-or-self::marc:datafield/@tag=700 and (@ind1='0' or @ind1='1') and @ind2='0'">
+                               <xsl:attribute name="authority">naf</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="ancestor-or-self::marc:datafield/@tag=700 and (@ind1='0' or @ind1='1') and @ind2='5'">
+                               <xsl:attribute name="authority">lacnaf</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when test="ancestor-or-self::marc:datafield/@tag=700 and @ind1='3' and @ind2='0'">
+                               <xsl:attribute name="authority">lcsh</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when test="ancestor-or-self::marc:datafield/@tag=700 and @ind1='3' and @ind2='5'">
+                               <xsl:attribute name="authority">cash</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(700 &lt;= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag &lt;= 755 ) and @ind2='1'">
+                               <xsl:attribute name="authority">lcshcl</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=700 or ancestor-or-self::marc:datafield/@tag=710 or ancestor-or-self::marc:datafield/@tag=711 or ancestor-or-self::marc:datafield/@tag=730 or ancestor-or-self::marc:datafield/@tag=751)  and @ind2='2'">
+                               <xsl:attribute name="authority">nlmnaf</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=700 or ancestor-or-self::marc:datafield/@tag=710 or ancestor-or-self::marc:datafield/@tag=711 or ancestor-or-self::marc:datafield/@tag=730 or ancestor-or-self::marc:datafield/@tag=751)  and @ind2='3'">
+                               <xsl:attribute name="authority">nalnaf</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(700 &lt;= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag &lt;= 755 ) and @ind2='6'">
+                               <xsl:attribute name="authority">rvm</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(700 &lt;= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag &lt;= 755 ) and @ind2='7'">
+                               <xsl:attribute name="authority">
+                                       <xsl:value-of select="marc:subfield[@code='2']"/>
+                               </xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=710 or ancestor-or-self::marc:datafield/@tag=711 or ancestor-or-self::marc:datafield/@tag=730 or ancestor-or-self::marc:datafield/@tag=751)  and @ind2='5'">
+                               <xsl:attribute name="authority">lacnaf</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=710 or ancestor-or-self::marc:datafield/@tag=711 or ancestor-or-self::marc:datafield/@tag=730 or ancestor-or-self::marc:datafield/@tag=751)  and @ind2='0'">
+                               <xsl:attribute name="authority">naf</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=748 or ancestor-or-self::marc:datafield/@tag=750 or ancestor-or-self::marc:datafield/@tag=755)  and @ind2='0'">
+                               <xsl:attribute name="authority">lcsh</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=748 or ancestor-or-self::marc:datafield/@tag=750 or ancestor-or-self::marc:datafield/@tag=755)  and @ind2='2'">
+                               <xsl:attribute name="authority">mesh</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=748 or ancestor-or-self::marc:datafield/@tag=750 or ancestor-or-self::marc:datafield/@tag=755)  and @ind2='3'">
+                               <xsl:attribute name="authority">nal</xsl:attribute>
+                       </xsl:when>
+                       <xsl:when
+                               test="(ancestor-or-self::marc:datafield/@tag=748 or ancestor-or-self::marc:datafield/@tag=750 or ancestor-or-self::marc:datafield/@tag=755)  and @ind2='5'">
+                               <xsl:attribute name="authority">cash</xsl:attribute>
+                       </xsl:when>
+               </xsl:choose>
+       </xsl:template>
+       <xsl:template match="*"/>
+</xsl:stylesheet>$XSLT$ WHERE name = 'mads21';
+
+
+SELECT evergreen.upgrade_deps_block_check('1310', :eg_version);
+
+DROP AGGREGATE IF EXISTS array_accum(anyelement) CASCADE;
+
+
+COMMIT;
+
+-- Update auditor tables to catch changes to source tables.
+--   Can be removed/skipped if there were no schema changes.
+SELECT auditor.update_auditors();
index b2b87b6..e342f88 100644 (file)
@@ -1,7 +1,7 @@
 <html><head><script></script></head><body onload="var x = document.getElementById('version'); var version ='/xul/server/'.split(/\//)[2]; if (version == 'server') { version = 'versionless debug build'; } x.appendChild(document.createTextNode(version));">
 <h1 style="text-decoration: underline">Evergreen</h1>
 <p>Target Server ID: <span id="version"></span></p>
-<p>$HeadURL$</p>
+<p>http://git.evergreen-ils.org/?p=Evergreen.git;a=shortlog;h=refs/heads/tags/rel_3_9_0</p>
 <h2>What is Evergreen?</h2>
 <blockquote>
 <p>
index 0613a13..3bbffa1 100644 (file)
@@ -11,7 +11,7 @@ pref("toolkit.singletonWindowType", "eg_main");
 pref("open-ils.enable_join_tabs", true);
 
 // We'll use this one to help brand some build information into the client, and rely on subversion keywords
-pref("open-ils.repository.headURL","$HeadURL$");
+pref("open-ils.repository.headURL","http://git.evergreen-ils.org/?p=Evergreen.git;a=shortlog;h=refs/heads/tags/rel_3_9_0");
 pref("open-ils.repository.author","$Author$");
 pref("open-ils.repository.revision","$Revision$");
 pref("open-ils.repository.date","$Date$");
index a954357..57e81c1 100644 (file)
@@ -3,7 +3,7 @@
 ; HM NIS Edit Wizard helper defines
 ; Old versions of makensis don't like this, moved to Makefile
 ;!define /file PRODUCT_VERSION "client/VERSION"
-!define PRODUCT_TAG "Master"
+!define PRODUCT_TAG "3.9"
 !define PRODUCT_INSTALL_TAG "${PRODUCT_TAG}"
 !define UI_IMAGESET "beta"
 ;!define UI_IMAGESET "release"
diff --git a/README b/README
deleted file mode 120000 (symlink)
index 1486a8d6764f2981a61f67869b6c4a2bee76df52..0000000000000000000000000000000000000000
--- a/README
+++ /dev/null
@@ -1 +0,0 @@
-docs/modules/installation/pages/server_installation.adoc
\ No newline at end of file
diff --git a/README b/README
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..259910b9b4507fbb2b0e30178db93077ff3ea53a
--- /dev/null
+++ b/README
@@ -0,0 +1,711 @@
+= Installing the Evergreen server =
+:toc:
+
+== Preamble: referenced user accounts ==
+
+In subsequent sections, we will refer to a number of different accounts, as
+follows:
+
+  * Linux user accounts:
+    ** The *user* Linux account is the account that you use to log onto the
+       Linux system as a regular user.
+    ** The *root* Linux account is an account that has system administrator
+       privileges. On Debian you can switch to this account from
+       your *user* account by issuing the `su -` command and entering the
+       password for the *root* account when prompted. On Ubuntu you can switch
+       to this account from your *user* account using the `sudo su -` command
+       and entering the password for your *user* account when prompted.
+    ** The *opensrf* Linux account is an account that you create when installing
+       OpenSRF. You can switch to this account from the *root* account by
+       issuing the `su - opensrf` command.
+    ** The *postgres* Linux account is created automatically when you install
+       the PostgreSQL database server. You can switch to this account from the
+       *root* account by issuing the `su - postgres` command.
+  * PostgreSQL user accounts:
+    ** The *evergreen* PostgreSQL account is a superuser account that you will
+       create to connect to the PostgreSQL database server.
+  * Evergreen administrator account:
+    ** The *egadmin* Evergreen account is an administrator account for
+       Evergreen that you will use to test connectivity and configure your
+       Evergreen instance.
+
+== Preamble: developer instructions ==
+
+[NOTE]
+Skip this section if you are using an official release tarball downloaded
+from http://evergreen-ils.org/egdownloads
+
+Developers working directly with the source code from the Git repository,
+rather than an official release tarball, must perform one step before they 
+can proceed with the `./configure` step.
+
+As the *user* Linux account, issue the following command in the Evergreen
+source directory to generate the configure script and Makefiles:
+
+[source, bash]
+------------------------------------------------------------------------------
+autoreconf -i
+------------------------------------------------------------------------------
+
+== Installing prerequisites ==
+
+  * **PostgreSQL**: The minimum supported version is 10.
+  * **Linux**: Evergreen has been tested on
+    Debian Bullseye (11),
+    Debian Buster (10), 
+    Debian Stretch (9), 
+    Ubuntu Focal Fossa (20.04),
+    and Ubuntu Bionic Beaver (18.04).
+    If you are running an older version of these distributions, you may want 
+    to upgrade before upgrading Evergreen. For instructions on upgrading these
+    distributions, visit the Debian or Ubuntu websites.
+  * **OpenSRF**: The minimum supported version of OpenSRF is 3.2.0.
+
+
+Evergreen has a number of prerequisite packages that must be installed
+before you can successfully configure, compile, and install Evergreen.
+
+1. Begin by installing the most recent version of OpenSRF (3.2.0 or later).
+   You can download OpenSRF releases from http://evergreen-ils.org/opensrf-downloads/
++
+2. Issue the following commands as the *root* Linux account to install
+   prerequisites using the `Makefile.install` prerequisite installer,
+   substituting `debian-bullseye`,`debian-buster`,`debian-stretch`,`ubuntu-focal`,
+   or `ubuntu-bionic` for <osname> below:
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>
+------------------------------------------------------------------------------
++
+[[optional_developer_additions]]
+3. OPTIONAL: Developer additions
++
+To perform certain developer tasks from a Git source code checkout, 
+additional packages are required.  As the *root* Linux account:
++
+ * To install packages needed for retrieving and managing web dependencies,
+   use the <osname>-developer Makefile.install target.  Currently, 
+   this is only needed for building and installing the web
+   staff client.
+ * To optionally run Angular and AngularJS tests you will need to manually
+   install Firefox and your choice of Chromium or Chrome.
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>-developer
+------------------------------------------------------------------------------
++
+ * To install packages required for building Evergreen translations, use
+   the <osname>-translator Makefile.install target.
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>-translator
+------------------------------------------------------------------------------
++
+ * To install packages required for building Evergreen release bundles, use
+   the <osname>-packager Makefile.install target.
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>-packager
+------------------------------------------------------------------------------
+
+== Extra steps for web staff client ==
+
+[NOTE]
+Skip this entire section if you are using an official release tarball downloaded
+from http://evergreen-ils.org/downloads. Otherwise, ensure you have installed the
+xref:#optional_developer_additions[optional developer additions] before proceeding.
+
+[[install_files_for_web_staff_client]]
+=== Install AngularJS files for web staff client ===
+
+1. Building, Testing, Minification: The remaining steps all take place within
+   the staff JS web root:
++
+[source,sh]
+------------------------------------------------------------------------------
+cd $EVERGREEN_ROOT/Open-ILS/web/js/ui/default/staff/
+------------------------------------------------------------------------------
++
+2. Install Project-local Dependencies. npm inspects the 'package.json' file
+   for dependencies and fetches them from the Node package network.
++
+[source,sh]
+------------------------------------------------------------------------------
+npm install   # fetch JS dependencies
+------------------------------------------------------------------------------
++
+3. Run the build script.
++
+[source,sh]
+------------------------------------------------------------------------------
+npm run build-prod
+------------------------------------------------------------------------------
++
+4. OPTIONAL: Test web client code if the <osname>-developer packages and
+   the necessary browsers are installed.
+   CHROME_BIN should be set to the path to chrome or chromimum, e.g.,
+   `/usr/bin/chromium`:
++
+[source,sh]
+------------------------------------------------------------------------------
+CHROME_BIN=/path/to/chrome npm run test
+------------------------------------------------------------------------------
+
+[[install_files_for_angular_web_staff_client]]
+=== Install Angular files for web staff client ===
+
+1. Building, Testing, Minification: The remaining steps all take place within
+   the Angular staff root:
++
+[source,sh]
+------------------------------------------------------------------------------
+cd $EVERGREEN_ROOT/Open-ILS/src/eg2/
+------------------------------------------------------------------------------
++
+2. Install Project-local Dependencies. npm inspects the 'package.json' file
+   for dependencies and fetches them from the Node package network.
++
+[source,sh]
+------------------------------------------------------------------------------
+npm install   # fetch JS dependencies
+------------------------------------------------------------------------------
++
+3. Run the build script.
++
+[source,sh]
+------------------------------------------------------------------------------
+ng build --prod
+------------------------------------------------------------------------------
++
+4. OPTIONAL: Test eg2 web client code if the <osname>-developer packages and
+   the necessary browsers are installed:
+   CHROME_BIN should be set to the path to chrome or chromimum, e.g.,
+   `/usr/bin/chromium`:
++
+[source,sh]
+------------------------------------------------------------------------------
+CHROME_BIN=/path/to/chrome npm run test
+------------------------------------------------------------------------------
+
+[[install_opac_deps]]
+=== Install OPAC skin dependencies ===
+
+1. The following steps take place within the OPAC dependencies root:
++
+[source,sh]
+------------------------------------------------------------------------------
+cd $EVERGREEN_ROOT/Open-ILS/web/opac/deps
+------------------------------------------------------------------------------
++
+2. Install Project-local Dependencies. npm inspects the 'package.json' file
+   for dependencies and fetches them from the Node package network.
++
+[source,sh]
+------------------------------------------------------------------------------
+npm install   # fetch JS and CSS dependencies
+------------------------------------------------------------------------------
++
+Note that there is no build step.
+
+== Configuration and compilation instructions ==
+
+For the time being, we are still installing everything in the `/openils/`
+directory. From the Evergreen source directory, issue the following commands as
+the *user* Linux account to configure and build Evergreen:
+
+[source, bash]
+------------------------------------------------------------------------------
+PATH=/openils/bin:$PATH ./configure --prefix=/openils --sysconfdir=/openils/conf
+make
+------------------------------------------------------------------------------
+
+These instructions assume that you have also installed OpenSRF under `/openils/`.
+If not, please adjust PATH as needed so that the Evergreen `configure` script
+can find `osrf_config`.
+
+== Installation instructions ==
+
+1. Once you have configured and compiled Evergreen, issue the following
+   command as the *root* Linux account to install Evergreen and copy
+   example configuration files to `/openils/conf`.
++
+[source, bash]
+------------------------------------------------------------------------------
+make install
+------------------------------------------------------------------------------
+
+== Change ownership of the Evergreen files ==
+
+All files in the `/openils/` directory and subdirectories must be owned by the
+`opensrf` user. Issue the following command as the *root* Linux account to
+change the ownership on the files:
+
+[source, bash]
+------------------------------------------------------------------------------
+chown -R opensrf:opensrf /openils
+------------------------------------------------------------------------------
+
+== Run ldconfig ==
+
+On Ubuntu 18.04 / 20.04 or Debian Stretch / Buster / Bullseye, run the
+following command as the root user:
+
+[source, bash]
+------------------------------------------------------------------------------
+ldconfig
+------------------------------------------------------------------------------
+
+== Additional Instructions for Developers ==
+
+[NOTE]
+Skip this section if you are using an official release tarball downloaded
+from http://evergreen-ils.org/egdownloads
+
+Developers working directly with the source code from the Git repository,
+rather than an official release tarball, need to install the Dojo Toolkit
+set of JavaScript libraries. The appropriate version of Dojo is included in
+Evergreen release tarballs. Developers should install the Dojo 1.3.3 version
+of Dojo by issuing the following commands as the *opensrf* Linux account:
+
+[source, bash]
+------------------------------------------------------------------------------
+wget http://download.dojotoolkit.org/release-1.3.3/dojo-release-1.3.3.tar.gz
+tar -C /openils/var/web/js -xzf dojo-release-1.3.3.tar.gz
+cp -r /openils/var/web/js/dojo-release-1.3.3/* /openils/var/web/js/dojo/.
+------------------------------------------------------------------------------
+
+
+== Configure the Apache Web server ==
+
+. Use the example configuration files to configure your Web server for 
+the Evergreen catalog, web staff client, Web services, and administration
+interfaces. Issue the following commands as the *root* Linux account:
++
+[source,bash]
+------------------------------------------------------------------------------------
+cp Open-ILS/examples/apache_24/eg_24.conf       /etc/apache2/sites-available/eg.conf
+cp Open-ILS/examples/apache_24/eg_vhost_24.conf /etc/apache2/eg_vhost.conf
+cp Open-ILS/examples/apache_24/eg_startup      /etc/apache2/
+# Now set up SSL
+mkdir /etc/apache2/ssl
+cd /etc/apache2/ssl
+------------------------------------------------------------------------------------
++
+. The `openssl` command cuts a new SSL key for your Apache server. For a
+production server, you should purchase a signed SSL certificate, but you can
+just use a self-signed certificate and accept the warnings in the
+and browser during testing and development. Create an SSL key for the Apache
+server by issuing the following command as the *root* Linux account:
++
+[source,bash]
+------------------------------------------------------------------------------
+openssl req -new -x509 -days 365 -nodes -out server.crt -keyout server.key
+------------------------------------------------------------------------------
++
+. As the *root* Linux account, edit the `eg.conf` file that you copied into
+place.
+  a. To enable access to the offline upload / execute interface from any
+     workstation on any network, make the following change (and note that
+     you *must* secure this for a production instance):
+     * Replace `Require host 10.0.0.0/8` with `Require all granted`
+. Change the user for the Apache server.
+  * As the *root* Linux account, edit
+    `/etc/apache2/envvars`.  Change `export APACHE_RUN_USER=www-data` to 
+    `export APACHE_RUN_USER=opensrf`.
+. As the *root* Linux account, configure Apache with KeepAlive settings
+  appropriate for Evergreen. Higher values can improve the performance of a
+  single client by allowing multiple requests to be sent over the same TCP
+  connection, but increase the risk of using up all available Apache child
+  processes and memory.
+  * Edit `/etc/apache2/apache2.conf`.
+    a. Change `KeepAliveTimeout` to `1`.
+    b. Change `MaxKeepAliveRequests` to `100`.
+. As the *root* Linux account, configure the prefork module to start and keep
+  enough Apache servers available to provide quick responses to clients without
+  running out of memory. The following settings are a good starting point for a
+  site that exposes the default Evergreen catalog to the web:
++
+.`/etc/apache2/mods-available/mpm_prefork.conf`
+[source,bash]
+------------------------------------------------------------------------------
+<IfModule mpm_prefork_module>
+   StartServers            15
+   MinSpareServers          5
+   MaxSpareServers         15
+   MaxRequestWorkers       75
+   MaxConnectionsPerChild 500
+</IfModule>
+------------------------------------------------------------------------------
++
+. As the *root* user, enable the mpm_prefork module:
++
+[source,bash]
+------------------------------------------------------------------------------
+a2dismod mpm_event
+a2enmod mpm_prefork
+------------------------------------------------------------------------------
++
+. As the *root* Linux account, enable the Evergreen site:
++
+[source,bash]
+------------------------------------------------------------------------------
+a2dissite 000-default  # OPTIONAL: disable the default site (the "It Works" page)
+a2ensite eg.conf
+------------------------------------------------------------------------------
++
+. As the *root* Linux account, enable Apache to write
+   to the lock directory; this is currently necessary because Apache
+   is running as the `opensrf` user:
++
+[source,bash]
+------------------------------------------------------------------------------
+chown opensrf /var/lock/apache2
+------------------------------------------------------------------------------
+
+Learn more about additional Apache options in the following sections:
+
+  * xref:admin:apache_rewrite_tricks.adoc#apache_rewrite_tricks[Apache Rewrite Tricks]
+  * xref:admin:apache_access_handler.adoc#apache_access_handler_perl_module[Apache Access Handler Perl Module]
+
+== Configure OpenSRF for the Evergreen application ==
+
+There are a number of example OpenSRF configuration files in `/openils/conf/`
+that you can use as a template for your Evergreen installation. Issue the
+following commands as the *opensrf* Linux account:
+
+[source, bash]
+------------------------------------------------------------------------------
+cp -b /openils/conf/opensrf_core.xml.example /openils/conf/opensrf_core.xml
+cp -b /openils/conf/opensrf.xml.example /openils/conf/opensrf.xml
+------------------------------------------------------------------------------
+
+When you installed OpenSRF, you created four Jabber users on two
+separate domains and edited the `opensrf_core.xml` file accordingly. Please
+refer back to the OpenSRF README and, as the *opensrf* Linux account, edit the
+Evergreen version of the `opensrf_core.xml` file using the same Jabber users
+and domains as you used while installing and testing OpenSRF.
+
+[NOTE]
+The `-b` flag tells the `cp` command to create a backup version of the
+destination file. The backup version of the destination file has a tilde (`~`)
+appended to the file name, so if you have forgotten the Jabber users and
+domains, you can retrieve the settings from the backup version of the files.
+
+`eg_db_config`, described in xref:#creating_the_evergreen_database[Creating the Evergreen database], sets the database connection information in `opensrf.xml` for you.
+
+=== Configure action triggers for the Evergreen application ===
+_Action Triggers_ provide hooks for the system to perform actions when a given
+event occurs; for example, to generate reminder or overdue notices, the
+`checkout.due` hook is processed and events are triggered for potential actions
+if there is no checkin time.
+
+To enable the default set of hooks, issue the following command as the
+*opensrf* Linux account:
+
+[source, bash]
+------------------------------------------------------------------------------
+cp -b /openils/conf/action_trigger_filters.json.example /openils/conf/action_trigger_filters.json
+------------------------------------------------------------------------------
+
+For more information about configuring and running action triggers, see
+xref:admin:actiontriggers_process.adoc#processing_action_triggers[Notifications / Action Triggers].
+
+[[creating_the_evergreen_database]]
+== Creating the Evergreen database ==
+
+=== Setting up the PostgreSQL server ===
+
+For production use, most libraries install the PostgreSQL database server on a
+dedicated machine. Therefore, by default, the `Makefile.install` prerequisite
+installer does *not* install the PostgreSQL database server that is required
+by every Evergreen system. You can install the packages required by Debian or
+Ubuntu on the machine of your choice using the following commands as the
+*root* Linux account:
+
+. Installing PostgreSQL server packages
+
+Each OS build target provides the postgres server installation
+packages required for each operating system.  To install Postgres
+server packages, use the make target
+'postgres-server-<OSTYPE>-<POSTGRESVERSION>'.  Choose the most
+appropriate command below based on your operating system and desired
+PostgreSQL Version.
+
+The first below will install PostgreSQL 10, the minimum supported
+version and the version recommended for production use of Evergreen:
+
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-bullseye-10
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-buster-10
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-stretch-10
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-bionic-10
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-focal-10
+------------------------------------------------------------------------------
+
+[WARNING]
+=========
+Evergreen support for PostgreSQL server versions greater than 10 is
+still exprimental.  The use of the following is discouraged in
+production environments.  The following are only recommended if you
+are willing to test newer PostgreSQL versions for performance and
+possible bugs.
+=========
+
+To install PostgreSQL version 11, use the following command for your operating
+system:
+
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-bullseye-11
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-buster-11
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-stretch-11
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-bionic-11
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-focal-11
+------------------------------------------------------------------------------
+
+To install PostgreSQL version 12, use the following command for your operating
+system:
+
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-bullseye-12
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-buster-12
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-stretch-12
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-bionic-12
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-focal-12
+------------------------------------------------------------------------------
+
+To install PostgreSQL version 13, use the following command for your operating
+system:
+
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-bullseye-13
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-buster-13
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-stretch-13
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-bionic-13
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-focal-13
+------------------------------------------------------------------------------
+
+To install PostgreSQL version 14, use the following command for your operating
+system:
+
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-bullseye-14
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-buster-14
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-stretch-14
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-bionic-14
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-focal-14
+------------------------------------------------------------------------------
+
+For a standalone PostgreSQL server, install the following Perl modules for your
+distribution as the *root* Linux account:
+
+.(Debian and Ubuntu) 
+No extra modules required for these distributions.
+
+You need to create a PostgreSQL superuser to create and access the database.
+Issue the following command as the *postgres* Linux account to create a new
+PostgreSQL superuser named `evergreen`. When prompted, enter the new user's
+password:
+
+[source, bash]
+------------------------------------------------------------------------------
+createuser -s -P evergreen
+------------------------------------------------------------------------------
+
+.Enabling connections to the PostgreSQL database
+
+Your PostgreSQL database may be configured by default to prevent connections,
+for example, it might reject attempts to connect via TCP/IP or from other
+servers. To enable TCP/IP connections from localhost, check your `pg_hba.conf`
+file, found in the `/etc/postgresql/` directory on Debian and Ubuntu.
+A simple way to enable TCP/IP
+connections from localhost to all databases with password authentication, which
+would be suitable for a test install of Evergreen on a single server, is to
+ensure the file contains the following entries _before_ any "host ... ident"
+entries:
+
+------------------------------------------------------------------------------
+host    all             all             ::1/128                 md5
+host    all             all             127.0.0.1/32            md5
+------------------------------------------------------------------------------
+
+When you change the `pg_hba.conf` file, you will need to reload PostgreSQL to
+make the changes take effect.  For more information on configuring connectivity
+to PostgreSQL, see
+http://www.postgresql.org/docs/devel/static/auth-pg-hba-conf.html
+
+=== Creating the Evergreen database and schema ===
+
+Once you have created the *evergreen* PostgreSQL account, you also need to
+create the database and schema, and configure your configuration files to point
+at the database server. Issue the following command as the *root* Linux account
+from inside the Evergreen source directory, replacing <user>, <password>,
+<hostname>, <port>, and <dbname> with the appropriate values for your
+PostgreSQL database (where <user> and <password> are for the *evergreen*
+PostgreSQL account you just created), and replace <admin-user> and <admin-pass>
+with the values you want for the *egadmin* Evergreen administrator account:
+
+[source, bash]
+------------------------------------------------------------------------------
+perl Open-ILS/src/support-scripts/eg_db_config --update-config \
+       --service all --create-database --create-schema --create-offline \
+       --user <user> --password <password> --hostname <hostname> --port <port> \
+       --database <dbname> --admin-user <admin-user> --admin-pass <admin-pass>
+------------------------------------------------------------------------------
+
+This creates the database and schema and configures all of the services in
+your `/openils/conf/opensrf.xml` configuration file to point to that database.
+It also creates the configuration files required by the Evergreen `cgi-bin`
+administration scripts, and sets the user name and password for the *egadmin*
+Evergreen administrator account to your requested values.
+
+You can get a complete set of options for `eg_db_config` by passing the
+`--help` parameter.
+
+=== Loading sample data ===
+
+If you add the `--load-all-sample` parameter to the `eg_db_config` command,
+a set of authority and bibliographic records, call numbers, copies, staff
+and regular users, and transactions will be loaded into your target
+database. This sample dataset is commonly referred to as the _concerto_
+sample data, and can be useful for testing out Evergreen functionality and
+for creating problem reports that developers can easily recreate with their
+own copy of the _concerto_ sample data.
+
+=== Creating the database on a remote server ===
+
+In a production instance of Evergreen, your PostgreSQL server should be
+installed on a dedicated server.
+
+To create the database instance on a remote database server, simply
+use the `--create-database` flag on `eg_db_config`.
+
+== Starting Evergreen ==
+
+1. As the *root* Linux account, start the `memcached` and `ejabberd` services
+(if they aren't already running):
++
+[source, bash]
+------------------------------------------------------------------------------
+/etc/init.d/ejabberd start
+/etc/init.d/memcached start
+------------------------------------------------------------------------------
++
+2. As the *opensrf* Linux account, start Evergreen. The `-l` flag in the
+following command is only necessary if you want to force Evergreen to treat the
+hostname as `localhost`; if you configured `opensrf.xml` using the real
+hostname of your machine as returned by `perl -ENet::Domain 'print
+Net::Domain::hostfqdn() . "\n";'`, you should not use the `-l` flag.
++
+[source, bash]
+------------------------------------------------------------------------------
+osrf_control -l --start-all
+------------------------------------------------------------------------------
++
+  ** If you receive the error message `bash: osrf_control: command not found`,
+     then your environment variable `PATH` does not include the `/openils/bin`
+     directory; this should have been set in the *opensrf* Linux account's
+     `.bashrc` configuration file. To manually set the `PATH` variable, edit the
+     configuration file `~/.bashrc` as the *opensrf* Linux account and add the
+     following line:
++
+[source, bash]
+------------------------------------------------------------------------------
+export PATH=$PATH:/openils/bin
+------------------------------------------------------------------------------
++
+3. As the *opensrf* Linux account, generate the Web files needed by the web staff
+   client and catalog and update the organization unit proximity (you need to do
+   this the first time you start Evergreen, and after that each time you change the library org unit configuration.
+):
++
+[source, bash]
+------------------------------------------------------------------------------
+autogen.sh
+------------------------------------------------------------------------------
++
+4. As the *root* Linux account, restart the Apache Web server:
++
+[source, bash]
+------------------------------------------------------------------------------
+/etc/init.d/apache2 restart
+------------------------------------------------------------------------------
++
+If the Apache Web server was running when you started the OpenSRF services, you
+might not be able to successfully log in to the OPAC or web staff client until the
+Apache Web server is restarted.
+
+== Testing connections to Evergreen ==
+
+Once you have installed and started Evergreen, test your connection to
+Evergreen via `srfsh`. As the *opensrf* Linux account, issue the following
+commands to start `srfsh` and try to log onto the Evergreen server using the
+*egadmin* Evergreen administrator user name and password that you set using the
+`eg_db_config` command:
+
+[source, bash]
+------------------------------------------------------------------------------
+/openils/bin/srfsh
+srfsh% login <admin-user> <admin-pass>
+------------------------------------------------------------------------------
+
+You should see a result like:
+
+    Received Data: "250bf1518c7527a03249858687714376"
+    ------------------------------------
+    Request Completed Successfully
+    Request Time in seconds: 0.045286
+    ------------------------------------
+
+    Received Data: {
+       "ilsevent":0,
+       "textcode":"SUCCESS",
+       "desc":" ",
+       "pid":21616,
+       "stacktrace":"oils_auth.c:304",
+       "payload":{
+          "authtoken":"e5f9827cc0f93b503a1cc66bee6bdd1a",
+          "authtime":420
+       }
+
+    }
+
+    ------------------------------------
+    Request Completed Successfully
+    Request Time in seconds: 1.336568
+    ------------------------------------
+[[install-troubleshooting-1]]
+If this does not work, it's time to do some troubleshooting.
+
+  * As the *opensrf* Linux account, run the `settings-tester.pl` script to see
+    if it finds any system configuration problems. The script is found at
+    `Open-ILS/src/support-scripts/settings-tester.pl` in the Evergreen source
+    tree.
+  * Follow the steps in the http://evergreen-ils.org/dokuwiki/doku.php?id=troubleshooting:checking_for_errors[troubleshooting guide].
+  * If you have faithfully followed the entire set of installation steps
+    listed here, you are probably extremely close to a working system.
+    Gather your configuration files and log files and contact the
+    http://evergreen-ils.org/communicate/mailing-lists/[Evergreen development 
+mailing list] for assistance before making any drastic changes to your system
+    configuration.
+
+== Getting help ==
+
+Need help installing or using Evergreen? Join the mailing lists at
+http://evergreen-ils.org/communicate/mailing-lists/ or contact us on the Freenode
+IRC network on the #evergreen channel.
+
+== License ==
+
+This work is licensed under the Creative Commons Attribution-ShareAlike 3.0
+Unported License. To view a copy of this license, visit
+http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative
+Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
index 53608d9..180ef23 100644 (file)
@@ -20,7 +20,7 @@
 
 export PATH=${PATH}:/usr/sbin
 AC_PREREQ(2.61)
-AC_INIT(Open-ILS, trunk, open-ils-dev@list.georgialibraries.org)
+AC_INIT(Open-ILS, 3.9.0, open-ils-dev@list.georgialibraries.org)
 AC_CONFIG_SRCDIR([configure.ac])
 AC_CONFIG_MACRO_DIR([m4])
 AM_INIT_AUTOMAKE
index 27d501a..6409a7d 100644 (file)
@@ -7,7 +7,7 @@ All of the steps in this chapter are to be completed from the command line.
 == Software Prerequisites ==
 
   * **PostgreSQL**: The minimum supported version is 10.
-  * **Linux**: Evergreen 3.X.X has been tested on Debian Stretch
+  * **Linux**: Evergreen 3.9.0 has been tested on Debian Stretch
     (9.0), Debian Buster (10.0), Debian Bullseye (11.0), Ubuntu
     Bionic Beaver (18.04), and Ubuntu Focal Fossa (20.04).  If you
     are running an older version of these distributions, you may want
@@ -43,12 +43,12 @@ osrf_control --localhost --stop-all
  .. Back up the /openils directory.
 . Upgrade OpenSRF. Download and install the latest version of OpenSRF from
 the https://evergreen-ils.org/opensrf-downloads/[OpenSRF download page].
-. As the *opensrf* user, download and extract Evergreen 3.X.X:
+. As the *opensrf* user, download and extract Evergreen 3.9.0:
 +
 [source, bash]
 -----------------------------------------------
-wget https://evergreen-ils.org/downloads/Evergreen-ILS-3.X.X.tar.gz
-tar xzf Evergreen-ILS-3.X.X.tar.gz
+wget https://evergreen-ils.org/downloads/Evergreen-ILS-3.9.0.tar.gz
+tar xzf Evergreen-ILS-3.9.0.tar.gz
 -----------------------------------------------
 +
 [NOTE]
@@ -58,7 +58,7 @@ For the latest edition of Evergreen, check the https://evergreen-ils.org/egdownl
 +
 [source, bash]
 ---------------------------------------------
-cd /home/opensrf/Evergreen-ILS-3.X.X
+cd /home/opensrf/Evergreen-ILS-3.9.0
 ---------------------------------------------
 +
 On the next command, replace `[distribution]` with one of these values for your
@@ -83,7 +83,7 @@ make -f Open-ILS/src/extras/Makefile.install [distribution]
 +
 [source, bash]
 ------------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-3.X.X
+cd /home/opensrf/Evergreen-ILS-3.9.0
 PATH=/openils/bin:$PATH ./configure --prefix=/openils --sysconfdir=/openils/conf
 make
 ------------------------------------------------------------
@@ -94,7 +94,7 @@ These instructions assume that you have also installed OpenSRF under /openils/.
 +
 [source, bash]
 ------------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-3.X.X
+cd /home/opensrf/Evergreen-ILS-3.9.0
 make install
 ------------------------------------------------------------
 +
@@ -105,8 +105,8 @@ can supply `STAFF_CLIENT_STAMP` during the `make install` step like this:
 +
 [source, bash]
 ------------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-3.X.X
-make STAFF_CLIENT_STAMP_ID=rel_3_x_x install
+cd /home/opensrf/Evergreen-ILS-3.9.0
+make STAFF_CLIENT_STAMP_ID=rel_3_9_0 install
 ------------------------------------------------------------
 +
 . As the *root* user, change all files to be owned by the opensrf user and group:
@@ -123,7 +123,7 @@ chown -R opensrf:opensrf /openils
 ------------------------------------------------------------
 cd /openils/var/web/xul/
 rm server
-ln -sf rel_3_x_x/server server
+ln -sf rel_3_9_0/server server
 ------------------------------------------------------------
 +
 . As the *opensrf* user, update opensrf_core.xml and opensrf.xml by copying the
@@ -143,7 +143,7 @@ Copying these configuration files will remove any customizations you have made t
 +
 [source, bash]
 -------------------------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-3.X.X
+cd /home/opensrf/Evergreen-ILS-3.9.0
 perl Open-ILS/src/support-scripts/eg_db_config --update-config --service all \
 --create-offline --database evergreen --host localhost --user evergreen --password evergreen
 -------------------------------------------------------------------------
@@ -167,21 +167,21 @@ The diff command can be used to show the differences between the distribution ve
 +
 [source, bash]
 ----------------------------------------------------------
-cp /home/opensrf/Evergreen-ILS-3.X.X/Open-ILS/examples/apache/eg_startup /etc/apache2/eg_startup
+cp /home/opensrf/Evergreen-ILS-3.9.0/Open-ILS/examples/apache/eg_startup /etc/apache2/eg_startup
 ----------------------------------------------------------
 +
 .. Update /etc/apache2/eg_vhost.conf by copying the example from Open-ILS/examples/apache/eg_vhost.conf.
 +
 [source, bash]
 ----------------------------------------------------------
-cp /home/opensrf/Evergreen-ILS-3.X.X/Open-ILS/examples/apache/eg_vhost.conf /etc/apache2/eg_vhost.conf
+cp /home/opensrf/Evergreen-ILS-3.9.0/Open-ILS/examples/apache/eg_vhost.conf /etc/apache2/eg_vhost.conf
 ----------------------------------------------------------
 +
 .. Update /etc/apache2/sites-available/eg.conf by copying the example from Open-ILS/examples/apache/eg.conf.
 +
 [source, bash]
 ----------------------------------------------------------
-cp /home/opensrf/Evergreen-ILS-3.X.X/Open-ILS/examples/apache/eg.conf /etc/apache2/sites-available/eg.conf
+cp /home/opensrf/Evergreen-ILS-3.9.0/Open-ILS/examples/apache/eg.conf /etc/apache2/sites-available/eg.conf
 ----------------------------------------------------------
 
 == Upgrade the Evergreen database schema ==
@@ -237,8 +237,8 @@ as a user with the ability to connect to the database server.
 
 [source, bash]
 ----------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-3.X.X/Open-ILS/src/sql/Pg
-psql -U evergreen -h localhost -f version-upgrade/3.X.W-3.X.X-upgrade-db.sql evergreen
+cd /home/opensrf/Evergreen-ILS-3.9.0/Open-ILS/src/sql/Pg
+psql -U evergreen -h localhost -f version-upgrade/3.8.0-3.9.0-upgrade-db.sql evergreen
 ----------------------------------------------------------
 
 [TIP]