enhanced the file home view to upload multiple files and deprecated the file creation view

added the file_list table.
dropped the md5sum and summary columns from the file table
This commit is contained in:
hyung-hwan 2015-09-06 15:02:46 +00:00
parent 978bb9d359
commit c671cafa5d
16 changed files with 720 additions and 121 deletions

View File

@ -15,6 +15,10 @@ UPGRADING FROM 0.2.0
mysql> ALTER TABLE user_settings CHANGE code_hide_details code_hide_metadata CHAR(1) NOT NULL; mysql> ALTER TABLE user_settings CHANGE code_hide_details code_hide_metadata CHAR(1) NOT NULL;
mysql> ALTER TABLE site ADD COLUMN(summary VARCHAR(255) NOT NULL); mysql> ALTER TABLE site ADD COLUMN(summary VARCHAR(255) NOT NULL);
mysql> RENAME TABLE user TO user_account; mysql> RENAME TABLE user TO user_account;
mysql> ALTER TABLE file DROP INDEX encname;
mysql> INSERT INTO file_list (projectid, name, filename, encname, md5sum, description) SELECT projectid, name, name, encname, md5sum, summary FROM file WHERE md5sum != '';
mysql> ALTER TABLE file DROP COLUMN summary;
mysql> ALTER TABLE file DROP COLUMN md5sum;
INSTALLATION ON CENTOS INSTALLATION ON CENTOS

View File

@ -179,6 +179,22 @@ CREATE TABLE file (
ON DELETE RESTRICT ON UPDATE CASCADE ON DELETE RESTRICT ON UPDATE CASCADE
) charset=utf8 engine=InnoDB; ) charset=utf8 engine=InnoDB;
CREATE TABLE file_list (
projectid VARCHAR(32) NOT NULL,
name VARCHAR(255) NOT NULL,
filename VARCHAR(255) NOT NULL,
encname VARCHAR(255) NOT NULL,
md5sum CHAR(32) NOT NULL,
description VARCHAR(255) NOT NULL,
INDEX file_list_id (projectid, name),
UNIQUE KEY file_list_fileid (projectid, filename),
UNIQUE KEY (encname),
CONSTRAINT file_list_projectid FOREIGN KEY (projectid,name) REFERENCES file(projectid,name)
ON DELETE RESTRICT ON UPDATE CASCADE
) charset=utf8 engine=InnoDB;
CREATE TABLE code_review ( CREATE TABLE code_review (
projectid VARCHAR(32) NOT NULL, projectid VARCHAR(32) NOT NULL,
rev BIGINT NOT NULL, rev BIGINT NOT NULL,

View File

@ -378,19 +378,19 @@ class Code extends Controller
$import_files = array (); $import_files = array ();
for ($i = 0; $i < $post_max_item_no; $i++) for ($i = 0; $i < $post_max_item_no; $i++)
{ {
$d = $this->input->post("code_new_item_dir_$i"); $d = $this->input->post("code_new_item_dir_{$i}");
if (strlen($d) > 0) if (strlen($d) > 0)
{ {
array_push ($import_files, array ('type' => 'dir', 'name' => $d)); array_push ($import_files, array ('type' => 'dir', 'name' => $d));
} }
$d = $this->input->post("code_new_item_empfile_$i"); $d = $this->input->post("code_new_item_empfile_{$i}");
if (strlen($d) > 0) if (strlen($d) > 0)
{ {
array_push ($import_files, array ('type' => 'empfile', 'name' => $d)); array_push ($import_files, array ('type' => 'empfile', 'name' => $d));
} }
$fid = "code_new_item_file_$i"; $fid = "code_new_item_file_{$i}";
if (array_key_exists($fid, $_FILES) && $_FILES[$fid]['name'] != '') if (array_key_exists($fid, $_FILES) && $_FILES[$fid]['name'] != '')
{ {
array_push ($import_files, array ('type' => 'file', 'name' => $_FILES[$fid]['name'], 'fid' => $fid, 'unzip' => $post_unzip)); array_push ($import_files, array ('type' => 'file', 'name' => $_FILES[$fid]['name'], 'fid' => $fid, 'unzip' => $post_unzip));

View File

@ -157,7 +157,7 @@ class File extends Controller
redirect ("main/signin/" . $this->converter->AsciiTohex(current_url())); redirect ("main/signin/" . $this->converter->AsciiTohex(current_url()));
} }
$file = $this->files->get ($login['id'], $project, $name); $file = $this->files->fetch_file ($login['id'], $project, $name);
if ($file === FALSE) if ($file === FALSE)
{ {
$data['project'] = $project; $data['project'] = $project;
@ -166,8 +166,11 @@ class File extends Controller
} }
else if ($file === NULL) else if ($file === NULL)
{ {
redirect ("file/create/{$projectid}/" . /*redirect ("file/create/{$projectid}/" .
$this->converter->AsciiToHex($name)); $this->converter->AsciiToHex($name));*/
$data['project'] = $project;
$data['message'] = "CANNOT FIND FILE - {$name}";
$this->load->view ($this->VIEW_ERROR, $data);
} }
else else
{ {
@ -276,8 +279,6 @@ class File extends Controller
'file_projectid', 'project ID', 'required|alpha_dash|max_length[32]'); 'file_projectid', 'project ID', 'required|alpha_dash|max_length[32]');
$this->form_validation->set_rules ( $this->form_validation->set_rules (
'file_tag', 'tag', 'required|max_length[50]'); 'file_tag', 'tag', 'required|max_length[50]');
$this->form_validation->set_rules (
'file_summary', 'summary', 'required|max_length[255]');
$this->form_validation->set_rules ( $this->form_validation->set_rules (
'file_description', 'description', 'required'); 'file_description', 'description', 'required');
$this->form_validation->set_error_delimiters ( $this->form_validation->set_error_delimiters (
@ -293,7 +294,6 @@ class File extends Controller
$file->name = ''; $file->name = '';
$file->encname = ''; $file->encname = '';
$file->tag = $this->input->post('file_tag'); $file->tag = $this->input->post('file_tag');
$file->summary = $this->input->post('file_summary');
$file->description = $this->input->post('file_description'); $file->description = $this->input->post('file_description');
if ($this->form_validation->run()) if ($this->form_validation->run())
@ -316,6 +316,10 @@ class File extends Controller
} }
else else
{ {
$data['message'] = 'NOT SUPPORTED ANYMORE';
$data['file'] = $file;
$this->load->view ($this->VIEW_EDIT, $data);
/*
$fname = $_FILES['file_name']['name']; $fname = $_FILES['file_name']['name'];
if (strpos ($fname, ':') !== FALSE) if (strpos ($fname, ':') !== FALSE)
@ -357,7 +361,7 @@ class File extends Controller
$file->name = $_FILES['file_name']['name']; $file->name = $_FILES['file_name']['name'];
$file->encname = $upload['file_name']; $file->encname = $upload['file_name'];
$md5sum = md5_file ($upload['full_path']); $md5sum = @md5_file ($upload['full_path']);
if ($md5sum === FALSE) if ($md5sum === FALSE)
{ {
@unlink ($upload['full_path']); @unlink ($upload['full_path']);
@ -382,11 +386,13 @@ class File extends Controller
$this->converter->AsciiToHex($file->name)); $this->converter->AsciiToHex($file->name));
} }
} }
} } */
} }
} }
else else
{ {
if ($mode == 'update') $file->name = $name;
$data['message'] = $this->lang->line('MSG_FORM_INPUT_INCOMPLETE'); $data['message'] = $this->lang->line('MSG_FORM_INPUT_INCOMPLETE');
$data['file'] = $file; $data['file'] = $file;
$this->load->view ($this->VIEW_EDIT, $data); $this->load->view ($this->VIEW_EDIT, $data);
@ -431,10 +437,11 @@ class File extends Controller
} }
} }
/*
function create ($projectid = '', $name = '') function create ($projectid = '', $name = '')
{ {
return $this->_edit_file ($projectid, $name, "create"); return $this->_edit_file ($projectid, $name, "create");
} }*/
function update ($projectid = '', $name = '') function update ($projectid = '', $name = '')
{ {
@ -543,6 +550,101 @@ class File extends Controller
} }
} }
function xhr_import ($projectid = '')
{
$this->load->model ('ProjectModel', 'projects');
$this->load->model ('FileModel', 'files');
$this->load->library ('upload');
$login = $this->login->getUser ();
$revision_saved = -1;
if ($login['id'] == '')
{
$status = 'signin';
}
else
{
$project = $this->projects->get ($projectid);
if ($project === FALSE)
{
$status = "dberr - failed to get the project {$projectid}";
}
else if ($project === NULL)
{
$status = "noent - no such project {$projectid}";
}
else
{
$post_new_tag = $this->input->post('file_new_tag');
$post_new_name = $this->input->post('file_new_name');
$post_new_description = $this->input->post('file_new_description');
$post_new_file_count = $this->input->post('file_new_file_count');
if ($post_new_tag === FALSE || ($post_new_tag = trim($post_new_tag)) == '')
{
$status = 'error - no tag';
}
else if ($post_new_name === FALSE || ($post_new_name = trim($post_new_name)) == '')
{
$status = 'error - no name';
}
else if ($post_new_description === FALSE || ($post_new_description = $post_new_description) == '')
{
$status = 'error - no description';
}
else
{
if ($post_new_file_count === FALSE || $post_new_file_count <= 0) $post_new_file_count = 0;
$status = '';
$import_files = array ();
for ($i = 0; $i < $post_new_file_count; $i++)
{
$fid = "file_new_file_{$i}";
if (array_key_exists($fid, $_FILES) && $_FILES[$fid]['name'] != '')
{
$d = $this->input->post("file_new_file_desc_{$i}");
if ($d === FALSE || ($d = trim($d)) == '')
{
$status = "error - no short description for {$_FILES[$fid]['name']}";
break;
}
if (strpos($_FILES[$fid]['name'], ':') !== FALSE)
{
/* for wiki */
$status = "error - colon not allowed - {$_FILES[$fid]['name']}";
break;
}
array_push ($import_files, array ('fid' => $fid, 'name' => $_FILES[$fid]['name'], 'desc' => $d));
}
}
if ($status == '')
{
if (count($import_files) <= 0)
{
$status = 'error - no files uploaded';
}
else if ($this->files->import ($login['id'], $projectid, $post_new_tag, $post_new_name, $post_new_description, $import_files, $this->upload) === FALSE)
{
$status = 'error - ' . $this->files->getErrorMessage();
}
else
{
$status = 'ok';
}
}
}
}
print $status;
}
}
} }
?> ?>

View File

@ -2,4 +2,6 @@
$lang['FILE_MSG_NAME_NO_COLON'] = 'File name containing a colon'; $lang['FILE_MSG_NAME_NO_COLON'] = 'File name containing a colon';
$lang['FILE_MSG_NO_SUCH_FILE'] = 'No such file - %s'; $lang['FILE_MSG_NO_SUCH_FILE'] = 'No such file - %s';
$lang['FILE_MSG_NO_FILES_AVAILABLE'] = 'No files available'; $lang['FILE_MSG_NO_FILES_AVAILABLE'] = 'No files available';
$lang['FILE_FMT_TOTAL_X_FILES'] = 'Total %d file(s)';
?> ?>

View File

@ -2,4 +2,6 @@
$lang['FILE_MSG_NAME_NO_COLON'] = '파일이름에 콜론기호를 포함할 수 없습니다'; $lang['FILE_MSG_NAME_NO_COLON'] = '파일이름에 콜론기호를 포함할 수 없습니다';
$lang['FILE_MSG_NO_SUCH_FILE'] = '파일이 없습니다 - %s'; $lang['FILE_MSG_NO_SUCH_FILE'] = '파일이 없습니다 - %s';
$lang['FILE_MSG_NO_FILES_AVAILABLE'] = '사용할 수 있는 파일이 없습니다'; $lang['FILE_MSG_NO_FILES_AVAILABLE'] = '사용할 수 있는 파일이 없습니다';
$lang['FILE_FMT_TOTAL_X_FILES'] = '전체 파일 %5개';
?> ?>

View File

@ -2,6 +2,18 @@
class FileModel extends Model class FileModel extends Model
{ {
protected $errmsg = '';
function capture_error ($errno, $errmsg)
{
$this->errmsg = $errmsg;
}
function getErrorMessage ()
{
return $this->errmsg;
}
function FileModel () function FileModel ()
{ {
parent::Model (); parent::Model ();
@ -10,10 +22,46 @@ class FileModel extends Model
function get ($userid, $project, $name) function get ($userid, $project, $name)
{ {
$this->db->trans_start (); $this->db->trans_begin ();
$this->db->where ('projectid', $project->id); $this->db->where ('projectid', $project->id);
$this->db->where ('name', $name); $this->db->where ('name', $name);
$query = $this->db->get ('file'); $query = $this->db->get ('file');
if ($this->db->trans_status() === FALSE)
{
$this->db->trans_rollback();
return FALSE;
}
$result = $query->result ();
if (empty($result)) $file = NULL;
else
{
$file = $result[0];
$this->db->where ('projectid', $project->id);
$this->db->where ('name', $file->name);
$this->db->select ('filename,encname,md5sum,description');
$query = $this->db->get('file_list');
if ($this->db->trans_status() === FALSE)
{
$this->db->trans_rollback();
return FALSE;
}
$file->file_list = $query->result();
}
$this->db->trans_commit();
return $file;
}
function fetch_file ($userid, $project, $name)
{
$this->db->trans_start ();
$this->db->where ('projectid', $project->id);
$this->db->where ('filename', $name);
$query = $this->db->get ('file_list');
$this->db->trans_complete (); $this->db->trans_complete ();
if ($this->db->trans_status() === FALSE) return FALSE; if ($this->db->trans_status() === FALSE) return FALSE;
@ -24,17 +72,41 @@ class FileModel extends Model
function getAll ($userid, $project) function getAll ($userid, $project)
{ {
$this->db->trans_start (); $this->db->trans_begin ();
$this->db->where ('projectid', $project->id); $this->db->where ('projectid', $project->id);
$this->db->order_by ('tag', 'desc'); $this->db->order_by ('tag', 'desc');
$this->db->order_by ('name', 'asc'); $this->db->order_by ('name', 'asc');
$query = $this->db->get ('file'); $query = $this->db->get ('file');
$this->db->trans_complete (); if ($this->db->trans_status() === FALSE)
{
if ($this->db->trans_status() === FALSE) return FALSE; $this->db->trans_rollback();
return $query->result (); return FALSE;
} }
$files = $query->result ();
$subfiles = array ();
foreach ($files as &$f)
{
$this->db->where ('projectid', $project->id);
$this->db->where ('name', $f->name);
$this->db->select ('filename,encname,md5sum,description');
$query = $this->db->get('file_list');
if ($this->db->trans_status() === FALSE)
{
$this->db->trans_rollback();
return FALSE;
}
$f->file_list = $query->result();
}
$this->db->trans_commit ();
return $files;
}
/*
function create ($userid, $file) function create ($userid, $file)
{ {
$this->db->trans_start (); $this->db->trans_start ();
@ -42,7 +114,6 @@ class FileModel extends Model
$this->db->set ('name', $file->name); $this->db->set ('name', $file->name);
$this->db->set ('encname', $file->encname); $this->db->set ('encname', $file->encname);
$this->db->set ('tag', $file->tag); $this->db->set ('tag', $file->tag);
$this->db->set ('summary', $file->summary);
$this->db->set ('md5sum', $file->md5sum); $this->db->set ('md5sum', $file->md5sum);
$this->db->set ('description', $file->description); $this->db->set ('description', $file->description);
$this->db->set ('createdon', date('Y-m-d H:i:s')); $this->db->set ('createdon', date('Y-m-d H:i:s'));
@ -62,6 +133,7 @@ class FileModel extends Model
$this->db->trans_complete (); $this->db->trans_complete ();
return $this->db->trans_status(); return $this->db->trans_status();
} }
*/
function update ($userid, $file) function update ($userid, $file)
{ {
@ -69,7 +141,6 @@ class FileModel extends Model
$this->db->where ('projectid', $file->projectid); $this->db->where ('projectid', $file->projectid);
$this->db->where ('name', $file->name); $this->db->where ('name', $file->name);
$this->db->set ('tag', $file->tag); $this->db->set ('tag', $file->tag);
$this->db->set ('summary', $file->summary);
$this->db->set ('description', $file->description); $this->db->set ('description', $file->description);
$this->db->set ('updatedon', date('Y-m-d H:i:s')); $this->db->set ('updatedon', date('Y-m-d H:i:s'));
$this->db->set ('updatedby', $userid); $this->db->set ('updatedby', $userid);
@ -93,7 +164,7 @@ class FileModel extends Model
$this->db->where ('projectid', $file->projectid); $this->db->where ('projectid', $file->projectid);
$this->db->where ('name', $file->name); $this->db->where ('name', $file->name);
$query = $this->db->get ('file'); $query = $this->db->get ('file_list');
if ($this->db->trans_status() === FALSE) if ($this->db->trans_status() === FALSE)
{ {
$this->db->trans_rollback (); $this->db->trans_rollback ();
@ -107,11 +178,29 @@ class FileModel extends Model
return FALSE; return FALSE;
} }
$encname = $result[0]->encname; $file_names = array ();
foreach ($result as $f)
{
array_push ($file_names, $f->encname);
}
$this->db->where ('projectid', $file->projectid);
$this->db->where ('name', $file->name);
$this->db->delete ('file_list');
if ($this->db->trans_status() === FALSE)
{
$this->db->trans_rollback ();
return FALSE;
}
$this->db->where ('projectid', $file->projectid); $this->db->where ('projectid', $file->projectid);
$this->db->where ('name', $file->name); $this->db->where ('name', $file->name);
$this->db->delete ('file'); $this->db->delete ('file');
if ($this->db->trans_status() === FALSE)
{
$this->db->trans_rollback ();
return FALSE;
}
$this->db->set ('createdon', date('Y-m-d H:i:s')); $this->db->set ('createdon', date('Y-m-d H:i:s'));
$this->db->set ('type', 'file'); $this->db->set ('type', 'file');
@ -127,16 +216,133 @@ class FileModel extends Model
return FALSE; return FALSE;
} }
$file_name_count = count($file_names);
for ($i = 0; $i < $file_name_count; $i++)
{
$encname = $file_names[$i];
$path = CODEPOT_FILE_DIR . '/' . $encname; $path = CODEPOT_FILE_DIR . '/' . $encname;
if (@unlink ($path) === FALSE) if (@unlink ($path) === FALSE)
{
if ($i == 0)
{ {
$this->db->trans_rollback (); $this->db->trans_rollback ();
return FALSE; return FALSE;
} }
else
{
// there is no good way to recover from the error.
// carry on. some files will get orphaned.
}
}
}
$this->db->trans_commit ();
return TRUE;
}
private function delete_all_files ($files)
{
foreach ($files as $f) @unlink ($f);
}
private function _import ($userid, $projectid, $tag, $name, $description, $import_files, $uploader)
{
$this->db->trans_begin (); // manual transaction. not using trans_start().
$this->db->set ('projectid', $projectid);
$this->db->set ('name', $name);
$this->db->set ('encname', '');
$this->db->set ('tag', $tag);
$this->db->set ('description', $description);
$this->db->set ('createdon', date('Y-m-d H:i:s'));
$this->db->set ('createdby', $userid);
$this->db->set ('updatedon', date('Y-m-d H:i:s'));
$this->db->set ('updatedby', $userid);
$this->db->insert ('file');
if ($this->db->trans_status() === FALSE)
{
$this->errmsg = $this->db->_error_message();
$this->db->trans_rollback ();
return FALSE;
}
$config['allowed_types'] = '*';
$config['upload_path'] = CODEPOT_FILE_DIR;
$config['max_size'] = CODEPOT_MAX_UPLOAD_SIZE;
$config['encrypt_name'] = TRUE;
$config['overwrite'] = FALSE;
$config['remove_spaces'] = FALSE;
$uploader->initialize ($config);
$ok_files = array();
$file_count = count($import_files);
for ($i = 0; $i < $file_count; $i++)
{
$f = $import_files[$i];
if (!$uploader->do_upload($f['fid']))
{
$this->errmsg = "Failed to upload {$f['name']}";
$this->db->trans_rollback ();
$this->delete_all_files ($ok_files);
return FALSE;
}
$ud = $uploader->data();
array_push ($ok_files, $ud['full_path']);
$md5sum = @md5_file ($ud['full_path']);
if ($md5sum === FALSE)
{
$this->db->trans_rollback ();
$this->delete_all_files ($ok_files);
return FALSE;
}
$this->db->set ('projectid', $projectid);
$this->db->set ('name', $name);
$this->db->set ('filename', $f['name']);
$this->db->set ('encname', $ud['file_name']);
$this->db->set ('md5sum', $md5sum);
$this->db->set ('description', $f['desc']);
$this->db->insert ('file_list');
if ($this->db->trans_status() === FALSE)
{
$this->errmsg = $this->db->_error_message();
$this->db->trans_rollback ();
$this->delete_all_files ($ok_files);
return FALSE;
}
}
$this->db->set ('createdon', date('Y-m-d H:i:s'));
$this->db->set ('type', 'file');
$this->db->set ('action', 'create');
$this->db->set ('projectid', $projectid);
$this->db->set ('userid', $userid);
$this->db->set ('message', $name);
$this->db->insert ('log');
if ($this->db->trans_status() === FALSE)
{
$this->errmsg = $this->db->_error_message();
$this->db->trans_rollback ();
$this->delete_all_files ($ok_files);
return FALSE;
}
$this->db->trans_commit (); $this->db->trans_commit ();
return TRUE; return TRUE;
} }
function import ($userid, $projectid, $tag, $name, $description, $import_files, $uploader)
{
set_error_handler (array ($this, 'capture_error'));
$errmsg = '';
$x = $this->_import ($userid, $projectid, $tag, $name, $description, $import_files, $uploader);
restore_error_handler ();
return $x;
}
} }
?> ?>

View File

@ -261,7 +261,6 @@ class SubversionModel extends Model
return $fileinfo; return $fileinfo;
} }
function storeFile ($projectid, $path, $committer, $commit_message, $text) function storeFile ($projectid, $path, $committer, $commit_message, $text)
{ {
$errmsg = ''; $errmsg = '';

View File

@ -52,6 +52,8 @@ $(function () {
$("#code_file_mainarea_metadata_button").button( $("#code_file_mainarea_metadata_button").button(
"option", "label", "<?php print $this->lang->line('Hide metadata')?>"); "option", "label", "<?php print $this->lang->line('Hide metadata')?>");
} }
return false; // prevent the default behavior
}); });
$("#code_file_mainarea_edit_button").button(); $("#code_file_mainarea_edit_button").button();

View File

@ -532,6 +532,7 @@ $(function () {
$('#code_folder_mainarea_new_button').button().click (function() { $('#code_folder_mainarea_new_button').button().click (function() {
$('#code_folder_mainarea_new_form_div').dialog('open'); $('#code_folder_mainarea_new_form_div').dialog('open');
return false; // prevent the default behavior
}); });
$('#code_folder_mainarea_delete_button').button().click (function() { $('#code_folder_mainarea_delete_button').button().click (function() {
@ -545,6 +546,8 @@ $(function () {
codepot_sprintf ("<?php print addslashes($this->lang->line('CODE_FMT_DELETE_X_SELECTED_FILES')) ?>", xi) codepot_sprintf ("<?php print addslashes($this->lang->line('CODE_FMT_DELETE_X_SELECTED_FILES')) ?>", xi)
); );
$('#code_folder_mainarea_delete_form_div').dialog('open'); $('#code_folder_mainarea_delete_form_div').dialog('open');
return false; // prevent the default behavior
}); });
$('#code_folder_mainarea_rename_button').button().click (function() { $('#code_folder_mainarea_rename_button').button().click (function() {
@ -570,6 +573,8 @@ $(function () {
codepot_sprintf ("<?php print addslashes($this->lang->line('CODE_FMT_RENAME_X_SELECTED_FILES')) ?>", xi) codepot_sprintf ("<?php print addslashes($this->lang->line('CODE_FMT_RENAME_X_SELECTED_FILES')) ?>", xi)
); );
$('#code_folder_mainarea_rename_form_div').dialog('open'); $('#code_folder_mainarea_rename_form_div').dialog('open');
return false; // prevent the default behavior
}); });
<?php endif; ?> <?php endif; ?>
@ -597,6 +602,8 @@ $(function () {
$("#code_folder_mainarea_metadata_button").button( $("#code_folder_mainarea_metadata_button").button(
"option", "label", "<?php print $this->lang->line('Hide metadata')?>"); "option", "label", "<?php print $this->lang->line('Hide metadata')?>");
} }
return false;
}); });
btn = $("#code_folder_mainarea_result_info_loc_by_lang_button").button().click (function () { btn = $("#code_folder_mainarea_result_info_loc_by_lang_button").button().click (function () {
@ -638,6 +645,8 @@ $(function () {
$('#code_search_string_icon').addClass("fa-cog fa-spin"); $('#code_search_string_icon').addClass("fa-cog fa-spin");
$('#code_search_form').submit (); $('#code_search_form').submit ();
} }
return false; // prevent the default behavior
}); });
$('#code_search_invertedly').button(); $('#code_search_invertedly').button();
@ -1090,8 +1099,6 @@ $this->load->view (
</div> <!-- code_folder_mainarea_result --> </div> <!-- code_folder_mainarea_result -->
<?php if (isset($login['id']) && $login['id'] != ''): ?> <?php if (isset($login['id']) && $login['id'] != ''): ?>
<div id="code_folder_mainarea_new_form_div"> <div id="code_folder_mainarea_new_form_div">

View File

@ -33,6 +33,7 @@ $(function() {
$('#code_search_string_icon').addClass ('fa-cog fa-spin'); $('#code_search_string_icon').addClass ('fa-cog fa-spin');
$('#code_search_form').submit (); $('#code_search_form').submit ();
} }
return false; // prevent the default behavior
}); });
/* /*

View File

@ -106,17 +106,6 @@ $this->load->view (
<?php print form_error('file_tag');?> <?php print form_error('file_tag');?>
</div> </div>
<div class='form_input_label'>
<?php print form_label($this->lang->line('Summary').': ', 'file_summary')?>
<?php print form_error('file_summary');?>
</div>
<div class='form_input_field'>
<?php
$extra = 'maxlength="255" size="80"';
?>
<?php print form_input('file_summary', set_value('file_summary', $file->summary), $extra)?>
</div>
<div class='form_input_label'> <div class='form_input_label'>
<?php print form_label($this->lang->line('Description').': ', 'file_description')?> <?php print form_label($this->lang->line('Description').': ', 'file_description')?>
<a href='#' id='file_edit_mainarea_description_preview_button'><?php print $this->lang->line('Preview')?></a> <a href='#' id='file_edit_mainarea_description_preview_button'><?php print $this->lang->line('Preview')?></a>

View File

@ -10,10 +10,220 @@
<link type="text/css" rel="stylesheet" href="<?php print base_url_make('/css/file.css')?>" /> <link type="text/css" rel="stylesheet" href="<?php print base_url_make('/css/file.css')?>" />
<link type="text/css" rel="stylesheet" href="<?php print base_url_make('/css/font-awesome.min.css')?>" /> <link type="text/css" rel="stylesheet" href="<?php print base_url_make('/css/font-awesome.min.css')?>" />
<script type="text/javascript" src="<?php print base_url_make('/js/creole.js')?>"></script>
<script type="text/javascript" src="<?php print base_url_make('/js/prettify/prettify.js')?>"></script>
<script type="text/javascript" src="<?php print base_url_make('/js/prettify/lang-css.js')?>"></script>
<script type="text/javascript" src="<?php print base_url_make('/js/prettify/lang-lisp.js')?>"></script>
<script type="text/javascript" src="<?php print base_url_make('/js/prettify/lang-lua.js')?>"></script>
<script type="text/javascript" src="<?php print base_url_make('/js/prettify/lang-sql.js')?>"></script>
<script type="text/javascript" src="<?php print base_url_make('/js/prettify/lang-vb.js')?>"></script>
<script type="text/javascript" src="<?php print base_url_make('/js/jquery.min.js')?>"></script> <script type="text/javascript" src="<?php print base_url_make('/js/jquery.min.js')?>"></script>
<script type="text/javascript" src="<?php print base_url_make('/js/jquery-ui.min.js')?>"></script> <script type="text/javascript" src="<?php print base_url_make('/js/jquery-ui.min.js')?>"></script>
<link type="text/css" rel="stylesheet" href="<?php print base_url_make('/css/jquery-ui.css')?>" /> <link type="text/css" rel="stylesheet" href="<?php print base_url_make('/css/jquery-ui.css')?>" />
<script type="text/javascript">
function show_alert (outputMsg, titleMsg)
{
$('#file_home_mainarea_alert').html(outputMsg).dialog({
title: titleMsg,
resizable: true,
modal: true,
width: 'auto',
height: 'auto',
buttons: {
"OK": function () {
$(this).dialog("close");
}
}
});
}
function render_wiki(input_text)
{
creole_render_wiki_with_input_text (
input_text,
"file_home_mainarea_new_description_preview",
"<?php print site_url()?>/wiki/show/<?php print $project->id?>/",
"<?php print site_url()?>/wiki/attachment0/<?php print $project->id?>/"
);
prettyPrint ();
}
var new_item_no = 0;
var import_in_progress = false;
var populated_file_obj = [];
var populated_file_max = 0;
function populate_selected_files ()
{
var file_desc = {};
for (var n = 0; n < populated_file_max; n++)
{
var f = populated_file_obj[n];
if (f != null)
{
var d = $('#file_home_mainarea_new_file_desc_' + n);
if (d != null) file_desc[f.name] = d.val();
}
}
$('#file_home_mainarea_new_file_table').empty();
populated_file_obj = [];
var f = $('#file_home_mainarea_new_files').get(0);
var f_no = 0;
for (var n = 0; n < f.files.length; n++)
{
if (f.files[n] != null)
{
var desc = file_desc[f.files[n].name];
if (desc == null) desc = '';
$('#file_home_mainarea_new_file_table').append (
codepot_sprintf (
'<tr id="file_home_mainarea_new_file_row_%d"><td><a href="#" id="file_home_mainarea_new_file_cancel_%d" onClick="cancel_out_new_file(%d); return false;"><i class="fa fa-trash"></i></a></td><td>%s</td><td><input type="text" id="file_home_mainarea_new_file_desc_%d" size="40" value="%s" /></td></tr>',
f_no, f_no, f_no, codepot_htmlspecialchars(f.files[n].name), f_no, codepot_addslashes(desc)
)
);
populated_file_obj[f_no] = f.files[n];
f_no++;
}
}
populated_file_max = f_no;
}
function cancel_out_new_file (no)
{
$('#file_home_mainarea_new_file_row_' + no).remove ();
populated_file_obj[no] = null;
}
$(function () {
<?php if (isset($login['id']) && $login['id'] != ''): ?>
new_item_no = 0;
$('#file_home_mainarea_new_files').change (function () {
populate_selected_files ();
});
$("#file_home_mainarea_new_description_tabs").tabs ();
$("#file_home_mainarea_new_description_tabs").bind ('tabsshow', function (event, ui) {
if (ui.index == 2) render_wiki ($("#file_home_mainarea_new_description").val());
});
$('#file_home_mainarea_new_form_div').dialog (
{
title: '<?php print $this->lang->line('New');?>',
resizable: true,
autoOpen: false,
width: 'auto',
height: 'auto',
modal: true,
buttons: {
'<?php print $this->lang->line('OK')?>': function () {
if (import_in_progress) return;
if (!!window.FormData)
{
// FormData is supported
import_in_progress = true;
var form_data = new FormData();
var f_no = 0;
for (var i = 0; i <= populated_file_max; i++)
{
var f = populated_file_obj[i];
if (f != null)
{
form_data.append ('file_new_file_' + f_no, f);
var d = $('#file_home_mainarea_new_file_desc_' + i);
if (d != null) form_data.append('file_new_file_desc_' + f_no, d.val());
f_no++;
}
}
form_data.append ('file_new_file_count', f_no);
form_data.append ('file_new_tag', $('#file_home_mainarea_new_tag').val());
form_data.append ('file_new_name', $('#file_home_mainarea_new_name').val());
form_data.append ('file_new_description', $('#file_home_mainarea_new_description').val());
$('#file_home_mainarea_new_form_div').dialog('disable');
$.ajax({
url: codepot_merge_path('<?php print site_url() ?>', '<?php print "/file/xhr_import/{$project->id}"; ?>'),
type: 'POST',
data: form_data,
mimeType: 'multipart/form-data',
contentType: false,
processData: false,
cache: false,
success: function (data, textStatus, jqXHR) {
import_in_progress = false;
$('#file_home_mainarea_new_form_div').dialog('enable');
$('#file_home_mainarea_new_form_div').dialog('close');
if (data == 'ok')
{
// refresh the page to the head revision
$(location).attr ('href', codepot_merge_path('<?php print site_url(); ?>', '<?php print "/file/home/{$project->id}"; ?>'));
}
else
{
show_alert ('<pre>' + codepot_htmlspecialchars(data) + '</pre>', "<?php print $this->lang->line('Error')?>");
}
},
error: function (jqXHR, textStatus, errorThrown) {
import_in_progress = false;
$('#file_home_mainarea_new_form_div').dialog('enable');
$('#file_home_mainarea_new_form_div').dialog('close');
show_alert ('Failed - ' + errorThrown, "<?php print $this->lang->line('Error')?>");
}
});
}
else
{
show_alert ('<pre>NOT SUPPORTED</pre>', "<?php print $this->lang->line('Error')?>");
}
},
'<?php print $this->lang->line('Cancel')?>': function () {
if (import_in_progress) return;
$('#file_home_mainarea_new_form_div').dialog('close');
}
},
beforeClose: function() {
// if importing is in progress, prevent dialog closing
return !import_in_progress;
}
}
);
$("#file_home_mainarea_new_button").button().click (
function () {
$('#file_home_mainarea_new_form_div').dialog('open');
return false; // prevent the default behavior
}
);
<?php endif; ?>
});
</script>
<title><?php print htmlspecialchars($project->name)?></title> <title><?php print htmlspecialchars($project->name)?></title>
</head> </head>
@ -39,9 +249,7 @@ $this->load->view (
'project' => $project, 'project' => $project,
), ),
'ctxmenuitems' => array ( 'ctxmenuitems' => array ()
array ("file/create/{$project->id}", '<i class="fa fa-plus"></i> ' . $this->lang->line('New'))
)
) )
); );
?> ?>
@ -51,6 +259,16 @@ $this->load->view (
<div class="mainarea" id="file_home_mainarea"> <div class="mainarea" id="file_home_mainarea">
<div class="title"><?php print $this->lang->line('Files')?></div> <div class="title"><?php print $this->lang->line('Files')?></div>
<div class="infostrip">
<?php printf ($this->lang->line('FILE_FMT_TOTAL_X_FILES'), count($files)); ?>
<?php if (isset($login['id']) && $login['id'] != ''): ?>
|
<a id="file_home_mainarea_new_button" href='#'><?php print $this->lang->line('New')?></a>
<?php endif; ?>
</div>
<div class="result" id="file_home_mainarea_result"> <div class="result" id="file_home_mainarea_result">
<?php <?php
if (empty($files)) if (empty($files))
@ -99,16 +317,13 @@ else
usort ($files, 'comp_files'); usort ($files, 'comp_files');
//$download_anchor_text = '<i class="fa fa-download"></i> ' . $this->lang->line('Download');
$download_anchor_text = '<i class="fa fa-download"></i>';
print '<table id="file_home_mainarea_result_table" class="fit-width-result-table">'; print '<table id="file_home_mainarea_result_table" class="fit-width-result-table">';
print '<tr class="heading">'; print '<tr class="heading">';
print '<th>' . $this->lang->line('Tag') . '</th>'; print '<th>' . $this->lang->line('Tag') . '</th>';
print '<th colspan=2>' . $this->lang->line('Name') . '</th>'; print '<th>' . $this->lang->line('Name') . '</th>';
print '<th>' . $this->lang->line('File') . '</th>';
print '<th>' . $this->lang->line('Summary') . '</th>'; print '<th>' . $this->lang->line('Summary') . '</th>';
print '<th>' . $this->lang->line('MD5') . '</th>'; print '<th>' . $this->lang->line('MD5') . '</th>';
//print '<th>' . $this->lang->line('Download') . '</th>';
print '</tr>'; print '</tr>';
$oldtag = ''; $oldtag = '';
@ -118,32 +333,80 @@ else
{ {
$hexname = $this->converter->AsciiToHex ($file->name); $hexname = $this->converter->AsciiToHex ($file->name);
$rowclass = $rowclasses[$rownum++ % 2]; $rowclass = $rowclasses[$rownum++ % 2];
$file_list_count = count($file->file_list);
for ($i = 0; $i < $file_list_count; $i++)
{
print "<tr class='{$rowclass}'>"; print "<tr class='{$rowclass}'>";
$f = $file->file_list[$i];
$xname = $this->converter->AsciiToHex ($f->filename);
print '<td>'; print '<td>';
if ($file->tag != $oldtag) if ($i == 0 && $file->tag != $oldtag)
{ {
print htmlspecialchars($file->tag); print htmlspecialchars($file->tag);
$oldtag = $file->tag; $oldtag = $file->tag;
} }
print '</td>'; print '</td>';
print '<td>'; print '<td>';
print anchor ("file/show/{$project->id}/{$hexname}", htmlspecialchars($file->name)); if ($i == 0) print anchor ("file/show/{$project->id}/{$hexname}", htmlspecialchars($file->name));
print '</td>'; print '</td>';
print '<td>'; print '<td>';
print anchor ("file/get/{$project->id}/{$hexname}", $download_anchor_text); print anchor ("file/get/{$project->id}/{$xname}", $f->filename);
print '</td>'; print '</td>';
print '<td>'; print '<td>';
print htmlspecialchars($file->summary); print htmlspecialchars($f->description);
print '</td>'; print '</td>';
print '<td><tt>'; print '<td><tt>';
print $file->md5sum; print $f->md5sum;
print '</tt></td>'; print '</tt></td>';
print '</tr>'; print '</tr>';
} }
}
print '</table>'; print '</table>';
} }
?> ?>
</div> <!-- file_home_mainarea_result -->
<?php if (isset($login['id']) && $login['id'] != ''): ?>
<div id='file_home_mainarea_new_form_div'>
<div style='line-height: 2em;'><?php print $this->lang->line('Tag'); ?>: <input type='text' id='file_home_mainarea_new_tag' name='file_home_new_tag' /></div>
<div style='line-height: 2em;'><?php print $this->lang->line('Name'); ?>: <input type='text' id='file_home_mainarea_new_name' name='file_home_new_name' size='50'/></div>
<div id='file_home_mainarea_new_description_tabs' style='width:100%;'>
<ul>
<li><a href='#file_home_mainarea_new_file_input'><?php print $this->lang->line('Files'); ?></a></li>
<li><a href='#file_home_mainarea_new_description_input'><?php print $this->lang->line('Description'); ?></a></li>
<li><a href='#file_home_mainarea_new_description_preview'><?php print $this->lang->line('Preview'); ?></a></li>
</ul>
<div id='file_home_mainarea_new_file_input'>
<input type='file' id='file_home_mainarea_new_files' name='file_home_new_files' multiple='' autocomplete='off' style='color: transparent;' />
<table id='file_home_mainarea_new_file_table'></table>
</div>
<div id='file_home_mainarea_new_description_input'>
<textarea type='textarea' id='file_home_mainarea_new_description' name='file_home_new_description' rows=10 cols=80 style='width:100%;'></textarea>
</div>
<div id='file_home_mainarea_new_description_preview' class='form_input_preview'>
</div>
</div>
</div> </div>
<?php endif; ?>
<div id='file_home_mainarea_alert'></div>
</div> <!-- file_home_mainarea --> </div> <!-- file_home_mainarea -->
<div class='footer-pusher'></div> <!-- for sticky footer --> <div class='footer-pusher'></div> <!-- for sticky footer -->

View File

@ -89,7 +89,7 @@ $this->load->view (
), ),
'ctxmenuitems' => array ( 'ctxmenuitems' => array (
array ("file/create/{$project->id}", '<i class="fa fa-plus"></i> ' . $this->lang->line('New')), //array ("file/create/{$project->id}", '<i class="fa fa-plus"></i> ' . $this->lang->line('New')),
array ("file/update/{$project->id}/{$hexname}", '<i class="fa fa-edit"></i> ' . $this->lang->line('Edit')), array ("file/update/{$project->id}/{$hexname}", '<i class="fa fa-edit"></i> ' . $this->lang->line('Edit')),
array ("file/delete/{$project->id}/{$hexname}", '<i class="fa fa-trash"></i> ' . $this->lang->line('Delete')) array ("file/delete/{$project->id}/{$hexname}", '<i class="fa fa-trash"></i> ' . $this->lang->line('Delete'))
) )
@ -104,11 +104,7 @@ $this->load->view (
<div class="title"><?php print htmlspecialchars($file->name)?></div> <div class="title"><?php print htmlspecialchars($file->name)?></div>
<div class="infostrip" id="wiki_show_mainarea_infostrip"> <div class="infostrip" id="wiki_show_mainarea_infostrip">
<?php <a id="file_show_mainarea_metadata_button" href='#'><?php print $this->lang->line('Metadata')?></a>
$download_anchor_text = '<i class="fa fa-download"></i> ' . $this->lang->line('Download');
print anchor ("file/get/{$project->id}/". $this->converter->AsciiToHex($file->name), $download_anchor_text);
?>
| <a id="file_show_mainarea_metadata_button" href='#'><?php print $this->lang->line('Metadata')?></a>
</div> </div>
<div id="file_show_mainarea_result"> <div id="file_show_mainarea_result">
@ -131,9 +127,18 @@ $this->load->view (
<li><?php print $this->lang->line('Last updated by')?> <?php print $file->updatedby ?></li> <li><?php print $this->lang->line('Last updated by')?> <?php print $file->updatedby ?></li>
</ul> </ul>
<div class="title"><?php print $this->lang->line('MD5')?></div> <div class="title"><?php print $this->lang->line('Files')?></div>
<ul> <ul>
<li><?php print $file->md5sum ?></li> <?php
foreach ($file->file_list as $f)
{
$xname = $this->converter->AsciiToHex($f->filename);
print '<li>';
print anchor ("file/get/{$project->id}/{$xname}", $f->filename);
print " <tt>{$f->md5sum}</tt>";
print '</li>';
}
?>
</ul> </ul>
</div> <!-- file_show_mainarea_result_info --> </div> <!-- file_show_mainarea_result_info -->

View File

@ -53,6 +53,7 @@ $(function () {
$("#issue_home_mainarea_search_button").button().click ( $("#issue_home_mainarea_search_button").button().click (
function () { function () {
$('#issue_home_mainarea_search_form').dialog('open'); $('#issue_home_mainarea_search_form').dialog('open');
return false; // prevent the default behavior
} }
); );
}); });

View File

@ -594,7 +594,7 @@ body {
} }
.content .mainarea pre.line-numbered code.line-numbered-code { .content .mainarea pre.line-numbered code.line-numbered-code {
/* this should override some properties of .content .mainarea .prettyprint */ /* this should override some properties of .prettyprint */
color:black; color:black;
display:block; display:block;
@ -616,12 +616,12 @@ body {
clear:both; clear:both;
} }
.content .mainarea .prettyprint ol { .prettyprint ol {
/* this is used for line numbering when numbering is sequential. */ /* this is used for line numbering when numbering is sequential. */
white-space: pre-wrap; white-space: pre-wrap;
} }
.content .mainarea .prettyprint { .prettyprint {
/* anything that make prettyprint area different from other pres? */ /* anything that make prettyprint area different from other pres? */
/*background-color: #FFFFFF;*/ /*background-color: #FFFFFF;*/
/*border: 1px solid #ccc;*/ /*border: 1px solid #ccc;*/
@ -640,24 +640,24 @@ body {
} }
.content .prettyprint .pln { color: #222222; } .prettyprint .pln { color: #222222; }
.content .prettyprint .str { color: #AA1111; } .prettyprint .str { color: #AA1111; }
.content .prettyprint .kwd { color: #2222ff; } .prettyprint .kwd { color: #2222ff; }
.content .prettyprint .com { color: #888a88; font-style: italic; } .prettyprint .com { color: #888a88; font-style: italic; }
.content .prettyprint .typ { color: #4271ae; } .prettyprint .typ { color: #4271ae; }
.content .prettyprint .lit { color: #f5871f; } .prettyprint .lit { color: #f5871f; }
.content .prettyprint .pun { color: #4d4d4c; } .prettyprint .pun { color: #4d4d4c; }
.content .prettyprint .opn { color: #4d4d4c; } .prettyprint .opn { color: #4d4d4c; }
.content .prettyprint .clo { color: #4d4d4c; } .prettyprint .clo { color: #4d4d4c; }
.content .prettyprint .tag { color: #c82829; } .prettyprint .tag { color: #c82829; }
.content .prettyprint .atn { color: #f5871f; } .prettyprint .atn { color: #f5871f; }
.content .prettyprint .atv { color: #3e999f; } .prettyprint .atv { color: #3e999f; }
.content .prettyprint .dec { color: #f5871f; } .prettyprint .dec { color: #f5871f; }
.content .prettyprint .var { color: #c82829; } .prettyprint .var { color: #c82829; }
.content .prettyprint .fun { color: #4271ae; } .prettyprint .fun { color: #4271ae; }
/* Specify class=linenums on a pre to get line numbering */ /* Specify class=linenums on a pre to get line numbering */
.content .prettyprint ol.linenums { .prettyprint ol.linenums {
margin-top: 0; margin-top: 0;
margin-bottom: 0; margin-bottom: 0;
margin-left: 1em; margin-left: 1em;
@ -666,40 +666,40 @@ body {
} /* IE indents via margin-left */ } /* IE indents via margin-left */
/* /*
.content .prettyprint li.L0, .prettyprint li.L0,
.content .prettyprint li.L1, .prettyprint li.L1,
.content .prettyprint li.L2, .prettyprint li.L2,
.content .prettyprint li.L3, .prettyprint li.L3,
.content .prettyprint li.L5, .prettyprint li.L5,
.content .prettyprint li.L6, .prettyprint li.L6,
.content .prettyprint li.L7, .prettyprint li.L7,
.content .prettyprint li.L8 { list-style-type: none } .prettyprint li.L8 { list-style-type: none }
*/ */
/* Alternate shading for lines */ /* Alternate shading for lines */
/* /*
.content .prettyprint li.L1, .prettyprint li.L1,
.content .prettyprint li.L3, .prettyprint li.L3,
.content .prettyprint li.L5, .prettyprint li.L5,
.content .prettyprint li.L7, .prettyprint li.L7,
.content .prettyprint li.L9 { background: #eee } .prettyprint li.L9 { background: #eee }
*/ */
@media print { @media print {
.content .prettyprint .pln { color: #222222; } .prettyprint .pln { color: #222222; }
.content .prettyprint .str { color: #AA1111; } .prettyprint .str { color: #AA1111; }
.content .prettyprint .kwd { color: #2222ff; font-weight: bold; } .prettyprint .kwd { color: #2222ff; font-weight: bold; }
.content .prettyprint .com { color: #888a88; font-style: italic; } .prettyprint .com { color: #888a88; font-style: italic; }
.content .prettyprint .typ { color: #4271ae; font-weight: bold; } .prettyprint .typ { color: #4271ae; font-weight: bold; }
.content .prettyprint .lit { color: #f5871f; } .prettyprint .lit { color: #f5871f; }
.content .prettyprint .pun { color: #4d4d4c; } .prettyprint .pun { color: #4d4d4c; }
.content .prettyprint .opn { color: #4d4d4c; } .prettyprint .opn { color: #4d4d4c; }
.content .prettyprint .clo { color: #4d4d4c; } .prettyprint .clo { color: #4d4d4c; }
.content .prettyprint .tag { color: #c82829; font-weight: bold; } .prettyprint .tag { color: #c82829; font-weight: bold; }
.content .prettyprint .atn { color: #f5871f; } .prettyprint .atn { color: #f5871f; }
.content .prettyprint .atv { color: #3e999f; } .prettyprint .atv { color: #3e999f; }
.content .prettyprint .dec { color: #f5871f; } .prettyprint .dec { color: #f5871f; }
.content .prettyprint .var { color: #c82829; } .prettyprint .var { color: #c82829; }
.content .prettyprint .fun { color: #4271ae; } .prettyprint .fun { color: #4271ae; }
} }
.content .infostrip { .content .infostrip {