<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ESI Documentation &#187; SL</title>
	<atom:link href="http://nox.esilibrary.com/esi/docs/?author=10&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://nox.esilibrary.com/esi/docs</link>
	<description>ESI Documentation Project</description>
	<lastBuildDate>Tue, 29 Oct 2013 14:21:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Tech Specs, funded by MassLNC, for Evergreen Open Source ILS are available here!</title>
		<link>http://nox.esilibrary.com/esi/docs/?p=841</link>
		<comments>http://nox.esilibrary.com/esi/docs/?p=841#comments</comments>
		<pubDate>Wed, 22 Feb 2012 16:41:30 +0000</pubDate>
		<dc:creator>SL</dc:creator>
				<category><![CDATA[Tech Specs]]></category>
		<category><![CDATA[Evergreen]]></category>
		<category><![CDATA[MassLNC]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[tech specs]]></category>

		<guid isPermaLink="false">http://www.esilibrary.com/esi/docs/?p=841</guid>
		<description><![CDATA[These technical specifications, created by Equinox Software, Inc., for development in the Evergreen Open Source ILS were funded by MassLNC.  The tech specs are the result of an RFP issued by MassLNC in August 2011.  Equinox Software is donating the &#8230; <a href="http://nox.esilibrary.com/esi/docs/?p=841">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>These technical specifications, created by Equinox Software, Inc., for development in the <a title="Evergreen OS ILS" href="http://open-ils.org/" target="_blank">Evergreen Open Source ILS</a> were funded by <a title="MassLNC" href="http://masslnc.cwmars.org/" target="_blank">MassLNC</a>.  The tech specs are the result of an <a title="MassLNC August 2011 RFP" href="http://masslnc.cwmars.org/sites/masslnc.cwmars.org/files/maslnc_development_rfp_Aug_11_final_corrected.pdf" target="_blank">RFP</a> issued by MassLNC in August 2011.  Equinox Software is donating the development of <em>User Activity Additions:  Last Date of Patron Authentication Part II</em> to the Evergreen Community.</p>
<p>Technical Specifications  for MassLNC August 2011 RFP<br />
Created by:  Equinox  Software, Inc.<br />
Date:  11/29/11</p>
<hr />
<p dir="ltr"><span id="more-841"></span>ESI Service 01:  Infrastructure supporting multiple requests</p>
<p dir="ltr">ESI Service 02:  Data flattening service</p>
<p dir="ltr">ESI WIDGET-01:  Dojo-based interface component to present  read-oriented interface for viewing tables of data</p>
<p dir="ltr">SC-A1:  Per-Screen Column Layout (high priority)</p>
<p dir="ltr">SC-B5:  Options for double clicking (high priority)</p>
<p dir="ltr">SC-B8:  Improved navigation of ACQ providers and funds (high  priority)</p>
<p dir="ltr">SC-E3:  Individual screens use its own settings for receipt  templates (high priority)</p>
<p dir="ltr">SC-A5:  Line numbers for display screen (medium priority)</p>
<p dir="ltr">SC-B1:  Customizable toolbar (medium priority)</p>
<p dir="ltr">SC-E1:  Automatic reload (medium priority)</p>
<p dir="ltr">SC-A4 (Circ06 is dependent on):  Multiple-level sorting (low  priority)</p>
<p dir="ltr">SC-B4:  Easy return to search results from MARC record view  (low priority)</p>
<p dir="ltr">SC-C1:  New tab button (low priority)</p>
<p dir="ltr">SC-D3:  Removal of unused fields from copy editor (low  priority)</p>
<p dir="ltr">Acq-02:  Record matching and overlay in Acquisitions (no  assigned priority)</p>
<p dir="ltr">Pac-04:  Flexible scopes (no assigned priority)</p>
<p dir="ltr">Pac-05:  Greater flexibility in library selector display (no  assigned priority)</p>
<p dir="ltr">Sys-07:  Last date of authentication (no assigned priority)</p>
<p style="padding-left: 30px;" dir="ltr">User Activity Additions:  Last Date of Patron Authentication Part II*</p>
<p style="padding-left: 30px;" dir="ltr">(*This development is being donated by Equinox Software, Inc. to the Evergreen OS ILS Community.)</p>
<p dir="ltr">Circ-06 (depends on ESI Widget-01, SC-A1 &amp; SC-A4):   Configurable holds pull list (no assigned priority)</p>
<p>&nbsp;</p>
<h3 dir="ltr">ESI Service 01:  Infrastructure supporting  multiple requests</h3>
<p>This document explores  the changes that we will make to the open-ils.pcrud service to meet the  requirements of ESI-Service-01 as described in our response to the   MassLNC Aug 2011 RFP.</p>
<p>The  open-ils.pcrud service today exists as a public-oriented variant of the  open-ils.cstore service with comparatively limited functionality.   Cstore acts a general purpose data retrieval and modification service,  with advanced features supporting the retrieval of multiple layers of  related objects per request and no access control per se, as it is  intended for use by other trusted Evergreen services.  Pcrud, by  contrast, does not support the retrieval of multiple layers of related  objects, and in fact only allows retrieval of one class of object at a  time, in order that an authorization scheme may be easily enforced.</p>
<p>Many  interfaces in the Evergreen staff client rely on pcrud today to deliver  the data used to populate grid-based interfaces.  Because of pcrud’s  current limitations, any information that must be presented involving  more than a single class of object (for example, a hold plus a targeted  title, volume, and copy, and the requesting user involves five different  classes) necessitates multiple requests to pcrud or other backend  services to retrieve related data, and any efforts to retrieve and  manipulate those objects in tandem require code to specifically written  for the occasion.  The production of such code becomes highly repetitive  over the course of implementing several similar but distinct grid-based  interfaces, but if pcrud is made to support multiple layers of related  objects per retrieval request (fleshing) as cstore does, great amounts  of time to produce similar grid-based interfaces can be saved.</p>
<p>Enabling  fleshing for pcrud is therefore the first change we will make.  This is simple by itself. But the reason why pcrud doesn’t already  support fleshing is that it has not been designed to check for user  authorization to access multiple classes of objects that may be related  at different layers of a retrieval request.  This brings us to the  second requirement of this service.</p>
<p>Extending  authorization testing for pcrud to include fleshed objects  is also necessary.  The pcrud service, let us remember, is publicly  exposed to the Internet (because it is used by the staff client as well  as by the OPAC, among other things), and so it enforces access control.  If it is to be improved to provide access to multiple layers of objects  at a time, it must be also improved to verify authenticated users’  permission to access all of the different classes and instances of  objects that might be yielded in response to a given request.</p>
<p>Finally,  since ESI-Service-01 is also intended to enable the open-ils.pcrud  service to serve as the basis for grid-based interfaces that exchange  large amounts of data (e.g. holds pull lists and holds shelf browsing)  and not just interfaces that let users configure small tables (as it  currently tends to be used), it must also be made to respond to requests  faster.  Therefore retrieved objects should be returned  as soon as they are ready instead of  accumulated as a batch and returned all at once.  The underlying OpenSRF  layer supports this kind of streaming operation, and pcrud simply needs  adjustments to take advantage of it.</p>
<h3 dir="ltr">ESI Service 02:  Data flattening service</h3>
<p>Evergreen  supplies a broad API for accessing, processing and interacting with  library data.  Because of the relatively complex nature of the  underlying database schema, and the flexibility required by clients  when, in the simplest case, performing CRUD operations, focus has been  given to providing a nearly direct view of various data source.  When,  however, the verbosity or complexity of full object access gets in the  way of performant or straight-forward UIs, there has been a tendency to  create one-off data simplification calls targetting specific use cases.</p>
<p>A  generalized API which accepts a simplified query structure and field  mapping, calculates the required backend query, and flattens the  hierarchical data returned for each top level row into a would  facilitate the simplification of existing UIs and provide for new UIs  based on simple, reusable components.</p>
<p>Overview</p>
<p>The  existing, public open-ils.fielder server will be extended with two new  OpenSRF methods, contained in a separate package so that they will be  reusable in a private service which does not require authentication.</p>
<p>These  methods will be supported by code which takes simplifed cstore/pcrud  search and order-by hashes and computes the full data structure required  for the query.  The simplification will leverage the IDL to discover  links between classes.</p>
<p>Underlying  the simplified search grammar will be a path-field mapping structure.   This will describe the layout of fields, how they are to collapse from  fleshed objects, and how the shape of both the query and result data  structures should be interpreted by and presented to the caller.</p>
<p>Mapping  Structure<br />
Implemented as a JSON object, each property  name will represent a data element that can be displayed, filtered or  sorted, and each property value will represent either a simple path (in  which case it is usable for display, filtering or sorting), or an object  providing the path and available uses.</p>
<p>Example  Map<br />
Assuming a core class of circ:</p>
<pre>{ "patron_barcode": "usr.card.barcode",
  "circ_lib_name":  "circ_lib.name",
  "circ_lib":       "circ_lib.shortname",
  "id":             "id",
  "xact_start":     { "path": "xact_start",  "sort": true, "display": true },
  "checkin_time":   { "path": "checkin_time",  "filter": true, "sort": true }
}</pre>
<p>Based  on this mapping structure simplified queries can be constructed by the  caller, which will then be expanded in the flattening service to produce  join and where  clauses that can be used by open-ils.pcrud.</p>
<p>Example  Query<br />
Assuming the above example map:</p>
<pre dir="ltr">{ “xact_start”: { “&gt;”: “today” }, "circ_lib”: “BR1” }</pre>
<p>This  example would expand to a PCrud query based on the map provided above,  containing not only the complex where  clause, but a join tree and the  necessary fleshing structure.</p>
<p>Expanded  PCrud Query</p>
<pre>{ “xact_start”: {“&gt;”: “today”},
  “+circ_lib_aou”: {“name”: “BR1”}
},  {
  “join”:    {
    “aou”:     {
      “alias”: “circ_lib_aou”,
      “fkey”: “circ_lib”
    },
    “au”: {
      “alias”: “usr_au”,
      “fkey”: ”usr”,
      “join”: {
        “ac”: {
          “alias”: “usr_card_ac”,
          “fkey”: “card”
        }
      }
    }
  },
  “flesh_fields”: {
    “circ” : [“circ_lib”,”usr”],
    “aou” : [“card”]
  },
  “flesh”: 2
}</pre>
<p>API</p>
<p>OpenSRF  Method name: open-ils.fielder.pcrud.search<br />
Parameters:</p>
<ul>
<li>Authentication token</li>
<li>IDL class</li>
</ul>
<p dir="ltr">“circ”</p>
<ul>
<li>Path  map hash</li>
</ul>
<p dir="ltr">{“patron_barcode”:“usr.card.barcode”,“circ_lib_name”:”circ_lib.name”,</p>
<p dir="ltr">“circ_lib”:”circ_lib.shortname”,”xact_start”:{ “path”:  “xact_start”, “sort”: true, “display”:  true},“id”:”id”,“checkin_time”:    { “path”: “checkin_time”, “filter”:  true, “sort”: true }}</p>
<ul>
<li>Simplified  query hash</li>
</ul>
<p dir="ltr">{“xact_start”: { “&gt;”: “today” }, “circ_lib”: “BR1”}</p>
<ul>
<li>Simplified sort/limit/offset hash
<ul>
<li>{  “sort”:[{“checkin_time”:”desc”,”circ_lib”:”asc”}],”limit”:10}</li>
</ul>
</li>
<li>Returns: stream (or array, for  .atomic) of hashes having the shape described in the path map</li>
</ul>
<p dir="ltr">{“patron_barcode”:“3123456789012”,“circ_lib_name”:”Branch 1”,</p>
<p dir="ltr">“circ_lib”:”BR1”,”xact_start”:”2011-10-17T12:00:00-05:00,“id”:”123”}</p>
<h3 dir="ltr">ESI WIDGET-01:  Dojo-based interface  component to present read-oriented interface for viewing tables of data</h3>
<p>To  take advantage of ESI Services 01 and 02 (pcrud fleshing and data<br />
flatenning), we need UI components.</p>
<p>This describes how  we&#8217;ll get from the output of the data flattening service<br />
to interfaces we can use.</p>
<p>The data flattening  service proposed API suggests a method that takes the path<br />
map hash, the simplified query hash, and the  simplified sort/limit/offset hash<br />
as  arguments, returning a stream or a list of result rows.</p>
<p>0) The data flattening  service should get a secondary API method that takes only<br />
the path map hash as an argument, and returns a  cache key.  The cache key should<br />
be usable in  place of the path map hash argument to the first API method described.   This saves repetition of a potentially large object in the scenario<br />
described next.</p>
<p>1)  A mod_perl service should be constructed to offer the following  RESTfully:<br />
given a key to a cached path map  hash, a query object, and and a<br />
sort/limit/offest object (all in url parameterized form), offer search  results<br />
in the form of a JSON object oriented  for consumption by Dojo&#8217;s<br />
ItemFileReadStore.   Such a service would make read-only grids almost trivial<br />
to implement using Dojo&#8217;s DataGrid.  Thise  service may also offer other output formats.  Other formats may include  JSONP, XML, CSV, Display HTML (full page, including query description  and embedded data), Print HTML (self-printing on page load, with  print-media CSS), HTML subset (simple HTML table) and PDF.</p>
<p>2) Once the above  mod_perl service is complete, we can subclass Dojo&#8217;s<br />
DataGrid and potentially borrow some elements  from our existing AutoGrid<br />
widget.   Specifically, we can provide row editing dialogs if we limit<br />
the fields that can be edited to those directly  on the &#8220;core&#8221; class in our<br />
search query.</p>
<p dir="ltr">* We can also connect DataGrid features supporting sorting on  multiple columns to changes in the URL used for the grid’s store,  giving us more low-cost-to-implement functionality.</p>
<p>&nbsp;</p>
<h3 dir="ltr">SC-A1:  Per-Screen Column Layout (high  priority)</h3>
<p>The goal is for  Evergreen to support applying and saving distinct sets of columns for  any individual screen using the column picker. In particular, distinct  settings should be used for the holds view in the patron holds screen,  the title holds screen, the browse holds shelf screen, and the pull list  for holds request screen.</p>
<p>AutoGrid-based  interfaces already potentially support this, and can just have  attributes set to do it.</p>
<p>For  XUL-based interfaces, any interfaces outside of those mentioned  explicitly in the requirements (all relating to holds) should already  support the desired functionality.</p>
<p>For  those interfaces related to holds, the issue is that those interfaces  are really a single interface with different “modes.”  The change  required to save column layout individually per “mode” is for the  interface Javascript to alter the id  attribute of the table widget (actually called a tree  by XUL) to give it a specific ID per “mode.”  This id will  then be passed to the save_columns() method in the  util.list class, which is already prepared to save  column layouts separately by ID.</p>
<h3 dir="ltr">SC-B5:  Options for double clicking (high  priority)</h3>
<p>For XUL lists, we will  add the ability to handle an on_dblclick key and callback to the object  we pass into util.list.init, as a peer to the existing on_select.  A  function thus defined will work in the same manner as on_select, and is  responsible for calling util.list.retrieve_selection(); if needed and  working on the rows thus selected.  Double-clicking a row effectively  selects it, though it’s also possible for a double-click to work on a  multi-selection.  So on_dblclick could rely on on_select for gathering  the row data to affect, at least with current xulrunners, though it may  be more robust to call retrieve_selection() a second time.</p>
<p>Once  this is implemented, we will use this infrastructure to enhance two  interfaces and augment their respective lists with double-click  behavior:</p>
<ul>
<li>Patron  Search</li>
</ul>
<p dir="ltr">The file  display.js embeds search_result.js, and passes through an on_select when  the search interface is loaded.  We will pass through an on_dblclick as  a peer to on_select and modify search_result.js to make use of it.  The  function passed through on_dblclick will simply fire off a virtual  command event using util.widgets.dispatch for “cmd_patron_retrieve”,  triggering the existing behavior for retrieving selected patrons.</p>
<ul>
<li>Holdings Maintenance</li>
</ul>
<p dir="ltr">In copy_browser.js, we will pass an on_dblclick handler as a  peer to on_select with util.list.init.  It will rely on on_select having  fired and gathering the pertinent row data, and it will use  util.widgets.dispatch to fire off a virtual command event,  “cmd_edit_items”, to leverage the behavior for the existing Edit Items  action.</p>
<h3 dir="ltr">SC-B8:  Improved navigation of ACQ providers  and funds (high priority)</h3>
<p>Navigating  through provider and fund lists in ACQ can be unwieldy, because it may  require the user to page through many pages of data before the user  finds the data he is searching for.  Two changes are proposed to make it  easier to navigate through large data set.</p>
<ol>
<li>Only retrieve funds and providers the user  has permission to use/view.  This will reduce the overall number of  pages of data that may need to be scanned.
<ul>
<li>On the provider, fund, and funding_source  administration interfaces, the main display grids will be replaced (or  augmented) by grids that are capable of taking advantage of the new  PCrud flattening service for improved permission handling and to speed  up the display.  See requirement SC-A4.</li>
</ul>
</li>
<li>Allow for filtering on fields in the grid.   This will create additional opportunities for limiting the total number  of values returned.</li>
</ol>
<ul>
<li>On the provider, fund, and funding_source  interface, plug in the improved PCrudFilterDialog to, which will allow users to select multiple filter fields and apply filter values.  PCrudFilterDialog will require the addition of operator selection.</li>
</ul>
<h3>SC-E3:  Individual  screens use its own settings for receipt templates (high priority)</h3>
<p>There  are several XUL-based holds list that are all implemented with the same  holds.js file:</p>
<ul>
<li> Actions for this Record -&gt; View Holds</li>
</ul>
<ul>
<li> Patron Display -&gt; Holds</li>
</ul>
<ul>
<li> Circulation -&gt; Browse Hold Shelf</li>
</ul>
<ul>
<li> Circulation-&gt;Pull List for Hold Requests</li>
</ul>
<ul>
<li> Admin-&gt;For Developers-&gt;Browse Unfilled Holds for this Pickup Lib</li>
</ul>
<p>The  main Print action (from the “Print” button next to the List Actions  menu) uses the same template, “holds”, for all incarnations of the  interface.  We will change this behavior in holds.js (specifically in  the cmd_holds_print method) such that each interface variation will use  its own template.  The new templates will be:</p>
<ul>
<li> holds_on_bib</li>
</ul>
<ul>
<li>holds_for_patron</li>
</ul>
<ul>
<li>holds_shelf</li>
</ul>
<ul>
<li>holds_pull_list</li>
</ul>
<ul>
<li>holds_unfulfilled</li>
</ul>
<p>We  will keep the “holds” template for backwards compatibility and as a  fallback for when these new templates have not yet been configured.   These new templates will be stubbed in data.js (in the  print_list_defaults method) so that they will appear in the Receipt  Template Editor, but by default they will not have any defined content  for their headers, footers, and line items.  Instead, we will use a new  field called “inherit”, and have each new template use “holds”  (referring to the original template) as the value for their inherit  fields.<br />
So, for example, the  current default ‘holds’ template is defined like this:<br />
&#8216;holds&#8217;  : {<br />
&#8216;type&#8217; : &#8216;holds&#8217;,<br />
&#8216;header&#8217; : &#8216;Welcome to %LIBRARY%!&lt;br/&gt;\r\nYou have the  following titles on hold:&lt;hr/&gt;&lt;ol&gt;&#8217;,<br />
&#8216;line_item&#8217; : &#8216;&lt;li&gt;%title%\r\n&#8217;,<br />
&#8216;footer&#8217; : &#8216;&lt;/ol&gt;&lt;hr /&gt;%SHORTNAME%  %TODAY_TRIM%&lt;br/&gt;\r\nYou were helped by  %STAFF_FIRSTNAME%&lt;br/&gt;\r\n&lt;br/&gt;\r\n&#8217;<br />
},<br />
The  new ‘holds_for_patron’ template will be defined as a peer like this:<br />
&#8216;holds_for_patron&#8217;  : {<br />
&#8216;type&#8217; : &#8216;holds&#8217;,<br />
&#8216;inherit&#8217; : &#8216;holds&#8217;<br />
},<br />
We  will modify the _print_tree method in list.js and the post_init method  in print_list_template_editor.js such that they will react to any value  in a template’s inherit field and allow it to redirect them to use the  contents of the inherited template.  For this particular use-case, we  only need to support one level of indirection, but we may opt to support  chains of inheritance for future use.</p>
<p>We  will modify the save_template method in print_list_template_editor.js  so that the inherit field for a given template will be cleared if that  specific template is saved, breaking the link and associating the  displayed (and possibly edited) header, footer, and line item with the  template.</p>
<h3 dir="ltr">SC-A5:  Line numbers for display screen  (medium priority)</h3>
<p>Evergreen list  interfaces currently do not supply a row-number column, which would be  useful for scanning a long list without losing ones place.</p>
<p>There are two main classes of lists with  column pickers.  “XUL” lists are used in interfaces that have a gray  background, with an icon in the upper right of the list after the last  column for invoking the column picker.  “Auto-Grid” lists are used in  interfaces that have a white background, and the ones with column  pickers typically have a labelled button near the list for invoking the  column picker.</p>
<ul>
<li> XUL lists</li>
</ul>
<p style="padding-left: 90px;">o A given XUL list is fed a list of column definitions.  We will provide a column definition to each list for “Line Number” (the actual label we can tweak.  Perhaps “#”, “Line”, or “LineNo”).  Normally, these would work like any other column, and may be sorted, hidden, resized, and repositioned.  We’ll take care to disallow sorting.<br />
o We will make the util.list class automatically generate these columns, and thus the column definition will not need to be fed explicitly through the columns parameter during list.init.  Since the column will be defined from within util.list, it will have access to util.list internals, and for a given row we could, for example, iterate and count through all of obj.treechildren.childNodes and compare against params.my_node to determine our ordinal positioning and render that as the value for that cell.  This is a simplistic algorithm, and we may come up with a better alternative.<br />
o We will modify the click handler for column headers to ignore the Line Number column based on an attribute within the column definition.<br />
o Optional: We can give the cells for this column a CSS addressable property, so that we may style them differently than the rest of the list (to, for example, make them look less like data and more like UI).</p>
<p style="padding-left: 60px;">* Auto-Grid lists</p>
<p style="padding-left: 90px;">o Add a new virtual column to AutoGrid for “Line Number” (though perhaps with an icon instead of the space-gobbling text), next to the virtual checkboxes/selector column.  The new field’s get() function will simply return the row number (already available) for display.</p>
<p style="padding-left: 60px;">* PCrudFlattener-Aware-Grid (ESI-WIDGET-01)</p>
<p style="padding-left: 90px;">o Process will be the same as Auto-Grid (or directly inherited).</p>
<h3 dir="ltr">SC-B1:   Customizable toolbar (medium priority)</h3>
<p>There  are currently two toolbars for the Evergreen staff client, one geared  for Circulation staff and one for Catalogers.  One or the other may be  set as the default for a given workstation, and the actual buttons on  the toolbars are hard-coded in a XUL file.</p>
<p>We  will re-implement these with a single XUL toolbar element, where the  actual buttons in use are cloned from a common pool of toolbarbuttons  hidden in a non-rendered XUL element.  The order and set of buttons (and  any separators or spacers) thus cloned is data-driven, depending on the  selections made in the Admin -&gt; Workstation Administration -&gt;  Toolbars menu.</p>
<p>Actual layout data  will be whitespace separated ordered lists of identifiers corresponding  with the values stored in “picker_id” attributes on the available set of  toolbarbuttons (and spacers and separators).</p>
<p>We  will add the following toolbarbuttons to the existing set:</p>
<p style="padding-left: 30px;" dir="ltr">Home (return to portal page)</p>
<p style="padding-left: 30px;" dir="ltr">Copy  buckets</p>
<p style="padding-left: 30px;" dir="ltr">Record buckets</p>
<p style="padding-left: 30px;" dir="ltr">Renew  items</p>
<p style="padding-left: 30px;" dir="ltr">Pull list for holds requests</p>
<p style="padding-left: 30px;" dir="ltr">Browse holds shelf</p>
<p style="padding-left: 30px;" dir="ltr">Retrieve last  patron</p>
<p style="padding-left: 30px;" dir="ltr">Acquisitions search</p>
<p style="padding-left: 30px;" dir="ltr">Acquisitions  My Selection Lists</p>
<p style="padding-left: 30px;" dir="ltr">Acquisitions New Brief  Record</p>
<p style="padding-left: 30px;" dir="ltr">Acquisitions Patron Requests</p>
<p style="padding-left: 30px;" dir="ltr">Acquisitions MARC Federated Search</p>
<p style="padding-left: 30px;" dir="ltr">Acquisitions  Load MARC Order Records</p>
<p style="padding-left: 30px;" dir="ltr">Acquisitions  Create Purchase Order</p>
<p style="padding-left: 30px;" dir="ltr">Acquisitions Claim  Ready Items</p>
<p style="padding-left: 30px;" dir="ltr">Acquisitions Create Invoice</p>
<p style="padding-left: 30px;" dir="ltr">Booking Create Reservations</p>
<p style="padding-left: 30px;" dir="ltr">Booking  Pull List</p>
<p style="padding-left: 30px;" dir="ltr">Booking Capture Resources</p>
<p style="padding-left: 30px;" dir="ltr">Booking Pick Up Reservations</p>
<p style="padding-left: 30px;" dir="ltr">Booking  Return Reservations</p>
<p>We  will make the list of available toolbars configurable.  A given toolbar  will have a name and an implementation (specifying how/where to get the  layout data).</p>
<p>For example, we could  do such things as the following:</p>
<p>Circ  toolbar -&gt; preference: oils.toolbar.circ.layout<br />
Cat  toolbar -&gt; file:<a href="http://hostname/xul/oils.cat_toolbar.layout"> http://hostname/xul/server/skin/toolbars/oils.toolbar.cat.layout</a><br />
Acquisitions  toolbar -&gt; org unit setting: ui.toolbar.acq.layout<br />
Serials  toolbar -&gt; file:  chrome://open_ils_staff_client/skin/toolbars/serials.layout<br />
User  toolbar -&gt; user setting: ui.toolbar.user.layout</p>
<p>Considering  the chrome:// example we see with the Serials toolbar above, we could  iterate through a toolbars directory much like we do for hotkeys and  .keyset files, and inform the staff client of one set of available  toolbars in that manner, with toolbar names being derived from the  corresponding filenames.</p>
<p>The  list of available toolbars could be augmented by other mechanisms, such  as JSON data structures coming from mozilla preferences, org and/or  user settings, and from the global OpenILS.data datastore (which could  be modified, along with preferences, for example, by  server/skin/custom.js)</p>
<p>We  will re-implement the existing Circ and Cat toolbars as .layout files  in the chrome skin directory, and will hard-code a user setting for a  User toolbar and an org unit setting for a Library toolbar.  And  Workstation toolbar powered by a preference.  That should cover our  bases.</p>
<p>For preference and  user setting and org unit setting powered toolbars that get included in  this list of available toolbars (such as the User, Library, and  Workstation toolbars proposed above), we will provide a dedicated  interface for manipulating the layout data, under Admin -&gt;  Workstation Administration -&gt; Toolbars -&gt; Edit Layout.  This  interface will consist of a drop-down menu containing the list of  available toolbars/settings to manipulate, and two lists, one containing  identifiers or labels for the buttons “in use”, and the other for the  buttons “available”.  Labels may be provided by “picker_label”  attributes on the actual toolbarbuttons, and we can default to the  normal label attribute in the absence of picker_label.</p>
<p>If  one or more rows are selected in the Available list, a button with an  arrow pointing to the In Use list may be pressed to either move or copy  the rows to the In Use list (I’m leaning toward Move except for  Separators and Spacers).  Similarly, there will be a button for moving  rows back to the Available list (and for removing Separators and Spacers  from the In Use list).  For the In Use list, there will be Up/Down  buttons for re-ordering a selected row in the list.</p>
<p>When  this interface is active, the toolbar being edited will temporarily be  made the active toolbar (if not already active), so that changes made to  the toolbar can be previewed in real-time.</p>
<p>A  Save button will make the change permanent, and will be subject to  normal permission handling for org unit and user settings, and in the  case of the Workstation toolbar powered by a preference, maybe no  specific permission for the time being (if you’re logged in and using  the workstation, have at it).</p>
<h3 dir="ltr">SC-E1:  Automatic reload (medium priority)</h3>
<p>In  some instances, when data is changed within the Evergreen staff client,  the new data is not reflected in the interface.  The following  interfaces should be modified to support real-time display of updated  data.</p>
<p>Catalog bib record display: reload detail page after items added, issues received.</p>
<ul>
<li>Create a function in the OPAC wrapper that can reload the detail page (or any OPAC page).</li>
<li>Expose  said function via xulG to child interfaces (particularly Holdings  Maintenance, Bib Brief Summary, and the Serials interface)</li>
<li>Modify said interfaces to call the function as appropriate when the OPAC needs to be reloaded.</li>
</ul>
<p>Checkout: update checkout count as checkouts occur; update items-out list in real time.</p>
<ul>
<li>There  is deprecated code which attempted to do this, so this will be revived  and improved.  In particular, we should rename the callback  “on_list_change_old” that gets shoved into the Checkout Interface via  xulG, and make sure that it gets called as a peer to the current  “on_list_change” (which handles updating the summary).</li>
<li>“on_list_change_old”  attempts to feed the id for the circ just handled to the Items Out  list, where that list’s own retrieve_item function will handle the  fleshing (redundantly, in this case).
<ul>
<li>we can reduce redundancy and bring parity to the shape of the data between the checkout list and items out list</li>
<li>the  function currently only works if the Items Out interface has already  been open.  This is probably okay, since when the Items Out interface is  actually opened for the first time, it fetches all the circs.</li>
</ul>
</li>
<li>There  are more summary points that “on_list_change” may need to update, so we  need to extend that function and verify that it’s working generally.</li>
</ul>
<p>Import Records: Update import selector widgets to reflect new entries</p>
<ul>
<li>Any  time a user returns to the main import screen (“Import Records”) or the  “Inspect Queue” tab, ensure that the screen is freshly loaded.  We’ll  do this by making the “Import Records” and “Inspect Queue” tab actions  be links instead of the div-swapping actions currently in place.  The  remaining Vandelay displays are Grid-based and should be updated  automatically as new data is added.</li>
</ul>
<p>Purchase Order: Allow activation after entering prices w/o manual reload</p>
<ul>
<li>After  a price is entered for a lineitem, if all other lineitems in the list  also have prices, automatically recalculate whether the PO can be  activated with the new price data and update the Activatable action in  the display accordingly.  This re-calculation will be performed in  “authoritative” mode.</li>
</ul>
<h3 dir="ltr">SC-A4 (Circ06 is dependent on):   Multiple-level sorting (low priority)</h3>
<p>MassLNC’s  requirement: “Any interface using column pickers can be sorted by  multiple columns.”</p>
<p>In any XUL based  interface, each column header should get a context menu with two  entries.  The first should be “sort by this column (first)” while the  second should be “sort by this coulmn next.”  The second entry should be  greyed out until the something is already selected for “first” sorting  (whether through the context menu entry or through the usual single left  click).  The effect of “sort by this column next” should be cumulative,  so that a user can keep adding columns by which to sort.  Control+click  should be a shortcut for “sort by this column next”.</p>
<p>Where  existing AutoGrid-based interfaces don’t otherwise need the new pcrud  flesh and flatten features, AutoGrid can simply be improved to sort on  multiple columns, making a call to the server with an adjusted order_by  clause in a similar way to how it currently implements paging.  The user  will select columns for sorting via either context menus in a fashion  analogous to that described for XUL-based interfaces, or via a menu  accessed by hyperlinks, whichever is more readily integrated with the  existing fundamental widgets at implementation time.</p>
<p>New  grid interfaces based ESI Widget 01 will be using a service that  inherently supports sorting by any number of columns, and the column  selection interface will be made in a way that’s consistent with that  described above for XUL-based and AutoGrid interfaces.</p>
<h3 dir="ltr">SC-B4:  Easy return to search results from  MARC record view (low priority)</h3>
<p>We  need to add a “back to search results” button in the part of the staff  client’s chrome that currently displays the start, previous, next and  end buttons, to be displayed when the user is in lower-pane displays  other than the OPAC View.</p>
<p>By  adding a new “event” in the old runEvt/attachEvt system to be run from  the search results page, and to be “caught” in opac.js, we can keep our  notion of the most recently viewed search results page up to date, and  we can offer a button for “Back to search results” in the desired  situations.  The same “event” system is used to prepare the  start/previous/next/end buttons already.</p>
<p>The  rest of the time we keep that button hidden, as at least in the OPAC  view, it’s redundant with an in-browser link.</p>
<p>The  TPac detects when the referer to a results page is the same record  detail page that it wants to redirect (on 1 hit) to and skips the  automatic redirect.  Because of this, adding the ‘back to search  results’ button on a single-hit-redirect record page will simply take  the user to the results page for that one record, and doesn’t have to be  treated as special.</p>
<h3 dir="ltr">SC-C1:  New tab button (low priority)</h3>
<p>Currently  in Evergreen one can open a new tab through a hot-key or File menu  option.  However, in addition to these, there is a dedicated close-tab  button on the tab bar for closing tabs.</p>
<p>In  menu_frame_overlay.xul, we will create a &lt;toolbarbutton  command=”cmd_new_tab”&gt; as a peer to the one for closing tabs.   Experimentation will be required to find a working icon for the button  and a useful and aesthetic location for it.  Current versions of Firefox  have a single newtab button flush against the last tab, and one  closetab button per tab.  Our current staff client has a single closetab  button to the far right of the tab bar.  We would place the  &lt;toolbarbutton&gt; to the left of the &lt;arrowscrollbox&gt; and have  the button be the first thing on the tab bar to the far left, but that  wouldn’t match the scheme of any major browser using tabs.</p>
<h3 dir="ltr">SC-D3:  Removal of unused fields from copy  editor (low priority)</h3>
<p>Currently  in Evergreen there is no generalized infrastructure for customized  hiding of interface elements.  Several interfaces do implement  independent, one-off versions of this, such as the user registration  interface.  We will leverage the general pattern of Org Unit settings to  inform general infrastructure about what should be hidden based on  local policy.</p>
<p>We will create a JSAN  util/hide.js function library in the vein of widgets.js.  It will  contain the following functions:</p>
<ul id="internal-source-marker_0.41002919403711335">
<li>util.hide.generate_dialog</li>
<li>util.hide.generate_css</li>
</ul>
<p>Both  functions will take two arguments, the database name for an org unit  setting, and an org id for the context org.  If an org id is not  specified, we will default to the workstation library.</p>
<p>generate_dialog  will create a node list from the window where it is invoked, gathering  all nodes that have an attribute of “hideable”.  It will remember the  values of the hideable attribute and link them to the value of any  “label” attribute.  Only one label will be associated with a given  hideable value.  The function will then pop open a modal dialog window  containing a list of checkboxes for each hideable value, and using the  remembered label to show to the user.  There will also be a Save button  and a Cancel button.  If Save is pressed, then all the checked holdeable  values will be saved to the specified org unit setting as a space  delimited string of values, the dialog will close, and generate_css will  be invoked.  Cancel will close the dialog and do nothing else.</p>
<p>generate_css  will read the values from the specified org unit setting, and will then  manipulate CSS to hide any nodes containing hideable attributes on the  page where it is invoked that contain the values from the org unit  setting.  We will investigate having the function inject actual CSS into  the page, but as a fallback strategy we can have the function append  CSS classnames derived from the holdeable values onto the  document.documentElement, in the same vein as  patron.util.set_penalty_css.  We will then rely on stock CSS to hide the  elements based on the presence of the documentElement CSS classnames  and the holdeable attribute values.</p>
<p>For  example, let’s say that the &lt;groupbox&gt; in the Item Attribute  Editor for “Deposit” has a hideable attribute with the value “Deposit”,  and the &lt;caption&gt; element for that groupbox also has the same  hideable attribute.  Then generate_dialog will find the “Deposit” value,  and associate with the label attribute from the &lt;caption&gt; (since  the &lt;groupbox&gt; won’t have a label), and present a dialog with a  checkbox for the “Deposit” value, but with a label matching the caption  label (which in this case, also happens to be “Deposit”).</p>
<p>If  the user selects this checkbox and Saves, then generate_css could  append a CSS classname to the document.documentElement called  “Hide_Deposit”.  Assuming we can’t figure out a good way to do dynamic  inline CSS, then we can rely on the server/skin/cat.css file containing a  line like this:</p>
<p>.Hide_Deposit  [hideable^=Deposit] { display: none; }</p>
<p>This  will hide the entire groupbox for Deposit if all the conditions are  met.  If we’re able to do live injection of CSS, we could simply inject  something like:</p>
<p>[hideable^=Deposit] {  display: none; }</p>
<p>We also need to ensure  that the generate_css function will clear out any previous Hide_  classnames (or injected CSS) that were made prior to the latest  invocation of generate_dialog.  For classnames, we can do this by  looping through and pruning the classnames on document.documentElement.</p>
<p>Given  this infrastructure (which we could re-use in the future with other  interfaces), we can then do the following for the Item Attribute Editor:</p>
<ul id="internal-source-marker_0.41002919403711335">
<li>Create an org unit setting for ui.hide_copy_editor_fields with a datatype of string</li>
</ul>
<ul>
<li>Modify  the g.render function in copy_editor.js such that we apply hideable  attributes to the dynamically generated groupbox and caption elements,  using the same label we feed to the caption as the hideable value.  Very  technical note: this is using an existing bad design decision in the  item editor, where we’re using localized values as identifiers within  the editor itself.  This means our setting (like item templates) will be  locale dependent, and if a user switches locale (say, from en-US to  en-CA), the fields will be identified with different names, and any  settings we’ve configured will not work unless the labels happen to  coincidentally match.  If we have time, we can refactor the Item Editor  to use hard-coded id’s that are independent of locale (we’d likely use  the actual property names we’re using to key our localizations).  Our  org unit setting will then also use these id’s for designating which  fields to hide.  A disadvantage here is that the org setting becomes  difficult to use outside of generate_dialog, if staff try to configure  it through Admin -&gt; Local Administration -&gt; Library Settings.  It  may be worth adding functionality to hide org settings from that  interface if they have their own dedicated interfaces.  Backwards  compatibility with existing item attribute templates would also be a  complicating factor with fixing the design.</li>
<li>Modify  the my_init function in copy_editor.js to invoke generate_css with the  ui.hjide_copy_editor_fields setting prior to any fields being rendered.   This will minimize screen flicker.</li>
<li>Modify  copy_editor_overlay.xul and copy_editor.js to add a “Column Picker”  button to the interface.  Clicking this button will invoke the  generate_dialog function with the ui.hide_copy_editor_fields setting.</li>
<li>Assuming  we use the document.documentElement/classname strategy, modify cat.css  and add entries for every hideable field like the .Hide_Deposit example  given earlier.</li>
</ul>
<h3 dir="ltr">Acq-02:   Record matching and overlay in Acquisitions (no assigned priority)</h3>
<p>The Evergreen  acquisitions infrastructure provides no automated method for matching  incoming acquisitions records to existing catalog records.  Unless done  manually, records in the ACQ system will not be “linked” to existing  catalog records.   During the order phase, where records are typically  loaded into the system, the system only allows record import of  un-linked records by creating new catalog record, potentially resulting  in (multiple) duplicate catalog records or import failures due to  non-override-able import collisions.</p>
<p>A  preferred work flow is one that allows Evergreen to automatically match  ACQ records to existing catalog records with flexible control over  which MARC fields to consider for matching and field weighting.  These  are problems Evergreen’s Vandelay batch MARC import/export system was  designed to solve.  The goal, then, is to leverage the full power of  Vandelay seamlessly within acquisitions to support automated record  matching and record merge/overlay.</p>
<p>ACQ  User Interface Changes</p>
<ul id="internal-source-marker_0.41002919403711335">
<li>Interfaces  that support “loading bibs and items” (i.e. creating catalog records)  will now give the user the ability to select additional Vandelay import  options.  These interfaces include the general lineitem list page  (selection lists, purchase orders, including implicit loading via PO  activation) and the vendor order record import interface.  New Vandelay  options will include:
<ul>
<li>Record Match Set</li>
<li>Merge Profile</li>
<li>Import Non-Matching Records</li>
<li>Merge On Exact Match (901c)</li>
<li>Merge On Single Match</li>
<li>Merge On Best Match</li>
<li>Best/Single Match Minimum Quality Ratio</li>
<li>Insufficient Quality Fall-Through Profile</li>
<li>Recaculate Best Match option (for lineitems that have already been manually linked)</li>
</ul>
</li>
<li>The  generic Lineitem list page page will provide links to view the Vandelay  queue responsible for importing each lineitem, allowing staff to  resolve merge/overlay conflicts directly from within the Vandelay  interface.</li>
<li>Within  the Vandelay queue grid interface, it will be clearly marked when a  user is viewing an ACQ queue vs a regular bib or authority import queue.</li>
</ul>
<p>ACQ/Vandelay  API changes</p>
<ul id="internal-source-marker_0.41002919403711335">
<li>During  record import, when any Vandelay options are chosen, all incoming  records will be passed off to Vandelay for queue creation and record  match detection.</li>
<li>For  each queued bib record created within Vandelay, a link is made from the  ACQ lineitem to the queued bib record resonsible for its import.</li>
<li>Within  Vandelay, any time a record from an ACQ queue is successfully imported,  it will update the ACQ lineitem to point to the matched record  (acq.lineitem.eg_bib_id).  Note, we want Vandelay to be responsible for  updating the lineitem to support the case where ACQ Vandelay records are  imported directly from within Vandelay.</li>
<li>In  Vandelay, if a lineitem is already linked to a bib record, use the  linked bib record as the merge/overlay target instead of searching for  the best match, unless the user selects the “recalculate best match”  option during import.</li>
</ul>
<p>DB</p>
<ul id="internal-source-marker_0.41002919403711335">
<li>Create a new vandelay.queue.queue_type option for “ACQ” to differentiate between regular bib imports and ACQ bib imports.</li>
<li>acq.lineitem gets a new column which points to the vandelay.queued_bib_record responsible for its import</li>
</ul>
<h3 dir="ltr">Pac-04:  Flexible scopes (no assigned  priority)</h3>
<p>Currently in  Evergreen, one can limit search to one or more shelving locations via  the advanced search interface if one is searching at an org type where  can_have_vols is true.</p>
<p>The  desired, new functionality would present a pre-defined group of  shelving locations as a single entity in the library hierarchy, under  the owning library.</p>
<p>Overview<br />
To  facilitate this functionality, Evergreen will gain the ability to track  and use shelving location groups.  Each group would have a  owner-distinct, translatable label and a visibility flag denoting  whether it should be included in generated search range selection  interfaces available within the OPAC, and a primary ordering column for  sorting within a set of owned groups.  Sort will fall back on the  display label of the groups.</p>
<p>QueryParser  will gain a new filter, called location_groups(), which will accept a  list of identifiers for these shelving location groups.  This will be  used to gather the distinct set of shelving locations provided to the  search stored procedure.</p>
<p>The  TPAC will append the sorted groups owned by an org unit indented under  it in a tree or dropdown, as appropriate, after any child org units.</p>
<p>The availability of copy locations when building a location  group will be based on the context OU full path.</p>
<p>DB  Sketch<br />
CREATE TABLE  asset.copy_location_group (<br />
id    SERIAL      PRIMARY KEY,<br />
name    TEXT        NOT NULL, &#8212; i18n<br />
owner    INT        NOT NULL REFERENCES actor.org_unit (id),<br />
pos    INT        NOT NULL DEFAULT 0,<br />
opac_visible    BOOL    NOT NULL DEFAULT TRUE,<br />
CONSTRAINT lgroup_once_per_owner UNIQUE (owner,name)<br />
);</p>
<p>CREATE  TABLE asset.copy_location_group_map (<br />
id          SERIAL    PRIMARY KEY,<br />
location    INT         NOT NULL REFERENCES asset.copy_location (id),<br />
lgroup        INT        NOT NULL REFERENCES  asset.copy_location_group (id),<br />
CONSTRAINT     lgroup_once_per_group UNIQUE (lgroup,location)<br />
);</p>
<p>TPAC:  Template code and mod_perl handler code</p>
<p>opac/parts/org_selector.tt2  implements the selector widget for org units as it’s used today, and  will be extended to take advantage of the model described above.</p>
<p>Since  that widget is used in contexts other than search, it will need to  retain a “mode” where it works as it does now (showing only org units,  and not copy location groups), but also grow a new mode where it shows  both org units and the copy location groups that belong to them.</p>
<p>In  the new “mode” the widget should use a distinct CGI parameter (rather  than “loc,” used throughout TPAC to specify an org unit exactly) which  we’ll call “loc_or_lgroup” here until an appropriate name is determined.</p>
<p>The  value of “loc_or_lgroup” should be either an integer or two integers  delimited by a colon (or some other fixed punctuation).  The first  integer refers to the org unit. The second, if present, refers to a copy  location group.  Although knowing the id of the latter technically is  enough information to find out the owning org_unit, it should be less  disruptive to existing TPAC code if we still have the org unit id  readily available.</p>
<h3 dir="ltr">Pac-05:  Greater flexibility in library  selector display (no assigned priority)</h3>
<p>Problem  1:<br />
The library selector for TPac  (Open-ILS/src/templates/opac/parts/org_selector.tt2) currently evaluates  the OPAC-visibility of each org unit for which it provides an  &lt;option&gt; tag before doing so, and a negative evaluation not only  means that there will be no option for that org unit, but also that the  org unit’s descendants will not even be considered.  This is the  traditional behavior apparently desired by users in general.</p>
<p>MassLNC’s  new requirement is that they be able to specify OPAC-visibility with  more granularity, with the option of hiding an org unit but not its  descendants.</p>
<p>* In existing org unit  selectors today, and I assume under the new behavior that’s desired  here, if an interface is wrapped in the staff client we show all org  units, regardless of OPAC-visibility.  For the purpose of this document,  I assume that won’t change, but this point should be clarified with  MassLNC.  MassLNC confirms keeping the current meaning  is desired.</p>
<p>Solution  1:<br />
Create a new global  flag (config.global_flag), named  “opac.org_unit.non_inheritied_visibility”.</p>
<p>Consult  this flag at the beginning of the build_org_selector_options block  in the aforementioned tt2 file, using the generated context method for  accessing cgf objects (the class is field_safe in the IDL, and thus  helper methods are available automatically).</p>
<p>If  the flag is enabled, do not recurse to display org unit children in the  existing for loop, but rather in a new for loop outside the current IF  block that tests visibility.  If the flag is not enabled, use the  existing for loop, but not the new one.</p>
<p>Once this  global flag is enabled, libraries will be able to pick and choose which specific systems will be visible.</p>
<p>Problem  2:<br />
Evergreen will need  the ability to accept user specifications for org unit sort order (among  nodes with the same parent).</p>
<p>Solution  2:<br />
Add an integer column  to the actor.org_unit called “sibling_order”, not nullable with a  default value of 0.</p>
<p>Add logic in  the build_org_selector_options block  to sort any list of org unit children by the value of this new  sibling_order column, followed by the displayed label (name or  shortname) before making iterative recursive calls over them.</p>
<p>Add  a minimal interface, requiring the UPDATE_ORG_UNIT permission to be  effective, depicting an org tree with a dijit.Tree.</p>
<p>Make  nodes in the tree draggable only among their siblings.  A save  operation will reset the sibling_order column on all org units nodes at  which the UPDATE_ORG_UNIT permission is held  to values determined by evaluating the final order of sibling nodes in  branches of the dijit.Tree.</p>
<p>This  interface may need to offer warnings to the user about the need to run<a href="http://autogen.sh/"> autogen.sh</a> or to restart services after making such changes, if that will be  necessary (testing will tell).</p>
<h3>Sys-07:  Last date of patron authentication (no  assigned priority)</h3>
<p>Note:  Some aspects of this design have been superseded.</p>
<p>Evergreen  currently does not track authentication requests, successful  authentication, or otherwise record persistent data regarding use  actions.  This makes identifying inactive users difficult, and  troubleshooting problems requires log scraping.</p>
<p>To  remedy this, it is proposed that certain actions cause addition of a  timestamped marker to a central logging table for the purpose of  identifying activity, particularly authentication and authorization.   Each trackable action will be associated with an action group, one of authen, authz, circ, hold or search,  to start.  This list of action groups can be extended in future  versions.  Each action can be individually enabled or disabled, and a  trigger on the logging table will arbitrate inclusion or exclusion.</p>
<p>For added privacy, it will also be possible to configure actions to only retain the most recent event for a given action.</p>
<p>The  specific use-case is to track the last time at which each patron  successfully authenticates in the system, with support for tracking this  value during OPAC login, SIP login, and remoteauth.cgi login.  This  design extends the use-case coverage to nearly any action that can be  performed by a user.</p>
<hr />
<p><strong>DB Components</strong></p>
<ol>
<li>Add a new config.usr_activity_type table for  configuring types of actions with seed data.  This table will track the  action type, whether it’s enabled, and whether its events should be  transient.</li>
<li>Add  a new actor.usr_activity table for tracking actions performed by users.   This will track the user, action performed, and timestamp.</li>
</ol>
<p><strong>API  / Middle Layer</strong></p>
<ol>
<li>Add  a new default auth type to opensrf.xml for remoteauth.cgi</li>
<li>Augment oils_auth to insert rows in  actor.usr_activity based on the login type</li>
<li>Augment SIP to insert rows into  actor.usr_activity for each patron authorization-check based “login”  (i.e. call to check_passwd)</li>
<li>Add  virtual patron fields for last_activity and flesh the values by reading  from actor.usr_activity during fleshed patron retrieval.  Flesh values  in  open-ils.actor.user.fleshed.retrieve[.by_barcode] for display in the  staff client.</li>
<li>Add  support for open-ils.auth.authenticate.verify to support checking  username/barcode without logging in (faster authz).</li>
<li>Insert activity event rows as necessary,  starting with authentication-based events.</li>
</ol>
<p><strong>UI</strong></p>
<ol>
<li>Display last_auth_time and last_auth_type in  patron summary display.</li>
<li>AutoGrid-based  UI for managing event types, particularly disabling or enabling  specific event logging.</li>
</ol>
<h3 dir="ltr">User  Activity Additions:  Last Date of Patron  Authentication Part II*</h3>
<p>(*This development is being donated by Equinox Software, Inc. to the Evergreen OS ILS Community.)</p>
<p dir="ltr">The goal for these  additions to the user activity development is to collect additional data  about each event.  Instead of simply tracking a generic event type, the  code will now capture and track the “who” (e.g. vendor, UI agent),  “how” (sip2, gateway, remoteauth, etc.), and the “what” (action) for  each event.</p>
<p>The “who” value will  be an optional parameter for authentication requests, set by the caller.   For interfaces within Evergreen that provide authentication (e.g.  opac, staff client), the “who” value will simply indicate the interface  in question.  For all other 3rd-party client applications that leverage  Evergreen for authentication (e.g. remoteauth, xmlrpc, gateways) the  client should coordinate with the Evergreen system on a name to use as  the “who” value for the 3rd-party and add that value as the “who”  parameter to all authentication requests.</p>
<p>For  capturing the “how” value, we’re proposing an addition to OpenSRF,  called ingress tracking.  This addition adds support for an OpenSRF  message-level variable called “ingress” which is a free-text tag used to  indicate the entry point for the client into the OpenSRF network.   Examples include gateway-v1, translator-v1, srfsh.  Additional examples  specific to Evergreen include sip2, xmlrpc, remoteauth, etc.</p>
<p>For  maximum control, each user activity type will support a combination of  any three of these values.  Only 1 value will be required for each type.   When events are logged, the most specific applicable event type will  be used.</p>
<p>Initial suggestion for  tracking who (vendor) and how (via) courtesy of Thomas Berezansky:<br />
<a title="Last Authentication Thoughts by Thomas Berezansky" href="https://docs.google.com/document/d/1WBqsx7OlCPvzqGvqsNLQysiYag64yRke9tiQ08X8xFc/edit" target="_blank">https://docs.google.com/document/d/1WBqsx7OlCPvzqGvqsNLQysiYag64yRke9tiQ08X8xFc/edit</a></p>
<h3 dir="ltr">Circ-06 (depends on ESI Widget-01, SC-A1 &amp; SC-A4):  Configurable holds pull list (no assigned priority)</h3>
<p>Requirements:</p>
<ol>
<li>Staff should have the ability to identify fields that display in the holds pull list.</li>
<li>Staff should also have the ability to identify the order in which these fields display.</li>
<li>These settings can either be an organizational unit setting or a workstation setting.</li>
<li>Staff  should have the ability to filter the holds pull list by one or more  copy locations at the time they are generating the list.</li>
<li>This  functionality should be available for a pull list that sorts first by  copy location and then by call number. The copy location order should be  determined by the Copy Location Order interface in the Local Settings  menu.</li>
</ol>
<p>We’ll  build a new interface for the holds pull list based on ESI Widget 01  (the grid), with a broad set of predefined fields for holds in the “map”  as defined in ESI Service 02 (the flattener).  Make sure the widget  described in ESI Widget 01 (the grid) either generally offers the  ability to hide unwanted fields, or make sure we can create a special  purpose subclass of it that will answer for this interface.  Make sure  that columns are re-arrangeable.</p>
<p>ESI Widget 01 (the grid) as designed should satisfy req 1, 2, 3 almost automatically.</p>
<p>We address req 4 by connecting PCrudFilterDialog, or something like it.</p>
<p>Req  5 means we may need to extend ESI Service 02 (the flattener) and/or ESI  Widget 01 (the grid) to allow us to customize how we sort per field.   I.e. by default, to sort by a field means a straightforward “order_by”:  {“hint”: [“field”]} kind of clause, but we’ll want a mechanism through  which we can optionally order by more complex expressions, so that when  we sort (at the interface level) by copy location, we actually sort by  acqplo.position and and all that.</p>
<p>This means we must make Evergreen work with current releases of Dojo now.</p>
<p>For  printing, we need a simple button or link that will take the current  parameters used to build the URL to feed the store to populate the  DataGrid, optionally taking out any paging parameters (so as to print an  entire pull list).  We then use those parameters to make a streaming  API call to the middle layer, rendering a simple HTML-based table  (presuming that Dijits like the DataGrid are no good for printing) in an  iframe for printing.  We won’t use A/T for printing like some existing  interfaces do since the form of the data (which columns, in what order,  etc) and what to label each column is a dynamic matter, not one to be  hardcoded in a template.</p>
<p>&nbsp;</p>
<p>END OF DOCUMENT</p>
]]></content:encoded>
			<wfw:commentRss>http://nox.esilibrary.com/esi/docs/?feed=rss2&#038;p=841</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
