From 2b8b5de3e6c9f73bd3c67e806424639ba29b6a7e Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Tue, 12 Nov 2013 15:37:09 +0100 Subject: [PATCH] Implementing new work student view see BT#6916 --- main/inc/ajax/model.ajax.php | 39 +++++-- main/inc/lib/database.lib.php | 1 - main/work/edit_work.php | 1 + main/work/upload_from_template.php | 3 +- main/work/work.lib.php | 177 ++++++++++++++++++++--------- main/work/work_list.php | 48 ++++---- 6 files changed, 187 insertions(+), 82 deletions(-) diff --git a/main/inc/ajax/model.ajax.php b/main/inc/ajax/model.ajax.php index 46e84b121a..0c0e1e0829 100644 --- a/main/inc/ajax/model.ajax.php +++ b/main/inc/ajax/model.ajax.php @@ -167,6 +167,7 @@ switch ($action) { if ($courseInfo['show_score'] == '0') { $count = get_count_work($work_id, null, api_get_user_id()); } else { + // Only my stuff $count = get_count_work($work_id, api_get_user_id()); } break; @@ -338,7 +339,9 @@ switch ($action) { break; case 'get_work_user_list_all': if (isset($_GET['type']) && $_GET['type'] == 'simple') { - $columns = array('type', 'firstname', 'lastname', 'title', 'qualification', 'sent_date', 'qualificator_id', 'actions'); + $columns = array( + 'type', 'firstname', 'lastname', 'title', 'qualification', 'sent_date', 'qualificator_id', 'actions' + ); } else { $columns = array('type', 'firstname', 'lastname', 'title', 'sent_date', 'actions'); } @@ -347,7 +350,9 @@ switch ($action) { break; case 'get_work_user_list_others': if (isset($_GET['type']) && $_GET['type'] == 'simple') { - $columns = array('type', 'firstname', 'lastname', 'title', 'qualification', 'sent_date', 'qualificator_id', 'actions'); + $columns = array( + 'type', 'firstname', 'lastname', 'title', 'qualification', 'sent_date', 'qualificator_id', 'actions' + ); } else { $columns = array('type', 'firstname', 'lastname', 'title', 'sent_date', 'actions'); } @@ -356,7 +361,9 @@ switch ($action) { break; case 'get_work_user_list': if (isset($_GET['type']) && $_GET['type'] == 'simple') { - $columns = array('type', 'firstname', 'lastname', 'title', 'qualification', 'sent_date', 'qualificator_id', 'actions'); + $columns = array( + 'type', 'firstname', 'lastname', 'title', 'qualification', 'sent_date', 'qualificator_id', 'actions' + ); } else { $columns = array('type', 'firstname', 'lastname', 'title', 'sent_date', 'actions'); } @@ -368,7 +375,15 @@ switch ($action) { $where_condition .= " AND u.user_id = ".api_get_user_id(); $result = get_work_user_list($start, $limit, $sidx, $sord, $work_id, $where_condition); } else { - $result = get_work_user_list_from_documents($start, $limit, $sidx, $sord, $work_id, api_get_user_id(), $where_condition); + $result = get_work_user_list_from_documents( + $start, + $limit, + $sidx, + $sord, + $work_id, + api_get_user_id(), + $where_condition + ); } break; case 'get_exercise_results': @@ -376,7 +391,9 @@ switch ($action) { // Used inside get_exam_results_data() $documentPath = api_get_path(SYS_COURSE_PATH) . $course['path'] . "/document"; if ($is_allowedToEdit) { - $columns = array('firstname', 'lastname', 'username', 'group_name', 'exe_duration', 'start_date', 'exe_date', 'score', 'status', 'lp', 'actions'); + $columns = array( + 'firstname', 'lastname', 'username', 'group_name', 'exe_duration', 'start_date', 'exe_date', 'score', 'status', 'lp', 'actions' + ); } $result = get_exam_results_data($start, $limit, $sidx, $sord, $exercise_id, $where_condition); break; @@ -387,7 +404,9 @@ switch ($action) { $result = get_exam_results_hotpotatoes_data($start, $limit, $sidx, $sord, $hotpot_path, $where_condition); //get_exam_results_data($start, $limit, $sidx, $sord, $exercise_id, $where_condition); break; case 'get_sessions': - $columns = array('name', 'nbr_courses', 'nbr_users', 'category_name', 'date_start','date_end', 'coach_name', 'session_active', 'visibility'); + $columns = array( + 'name', 'nbr_courses', 'nbr_users', 'category_name', 'date_start','date_end', 'coach_name', 'session_active', 'visibility' + ); $result = SessionManager::get_sessions_admin( array( 'where' => $where_condition, @@ -399,11 +418,15 @@ switch ($action) { case 'get_timelines': $columns = array('headline', 'actions'); - if(!in_array($sidx, $columns)) { + if (!in_array($sidx, $columns)) { $sidx = 'headline'; } $course_id = api_get_course_int_id(); - $result = Database::select('*', $obj->table, array('where' => array('parent_id = ? AND c_id = ?' => array('0', $course_id)), 'order'=>"$sidx $sord", 'LIMIT'=> "$start , $limit")); + $result = Database::select( + '*', + $obj->table, + array('where' => array('parent_id = ? AND c_id = ?' => array('0', $course_id)), 'order'=>"$sidx $sord", 'LIMIT'=> "$start , $limit") + ); $new_result = array(); foreach ($result as $item) { if (!$item['status']) { diff --git a/main/inc/lib/database.lib.php b/main/inc/lib/database.lib.php index d6b532ab8c..b9d3ffbb45 100644 --- a/main/inc/lib/database.lib.php +++ b/main/inc/lib/database.lib.php @@ -1174,7 +1174,6 @@ class Database { } $sql = "SELECT $clean_columns FROM $table_name $conditions"; - $result = self::query($sql); $array = array(); //if (self::num_rows($result) > 0 ) { diff --git a/main/work/edit_work.php b/main/work/edit_work.php index 1f21805f59..6271ce8e65 100644 --- a/main/work/edit_work.php +++ b/main/work/edit_work.php @@ -108,6 +108,7 @@ if ($form->validate()) { } if ($edit_check) { + updateWork($workId, $params, $courseInfo); updatePublicationAssignment($workId, $params, $courseInfo, $group_id); updateDirName($workData, $params['new_dir']); diff --git a/main/work/upload_from_template.php b/main/work/upload_from_template.php index 6785162b39..9b5a7851fb 100644 --- a/main/work/upload_from_template.php +++ b/main/work/upload_from_template.php @@ -67,7 +67,8 @@ $form->addElement('hidden', 'document_id', $documentId); $form->addElement('hidden', 'id', $work_id); $form->addElement('hidden', 'sec_token', $token); -$documentTemplateData = getDocumentTemplateFromWork($work_id, $course_info); +$documentTemplateData = getDocumentTemplateFromWork($work_id, $course_info, $documentId); + if (!empty($documentTemplateData)) { $defaults['title'] = $userInfo['complete_name'].'_'.$documentTemplateData['title'].'_'.substr(api_get_utc_datetime(), 0, 10); $defaults['description'] = $documentTemplateData['file_content']; diff --git a/main/work/work.lib.php b/main/work/work.lib.php index a336d88d68..6f53a46fef 100644 --- a/main/work/work.lib.php +++ b/main/work/work.lib.php @@ -1671,36 +1671,55 @@ function get_work_user_list_from_documents( if ($getCount) { $select = " SELECT count() as count "; } else { - $select = " SELECT DISTINCT u.firstname, u.lastname, u.user_id, d.title, d.id as document_id"; + $select1 = " SELECT DISTINCT u.firstname, u.lastname, u.user_id, w.title, w.document_id document_id, w.id"; + $select2 = " SELECT DISTINCT u.firstname, u.lastname, u.user_id, d.title, d.id document_id, 0"; } - $table = Database::get_course_table(TABLE_STUDENT_PUBLICATION_REL_DOCUMENT); $documentTable = Database::get_course_table(TABLE_DOCUMENT); $workTable = Database::get_course_table(TABLE_STUDENT_PUBLICATION); + $workRelDocument = Database::get_course_table(TABLE_STUDENT_PUBLICATION_REL_DOCUMENT); $userTable = Database::get_main_table(TABLE_MAIN_USER); - $courseTable = Database::get_main_table(TABLE_MAIN_COURSE); - $courseRelUserTable = Database::get_main_table(TABLE_MAIN_COURSE_USER); $courseId = api_get_course_int_id(); $sessionId = api_get_session_id(); $userCondition = null; - if (!empty($studentId )) { - $studentId = intval($studentId); - $userCondition = "AND cu.user_id = $studentId "; - } - - $sql = " $select FROM $userTable u - INNER JOIN $courseRelUserTable as cu ON (cu.user_id = u.user_id) - INNER JOIN $courseTable c ON (c.code = cu.course_code) - LEFT JOIN $table w_rel_doc ON (w_rel_doc.c_id = c.id) - INNER JOIN $documentTable d ON (d.id = w_rel_doc.document_id AND d.c_id = w_rel_doc.c_id) - LEFT JOIN $workTable w ON (w_rel_doc.c_id = w.c_id AND w.filetype = 'file' ) - WHERE - d.c_id = $courseId - $userCondition - $whereCondition"; + if (empty($studentId)) { + $studentId = api_get_user_id(); + } + $studentId = intval($studentId); + $userCondition = " AND u.user_id = $studentId "; + $sessionCondition = " AND w.session_id = $sessionId "; + + $sql = " ( + $select1 FROM $userTable u + INNER JOIN $workTable w ON (u.user_id = w.user_id AND w.active = 1 AND w.filetype = 'file') + WHERE + w.c_id = $courseId + $userCondition + $sessionCondition + $whereCondition + + ) UNION ( + $select2 FROM $workTable w + INNER JOIN $workRelDocument w_rel ON (w_rel.work_id = w.id AND w.active = 1) + INNER JOIN $documentTable d ON (w_rel.document_id = d.id AND d.c_id = w.c_id) + INNER JOIN $userTable u ON (u.user_id = $studentId) + WHERE + w.c_id = $courseId + $sessionCondition AND + d.id NOT IN + (SELECT w.document_id id FROM $workTable w + WHERE + user_id = $studentId AND + c_id = $courseId AND + filetype = 'file' AND + active = 1 + $sessionCondition + ) + ) + "; $start = intval($start); $limit = intval($limit); @@ -1710,6 +1729,7 @@ function get_work_user_list_from_documents( $sql .= " ORDER BY $column $direction"; $sql .= " LIMIT $start, $limit"; + $result = Database::query($sql); $currentUserId = api_get_user_id(); @@ -1719,41 +1739,75 @@ function get_work_user_list_from_documents( return $result['count']; } else { $workList = array(); + $urlAdd = api_get_path(WEB_CODE_PATH).'work/upload_from_template.php?'.api_get_cidreq(); $urlEdit = api_get_path(WEB_CODE_PATH).'work/edit.php?'.api_get_cidreq(); + $urlDelete = api_get_path(WEB_CODE_PATH).'work/work_list.php?action=delete&'.api_get_cidreq(); + $urlView = api_get_path(WEB_CODE_PATH).'work/view.php?'.api_get_cidreq(); + $editIcon = Display::return_icon('edit.png', get_lang('Edit')); $addIcon = Display::return_icon('add.png', get_lang('Add')); + $deleteIcon = Display::return_icon('delete.png', get_lang('Delete')); + $viewIcon = Display::return_icon('default.png', get_lang('View')); + + $allowEdition = api_get_course_setting('student_delete_own_publication'); while ($row = Database::fetch_array($result, 'ASSOC')) { $userId = $row['user_id']; $documentId = $row['document_id']; + $itemId = $row['id']; + + if (empty($documentId)) { + $url = $urlEdit.'&item_id='.$row['id'].'&id='.$workId; + $editLink = Display::url($editIcon, $url); + if ($allowEdition == false) { + $editLink = null; + } + } else { + $documentToWork = getDocumentToWorkPerUser($documentId, $workId, $courseId, $sessionId, $userId); + if (empty($documentToWork)) { + $url = $urlAdd.'&document_id='.$documentId.'&id='.$workId; + $editLink = Display::url($addIcon, $url); + } else { + + $row['title'] = $documentToWork['title']; + $row['sent_date'] = $documentToWork['sent_date']; + $newWorkId = $documentToWork['id']; + $url = $urlEdit.'&item_id='.$newWorkId.'&id='.$workId; + $editLink = Display::url($editIcon, $url); - $documentToWork = getDocumentToWorkPerUser($documentId, $workId, $courseId, $sessionId, $userId); + if ($allowEdition == false) { + $editLink = null; + } + } + } - if (empty($documentToWork)) { - $url = $urlAdd.'&document_id='.$documentId.'&id='.$workId; - $link = Display::url($addIcon, $url); + if ($allowEdition && !empty($itemId)) { + $deleteLink = Display::url($deleteIcon, $urlDelete.'&item_id='.$itemId.'&id='.$workId); } else { - $row['title'] = $documentToWork['title']; - $row['sent_date'] = $documentToWork['sent_date']; - $newWorkId = $documentToWork['id']; - $url = $urlEdit.'&id='.$newWorkId; - $link = Display::url($editIcon, $url); + $deleteLink = null; + } + + $viewLink = null; + if (!empty($itemId)) { + $viewLink = Display::url($viewIcon, $urlView.'&id='.$itemId); } + $row['type'] = build_document_icon_tag('file', $row['file']); + if (!empty($row['sent_date'])) { $row['sent_date'] = api_get_local_time($row['sent_date']); } if ($userId == $currentUserId) { - $row['actions'] = $link; + $row['actions'] = $viewLink.$editLink.$deleteLink; } + $workList[] = $row; } } return $workList; $session_id = api_get_session_id(); - $group_id = api_get_group_id(); $course_info = api_get_course_info(api_get_course_id()); @@ -2389,18 +2443,17 @@ function user_is_author($item_id, $user_id = null) $user_id = api_get_user_id(); } - $is_author = false; - $item_to_edit_data = api_get_item_property_info(api_get_course_int_id(), 'work', $item_id, api_get_session_id()); + $is_author = false; + $data = api_get_item_property_info(api_get_course_int_id(), 'work', $item_id, api_get_session_id()); $is_allowed_to_edit = api_is_allowed_to_edit(); if ($is_allowed_to_edit) { $is_author = true; } else { - if ($item_to_edit_data['insert_user_id'] == $user_id) { + if ($data['insert_user_id'] == $user_id) { $is_author = true; } } - if (!$is_author) { //api_not_allowed(); return false; @@ -2564,12 +2617,14 @@ function getDocumentToWork($documentId, $workId, $courseId) * @param int $documentId * @param int $workId * @param int $courseId + * @param int $sessionId * @param int $userId + * @param int $active * @return array */ function getDocumentToWorkPerUser($documentId, $workId, $courseId, $sessionId, $userId, $active = 1) { - $table = Database::get_course_table(TABLE_STUDENT_PUBLICATION_REL_DOCUMENT); + $workRel = Database::get_course_table(TABLE_STUDENT_PUBLICATION_REL_DOCUMENT); $work = Database::get_course_table(TABLE_STUDENT_PUBLICATION); $documentId = intval($documentId); @@ -2579,7 +2634,7 @@ function getDocumentToWorkPerUser($documentId, $workId, $courseId, $sessionId, $ $sessionId = intval($sessionId); $active = intval($active); - $sql = "SELECT w.* FROM $work w INNER JOIN $table rel ON (w.parent_id = rel.work_id) + $sql = "SELECT w.* FROM $work w INNER JOIN $workRel rel ON (w.parent_id = rel.work_id) WHERE w.document_id = $documentId AND w.parent_id = $workId AND @@ -2737,13 +2792,17 @@ function allowOnlySubscribedUser($userId, $workId, $courseId) /** * @param int $workId * @param array $courseInfo + * @param int $documentId * @return array */ -function getDocumentTemplateFromWork($workId, $courseInfo) +function getDocumentTemplateFromWork($workId, $courseInfo, $documentId) { $documents = getAllDocumentToWork($workId, $courseInfo['real_id']); if (!empty($documents)) { foreach ($documents as $doc) { + if ($documentId != $doc['document_id']) { + continue; + } $docData = DocumentManager::get_document_data_by_id($doc['document_id'], $courseInfo['code']); $fileInfo = pathinfo($docData['path']); if ($fileInfo['extension'] == 'html') { @@ -3201,7 +3260,7 @@ function addDir($params, $user_id, $courseInfo, $group_id, $session_id) filetype = 'folder', post_group_id = '".$group_id."', sent_date = '".$today."', - qualification = '".(($params['qualification']!='') ? Database::escape_string($params['qualification']) : '') ."', + qualification = '".(($params['qualification'] != '') ? Database::escape_string($params['qualification']) : '') ."', parent_id = '', qualificator_id = '', date_of_qualification = '0000-00-00 00:00:00', @@ -3217,7 +3276,6 @@ function addDir($params, $user_id, $courseInfo, $group_id, $session_id) $id = Database::insert_id(); if ($id) { - // Folder created api_item_property_update($courseInfo, 'work', $id, 'DirectoryCreated', $user_id, $group_id); updatePublicationAssignment($id, $params, $courseInfo, $group_id); @@ -3253,6 +3311,27 @@ function agendaExistsForWork($workId, $courseInfo) return 0; } +/** + * @param int $workId + * @param array $params + * @param array $courseInfo + */ +function updateWork($workId, $params, $courseInfo) +{ + $workTable = Database::get_course_table(TABLE_STUDENT_PUBLICATION); + $filteredParams = array( + 'description' => $params['description'], + 'qualification' => $params['qualification'], + 'weight' => $params['weight'], + 'allow_text_assignment' => $params['allow_text_assignment'], + ); + Database::update( + $workTable, + $filteredParams, + array('id = ? AND c_id = ?' => array($workId, $courseInfo['real_id'])) + ); +} + /** * @param int $workId * @param array $params @@ -3381,8 +3460,6 @@ function updatePublicationAssignment($workId, $params, $courseInfo, $group_id) } } - - /** * @param int $item_id * @param array course info @@ -3407,16 +3484,15 @@ function deleteWorkItem($item_id, $courseInfo) if (($is_allowed_to_edit && $locked == false) || ($locked == false AND $is_author && api_get_course_setting('student_delete_own_publication') == 1 && $work_data['qualificator_id'] == 0)) { //we found the current user is the author - $queryString1 = "SELECT url, contains_file FROM ".$work_table." WHERE c_id = $course_id AND id = $item_id"; - $result1 = Database::query($queryString1); - $row = Database::fetch_array($result1); - + $sql = "SELECT url, contains_file FROM ".$work_table." WHERE c_id = $course_id AND id = $item_id"; + $result = Database::query($sql); + $row = Database::fetch_array($result); - if (Database::num_rows($result1) > 0) { - $queryString2 = "UPDATE $work_table SET active = 2 WHERE c_id = $course_id AND id = $item_id"; - $queryString3 = "DELETE FROM $TSTDPUBASG WHERE c_id = $course_id AND publication_id = $item_id"; - Database::query($queryString2); - Database::query($queryString3); + if (Database::num_rows($result) > 0) { + $sql = "UPDATE $work_table SET active = 2 WHERE c_id = $course_id AND id = $item_id"; + Database::query($sql); + $sql = "DELETE FROM $TSTDPUBASG WHERE c_id = $course_id AND publication_id = $item_id"; + Database::query($sql); api_item_property_update($courseInfo, 'work', $item_id, 'DocumentDeleted', api_get_user_id()); $work = $row['url']; @@ -3441,7 +3517,6 @@ function deleteWorkItem($item_id, $courseInfo) } } } - return $file_deleted; } diff --git a/main/work/work_list.php b/main/work/work_list.php index 26aa4197ea..ef29765c33 100644 --- a/main/work/work_list.php +++ b/main/work/work_list.php @@ -62,15 +62,8 @@ Display :: display_header(null); echo '
'; echo ''.Display::return_icon('back.png', get_lang('BackToWorksList'),'',ICON_SIZE_MEDIUM).''; if (api_is_allowed_to_session_edit(false, true) && !empty($workId)) { - if (empty($documentsAddedInWork)) { - echo ''; - echo Display::return_icon('upload_file.png', get_lang('UploadADocument'), '', ICON_SIZE_MEDIUM).''; - } - if (!empty($documentsAddedInWork)) { - /*echo ''; - echo Display::return_icon('import_html.png', get_lang('UploadFromTemplate'), '', ICON_SIZE_MEDIUM).'';*/ - } - + echo ''; + echo Display::return_icon('upload_file.png', get_lang('UploadADocument'), '', ICON_SIZE_MEDIUM).''; } echo '
'; @@ -83,16 +76,29 @@ if (!empty($my_folder_data['description'])) { echo '

'.get_lang('Description').':

'.Security::remove_XSS($my_folder_data['description']).'

'; } -//echo $documentsAddedInWork; +$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : null; +$item_id = isset($_REQUEST['item_id']) ? intval($_REQUEST['item_id']) : null; + +switch ($action) { + case 'delete': + $file_deleted = deleteWorkItem($item_id, $courseInfo); + + if (!$file_deleted) { + Display::display_error_message(get_lang('YouAreNotAllowedToDeleteThisDocument')); + } else { + Display::display_confirmation_message(get_lang('TheDocumentHasBeenDeleted')); + } + break; +} $result = getWorkDateValidationStatus($work_data); echo $result['message']; - $check_qualification = intval($my_folder_data['qualification']); if (!empty($work_data['enable_qualification']) && !empty($check_qualification)) { $type = 'simple'; + $columns = array( get_lang('Type'), get_lang('FirstName'), @@ -105,14 +111,14 @@ if (!empty($work_data['enable_qualification']) && !empty($check_qualification)) ); $column_model = array ( - array('name'=>'type', 'index'=>'file', 'width'=>'12', 'align'=>'left', 'search' => 'false'), - array('name'=>'firstname', 'index'=>'firstname', 'width'=>'35', 'align'=>'left', 'search' => 'true'), - array('name'=>'lastname', 'index'=>'lastname', 'width'=>'35', 'align'=>'left', 'search' => 'true'), - array('name'=>'title', 'index'=>'title', 'width'=>'40', 'align'=>'left', 'search' => 'false', 'wrap_cell' => 'true'), - array('name'=>'qualification', 'index'=>'qualification', 'width'=>'20', 'align'=>'left', 'search' => 'true'), - array('name'=>'sent_date', 'index'=>'sent_date', 'width'=>'50', 'align'=>'left', 'search' => 'true', 'wrap_cell' => 'true'), + array('name'=>'type', 'index'=>'file', 'width'=>'12', 'align'=>'left', 'search' => 'false'), + array('name'=>'firstname', 'index'=>'firstname', 'width'=>'35', 'align'=>'left', 'search' => 'true'), + array('name'=>'lastname', 'index'=>'lastname', 'width'=>'35', 'align'=>'left', 'search' => 'true'), + array('name'=>'title', 'index'=>'title', 'width'=>'40', 'align'=>'left', 'search' => 'false', 'wrap_cell' => 'true'), + array('name'=>'qualification', 'index'=>'qualification', 'width'=>'20', 'align'=>'left', 'search' => 'true'), + array('name'=>'sent_date', 'index'=>'sent_date', 'width'=>'20', 'align'=>'left', 'search' => 'true', 'wrap_cell' => 'true'), array('name'=>'qualificator_id','index'=>'qualificator_id', 'width'=>'30', 'align'=>'left', 'search' => 'true'), - array('name'=>'actions', 'index'=>'actions', 'width'=>'40', 'align'=>'left', 'search' => 'false', 'sortable'=>'false') + array('name'=>'actions', 'index'=>'actions', 'width'=>'40', 'align'=>'left', 'search' => 'false', 'sortable'=>'false') ); } else { $type = 'complex'; @@ -130,9 +136,9 @@ if (!empty($work_data['enable_qualification']) && !empty($check_qualification)) array('name'=>'type', 'index'=>'file', 'width'=>'12', 'align'=>'left', 'search' => 'false'), array('name'=>'firstname', 'index'=>'firstname', 'width'=>'35', 'align'=>'left', 'search' => 'true'), array('name'=>'lastname', 'index'=>'lastname', 'width'=>'35', 'align'=>'left', 'search' => 'true'), - array('name'=>'title', 'index'=>'title', 'width'=>'40', 'align'=>'left', 'search' => 'false', 'wrap_cell' => "true"), - array('name'=>'sent_date', 'index'=>'sent_date', 'width'=>'50', 'align'=>'left', 'search' => 'true', 'wrap_cell' => 'true'), - array('name'=>'actions', 'index'=>'actions', 'width'=>'40', 'align'=>'left', 'search' => 'false', 'sortable'=>'false') + array('name'=>'title', 'index'=>'title', 'width'=>'60', 'align'=>'left', 'search' => 'false', 'wrap_cell' => "true"), + array('name'=>'sent_date', 'index'=>'sent_date', 'width'=>'30', 'align'=>'left', 'search' => 'true', 'wrap_cell' => 'true', 'sortable'=>'false'), + array('name'=>'actions', 'index'=>'actions', 'width'=>'20', 'align'=>'left', 'search' => 'false', 'sortable'=>'false') ); }