Giter Club home page Giter Club logo

hemlock-ios's People

Contributors

erikcx avatar kenstir avatar mitchcohen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

hemlock-ios's Issues

Offer expanded search on results page if searching only primary library

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.

Login fails with ""Error decoding OSRF object"

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.

Unexpected network response: expected array

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;
}

Account switcher - show card holders' names

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.)

Fines screen slow to load

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.

Implement phone notification

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.

Remember search parameters between invocations

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"

Items due today are showing as overdue

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.

Remember Place Hold preferences between invocations

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

  • "pickup_library" e.g. "Bogart Library"
  • "sms_carrier", e.g. "Sprint (PCS) (USA)"
  • "phone_number", e.g. "5085551212"

Ability to remove accounts

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…

Renew failed with "Unexpected network response: expected object"

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) 

Implement Dynamic Type support on Search Results view

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.

Implement Copy Info scene

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.

Item Description initially shows data from prior item

I see this a lot, but not sure how consistent this is.

Steps:

  1. Search for something
  2. Display first item found; no trouble
  3. Go back to search results
  4. Display second item found. Details of first item are shown very briefly, then replaced by second item.
  5. Repeat display of second item: Details of first item are shown again, and again replaced by second item.

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.

RPReplay_Final1642277359.mov

A way to quickly navigate back to Home

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.

Fix SMS Carrier picker on Place Holds scene

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.

Error reporting when site is down

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.

IMG_1109
IMG_1110
CW Mars down for maintainance 404.html.zip

Add basic List Management to app

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).

Cancel a Hold

When I place a hold, I’m unable to cancel it using the app.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.