Two Delightful New InfoGraphic Applications

I generally like to check the weather online every few days so I installed the Weather Channel Chrome application. As you can see from the following screen capture it’s a clean looking application that initially presents a summary of the weather for the current and next day. If I want to know what the weather is like beyond tomorrow or over the next few hours I need to click one of the links and wait for a website page to load. If I want to compare the current forecast with the averages for this time of year, then I need to do a little more digging.  

The Weather Channel AppStore

Weatherbug.com has an even fancier application with that uses tab pop-ups but still requires a lot of clicking to get a complete picture of the weather.

weatherbug

A few days ago I found what is for me a truly delightful weather site that instantly gives me a quick overview of the current weather, the hour by hour forecast for the next 6 days, the averages for this time of year, and the weather for the previous 8 days. It can also show the previous and predicted overcast/sun, precipitation, wind speed, wind direction, and other weather data.  WeatherSpark presents all this weather data in a graph that’s easy to read.

image

It even includes a map view showing the temperatures of the weather stations in the area. You can add multiple location and overlay them on the chart.  If you want more of a long range perspective of weather switch to the weekly or monthly views as show below.

image

Time Zones

While I don’t personally have a need to quickly determine the time in a different part of the world for those that do World Time Buddy is a beautiful way to find this information.

image

Conclusion

InfoGraphic Applications like WeatherSpark, Hipmunk for airline booking, and World Time Buddy illustrate the power of graphical data representations for finding, comprehending, and acting on information. In a world where more and more information is available, infographic applications provide a way of quickly comprehending a data rich experience. 

Share
Posted in Examples | Leave a comment

IGUI – Info Graphic User Interface

As newspapers struggle to find a niche in our increasingly online life they have created some stunningly powerful infographics that visually illustrate and simplify the complexities of issues and events.  Here is an example of a Washington Post infographic that illustrates the personal tax increase issue in the US.  By comparison here is an article about this same issue. Which would you rather uses?  Which does the best job of communicating all aspects of the issue?

It appears infographics will increasing become one of the main stream forms of communication we use to understand our world. But what about the data base driven applications we use on a day to day basis. Can we leverage the infographic style of communicating information and meaning to make applications better?

We are beginning to see an increasing use of charts and graphs in data driven applications. These are great for summarizing data and illustrating relationships and quantitative comparisons.  Can we take this even further to the point where the infographic not only communicates information but becomes the way we interact with and update that data. 

The new travel site hipmunk.com illustrates the elegant simplicity and data richness that can be visualized for easily finding and selecting fights. It was recently named one of the 5 of the best user experiences of 2010 by Mashable.com.   This infographic application use a timeline chart to show the departure and arrival times as well as flight and layover durations. Since most of us want to find the cheapest and shorts flight this presentation makes it very easy to find what best fits our needs. Clicking the bar starts the flight booking process.

hipmunc2

Compare this to the same data presentation on Kayak. Which is easier to read to find the shortest and least expensive flight?

kayak2

So can this Infographic App design be extended to other types of applications?   Lets consider the user interface for the client information component of a Customer Relationship Management (CRM) system.  Here is an example of a CRM screen.  It contains a lot of information that takes a while to digest and interpret.  So what does all this data mean?  Does it mean the relationship with the customer is a good one?  Does it show any gaps in the service to the customer?  

By comparison an infographic app design might look like this.

swimtimeline2

The icons in this swim lane time line chart illustrate the approximate date of a customer event. Clicking the icon could show the details of the event.  

Interactive IGUIs are not new. They have been around for while, but have only been used for very specific functions. Case in point is the appointment scheduling screen in Microsoft Outlook. Can you imagine setting up an appointment for a group people without the appointment availability time line graphic.

outllook3

With business knowledge growing at a very rapid rate, it is difficult for employees to keep up with new process and knowledge, much less mine the current data for insight about clients.  The interactive info graphic user interface might be a design strategy that helps people understand data and act on it.

Share
Posted in Ideas | 3 Comments

Improving the Date Picker Calendar Widget Design

The pop-up date picker calendar has become the universal standard widget for entering a date. Most show the current month and some show the current and next month. They are a very convenient way to select a date because you can see the day of the week and don’t have to look at a calendar.

jQuery UI Date Picker Despite their convenience for selecting dates, they have one slightly annoying limitation.  If you want to select a date that is several months out you either need to:

  • click the month or year navigation arrows
  • use a dropdown list to select a month and/or year.

Some calendars place the advance month and year buttons right next to each other. This often leads to mouse targeting errors where you advance a year rather than a month.

 

pop-calendar

Is there a better design for quickly jumping to a future or previous month or year?  I think there is. 

If it’s easy to select a day by clicking on the day number, why would it not be just as easy and convenient to click a month abbreviation to quickly display that month.  In this design the month abbreviation appear above the month calendar.

If there is a need for an even more robust month and year navigation then something like the following could make that navigation even more convenient and quick.

 

2month

These designs are just some quick thoughts about improving the month and year navigation on pop-up date picker calendars. There are do doubt some even better ways to visually design these elements. This is just a design idea and does include the code for implementing the design.

Share
Posted in Ideas | Leave a comment

Delight Your Users with … Questions

There is a page on my Employer’s Intranet that has received close of 500 comments over the past year or so. The vast majority of these are highly complimentary and use words like ‘love’ and ‘great’. Many of the comments express genuine delight. Some of the more expressive comments talk about how the page increased user confidence and reduced stress.

The surprising thing about all these comments is that the page is not used often. The positive comments per page visit is much larger than any other page, site, or system used in the organization.

So why do the employees find this page so delightful and empowering?

  • It does not have a stunning visual design. It’s very plain. It uses a few simple colors and 2 small icons – a bullet point and check mark. 
  • The content is simple and short. Most users only need to read 100 words or less. It consists mostly of short questions and even shorter answers. 
  • It does not have spectacular animations, just a simple fade in effect when a question or answer appears.
  • It does not use any HTML form elements or custom widgets, just hyperlinks on text.
  • It does not use a lot of JavaScript, just some jQuery code that took about 25 hours to develop, test, and tweak.  

So what is it? It’s a simple decision guide that starts with one question and 3 simple answers – Yes, No, and I’m not sure. Clicking Yes or No presents a follow-up question that is relevant for the answer. Clicking ‘I’m not sure’ presents information about how to determine which answer to select. The user continues to answer questions until they reach the final answer - the step by step procedures for meeting a client’s need.

An example of this decision guide and the jQuery code that enables it is illustrated in this previous post.

So why is this page so effective? It eliminates the need to read and interpret all the rules governing a particular business process in light of a given situation. Most organizations, whether governments or business, will have manuals or intranet sites that document all the rules governing their processes. To perform a process an employee must be able to read and interpret the rules. This can be a daunting task. What if they miss something or don’t completely understand one of the rules? The fear of doing something wrong can put a lot of stress on an employee. In my organization we often hear these front line employees say they read the rules on an Intranet and then call the support center to confirm they have interpreted the rules correctly.  This can be a costly way to do business.

To determine what needs to be done in a given situation support center specialists ask questions. The same kinds of questions that can be asked on a web page. Employees usually know the answers to these questions. That’s the easy part. The difficult part is understanding the rules about what needs to be done given a particular set of answers.  

Adding pages and pages of rules to your organization’s Intranet site is not going to be very effective. There is a better way to enable employees to complete processes. It will take some difficult work to map out a decision tree, but in the end your employees will be delighted and you may eliminate a lot of unnecessary calls to your support centers.     

Share
Posted in Ideas | Leave a comment

Tabbed Table Select Columns Enhancement

The previous post provided code for using tabs to navigate the content of a multi-column table. It includes a feature that lets a user select the columns to display. If there are many columns in the table, the list will get long and it may be necessary to scroll the page. I just found a small jQuery that can easily reformat the list. The plug-in is available at: http://fredkelly.net/multi-column-lists-meet-jquery.

See the updated tabbed table example.

It can be implemented using the single line of code at the end of this code block.

$('#tabSelCols').click(function() {
var popList = "<ul>";
var chkbox = "<li><label><input type='checkbox'>";
$('#tabTable tr:first td').each(function() {
    var colName = $(this).text();
    popList = popList + chkbox + colName + "</label></li>"
})
$('#colList').html(popList);
$('#selectColumns').slideDown(300);
$('#colList ul').multilists({ cols: 2 });
})

Thanks to Fred Kelly for this plug-in.

Share
Posted in Code | Leave a comment

Using jQuery for Usable Multi-column Tables

It appears that people generally do not like horizontal scrolling. This creates a design dilemma for presenting information in multi-column tables.  A possible alternative is to hide and show groups of columns with a tab design. This code lets you

  • Define and create tabs for groups that can contain any number of columns from any location in the table.
  • Let users select their own group of columns. The Select Columns tab pop-ups up a list of all the columns with a checkboxes.
  • Click a row to display a pop-up with all the data in that row.

tabtable

View Working Example

HTML

Tabs

  • The custom ‘columns’ attribute contains a comma delimited list of the columns that will appear when that tab is clicked.
  • The class “activeTab” applies a style to the selected tab
  • The ‘tabSelCols’ id is used to capture the click on the Select Columns tab and display the pop-up list of all columns
   1:    <ul id="colTabs">
   2:      <li class="activeTab" columns="0,1,2,3,6" >Column Group 1</li>
   3:      <li columns="0,7,8,9,10" >Column Group 2</li>
   4:      <li columns="0,11,12,13">Column Group 3</li>
   5:      <li columns="0,14,15,16">Column Group 4</li>
   6:      <li id="tabSelCols" columns=''>Select Columns</li>
   7:    </ul>

Select Column Pop-up

   1:  <div id="selectColumns" class="popSelectCol">
   2:  <div class="popTitle">
   3:  <span style="float:left">Select Columns to View</span>
   4:  <span id="closePop">X</span></div>
   5:  <div id="colList">&nbsp;</div>
   6:  <div align="center">
   7:  <button id="btnShow">Show</button></div>
   8:  </div>

Row Details Pop-up

   1:  <div id="rowDetails" class="popSelectCol">
   2:  <div class="popTitle">Details</div>
   3:  <div id="details">&nbsp;</div>
   4:  <div align="center"><button id="btnClose">Close</button></div>
   5:  </div>

jQuery

Hide and Show the Columns Groups

This code will add a column specific class to the <td> tag in each column. We can then reference the class to hide and show the <td> tags.

   1:      $('#tabTable tr').each(function() {
   2:          $(this).find('td').each(function(i){
   3:              tag = 'c' + i;
   4:              $(this).addClass(tag);
   5:              })
   6:          })

This code find the comma separated list of column numbers in the default tab and displays them when the page loads.

   1:  var colNums = $('.activeTab').attr('columns');
   2:  $('#tabTable').hide().showColumns(colNums);

This code initially hides all the columns and then shows only the columns that are passed in the array ‘colids’.

   1:  $.fn.showColumns = function(colids) {
   2:      $('#tabTable td').addClass('elHide');
   3:      var colShow = colids.split(',');
   4:      for(i=0; i<colShow.length; i++) {
   5:          var thisCol = colShow[i];
   6:          $('.c' + thisCol).removeClass('elHide'); }
   7:      $('#tabTable').show();
   8:  }

This code change the active tab style and passes the array of column numbers to the above function to show the columns that belong to the group.

   1:  $('#colTabs li').live('click',function() {
   2:      $('#colTabs li').removeClass('activeTab');
   3:      var colNums = $(this).attr('columns');
   4:      $('#tabTable, #selectColumns, #rowDetails').hide();
   5:      $(this).addClass('activeTab').showColumns(colNums);
   6:  })

Select Column Popup

This code creates the pop-up based on the column heading labels.

   1:  $('#tabSelCols').click(function() {
   2:      var popList = "<ul>";
   3:      var chkbox = "<li><label><input type='checkbox'>";
   4:      $('#tabTable tr:first td').each(function() {
   5:          var colName = $(this).text();
   6:          popList = popList + chkbox + colName + "</label></li>"
   7:      })
   8:      $('#colList').html(popList);
   9:      $('#selectColumns').slideDown(300);
  10:  })

This code displays the selected columns

   1:  $('#btnShow').click(function() {
   2:  var chkSelected = '';
   3:  $('#colList input:checked').each(function(i) {
   4:      var checkStatus = $(this).attr('checked');
   5:      chkSelected = chkSelected + i + "," ;
   6:      $('#tabTable').hide().showColumns(chkSelected);
   7:      $('#selectColumns').slideUp(300);
   8:      })
   9:  })

Show All Data in a Row

This code gets the column heading labels and the text in each <td> tag for the selected row.

   1:  $('#tabTable tr').live('click',function() {
   2:      var colLabels = [];
   3:      var rowData = [];
   4:      var tbl = $(document).rowDetails(2);
   5:      $('#details').html(tbl);
   6:      $('#tabTable tr:first td').each(function(e) {
   7:          colLabels[e] = $(this).text();
   8:          })
   9:      $(this).children().each(function(e) {
  10:          rowData[e] = $(this).text();
  11:          })
  12:      $('#rowValues tr').each(function(e) {
  13:          $(this).children(':first').text(colLabels[e] + ':');
  14:          $(this).children(':eq(1)').text(rowData[e]);
  15:          })
  16:      $('#rowDetails').slideDown(300);
  17:  })
  18:  

This code builds a 2 column table. The first column contains the column heading labels and the second the text in the selected column.

   1:  $.fn.rowDetails = function(cols) {
   2:      var tblRow = $('#tabTable tr:first td');
   3:      var rows = tblRow.length;
   4:      var tblTag = "<table cellpadding=3 cellspacing=0 border=0 id=rowValues>";
   5:      var colTags = "";
   6:      var rowTags = "";
   7:      var grid = " ";
   8:      for(c=0; c<cols; c++) {
   9:          colTags = colTags + '<td>&nbsp;</td>';
  10:      }
  11:      for(r=0; r<rows; r++) {
  12:          rowTags += '<tr>' + colTags + '</tr>'
  13:      }
  14:      grid = tblTag + rowTags + '</table>';
  15:      return(grid); }

In a future post I hope to provide the code to view details for selecting multiple rows. This would be good for a side by side comparison.

To use this code it would be best to download the example, replace the table element and update the style to match your site styles.

Thanks to GENERATEDATA.COM for the data that contained in the example

I hope you find this interesting.

Share
Posted in Code | 1 Comment

JavaScript for Dynamically Adding Thousand Separators to Numeric Fields

Quickly, what’s this number:  100000

Is it 1,000 or 100,000 or 1,000,000

So how long did it take to figure out it was 100,000? Was it instantaneously or did you need to count the number of zeros? Imagine having a job where you frequently had to enter large amounts in data fields that did not dynamically add the thousand separator. What kind of error rate do you think you might have?

This posting contains a JavaScript for dynamically adding a thousand separator to a value in a numeric field. The function is a combination of code posted on the internet. The code for adding the separator came from mredkj.com. While this code works well for adding the commas with an onchange event it does not work well when using the onkeyup event. Dynamically updating the amount with the correct placement of thousand separator required a function to locate and reset the position of the caret in the field. The code for this came from a posting on webdeverloper.com

Here is an example

Here is the HTML for the field

<input  type="text" id="numTest" style="text-align:right" onkeyup="addSeparator(this)"  /> 

 

Here is the code

   1:  function addSeparator(fldID) { 
   2:          var posCaret = getPosition(fldID); 
   3:          var fldVal = fldID.value; 
   4:             if((fldVal.length === 3 || 7 || 11) && (fldVal.length === posCaret)) { 
   5:               posCaret = posCaret +1;  
   6:               } 
   7:          nStr = fldVal.replace(/,/g,'');    
   8:          nStr += ''; 
   9:          x = nStr.split('.'); 
  10:          x1 = x[0]; 
  11:          x2 = x.length > 1 ? '.' + x[1] : ''; 
  12:          var rgx = /(\d+)(\d{3})/; 
  13:          while (rgx.test(x1)) { 
  14:             x1 = x1.replace(rgx, '$1' + ',' + '$2'); 
  15:          } 
  16:          fldID.value = x1+x2; 
  17:          setCaretPosition(fldID, posCaret); 
  18:      }
  19:   
  20:  function setCaretPosition(elem, caretPos) {
  21:      if(elem != null) {
  22:          if(elem.createTextRange) {
  23:              var range = elem.createTextRange();
  24:              range.move('character', caretPos);
  25:              range.select();
  26:          }
  27:          else {
  28:              if(elem.selectionStart) {
  29:                  elem.focus();
  30:                  elem.setSelectionRange(caretPos, caretPos);
  31:              }
  32:          else
  33:            elem.focus();
  34:          }
  35:      }
  36:  }
  37:   
  38:  function getPosition(amtFld) {
  39:       var iCaretPos = 0;
  40:       if (document.selection) { 
  41:         amtFld.focus ();
  42:         var oSel = document.selection.createRange ();
  43:         oSel.moveStart ('character', - amtFld.value.length);
  44:         iCaretPos = oSel.text.length;
  45:       }
  46:       else if (amtFld.selectionStart || amtFld.selectionStart == '0')
  47:         iCaretPos = amtFld.selectionStart;
  48:       return(iCaretPos);
  49:     }

 

If you have any ideas for improving this code, please feel free to post in in a comment. I’m not a highly experienced or knowledgeable JavaScript coder so there if probably a better way to do this. 

Share
Posted in Code | Leave a comment

Decision Maker – Easily build decision guides and trouble shooters with this jQuery script.

View example

Business processes are getting increasingly more complex. To help people perform processes correctly we often resort to training or providing some type of reference material. that’s typically on the corporate intranet. Since the processes are often governed by a complex set of rules a person must read and remember all the different conditions and rules that must be applied to a process. If the process is complicated and not performed very often, the error rate goes up along with the number of support calls.

image This article presents a technique that uses a jQuery function to enable process experts to create decision guide or trouble shooter by simply entering information in an HTML table using a visual web page editor.  When the page is viewed, the jQuery script reads the table and presents the first question along with the options.

When a person clicks an option/answer, the script finds and presents the next question. This continues until the final answer is found.  Each question is displayed below the previous question so a person can see the flow of questions and quickly take another course by skipping back to the first or any previous question.

Here is what the table might look like.

# Question/Heading Options/Answer
1 What’s wrong with the printer
  • It does not print
  • It prints but the text is too light
  • The paper is crimpled
  • It doesn’t print the whole document
2 Does the printer make any noise?
  • It does not make any noise
  • It makes a loud and unusual noise
  • It makes the normal noise
3 How light is the print?
  • It’s not readable
  • The colors aren’t right
  • It’s readable but not as dark as expected
4 The printer needs to be replaced. Follow these procedures for requesting a replacement printer.

The first column contains unique number from 1 to whatever is required. The second column contains the questions or a heading for a final answer. The 3rd column contains a bullet list of options for each question or the final answer.  Each of the options in the bullet list has an id attribute that matches the number of the table row that’s presented when the bullet item is clicked. The HTML would be <li id=”3”>The paper is crimpled</li>. Since many visual editors allow authors to add attribute values it would not be necessary for an author to view the HTML code.

View example

View code on JSFiddle

To utilize the script you need to:

  1. Add a link to the jQuery js file
  2. Copy and paste the function and css from the example page
  3. Add a table with id=”questions” in the table tag.
  4. Have an expert enter the questions and answers.

Including an “Don’t know” or “Not sure” option/answer with each question provides an opportunity to present information about how to find an answer to a question.

This electronic performance support system (EPSS) can help you to reduce process errors, improve service, and reduce support calls.

Share
Posted in Code, Ideas | 16 Comments

Usable Long Content Pages using jQuery

image When developing content for a corporate Intranet it can be difficult to avoid creating long scrolling content pages. Dividing the content into a number of smaller pages doesn't always work because it can make users pogo-stick through a number of pages to find the information they need.

Sometime a page author will add jump links to the top of the page so users can jump to the section they need.  Studies by User Interface Engineering found that users are sometimes confused by these links. The links add to the length of the page and increases visual complexity.

UIE also found that users don't mind scrolling pages as long as they think the information they want is on the page. But in a long scrolling page it is sometime difficult to communicate the page content within the initial viewable area. 

Google Eye Tracking Heat Map Image More recent eye tracking studies by Software Usability Research LaboratoryJackob Nielsen, and Google seem to show that users spend most of their time looking at the top portion of the page and not much time scrolling or looking at the content below the fold.  All these studies have found that people tend to look at web pages in a F pattern were the left side and top of the page get the most views as illustrated in this heat map image.

According to Jakob Nielsen 79% of web users scan the content of pages rather than read the entire page.

Given this understanding of how people look at web pages, it would seem that an optimal design would be one where:

  1. the keywords that best communicate the content of the page appear on the left side.
  2. users did not need to scroll the page.
  3. the content could be quickly scanned.  

image This example illustrates a design of a text only content page that could meet this criteria. It uses a jQuery function similar to the one used for the usable FAQ design.  The design lets authors enter content in a simple HTML table where one column contains the section titles with keywords that contain the scent of information for the content. The content for each section is then entered in the next column. This lets the author focus on the content and not be bother with layout or entering jump links. Using a hover over to display the content for each section lets a person quickly scan the content to find what they need. Given the content and probably usage, the hover over could easily be replace with a click activation.

Share
Posted in Design | Leave a comment

Creating Usable FAQs with jQuery

imageI have to admit that I'm not a fan of FAQs (Frequently Asked Questions).  They are very text heavy and a little overwhelming. It just seems like you have to do a lot of reading to find the question and then jump to the question on a long page.  It some times seems like they are not really frequently asked questions, but just the author's way of conveying information without having to think about about organization and presentation.

My opinion of FAQs changed a little when I looked that the FAQ on NetFlix.  This is a good way to reduce the visual complexity of FAQ and simplify the navigation.

If you work for a large organization like I do, your Intranet if probably cluttered with FAQs.  Using the Netflix style of FAQ would probably be difficult to implement, because web authors are generally not web designers and would probably not have the skill to implement something like this.

There is a way to use this design while enabling your content authors to add and update their FAQs without having to touch code or worry about adding anchors or return to top links.  With this design a web author can just enter the questions and answers in a 3 column HTML table.  The first column contains the a number, the second the questions, and the third the answers.  The jQuery code hides the table when the page is loaded, reads the second column of the table to create the list of questions, and display the answer when a reader clicks or hovers over a question.

imageThis basic example shows only the questions when the page is loaded.  A person can then click on the question to view the answer.

This example uses a hover over to display the answers. It's a quicker way to scan all the answers.

If you have a long list of FAQs try this example with a built-in search functions. If a person is truly using the FAQ as they are intended - the person already has a question in mind - they can just enter a keyword and filter the list of questions to the one that might best answer their question.  The search uses John Resig's jQuery LiveSearch plugin.

To create your own usable FAQs, just view the source in an example and copy it into your own templates. You can change the CSS styles to fit the color and style of your site or intranet.

Share
Posted in Design | Leave a comment