-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 9810eeb8c4c4f75bb7b3f48b8367c089e51c6ed3
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Wed Jun 23 12:17:15 2021 -0400
+
+ bumping Perl version string for 3.7.1
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+1 1 Open-ILS/src/perlmods/lib/OpenILS.pm
+
+commit faf5648218b1b4edb24b873353ddb7a30a055916
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Wed Jun 23 12:16:38 2021 -0400
+
+ Translation updates - po files
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+464 246 build/i18n/po/bootstrap-opac/cs-CZ.po
+453 237 build/i18n/po/bootstrap-opac/en-CA.po
+454 241 build/i18n/po/bootstrap-opac/es-ES.po
+455 249 build/i18n/po/bootstrap-opac/fr-CA.po
+7 5 build/i18n/po/cat.properties/en-CA.po
+31 22 build/i18n/po/circ.properties/en-CA.po
+3253 3025 build/i18n/po/db.seed/ar-JO.po
+3270 3031 build/i18n/po/db.seed/cs-CZ.po
+3228 3008 build/i18n/po/db.seed/de-DE.po
+3257 3028 build/i18n/po/db.seed/en-CA.po
+3229 3009 build/i18n/po/db.seed/en-GB.po
+3257 3029 build/i18n/po/db.seed/es-ES.po
+3230 3010 build/i18n/po/db.seed/fi-FI.po
+3228 3008 build/i18n/po/db.seed/fr-CA.po
+3228 3008 build/i18n/po/db.seed/he-IL.po
+3228 3008 build/i18n/po/db.seed/hu-HU.po
+3256 3028 build/i18n/po/db.seed/hy-AM.po
+3228 3008 build/i18n/po/db.seed/oc-FR.po
+3229 3009 build/i18n/po/db.seed/pt-BR.po
+3228 3008 build/i18n/po/db.seed/ru-RU.po
+3228 3008 build/i18n/po/db.seed/sv-SE.po
+3228 3008 build/i18n/po/db.seed/tr-TR.po
+2509 2448 build/i18n/po/fm_IDL.dtd/ar-JO.po
+2517 2453 build/i18n/po/fm_IDL.dtd/cs-CZ.po
+2495 2443 build/i18n/po/fm_IDL.dtd/de-DE.po
+2509 2448 build/i18n/po/fm_IDL.dtd/en-CA.po
+2509 2448 build/i18n/po/fm_IDL.dtd/en-GB.po
+2509 2448 build/i18n/po/fm_IDL.dtd/es-ES.po
+2509 2448 build/i18n/po/fm_IDL.dtd/fi-FI.po
+2495 2443 build/i18n/po/fm_IDL.dtd/fr-CA.po
+2495 2443 build/i18n/po/fm_IDL.dtd/he-IL.po
+2495 2443 build/i18n/po/fm_IDL.dtd/hu-HU.po
+2510 2449 build/i18n/po/fm_IDL.dtd/hy-AM.po
+2495 2443 build/i18n/po/fm_IDL.dtd/oc-FR.po
+2509 2448 build/i18n/po/fm_IDL.dtd/pt-BR.po
+2509 2448 build/i18n/po/fm_IDL.dtd/ru-RU.po
+2495 2443 build/i18n/po/fm_IDL.dtd/sv-SE.po
+2495 2443 build/i18n/po/fm_IDL.dtd/tr-TR.po
+56 38 build/i18n/po/ils_events.xml/ar-JO.po
+59 39 build/i18n/po/ils_events.xml/cs-CZ.po
+56 38 build/i18n/po/ils_events.xml/de-DE.po
+56 38 build/i18n/po/ils_events.xml/en-CA.po
+56 38 build/i18n/po/ils_events.xml/en-GB.po
+56 38 build/i18n/po/ils_events.xml/es-ES.po
+56 38 build/i18n/po/ils_events.xml/fi-FI.po
+56 38 build/i18n/po/ils_events.xml/fr-CA.po
+56 38 build/i18n/po/ils_events.xml/he-IL.po
+56 38 build/i18n/po/ils_events.xml/hu-HU.po
+56 38 build/i18n/po/ils_events.xml/hy-AM.po
+56 38 build/i18n/po/ils_events.xml/oc-FR.po
+56 38 build/i18n/po/ils_events.xml/pt-BR.po
+56 38 build/i18n/po/ils_events.xml/ru-RU.po
+56 38 build/i18n/po/ils_events.xml/sv-SE.po
+56 38 build/i18n/po/ils_events.xml/tr-TR.po
+11 3 build/i18n/po/kpac/ar-JO.po
+12 4 build/i18n/po/kpac/cs-CZ.po
+11 3 build/i18n/po/kpac/de-DE.po
+11 3 build/i18n/po/kpac/en-GB.po
+11 3 build/i18n/po/kpac/es-ES.po
+11 3 build/i18n/po/kpac/hy-AM.po
+5 5 build/i18n/po/lang.dtd/en-CA.po
+23 19 build/i18n/po/patron.properties/en-CA.po
+5 5 build/i18n/po/register.js/en-CA.po
+13 13 build/i18n/po/selfcheck.js/en-CA.po
+349 207 build/i18n/po/tpac/ar-JO.po
+352 210 build/i18n/po/tpac/cs-CZ.po
+349 207 build/i18n/po/tpac/de-DE.po
+349 207 build/i18n/po/tpac/en-CA.po
+349 207 build/i18n/po/tpac/en-GB.po
+349 207 build/i18n/po/tpac/es-ES.po
+349 207 build/i18n/po/tpac/fi-FI.po
+509 367 build/i18n/po/tpac/fr-CA.po
+349 207 build/i18n/po/tpac/he-IL.po
+349 207 build/i18n/po/tpac/hu-HU.po
+349 207 build/i18n/po/tpac/hy-AM.po
+349 207 build/i18n/po/tpac/oc-FR.po
+349 207 build/i18n/po/tpac/pt-BR.po
+349 207 build/i18n/po/tpac/ru-RU.po
+349 207 build/i18n/po/tpac/sv-SE.po
+349 207 build/i18n/po/tpac/tr-TR.po
+634 0 build/i18n/po/vandelay/en-CA.po
+350 180 build/i18n/po/webstaff/ar-JO.po
+805 635 build/i18n/po/webstaff/cs-CZ.po
+350 180 build/i18n/po/webstaff/de-DE.po
+356 184 build/i18n/po/webstaff/en-CA.po
+350 180 build/i18n/po/webstaff/en-GB.po
+350 180 build/i18n/po/webstaff/es-ES.po
+350 180 build/i18n/po/webstaff/hy-AM.po
+350 180 build/i18n/po/webstaff/ru-RU.po
+1262 0 new_upgrades.txt
+1256 0 old_upgrades.txt
+ create mode 100644 build/i18n/po/vandelay/en-CA.po
+ create mode 100644 new_upgrades.txt
+ create mode 100644 old_upgrades.txt
+
+commit 85fa2901c35a492ce3eaa3be5755816f03fc107f
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date: Wed Jun 23 12:11:33 2021 -0400
+
+ update Czech translations for Angular staff client
+
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+147 100 Open-ILS/src/eg2/src/locale/messages.cs-CZ.xtb
+
+commit 50113e92c002cffe3ed9090258300ce7b516151b
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Wed Jun 23 11:40:21 2021 -0400
+
+ Translation updates - newpot
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+84 80 build/i18n/po/bootstrap-opac/bootstrap-opac.pot
+67 57 build/i18n/po/db.seed/db.seed.pot
+62 58 build/i18n/po/tpac/tpac.pot
+138 130 build/i18n/po/webstaff/webstaff.pot
+
+commit 73df292bb512195c95e4c1338cc2ba889d427d91
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Wed Jun 23 08:27:18 2021 -0700
+
+ Docs: 3.7.1 release notes
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+169 98 docs/RELEASE_NOTES_3_7.adoc
+
+commit 92c042b6a8ea63d4772a74263c735eb6b3d9c182
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Wed Jun 23 08:02:43 2021 -0700
+
+ Docs: 3.6 release notes
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+119 0 docs/RELEASE_NOTES_3_6.adoc
+
+commit 4ce03b66e8babc369f36f8120f303ee8e8048eda
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Wed Jun 23 07:31:08 2021 -0700
+
+ Docs: Release notes for 3.5.5
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+28 0 docs/RELEASE_NOTES_3_5.adoc
+
+commit d3e1b7d7cb59b4a219ba8b151d5fd5f3700a8759
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date: Mon Jun 14 11:34:51 2021 -0400
+
+ LP#1930933: fix issue with over-escaping in search results title attributes
+
+ This patch fixes an issue where a record with a title containing the
+ word "hidden" can have its title, ironically enough, not show up
+ on public catalog search results.
+
+ To test
+ -------
+ [1] Create an OPAC-visible record whose 245 is something like:
+
+ =245 04$aThe hidden one <script>alert('title!')</script>
+
+ [2] Search for the record in both the TPAC and Bootstrap skin. Note
+ that the title isn't displayed.
+ [3] Apply the patch and repeat step 2. This time, the full title
+ should be displayed.
+ [4] Verify that the OPAC does not display an alert box.
+
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+ Signed-off-by: Jason Stephenson <jason@sigio.com>
+ Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
+
+5 5 Open-ILS/src/templates-bootstrap/opac/parts/result/table.tt2
+5 5 Open-ILS/src/templates/opac/parts/result/table.tt2
+
+commit cf413cf3b4f079ad2559aa2f54189689bb0426f7
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Mon Jan 4 16:12:50 2021 -0500
+
+ LP1910145 Angular Hold Detail Notes & Notifications
+
+ The hold detail view now displays hold notes and hold notification
+ records. Notes and Notifications may be created by staff. Notes may be
+ deleted by staff.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Garry Collum <gcollum@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+65 4 Open-ILS/src/eg2/src/app/staff/share/holds/detail.component.html
+69 11 Open-ILS/src/eg2/src/app/staff/share/holds/detail.component.ts
+5 1 Open-ILS/src/eg2/src/app/staff/share/holds/holds.module.ts
+37 0 Open-ILS/src/eg2/src/app/staff/share/holds/note-dialog.component.html
+48 0 Open-ILS/src/eg2/src/app/staff/share/holds/note-dialog.component.ts
+25 0 Open-ILS/src/eg2/src/app/staff/share/holds/notify-dialog.component.html
+45 0 Open-ILS/src/eg2/src/app/staff/share/holds/notify-dialog.component.ts
+8 0 Open-ILS/src/eg2/src/styles.css
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/holds/note-dialog.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/holds/note-dialog.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/holds/notify-dialog.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/share/holds/notify-dialog.component.ts
+
+commit 5933d87fe63cb19938787e6da24ebfc0a6fdf131
+Author: Dan Briem <dbriem@wlsmail.org>
+Date: Thu Jul 16 23:39:09 2020 -0400
+
+ LP#1887876 Checkout catalog doesn't load workstation prefs
+
+ The catalog under the Holds tab in the Checkout interface
+ doesn't load the default search or preferred library if
+ you haven't visited the main catalog page earlier in the
+ session.
+
+ This branch sets these settings as cookies in the
+ AngularJS wrapper for the catalog embedded in the Checkout
+ interface under the Holds tab.
+
+ Test:
+ 1. Close browser, open browser, log into Evergreen
+ 2. Admin->Workstation set search & preferred library
+ 3. Open a patron record -> Holds tab -> Place Holds
+ 4. Search for an item owned by your preferred library
+ 5. Note the library's copies aren't separately indicated
+ 6. Apply patch and repeat steps 1-5
+ 7. Note the library's copies are separately indicated
+
+ Signed-off-by: Dan Briem <dbriem@wlsmail.org>
+ Signed-off-by: Gina Monti <gmonti@biblio.org>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+10 2 Open-ILS/web/js/ui/default/staff/circ/patron/holds.js
+
+commit e3872a1b35424dc934a3c00ccb4dcfe50511c524
+Author: Dan Briem <dbriem@wlsmail.org>
+Date: Fri May 28 12:58:27 2021 -0400
+
+ LP#1930088 Angular catalog: metarecord search returns no results
+
+ This adds a missing param to a call to get_one_record_summary
+ that's necessary after commit c07ce8.
+
+ To test, perform a search using the Group Formats/Editions checkbox
+ and you should see results.
+
+ Signed-off-by: Dan Briem <dbriem@wlsmail.org>
+ Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1 1 Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+
+commit f85daf0fa6947158490ec18e02b1d058ddca6aed
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date: Fri Jun 4 10:41:30 2021 -0400
+
+ LP#1895738: stamp schema update
+
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+1 3 Open-ILS/src/sql/Pg/upgrade/{XXXX.data.patron-search-org-select.sql => 1265.data.patron-search-org-select.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.data.patron-search-org-select.sql => 1265.data.patron-search-org-select.sql} (82%)
+
+commit b53f9fad0edfdff9c0c11e66d4987fa39c59f55a
+Author: Jason Etheridge <jason@EquinoxInitiative.org>
+Date: Thu Oct 1 11:45:44 2020 -0400
+
+ lp1895738 need eg.orgselect.hopeless.wide_holds
+
+ This fixes the following:
+
+ ERROR Error: Uncaught (in promise): No user or workstation setting type exists for: "eg.orgselect.hopeless.wide_holds".
+ Create a ws/user setting type or use setLocalItem() to store the value locally.
+
+ However, it exposes a different (harmless?) error within the /eg2 holds grid:
+
+ ERROR Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value for 'ng-untouched': 'true'. Current value: 'false'.
+
+ Signed-off-by: Jason Etheridge <jason@EquinoxInitiative.org>
+ Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+7 0 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+17 0 Open-ILS/src/sql/Pg/upgrade/XXXX.data.patron-search-org-select.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.patron-search-org-select.sql
+
+commit a7bb315e017f7078bbac61d08b23e8f37fd29dc9
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date: Fri Jun 4 10:07:40 2021 -0400
+
+ LP#1901893: (follow-up) add cellTextGenerator
+
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1 0 Open-ILS/src/eg2/src/app/staff/admin/local/admin-carousel.component.html
+5 1 Open-ILS/src/eg2/src/app/staff/admin/local/admin-carousel.component.ts
+
+commit a0da4467f4057b243d9f9c0ed27016f12a0a3939
+Author: Michele Morgan <mmorgan@noblenet.org>
+Date: Fri Mar 19 17:31:06 2021 +0000
+
+ LP1901893 Bucket column link tweak
+
+ Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+ Signed-off-by: Garry Collum <gcollum@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1 1 Open-ILS/src/eg2/src/app/staff/admin/local/admin-carousel.component.html
+
+commit 3da61a27c938fe7e5adeb5484ab8ffd18ecc03a1
+Author: Terran McCanna <tmccanna@georgialibraries.org>
+Date: Wed Oct 28 18:41:27 2020 -0400
+
+ LP1901893 Carousel bucket should be linked from grid
+
+ Re-formats the bucket column content as a link that opens the
+ carousel's associated bucket in a new tab.
+
+ Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+ Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+ Signed-off-by: Garry Collum <gcollum@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+6 1 Open-ILS/src/eg2/src/app/staff/admin/local/admin-carousel.component.html
+
+commit be739100b67e6f3e92d495692534ad9b07574e28
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date: Wed Jun 2 11:24:00 2021 -0400
+
+ LP#1778955: 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.function.builtin_array_remove.sql => 1264.function.builtin_array_remove.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.function.builtin_array_remove.sql => 1264.function.builtin_array_remove.sql} (99%)
+
+commit 1b3396b06abe9eff29e4224e6990445a7c84e26d
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Thu Aug 6 08:08:50 2020 -0700
+
+ LP#1778955: fixing upgrade script, removing duplicate function definition
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+ Signed-off-by: Rogan Hamby <rogan.hamby@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+0 5 Open-ILS/src/sql/Pg/990.schema.unapi.sql
+2 7 Open-ILS/src/sql/Pg/upgrade/XXXX.function.builtin_array_remove.sql
+
+commit 128ee8d7ba19d7d451c6120f39afb6c6dd4f3e12
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Fri Jun 22 14:29:26 2018 -0400
+
+ LP#1778955: Remove our custom version of array_remove(anyarray,anyelement)
+
+ As of Postgres 9.3 there is a built in array_remove() function that is faster
+ than our custom version that uses unnest(). We should use that instead.
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+ Signed-off-by: Rogan Hamby <rogan.hamby@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+0 2 Open-ILS/src/sql/Pg/000.functions.general.sql
+1 1 Open-ILS/src/sql/Pg/011.schema.authority.sql
+1 1 Open-ILS/src/sql/Pg/030.schema.metabib.sql
+59 59 Open-ILS/src/sql/Pg/990.schema.unapi.sql
+1355 0 Open-ILS/src/sql/Pg/upgrade/XXXX.function.builtin_array_remove.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.builtin_array_remove.sql
+
+commit 55d40aca5150fe3bea17b2fba0b2e03420dc12dd
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Thu May 27 19:32:27 2021 -0700
+
+ LP1922120: Add to carousel action in angular catalog
+
+ To test:
+
+ 1) Create several manual carousels, and make sure they are
+ set to active.
+ 2) Open a bib record in the Angular staff catalog.
+ 3) Under Other Actions, choose the "Add to Carousel" action
+ 4) Choose your preferred carousel.
+ 5) Click Add to carousel.
+ 6) Go back to carousel administration (or look at the carousel
+ itself), and confirm that the record has been added to the
+ carousel in question.
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+ Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+2 0 Open-ILS/src/eg2/src/app/staff/catalog/catalog.module.ts
+15 9 Open-ILS/src/eg2/src/app/staff/catalog/record/actions.component.html
+31 0 Open-ILS/src/eg2/src/app/staff/catalog/record/add-to-carousel-dialog.component.html
+86 0 Open-ILS/src/eg2/src/app/staff/catalog/record/add-to-carousel-dialog.component.ts
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/record/add-to-carousel-dialog.component.html
+ create mode 100644 Open-ILS/src/eg2/src/app/staff/catalog/record/add-to-carousel-dialog.component.ts
+
+commit 2c2a4903325313e8617f30580a7de997c455a742
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date: Tue Jun 1 10:27:35 2021 -0400
+
+ docs: fix typo in 3.6 release notes
+
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1 1 docs/RELEASE_NOTES_3_6.adoc
+
+commit 3d15e186f93c841c517c11b50641e8cdf4d80731
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Fri May 28 18:52:14 2021 -0700
+
+ Docs: radio monograph part selector in OPAC
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+1 0 docs/modules/admin_initial_setup/nav.adoc
+22 0 docs/modules/admin_initial_setup/pages/managing_holds_ui_in_tpac.adoc
+ create mode 100644 docs/modules/admin_initial_setup/pages/managing_holds_ui_in_tpac.adoc
+
+commit 0076dddaa4f6595b2fbb332e736dbab5b7aeb904
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Fri May 28 18:03:07 2021 -0700
+
+ Docs: add admin docs for multiple holds feature
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+1 0 docs/modules/local_admin/nav.adoc
+44 0 docs/modules/local_admin/pages/multiple_holds_admin.adoc
+ create mode 100644 docs/modules/local_admin/pages/multiple_holds_admin.adoc
+
+commit b7a5df084d5a7ff5044af6262e31887512c9a9d8
+Author: Stephen Wills <swills@beyond-print.com>
+Date: Fri May 28 17:30:07 2021 -0700
+
+ Docs: Update migrating_your_data.adoc
+
+ Signed-off-by: Stephen Wills <swills@beyond-print.com>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+13 0 docs/modules/admin_initial_setup/pages/migrating_your_data.adoc
+
+commit 11bced30e854b0b7a9590a15586ee20970671275
+Author: Stephen Wills <swills@beyond-print.com>
+Date: Fri May 28 17:13:14 2021 -0700
+
+ Update librarysettings.doc
+
+ Signed-off-by: Stephen Wills <swills@beyond-print.com>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+2 1 docs/modules/admin/pages/librarysettings.adoc
+
+commit b83fe4121ff5817948f731f79193537aa0a0b9ea
+Author: katiegmartin <38866437+katiegmartin@users.noreply.github.com>
+Date: Mon Oct 26 12:07:15 2020 -0400
+
+ Docs: LP 1751146 browser bookmarks toolbar
+
+ Add tips for using the browser bookmarks toolbar in place of the XUL button bar
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+8 0 docs/modules/admin/pages/web-client-browser-best-practices.adoc
+11 0 docs/modules/admin/partials/toolbars-with-bookmarks-chrome.adoc
+10 0 docs/modules/admin/partials/toolbars-with-bookmarks-firefox.adoc
+ create mode 100644 docs/modules/admin/partials/toolbars-with-bookmarks-chrome.adoc
+ create mode 100644 docs/modules/admin/partials/toolbars-with-bookmarks-firefox.adoc
+
+commit e9ce2e30f0f7d665fe25964fb4cd0c4c61fb65ea
+Author: katiegmartin <38866437+katiegmartin@users.noreply.github.com>
+Date: Mon Oct 26 11:21:52 2020 -0400
+
+ Docs: LP 1250528 change font size in browser
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+3 0 docs/modules/admin/pages/web-client-browser-best-practices.adoc
+
+commit a7b001f8ba2658e5f6c0481e25edbb345792ff35
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Fri May 28 15:51:09 2021 -0700
+
+ Docs: small follow-up tweaks to survey documentation
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+5 5 docs/modules/admin/pages/surveys.adoc
+
+commit f3363b7006ca627a638ae94a2d7b43c15618399e
+Author: Lynn Floyd <alynn2671@gmail.com>
+Date: Fri May 28 11:21:18 2021 -0400
+
+ Updated Surveys Pictures
+
+ Updated images for Surveys.
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+- - docs/modules/admin/assets/images/media/survey_qa.png
+- - docs/modules/admin/assets/images/{media => surveys}/survey-datepicker.png
+- - docs/modules/admin/assets/images/{media => surveys}/survey-new.png
+- - docs/modules/admin/assets/images/surveys/survey-newanswer.png
+- - docs/modules/admin/assets/images/surveys/survey-newquestion.png
+- - docs/modules/admin/assets/images/{media => surveys}/survey.png
+- - docs/modules/admin/assets/images/{media => surveys}/survey_edit.png
+- - docs/modules/admin/assets/images/surveys/survey_edit2.png
+- - docs/modules/admin/assets/images/surveys/survey_patronrecord.png
+- - docs/modules/admin/assets/images/surveys/survey_qa.png
+- - docs/modules/admin/assets/images/surveys/survey_staffview.png
+10 11 docs/modules/admin/pages/surveys.adoc
+1 0 docs/modules/local_admin/nav.adoc
+ delete mode 100644 docs/modules/admin/assets/images/media/survey_qa.png
+ rename docs/modules/admin/assets/images/{media => surveys}/survey-datepicker.png (100%)
+ rename docs/modules/admin/assets/images/{media => surveys}/survey-new.png (100%)
+ create mode 100644 docs/modules/admin/assets/images/surveys/survey-newanswer.png
+ create mode 100644 docs/modules/admin/assets/images/surveys/survey-newquestion.png
+ rename docs/modules/admin/assets/images/{media => surveys}/survey.png (100%)
+ rename docs/modules/admin/assets/images/{media => surveys}/survey_edit.png (100%)
+ create mode 100644 docs/modules/admin/assets/images/surveys/survey_edit2.png
+ create mode 100644 docs/modules/admin/assets/images/surveys/survey_patronrecord.png
+ create mode 100644 docs/modules/admin/assets/images/surveys/survey_qa.png
+ create mode 100644 docs/modules/admin/assets/images/surveys/survey_staffview.png
+
+commit 55a07ddd1b69a6d68f724b833edec8aca3b3f653
+Author: Lynn Floyd <alynn2671@gmail.com>
+Date: Wed May 5 16:42:44 2021 -0400
+
+ DOC Addding Survey Administration
+
+ Adding Survey Adminstration to Documentation
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+- - docs/modules/admin/assets/images/media/survey-datepicker.png
+- - docs/modules/admin/assets/images/media/survey-new.png
+- - docs/modules/admin/assets/images/media/survey.png
+- - docs/modules/admin/assets/images/media/survey_edit.png
+- - docs/modules/admin/assets/images/media/survey_qa.png
+118 0 docs/modules/admin/pages/surveys.adoc
+ create mode 100644 docs/modules/admin/assets/images/media/survey-datepicker.png
+ create mode 100644 docs/modules/admin/assets/images/media/survey-new.png
+ create mode 100644 docs/modules/admin/assets/images/media/survey.png
+ create mode 100644 docs/modules/admin/assets/images/media/survey_edit.png
+ create mode 100644 docs/modules/admin/assets/images/media/survey_qa.png
+ create mode 100644 docs/modules/admin/pages/surveys.adoc
+
+commit cb8ad060d62e3cb8f45e2ce6ede9b0054cf25de6
+Author: Rosie Le Faive <lefaive@gmail.com>
+Date: Fri May 28 15:05:57 2021 -0300
+
+ DOC Add message about version switching.
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+5 0 docs/modules/shared/pages/about_this_documentation.adoc
+
+commit ab377d852280d6a769e8f9df10a15df76c21afdb
+Author: Jennifer Pringle <jennifer.pringle@bc.libraries.coop>
+Date: Fri May 28 12:32:26 2021 -0700
+
+ New billing section added and the circulation nav menu updated.
+
+ Billing docs come from Sitka's Evergreen manual.
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+2 1 docs/modules/circulation/nav.adoc
+139 0 docs/modules/circulation/pages/billing.adoc
+ create mode 100644 docs/modules/circulation/pages/billing.adoc
+
+commit 64f8cbe9a48572ae4eac9a8119760f576bbf3695
+Author: Rosie Le Faive <lefaive@gmail.com>
+Date: Fri May 28 16:39:35 2021 -0300
+
+ DOC Elaborate on what Items and bib records are.
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+4 2 docs/modules/appendix/pages/glossary.adoc
+
+commit f5f0c46ac0b9a7a345eee1cbcab5590d43809eee
+Author: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+Date: Fri May 28 15:32:38 2021 -0400
+
+ docs: glossary additions
+
+ Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+ Signed-off-by: Jason Etheridge <jason@EquinoxOLI.org>
+
+5 1 docs/modules/appendix/pages/glossary.adoc
+
+commit 70e0b3da1e1fda600dad53770ca6db43d20d30ae
+Author: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+Date: Fri May 28 15:14:28 2021 -0400
+
+ docs: circ docs fixes
+
+ Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+ Signed-off-by: Jason Etheridge <jason@EquinoxOLI.org>
+
+1 1 docs/modules/circulation/pages/basic_holds.adoc
+1 0 docs/modules/circulation/pages/circulating_items_web_client.adoc
+
+commit a05d20c0033ac520fe4cd15ea99e4304976d78c5
+Author: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+Date: Fri May 28 14:37:13 2021 -0400
+
+ docs: admin docs fixes
+
+ Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+ Signed-off-by: Jason Etheridge <jason@EquinoxOLI.org>
+
+1 1 docs/modules/admin/pages/Org_Unit_Proximity_Adjustments.adoc
+4 3 docs/modules/admin/pages/audio_alerts.adoc
+7 6 docs/modules/admin/pages/circing_uncataloged_materials.adoc
+17 5 docs/modules/admin/pages/ebook_api.adoc
+2 0 docs/modules/admin/pages/ebook_api_service.adoc
+1 1 docs/modules/admin/pages/purge_holds.adoc
+1 1 docs/modules/admin/pages/purge_user_activity.adoc
+4 3 docs/modules/admin/pages/search_settings_web_client.adoc
+6 1 docs/modules/admin_initial_setup/nav.adoc
+
+commit e0862ae0ac8e91925fe703e71854a66185d32445
+Author: blake <blake@mobiusconsortium.org>
+Date: Fri May 28 13:19:02 2021 -0500
+
+ Docs: Fixed antora landing page
+
+ Signed-off-by: blake <blake@mobiusconsortium.org>
+ Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+1 1 docs/site.yml
+
+commit 121aae56b981da38e0b172caae2bcfc8ea8f6c2e
+Author: Jennifer Pringle <jennifer.pringle@bc.libraries.coop>
+Date: Fri May 28 08:46:20 2021 -0700
+
+ Added Holdings Details Defaults to Holdings Editor section.
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+- - docs/modules/cataloging/assets/images/media/holdings-editor-defaults-2.png
+26 0 docs/modules/cataloging/pages/volcopy_editor.adoc
+ create mode 100644 docs/modules/cataloging/assets/images/media/holdings-editor-defaults-2.png
+
+commit 5fbbdae0bd084bbaf59536a339c91a95f100d6f0
+Author: Rosie Le Faive <lefaive@gmail.com>
+Date: Fri May 28 11:41:49 2021 -0300
+
+ DOCS: Update auth proxy xml in docs to match example
+
+ Also, move file to better admin_local_setup folder and update nav
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+1 1 docs/modules/admin_initial_setup/nav.adoc
+3 0 docs/modules/{admin => admin_initial_setup}/pages/authentication_proxy.adoc
+ rename docs/modules/{admin => admin_initial_setup}/pages/authentication_proxy.adoc (98%)
+
+commit a14ae70bb6fdc394f5f1ef2b1c048a0e4708109a
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Thu May 27 10:23:01 2021 -0700
+
+ Docs: small asciidoc syntax fix
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+2 2 docs/modules/local_admin/pages/negative_balances.adoc
+
+commit 308e9d69715cefebcb29eec5b8b67e94d47670c2
+Author: Lynn Floyd <alynn2671@gmail.com>
+Date: Mon May 24 16:26:25 2021 -0400
+
+ Docs: Update Navigation for Negative Balances
+
+ Adding Navigations
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+1 0 docs/modules/local_admin/nav.adoc
+
+commit 7a0b7754741e4dfac43a450b4b3731c6fd01434c
+Author: Lynn Floyd <alynn2671@gmail.com>
+Date: Mon May 24 16:23:54 2021 -0400
+
+ Docs: Adding Negative Balances
+
+ Adding documentations for Patron with Negative Balances Screen.
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+- - docs/modules/local_admin/assets/images/negative_balances.jpg
+22 0 docs/modules/local_admin/pages/negative_balances.adoc
+ create mode 100644 docs/modules/local_admin/assets/images/negative_balances.jpg
+ create mode 100644 docs/modules/local_admin/pages/negative_balances.adoc
+
+commit 892c8bfd0ee41d2a8e74a127ea7251769334fdaf
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Thu May 27 09:20:19 2021 -0700
+
+ Docs: fix antora build asciidoc warnings
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+2 2 docs/modules/admin/pages/librarysettings.adoc
+8 8 docs/modules/admin/pages/receipt_template_editor.adoc
+41 41 docs/modules/cataloging/pages/record_buckets.adoc
+24 24 docs/modules/development/pages/intro_opensrf.adoc
+3 3 docs/modules/opac/pages/search_form.adoc
+
+commit 038305b1bb9692ce1631f072a820ac21e0d82f2e
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Thu May 27 08:45:11 2021 -0700
+
+ Docs: Adding more info about credit card payments
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+30 1 docs/modules/admin/pages/accepting_credit_card_payments.adoc
+
+commit f0ebe37b9386b269c5fb666556cc50d7e655c001
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date: Wed May 26 16:23:23 2021 -0400
+
+ LP#1913338: 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.data.staffcat-sticky-search-form.sql => 1263.data.staffcat-sticky-search-form.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.data.staffcat-sticky-search-form.sql => 1263.data.staffcat-sticky-search-form.sql} (81%)
+
+commit 4ebcceef95fec06fc718003f2fc37723d8cf3f09
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date: Wed May 26 16:20:05 2021 -0400
+
+ LP#1913338: (follow-up) aria-hide the icon names
+
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+2 2 Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.html
+
+commit 7f27b05e8ac22b11bc41c132e6f1ea485d22629e
+Author: Chris Sharp <csharp@georgialibraries.org>
+Date: Wed Feb 17 10:26:47 2021 -0500
+
+ LP#1913338: Typo correction
+
+ Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1 0 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit 75e9fe0a6c381f8cf508c595bf7dc82701b9707f
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Thu Jan 28 10:32:11 2021 -0500
+
+ LP1913338 Catalog search form visibility stickiness
+
+ On pages in the Angular staff catalog where the search form is collapsed
+ by default, users may now also manually expand and re-collapse the form.
+ The last used choice will be sticky via new workstation setting.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Elaine Hardy <ehardy@georgialibraries.org>
+ Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+ Signed-off-by: Gina Monti <gmonti@biblio.org>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1 0 Open-ILS/src/eg2/src/app/staff/catalog/resolver.service.ts
+9 4 Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.html
+36 20 Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.ts
+9 0 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+15 0 Open-ILS/src/sql/Pg/upgrade/XXXX.data.staffcat-sticky-search-form.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.staffcat-sticky-search-form.sql
+
+commit 4e5f8991715da4700da5d1cba952845a82828106
+Author: Garry Collum <gcollum@gmail.com>
+Date: Fri Oct 30 15:55:35 2020 -0400
+
+ lp1902302 Opac. SMS and Carriers appear in Edit Holds Regardless of OU Setting.
+
+ The SMS Number field and Default Carrier field display when editing an
+ individual hold in the opac, regardless of the 'Enable features that send SMS text messages' setting.
+ This patch rectifies that behavior.
+
+ To test.
+ Set the 'Enable features that send SMS text messages' to False.
+ Place a hold for a patron.
+ Login to the opac as that patron and view the holds.
+ Edit the hold, and notice that the SMS and Carrier fields are displayed.
+
+ Apply the patch.
+ Refresh the edit form. The fields no longer display.
+
+ Set the 'Enable features that send SMS text messages' to True.
+ Refresh the edit form. The fields now display.
+
+ Signed-off-by: Garry Collum <gcollum@gmail.com>
+ Signed-off-by: Kyle Huckins <khuckins@catalyte.io>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+2 0 Open-ILS/src/templates/opac/myopac/holds/edit.tt2
+
+commit 5624fdfb598dee777479560044789f22578df7d1
+Author: Jason Boyer <JBoyer@equinoxinitiative.org>
+Date: Fri Oct 30 16:06:17 2020 -0400
+
+ LP1901710: Properly nest HTML tags and TT2 directives
+
+ This is a first pass at cleaning these up and the W3C's
+ HTML validator is a lot happier about some of the pages,
+ but the advanced search page at least needs some TLC.
+
+ I'm having trouble getting the shelving location selector
+ to appear at all and the aria complaints will require more
+ fixing.
+
+ Signed-off-by: Jason Boyer <JBoyer@equinoxinitiative.org>
+ Signed-off-by: Garry Collum <gcollum@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+3 1 Open-ILS/src/templates-bootstrap/opac/css/style.css.tt2
+1 1 Open-ILS/src/templates-bootstrap/opac/parts/advanced/global_row.tt2
+12 12 Open-ILS/src/templates-bootstrap/opac/parts/advanced/search.tt2
+5 6 Open-ILS/src/templates-bootstrap/opac/parts/record/extras.tt2
+7 5 Open-ILS/src/templates-bootstrap/opac/parts/record/summary.tt2
+1 1 Open-ILS/src/templates-bootstrap/opac/parts/searchbar.tt2
+0 1 Open-ILS/src/templates-bootstrap/opac/results.tt2
+
+commit 74968fa621e4a06431afc5c291e14e7b1659d038
+Author: Garry Collum <gcollum@gmail.com>
+Date: Thu Feb 25 16:02:50 2021 -0500
+
+ LP1916936-Bootstrap opac: item tags display as separate copies on small screen.
+
+ This fixes the display of item tags and item notes in the bootstrap opac.
+ It also cleans up some <a> tags that had class defined twice.
+
+ To test.
+ 1. Add an item tag and an item note to an item.
+ 2. In the bootstrap opac make the screen as small as possible.
+ Notice that the display shows the tags and items as copies.
+ 3. Apply the patch and repeat. The tags and notes should be displayed with the item that they are associated with.
+
+ Signed-off-by: Garry Collum <gcollum@gmail.com>
+ Signed-off-by: Mary Llewellyn <mllewell@biblio.org>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+8 0 Open-ILS/src/templates-bootstrap/opac/css/style.css.tt2
+25 28 Open-ILS/src/templates-bootstrap/opac/parts/record/copy_table.tt2
+7 8 Open-ILS/src/templates-bootstrap/opac/parts/record/summary.tt2
+
+commit 6f3f83cf28884ffbaac20436e8a11430c28670ef
+Author: Garry Collum <gcollum@gmail.com>
+Date: Tue Jan 5 16:26:55 2021 -0500
+
+ LP1910288 Bootstrap opac: E-items lines always display in account summary.
+
+ The E-item summary of ckos and holds always display in the My Account Summary of the Bootstrap Opac
+ regardless of the ebook_api.enabled flag in config.tt2. This fixes that issue.
+
+ It also sets both the ebook_api.enabled and ebok_api.ebook_test.enabled flags to default to false.
+
+ To test:
+ 1. Set ebook_api.enabled in config.tt2 to false.
+ 2. Look at a patron's account summary and notice that it displays the e-item lines.
+ 3. Apply the patch.
+ 4. The E-item lines are now suppressed.
+
+ Signed-off-by: Garry Collum <gcollum@gmail.com>
+ Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+2 0 Open-ILS/src/templates-bootstrap/opac/myopac/main.tt2
+2 2 Open-ILS/src/templates-bootstrap/opac/parts/config.tt2
+
+commit beb99585e2ef0e8e3710615b576f14de2f54c5e4
+Author: Garry Collum <gcollum@gmail.com>
+Date: Thu Mar 18 13:49:32 2021 -0400
+
+ LP1920042 Bootstrap Opac: Simple Selector in Advanced Search
+
+ Fixes the simple selector in advanced search.
+
+ To Test:
+ 1. Go to Administration - Server Administration - MARC Coded Value Maps
+ 2. Assign the 'Is Simple Selector' option to some record attributes.
+ In concerto:
+ Lang - French, German
+ Type - Musical Sound Recording
+ Are good choices to test searching.
+ 3. Notice in advanced search that these options no longer appear in the
+ Language or Item Type search filters.
+ 4. Apply the patch.
+ 5. The simple selector options should now appear at the top of each search
+ filter category.
+ 6. Perform some searches using the simple selector options.
+
+ Signed-off-by: Garry Collum <gcollum@gmail.com>
+ Signed-off-by: Elaine Hardy <ehardy@georgialibraries.org>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+19 2 Open-ILS/src/templates-bootstrap/opac/parts/check_value_selector.tt2
+
+commit 2a8a292554dbed028c917a581707418be56ac5e6
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date: Tue May 25 10:33:28 2021 -0400
+
+ LP#1923225: stamp DB 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.search_highlight_escape_html.sql => 1262.schema.search_highlight_escape_html.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.search_highlight_escape_html.sql => 1262.schema.search_highlight_escape_html.sql} (98%)
+
+commit 018c717e0151ad4cbeeebe8dc9c2bca546931023
+Author: Jeff Davis <jdavis@sitka.bclibraries.ca>
+Date: Mon Apr 26 14:33:51 2021 -0700
+
+ LP#1923225: clean up some double-escaping of HTML in record display
+
+ Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
+ Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+0 1 Open-ILS/src/templates-bootstrap/opac/parts/record/contents.tt2
+2 2 Open-ILS/src/templates-bootstrap/opac/parts/record/series.tt2
+2 2 Open-ILS/src/templates/opac/parts/record/series.tt2
+
+commit 99d6eaa3413e95a1ee7043ea2096fb11d68e1967
+Author: Galen Charlton <gmc@equinoxinitiative.org>
+Date: Wed Apr 14 14:30:39 2021 -0400
+
+ LP#1923225: have search highlighting stored procedure do HTML-escaping
+
+ This patch builds on the previous work to have the stored procedures
+ that produced highlighted and unhighlighted versions of display
+ attributes HTML-escape the source values, then adjusts the TPAC
+ and Bootstrap templates to avoid double-escaping.
+
+ Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+3 3 Open-ILS/src/sql/Pg/300.schema.staged_search.sql
+118 0 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.search_highlight_escape_html.sql
+1 1 Open-ILS/src/templates-bootstrap/opac/parts/record/subjects.tt2
+3 3 Open-ILS/src/templates-bootstrap/opac/parts/record/summary.tt2
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.search_highlight_escape_html.sql
+
+commit da438c19db88f5f49a0f9c4bb2fd1ae11f91d705
+Author: Jeff Davis <jdavis@sitka.bclibraries.ca>
+Date: Tue Apr 13 16:05:41 2021 -0700
+
+ LP#1923225: fix handling of untruncated display fields in accordion
+
+ A previous commit used the TT2 "html" filter to escape strings to which the
+ accordion macro is applied, but which don't get truncated. But that's
+ incompatible with display fields, which contain embedded HTML and
+ therefore shouldn't be escaped in that way. This commit uses
+ HTML::Defang on untruncated accordion input instead (which is consistent
+ with how truncated strings are handled by the same macro).
+
+ Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
+ Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+6 0 Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm
+2 2 Open-ILS/src/templates/opac/parts/misc_util.tt2
+
+commit 6bf5b62a6063ea8fac91c0a7f8bca4c7c32ba859
+Author: Jeff Davis <jdavis@sitka.bclibraries.ca>
+Date: Tue Apr 13 15:56:34 2021 -0700
+
+ LP#1923225: avoid over-escaping ISBNs and ISSNs
+
+ Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
+ Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+2 2 Open-ILS/src/templates-bootstrap/opac/parts/record/summary.tt2
+2 2 Open-ILS/src/templates/opac/parts/record/summary.tt2
+
+commit 9423b4373d003d44a7a333f2b1b6a1d6bdf26389
+Author: Dan Briem <dbriem@wlsmail.org>
+Date: Thu May 20 13:05:21 2021 -0400
+
+ LP#1928684 Catalog view holds tab sort by patron barcode error
+
+ This changes the Patron Barcode column name to ucard_barcode to
+ match the field name in the database.
+
+ Note: due to the name change, users who saved the column on the
+ grid will have to add it again.
+
+ To test:
+ 1. Go to the View Holds tab on a record that has hold requests
+ 2. Add the Patron Barcode column to the grid
+ 3. Sort by the barcode column and note that it works
+ 4. It's a good idea to test that the grid settings save properly
+
+ Signed-off-by: Dan Briem <dbriem@wlsmail.org>
+ Signed-off-by: Garry Collum <gcollum@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1 1 Open-ILS/src/eg2/src/app/staff/share/holds/grid.component.html
+1 1 Open-ILS/src/eg2/src/app/staff/share/holds/grid.component.ts
+
+commit dd340514e504f0453f8a6e10bad253d24ad1a71c
+Author: katiegmartin <38866437+katiegmartin@users.noreply.github.com>
+Date: Mon May 24 15:52:32 2021 -0400
+
+ DOCS LP 1857917 Update glossary.adoc to include IDL
+
+ LP bug https://bugs.launchpad.net/evergreen/+bug/1857917
+ Add IDL definition to glossary, with synonym link to Fieldmapper IDL & change anchor point for F heading
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+3 1 docs/modules/appendix/pages/glossary.adoc
+
+commit 55fb5e7c97cde1065d6b75763c5b682fb0fb18e1
+Author: Tiffany Little <tlittle@georgialibraries.org>
+Date: Sun Jan 17 14:49:13 2021 -0500
+
+ LP1912097 Add timestamps
+
+ Adds timestamps to the date columns in Acquisitions Search.
+
+ Signed-off-by: Tiffany Little <tlittle@georgialibraries.org>
+ Signed-off-by: Mike Risher <mrisher@catalyte.io>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+2 1 Open-ILS/src/eg2/src/app/staff/acq/search/invoice-results.component.html
+2 0 Open-ILS/src/eg2/src/app/staff/acq/search/lineitem-results.component.html
+2 0 Open-ILS/src/eg2/src/app/staff/acq/search/picklist-results.component.html
+3 3 Open-ILS/src/eg2/src/app/staff/acq/search/purchase-order-results.component.html
+
+commit b73463610aa7251927fd9685af1b97c7d12e2f98
+Author: Dan Briem <dbriem@wlsmail.org>
+Date: Fri Apr 9 18:19:02 2021 -0400
+
+ LP#1918362 Unchanged workstation settings applied on every checkin
+
+ * Stop attempting to save the Update Inventory setting on every
+ checkin - incorrect prefix & redundant (it's a modifier now)
+ * Stop saving the Strict Barcode setting on every checkin,
+ renewal, and checkout
+ * Save Strict Barcode on user interaction with its checkbox
+
+ To test:
+ 1. confirm Strict Barcode and Do Inventory Update settings still
+ apply and are "sticky" on the Circulation->Checkin interface
+ 2. confirm Strict Barcode still applies and is "sticky" on the
+ Circulation->Renew Items and Circulation->Checkout interfaces
+
+ Signed-off-by: Dan Briem <dbriem@wlsmail.org>
+ Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+2 1 Open-ILS/src/templates/staff/circ/checkin/t_checkin.tt2
+2 1 Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+2 1 Open-ILS/src/templates/staff/circ/renew/t_renew.tt2
+7 2 Open-ILS/web/js/ui/default/staff/circ/checkin/app.js
+7 1 Open-ILS/web/js/ui/default/staff/circ/patron/checkout.js
+7 1 Open-ILS/web/js/ui/default/staff/circ/renew/app.js
+
+commit 4c89c04d2aafdff3fb8daeba7c242ce5c926cbf2
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Tue Jan 12 15:43:23 2021 -0500
+
+ LP1911238 Angular grid shift-click support
+
+ Clicking on a row, then shift+clicking on another row now selects both
+ the second row and all rows between the first and second in Angular
+ grids.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+1 1 Open-ILS/src/eg2/src/app/share/grid/grid-body.component.ts
+25 0 Open-ILS/src/eg2/src/app/share/grid/grid.ts
+
+commit 6f0a51e7eb530684aa26179a8d622250c3688f5a
+Author: Jeff Davis <jdavis@sitka.bclibraries.ca>
+Date: Tue Apr 27 11:25:50 2021 -0700
+
+ LP#1924185: use preferred name before legal name in My Account
+
+ Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
+ Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+14 14 Open-ILS/src/templates-bootstrap/opac/myopac/prefs.tt2
+1 1 Open-ILS/src/templates-bootstrap/opac/parts/topnav_links.tt2
+15 14 Open-ILS/src/templates/opac/myopac/prefs.tt2
+
+commit ca9424f33092b040534f27472fe5d83f858e6f44
+Author: Jeff Davis <jdavis@sitka.bclibraries.ca>
+Date: Tue Apr 27 10:35:18 2021 -0700
+
+ LP#1924185: use preferred name in patron summary
+
+ When available, the preferred name is used as the main name in the
+ patron summary (rather than as a less-prominent field beneath the main
+ name). The legal name is displayed further down in the summary, just
+ after the ID fields.
+
+ Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
+ Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+5 5 Open-ILS/src/templates/staff/circ/patron/index.tt2
+14 15 Open-ILS/src/templates/staff/circ/patron/t_summary.tt2
+
+commit 124ea494a8f9e57876a44ab9a43a066d9905a9d9
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Sat May 15 20:38:08 2021 -0700
+
+ LP1881607 stamp upgrade script
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+1 1 Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.located-uris-shortcut.sql => 1261.schema.located-uris-shortcut.sql}
+ rename Open-ILS/src/sql/Pg/upgrade/{XXXX.schema.located-uris-shortcut.sql => 1261.schema.located-uris-shortcut.sql} (87%)
+
+commit 66acfbe26a61e9e8317b15f43c1b00a58c5358fa
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Mon Jan 25 15:03:11 2021 -0500
+
+ LP1881607 E-resource relationship labels
+
+ Display the relationship designation for 856 URL's in the staff catalog.
+
+ See Second Indicator:
+
+ https://www.loc.gov/marc/bibliographic/bd856.html
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Elaine Hardy <ehardy@georgialibraries.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+9 4 Open-ILS/src/eg2/src/app/staff/share/bib-summary/bib-summary.component.html
+3 3 Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+
+commit b84e4faf318c1fd4c674be3e74d84a62f36a46a4
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Sep 23 11:15:22 2020 -0400
+
+ LP1881607 Angular catalog located URIs
+
+ Display in-range located URIs in the staff catalog record summary pane.
+
+ Also applies a fix to the staff catalog to clear cached record detail
+ summaries on new searches to ensure the correct org-scoped version of
+ the record summary is retrieved on each new navigation to the detail
+ page.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Elaine Hardy <ehardy@georgialibraries.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+3 0 Open-ILS/src/eg2/src/app/staff/catalog/catalog.service.ts
+27 13 Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+15 0 Open-ILS/src/sql/Pg/990.schema.unapi.sql
+17 0 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.located-uris-shortcut.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.located-uris-shortcut.sql
+
+commit f4ebe9d4f7bcd215d5b1fae95d8529342a43f179
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Mon Jun 1 12:32:21 2020 -0400
+
+ LP1881607 Angular catalog e-resource links display
+
+ Display electronic resource links (MARC 856's) in the Angular staff
+ catalog. The extraction logic, which matches the TPAC, has been put
+ into its own API.
+
+ To test in concerto, navigate to:
+
+ /eg2/staff/catalog/record/208
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Elaine Hardy <ehardy@georgialibraries.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+7 0 Open-ILS/src/eg2/src/app/share/catalog/bib-record.service.ts
+13 0 Open-ILS/src/eg2/src/app/staff/share/bib-summary/bib-summary.component.html
+14 1 Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+1 7 Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/Authority.pm
+84 5 Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+
+commit cf87c854ec427d511f46b03154970870d08dd68e
+Author: Tiffany Little <tlittle@georgialibraries.org>
+Date: Fri Mar 12 10:52:19 2021 -0500
+
+ LP1906825 Flesh acqcr on PO search
+
+ Fleshes the cancel reason column on PO searches.
+
+ Signed-off-by: Tiffany Little <tlittle@georgialibraries.org>
+ Signed-off-by: Chrisy Schroth <chrisy.schroth@kentonlibrary.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+1 1 Open-ILS/src/eg2/src/app/staff/acq/search/acq-search.service.ts
+
+commit 0b30d9066eaa3d1a921d3a2be7aa48ebbd6ed83f
+Author: Garry Collum <gcollum@gmail.com>
+Date: Fri Jan 15 17:38:35 2021 -0500
+
+ LP1873539 Active column in SMS carrier configuration
+
+ This fixes the lack of values displaying in the Active column of the
+ SMS Carrier configuration screen. (Administration->Server Administration->SMS Carriers)
+
+ To test apply the patch.
+ Go to the Carrier Configuration screen and note that the 'Yes' and 'No'
+ boolean values now display for the Active column.
+
+ Signed-off-by: Garry Collum <gcollum@gmail.com>
+ Signed-off-by: Gina Monti <gmonti@biblio.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+1 1 Open-ILS/examples/fm_IDL.xml
+
+commit bcc49dd4c46d4885afe81b1ad536c7c03fbad534
+Author: Mike Risher <mrisher@catalyte.io>
+Date: Mon Jul 20 22:10:55 2020 +0000
+
+ lp1615800 Accessibility on Patron Pages
+
+ Modify patron search, patron search results, and patron edit pages so
+ that they are compatible with screen readers. aria-labelledby can be
+ used to associate input fields with their labels.
+
+ (Rebased to master)
+
+ Signed-off-by: Mike Risher <mrisher@catalyte.io>
+
+ Changes to be committed:
+ modified: Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+ modified: Open-ILS/src/templates/staff/share/t_patron_search_form.tt2
+
+ Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+133 59 Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+31 19 Open-ILS/src/templates/staff/share/t_patron_search_form.tt2
+
+commit af77d893988d4dd4cd6b39a3d8ec72e714ab2e21
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Fri Aug 14 14:49:24 2020 -0400
+
+ LP1891699 Ang grid column picker sorting
+
+ Angular grid column picker displays colums in the following order:
+
+ 1. Visible colums first, sorted alphabetically.
+ 2. Non-visible columns second, sorted alphabetically.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Risher <mrisher@catalyte.io>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+2 1 Open-ILS/src/eg2/src/app/share/grid/grid-toolbar.component.html
+13 0 Open-ILS/src/eg2/src/app/share/grid/grid.ts
+
+commit d0a2d83f51f346a431ef49a89c3bf81b25054479
+Author: Jason Boyer <JBoyer@equinoxinitiative.org>
+Date: Wed Oct 21 16:29:25 2020 -0400
+
+ LP1895660: Booking.pm, Search/Biblio.pm
+
+ Argument "whatev_strings" isn't numeric in numeric eq (==) at ...
+
+ A couple places that use == to compare strings. Numbers are == to
+ each other, but strings are eq to each other.
+
+ Signed-off-by: Jason Boyer <JBoyer@equinoxinitiative.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1 1 Open-ILS/src/perlmods/lib/OpenILS/Application/Booking.pm
+1 1 Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+
+commit b0a59773185bd8f02402e66f292944fb0bab940a
+Author: Jason Boyer <JBoyer@equinoxinitiative.org>
+Date: Tue Sep 15 16:14:38 2020 -0400
+
+ LP1895660: Proxy.pm Proxy/Authen.pm
+
+ Checking perms LOUD_NOISES for user 123 at location 321
+
+ So? I have changed these to use $logger->debug though they can
+ maybe just be removed entirely?
+
+ Signed-off-by: Jason Boyer <JBoyer@equinoxinitiative.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+2 1 Open-ILS/src/perlmods/lib/OpenILS/WWW/Proxy.pm
+2 1 Open-ILS/src/perlmods/lib/OpenILS/WWW/Proxy/Authen.pm
+
+commit 9fd3174a849424c45333a9b20c0e6c32af0ba977
+Author: Jason Boyer <JBoyer@equinoxinitiative.org>
+Date: Tue Sep 15 15:37:09 2020 -0400
+
+ LP1895660: Search/Authority.pm
+
+ Argument "" isn't numeric in numeric ne (!=)
+
+ One of the "fun" things about perl and its type system is that
+ it uses different operators to compare strings vs comparing numbers...
+
+ Signed-off-by: Jason Boyer <JBoyer@equinoxinitiative.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1 1 Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Authority.pm
+
+commit 88e986b21fd7ecfd90e9336d6dae5481583642ff
+Author: Jason Boyer <JBoyer@equinoxinitiative.org>
+Date: Tue Sep 15 15:12:57 2020 -0400
+
+ LP1895660: AppUtil.pm
+
+ substr outside of string
+
+ unique_unnested_numbers expects a list of pg arrays, but if its given
+ an empty results list it tries to remove { and } from an undefined value.
+
+ Signed-off-by: Jason Boyer <JBoyer@equinoxinitiative.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+2 0 Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+
+commit 9d085095449ce06a2440715ad6126ca9cd3d8b37
+Author: Jason Boyer <JBoyer@equinoxinitiative.org>
+Date: Tue Sep 15 14:00:54 2020 -0400
+
+ LP1895660: HoldTarger.pm
+
+ "order_by" object in a query is not a JSON_HASH or JSON_ARRAY;no ORDER BY generated
+
+ json_query and CStoreEditor search_* functions don't want a string field name,
+ they work with hashes or arrays thereof.
+
+ Signed-off-by: Jason Boyer <JBoyer@equinoxinitiative.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1 1 Open-ILS/src/perlmods/lib/OpenILS/Utils/HoldTargeter.pm
+
+commit 8fca1152a7fc2c39415e1a3fb7f4d6e7ddab0ad9
+Author: Jason Boyer <JBoyer@equinoxinitiative.org>
+Date: Tue Sep 15 09:41:30 2020 -0400
+
+ LP1895660: EGCatLoader/Search.pm
+
+ CGI::param called in list context from ...
+ this can lead to vulnerabilities
+
+ For any call to $cgi->param that happens in a list context we need
+ to verify 2 things: 1, that it is intentional (otherwise use scalar())
+ and 2, that we don't use the results in an unsafe manner.
+ For those situations where it's safe and a list is expected (join,
+ foreach, etc.) there is a $cgi->multi_param() that behaves the same way
+ but does not issue a warning on use in a list context.
+
+ An assumption was made that there will only be a single 'query'
+ parameter (see _prepare_biblio_search_basics) but if that should
+ instead be run through a join() that function will need to be updated.
+
+ For more details about the potential issues read
+ https://metacpan.org/pod/distribution/CGI/lib/CGI.pod#Fetching-the-value-or-values-of-a-single-named-parameter
+
+ Note that this change will likely require additional testing to
+ be sure there are no surprises.
+
+ Signed-off-by: Jason Boyer <JBoyer@equinoxinitiative.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+11 11 Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm
+
+commit 482ff8a8f473570811e1dc5d82ef553b09c3bbe0
+Author: Jason Boyer <JBoyer@equinoxinitiative.org>
+Date: Tue Sep 15 09:28:57 2020 -0400
+
+ LP1895660: Course.pm
+
+ "my" variable $results masks earlier declaration in same scope
+
+ my $var should only be used once within a block.
+
+ Signed-off-by: Jason Boyer <JBoyer@equinoxinitiative.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1 1 Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Course.pm
+
+commit 576007c35aa101d43e9c0bbc68d9e1da4202a271
+Author: Jason Boyer <JBoyer@equinoxinitiative.org>
+Date: Tue Sep 15 09:08:28 2020 -0400
+
+ LP1895660: Biblio.pm
+
+ Odd number of elements in anonymous hash
+
+ The type key is missing from some param descriptions,
+ leaving things uneven.
+
+ Signed-off-by: Jason Boyer <JBoyer@equinoxinitiative.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+12 12 Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+
+commit 70398e16f1b21a30ba0c0b02ed7e50e56a18592c
+Author: Jason Boyer <JBoyer@equinoxinitiative.org>
+Date: Tue Sep 15 09:00:15 2020 -0400
+
+ LP1895660: SuperCat.pm
+
+ "my" variable $U masks earlier declaration in same scope
+
+ AppUtils is 'use'-ed and assigned to $U at the top of the file
+ and shared among the rest of the modules already.
+
+ Signed-off-by: Jason Boyer <JBoyer@equinoxinitiative.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+0 3 Open-ILS/src/perlmods/lib/OpenILS/Application/SuperCat.pm
+
+commit 6e52783e0cac279eb4d9c97820269d01ebb68d7e
+Author: Jason Boyer <JBoyer@equinoxinitiative.org>
+Date: Tue Sep 15 08:50:26 2020 -0400
+
+ LP1895660: Silence Perl Warnings
+
+ There are many perl warnings in make check and the day-to-day
+ logs when using Evergreen. This branch aims to address the
+ warnings and to make reviewing easier each file will be
+ individually committed with a small rationale for the changes
+ though it is assumed that this branch will be largely squashed
+ away if / when committed.
+
+ Booking.pm: Possible precedence issue with control flow operator
+ The precedence of 'or' is significantly lower than '||', so much so
+ that it can be less than the precedence for assignments.
+ Replace 'or' with '||' since they're equivalent in this case anyway,
+ and also add parens for flavor.
+
+ Signed-off-by: Jason Boyer <JBoyer@equinoxinitiative.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+6 6 Open-ILS/src/perlmods/lib/OpenILS/Application/Booking.pm
+
+commit 2e0c9ac4a4a60c6d54317ef6d26d6428d27acc40
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date: Fri May 14 17:26:43 2021 -0400
+
+ LP#1917944k: (follow-up) fix ng lint issue
+
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+3 2 Open-ILS/src/eg2/src/app/staff/catalog/hold/hold.component.ts
+
+commit bd710c35cac2c3c39b7c9fe459768ebe87ba8d2d
+Author: Garry Collum <gcollum@gmail.com>
+Date: Thu Mar 18 15:56:04 2021 -0400
+
+ LP1917944-Hold Pickup Library sometimes Empty
+
+ Checks to make sure that the opac.default_pickup_location in usr_setting
+ has a value.
+
+ To test.
+ 1. The patron must have a opac.default_pickup_location set to ""
+ 2. Place a hold for this patron.
+ 3. Notice that the pickup location is blank.
+ 4. Apply the patch.
+ 5. The hold pickup location should now be filled with the patron's home library.
+
+ To re-create this in concerto you may have to tweak the usr_setting table.
+ 1. Assign a default pickup location to a patron.
+ 2. Find the id field for the above in the usr_setting table.
+ select * from actor.usr_setting;
+ 3. Update the setting.
+ update actor.usr_setting set value = '""' where id = <the id number>;
+
+ Signed-off-by: Garry Collum <gcollum@gmail.com>
+ Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+2 1 Open-ILS/src/eg2/src/app/staff/catalog/hold/hold.component.ts
+
+commit 13ac1eb4d9b71c99a4496d80a90ad074d4444047
+Author: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+Date: Fri Apr 23 14:31:20 2021 -0400
+
+ LP1925725 Relabel copy location filter to shelving location
+
+ Changes the labeling of the all copy locations filter to say "All Shelving Locations" instead, reflecting current practice.
+
+ Signed-off-by: Andrea Buntz Neiman <abneiman@equinoxinitiative.org>
+ Signed-off-by: Garry Collum <gcollum@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+1 1 Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.html
+
+commit ab47b541a9cb64c6946d49fff0dc666068859344
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Tue Apr 27 11:23:02 2021 -0400
+
+ LP1926310 Record bucket batch edit destination
+
+ Record Bucket => Batch Edit now opens the new Angular MARC Batch Edit
+ interface.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Garry Collum <gcollum@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+2 1 Open-ILS/src/eg2/src/app/staff/cat/marcbatch/marcbatch.component.html
+12 0 Open-ILS/src/eg2/src/app/staff/cat/marcbatch/marcbatch.component.ts
+6 0 Open-ILS/src/eg2/src/app/staff/cat/marcbatch/routing.module.ts
+1 2 Open-ILS/web/js/ui/default/staff/cat/bucket/record/app.js
+
+commit 4e10e5d3aa2ebc46f144dd0bb0cc7d1fb0db4742
+Author: Galen Charlton <gmc@equinoxOLI.org>
+Date: Fri May 14 17:05:51 2021 -0400
+
+ LP#1927527: (follow-up) add comment
+
+ Just in case there's a question in the future, make it clear
+ that the case where the context OU is the root OU is special.
+
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+4 0 Open-ILS/src/eg2/src/app/share/catalog/catalog.service.ts
+
+commit 45edc4116b13a76f0cf7ff4891d7b97414817d17
+Author: Dan Briem <dbriem@wlsmail.org>
+Date: Mon May 10 20:08:42 2021 -0400
+
+ LP#1927527 Catalog: Root OU shelving locations do not display
+
+ When the top level org unit is selected in the staff catalog you
+ only have the option to search all shelving locations.
+
+ This allows you to filter on the root org unit's shelving
+ locations, which is the same behavior as the OPAC.
+
+ To test:
+ 1. Make sure the top level org unit has shelving locations
+ (Local Administration->Shelving Locations Editor)
+ 2. In the staff catalog, select the top level org unit
+ 3. Click the three dot icon next to the query text input
+ 4. The root org unit's shelving location options display
+
+ Signed-off-by: Dan Briem <dbriem@wlsmail.org>
+ Signed-off-by: Garry Collum <gcollum@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
+
+6 1 Open-ILS/src/eg2/src/app/share/catalog/catalog.service.ts
+1 8 Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.ts
+
+commit 72bfa36c5f51751f80b3e0e516ecc29204cd4264
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Thu May 13 07:44:35 2021 -0700
+
+ Docs: fixing a typo
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+1 1 docs/modules/shared/pages/how_to_contribute_docs.adoc
+
+commit b08f2803e5ee7b34d2a394dfbeab730b57a61e6e
+Author: blake <blake@mobiusconsortium.org>
+Date: Mon May 10 08:20:41 2021 -0500
+
+ Introduce documentation on how to contribute docs
+
+ This commit adds several screenshots and the basic outline on contributing
+ to the Evergreen documentation
+
+ Signed-off-by: blake <blake@mobiusconsortium.org>
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+1 0 docs/modules/ROOT/nav.adoc
+- - docs/modules/shared/assets/images/how_to_contribute_docs/asciidocfx_sample.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_click_fork.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_create_account.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_click_new_branch.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_click_option.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_click_signin.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_clone_evergreen.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_clone_from_internet.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_commit_changes.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_create_pull_request.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_download_site.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_make_branch.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_planning_on_fork.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_publish.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_quick_tour.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_singin_with_browser.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_singin_with_browser_launch_app.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_signup.png
+- - docs/modules/shared/assets/images/how_to_contribute_docs/github_web_create_pull_request.png
+217 0 docs/modules/shared/pages/how_to_contribute_docs.adoc
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/asciidocfx_sample.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_click_fork.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_create_account.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_click_new_branch.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_click_option.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_click_signin.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_clone_evergreen.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_clone_from_internet.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_commit_changes.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_create_pull_request.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_download_site.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_make_branch.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_planning_on_fork.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_publish.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_quick_tour.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_singin_with_browser.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_desktop_singin_with_browser_launch_app.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_signup.png
+ create mode 100644 docs/modules/shared/assets/images/how_to_contribute_docs/github_web_create_pull_request.png
+ create mode 100644 docs/modules/shared/pages/how_to_contribute_docs.adoc
+
+commit bf6fd4960da1697a740d63d26255672a7ef9b152
+Author: Jason Boyer <JBoyer@EquinoxInitiative.org>
+Date: Tue May 11 10:00:15 2021 -0400
+
+ LP#1892435 - Add Release Note
+
+ Signed-off-by: Jason Boyer <JBoyer@EquinoxInitiative.org>
+
+14 0 docs/RELEASE_NOTES_NEXT/Client/splash_search_fix.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/splash_search_fix.adoc
+
+commit 3ff0b30eddd6be4a18c9f31e78fad2836f89f856
+Author: Dan Briem <dbriem@wlsmail.org>
+Date: Sun May 9 22:27:38 2021 -0400
+
+ LP#1892435 Splash page catalog searches don't work with spaces
+
+ On older versions of Apache's mod_rewrite, splash page catalog
+ searches are escaped in JavaScript and escaped again during the
+ redirect to the Angular locale path, so searches with special
+ characters result in a search that's still encoded.
+
+ Test on Ubuntu 16.04.7, Apache 2.4.18, EG 3.6+. A splash page
+ catalog search for Harry Potter results in a search for
+ Harry%20Potter.
+
+ Add the NE (noescape) flag to the Angular locale path redirect
+ in /etc/apache2/eg_vhost.conf as indicated in this example file.
+ A splash page search for Harry Potter then works as expected.
+
+ Signed-off-by: Dan Briem <dbriem@wlsmail.org>
+ Signed-off-by: Jason Boyer <JBoyer@EquinoxInitiative.org>
+
+2 2 Open-ILS/examples/apache_24/eg_vhost.conf.in
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-7-1";
}
__PACKAGE__->register_method(
FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates');
INSERT INTO config.upgrade_log (version, applied_to) VALUES ('1265', :eg_version); -- phasefx/mmorgan/gmcharlt
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('3.7.1', :eg_version);
CREATE TABLE config.bib_source (
id SERIAL PRIMARY KEY,
--- /dev/null
+--Upgrade Script for 3.7.0 to 3.7.1
+\set eg_version '''3.7.1'''
+BEGIN;
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('3.7.1', :eg_version);
+
+SELECT evergreen.upgrade_deps_block_check('1261', :eg_version);
+
+CREATE OR REPLACE FUNCTION evergreen.located_uris_as_uris
+ (bibid BIGINT, ouid INT, pref_lib INT DEFAULT NULL)
+ RETURNS SETOF asset.uri AS $FUNK$
+ /* Maps a bib directly to its scoped asset.uri's */
+
+ SELECT uri.*
+ FROM evergreen.located_uris($1, $2, $3) located_uri
+ JOIN asset.uri_call_number_map map ON (map.call_number = located_uri.id)
+ JOIN asset.uri uri ON (uri.id = map.uri)
+
+$FUNK$ LANGUAGE SQL STABLE;
+
+
+SELECT evergreen.upgrade_deps_block_check('1262', :eg_version);
+
+CREATE OR REPLACE FUNCTION search.highlight_display_fields_impl(
+ rid BIGINT,
+ tsq TEXT,
+ field_list INT[] DEFAULT '{}'::INT[],
+ css_class TEXT DEFAULT 'oils_SH',
+ hl_all BOOL DEFAULT TRUE,
+ minwords INT DEFAULT 5,
+ maxwords INT DEFAULT 25,
+ shortwords INT DEFAULT 0,
+ maxfrags INT DEFAULT 0,
+ delimiter TEXT DEFAULT ' ... '
+) RETURNS SETOF search.highlight_result AS $f$
+DECLARE
+ opts TEXT := '';
+ v_css_class TEXT := css_class;
+ v_delimiter TEXT := delimiter;
+ v_field_list INT[] := field_list;
+ hl_query TEXT;
+BEGIN
+ IF v_delimiter LIKE $$%'%$$ OR v_delimiter LIKE '%"%' THEN --"
+ v_delimiter := ' ... ';
+ END IF;
+
+ IF NOT hl_all THEN
+ opts := opts || 'MinWords=' || minwords;
+ opts := opts || ', MaxWords=' || maxwords;
+ opts := opts || ', ShortWords=' || shortwords;
+ opts := opts || ', MaxFragments=' || maxfrags;
+ opts := opts || ', FragmentDelimiter="' || delimiter || '"';
+ ELSE
+ opts := opts || 'HighlightAll=TRUE';
+ END IF;
+
+ IF v_css_class LIKE $$%'%$$ OR v_css_class LIKE '%"%' THEN -- "
+ v_css_class := 'oils_SH';
+ END IF;
+
+ opts := opts || $$, StopSel=</b>, StartSel="<b class='$$ || v_css_class; -- "
+
+ IF v_field_list = '{}'::INT[] THEN
+ SELECT ARRAY_AGG(id) INTO v_field_list FROM config.metabib_field WHERE display_field;
+ END IF;
+
+ hl_query := $$
+ SELECT de.id,
+ de.source,
+ de.field,
+ evergreen.escape_for_html(de.value) AS value,
+ ts_headline(
+ ts_config::REGCONFIG,
+ evergreen.escape_for_html(de.value),
+ $$ || quote_literal(tsq) || $$,
+ $1 || ' ' || mf.field_class || ' ' || mf.name || $xx$'>"$xx$ -- "'
+ ) AS highlight
+ FROM metabib.display_entry de
+ JOIN config.metabib_field mf ON (mf.id = de.field)
+ JOIN search.best_tsconfig t ON (t.id = de.field)
+ WHERE de.source = $2
+ AND field = ANY ($3)
+ ORDER BY de.id;$$;
+
+ RETURN QUERY EXECUTE hl_query USING opts, rid, v_field_list;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION search.highlight_display_fields(
+ rid BIGINT,
+ tsq_map TEXT, -- { '(a | b) & c' => '1,2,3,4', ...}
+ css_class TEXT DEFAULT 'oils_SH',
+ hl_all BOOL DEFAULT TRUE,
+ minwords INT DEFAULT 5,
+ maxwords INT DEFAULT 25,
+ shortwords INT DEFAULT 0,
+ maxfrags INT DEFAULT 0,
+ delimiter TEXT DEFAULT ' ... '
+) RETURNS SETOF search.highlight_result AS $f$
+DECLARE
+ tsq_hstore TEXT;
+ tsq TEXT;
+ fields TEXT;
+ afields INT[];
+ seen INT[];
+BEGIN
+ IF (tsq_map ILIKE 'hstore%') THEN
+ EXECUTE 'SELECT ' || tsq_map INTO tsq_hstore;
+ ELSE
+ tsq_hstore := tsq_map::HSTORE;
+ END IF;
+
+ FOR tsq, fields IN SELECT key, value FROM each(tsq_hstore::HSTORE) LOOP
+ SELECT ARRAY_AGG(unnest::INT) INTO afields
+ FROM unnest(regexp_split_to_array(fields,','));
+ seen := seen || afields;
+
+ RETURN QUERY
+ SELECT * FROM search.highlight_display_fields_impl(
+ rid, tsq, afields, css_class, hl_all,minwords,
+ maxwords, shortwords, maxfrags, delimiter
+ );
+ END LOOP;
+
+ RETURN QUERY
+ SELECT id,
+ source,
+ field,
+ evergreen.escape_for_html(value) AS value,
+ evergreen.escape_for_html(value) AS highlight
+ FROM metabib.display_entry
+ WHERE source = rid
+ AND NOT (field = ANY (seen));
+END;
+$f$ LANGUAGE PLPGSQL ROWS 10;
+
+
+SELECT evergreen.upgrade_deps_block_check('1263', :eg_version);
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+ 'eg.catalog.search.form.open', 'gui', 'bool',
+ oils_i18n_gettext(
+ 'eg.catalog.search.form.open',
+ 'Catalog Search Form Visibility Sticky Setting',
+ 'cwst', 'label'
+ )
+);
+
+
+SELECT evergreen.upgrade_deps_block_check('1264', :eg_version);
+
+CREATE OR REPLACE FUNCTION unapi.bre (
+ obj_id BIGINT,
+ format TEXT,
+ ename TEXT,
+ includes TEXT[],
+ org TEXT,
+ depth INT DEFAULT NULL,
+ slimit HSTORE DEFAULT NULL,
+ soffset HSTORE DEFAULT NULL,
+ include_xmlns BOOL DEFAULT TRUE,
+ pref_lib INT DEFAULT NULL
+)
+RETURNS XML AS $F$
+DECLARE
+ me biblio.record_entry%ROWTYPE;
+ layout unapi.bre_output_layout%ROWTYPE;
+ xfrm config.xml_transform%ROWTYPE;
+ ouid INT;
+ tmp_xml TEXT;
+ top_el TEXT;
+ output XML;
+ hxml XML;
+ axml XML;
+ source XML;
+BEGIN
+
+ IF org = '-' OR org IS NULL THEN
+ SELECT shortname INTO org FROM evergreen.org_top();
+ END IF;
+
+ SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org;
+
+ IF ouid IS NULL THEN
+ RETURN NULL::XML;
+ END IF;
+
+ IF format = 'holdings_xml' THEN -- the special case
+ output := unapi.holdings_xml( obj_id, ouid, org, depth, includes, slimit, soffset, include_xmlns);
+ RETURN output;
+ END IF;
+
+ SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format;
+
+ IF layout.name IS NULL THEN
+ RETURN NULL::XML;
+ END IF;
+
+ SELECT * INTO xfrm FROM config.xml_transform WHERE name = layout.transform;
+
+ SELECT * INTO me FROM biblio.record_entry WHERE id = obj_id;
+
+ -- grab bib_source, if any
+ IF ('cbs' = ANY (includes) AND me.source IS NOT NULL) THEN
+ source := unapi.cbs(me.source,NULL,NULL,NULL,NULL);
+ ELSE
+ source := NULL::XML;
+ END IF;
+
+ -- grab SVF if we need them
+ IF ('mra' = ANY (includes)) THEN
+ axml := unapi.mra(obj_id,NULL,NULL,NULL,NULL);
+ ELSE
+ axml := NULL::XML;
+ END IF;
+
+ -- grab holdings if we need them
+ IF ('holdings_xml' = ANY (includes)) THEN
+ hxml := unapi.holdings_xml(obj_id, ouid, org, depth, array_remove(includes,'holdings_xml'), slimit, soffset, include_xmlns, pref_lib);
+ ELSE
+ hxml := NULL::XML;
+ END IF;
+
+
+ -- generate our item node
+
+
+ IF format = 'marcxml' THEN
+ tmp_xml := me.marc;
+ IF tmp_xml !~ E'<marc:' THEN -- If we're not using the prefixed namespace in this record, then remove all declarations of it
+ tmp_xml := REGEXP_REPLACE(tmp_xml, ' xmlns:marc="http://www.loc.gov/MARC21/slim"', '', 'g');
+ END IF;
+ ELSE
+ tmp_xml := oils_xslt_process(me.marc, xfrm.xslt)::XML;
+ END IF;
+
+ top_el := REGEXP_REPLACE(tmp_xml, E'^.*?<((?:\\S+:)?' || layout.holdings_element || ').*$', E'\\1');
+
+ IF source IS NOT NULL THEN
+ tmp_xml := REGEXP_REPLACE(tmp_xml, '</' || top_el || '>(.*?)$', source || '</' || top_el || E'>\\1');
+ END IF;
+
+ IF axml IS NOT NULL THEN
+ tmp_xml := REGEXP_REPLACE(tmp_xml, '</' || top_el || '>(.*?)$', axml || '</' || top_el || E'>\\1');
+ END IF;
+
+ IF hxml IS NOT NULL THEN -- XXX how do we configure the holdings position?
+ tmp_xml := REGEXP_REPLACE(tmp_xml, '</' || top_el || '>(.*?)$', hxml || '</' || top_el || E'>\\1');
+ END IF;
+
+ IF ('bre.unapi' = ANY (includes)) THEN
+ output := REGEXP_REPLACE(
+ tmp_xml,
+ '</' || top_el || '>(.*?)',
+ XMLELEMENT(
+ name abbr,
+ XMLATTRIBUTES(
+ 'http://www.w3.org/1999/xhtml' AS xmlns,
+ 'unapi-id' AS class,
+ 'tag:open-ils.org:U2@bre/' || obj_id || '/' || org AS title
+ )
+ )::TEXT || '</' || top_el || E'>\\1'
+ );
+ ELSE
+ output := tmp_xml;
+ END IF;
+
+ IF ('bre.extern' = ANY (includes)) THEN
+ output := REGEXP_REPLACE(
+ tmp_xml,
+ '</' || top_el || '>(.*?)',
+ XMLELEMENT(
+ name extern,
+ XMLATTRIBUTES(
+ 'http://open-ils.org/spec/biblio/v1' AS xmlns,
+ me.creator AS creator,
+ me.editor AS editor,
+ me.create_date AS create_date,
+ me.edit_date AS edit_date,
+ me.quality AS quality,
+ me.fingerprint AS fingerprint,
+ me.tcn_source AS tcn_source,
+ me.tcn_value AS tcn_value,
+ me.owner AS owner,
+ me.share_depth AS share_depth,
+ me.active AS active,
+ me.deleted AS deleted
+ )
+ )::TEXT || '</' || top_el || E'>\\1'
+ );
+ ELSE
+ output := tmp_xml;
+ END IF;
+
+ output := REGEXP_REPLACE(output::TEXT,E'>\\s+<','><','gs')::XML;
+ RETURN output;
+END;
+$F$ LANGUAGE PLPGSQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.holdings_xml (
+ bid BIGINT,
+ ouid INT,
+ org TEXT,
+ depth INT DEFAULT NULL,
+ includes TEXT[] DEFAULT NULL::TEXT[],
+ slimit HSTORE DEFAULT NULL,
+ soffset HSTORE DEFAULT NULL,
+ include_xmlns BOOL DEFAULT TRUE,
+ pref_lib INT DEFAULT NULL
+)
+RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name holdings,
+ XMLATTRIBUTES(
+ CASE WHEN $8 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ CASE WHEN ('bre' = ANY ($5)) THEN 'tag:open-ils.org:U2@bre/' || $1 || '/' || $3 ELSE NULL END AS id,
+ (SELECT record_has_holdable_copy FROM asset.record_has_holdable_copy($1)) AS has_holdable
+ ),
+ XMLELEMENT(
+ name counts,
+ (SELECT XMLAGG(XMLELEMENT::XML) FROM (
+ SELECT XMLELEMENT(
+ name count,
+ XMLATTRIBUTES('public' as type, depth, org_unit, coalesce(transcendant,0) as transcendant, available, visible as count, unshadow)
+ )::text
+ FROM asset.opac_ou_record_copy_count($2, $1)
+ UNION
+ SELECT XMLELEMENT(
+ name count,
+ XMLATTRIBUTES('staff' as type, depth, org_unit, coalesce(transcendant,0) as transcendant, available, visible as count, unshadow)
+ )::text
+ FROM asset.staff_ou_record_copy_count($2, $1)
+ UNION
+ SELECT XMLELEMENT(
+ name count,
+ XMLATTRIBUTES('pref_lib' as type, depth, org_unit, coalesce(transcendant,0) as transcendant, available, visible as count, unshadow)
+ )::text
+ FROM asset.opac_ou_record_copy_count($9, $1)
+ ORDER BY 1
+ )x)
+ ),
+ CASE
+ WHEN ('bmp' = ANY ($5)) THEN
+ XMLELEMENT(
+ name monograph_parts,
+ (SELECT XMLAGG(bmp) FROM (
+ SELECT unapi.bmp( id, 'xml', 'monograph_part', array_remove( array_remove($5,'bre'), 'holdings_xml'), $3, $4, $6, $7, FALSE)
+ FROM biblio.monograph_part
+ WHERE NOT deleted AND record = $1
+ )x)
+ )
+ ELSE NULL
+ END,
+ XMLELEMENT(
+ name volumes,
+ (SELECT XMLAGG(acn ORDER BY rank, name, label_sortkey) FROM (
+ -- Physical copies
+ SELECT unapi.acn(y.id,'xml','volume',array_remove( array_remove($5,'holdings_xml'),'bre'), $3, $4, $6, $7, FALSE), y.rank, name, label_sortkey
+ FROM evergreen.ranked_volumes($1, $2, $4, $6, $7, $9, $5) AS y
+ UNION ALL
+ -- Located URIs
+ SELECT unapi.acn(uris.id,'xml','volume',array_remove( array_remove($5,'holdings_xml'),'bre'), $3, $4, $6, $7, FALSE), uris.rank, name, label_sortkey
+ FROM evergreen.located_uris($1, $2, $9) AS uris
+ )x)
+ ),
+ CASE WHEN ('ssub' = ANY ($5)) THEN
+ XMLELEMENT(
+ name subscriptions,
+ (SELECT XMLAGG(ssub) FROM (
+ SELECT unapi.ssub(id,'xml','subscription','{}'::TEXT[], $3, $4, $6, $7, FALSE)
+ FROM serial.subscription
+ WHERE record_entry = $1
+ )x)
+ )
+ ELSE NULL END,
+ CASE WHEN ('acp' = ANY ($5)) THEN
+ XMLELEMENT(
+ name foreign_copies,
+ (SELECT XMLAGG(acp) FROM (
+ SELECT unapi.acp(p.target_copy,'xml','copy',array_remove($5,'acp'), $3, $4, $6, $7, FALSE)
+ FROM biblio.peer_bib_copy_map p
+ JOIN asset.copy c ON (p.target_copy = c.id)
+ WHERE NOT c.deleted AND p.peer_record = $1
+ LIMIT ($6 -> 'acp')::INT
+ OFFSET ($7 -> 'acp')::INT
+ )x)
+ )
+ ELSE NULL END
+ );
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.ssub ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name subscription,
+ XMLATTRIBUTES(
+ CASE WHEN $9 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ 'tag:open-ils.org:U2@ssub/' || id AS id,
+ 'tag:open-ils.org:U2@aou/' || owning_lib AS owning_lib,
+ start_date AS start, end_date AS end, expected_date_offset
+ ),
+ CASE
+ WHEN ('sdist' = ANY ($4)) THEN
+ XMLELEMENT( name distributions,
+ (SELECT XMLAGG(sdist) FROM (
+ SELECT unapi.sdist( id, 'xml', 'distribution', array_remove($4,'ssub'), $5, $6, $7, $8, FALSE)
+ FROM serial.distribution
+ WHERE subscription = ssub.id
+ )x)
+ )
+ ELSE NULL
+ END
+ )
+ FROM serial.subscription ssub
+ WHERE id = $1
+ GROUP BY id, start_date, end_date, expected_date_offset, owning_lib;
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.sdist ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name distribution,
+ XMLATTRIBUTES(
+ CASE WHEN $9 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ 'tag:open-ils.org:U2@sdist/' || id AS id,
+ 'tag:open-ils.org:U2@acn/' || receive_call_number AS receive_call_number,
+ 'tag:open-ils.org:U2@acn/' || bind_call_number AS bind_call_number,
+ unit_label_prefix, label, unit_label_suffix, summary_method
+ ),
+ unapi.aou( holding_lib, $2, 'holding_lib', array_remove($4,'sdist'), $5, $6, $7, $8),
+ CASE WHEN subscription IS NOT NULL AND ('ssub' = ANY ($4)) THEN unapi.ssub( subscription, 'xml', 'subscription', array_remove($4,'sdist'), $5, $6, $7, $8, FALSE) ELSE NULL END,
+ CASE
+ WHEN ('sstr' = ANY ($4)) THEN
+ XMLELEMENT( name streams,
+ (SELECT XMLAGG(sstr) FROM (
+ SELECT unapi.sstr( id, 'xml', 'stream', array_remove($4,'sdist'), $5, $6, $7, $8, FALSE)
+ FROM serial.stream
+ WHERE distribution = sdist.id
+ )x)
+ )
+ ELSE NULL
+ END,
+ XMLELEMENT( name summaries,
+ CASE
+ WHEN ('sbsum' = ANY ($4)) THEN
+ (SELECT XMLAGG(sbsum) FROM (
+ SELECT unapi.sbsum( id, 'xml', 'serial_summary', array_remove($4,'sdist'), $5, $6, $7, $8, FALSE)
+ FROM serial.basic_summary
+ WHERE distribution = sdist.id
+ )x)
+ ELSE NULL
+ END,
+ CASE
+ WHEN ('sisum' = ANY ($4)) THEN
+ (SELECT XMLAGG(sisum) FROM (
+ SELECT unapi.sisum( id, 'xml', 'serial_summary', array_remove($4,'sdist'), $5, $6, $7, $8, FALSE)
+ FROM serial.index_summary
+ WHERE distribution = sdist.id
+ )x)
+ ELSE NULL
+ END,
+ CASE
+ WHEN ('sssum' = ANY ($4)) THEN
+ (SELECT XMLAGG(sssum) FROM (
+ SELECT unapi.sssum( id, 'xml', 'serial_summary', array_remove($4,'sdist'), $5, $6, $7, $8, FALSE)
+ FROM serial.supplement_summary
+ WHERE distribution = sdist.id
+ )x)
+ ELSE NULL
+ END
+ )
+ )
+ FROM serial.distribution sdist
+ WHERE id = $1
+ GROUP BY id, label, unit_label_prefix, unit_label_suffix, holding_lib, summary_method, subscription, receive_call_number, bind_call_number;
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.sstr ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name stream,
+ XMLATTRIBUTES(
+ CASE WHEN $9 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ 'tag:open-ils.org:U2@sstr/' || id AS id,
+ routing_label
+ ),
+ CASE WHEN distribution IS NOT NULL AND ('sdist' = ANY ($4)) THEN unapi.sssum( distribution, 'xml', 'distribtion', array_remove($4,'sstr'), $5, $6, $7, $8, FALSE) ELSE NULL END,
+ CASE
+ WHEN ('sitem' = ANY ($4)) THEN
+ XMLELEMENT( name items,
+ (SELECT XMLAGG(sitem) FROM (
+ SELECT unapi.sitem( id, 'xml', 'serial_item', array_remove($4,'sstr'), $5, $6, $7, $8, FALSE)
+ FROM serial.item
+ WHERE stream = sstr.id
+ )x)
+ )
+ ELSE NULL
+ END
+ )
+ FROM serial.stream sstr
+ WHERE id = $1
+ GROUP BY id, routing_label, distribution;
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.siss ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name issuance,
+ XMLATTRIBUTES(
+ CASE WHEN $9 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ 'tag:open-ils.org:U2@siss/' || id AS id,
+ create_date, edit_date, label, date_published,
+ holding_code, holding_type, holding_link_id
+ ),
+ CASE WHEN subscription IS NOT NULL AND ('ssub' = ANY ($4)) THEN unapi.ssub( subscription, 'xml', 'subscription', array_remove($4,'siss'), $5, $6, $7, $8, FALSE) ELSE NULL END,
+ CASE
+ WHEN ('sitem' = ANY ($4)) THEN
+ XMLELEMENT( name items,
+ (SELECT XMLAGG(sitem) FROM (
+ SELECT unapi.sitem( id, 'xml', 'serial_item', array_remove($4,'siss'), $5, $6, $7, $8, FALSE)
+ FROM serial.item
+ WHERE issuance = sstr.id
+ )x)
+ )
+ ELSE NULL
+ END
+ )
+ FROM serial.issuance sstr
+ WHERE id = $1
+ GROUP BY id, create_date, edit_date, label, date_published, holding_code, holding_type, holding_link_id, subscription;
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.sitem ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name serial_item,
+ XMLATTRIBUTES(
+ CASE WHEN $9 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ 'tag:open-ils.org:U2@sitem/' || id AS id,
+ 'tag:open-ils.org:U2@siss/' || issuance AS issuance,
+ date_expected, date_received
+ ),
+ CASE WHEN issuance IS NOT NULL AND ('siss' = ANY ($4)) THEN unapi.siss( issuance, $2, 'issuance', array_remove($4,'sitem'), $5, $6, $7, $8, FALSE) ELSE NULL END,
+ CASE WHEN stream IS NOT NULL AND ('sstr' = ANY ($4)) THEN unapi.sstr( stream, $2, 'stream', array_remove($4,'sitem'), $5, $6, $7, $8, FALSE) ELSE NULL END,
+ CASE WHEN unit IS NOT NULL AND ('sunit' = ANY ($4)) THEN unapi.sunit( unit, $2, 'serial_unit', array_remove($4,'sitem'), $5, $6, $7, $8, FALSE) ELSE NULL END,
+ CASE WHEN uri IS NOT NULL AND ('auri' = ANY ($4)) THEN unapi.auri( uri, $2, 'uri', array_remove($4,'sitem'), $5, $6, $7, $8, FALSE) ELSE NULL END
+-- XMLELEMENT( name notes,
+-- CASE
+-- WHEN ('acpn' = ANY ($4)) THEN
+-- (SELECT XMLAGG(acpn) FROM (
+-- SELECT unapi.acpn( id, 'xml', 'copy_note', array_remove($4,'acp'), $5, $6, $7, $8)
+-- FROM asset.copy_note
+-- WHERE owning_copy = cp.id AND pub
+-- )x)
+-- ELSE NULL
+-- END
+-- )
+ )
+ FROM serial.item sitem
+ WHERE id = $1;
+$F$ LANGUAGE SQL STABLE;
+
+
+CREATE OR REPLACE FUNCTION unapi.sssum ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name serial_summary,
+ XMLATTRIBUTES(
+ CASE WHEN $9 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ 'tag:open-ils.org:U2@sbsum/' || id AS id,
+ 'sssum' AS type, generated_coverage, textual_holdings, show_generated
+ ),
+ CASE WHEN ('sdist' = ANY ($4)) THEN unapi.sdist( distribution, 'xml', 'distribtion', array_remove($4,'ssum'), $5, $6, $7, $8, FALSE) ELSE NULL END
+ )
+ FROM serial.supplement_summary ssum
+ WHERE id = $1
+ GROUP BY id, generated_coverage, textual_holdings, distribution, show_generated;
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.sbsum ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name serial_summary,
+ XMLATTRIBUTES(
+ CASE WHEN $9 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ 'tag:open-ils.org:U2@sbsum/' || id AS id,
+ 'sbsum' AS type, generated_coverage, textual_holdings, show_generated
+ ),
+ CASE WHEN ('sdist' = ANY ($4)) THEN unapi.sdist( distribution, 'xml', 'distribtion', array_remove($4,'ssum'), $5, $6, $7, $8, FALSE) ELSE NULL END
+ )
+ FROM serial.basic_summary ssum
+ WHERE id = $1
+ GROUP BY id, generated_coverage, textual_holdings, distribution, show_generated;
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.sisum ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name serial_summary,
+ XMLATTRIBUTES(
+ CASE WHEN $9 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ 'tag:open-ils.org:U2@sbsum/' || id AS id,
+ 'sisum' AS type, generated_coverage, textual_holdings, show_generated
+ ),
+ CASE WHEN ('sdist' = ANY ($4)) THEN unapi.sdist( distribution, 'xml', 'distribtion', array_remove($4,'ssum'), $5, $6, $7, $8, FALSE) ELSE NULL END
+ )
+ FROM serial.index_summary ssum
+ WHERE id = $1
+ GROUP BY id, generated_coverage, textual_holdings, distribution, show_generated;
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.bmp ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name monograph_part,
+ XMLATTRIBUTES(
+ CASE WHEN $9 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ 'tag:open-ils.org:U2@bmp/' || id AS id,
+ id AS ident,
+ label,
+ label_sortkey,
+ 'tag:open-ils.org:U2@bre/' || record AS record
+ ),
+ CASE
+ WHEN ('acp' = ANY ($4)) THEN
+ XMLELEMENT( name copies,
+ (SELECT XMLAGG(acp) FROM (
+ SELECT unapi.acp( cp.id, 'xml', 'copy', array_remove($4,'bmp'), $5, $6, $7, $8, FALSE)
+ FROM asset.copy cp
+ JOIN asset.copy_part_map cpm ON (cpm.target_copy = cp.id)
+ WHERE cpm.part = $1
+ AND cp.deleted IS FALSE
+ ORDER BY COALESCE(cp.copy_number,0), cp.barcode
+ LIMIT ($7 -> 'acp')::INT
+ OFFSET ($8 -> 'acp')::INT
+
+ )x)
+ )
+ ELSE NULL
+ END,
+ CASE WHEN ('bre' = ANY ($4)) THEN unapi.bre( record, 'marcxml', 'record', array_remove($4,'bmp'), $5, $6, $7, $8, FALSE) ELSE NULL END
+ )
+ FROM biblio.monograph_part
+ WHERE NOT deleted AND id = $1
+ GROUP BY id, label, label_sortkey, record;
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.acp ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name copy,
+ XMLATTRIBUTES(
+ CASE WHEN $9 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ 'tag:open-ils.org:U2@acp/' || id AS id, id AS copy_id,
+ create_date, edit_date, copy_number, circulate, deposit,
+ ref, holdable, deleted, deposit_amount, price, barcode,
+ circ_modifier, circ_as_type, opac_visible, age_protect
+ ),
+ unapi.ccs( status, $2, 'status', array_remove($4,'acp'), $5, $6, $7, $8, FALSE),
+ unapi.acl( location, $2, 'location', array_remove($4,'acp'), $5, $6, $7, $8, FALSE),
+ unapi.aou( circ_lib, $2, 'circ_lib', array_remove($4,'acp'), $5, $6, $7, $8),
+ unapi.aou( circ_lib, $2, 'circlib', array_remove($4,'acp'), $5, $6, $7, $8),
+ CASE WHEN ('acn' = ANY ($4)) THEN unapi.acn( call_number, $2, 'call_number', array_remove($4,'acp'), $5, $6, $7, $8, FALSE) ELSE NULL END,
+ CASE
+ WHEN ('acpn' = ANY ($4)) THEN
+ XMLELEMENT( name copy_notes,
+ (SELECT XMLAGG(acpn) FROM (
+ SELECT unapi.acpn( id, 'xml', 'copy_note', array_remove($4,'acp'), $5, $6, $7, $8, FALSE)
+ FROM asset.copy_note
+ WHERE owning_copy = cp.id AND pub
+ )x)
+ )
+ ELSE NULL
+ END,
+ CASE
+ WHEN ('ascecm' = ANY ($4)) THEN
+ XMLELEMENT( name statcats,
+ (SELECT XMLAGG(ascecm) FROM (
+ SELECT unapi.ascecm( stat_cat_entry, 'xml', 'statcat', array_remove($4,'acp'), $5, $6, $7, $8, FALSE)
+ FROM asset.stat_cat_entry_copy_map
+ WHERE owning_copy = cp.id
+ )x)
+ )
+ ELSE NULL
+ END,
+ CASE
+ WHEN ('bre' = ANY ($4)) THEN
+ XMLELEMENT( name foreign_records,
+ (SELECT XMLAGG(bre) FROM (
+ SELECT unapi.bre(peer_record,'marcxml','record','{}'::TEXT[], $5, $6, $7, $8, FALSE)
+ FROM biblio.peer_bib_copy_map
+ WHERE target_copy = cp.id
+ )x)
+
+ )
+ ELSE NULL
+ END,
+ CASE
+ WHEN ('bmp' = ANY ($4)) THEN
+ XMLELEMENT( name monograph_parts,
+ (SELECT XMLAGG(bmp) FROM (
+ SELECT unapi.bmp( part, 'xml', 'monograph_part', array_remove($4,'acp'), $5, $6, $7, $8, FALSE)
+ FROM asset.copy_part_map
+ WHERE target_copy = cp.id
+ )x)
+ )
+ ELSE NULL
+ END,
+ CASE
+ WHEN ('circ' = ANY ($4)) THEN
+ XMLELEMENT( name current_circulation,
+ (SELECT XMLAGG(circ) FROM (
+ SELECT unapi.circ( id, 'xml', 'circ', array_remove($4,'circ'), $5, $6, $7, $8, FALSE)
+ FROM action.circulation
+ WHERE target_copy = cp.id
+ AND checkin_time IS NULL
+ )x)
+ )
+ ELSE NULL
+ END
+ )
+ FROM asset.copy cp
+ WHERE id = $1
+ AND cp.deleted IS FALSE
+ GROUP BY id, status, location, circ_lib, call_number, create_date,
+ edit_date, copy_number, circulate, deposit, ref, holdable,
+ deleted, deposit_amount, price, barcode, circ_modifier,
+ circ_as_type, opac_visible, age_protect;
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.sunit ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name serial_unit,
+ XMLATTRIBUTES(
+ CASE WHEN $9 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ 'tag:open-ils.org:U2@acp/' || id AS id, id AS copy_id,
+ create_date, edit_date, copy_number, circulate, deposit,
+ ref, holdable, deleted, deposit_amount, price, barcode,
+ circ_modifier, circ_as_type, opac_visible, age_protect,
+ status_changed_time, floating, mint_condition,
+ detailed_contents, sort_key, summary_contents, cost
+ ),
+ unapi.ccs( status, $2, 'status', array_remove( array_remove($4,'acp'),'sunit'), $5, $6, $7, $8, FALSE),
+ unapi.acl( location, $2, 'location', array_remove( array_remove($4,'acp'),'sunit'), $5, $6, $7, $8, FALSE),
+ unapi.aou( circ_lib, $2, 'circ_lib', array_remove( array_remove($4,'acp'),'sunit'), $5, $6, $7, $8),
+ unapi.aou( circ_lib, $2, 'circlib', array_remove( array_remove($4,'acp'),'sunit'), $5, $6, $7, $8),
+ CASE WHEN ('acn' = ANY ($4)) THEN unapi.acn( call_number, $2, 'call_number', array_remove($4,'acp'), $5, $6, $7, $8, FALSE) ELSE NULL END,
+ XMLELEMENT( name copy_notes,
+ CASE
+ WHEN ('acpn' = ANY ($4)) THEN
+ (SELECT XMLAGG(acpn) FROM (
+ SELECT unapi.acpn( id, 'xml', 'copy_note', array_remove( array_remove($4,'acp'),'sunit'), $5, $6, $7, $8, FALSE)
+ FROM asset.copy_note
+ WHERE owning_copy = cp.id AND pub
+ )x)
+ ELSE NULL
+ END
+ ),
+ XMLELEMENT( name statcats,
+ CASE
+ WHEN ('ascecm' = ANY ($4)) THEN
+ (SELECT XMLAGG(ascecm) FROM (
+ SELECT unapi.ascecm( stat_cat_entry, 'xml', 'statcat', array_remove($4,'acp'), $5, $6, $7, $8, FALSE)
+ FROM asset.stat_cat_entry_copy_map
+ WHERE owning_copy = cp.id
+ )x)
+ ELSE NULL
+ END
+ ),
+ XMLELEMENT( name foreign_records,
+ CASE
+ WHEN ('bre' = ANY ($4)) THEN
+ (SELECT XMLAGG(bre) FROM (
+ SELECT unapi.bre(peer_record,'marcxml','record','{}'::TEXT[], $5, $6, $7, $8, FALSE)
+ FROM biblio.peer_bib_copy_map
+ WHERE target_copy = cp.id
+ )x)
+ ELSE NULL
+ END
+ ),
+ CASE
+ WHEN ('bmp' = ANY ($4)) THEN
+ XMLELEMENT( name monograph_parts,
+ (SELECT XMLAGG(bmp) FROM (
+ SELECT unapi.bmp( part, 'xml', 'monograph_part', array_remove($4,'acp'), $5, $6, $7, $8, FALSE)
+ FROM asset.copy_part_map
+ WHERE target_copy = cp.id
+ )x)
+ )
+ ELSE NULL
+ END,
+ CASE
+ WHEN ('circ' = ANY ($4)) THEN
+ XMLELEMENT( name current_circulation,
+ (SELECT XMLAGG(circ) FROM (
+ SELECT unapi.circ( id, 'xml', 'circ', array_remove($4,'circ'), $5, $6, $7, $8, FALSE)
+ FROM action.circulation
+ WHERE target_copy = cp.id
+ AND checkin_time IS NULL
+ )x)
+ )
+ ELSE NULL
+ END
+ )
+ FROM serial.unit cp
+ WHERE id = $1
+ AND cp.deleted IS FALSE
+ GROUP BY id, status, location, circ_lib, call_number, create_date,
+ edit_date, copy_number, circulate, floating, mint_condition,
+ deposit, ref, holdable, deleted, deposit_amount, price,
+ barcode, circ_modifier, circ_as_type, opac_visible,
+ status_changed_time, detailed_contents, sort_key,
+ summary_contents, cost, age_protect;
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.acn ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name volume,
+ XMLATTRIBUTES(
+ CASE WHEN $9 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ 'tag:open-ils.org:U2@acn/' || acn.id AS id,
+ acn.id AS vol_id, o.shortname AS lib,
+ o.opac_visible AS opac_visible,
+ deleted, label, label_sortkey, label_class, record
+ ),
+ unapi.aou( owning_lib, $2, 'owning_lib', array_remove($4,'acn'), $5, $6, $7, $8),
+ CASE
+ WHEN ('acp' = ANY ($4)) THEN
+ CASE WHEN $6 IS NOT NULL THEN
+ XMLELEMENT( name copies,
+ (SELECT XMLAGG(acp ORDER BY rank_avail) FROM (
+ SELECT unapi.acp( cp.id, 'xml', 'copy', array_remove($4,'acn'), $5, $6, $7, $8, FALSE),
+ evergreen.rank_cp(cp) AS rank_avail
+ FROM asset.copy cp
+ JOIN actor.org_unit_descendants( (SELECT id FROM actor.org_unit WHERE shortname = $5), $6) aoud ON (cp.circ_lib = aoud.id)
+ WHERE cp.call_number = acn.id
+ AND cp.deleted IS FALSE
+ ORDER BY rank_avail, COALESCE(cp.copy_number,0), cp.barcode
+ LIMIT ($7 -> 'acp')::INT
+ OFFSET ($8 -> 'acp')::INT
+ )x)
+ )
+ ELSE
+ XMLELEMENT( name copies,
+ (SELECT XMLAGG(acp ORDER BY rank_avail) FROM (
+ SELECT unapi.acp( cp.id, 'xml', 'copy', array_remove($4,'acn'), $5, $6, $7, $8, FALSE),
+ evergreen.rank_cp(cp) AS rank_avail
+ FROM asset.copy cp
+ JOIN actor.org_unit_descendants( (SELECT id FROM actor.org_unit WHERE shortname = $5) ) aoud ON (cp.circ_lib = aoud.id)
+ WHERE cp.call_number = acn.id
+ AND cp.deleted IS FALSE
+ ORDER BY rank_avail, COALESCE(cp.copy_number,0), cp.barcode
+ LIMIT ($7 -> 'acp')::INT
+ OFFSET ($8 -> 'acp')::INT
+ )x)
+ )
+ END
+ ELSE NULL
+ END,
+ XMLELEMENT(
+ name uris,
+ (SELECT XMLAGG(auri) FROM (SELECT unapi.auri(uri,'xml','uri', array_remove($4,'acn'), $5, $6, $7, $8, FALSE) FROM asset.uri_call_number_map WHERE call_number = acn.id)x)
+ ),
+ unapi.acnp( acn.prefix, 'marcxml', 'prefix', array_remove($4,'acn'), $5, $6, $7, $8, FALSE),
+ unapi.acns( acn.suffix, 'marcxml', 'suffix', array_remove($4,'acn'), $5, $6, $7, $8, FALSE),
+ CASE WHEN ('bre' = ANY ($4)) THEN unapi.bre( acn.record, 'marcxml', 'record', array_remove($4,'acn'), $5, $6, $7, $8, FALSE) ELSE NULL END
+ ) AS x
+ FROM asset.call_number acn
+ JOIN actor.org_unit o ON (o.id = acn.owning_lib)
+ WHERE acn.id = $1
+ AND acn.deleted IS FALSE
+ GROUP BY acn.id, o.shortname, o.opac_visible, deleted, label, label_sortkey, label_class, owning_lib, record, acn.prefix, acn.suffix;
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.auri ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name uri,
+ XMLATTRIBUTES(
+ CASE WHEN $9 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ 'tag:open-ils.org:U2@auri/' || uri.id AS id,
+ use_restriction,
+ href,
+ label
+ ),
+ CASE
+ WHEN ('acn' = ANY ($4)) THEN
+ XMLELEMENT( name copies,
+ (SELECT XMLAGG(acn) FROM (SELECT unapi.acn( call_number, 'xml', 'copy', array_remove($4,'auri'), $5, $6, $7, $8, FALSE) FROM asset.uri_call_number_map WHERE uri = uri.id)x)
+ )
+ ELSE NULL
+ END
+ ) AS x
+ FROM asset.uri uri
+ WHERE uri.id = $1
+ GROUP BY uri.id, use_restriction, href, label;
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.circ (obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT DEFAULT '-', depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name circ,
+ XMLATTRIBUTES(
+ CASE WHEN $9 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ 'tag:open-ils.org:U2@circ/' || id AS id,
+ xact_start,
+ due_date
+ ),
+ CASE WHEN ('aou' = ANY ($4)) THEN unapi.aou( circ_lib, $2, 'circ_lib', array_remove($4,'circ'), $5, $6, $7, $8, FALSE) ELSE NULL END,
+ CASE WHEN ('acp' = ANY ($4)) THEN unapi.acp( circ_lib, $2, 'target_copy', array_remove($4,'circ'), $5, $6, $7, $8, FALSE) ELSE NULL END
+ )
+ FROM action.circulation
+ WHERE id = $1;
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.mmr_holdings_xml (
+ mid BIGINT,
+ ouid INT,
+ org TEXT,
+ depth INT DEFAULT NULL,
+ includes TEXT[] DEFAULT NULL::TEXT[],
+ slimit HSTORE DEFAULT NULL,
+ soffset HSTORE DEFAULT NULL,
+ include_xmlns BOOL DEFAULT TRUE,
+ pref_lib INT DEFAULT NULL
+)
+RETURNS XML AS $F$
+ SELECT XMLELEMENT(
+ name holdings,
+ XMLATTRIBUTES(
+ CASE WHEN $8 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
+ CASE WHEN ('mmr' = ANY ($5)) THEN 'tag:open-ils.org:U2@mmr/' || $1 || '/' || $3 ELSE NULL END AS id,
+ (SELECT metarecord_has_holdable_copy FROM asset.metarecord_has_holdable_copy($1)) AS has_holdable
+ ),
+ XMLELEMENT(
+ name counts,
+ (SELECT XMLAGG(XMLELEMENT::XML) FROM (
+ SELECT XMLELEMENT(
+ name count,
+ XMLATTRIBUTES('public' as type, depth, org_unit, coalesce(transcendant,0) as transcendant, available, visible as count, unshadow)
+ )::text
+ FROM asset.opac_ou_metarecord_copy_count($2, $1)
+ UNION
+ SELECT XMLELEMENT(
+ name count,
+ XMLATTRIBUTES('staff' as type, depth, org_unit, coalesce(transcendant,0) as transcendant, available, visible as count, unshadow)
+ )::text
+ FROM asset.staff_ou_metarecord_copy_count($2, $1)
+ UNION
+ SELECT XMLELEMENT(
+ name count,
+ XMLATTRIBUTES('pref_lib' as type, depth, org_unit, coalesce(transcendant,0) as transcendant, available, visible as count, unshadow)
+ )::text
+ FROM asset.opac_ou_metarecord_copy_count($9, $1)
+ ORDER BY 1
+ )x)
+ ),
+ -- XXX monograph_parts and foreign_copies are skipped in MRs ... put them back some day?
+ XMLELEMENT(
+ name volumes,
+ (SELECT XMLAGG(acn ORDER BY rank, name, label_sortkey) FROM (
+ -- Physical copies
+ SELECT unapi.acn(y.id,'xml','volume',array_remove( array_remove($5,'holdings_xml'),'bre'), $3, $4, $6, $7, FALSE), y.rank, name, label_sortkey
+ FROM evergreen.ranked_volumes((SELECT ARRAY_AGG(source) FROM metabib.metarecord_source_map WHERE metarecord = $1), $2, $4, $6, $7, $9, $5) AS y
+ UNION ALL
+ -- Located URIs
+ SELECT unapi.acn(uris.id,'xml','volume',array_remove( array_remove($5,'holdings_xml'),'bre'), $3, $4, $6, $7, FALSE), uris.rank, name, label_sortkey
+ FROM evergreen.located_uris((SELECT ARRAY_AGG(source) FROM metabib.metarecord_source_map WHERE metarecord = $1), $2, $9) AS uris
+ )x)
+ ),
+ CASE WHEN ('ssub' = ANY ($5)) THEN
+ XMLELEMENT(
+ name subscriptions,
+ (SELECT XMLAGG(ssub) FROM (
+ SELECT unapi.ssub(id,'xml','subscription','{}'::TEXT[], $3, $4, $6, $7, FALSE)
+ FROM serial.subscription
+ WHERE record_entry IN (SELECT source FROM metabib.metarecord_source_map WHERE metarecord = $1)
+ )x)
+ )
+ ELSE NULL END
+ );
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION unapi.mmr (
+ obj_id BIGINT,
+ format TEXT,
+ ename TEXT,
+ includes TEXT[],
+ org TEXT,
+ depth INT DEFAULT NULL,
+ slimit HSTORE DEFAULT NULL,
+ soffset HSTORE DEFAULT NULL,
+ include_xmlns BOOL DEFAULT TRUE,
+ pref_lib INT DEFAULT NULL
+)
+RETURNS XML AS $F$
+DECLARE
+ mmrec metabib.metarecord%ROWTYPE;
+ leadrec biblio.record_entry%ROWTYPE;
+ subrec biblio.record_entry%ROWTYPE;
+ layout unapi.bre_output_layout%ROWTYPE;
+ xfrm config.xml_transform%ROWTYPE;
+ ouid INT;
+ xml_buf TEXT; -- growing XML document
+ tmp_xml TEXT; -- single-use XML string
+ xml_frag TEXT; -- single-use XML fragment
+ top_el TEXT;
+ output XML;
+ hxml XML;
+ axml XML;
+ subxml XML; -- subordinate records elements
+ sub_xpath TEXT;
+ parts TEXT[];
+BEGIN
+
+ -- xpath for extracting bre.marc values from subordinate records
+ -- so they may be appended to the MARC of the master record prior
+ -- to XSLT processing.
+ -- subjects, isbn, issn, upc -- anything else?
+ sub_xpath :=
+ '//*[starts-with(@tag, "6") or @tag="020" or @tag="022" or @tag="024"]';
+
+ IF org = '-' OR org IS NULL THEN
+ SELECT shortname INTO org FROM evergreen.org_top();
+ END IF;
+
+ SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org;
+
+ IF ouid IS NULL THEN
+ RETURN NULL::XML;
+ END IF;
+
+ SELECT INTO mmrec * FROM metabib.metarecord WHERE id = obj_id;
+ IF NOT FOUND THEN
+ RETURN NULL::XML;
+ END IF;
+
+ -- TODO: aggregate holdings from constituent records
+ IF format = 'holdings_xml' THEN -- the special case
+ output := unapi.mmr_holdings_xml(
+ obj_id, ouid, org, depth,
+ array_remove(includes,'holdings_xml'),
+ slimit, soffset, include_xmlns, pref_lib);
+ RETURN output;
+ END IF;
+
+ SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format;
+
+ IF layout.name IS NULL THEN
+ RETURN NULL::XML;
+ END IF;
+
+ SELECT * INTO xfrm FROM config.xml_transform WHERE name = layout.transform;
+
+ SELECT INTO leadrec * FROM biblio.record_entry WHERE id = mmrec.master_record;
+
+ -- Grab distinct MVF for all records if requested
+ IF ('mra' = ANY (includes)) THEN
+ axml := unapi.mmr_mra(obj_id,NULL,NULL,NULL,org,depth,NULL,NULL,TRUE,pref_lib);
+ ELSE
+ axml := NULL::XML;
+ END IF;
+
+ xml_buf = leadrec.marc;
+
+ hxml := NULL::XML;
+ IF ('holdings_xml' = ANY (includes)) THEN
+ hxml := unapi.mmr_holdings_xml(
+ obj_id, ouid, org, depth,
+ array_remove(includes,'holdings_xml'),
+ slimit, soffset, include_xmlns, pref_lib);
+ END IF;
+
+ subxml := NULL::XML;
+ parts := '{}'::TEXT[];
+ FOR subrec IN SELECT bre.* FROM biblio.record_entry bre
+ JOIN metabib.metarecord_source_map mmsm ON (mmsm.source = bre.id)
+ JOIN metabib.metarecord mmr ON (mmr.id = mmsm.metarecord)
+ WHERE mmr.id = obj_id AND NOT bre.deleted
+ ORDER BY CASE WHEN bre.id = mmr.master_record THEN 0 ELSE bre.id END
+ LIMIT COALESCE((slimit->'bre')::INT, 5) LOOP
+
+ IF subrec.id = leadrec.id THEN CONTINUE; END IF;
+ -- Append choice data from the the non-lead records to the
+ -- the lead record document
+
+ parts := parts || xpath(sub_xpath, subrec.marc::XML)::TEXT[];
+ END LOOP;
+
+ SELECT ARRAY_TO_STRING( ARRAY_AGG( DISTINCT p ), '' )::XML INTO subxml FROM UNNEST(parts) p;
+
+ -- append data from the subordinate records to the
+ -- main record document before applying the XSLT
+
+ IF subxml IS NOT NULL THEN
+ xml_buf := REGEXP_REPLACE(xml_buf,
+ '</record>(.*?)$', subxml || '</record>' || E'\\1');
+ END IF;
+
+ IF format = 'marcxml' THEN
+ -- If we're not using the prefixed namespace in
+ -- this record, then remove all declarations of it
+ IF xml_buf !~ E'<marc:' THEN
+ xml_buf := REGEXP_REPLACE(xml_buf,
+ ' xmlns:marc="http://www.loc.gov/MARC21/slim"', '', 'g');
+ END IF;
+ ELSE
+ xml_buf := oils_xslt_process(xml_buf, xfrm.xslt)::XML;
+ END IF;
+
+ -- update top_el to reflect the change in xml_buf, which may
+ -- now be a different type of document (e.g. record -> mods)
+ top_el := REGEXP_REPLACE(xml_buf, E'^.*?<((?:\\S+:)?' ||
+ layout.holdings_element || ').*$', E'\\1');
+
+ IF axml IS NOT NULL THEN
+ xml_buf := REGEXP_REPLACE(xml_buf,
+ '</' || top_el || '>(.*?)$', axml || '</' || top_el || E'>\\1');
+ END IF;
+
+ IF hxml IS NOT NULL THEN
+ xml_buf := REGEXP_REPLACE(xml_buf,
+ '</' || top_el || '>(.*?)$', hxml || '</' || top_el || E'>\\1');
+ END IF;
+
+ IF ('mmr.unapi' = ANY (includes)) THEN
+ output := REGEXP_REPLACE(
+ xml_buf,
+ '</' || top_el || '>(.*?)',
+ XMLELEMENT(
+ name abbr,
+ XMLATTRIBUTES(
+ 'http://www.w3.org/1999/xhtml' AS xmlns,
+ 'unapi-id' AS class,
+ 'tag:open-ils.org:U2@mmr/' || obj_id || '/' || org AS title
+ )
+ )::TEXT || '</' || top_el || E'>\\1'
+ );
+ ELSE
+ output := xml_buf;
+ END IF;
+
+ -- remove ignorable whitesace
+ output := REGEXP_REPLACE(output::TEXT,E'>\\s+<','><','gs')::XML;
+ RETURN output;
+END;
+$F$ LANGUAGE PLPGSQL STABLE;
+
+CREATE OR REPLACE FUNCTION authority.extract_headings(marc TEXT, restrict INT[] DEFAULT NULL) RETURNS SETOF authority.heading AS $func$
+DECLARE
+ idx authority.heading_field%ROWTYPE;
+ xfrm config.xml_transform%ROWTYPE;
+ prev_xfrm TEXT;
+ transformed_xml TEXT;
+ heading_node TEXT;
+ heading_node_list TEXT[];
+ component_node TEXT;
+ component_node_list TEXT[];
+ raw_text TEXT;
+ normalized_text TEXT;
+ normalizer RECORD;
+ curr_text TEXT;
+ joiner TEXT;
+ type_value TEXT;
+ base_thesaurus TEXT := NULL;
+ output_row authority.heading;
+BEGIN
+
+ -- Loop over the indexing entries
+ FOR idx IN SELECT * FROM authority.heading_field WHERE restrict IS NULL OR id = ANY (restrict) ORDER BY format LOOP
+
+ output_row.field := idx.id;
+ output_row.type := idx.heading_type;
+ output_row.purpose := idx.heading_purpose;
+
+ joiner := COALESCE(idx.joiner, ' ');
+
+ SELECT INTO xfrm * from config.xml_transform WHERE name = idx.format;
+
+ -- See if we can skip the XSLT ... it's expensive
+ IF prev_xfrm IS NULL OR prev_xfrm <> xfrm.name THEN
+ -- Can't skip the transform
+ IF xfrm.xslt <> '---' THEN
+ transformed_xml := oils_xslt_process(marc, xfrm.xslt);
+ ELSE
+ transformed_xml := marc;
+ END IF;
+
+ prev_xfrm := xfrm.name;
+ END IF;
+
+ IF idx.thesaurus_xpath IS NOT NULL THEN
+ base_thesaurus := ARRAY_TO_STRING(oils_xpath(idx.thesaurus_xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]), '');
+ END IF;
+
+ heading_node_list := oils_xpath( idx.heading_xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+
+ FOR heading_node IN SELECT x FROM unnest(heading_node_list) AS x LOOP
+
+ CONTINUE WHEN heading_node !~ E'^\\s*<';
+
+ output_row.variant_type := NULL;
+ output_row.related_type := NULL;
+ output_row.thesaurus := NULL;
+ output_row.heading := NULL;
+
+ IF idx.heading_purpose = 'variant' AND idx.type_xpath IS NOT NULL THEN
+ type_value := ARRAY_TO_STRING(oils_xpath(idx.type_xpath, heading_node, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]), '');
+ BEGIN
+ output_row.variant_type := type_value;
+ EXCEPTION WHEN invalid_text_representation THEN
+ RAISE NOTICE 'Do not recognize variant heading type %', type_value;
+ END;
+ END IF;
+ IF idx.heading_purpose = 'related' AND idx.type_xpath IS NOT NULL THEN
+ type_value := ARRAY_TO_STRING(oils_xpath(idx.type_xpath, heading_node, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]), '');
+ BEGIN
+ output_row.related_type := type_value;
+ EXCEPTION WHEN invalid_text_representation THEN
+ RAISE NOTICE 'Do not recognize related heading type %', type_value;
+ END;
+ END IF;
+
+ IF idx.thesaurus_override_xpath IS NOT NULL THEN
+ output_row.thesaurus := ARRAY_TO_STRING(oils_xpath(idx.thesaurus_override_xpath, heading_node, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]), '');
+ END IF;
+ IF output_row.thesaurus IS NULL THEN
+ output_row.thesaurus := base_thesaurus;
+ END IF;
+
+ raw_text := NULL;
+
+ -- now iterate over components of heading
+ component_node_list := oils_xpath( idx.component_xpath, heading_node, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+ FOR component_node IN SELECT x FROM unnest(component_node_list) AS x LOOP
+ -- XXX much of this should be moved into oils_xpath_string...
+ curr_text := ARRAY_TO_STRING(array_remove(array_remove(
+ oils_xpath( '//text()', -- get the content of all the nodes within the main selected node
+ REGEXP_REPLACE( component_node, E'\\s+', ' ', 'g' ) -- Translate adjacent whitespace to a single space
+ ), ' '), ''), -- throw away morally empty (bankrupt?) strings
+ joiner
+ );
+
+ CONTINUE WHEN curr_text IS NULL OR curr_text = '';
+
+ IF raw_text IS NOT NULL THEN
+ raw_text := raw_text || joiner;
+ END IF;
+
+ raw_text := COALESCE(raw_text,'') || curr_text;
+ END LOOP;
+
+ IF raw_text IS NOT NULL THEN
+ output_row.heading := raw_text;
+ normalized_text := raw_text;
+
+ FOR normalizer IN
+ SELECT n.func AS func,
+ n.param_count AS param_count,
+ m.params AS params
+ FROM config.index_normalizer n
+ JOIN authority.heading_field_norm_map m ON (m.norm = n.id)
+ WHERE m.field = idx.id
+ ORDER BY m.pos LOOP
+
+ EXECUTE 'SELECT ' || normalizer.func || '(' ||
+ quote_literal( normalized_text ) ||
+ CASE
+ WHEN normalizer.param_count > 0
+ THEN ',' || REPLACE(REPLACE(BTRIM(normalizer.params,'[]'),E'\'',E'\\\''),E'"',E'\'')
+ ELSE ''
+ END ||
+ ')' INTO normalized_text;
+
+ END LOOP;
+
+ output_row.normalized_heading := normalized_text;
+
+ RETURN NEXT output_row;
+ END IF;
+ END LOOP;
+
+ END LOOP;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION authority.extract_headings(rid BIGINT, restrict INT[] DEFAULT NULL) RETURNS SETOF authority.heading AS $func$
+DECLARE
+ auth authority.record_entry%ROWTYPE;
+ output_row authority.heading;
+BEGIN
+ -- Get the record
+ SELECT INTO auth * FROM authority.record_entry WHERE id = rid;
+
+ RETURN QUERY SELECT * FROM authority.extract_headings(auth.marc, restrict);
+END;
+$func$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION biblio.extract_metabib_field_entry (
+ rid BIGINT,
+ default_joiner TEXT,
+ field_types TEXT[],
+ only_fields INT[]
+) RETURNS SETOF metabib.field_entry_template AS $func$
+DECLARE
+ bib biblio.record_entry%ROWTYPE;
+ idx config.metabib_field%ROWTYPE;
+ xfrm config.xml_transform%ROWTYPE;
+ prev_xfrm TEXT;
+ transformed_xml TEXT;
+ xml_node TEXT;
+ xml_node_list TEXT[];
+ facet_text TEXT;
+ display_text TEXT;
+ browse_text TEXT;
+ sort_value TEXT;
+ raw_text TEXT;
+ curr_text TEXT;
+ joiner TEXT := default_joiner; -- XXX will index defs supply a joiner?
+ authority_text TEXT;
+ authority_link BIGINT;
+ output_row metabib.field_entry_template%ROWTYPE;
+ process_idx BOOL;
+BEGIN
+
+ -- Start out with no field-use bools set
+ output_row.browse_field = FALSE;
+ output_row.facet_field = FALSE;
+ output_row.display_field = FALSE;
+ output_row.search_field = FALSE;
+
+ -- Get the record
+ SELECT INTO bib * FROM biblio.record_entry WHERE id = rid;
+
+ -- Loop over the indexing entries
+ FOR idx IN SELECT * FROM config.metabib_field WHERE id = ANY (only_fields) ORDER BY format LOOP
+ CONTINUE WHEN idx.xpath IS NULL OR idx.xpath = ''; -- pure virtual field
+
+ process_idx := FALSE;
+ IF idx.display_field AND 'display' = ANY (field_types) THEN process_idx = TRUE; END IF;
+ IF idx.browse_field AND 'browse' = ANY (field_types) THEN process_idx = TRUE; END IF;
+ IF idx.search_field AND 'search' = ANY (field_types) THEN process_idx = TRUE; END IF;
+ IF idx.facet_field AND 'facet' = ANY (field_types) THEN process_idx = TRUE; END IF;
+ CONTINUE WHEN process_idx = FALSE; -- disabled for all types
+
+ joiner := COALESCE(idx.joiner, default_joiner);
+
+ SELECT INTO xfrm * from config.xml_transform WHERE name = idx.format;
+
+ -- See if we can skip the XSLT ... it's expensive
+ IF prev_xfrm IS NULL OR prev_xfrm <> xfrm.name THEN
+ -- Can't skip the transform
+ IF xfrm.xslt <> '---' THEN
+ transformed_xml := oils_xslt_process(bib.marc,xfrm.xslt);
+ ELSE
+ transformed_xml := bib.marc;
+ END IF;
+
+ prev_xfrm := xfrm.name;
+ END IF;
+
+ xml_node_list := oils_xpath( idx.xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+
+ raw_text := NULL;
+ FOR xml_node IN SELECT x FROM unnest(xml_node_list) AS x LOOP
+ CONTINUE WHEN xml_node !~ E'^\\s*<';
+
+ -- XXX much of this should be moved into oils_xpath_string...
+ curr_text := ARRAY_TO_STRING(array_remove(array_remove(
+ oils_xpath( '//text()', -- get the content of all the nodes within the main selected node
+ REGEXP_REPLACE( xml_node, E'\\s+', ' ', 'g' ) -- Translate adjacent whitespace to a single space
+ ), ' '), ''), -- throw away morally empty (bankrupt?) strings
+ joiner
+ );
+
+ CONTINUE WHEN curr_text IS NULL OR curr_text = '';
+
+ IF raw_text IS NOT NULL THEN
+ raw_text := raw_text || joiner;
+ END IF;
+
+ raw_text := COALESCE(raw_text,'') || curr_text;
+
+ -- autosuggest/metabib.browse_entry
+ IF idx.browse_field THEN
+
+ IF idx.browse_xpath IS NOT NULL AND idx.browse_xpath <> '' THEN
+ browse_text := oils_xpath_string( idx.browse_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+ ELSE
+ browse_text := curr_text;
+ END IF;
+
+ IF idx.browse_sort_xpath IS NOT NULL AND
+ idx.browse_sort_xpath <> '' THEN
+
+ sort_value := oils_xpath_string(
+ idx.browse_sort_xpath, xml_node, joiner,
+ ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]
+ );
+ ELSE
+ sort_value := browse_text;
+ END IF;
+
+ output_row.field_class = idx.field_class;
+ output_row.field = idx.id;
+ output_row.source = rid;
+ output_row.value = BTRIM(REGEXP_REPLACE(browse_text, E'\\s+', ' ', 'g'));
+ output_row.sort_value :=
+ public.naco_normalize(sort_value);
+
+ output_row.authority := NULL;
+
+ IF idx.authority_xpath IS NOT NULL AND idx.authority_xpath <> '' THEN
+ authority_text := oils_xpath_string(
+ idx.authority_xpath, xml_node, joiner,
+ ARRAY[
+ ARRAY[xfrm.prefix, xfrm.namespace_uri],
+ ARRAY['xlink','http://www.w3.org/1999/xlink']
+ ]
+ );
+
+ IF authority_text ~ '^\d+$' THEN
+ authority_link := authority_text::BIGINT;
+ PERFORM * FROM authority.record_entry WHERE id = authority_link;
+ IF FOUND THEN
+ output_row.authority := authority_link;
+ END IF;
+ END IF;
+
+ END IF;
+
+ output_row.browse_field = TRUE;
+ -- Returning browse rows with search_field = true for search+browse
+ -- configs allows us to retain granularity of being able to search
+ -- browse fields with "starts with" type operators (for example, for
+ -- titles of songs in music albums)
+ IF idx.search_field THEN
+ output_row.search_field = TRUE;
+ END IF;
+ RETURN NEXT output_row;
+ output_row.browse_field = FALSE;
+ output_row.search_field = FALSE;
+ output_row.sort_value := NULL;
+ END IF;
+
+ -- insert raw node text for faceting
+ IF idx.facet_field THEN
+
+ IF idx.facet_xpath IS NOT NULL AND idx.facet_xpath <> '' THEN
+ facet_text := oils_xpath_string( idx.facet_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+ ELSE
+ facet_text := curr_text;
+ END IF;
+
+ output_row.field_class = idx.field_class;
+ output_row.field = -1 * idx.id;
+ output_row.source = rid;
+ output_row.value = BTRIM(REGEXP_REPLACE(facet_text, E'\\s+', ' ', 'g'));
+
+ output_row.facet_field = TRUE;
+ RETURN NEXT output_row;
+ output_row.facet_field = FALSE;
+ END IF;
+
+ -- insert raw node text for display
+ IF idx.display_field THEN
+
+ IF idx.display_xpath IS NOT NULL AND idx.display_xpath <> '' THEN
+ display_text := oils_xpath_string( idx.display_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+ ELSE
+ display_text := curr_text;
+ END IF;
+
+ output_row.field_class = idx.field_class;
+ output_row.field = -1 * idx.id;
+ output_row.source = rid;
+ output_row.value = BTRIM(REGEXP_REPLACE(display_text, E'\\s+', ' ', 'g'));
+
+ output_row.display_field = TRUE;
+ RETURN NEXT output_row;
+ output_row.display_field = FALSE;
+ END IF;
+
+ END LOOP;
+
+ CONTINUE WHEN raw_text IS NULL OR raw_text = '';
+
+ -- insert combined node text for searching
+ IF idx.search_field THEN
+ output_row.field_class = idx.field_class;
+ output_row.field = idx.id;
+ output_row.source = rid;
+ output_row.value = BTRIM(REGEXP_REPLACE(raw_text, E'\\s+', ' ', 'g'));
+
+ output_row.search_field = TRUE;
+ RETURN NEXT output_row;
+ output_row.search_field = FALSE;
+ END IF;
+
+ END LOOP;
+
+END;
+$func$ LANGUAGE PLPGSQL;
+
+-- We no longer need the custom function
+DROP FUNCTION evergreen.array_remove_item_by_value(ANYARRAY, ANYELEMENT);
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1265', :eg_version);
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+ 'eg.orgselect.hopeless.wide_holds', 'gui', 'integer',
+ oils_i18n_gettext(
+ 'eg.orgselect.hopeless.wide_holds',
+ 'Default org unit for hopeless holds interface',
+ 'cwst', 'label'
+ )
+);
+
+COMMIT;
+
+-- Update auditor tables to catch changes to source tables.
+-- Can be removed/skipped if there were no schema changes.
+SELECT auditor.update_auditors();
<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_7_1</p>
<h2>What is Evergreen?</h2>
<blockquote>
<p>
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_7_1");
pref("open-ils.repository.author","$Author$");
pref("open-ils.repository.revision","$Revision$");
pref("open-ils.repository.date","$Date$");
; 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.7"
!define PRODUCT_INSTALL_TAG "${PRODUCT_TAG}"
!define UI_IMAGESET "beta"
;!define UI_IMAGESET "release"
+++ /dev/null
-docs/modules/installation/pages/server_installation.adoc
\ No newline at end of file
--- /dev/null
+= 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 9.6.
+ * **Linux**: Evergreen has been tested on
+ Debian Buster (10),
+ Debian Stretch (9),
+ Debian Jessie (8),
+ 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-buster`,`debian-stretch`,`debian-jessie`,`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,
+including the testing of the Angular web client components,
+additional packages may be 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.
++
+[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]
+------------------------------------------------------------------------------
+# build, concat+minify
+npm run build-prod
+------------------------------------------------------------------------------
++
+4. OPTIONAL: Test web client code if the <osname>-developer packages were 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]
+------------------------------------------------------------------------------
+# build and run tests
+ng build --prod
+------------------------------------------------------------------------------
++
+4. OPTIONAL: Test eg2 web client code if the <osname>-developer packages were 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, 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 9 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>'. Choose the most appropriate
+command below based on your operating system. This will install PostgreSQL 9.6,
+the minimum supported version.
+
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-buster
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-stretch
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-jessie
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-bionic
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-focal
+------------------------------------------------------------------------------
+
+To install PostgreSQL version 10, use the following command for your operating
+system:
+
+[source, bash]
+------------------------------------------------------------------------------
+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-debian-jessie-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
+------------------------------------------------------------------------------
+
+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.
+
+==== PostgreSQL 9.6 and later ====
+
+To create the database instance on a remote database server running PostgreSQL
+9.6 or later, 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.
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.7.1, open-ils-dev@list.georgialibraries.org)
AC_CONFIG_SRCDIR([configure.ac])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE
== Software Prerequisites ==
* **PostgreSQL**: The minimum supported version is 9.6.
- * **Linux**: Evergreen 3.X.X has been tested on Debian Stretch
+ * **Linux**: Evergreen 3.7.1 has been tested on Debian Stretch
(9.0), Debian Jessie (8.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 to upgrade before upgrading
.. 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.7.1:
+
[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.7.1.tar.gz
+tar xzf Evergreen-ILS-3.7.1.tar.gz
-----------------------------------------------
+
[NOTE]
+
[source, bash]
---------------------------------------------
-cd /home/opensrf/Evergreen-ILS-3.X.X
+cd /home/opensrf/Evergreen-ILS-3.7.1
---------------------------------------------
+
On the next command, replace `[distribution]` with one of these values for your
+
[source, bash]
------------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-3.X.X
+cd /home/opensrf/Evergreen-ILS-3.7.1
PATH=/openils/bin:$PATH ./configure --prefix=/openils --sysconfdir=/openils/conf
make
------------------------------------------------------------
+
[source, bash]
------------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-3.X.X
+cd /home/opensrf/Evergreen-ILS-3.7.1
make install
------------------------------------------------------------
+
+
[source, bash]
------------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-3.X.X
+cd /home/opensrf/Evergreen-ILS-3.7.1
make STAFF_CLIENT_STAMP_ID=rel_3_x_x install
------------------------------------------------------------
+
+
[source, bash]
-------------------------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-3.X.X
+cd /home/opensrf/Evergreen-ILS-3.7.1
perl Open-ILS/src/support-scripts/eg_db_config --update-config --service all \
--create-offline --database evergreen --host localhost --user evergreen --password evergreen
-------------------------------------------------------------------------
+
[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.7.1/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.7.1/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.7.1/Open-ILS/examples/apache/eg.conf /etc/apache2/sites-available/eg.conf
----------------------------------------------------------
== Upgrade the Evergreen database schema ==
[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.7.1/Open-ILS/src/sql/Pg
+psql -U evergreen -h localhost -f version-upgrade/3.7.0-3.7.1-upgrade-db.sql evergreen
----------------------------------------------------------
[TIP]
1256
1258
1259
-1260
1261
1262
1263