Galen Charlton [Tue, 26 May 2020 21:17:48 +0000 (17:17 -0400)]
LP#1879983: AngularJS staff interface for curbside pickup
This adds a new AngularJS page for curbside appointment management. The
page has several tabs:
* To Be Staged appointments. This displays upcoming appointments; from
here, staff can mark appointments as "staged". Depending on the
library's curbside workflow, that may mean that the staff member
places the items in a bag or on a delivery table.
This tab also allows a staff member to claim (or unclaim)
responsibility for staging items for an appointment.
* Staged and Ready. This displays staged appointments; from here, staff
can mark that the patron has arrived, check out the items and mark
the appointment delivered, or un-stage the appointment.
* Patron Is Outside: from here, staff can check out the items and
mark the appointment delivered.
* Delivered Today: This displays appointments that were marked as
delivered.
* Schedule Pickup: This allows staff members to create and modify
curbside appointments on behalf of a patron.
AngularJS was chosen for this interface to permit backporting the
feature to older versions of Evergreen without having to deal with
variations in the version of Angular that is supported in past
releases. It also better meshes with the patron and circulation staff
interfaces that have not yet been rewritten in Angular.
The curbside pickup page only handles appointments at the workstation
library of the current staff user, as it assumes that the curbside
process is not centralized.
In addition to Galen Charlton, significant contributions to this
patch were made by Mike Rylander.
Sponsored-by: PaILS Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org> Signed-off-by: Mike Rylander <mrylander@gmail.com> Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
This commit adds a reactor and validator for automating parts of the
basic Curbside workflows:
* Curbside validator: check whether curbside is enabled at the org unit
applicable an A/T event's target, which could be a user, org unit,
curbside appointment, or hold request.
* CurbsideSlot reactor: Creates a curbside appointment slot at the hold
pickup library when a hold becomes ready for pickup, if one does not
exist. This is meant to be triggered by the hold.available hook.
Appointments created by this reactor do not have an appointment time
set, as that is meant to be supplied by the patron or a staff member
acting on behalf of the patron.
In addition to Mike Rylander, significant contributions to this
patch were made by Jason Boyer.
Sponsored-by: PaILS Signed-off-by: Mike Rylander <mrylander@gmail.com> Signed-off-by: Jason Boyer <jboyer@equinoxinitiative.org> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org> Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
This commit adds the Curbside OpenSRF application, open-ils.curbside,
which provides all the business logic and data retrieval APIs. The
open-ils.curbside service must be registered with the public routeri
in order for the feature to function.
The methods in this service are:
* open-ils.curbside.fetch_mine: retrieve the active appointments
for the current login session; this is meant for OPAC use.
* open-ils.curbside.open_user_appointments_at_lib: retrieve
appointments for the specified user at a given library.
* open-ils.curbside.patron.ready_holds_at_lib.count: count
available holds for a patron at a specified library; this is
needed because there is no other single method that provides
this.
This commit defines events that might be sent to UIs in the case of
exceptional circumstances:
* CURBSIDE_NOT_ALLOWED (i.e., if the circ.curbside library setting is
not enabled for a given pickup library.)
* CURBSIDE_MAX_FOR_TIME (i.e., if all of the available slots for
a given appointment time have been scheduled.)
* CURBSIDE_EXISTS (i.e., if one is attempting to create a new
open curbside appointment for a patron and pickup library when
one already exists.)
Sponsored-by: PaILS Signed-off-by: Mike Rylander <mrylander@gmail.com> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org> Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
This patch adds a new database table, action.curbside, for
tracking appointments to pick up on-shelf hold requests:
id - ID
patron - patron that the appoint is for
org - pickup library that the appointment is for
slot - date and time of appointment
staged - whethers for appointment have been staged
stage_staff - staff member responsible for staging the items
arrival - whether patron has arrived to pick up the items
delivered - whether items have been checked out to patron
delivery_staff - staff member responsible for checking out the items
notes - notes about the appointment, e.g., the color
of the patron's vehicle
It also adds four new library settings:
* circ.curbside: whether to enable curbside appointments for
picking up available hold requests. This default to off.
* circ.curbside.granularity: interval between appointment slots. This
defaults to 15 minutes.
* circ.curbside.max_concurrent: how many appointments to permit per
time slot. This defaults to 10.
* circ.curbside.disable_patron_input: if turned on, display scheduled
and pending appointments in My Account in the public catalog but
do not give the patron the ability to change them from My Account.
This defaults to false, i.e., allowing patrons to modify appointments
from My Account.
It also adds two Action Trigger hooks:
* hold.offer_curbside: to trigger notifications offering a patron the
opportunity to set an appointment time; this is invoked if the
CurbsideSlot A/T reactor is used to create appointment slots when
holds become available.
* hold.confim_curbside: fired when a curbside pickup appointment is
created or updated.
It also adds seed data for the Curbside A/T validator and CurbsideSlot A/T
reactor.
This is in the first patch in a series for a new feature in
Evergreen called Curbside Pickup.
The Curbside Pickup features in Evergreen provides an interface to help
facilitate contact free pickup of library materials. It provides a dedicated
interface in the staff client for library staff to track and manage curbside
pickup appointments and materials through the various stages of the process.
Staff can also schedule pickup appointments on behalf of patrons. This feature
also allows patrons to schedule their own curbside pickup appointments in their
OPAC account, as well as inform the library when they have arrived and are
waiting for their materials.
To test
-------
(Testing notes were contributed by Andrea Neiman)
In order to test Curbside, you will need to place and capture holds at the
respective location you’re testing. This work does not interfere with existing
hold rules or parameters, except to force checkout override in certain
circumstances.
In addition, the circ.curbside library setting must be enabled. These testing
suggestions assume that the A/T event definitions included in this patch
series have been enabled.
Things to test:
* MyAccount correctly reflects scheduling/scheduled options
* Alert staff on my arrival should move batch to the Patron is Outside
tab
* Update appointment/cancel appointment options should move or remove
the batch appropriately
* If a patron has pickups at multiple locations, they should be able
to schedule separate pickups per location
* Email notices at various steps of the way are firing correctly
* Patron should get email for hold pickup, including scheduling
curbside.
* Patron should get email confirming curbside pickup
* Patron should get email with checked out items, if email receipts
are enabled
* Correct “batching” of items for pickup
* Batch moving correctly through tabs
* Batch is physically collocated - i.e. not containing pickups for
other OUs
* Checkouts are performed correctly
* Check against patrons with blocks - force override should be in effect
* Settings are being respected with regard to pickup scheduling & time
constraints
* Can’t create pickups in the past
* Pickups respect library open hours as set in Org Unit Administration
* Can’t create pickups if the 15-minute block is filled
Sponsored-by: PaILS Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org> Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
Each call to oils_i18n_gettext should have a unique id per class,
this patch adjusts the call for acmr so translations (and tests)
will work correctly.
Signed-off-by: Jason Boyer <JBoyer@equinoxinitiative.org>
Jason Boyer [Fri, 11 Sep 2020 16:43:20 +0000 (12:43 -0400)]
LP1849212: Correct upgrade script
Re-align permission ids and correct syntax errors in the course reserves upgrade script.
I'm not convinced the boolean_facet metabib class should exist simply to add "course reserves, Y/N?"
and in any case can not function as is because adding metabib field classes requires additional
field_entry tables which are missing from the seed data and upgrade script.
Signed-off-by: Michele Morgan <mmorgan@noblenet.org> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Jane Sandberg [Wed, 26 Aug 2020 22:51:32 +0000 (15:51 -0700)]
LP1849212: Improvements to the Simplified Marc Editor
* Templates can now set multiple subfields for the same field
* Templates can now set indicator values
* Editor now allows user to choose a MARC Form and Type
* Improvements to the course associate brief record interface
to use these improvements
Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu> Signed-off-by: Michele Morgan <mmorgan@noblenet.org> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Jane Sandberg [Wed, 26 Aug 2020 18:30:02 +0000 (11:30 -0700)]
LP1849212: Grid improvements
- Correcting some grid column labels
- Correcting ViewChild static flags, allowing grid refresh
- Also, remove the static: false flag, since it is no longer necessary
Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu> Signed-off-by: Michele Morgan <mmorgan@noblenet.org> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Jane Sandberg [Mon, 10 Aug 2020 03:03:26 +0000 (20:03 -0700)]
LP1849212: Improvements to course materials admin UI
- Better order for acmc fm-editor
- Add original item attributes to the course materials list
- trim whitespace from barcodes
- accessible labels in the course page
- refactor course users
- fix incorrect paths in course materials grid columns
Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu> Signed-off-by: Michele Morgan <mmorgan@noblenet.org> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
- Apply Course Users functionality to Angular Course Page
Admin UI.
- Condense Course User functionality into its own component,
usable as a dialog and inline.
- Condense Course Material functionality into its own component,
usable as a dialog and inline.
- Add Return to Course List button
- Move Archive Course button above tabs
- Allow Editing of Course Users and Materials
- Set datatype of is_public on Course User to 'bool' from 'boolean'
- Relabel is_public on Course User to "OPAC Viewable?"
- Undo removal of fm-editor in Course List
- Users with the MANAGE_RESERVES permission who are opted
into the course module can view a new Course Info tab on
the item record.
- Course Info tab displays a list of all courses(with link
to the Admin Course Page) item is associated with, and a
list of all instructors associated with those courses.
- Improvements to open-ils.circ.course_users.retrieve.
- Improve visuals when logged in as administrator.
- Implement Course Search OPAC page, based on Advanced Catalog
Search
- Edit Searchbar to include entry for Course Search
Signed-off-by: Kyle Huckins <khuckins@catalyte.io> Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu> Signed-off-by: Michele Morgan <mmorgan@noblenet.org> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Kyle Huckins [Fri, 6 Dec 2019 07:17:53 +0000 (07:17 +0000)]
lp1849212: Course Admin Page and OPAC improvements
- Double-clicking on a course in the Course Reserves List will
up a dedicated admin page for an individual course, featuring
tabs for Editing and managing Course Materials.
- Add bannerStyle and bannerIcon parameters to
eg-staff-banner to improve eg-staff-banner
accessability
- Improve UX of Course Page
- Properly disable inputs and buttons when course
is already archived.
- Change links in Angular Catalog to navigate the user to the
Admin Course Page.
- Prevent users from associating duplicate items to a
course.
- Remove unnecessary artifact from course page html
- Implement Course column to view Course Numbers of classes associated
with individual copies.
- Add a record column to course_module_course_materials
to improve efficiency of API and service methods.
- Add previous circ_modifier adjustments to upgrade script
- Provide Associated Course names and numbers on
OPAC Catalog search results.
- Fixed typo for User Role field, now matcheing DB column, usr_role
- Added boolean "is_public" to differentiate between a role that
should be viewable by anyone on the OPAC.
- Perl Module and Course Page displaying name and course
number of course, as well as names/roles of publicly viewable
members, course details, and a table of all materials associated
with the course.
- URL listed as eg/opac/course/[COURSE_ID]
- Ensure Shelving Location input checkbox
ticks when selecting a value.
- Ensure temporary value inputs are not
cleared when entering a new item.
- Fully select contents of Barcode input
field when selected.
- Clear bBarcode input upon hitting enter.
- Add a new tab for managing Users associated with
the course, in preparation for the User Dialog code.
- Remove excess whitespace on OPAC course page.
Signed-off-by: Kyle Huckins <khuckins@catalyte.io> Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu> Signed-off-by: Michele Morgan <mmorgan@noblenet.org> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Kyle Huckins [Mon, 25 Nov 2019 22:06:04 +0000 (22:06 +0000)]
lp1849212 Angular Catalog Course integration
- Add a column retrieving the names of courses linked to materials
when opted into the Course Reserves functionality.
- Expand the bib record summary when opted in to display all courses
associated with an item.
- Display associated courses on Search Results UI
- Move bulk of Associate Item funcitonality into Course Service
Signed-off-by: Kyle Huckins <khuckins@catalyte.io> Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu> Signed-off-by: Michele Morgan <mmorgan@noblenet.org> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Kyle Huckins [Wed, 20 Nov 2019 22:30:06 +0000 (22:30 +0000)]
lp1849212: Archive Courses
- Implement functionality to archive a course via the
admin course reserves list UI.
- Disassociate all items from a course and reinstate
their original fields if temporary fields were applied,
upon course archival.
Signed-off-by: Kyle Huckins <khuckins@catalyte.io> Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
Changes to be committed:
modified: Open-ILS/examples/fm_IDL.xml
modified: Open-ILS/src/eg2/src/app/staff/admin/server/course-reserves/course-list.component.html
modified: Open-ILS/src/eg2/src/app/staff/admin/server/course-reserves/course-list.component.ts
modified: Open-ILS/src/sql/Pg/040.schema.asset.sql
modified: Open-ILS/src/sql/Pg/upgrade/XXXX.schema.course-materials-module.sql
Signed-off-by: Michele Morgan <mmorgan@noblenet.org> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Kyle Huckins [Thu, 7 Nov 2019 18:38:04 +0000 (18:38 +0000)]
LP1849212: tidying up course reserves UIs
- Remove RowFlair and ClassCallback from Course Reserves
Grid.
- Implement dialog to view course materials associated with
a particular course in the course list admin UI.
- Implement actions to associate and disassociate materials with
a specific course.
- Optionally apply temporary Call Number, Circ Modifier, Item
Status, and Shelving Location when associating an item with a
course.
- Reapply original values of the above-mentioned fields when
disassociating an item from a course.
- Move disassociation code into Course Service.
- Automatically disassociate items and return them
to their original state when deleting a course.
Signed-off-by: Kyle Huckins <khuckins@catalyte.io> Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu> Signed-off-by: Michele Morgan <mmorgan@noblenet.org> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Added a grid component that displays the available data, specified
by the class, while also modifying the routing, so the admin splash
page links to the created component.
Signed-off-by: Zavier Banks <zbanks@catalyte.io> Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu> Signed-off-by: Michele Morgan <mmorgan@noblenet.org> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Kyle Huckins [Fri, 18 Oct 2019 18:05:57 +0000 (18:05 +0000)]
LP1849212: Course Reserves database and IDL
- Create MANAGE_RESERVES permission.
- Create IDL Object for Courses.
- Create table within asset schema for Courses, containing an id,
a name, a course number, a section number, and an owning library.
- Add IDL Class and asset table to map actor.usr and
asset.course_module_course, along with an optional
string value for the user's role in the course. If
desired, this can later be fleshed out into a separate
course role table.
- Create IDL Class & Table for Course Materials
- Create IDL Class & Table for Non-Cataloged Course Materials
- YAOUS introduced to allow opting into the Course Materials
module functionality.
- Change instances of non-cat-course_materials to non_cat_course_materials
Signed-off-by: Kyle Huckins <khuckins@catalyte.io> Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu> Signed-off-by: Michele Morgan <mmorgan@noblenet.org> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Jane Sandberg [Sat, 12 Sep 2020 15:22:54 +0000 (08:22 -0700)]
LP1895395: Use Angular AOT compiler for ng build
As of angular 9, the angular documentation recommends using the AOT
compiler for ng build: https://angular.io/guide/ivy
This would provide a bit more consistency for developers (since some
errors only display in AOT, others only display in JIT, and we want to
make sure that the AOT in particular is error-free so that builds don't
break).
Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
This modifies the database upgrade script to avoid overwriting the
existing templates if they have been differ from the default supplied
in the most recent seed data.
Signed-off-by: Mike Rylander <mrylander@gmail.com> Signed-off-by: Michele Morgan <mmorgan@noblenet.org> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Galen Charlton [Fri, 3 Jan 2020 20:40:46 +0000 (15:40 -0500)]
LP#1749475: (follow-up) move admin interfaces from Local to Server
The spec called for the Event Definition Groups and Event Definition
Group Members admin interfaces to be put under Local Administration,
but the Angular local admin interfaces didn't exist when the feature
was originally submitted.
This patch also fixes "defintion" typos.
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org> Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
Because we are using positional arguments, but the position is off by
one due to the previous API, these arguments were difficult to assign
cleanly. This is an attempt to make it a little more legible, though
ultimately, we should strongly consider an options hash for the new
additions.
Signed-off-by: Dan Wells <dbw2@calvin.edu> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org> Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
Dan Wells [Thu, 21 Feb 2019 16:08:33 +0000 (11:08 -0500)]
LP#1749475 Improve error handling in send_event_email_output
This code was borrowed from a few other places, so it still had the
$stat variable, but wasn't doing anything with it. We might as well
go a step further and borrow the error handling that variable is there
for.
Ultimately, email handling should probably moved out to a utility
function rather than spread about.
Signed-off-by: Dan Wells <dbw2@calvin.edu> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org> Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
Dan Wells [Thu, 21 Feb 2019 16:31:20 +0000 (11:31 -0500)]
LP#1749475 Protect against missing pubdate in biblio sort
The lack of date1 data in some records was causing this code to crash,
as an attempt was made to read textContent from nothingness. Similar
to the publisher code right above, let's protect against such cases.
Signed-off-by: Dan Wells <dbw2@calvin.edu> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org> Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
This commit provides new functionality for controlling and delivering print
and email bibliographic record export options.
Staff will be able to adjust existing and create new print and email formats
using the Action/Trigger infrastructure and the new Event Definition Group
capability.
Patrons will be able to choose from one of several formats, as configured by
staff, in which to receive one or more bibliographic records. Print and email
preview is made available for individual records via the existing links on the
record detail page, and for lists of records via new entry points on both the
Basket (anonymous list) and My Lists interfaces.
Signed-off-by: Mike Rylander <mrylander@gmail.com> Signed-off-by: Dan Wells <dbw2@calvin.edu> Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org> Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
LP#1778972: (follow-up) restore locale picker to the navbar
Previous patches had moved it to account preferences, and a copy
of the picker will remain there now, but Evergreen should not
require that a user log in or set their browser locale in order
to be able to pick among supported locales.
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org> Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
LP#1778972: make it possible to translate the Bootstrap OPAC
This patch adds src/templates-bootstrap/opac to the i18n system, checks
in an initial POT file for the Bootstrap OPAC, and provides an example
of how to enable locales in the Apache configuration.
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org> Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>