diff -Naur casetracker-beta8/casetracker.views.inc casetracker/casetracker.views.inc --- casetracker-beta8/casetracker.views.inc 2010-04-28 03:48:28.000000000 +0200 +++ casetracker/casetracker.views.inc 2010-07-26 00:06:44.000000000 +0200 @@ -152,7 +152,75 @@ 'help' => t('Sort by Case Tracker state name.'), ), ); - + // OK, this gets a bit tricky here. To be able to SORT on state (priority, + // type and status) weights, {casetracker_case_states} needs to be + // INNER JOINed for each one, with unique table aliases (of course). + $data['casetracker_case_states_priority']['table']['group'] = t('Case Tracker'); + $data['casetracker_case_states_priority']['table']['join'] = array( + 'node' => array( + 'table' => 'casetracker_case_states', + 'field' => 'csid', + 'left_table' => 'casetracker_case', + 'left_field' => 'case_priority_id', + 'type' => 'INNER', + ), + ); + $data['casetracker_case_states_priority']['priority_weight'] = array( + 'title' => t('Priority weight'), + 'sort' => array( + 'handler' => 'casetracker_views_handler_sort_priority_weight', + 'help' => t('Sort by Case Tracker priority weight.'), + ), + 'field' => array( + 'handler' => 'casetracker_views_handler_field_state_name', + 'help' => t('Display the priority of the case.'), + 'click sortable' => TRUE, + ), + ); + $data['casetracker_case_states_status']['table']['group'] = t('Case Tracker'); + $data['casetracker_case_states_status']['table']['join'] = array( + 'node' => array( + 'table' => 'casetracker_case_states', + 'field' => 'csid', + 'left_table' => 'casetracker_case', + 'left_field' => 'case_status_id', + 'type' => 'INNER', + ), + ); + $data['casetracker_case_states_status']['status_weight'] = array( + 'title' => t('Status weight'), + 'sort' => array( + 'handler' => 'casetracker_views_handler_sort_status_weight', + 'help' => t('Sort by Case Tracker status weight.'), + ), + 'field' => array( + 'handler' => 'casetracker_views_handler_field_state_name', + 'help' => t('Display the status of the case.'), + 'click sortable' => TRUE, + ), + ); + $data['casetracker_case_states_type']['table']['group'] = t('Case Tracker'); + $data['casetracker_case_states_type']['table']['join'] = array( + 'node' => array( + 'table' => 'casetracker_case_states', + 'field' => 'csid', + 'left_table' => 'casetracker_case', + 'left_field' => 'case_type_id', + 'type' => 'INNER', + ), + ); + $data['casetracker_case_states_type']['type_weight'] = array( + 'title' => t('Type weight'), + 'sort' => array( + 'handler' => 'casetracker_views_handler_sort_type_weight', + 'help' => t('Sort by Case Tracker type weight.'), + ), + 'field' => array( + 'handler' => 'casetracker_views_handler_field_state_name', + 'help' => t('Display the type of the case.'), + 'click sortable' => TRUE, + ), + ); return $data; } @@ -205,6 +273,9 @@ 'casetracker_views_handler_field_case_count' => array( 'parent' => 'views_handler_field', ), + 'casetracker_views_handler_field_state_name' => array( + 'parent' => 'views_handler_field', + ), // ---------- Filters ---------- // filters: casetracker_case @@ -246,7 +317,18 @@ ), 'casetracker_views_handler_filter_project' => array( 'parent' => 'views_handler_filter', - ) + ), + + // sorts + 'casetracker_views_handler_sort_priority_weight' => array( + 'parent' => 'views_handler_sort', + ), + 'casetracker_views_handler_sort_status_weight' => array( + 'parent' => 'views_handler_sort', + ), + 'casetracker_views_handler_sort_type_weight' => array( + 'parent' => 'views_handler_sort', + ), ), ); } diff -Naur casetracker-beta8/includes/casetracker_views_handler_field_state_name.inc casetracker/includes/casetracker_views_handler_field_state_name.inc --- casetracker-beta8/includes/casetracker_views_handler_field_state_name.inc 1970-01-01 01:00:00.000000000 +0100 +++ casetracker/includes/casetracker_views_handler_field_state_name.inc 2010-07-25 23:56:30.000000000 +0200 @@ -0,0 +1,29 @@ +table_alias, + // so call to casetracker_case_state_load() is not needed - all we have to + // do is ensure that the case_state_name field is in the field list, too. + $this->ensure_my_table(); + $this->query->add_field($this->table_alias, 'case_state_name'); + // To have the table-based click sorting work as well, we are doing a + // dirty little trick here. The click sort algorith does not seem to use + // the sort handler, but relies on $this->field_alias defined here. So we + // add that, and use the case_state_name field anyway to render the field + // (see below), which was just added above. + $this->field_alias = $this->query->add_field($this->table_alias, 'weight'); + } + + function render($values) { + $field = $this->table_alias . '_case_state_name'; + return $values->$field; + } +} diff -Naur casetracker-beta8/includes/casetracker_views_handler_sort_priority_weight.inc casetracker/includes/casetracker_views_handler_sort_priority_weight.inc --- casetracker-beta8/includes/casetracker_views_handler_sort_priority_weight.inc 1970-01-01 01:00:00.000000000 +0100 +++ casetracker/includes/casetracker_views_handler_sort_priority_weight.inc 2010-07-25 23:57:00.000000000 +0200 @@ -0,0 +1,13 @@ +ensure_my_table(); + $this->query->add_orderby('casetracker_case_states_priority', 'weight', $this->options['order']); + } +} + diff -Naur casetracker-beta8/includes/casetracker_views_handler_sort_status_weight.inc casetracker/includes/casetracker_views_handler_sort_status_weight.inc --- casetracker-beta8/includes/casetracker_views_handler_sort_status_weight.inc 1970-01-01 01:00:00.000000000 +0100 +++ casetracker/includes/casetracker_views_handler_sort_status_weight.inc 2010-07-26 00:08:43.000000000 +0200 @@ -0,0 +1,13 @@ +ensure_my_table(); + $this->query->add_orderby('casetracker_case_states_status', 'weight', $this->options['order']); + } +} + diff -Naur casetracker-beta8/includes/casetracker_views_handler_sort_type_weight.inc casetracker/includes/casetracker_views_handler_sort_type_weight.inc --- casetracker-beta8/includes/casetracker_views_handler_sort_type_weight.inc 1970-01-01 01:00:00.000000000 +0100 +++ casetracker/includes/casetracker_views_handler_sort_type_weight.inc 2010-07-26 00:08:53.000000000 +0200 @@ -0,0 +1,13 @@ +ensure_my_table(); + $this->query->add_orderby('casetracker_case_states_type', 'weight', $this->options['order']); + } +} +