Author Topic: Sort Content in Order  (Read 4884 times)

Leo Chu

  • GuiXT Forum
  • Newbie
  • *
  • Posts: 16
    • View Profile
Sort Content in Order
« on: February 18, 2016, 04:06:13 PM »
LiquidUI: Sort Content in Order

This example is to provide sorted view of array content.
User is able to click on each column-header-like button to sort the data set with different order based on each column.
In the example, the sorting order follows non-> ascending-> descending-> non for each button.


Step 1: Create user interface
//User interface

//If default flag is not set to true, execute setDefault function
if(!z_default_flag){
   setDefault();
}

clearscreen();

pushbutton([1,5], "&V[btn_sort_icon_0]Make", "?", {"process":sortContent, "size":[1,15], "using":{"col":"0"}});
pushbutton([1,21], "&V[btn_sort_icon_1]Model", "?", {"process":sortContent, "size":[1,20], "using":{"col":"1"}});
pushbutton([1,42], "&V[btn_sort_icon_2]Year", "?", {"process":sortContent, "size":[1,10], "using":{"col":"2"}});
pushbutton([1,53], "&V[btn_sort_icon_3]Color", "?", {"process":sortContent, "size":[1,10], "using":{"col":"3"}});
pushbutton([1,64], "&V[btn_sort_icon_4]Door", "?", {"process":sortContent, "size":[1,10], "using":{"col":"4"}});
pushbutton([1,75], "&V[btn_sort_icon_5]HatchBack", "?", {"process":sortContent, "size":[1,15], "using":{"col":"5"}});

box([2,5], [12,19]);
box([2,21], [12,40]);
box([2,42], [12,51]);
box([2,53], [12,62]);
box([2,64], [12,73]);
box([2,75], [12,89]);

for(var i=start_row; i<end_row; i++){
   text([2+i,7], data_ary[0]);
   text([2+i,23], data_ary[1]);
   text([2+i,45], data_ary[2]);
   text([2+i,55], data_ary[3]);
   text([2+i,69], data_ary[4]);
   
   set("V[check_&V]", data_ary[5]);
   checkbox([2+i,82], "", {"name":"check_&V", "readonly":true});
}
Note: Variables "btn_sort_icon_0" to "btn_sort_icon_5" are defaulted to be empty, and they are used to display corresponding icon when sort
      Variable "start_row" is always 0, but "end_row" is dynamically changing based on the length of data set



Step 2: Create function to default data set and variables
//Function to default all variables and data
function setDefault(){
   //Default all button icons to be empty
   btn_sort_icon_0 = "";
   btn_sort_icon_1 = "";
   btn_sort_icon_2 = "";
   btn_sort_icon_3 = "";
   btn_sort_icon_4 = "";
   btn_sort_icon_5 = "";
   
   //Default data array for display
   data_ary = [];
   data_ary.push(["Honda", "Accord", "2009", "Metallic", "5", " "]);
   data_ary.push(["Acura", "RSX", "2002", "Red", "2", "X"]);
   data_ary.push(["Scion", "tC", "2014", "White", "2", "X"]);
   data_ary.push(["Honda", "Accord", "2014", "Black", "5", " "]);
   data_ary.push(["Toyota", "Corolla", "2014", "Red", "5", " "]);
   data_ary.push(["Mazda", "5", "2008", "Blue", "5", "X"]);
   data_ary.push(["BMW", "X1", "2015", "Black", "5", "X"]);
   data_ary.push(["Mini", "Cooper", "2014", "Green", "5", "X"]);
   
   //Create a backup for data array
   data_ary_bkup = [];
   for(var i=0; i<data_ary.length; i++){
      data_ary_bkup.push(data_ary);
   }
   
   //Set start and end value for display
   start_row = 0;
   end_row = data_ary.length;
   
   //Default an array to store sorting status for each column
   sort_order_ary = [];
   for(var i=0; i<6; i++){
      sort_order_ary.push("X");
   }
   
   //Set default flag to true fore only run default function one time
   z_default_flag = true;
}
Note: Array "data_ary_bkup " is to resume data set


Step 3: Create function to sort content
//Function to sort content
function sortContent(param){
   set("V[btn_sort_icon_*]", " ");         //Reset icon for all the button

   var column = param.col;               //Copy the value of passed column number
   if(sort_order_ary[column]=='X')         //Set the column of status array to 0 if it's defaulted to "X"
      sort_order_ary[column] = 0;
   
   if(sort_order_ary[column] == 1){
      set("V[btn_sort_icon_&V[column]]", '@0H@');
      sort_order_ary[column] = 2;         //Change column of status array to 2 (descending order)
      data_ary.sort(function (a,b) {
         a = a[column].toLowerCase();   //Convert both value to lower case for following comparison
         b = b[column].toLowerCase();
         return a == b ? 0 : (a < b ? 1 : -1);   //Compare elements. if it's the same, don't switch; else if b larger than a, switch; else, reverse
      });
   } else if(sort_order_ary[column] == 0){
      set("V[btn_sort_icon_&V[column]]", '@0I@');
      sort_order_ary[column] = 1;         //Change column of status array to 1 (ascending order)
      data_ary.sort(function (a,b) {
         a = a[column].toLowerCase();
         b = b[column].toLowerCase();
         return a == b ? 0 : (a < b ? -1 : 1);
      });   
   } else {
      set("V[btn_sort_icon_&V[column]]", ' ');   
      sort_order_ary[column] = 0;         //Change column of status array to 0 (non-sorted order)
      data_ary = [];
      for(var i=0; i<data_ary_bkup.length; i++){         //Copy data from backup array
         data_ary.push(data_ary_bkup);
      }
   }
}


See attachments for code samples
« Last Edit: June 20, 2017, 01:47:36 PM by Leo Chu »