Add Bulk Search query to search UI
authorMichael M Slusarz <slusarz@curecanti.org>
Mon, 20 Sep 2010 17:44:55 +0000 (11:44 -0600)
committerMichael M Slusarz <slusarz@curecanti.org>
Wed, 22 Sep 2010 03:20:01 +0000 (21:20 -0600)
imp/js/search.js
imp/lib/Search/Element.php
imp/search.php
imp/templates/imp/search/search.html

index d5fada4..1e13264 100644 (file)
@@ -48,6 +48,10 @@ var ImpSearch = {
             var crit = c.criteria;
 
             switch (c.element) {
+            case 'IMP_Search_Element_Bulk':
+                this.insertFilter('bulk', crit);
+                break;
+
             case 'IMP_Search_Element_Date':
                 this.insertDate(this.data.constants.index(crit.t), new Date(crit.d));
                 break;
@@ -148,6 +152,10 @@ var ImpSearch = {
                 this.insertWithin(val);
                 break;
 
+            case 'filter':
+                this.insertFilter(val);
+                break;
+
             case 'flag':
                 this.insertFlag(val);
                 break;
@@ -282,6 +290,15 @@ var ImpSearch = {
         tmp[1].activate();
     },
 
+    insertFilter: function(id, not)
+    {
+        var tmp = [
+            new Element('EM').insert(this.getLabel(id)),
+            new Element('SPAN').insert(new Element('INPUT', { checked: Boolean(not), className: 'checkbox', type: 'checkbox' })).insert(this.text.not_match)
+        ];
+        this.criteria[this.insertCriteria(tmp)] = { t: id };
+    },
+
     insertFlag: function(id, not)
     {
         var tmp = [
@@ -342,6 +359,11 @@ var ImpSearch = {
                         data.push(this.criteria[c]);
                         break;
 
+                    case 'filter':
+                        this.criteria[c].n = Number(Boolean($F($(c).down('INPUT[type=checkbox]'))));
+                        data.push(this.criteria[c]);
+                        break;
+
                     case 'flag':
                         this.criteria[c].n = Number(Boolean($F($(c).down('INPUT[type=checkbox]'))));
                         data.push({
index ce8d040..2c4694b 100644 (file)
@@ -65,12 +65,10 @@ abstract class IMP_Search_Element implements Serializable
      */
     public function serialize()
     {
-        return empty($this->_data)
-            ? null
-            : json_encode(array(
-                  self::VERSION,
-                  $this->_data
-              ));
+        return json_encode(array(
+            self::VERSION,
+            $this->_data
+        ));
     }
 
     /**
@@ -82,10 +80,6 @@ abstract class IMP_Search_Element implements Serializable
      */
     public function unserialize($data)
     {
-        if (empty($data)) {
-            return;
-        }
-
         $data = json_decode($data);
         if (!is_array($data) ||
             !isset($data[0]) ||
index a4f099d..84e66bc 100644 (file)
@@ -101,6 +101,13 @@ $criteria = array(
     ),
 );
 
+$filters = array(
+    'bulk' => array(
+        'label' => _("Bulk Messages"),
+        'type' => 'filter'
+    ),
+);
+
 /* Define some constants. */
 $constants = array(
     'date' => array(
@@ -209,6 +216,12 @@ if ($vars->criteria_form) {
             $c_list[] = new IMP_Search_Element_Or();
             break;
 
+        case 'bulk':
+            $c_list[] = new IMP_Search_Element_Bulk(
+                $val->n
+            );
+            break;
+
         case 'flag':
             /* Flag search. */
             $formdata = $imp_flags->parseFormId($val->v);
@@ -301,6 +314,7 @@ if ($vars->edit_query && $imp_search->isSearchMbox($vars->edit_query)) {
     }
 }
 
+/* Create the criteria list. */
 $c_list = $types = array();
 foreach ($criteria as $key => $val) {
     $c_list[] = array(
@@ -311,7 +325,18 @@ foreach ($criteria as $key => $val) {
 }
 $t->set('clist', $c_list);
 
-/* Create the flag_list. */
+/* Create the filter list. These are all-or-nothing searches. */
+$f_list = array();
+foreach ($filters as $key => $val) {
+    $f_list[] = array(
+        'val' => $key,
+        'label' => htmlspecialchars($val['label'])
+    );
+    $types[$key] = 'filter';
+}
+$t->set('filterlist', $f_list);
+
+/* Create the flag list. */
 $flag_set = array();
 foreach ($flist['set'] as $val) {
     $flag_set[] = array(
index c41bb66..7b2708c 100644 (file)
@@ -2,7 +2,13 @@
  <input class="hidden" name="criteria_form" id="criteria_form" value="" />
 
  <h1 class="header">
-  <strong><if:edit_query_vfolder><gettext>Edit Virtual Folder</gettext><else:edit_query_vfolder><gettext>Search</gettext></else:edit_query_vfolder></if:edit_query_vfolder></strong>
+  <strong>
+<if:edit_query_vfolder>
+   <gettext>Edit Virtual Folder</gettext>
+<else:edit_query_vfolder>
+   <gettext>Search</gettext>
+</else:edit_query_vfolder></if:edit_query_vfolder>
+  </strong>
  </h1>
 
  <div id="recent_searches_div" class="smallheader leftAlign" style="display:none">
     <option value="<tag:clist.val />"><tag:clist.label /></option>
 </loop:clist>
     <option value="" disabled="disabled">- - - - - - - - -</option>
+<loop:filterlist>
+    <option value="<tag:filterlist.val />"><tag:filterlist.label /></option>
+</loop:filterlist>
+    <option value="" disabled="disabled">- - - - - - - - -</option>
 <loop:flist>
     <option value="<tag:flist.val />"><tag:flist.label /></option>
 </loop:flist>
@@ -76,6 +86,7 @@
   <div class="item">
    <label for="search_type"><gettext>Type:</gettext></label>
    <select id="search_type" name="search_type">
+    <option value="filter"><gettext>Filter</gettext></option>
     <option value="vfolder"><gettext>Virtual Folder</gettext></option>
    </select>
   </div>