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:
		| @ -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 | ||||||
|  |  | ||||||
|  | |||||||
| @ -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, | ||||||
|  | |||||||
| @ -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)); | ||||||
|  | |||||||
| @ -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; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| ?> | ?> | ||||||
|  | |||||||
| @ -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)'; | ||||||
| ?> | ?> | ||||||
|  | |||||||
| @ -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개'; | ||||||
| ?> | ?> | ||||||
|  | |||||||
| @ -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; | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| ?> | ?> | ||||||
|  | |||||||
| @ -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 = ''; | ||||||
|  | |||||||
| @ -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(); | ||||||
|  | |||||||
| @ -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"> | ||||||
|  | |||||||
| @ -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 | ||||||
| 	}); | 	}); | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -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 --> | ||||||
|  | |||||||
| @ -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 --> | ||||||
|  | |||||||
| @ -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 | ||||||
| 		} | 		} | ||||||
| 	); | 	); | ||||||
| }); | }); | ||||||
|  | |||||||
| @ -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 { | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user