When a user is viewing a paged table and requests it to sorted by a particular column, what page is shown?
Is there a standard expected behavior for this scenario? I can imagine several possible outcomes, but want to know if there is a standard.
You mean which page to show among the n pages in the table? There are no good options –any possibility is likely to be disorienting and frustrating for the user precisely because there is no standard and no particularly good reason to chose one option over the other. If you were to test users, I doubt they’d have consistent expectations. Even the same user may expect different things at different times. Paged tables also provide relatively weak feedback on the current location in the table so it’s hard for users to understand where they are after sorting whatever option you use. Usable sorting is one reason paged tables are inferior to scrolling tables.
Of the possibilities:
If you have a way of showing a currently selected or focused item (row) in the table, then you can go to whatever page that item is on, under the assumption that the users chose to sort at that moment in order to see other items like the item they’re looking at. This is consistent with some implementations of scrolling tables. However, most web-app paged tables don’t support the selection of an item.
You can show the ith page that the users are on when they sorted (e.g., if they’re on the third page when they sorted, show the third page under the new sort order). This is consistent with some other implementations of scrolling tables. It also supports the case where the table is almost sorted correctly (e.g., on Send Date, when Received Date is need). Showing the ith page puts the users on about the “same page” they were before. This is however not the most common use case and users are likely to feel they’ve been thrown to an arbitrary page given the weak location feedback. This option will probably produce the greatest disorientation.
You can show the 1st page under the new sort order. Depending on your tasks, perhaps most of the time when a user sorts a table, the users are interested in the items with the highest or lowest value of the attribute they sorted on. By showing the first page, the probability of you being right can approach 50%. It’s the least disorienting because the user feels they’re back at a mental anchor point –the beginning. On the other hand, users may be frustrated if they feel they’re “starting over.” Overall, this is probably your best option.
Generally following a sort, users want to jump to items with a certain value on the attribute they sorted on. This is difficult with a paged table because paging is slow and the users don’t know what page number corresponds to what value. You could label the links for the pages with the range of values found on them, but that can consume a lot of real estate. At the very least, you should always provide a link to the first and last page of the table however many pages there are so users can get to the items with highest and lowest values in one click.
Alternatively, consider supporting filtering rather than sorting to accomplish the same purpose. Depending on your users’ task, that may work much better and be less confusing and effortful.
The answer of Michael Zuschlag is very good, but I think that the case #1 and #2 that he presents are really uncommon, and doing so can be more confusing than useful.
In my opinion, you should always show the 1st page under the new sort order. If the user has selected an item, usually he don't want to sort anything, because he already found what he was looking for.
If you want to give a sort order to a list, usually you want to see the real, complete order.
A classic scenario can be a torrent site:
I search for a torrent typing some
keywords.
After the search I a have
an unordered list, 50 items per
page.
I go to second page.
Now, I think that is better sort the results starting from the item that has the highest number of seeders, and click to the header of the seeds column.
I expect to see the item with the the highest number of seeders after action 4, so after sorting you have to show me the first page. And I think this is true for about any sorting situation.
First of all, AMEN to the previous answer (and +1)
Second, just for real life examples of what users are familiar with and may expect, Yahoo Mail does #3 (jump to page 1 after sort). So do many other web sites.
My personal recommendation - if feasible to implement - would be #1 above (allow jumping to the page containing the currently selected element). Make sure that element is STILL selected.
That is both somewhat intuitive, not very un-expected, and most useful in cases where the user cares what happens. Plus, the option #3 (jumping to first page) is only 1 click away for the user assuming your paging controls include "Go to page 1", whereas, as noted in previous answer, doing first page makes it hard and long for user who did want to stay with the current item.
I definitely support the "add filtering" idea as well if feasible - I find myself using Excel for >50% of the work with tables/lists originated from any app/website, due to its exceptional combination of filtering and sorting. Perhaps YUI has a decent filterable table element assuming your UI is HTML?
Related
I'm trying to improve the schedule spreadsheet for the café I'm working at.
Our employees can be baristas, bartenders, or both. I made a table with checkboxes for that. That's the Employee list tab.
In the Schedule planning tab we specify which days in a given month we can come to work. Sometimes people can work both morning (AM) and afternoon (PM) shifts in the same day, but not always, so it needs to be specified too.
In the Finalized schedule tab our manager would split the shifts among employees manually, which is the most complicated and time-consuming part of the whole process. They would constantly switch between tabs, checking who can work which days and shifts, then juggle with what's available. Needless to say, there's plenty of room for error there and sometimes it's quite a mess.
I would like to automatize it a little bit. I know a little about spreadsheets, but can't figure out a few basic things here to even get started. I suppose my main issue is "connecting" several individual cells - to get a particular result only when their values correspond correctly.
I would be eternally thankful for tips on any of the following points.
(There's also going to be a calculator for hours worked in another tab, but I've already sorted that out.)
https://docs.google.com/spreadsheets/d/18W1ScIDT0e7A7esOwnTkvIVtWzoOkMPo6pfqkTVLn7E/edit#gid=1743092005
I imagine the tabs feeding into each other in the following manner:
Employee list tab would serve as the foundation for the rest of the sheet. The other two tabs would pull employee names out of it (to avoid typos and subsequent errors, especially in the hour calculator tab), as well as their roles.
In the Schedule planning tab, the only thing I have troubles with is automatically generating new sections for each employee. The sheet linked above is obviously faux, there's many more people working at our café and people often come and go, so it would definitely save time if a horizontal list of names from Employee list (B3:B) could be generated into (C1:1) of Schedule planning. Is that possible?
Other than that, what's crucial here is the date (B3:B) and shift (C2:C).
The last tab is the most complicated. This is what our manager sinks hours and hours into.
As you can see, for each day, there's up to six slots available - three per shift: one each for baristas and bartenders, and then one more in case an extra pair of hands would be needed on that particular day/shift. This extra slot can be filled out by anyone available regardless of their usual role.
Ideally, I would like to have a dynamic dropdown list in each slot that would pull data from the previous two tabs. The criteria are as follows:
Name is pulled from Employee list (B3:B).
Role is pulled from Employee list (B3:C). For example, John is a barista, so he should appear only in Barista and Support slots; Bill, on the other hand, can appear in any slot.
Date is pulled from Schedule planning (B3:B). For example, Patrick should only appear available in the March 1, 4, 6 and 9 slots (and also only in the Bartender slot, as that is his role).
Shift is pulled from Schedule planning (C2:C). For example, if we would need a barista to work in the morning on March 4, the dropdown list would contain only Cathy and Bill, as they both fill the role and are available for the AM shift on that day.
Additionally, if a person has already been selected from the dropdown list, they shouldn't appear in the other two dropdown lists for that shift, even if they satisfy all other criteria. For example, if Bill appears in D16 (Barista, March 8, AM shift), he's "taken" and can't work any other role at that moment. (In other words, the same person can only appear once on the same row. I'm not sure it can be done via dropdown lists, but perhaps color formatting would do.)
I understand it's quite a project I need help with, but I'm really stuck here and don't know where to begin. My hope is that for some of you it might also be a fun game figuring this out with me.
Thanks a lot to whoever can contribute to this in any capacity.
I have a website I am developing that will be deployed to several different clients. All of the functionality is the same and the vast majority of the language used is the same. However, some of the clients are in different industries so specific words and phrases within some pages need to changed based off of the company of the individual logged into the site. What is the best way to accomplish this?
In the past I have seen people use string database tables but that seems rather cumbersome. I thought about using localization but I don't want another developer to get confused because it isn't a change in spoken languages.
For this you can use something like a word list. I don't know whether word list is a well know concept or not but let me try to explain it to you.
You can add the information that distinguishes each login from other based on the companies in one table in your database and map it to corresponding words you wanna use for the respective English or default word in another table.
Now I am assuming that these words do not change very often. So what you can do is on application start, load it to a convenient memory data structure.
Now all the text you want to process will go through a word list processor which is basically a program code that identifies the group in which the login is and identifies the words to be replaced. Then it replaces those words based on the appropriate group and returns back the transformed text which you can display in the UI.
So here the advantage is, once the data is loaded into the memory data structure, you don't need to read the values from your DB.
Moreover, if there is any change in the word lists or if you want to give user the handle to change the words according to their preference, you can directly modify the memory data structure and then later refresh it in the DB asynchronously.
Also since the call for mapping is directly from the memory, its faster than DB calls.
And since its a program code, typically a method or something, its totally up to you which text to process and which to ignore.
This is a technique which we used in our application when we had a similar requirement. I hope this suggestion of solution to this problems helps !
Better alternatives and suggestions are always welcome since we would also want to improve our solution to this problem. Thanks.
i couldn't find any info on this anywhere.
i have a setup of users and items, where the items could became outdated pretty fast (in days). this means, i cannot show those items anymore, since the customer (who sells items) has no credit left and we don't know whether he plans to continue working with us (by charging more credit).
but i want to keep the user-items settings, because it is still valuable and the results are good. i'm afraid, that when getting e.g. 20 recommendations for a user, 15 out of 20 recommended items could be outdated.
is such a situation covered within mahout/myrrix, or do i have to implement my own filtering method via rescorerProvider (setting higher threshold for active items) or simply get 40 recommended items and filter first 20 of them which are still active?
there's one more solution that comes to my mind - erase old items from the user-item preference and put them as tags via the method http://myrrix.com/rest-api/#setusertag
That situation is not explicitly covered by either, in both you will have to introduce some custom logic.
Either solution you described should work (rescorer or generating more). However in my Myrrix you can use the pluggable CandidateFilter
I'm not so sure about the tagging trick, it might work since the tags act as pseudo users or pseudo items.
I've created a graph model for a social network and needed some concrete advice regarding the design in regards to scaling. Pardon the n00bness of these questions but I'm not finding very many clear examples out there...
NOTE: the status updates and activity nodes /relationships are linked lists - with the newest entries constantly being placed at the top of the list.
Linked lists allow for news feed generation, but there could be hundreds of records per user - I presume the limit clause isn't sufficient even though the data is in descending order by date. Do I have to have a separate linked list that would only hold the most recent 10 status/activity updates) and constantly replace the head on that list to get better activity feed generation, or will one list properly sorted and do the job (with a limit clause)
These nodes all have properties (json data with content, IDs, etc) - how do "global" indexes come into play here so that I can find, for example, users that like Depeche Mode without waiting a lifetime for results? I know how to add a node to an index, just wondering if I'm missing a part of the picture here..
Security - logins and passwords.. I would presume a graph database could store them, but I'd presume it's a security risk at this point - would it be better to keep this in postgres etc?
How would you improve this model to handle scalability? Imagine 20 million users banging away on this..
Imagine 40 million users - what's wrong with this model when it comes to scalability?
Part 1.
You can write cypher or gremlin queries that do what you want. Remember that you can traverse forwards and backwards on edges. Given a user, it should always be relatively constant time to pull up the last ten things they did.
Part 2.
If you are representing a band as an entity of a certain type, index on that attribute. Then you'll be able to pull out that node and traverse outwards to find all the users who like that band. If you don't have an independent entity, or it is somehow implicit, you'll want to enable full text search for your respective graph database.
Part 3.
Learn more about security. The only thing you would be storing would be a properly hashed string of the user's password. At that point you would be fine using any graph db and good security practices.
Part 4/5.
Once you have one user, worry about the next thousand.
When you have a thousand users, worry about the next hundred thousand.
When you have one hundred thousand, worry about the next million.
When you have a million users, you can start worrying about the questions you asked.
Until you have at least 0.1% of the users/volume you want to scale to, it's mental masturbation to try and ask questions about how to scale up to a certain size.
We're evaluating the 45 demo of fogbugz. Thus far I like it, but there are some obvious things I'm missing.
What boggles me the most is how I can easely alter fields in the list view. I would like to open the detail screen as little as possible. It seems to be possible with the estimation column, why isn't it possible with all the other fields (like project, priority, status etc.?).
What you are asking for can not be done in FogBugz 6. You have to open up the case in order to edit most of the fields. Why they made exceptions for time estimates, I don't know.
The rationale here was as a feature to accompany quick case entry. (That's the "Add Case" link at the bottom of each group or at the bottom of the grid.)
The thinking was that it'd be neat to be able to add cases quickly and then burn through the list, estimating them quickly. We didn't really expand our thinking to include moving cases around or changing things like releases/milestones, etc.
This is something we'd like to offer in the future for many more fields, and one of those weird situations where adding a small, specific feature can sometimes make the fact that the larger, general implementation of that feature isn't there yet.
FogBugz 6 isn't big on customisation. You can edit the categories and statuses in the database tables directly (though you need to edit the "internal" project and click OK for the cache to be refreshed.
FogBugz 7 is coming out this year hopefully, and may well address many of these issues.