kenstir / hemlock-ios Goto Github PK
View Code? Open in Web Editor NEWiOS app for Evergreen™ Libraries
License: Other
iOS app for Evergreen™ Libraries
License: Other
The app (CWMars, at lest) defaults to the user's primary library. If a user performs a search and doesn't find what they need, they need to back up, scroll through a large list of libraries to find the All Libraries option, then press Search again. I'm sure there are several ways to improve this. My suggestion is to add a "Search All Network Libraries" button to the top of the Search Results page, and hide that button if already searching in that context.
If the gateway is offline (or unreachable) when the app initializes, the IDL is never loaded, and login fails with "Error decoding OSRF object".
Workaround: Close the app and restart it.
The login process should restart the IDL parsing if it hasn't been done yet, and then login when that is done.
Also, Place Hold button should be disabled when pressed.
If the auth_token expires while the app is running, then you tap something like Holds, you will see the error Unexpected network response: expected array
The GatewayResponse should recognized this error and throw a session expired error. Then in the future we can handle those errors specially, like retrying or returning to the login scene.
resp.json: {
payload = (
{
desc = "User login session has either timed out or does not exist";
ilsevent = 1001;
pid = 24875;
stacktrace = "oils_auth.c:1148";
textcode = "NO_SESSION";
}
);
status = 200;
}
I manage the accounts for my family. It would be very helpful to show the card holders' names in that account switcher, instead of only the account numbers. (I know account numbers can be changed on the web site, but I suspect that's not a widely-used feature.)
Add a Check Out History scene to show the same data available at https://gapines.org/eg/opac/myopac/circ_history or https://catalog.cwmars.org/eg/opac/myopac/circ_history . This feature would probably require some additional UX to enable circ_history or at least provide a button to take you to the web UX to do it.
Requested during Beta.
The Fines screen appears to load the org settings "credit.payments.allow" and "opac.holds.org_unit_not_pickup_lib" every time. Even if there are no fines to pay.
If you tap in the Pickup Location TextField before loading succeeds, you can pop the virtual keyboard and then you can't dismiss it.
The GAPINES app allows notification by phone for hold availability. That is possible in the Android app, but there is no way to request it in the iOS app.
If I do a Search and I make selections, they should be remembered the next time I go to do a Search.
But do not remember the "search words"; that feels like an invasion of privacy that would make users uncomfortable.
These selections should be stored using Valet (which stores it in the iOS keyring, unlocked when the phone is unlocked).
The settings stored should be
"search_org" e.g. "Bogart Library" (or maybe shortname "ARL-ATH")
"search_format", e.g. "All Books" (or maybe searchFormat "book")
"search_type", e.g. "Title"
When a hold is available, the OPAC displays
Available
Expires 11/08/2018
but the app only displays "Available".
It's useful to see the expiry date.
Items due on the current day are showing an (overdue) indicator, but this is not correct.
It shouldn't show overdue until the day after the due date.
Here are values for opac.hold_notify that I have seen:
phone:email
:sms
email|sms
email:sms
phone:email:sms
If I run the app and I make selections, they should be remembered the next time I go to place a hold.
These selections should be stored using Valet (which stores it in the iOS keyring, unlocked when the phone is unlocked).
The settings stored should be
Provide an Online Access instead of Place Hold for online items, as is done in Android. Button will bring up mobile browser. Instead of copy info, show hostname of online resource.
Use case:
I use the app on my phone to manage the accounts of 6 members of my household.
We recently changed library card numbers.
I am able to add the new numbers but not remove the old ones…
When really it failed with an array of events:
2019-02-23 20:54:25.740486-0500 Hemlock[923:460672] [Gateway] req.params: {
method = "open-ils.circ.renew";
param = (
"\"9d585e5ccf381715d684ab3af069471f\"",
"{\"patron\":238,\"copyid\":4483,\"opac_renewal\":1}"
);
service = "open-ils.circ";
}
warning: could not execute support code to read Objective-C class data in the process. This may reduce the quality of type information available.
2019-02-23 20:55:18.694612-0500 Hemlock[923:460672] [Common] _BSMachError: port 13d2b; (os/kern) invalid capability (0x14) "Unable to insert COPY_SEND"
2019-02-23 20:55:21.128966-0500 Hemlock[923:460672] [Gateway] resp.elapsed: 55.389
2019-02-23 20:55:45.470194-0500 Hemlock[923:460672] [Gateway] resp.wire: {"payload":[[{"payload":{"fail_part":"asset.copy_location.circulate"},"stacktrace":"/usr/local/share/perl/5.22.1/OpenILS/Application/Circ/Circulate.pm:1293 /usr/local/share/perl/5.22.1/OpenILS/Application/Circ/Circulate.pm:4082 /usr/local/share/perl/5.22.1/OpenILS/Application/Circ/Circulate.pm:4034","desc":" Target copy is not allowed to circulate ","ilsevent":"7003","textcode":"COPY_CIRC_NOT_ALLOWED","servertime":"Sat Feb 23 20:55:17 2019","pid":17822},{"payload":{"fail_part":"PATRON_EXCEEDS_FINES"},"pid":17822,"ilsevent":"7013","servertime":"Sat Feb 23 20:55:17 2019","textcode":"PATRON_EXCEEDS_FINES","stacktrace":"/usr/local/share/perl/5.22.1/OpenILS/Application/Circ/Circulate.pm:1293 /usr/local/share/perl/5.22.1/OpenILS/Application/Circ/Circulate.pm:4082 /usr/local/share/perl/5.22.1/OpenILS/Application/Circ/Circulate.pm:4034","desc":"The patron in question has reached the maximum fine amount"}]],"status":200}
2019-02-23 20:55:45.471715-0500 Hemlock[923:460672] [Gateway] resp.json: {
payload = (
(
{
desc = " Target copy is not allowed to circulate ";
ilsevent = 7003;
payload = {
"fail_part" = "asset.copy_location.circulate";
};
pid = 17822;
servertime = "Sat Feb 23 20:55:17 2019";
stacktrace = "/usr/local/share/perl/5.22.1/OpenILS/Application/Circ/Circulate.pm:1293 /usr/local/share/perl/5.22.1/OpenILS/Application/Circ/Circulate.pm:4082 /usr/local/share/perl/5.22.1/OpenILS/Application/Circ/Circulate.pm:4034";
textcode = "COPY_CIRC_NOT_ALLOWED";
},
{
desc = "The patron in question has reached the maximum fine amount";
ilsevent = 7013;
payload = {
"fail_part" = "PATRON_EXCEEDS_FINES";
};
pid = 17822;
servertime = "Sat Feb 23 20:55:17 2019";
stacktrace = "/usr/local/share/perl/5.22.1/OpenILS/Application/Circ/Circulate.pm:1293 /usr/local/share/perl/5.22.1/OpenILS/Application/Circ/Circulate.pm:4082 /usr/local/share/perl/5.22.1/OpenILS/Application/Circ/Circulate.pm:4034";
textcode = "PATRON_EXCEEDS_FINES";
}
)
);
status = 200;
}
(lldb)
It shows correctly when navigating Search >> Results >> Item Details.
While working on #35 (Dynamic Type on Item Details) I looked into doing the same for Search Results. The basics of this are very easy. In XResultsTableNode.swift, replace the fixed sizes with the dynamic equivalent. For example, replace the 16 in titleTextAttributes with UIFont.preferredFont(forTextStyle: .callout).pointSize).
It turns out, however, that the cell row height is fixed, resulting in the Format (Book, E-audio, etc) being vertically truncated on larger-than-default sizes. So part of this issue is to adopt self-sizing cells, or whatever the equivalent is in Texture.
Text on the Item Details screen is small. This is subjective. I suspect it is smaller than the HIG recommended Body size of 17, but haven't confirmed. See https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/typography/.
Further, the size here, and in most screens, does not adapt to Dynamic Type.
In the Android app, from the Item Details you can choose Copy Info. This presents a list of all copies and locations and status. Note that the sorting and grouping of this scene should be different between base Hemlock and GAPINES versions.
I manage the accounts for my family. It would be very helpful to show the current card holder's name on the main page.
I see this a lot, but not sure how consistent this is.
Steps:
In attached screen recording, I'd searched for Ron Galella. Before recording I viewed the first item, Smash His Camera. The recording shows me tapping the second item (Jacqueline) three times. Each time, Smash His Camera shows first, before being replaced by Jacqueline.
A home button of some kind is needed. If you’ve found an item in the catalog and placed a hold on it, it takes many taps to get back to the home screen, which was frustrating.
Beta feedback:
An SMS carrier is is pre-selected. Recommend that field be empty when customers go to the hold page.
The list for SMS carrier is all over the place alphabetically. Recommend the carriers be alphabetized.
The cwmars site is currently down for maintenance, which is fine. The web site reports an appropriate message, but the iOS app gives a generic "response not JSON" error for any action.
The responses appear to be 404's (not found). Ideally these would be 503's (Service Unavailable), and/or return JSON for JSON requests.
Attached is the HTML response from a desktop Safari session (zipped), and two iPhone screenshots. I'm assuming the server is returning 404 with HTML for JSON requests when this occurs, but I did not verify. One option is to catch 404's, and if the 404 contains HTML, display that in a web view.
The app lacks all of the list management functions of the web site. I don't think the app needs full list management, but would benefit by offering user the ability to add an item to an existing list (creating a default list if none), to view an existing list, and to view an item from an existing list (to place it a hold).
The keyboard management on the Place Hold screen is not obvious. To fix issues where you can't dismiss the keyboard, you have to go back then press Place Hold again.
When I place a hold, I’m unable to cancel it using the app.
If you place a hold type "P" on e.g. (volume 1 of Bone, it shows incorrectly on the Holds Screen, with author "Unknown" and title "Unknown".
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.