enhanced wiki editors with change detection and saving confirmation
This commit is contained in:
		| @ -288,180 +288,6 @@ class Wiki extends Controller | ||||
| 		return $this->_edit_wiki ($projectid, $name, 'update', $this->VIEW_EDITX); | ||||
| 	} | ||||
|  | ||||
| 	function delete ($projectid = '', $name = '') | ||||
| 	{ | ||||
| 		$this->load->helper ('form'); | ||||
| 		$this->load->library ('form_validation'); | ||||
| 		$this->load->model ('ProjectModel', 'projects'); | ||||
| 		$this->load->model ('WikiModel', 'wikis'); | ||||
|  | ||||
| 		$login = $this->login->getUser (); | ||||
| 		if ($login['id'] == '') | ||||
| 			redirect ("main/signin/" . $this->converter->AsciiTohex(current_url())); | ||||
| 		$data['login'] = $login; | ||||
|  | ||||
| 		$name = $this->converter->HexToAscii ($name); | ||||
|  | ||||
| 		$project = $this->projects->get ($projectid); | ||||
| 		if ($project === FALSE) | ||||
| 		{ | ||||
| 			$data['message'] = 'DATABASE ERROR'; | ||||
| 			$this->load->view ($this->VIEW_ERROR, $data); | ||||
| 		} | ||||
| 		else if ($project === NULL) | ||||
| 		{ | ||||
| 			$data['message'] =  | ||||
| 				$this->lang->line('MSG_NO_SUCH_PROJECT') .  | ||||
| 				" - {$projectid}"; | ||||
| 			$this->load->view ($this->VIEW_ERROR, $data); | ||||
| 		} | ||||
| 		else if (!$login['sysadmin?'] &&  | ||||
| 		         $this->projects->projectHasMember($project->id, $login['id']) === FALSE) | ||||
| 		{ | ||||
| 			$data['project'] = $project; | ||||
| 			$data['message'] = sprintf ( | ||||
| 				$this->lang->line('MSG_PROJECT_MEMBERSHIP_REQUIRED'), $projectid); | ||||
| 			$this->load->view ($this->VIEW_ERROR, $data); | ||||
| 		} | ||||
| 		else if ($this->wikihelper->_is_reserved ($name, FALSE)) | ||||
| 		{ | ||||
| 			$data['project'] = $project; | ||||
| 			$data['message'] = sprintf ( | ||||
| 				$this->lang->line('WIKI_MSG_RESERVED_WIKI_NAME'), $name); | ||||
| 			$this->load->view ($this->VIEW_ERROR, $data); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			if ($project->public !== 'Y' && $login['id'] == '') | ||||
| 			{ | ||||
| 				// non-public projects require sign-in. | ||||
| 				redirect ("main/signin/" . $this->converter->AsciiTohex(current_url())); | ||||
| 			} | ||||
|  | ||||
| 			$data['message'] = ''; | ||||
| 			$data['project'] = $project; | ||||
|  | ||||
| 			$this->form_validation->set_rules ('wiki_confirm', 'confirm', 'alpha'); | ||||
| 			$this->form_validation->set_error_delimiters('<span class="form_field_error">','</span>'); | ||||
|  | ||||
| 			if($this->input->post('wiki')) | ||||
| 			{ | ||||
| 				$wiki = new stdClass(); | ||||
| 				$wiki->projectid = $this->input->post('wiki_projectid'); | ||||
| 				$wiki->name = $this->input->post('wiki_name'); | ||||
| 				$data['wiki_confirm'] = $this->input->post('wiki_confirm'); | ||||
|  | ||||
| 				if ($this->form_validation->run()) | ||||
| 				{ | ||||
| 					if ($data['wiki_confirm'] == 'yes') | ||||
| 					{ | ||||
| 						$result = $this->wikis->delete ($login['id'], $wiki); | ||||
| 						if ($result === FALSE) | ||||
| 						{ | ||||
| 							$data['message'] = 'DATABASE ERROR'; | ||||
| 							$data['wiki'] = $wiki; | ||||
| 							$this->load->view ($this->VIEW_DELETE, $data); | ||||
| 						} | ||||
| 						else | ||||
| 						{ | ||||
| 							redirect ("wiki/home/{$project->id}"); | ||||
| 						} | ||||
| 					} | ||||
| 					else  | ||||
| 					{ | ||||
| 						redirect ("wiki/show/{$project->id}/" .  | ||||
| 							$this->converter->AsciiToHex($wiki->name)); | ||||
| 					} | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$data['message'] = $this->lang->line('MSG_FORM_INPUT_INCOMPLETE'); | ||||
| 					$data['wiki'] = $wiki; | ||||
| 					$this->load->view ($this->VIEW_DELETE, $data); | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				$wiki = $this->wikis->get ($login['id'], $project, $name); | ||||
| 				if ($wiki === FALSE) | ||||
| 				{ | ||||
| 					$data['message'] = 'DATABASE ERROR'; | ||||
| 					$this->load->view ($this->VIEW_ERROR, $data); | ||||
| 				} | ||||
| 				else if ($wiki === NULL) | ||||
| 				{ | ||||
| 					$data['message'] = $this->lang->line('WIKI_MSG_NO_SUCH_PAGE') . " - {$name}"; | ||||
| 					$this->load->view ($this->VIEW_ERROR, $data); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					$data['wiki_confirm'] = 'no'; | ||||
| 					$data['wiki'] = $wiki; | ||||
| 					$this->load->view ($this->VIEW_DELETE, $data); | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	private function _upload_attachments ($id) | ||||
| 	{ | ||||
| 		$attno = 0; | ||||
| 		$count = count($_FILES); | ||||
|  | ||||
| 		$attachments = array (); | ||||
|  | ||||
| 		for ($i = 0; $i < $count; $i++) | ||||
| 		{	 | ||||
| 			$field_name = "{$id}_{$i}"; | ||||
|  | ||||
| 			if (array_key_exists($field_name, $_FILES) && | ||||
| 			    $_FILES[$field_name]['name'] != '') | ||||
| 			{ | ||||
| 				$fname = $_FILES[$field_name]['name']; | ||||
| 				if (strpbrk($fname, CODEPOT_DISALLOWED_LETTERS_IN_FILENAME) !== FALSE) | ||||
| 				{ | ||||
| 					while ($attno > 0) | ||||
| 						@unlink ($attachments[$attno--]['fullencpath']); | ||||
| 					return array(FALSE,$this->lang->line('WIKI_MSG_ATTACHMENT_NAME_NO_COLON')); | ||||
| 				} | ||||
|  | ||||
| 				$ext = substr ($fname, strrpos ($fname, '.') + 1); | ||||
|  | ||||
| 				// delete all \" instances ... | ||||
| 				$_FILES[$field_name]['type'] = | ||||
| 					str_replace('\"', '', $_FILES[$field_name]['type']); | ||||
| 				// delete all \\ instances ... | ||||
| 				$_FILES[$field_name]['type'] = | ||||
| 					str_replace('\\', '', $_FILES[$field_name]['type']); | ||||
|  | ||||
| 				//$config['allowed_types'] = $ext; | ||||
| 				$config['allowed_types'] = '*'; | ||||
| 				$config['upload_path'] = CODEPOT_ATTACHMENT_DIR; | ||||
| 				$config['max_size'] = CODEPOT_MAX_UPLOAD_SIZE; | ||||
| 				$config['encrypt_name'] = TRUE; | ||||
|  | ||||
| 				$this->upload->initialize ($config); | ||||
| 	 | ||||
| 				if (!$this->upload->do_upload ($field_name)) | ||||
| 				{ | ||||
| 					while ($attno > 0) | ||||
| 						@unlink ($attachments[$attno--]['fullencpath']); | ||||
| 					return array(FALSE,$this->upload->display_errors('','')); | ||||
| 				} | ||||
|  | ||||
| 				$upload = $this->upload->data (); | ||||
|  | ||||
| 				$attachments[$attno++] = array ( | ||||
| 					'name' => $fname, | ||||
| 					'encname' => $upload['file_name'],  | ||||
| 					'fullencpath' => $upload['full_path']); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return array(TRUE,$attachments); | ||||
| 	} | ||||
|  | ||||
| 	/////////////////////////////////////////////////////////////////////// | ||||
| 	// Handling of attached files share the (almost) same code  | ||||
| 	// between issue.php and wiki.php. It would be way better | ||||
|  | ||||
| @ -136,5 +136,5 @@ $lang['MSG_SIGNIN_FAILURE'] = 'Cannot sign in'; | ||||
|  | ||||
| $lang['MSG_PROJECT_MEMBERSHIP_REQUIRED'] = 'You have to be a member of the %s project to perform this task'; | ||||
| $lang['MSG_FORM_INPUT_INCOMPLETE'] = 'Your input is incomplete'; | ||||
| $lang['MSG_DISCARD_CHANGES?'] = 'Do you want to discard chagnes?'; | ||||
| $lang['MSG_DISCARD_CHANGES?'] = 'Do you want to discard changes?'; | ||||
| ?> | ||||
|  | ||||
| @ -8,4 +8,7 @@ $lang['WIKI_MSG_NAME_DISALLOWED_CHARS'] = 'Wiki name contains disallowed charact | ||||
| $lang['WIKI_MSG_NO_PAGES_AVAILABLE'] = 'No wiki pages available'; | ||||
| $lang['WIKI_MSG_NO_SUCH_PAGE'] = 'No such wiki page'; | ||||
| $lang['WIKI_MSG_RESERVED_WIKI_NAME'] = 'Wiki name containing a reserved word - %s'; | ||||
|  | ||||
| $lang['WIKI_MSG_SAVE_DESPITE_NO_CHANGES?'] = "There seems to be no changes. Do you still want to save?"; | ||||
| $lang['WIKI_MSG_SAVE_IN_PROGRESS'] = 'Saving in progress, Please wait'; | ||||
| ?> | ||||
|  | ||||
| @ -133,6 +133,6 @@ $lang['MSG_SIGNIN_FAILURE'] = 'Cannot sign in'; | ||||
|  | ||||
| $lang['MSG_PROJECT_MEMBERSHIP_REQUIRED'] = 'You have to be a member of the %s project to perform this task'; | ||||
| $lang['MSG_FORM_INPUT_INCOMPLETE'] = 'Your input is incomplete'; | ||||
| $lang['MSG_DISCARD_CHANGES?'] = 'Do you want to discard chagnes?'; | ||||
| $lang['MSG_DISCARD_CHANGES?'] = 'Do you want to discard changes?'; | ||||
|  | ||||
| ?> | ||||
|  | ||||
| @ -8,4 +8,7 @@ $lang['WIKI_MSG_NAME_DISALLOWED_CHARS'] = '위키이름에 허용되지 않는  | ||||
| $lang['WIKI_MSG_NO_PAGES_AVAILABLE'] = '사용할 수 있는 위키 페이지가 없습니다'; | ||||
| $lang['WIKI_MSG_NO_SUCH_PAGE'] = '위키 페이지를 찾을수 없습니다'; | ||||
| $lang['WIKI_MSG_RESERVED_WIKI_NAME'] = '%s은(는) 사용할 수 없는 위키이름입니다'; | ||||
|  | ||||
| $lang['WIKI_MSG_SAVE_DESPITE_NO_CHANGES?'] = '변경된 내용이 없는것 같습니다. 그래도 저장하겠습니까?'; | ||||
| $lang['WIKI_MSG_SAVE_IN_PROGRESS'] = '저장중이니 잠시 기다려 주세요'; | ||||
| ?> | ||||
|  | ||||
| @ -31,7 +31,6 @@ www_DATA =  \ | ||||
| 	taskbar.php \ | ||||
| 	user_home.php \ | ||||
| 	user_settings.php \ | ||||
| 	wiki_delete.php \ | ||||
| 	wiki_edit.php \ | ||||
| 	wiki_editx.php \ | ||||
| 	wiki_home.php \ | ||||
|  | ||||
| @ -176,7 +176,6 @@ www_DATA = \ | ||||
| 	taskbar.php \ | ||||
| 	user_home.php \ | ||||
| 	user_settings.php \ | ||||
| 	wiki_delete.php \ | ||||
| 	wiki_edit.php \ | ||||
| 	wiki_editx.php \ | ||||
| 	wiki_home.php \ | ||||
|  | ||||
| @ -233,7 +233,6 @@ foreach ($urls as $url) | ||||
|  | ||||
| 				if ($log['action'] != 'revpropchange') | ||||
| 				{ | ||||
|  | ||||
| 					print '<div class="codepot-plain-text-view">'; | ||||
| 					print '<pre>'; | ||||
| 					$sm = strtok (trim ($x['message']), "\r\n"); | ||||
|  | ||||
| @ -1,90 +0,0 @@ | ||||
| <html> | ||||
|  | ||||
| <head> | ||||
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | ||||
|  | ||||
| <script type="text/javascript" src="<?php print base_url_make('/js/codepot.js')?>"></script> | ||||
| <link type="text/css" rel="stylesheet" href="<?php print base_url_make('/css/common.css')?>" /> | ||||
| <link type="text/css" rel="stylesheet" href="<?php print base_url_make('/css/wiki.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/jquery.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')?>" /> | ||||
|  | ||||
| <title><?php print htmlspecialchars($wiki->name)?></title> | ||||
| </head> | ||||
|  | ||||
| <body> | ||||
|  | ||||
| <div class="content" id="wiki_delete_content"> | ||||
|  | ||||
| <!----------------------------------------------------------------------------> | ||||
|  | ||||
| <?php $this->load->view ('taskbar'); ?> | ||||
|  | ||||
| <!----------------------------------------------------------------------------> | ||||
|  | ||||
| <?php | ||||
| $this->load->view ( | ||||
| 	'projectbar', | ||||
| 	array ( | ||||
| 		'banner' => NULL, | ||||
|  | ||||
| 		'page' => array ( | ||||
| 			'type' => 'project', | ||||
| 			'id' => 'wiki', | ||||
| 			'project' => $project, | ||||
| 		), | ||||
|  | ||||
| 		'ctxmenuitems' => array () | ||||
| 	) | ||||
| ); | ||||
| ?> | ||||
|  | ||||
| <!----------------------------------------------------------------------------> | ||||
|  | ||||
| <div class="mainarea"> | ||||
|  | ||||
| <?php if ($message != "") print '<div id="wiki_delete_message" class="form_message">'.htmlspecialchars($message).'</div>'; ?> | ||||
|  | ||||
| <div class="form_container"> | ||||
| <?php print form_open("wiki/delete/{$project->id}/".$this->converter->AsciiToHex($wiki->name))?> | ||||
|  | ||||
| 	<div> | ||||
| 		<div> | ||||
| 			<?php print form_checkbox('wiki_confirm', 'yes', set_checkbox('wiki_confirm', $wiki_confirm))?> | ||||
| 			<?php print $this->lang->line('MSG_SURE_TO_DELETE_THIS')?> - <?php print htmlspecialchars($wiki->name)?> | ||||
| 			<?php print form_error('wiki_confirm')?> | ||||
| 		</div> | ||||
| 	</div> | ||||
|  | ||||
| 	<div> | ||||
| 		<?php print form_hidden('wiki_projectid', set_value('wiki_projectid', $wiki->projectid))?> | ||||
| 		<?php print form_hidden('wiki_name', set_value('wiki_name', $wiki->name))?> | ||||
| 	</div> | ||||
|  | ||||
| 	<div> | ||||
| 		<?php print form_submit('wiki', $this->lang->line('Delete'))?> | ||||
| 	</div> | ||||
|  | ||||
| <?php print form_close();?> | ||||
| </div> | ||||
|  | ||||
| </div> <!-- mainarea --> | ||||
|  | ||||
| <div class='codepot-footer-pusher'></div> <!-- for sticky footer --> | ||||
|  | ||||
| </div>  <!-- wiki_delete_content --> | ||||
|  | ||||
| <!----------------------------------------------------------------------------> | ||||
|  | ||||
| <?php $this->load->view ('footer'); ?> | ||||
|  | ||||
| <!----------------------------------------------------------------------------> | ||||
|  | ||||
|  | ||||
| </body> | ||||
|  | ||||
| </html> | ||||
| @ -1,4 +1,6 @@ | ||||
| <html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
|  | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|  | ||||
| <head> | ||||
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | ||||
| @ -46,6 +48,7 @@ function show_alert (outputMsg, titleMsg) | ||||
| 	}); | ||||
| } | ||||
|  | ||||
|  | ||||
| var previewing_text = false; | ||||
|  | ||||
| function resize_text_editor() | ||||
| @ -127,6 +130,8 @@ function preview_text (input_text) | ||||
|  | ||||
| var populated_file_obj_for_adding = []; | ||||
| var populated_file_max_for_adding = 0; | ||||
| var cancelled_file_count_for_adding = 0; | ||||
| var killed_file_count = 0; | ||||
|  | ||||
| var original_file_name_array = [ | ||||
| 	<?php | ||||
| @ -168,10 +173,13 @@ function populate_selected_files_for_adding () | ||||
|  | ||||
| function cancel_out_add_file (no) | ||||
| { | ||||
| 	$('#wiki_edit_add_file_row_' + no).remove (); | ||||
| 	populated_file_obj_for_adding[no] = null; | ||||
|  | ||||
| 	resize_text_editor (); | ||||
| 	if (populated_file_obj_for_adding[no] != null) | ||||
| 	{ | ||||
| 		cancelled_file_count_for_adding++; | ||||
| 		$('#wiki_edit_add_file_row_' + no).remove (); | ||||
| 		populated_file_obj_for_adding[no] = null; | ||||
| 		resize_text_editor (); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function kill_file (no) | ||||
| @ -183,11 +191,13 @@ function kill_file (no) | ||||
| 		{ | ||||
| 			n.css ('text-decoration', ''); | ||||
| 			n.prop ('disabled', false); | ||||
| 			killed_file_count--; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			n.css ('text-decoration', 'line-through'); | ||||
| 			n.prop ('disabled', true); | ||||
| 			killed_file_count++; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -207,6 +217,7 @@ function update_original_file_name_array () | ||||
|  | ||||
| 	populated_file_obj_for_adding = []; | ||||
| 	populated_file_max_for_adding = 0; | ||||
| 	cancelled_file_count_for_adding = 0; | ||||
| 	$('#wiki_edit_add_files').empty(); | ||||
|  | ||||
| 	var f_no = 0; | ||||
| @ -228,6 +239,7 @@ function update_original_file_name_array () | ||||
| 	} | ||||
|  | ||||
| 	$('#wiki_edit_file_list').empty(); | ||||
| 	killed_file_count = 0; | ||||
| 	original_file_name_array = file_name_array; | ||||
| 	for (var i = 0; i < original_file_name_array.length; i++) | ||||
| 	{ | ||||
| @ -248,7 +260,6 @@ function update_original_file_name_array () | ||||
| var wiki_text_editor = null; | ||||
| var work_in_progress = false; | ||||
| var wiki_original_name = '<?php print addslashes($wiki->name); ?>'; | ||||
| var wiki_new_name = ''; | ||||
| var wiki_original_text = <?php print codepot_json_encode($wiki->text); ?>; | ||||
|  | ||||
| function show_in_progress_message (outputMsg, titleMsg) | ||||
| @ -274,6 +285,111 @@ function show_in_progress_message (outputMsg, titleMsg) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function save_wiki (wiki_new_name, wiki_new_text) | ||||
| { | ||||
| 	work_in_progress = true; | ||||
|  | ||||
| 	show_in_progress_message ('<?php print $this->lang->line('WIKI_MSG_SAVE_IN_PROGRESS'); ?>', wiki_new_name); | ||||
|  | ||||
| 	var form_data = new FormData(); | ||||
|  | ||||
| 	var f_no = 0; | ||||
| 	for (var i = 0; i < populated_file_max_for_adding; i++) | ||||
| 	{ | ||||
| 		var f = populated_file_obj_for_adding[i]; | ||||
| 		if (f != null) | ||||
| 		{ | ||||
| 			form_data.append ('wiki_file_' + f_no, f); | ||||
| 			f_no++; | ||||
| 		} | ||||
| 	} | ||||
| 	form_data.append ('wiki_file_count', f_no); | ||||
|  | ||||
| 	f_no = 0; | ||||
| 	for (var i = 0; i < original_file_name_array.length; i++) | ||||
| 	{ | ||||
| 		var n = $('#wiki_edit_file_name_' + i); | ||||
| 		if (n) | ||||
| 		{ | ||||
| 			if (n.prop('disabled')) | ||||
| 			{ | ||||
| 				form_data.append ('wiki_kill_file_name_' + f_no, original_file_name_array[i]); | ||||
| 				f_no++; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	form_data.append ('wiki_kill_file_count', f_no); | ||||
|  | ||||
| 	form_data.append ('wiki_doctype', $('#wiki_edit_doctype').val());  | ||||
| 	form_data.append ('wiki_name', wiki_new_name); | ||||
| 	form_data.append ('wiki_original_name', wiki_original_name); | ||||
| 	form_data.append ('wiki_text', wiki_new_text); | ||||
|  | ||||
| 	$.ajax({ | ||||
| 		url: codepot_merge_path('<?php print site_url() ?>', '<?php print "/wiki/xhr_edit/{$project->id}"; ?>'), | ||||
| 		type: 'POST', | ||||
| 		data: form_data, | ||||
| 		mimeType: 'multipart/form-data', | ||||
| 		contentType: false, | ||||
| 		processData: false, | ||||
| 		cache: false, | ||||
|  | ||||
| 		success: function (data, textStatus, jqXHR) {  | ||||
| 			work_in_progress = false; | ||||
|  | ||||
| 			if (data == 'ok')  | ||||
| 			{ | ||||
| 				var name_changed = (wiki_original_name != wiki_new_name); | ||||
| 				wiki_original_name = wiki_new_name; | ||||
| 				wiki_original_text = wiki_new_text; | ||||
| 				update_original_file_name_array (); | ||||
| 				show_in_progress_message (null, null); | ||||
| 				if (name_changed) | ||||
| 				{ | ||||
| 					// reload the whole page if the name has changed. | ||||
| 					$(location).attr ('href', codepot_merge_path('<?php print site_url(); ?>', '<?php print "/wiki/update/{$project->id}/"; ?>' + codepot_string_to_hex(wiki_new_name))); | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				show_in_progress_message (null, null); | ||||
| 				show_alert ('<pre>' + codepot_htmlspecialchars(data) + '</pre>', "<?php print $this->lang->line('Error')?>"); | ||||
| 			} | ||||
| 		}, | ||||
|  | ||||
| 		error: function (jqXHR, textStatus, errorThrown) {  | ||||
| 			work_in_progress = false; | ||||
| 			show_in_progress_message (null, null); | ||||
| 			var errmsg = ''; | ||||
| 			if (errmsg == '' && errorThrown != null) errmsg = errorThrown; | ||||
| 			if (errmsg == '' && textStatus != null) errmsg = textStatus; | ||||
| 			if (errmsg == '') errmsg = 'Unknown error'; | ||||
| 			show_alert ('Failed - ' + errmsg, "<?php print $this->lang->line('Error')?>"); | ||||
| 		} | ||||
| 	}); | ||||
| } | ||||
|  | ||||
|  | ||||
| function save_wiki_with_confirmation (outputMsg, titleMsg, wiki_new_name, wiki_new_text)  | ||||
| { | ||||
| 	$('#wiki_edit_alert').html(outputMsg).dialog({ | ||||
| 		title: titleMsg, | ||||
| 		resizable: true, | ||||
| 		modal: true, | ||||
| 		width: 'auto', | ||||
| 		height: 'auto', | ||||
| 		buttons: { | ||||
| 			"OK": function () { | ||||
| 				$(this).dialog("close"); | ||||
| 				save_wiki (wiki_new_name, wiki_new_text); | ||||
| 			}, | ||||
| 			"Cancel": function () { | ||||
| 				$(this).dialog("close"); | ||||
| 			} | ||||
| 		} | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| $(function () { | ||||
| 	$('#wiki_edit_files').accordion({ | ||||
| 		collapsible: true, | ||||
| @ -304,88 +420,21 @@ $(function () { | ||||
| 		if (!!window.FormData) | ||||
| 		{ | ||||
| 			// FormData is supported | ||||
| 			work_in_progress = true; | ||||
| 			show_in_progress_message ('Saving in progress. Please wait...', 'Saving...'); | ||||
|  | ||||
| 			wiki_new_name = $('#wiki_edit_name').val(); | ||||
| 			wiki_new_text = $('#wiki_edit_text_area').val(); | ||||
|  | ||||
| 			var form_data = new FormData(); | ||||
|  | ||||
| 			var f_no = 0; | ||||
| 			for (var i = 0; i < populated_file_max_for_adding; i++) | ||||
| 			var wiki_new_name = $('#wiki_edit_name').val(); | ||||
| 			var wiki_new_text = $('#wiki_edit_text_area').val(); | ||||
| 			if (populated_file_max_for_adding > cancelled_file_count_for_adding ||  | ||||
| 			    killed_file_count > 0 || | ||||
| 			    wiki_original_name != wiki_new_name || | ||||
| 			    wiki_original_text != wiki_new_text)  | ||||
| 			{ | ||||
| 				var f = populated_file_obj_for_adding[i]; | ||||
| 				if (f != null) | ||||
| 				{ | ||||
| 					form_data.append ('wiki_file_' + f_no, f); | ||||
| 					f_no++; | ||||
| 				} | ||||
| 				// there are changes. just save the document | ||||
| 				save_wiki (wiki_new_name, wiki_new_text); | ||||
| 			} | ||||
| 			form_data.append ('wiki_file_count', f_no); | ||||
|  | ||||
| 			f_no = 0; | ||||
| 			for (var i = 0; i < original_file_name_array.length; i++) | ||||
| 			else | ||||
| 			{ | ||||
| 				var n = $('#wiki_edit_file_name_' + i); | ||||
| 				if (n) | ||||
| 				{ | ||||
| 					if (n.prop('disabled')) | ||||
| 					{ | ||||
| 						form_data.append ('wiki_kill_file_name_' + f_no, original_file_name_array[i]); | ||||
| 						f_no++; | ||||
| 					} | ||||
| 				} | ||||
| 				// no changes detected. | ||||
| 				save_wiki_with_confirmation ("<?php print $this->lang->line('WIKI_MSG_SAVE_DESPITE_NO_CHANGES?'); ?>", wiki_new_name, wiki_new_name, wiki_new_text); | ||||
| 			} | ||||
| 			form_data.append ('wiki_kill_file_count', f_no); | ||||
|  | ||||
| 			form_data.append ('wiki_doctype', $('#wiki_edit_doctype').val());  | ||||
| 			form_data.append ('wiki_name', wiki_new_name); | ||||
| 			form_data.append ('wiki_original_name', wiki_original_name); | ||||
| 			form_data.append ('wiki_text', wiki_new_text); | ||||
|  | ||||
| 			$.ajax({ | ||||
| 				url: codepot_merge_path('<?php print site_url() ?>', '<?php print "/wiki/xhr_edit/{$project->id}"; ?>'), | ||||
| 				type: 'POST', | ||||
| 				data: form_data, | ||||
| 				mimeType: 'multipart/form-data', | ||||
| 				contentType: false, | ||||
| 				processData: false, | ||||
| 				cache: false, | ||||
|  | ||||
| 				success: function (data, textStatus, jqXHR) {  | ||||
| 					work_in_progress = false; | ||||
|  | ||||
| 					if (data == 'ok')  | ||||
| 					{ | ||||
| 						var name_changed = (wiki_original_name != wiki_new_name); | ||||
| 						wiki_original_name = wiki_new_name; | ||||
| 						wiki_original_text = wiki_new_text; | ||||
| 						update_original_file_name_array (); | ||||
| 						show_in_progress_message (null, null); | ||||
| 						if (name_changed) | ||||
| 						{ | ||||
| 							// reload the whole page if the name has changed. | ||||
| 							$(location).attr ('href', codepot_merge_path('<?php print site_url(); ?>', '<?php print "/wiki/update/{$project->id}/"; ?>' + codepot_string_to_hex(wiki_new_name))); | ||||
| 						} | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						show_in_progress_message (null, null); | ||||
| 						show_alert ('<pre>' + codepot_htmlspecialchars(data) + '</pre>', "<?php print $this->lang->line('Error')?>"); | ||||
| 					} | ||||
| 				}, | ||||
|  | ||||
| 				error: function (jqXHR, textStatus, errorThrown) {  | ||||
| 					work_in_progress = false; | ||||
| 					show_in_progress_message (null, null); | ||||
| 					var errmsg = ''; | ||||
| 					if (errmsg == '' && errorThrown != null) errmsg = errorThrown; | ||||
| 					if (errmsg == '' && textStatus != null) errmsg = textStatus; | ||||
| 					if (errmsg == '') errmsg = 'Unknown error'; | ||||
| 					show_alert ('Failed - ' + errmsg, "<?php print $this->lang->line('Error')?>"); | ||||
| 				} | ||||
| 			}); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| @ -404,8 +453,12 @@ $(function () { | ||||
| 	}); | ||||
|  | ||||
| 	$(window).on ("beforeunload", function (e) { | ||||
| 		var wiki_new_name = $('#wiki_edit_name').val(); | ||||
| 		var wiki_new_text = $('#wiki_edit_text_area').val(); | ||||
| 		if (wiki_original_text != wiki_new_text)  | ||||
| 		if (populated_file_max_for_adding > cancelled_file_count_for_adding ||  | ||||
| 		    killed_file_count > 0 || | ||||
| 		    wiki_original_name != wiki_new_name || | ||||
| 		    wiki_original_text != wiki_new_text)  | ||||
| 		{ | ||||
| 			return '<?php print $this->lang->line('MSG_DISCARD_CHANGES?'); ?>'; | ||||
| 		} | ||||
|  | ||||
| @ -1,4 +1,6 @@ | ||||
| <html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
|  | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|  | ||||
| <head> | ||||
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | ||||
| @ -77,6 +79,8 @@ function resize_editor() | ||||
|  | ||||
| var populated_file_obj_for_adding = []; | ||||
| var populated_file_max_for_adding = 0; | ||||
| var cancelled_file_count_for_adding = 0; | ||||
| var killed_file_count = 0; | ||||
|  | ||||
| var original_file_name_array = [ | ||||
| 	<?php | ||||
| @ -118,10 +122,13 @@ function populate_selected_files_for_adding () | ||||
|  | ||||
| function cancel_out_add_file (no) | ||||
| { | ||||
| 	$('#wiki_edit_add_file_row_' + no).remove (); | ||||
| 	populated_file_obj_for_adding[no] = null; | ||||
|  | ||||
| 	resize_editor (); | ||||
| 	if (populated_file_obj_for_adding[no] != null) | ||||
| 	{ | ||||
| 		cancelled_file_count_for_adding++; | ||||
| 		$('#wiki_edit_add_file_row_' + no).remove (); | ||||
| 		populated_file_obj_for_adding[no] = null; | ||||
| 		resize_editor (); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function kill_file (no) | ||||
| @ -133,11 +140,13 @@ function kill_file (no) | ||||
| 		{ | ||||
| 			n.css ('text-decoration', ''); | ||||
| 			n.prop ('disabled', false); | ||||
| 			killed_file_count--; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			n.css ('text-decoration', 'line-through'); | ||||
| 			n.prop ('disabled', true); | ||||
| 			killed_file_count++; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -157,6 +166,7 @@ function update_original_file_name_array () | ||||
|  | ||||
| 	populated_file_obj_for_adding = []; | ||||
| 	populated_file_max_for_adding = 0; | ||||
| 	cancelled_file_count_for_adding = 0; | ||||
| 	$('#wiki_edit_add_files').empty(); | ||||
|  | ||||
| 	var f_no = 0; | ||||
| @ -178,6 +188,7 @@ function update_original_file_name_array () | ||||
| 	} | ||||
|  | ||||
| 	$('#wiki_edit_file_list').empty(); | ||||
| 	killed_file_count = 0; | ||||
| 	original_file_name_array = file_name_array; | ||||
| 	for (var i = 0; i < original_file_name_array.length; i++) | ||||
| 	{ | ||||
| @ -198,7 +209,6 @@ function update_original_file_name_array () | ||||
| var wiki_text_editor = null; | ||||
| var work_in_progress = false; | ||||
| var wiki_original_name = '<?php print addslashes($wiki->name); ?>'; | ||||
| var wiki_new_name = ''; | ||||
| var wiki_original_text = <?php print codepot_json_encode($wiki->text); ?>; | ||||
|  | ||||
| function show_in_progress_message (outputMsg, titleMsg) | ||||
| @ -224,6 +234,109 @@ function show_in_progress_message (outputMsg, titleMsg) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function save_wiki (wiki_new_name, wiki_new_text) | ||||
| { | ||||
| 	work_in_progress = true; | ||||
| 	show_in_progress_message ('<?php print $this->lang->line('WIKI_MSG_SAVE_IN_PROGRESS'); ?>', wiki_new_name); | ||||
|  | ||||
| 	var form_data = new FormData(); | ||||
|  | ||||
| 	var f_no = 0; | ||||
| 	for (var i = 0; i < populated_file_max_for_adding; i++) | ||||
| 	{ | ||||
| 		var f = populated_file_obj_for_adding[i]; | ||||
| 		if (f != null) | ||||
| 		{ | ||||
| 			form_data.append ('wiki_file_' + f_no, f); | ||||
| 			f_no++; | ||||
| 		} | ||||
| 	} | ||||
| 	form_data.append ('wiki_file_count', f_no); | ||||
|  | ||||
| 	f_no = 0; | ||||
| 	for (var i = 0; i < original_file_name_array.length; i++) | ||||
| 	{ | ||||
| 		var n = $('#wiki_edit_file_name_' + i); | ||||
| 		if (n) | ||||
| 		{ | ||||
| 			if (n.prop('disabled')) | ||||
| 			{ | ||||
| 				form_data.append ('wiki_kill_file_name_' + f_no, original_file_name_array[i]); | ||||
| 				f_no++; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	form_data.append ('wiki_kill_file_count', f_no); | ||||
|  | ||||
| 	form_data.append ('wiki_doctype', 'H'); | ||||
| 	form_data.append ('wiki_name', wiki_new_name); | ||||
| 	form_data.append ('wiki_original_name', wiki_original_name); | ||||
| 	form_data.append ('wiki_text', wiki_new_text); | ||||
|  | ||||
| 	$.ajax({ | ||||
| 		url: codepot_merge_path('<?php print site_url() ?>', '<?php print "/wiki/xhr_edit/{$project->id}"; ?>'), | ||||
| 		type: 'POST', | ||||
| 		data: form_data, | ||||
| 		mimeType: 'multipart/form-data', | ||||
| 		contentType: false, | ||||
| 		processData: false, | ||||
| 		cache: false, | ||||
|  | ||||
| 		success: function (data, textStatus, jqXHR) {  | ||||
| 			work_in_progress = false; | ||||
|  | ||||
| 			if (data == 'ok')  | ||||
| 			{ | ||||
| 				var name_changed = (wiki_original_name != wiki_new_name); | ||||
| 				wiki_original_name = wiki_new_name; | ||||
| 				wiki_original_text = wiki_new_text; | ||||
| 				update_original_file_name_array (); | ||||
| 				show_in_progress_message (null, null); | ||||
| 				if (name_changed) | ||||
| 				{ | ||||
| 					// reload the whole page if the name has changed. | ||||
| 					$(location).attr ('href', codepot_merge_path('<?php print site_url(); ?>', '<?php print "/wiki/updatex/{$project->id}/"; ?>' + codepot_string_to_hex(wiki_new_name))); | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				show_in_progress_message (null, null); | ||||
| 				show_alert ('<pre>' + codepot_htmlspecialchars(data) + '</pre>', "<?php print $this->lang->line('Error')?>"); | ||||
| 			} | ||||
| 		}, | ||||
|  | ||||
| 		error: function (jqXHR, textStatus, errorThrown) {  | ||||
| 			work_in_progress = false; | ||||
| 			show_in_progress_message (null, null); | ||||
| 			var errmsg = ''; | ||||
| 			if (errmsg == '' && errorThrown != null) errmsg = errorThrown; | ||||
| 			if (errmsg == '' && textStatus != null) errmsg = textStatus; | ||||
| 			if (errmsg == '') errmsg = 'Unknown error'; | ||||
| 			show_alert ('Failed - ' + errmsg, "<?php print $this->lang->line('Error')?>"); | ||||
| 		} | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| function save_wiki_with_confirmation (outputMsg, titleMsg, wiki_new_name, wiki_new_text)  | ||||
| { | ||||
| 	$('#wiki_edit_alert').html(outputMsg).dialog({ | ||||
| 		title: titleMsg, | ||||
| 		resizable: true, | ||||
| 		modal: true, | ||||
| 		width: 'auto', | ||||
| 		height: 'auto', | ||||
| 		buttons: { | ||||
| 			"OK": function () { | ||||
| 				$(this).dialog("close"); | ||||
| 				save_wiki (wiki_new_name, wiki_new_text); | ||||
| 			}, | ||||
| 			"Cancel": function () { | ||||
| 				$(this).dialog("close"); | ||||
| 			} | ||||
| 		} | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| $(function () { | ||||
| 	$('#wiki_edit_files').accordion({ | ||||
| 		collapsible: true, | ||||
| @ -288,94 +401,28 @@ $(function () { | ||||
| <?php endif; ?> | ||||
|  | ||||
| 	$("#wiki_edit_save_button").button().click (function() { | ||||
| 		var e = wiki_text_editor.serialize(); | ||||
|  | ||||
| 		if (work_in_progress) return; | ||||
|  | ||||
| 		if (!!window.FormData) | ||||
| 		{ | ||||
| 			// FormData is supported | ||||
| 			work_in_progress = true; | ||||
| 			show_in_progress_message ('Saving in progress. Please wait...', 'Saving...'); | ||||
| 			var wiki_new_name = $('#wiki_edit_name').val(); | ||||
| 			var ed = wiki_text_editor.serialize(); | ||||
|  | ||||
| 			wiki_new_name = $('#wiki_edit_name').val(); | ||||
|  | ||||
| 			var form_data = new FormData(); | ||||
|  | ||||
| 			var f_no = 0; | ||||
| 			for (var i = 0; i < populated_file_max_for_adding; i++) | ||||
| 			var wiki_new_text = $('#wiki_edit_text_area').val(); | ||||
| 			if (populated_file_max_for_adding > cancelled_file_count_for_adding ||  | ||||
| 			    killed_file_count > 0 || | ||||
| 			    wiki_original_name != wiki_new_name || | ||||
| 			    wiki_original_text != ed.wiki_edit_text_editor.value)  | ||||
| 			{ | ||||
| 				var f = populated_file_obj_for_adding[i]; | ||||
| 				if (f != null) | ||||
| 				{ | ||||
| 					form_data.append ('wiki_file_' + f_no, f); | ||||
| 					f_no++; | ||||
| 				} | ||||
| 				// there are changes. just save the document | ||||
| 				save_wiki (wiki_new_name, ed.wiki_edit_text_editor.value); | ||||
| 			} | ||||
| 			form_data.append ('wiki_file_count', f_no); | ||||
|  | ||||
| 			f_no = 0; | ||||
| 			for (var i = 0; i < original_file_name_array.length; i++) | ||||
| 			else | ||||
| 			{ | ||||
| 				var n = $('#wiki_edit_file_name_' + i); | ||||
| 				if (n) | ||||
| 				{ | ||||
| 					if (n.prop('disabled')) | ||||
| 					{ | ||||
| 						form_data.append ('wiki_kill_file_name_' + f_no, original_file_name_array[i]); | ||||
| 						f_no++; | ||||
| 					} | ||||
| 				} | ||||
| 				// no changes detected. | ||||
| 				save_wiki_with_confirmation ("<?php print $this->lang->line('WIKI_MSG_SAVE_DESPITE_NO_CHANGES?'); ?>", wiki_new_name, wiki_new_name, ed.wiki_edit_text_editor.value); | ||||
| 			} | ||||
| 			form_data.append ('wiki_kill_file_count', f_no); | ||||
|  | ||||
| 			form_data.append ('wiki_doctype', 'H'); | ||||
| 			form_data.append ('wiki_name', wiki_new_name); | ||||
| 			form_data.append ('wiki_original_name', wiki_original_name); | ||||
| 			form_data.append ('wiki_text', e.wiki_edit_text_editor.value); | ||||
|  | ||||
| 			$.ajax({ | ||||
| 				url: codepot_merge_path('<?php print site_url() ?>', '<?php print "/wiki/xhr_edit/{$project->id}"; ?>'), | ||||
| 				type: 'POST', | ||||
| 				data: form_data, | ||||
| 				mimeType: 'multipart/form-data', | ||||
| 				contentType: false, | ||||
| 				processData: false, | ||||
| 				cache: false, | ||||
|  | ||||
| 				success: function (data, textStatus, jqXHR) {  | ||||
| 					work_in_progress = false; | ||||
|  | ||||
| 					if (data == 'ok')  | ||||
| 					{ | ||||
| 						var name_changed = (wiki_original_name != wiki_new_name); | ||||
| 						wiki_original_name = wiki_new_name; | ||||
| 						wiki_original_text = e.wiki_edit_text_editor.value; | ||||
| 						update_original_file_name_array (); | ||||
| 						show_in_progress_message (null, null); | ||||
| 						if (name_changed) | ||||
| 						{ | ||||
| 							// reload the whole page if the name has changed. | ||||
| 							$(location).attr ('href', codepot_merge_path('<?php print site_url(); ?>', '<?php print "/wiki/updatex/{$project->id}/"; ?>' + codepot_string_to_hex(wiki_new_name))); | ||||
| 						} | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						show_in_progress_message (null, null); | ||||
| 						show_alert ('<pre>' + codepot_htmlspecialchars(data) + '</pre>', "<?php print $this->lang->line('Error')?>"); | ||||
| 					} | ||||
| 				}, | ||||
|  | ||||
| 				error: function (jqXHR, textStatus, errorThrown) {  | ||||
| 					work_in_progress = false; | ||||
| 					show_in_progress_message (null, null); | ||||
| 					var errmsg = ''; | ||||
| 					if (errmsg == '' && errorThrown != null) errmsg = errorThrown; | ||||
| 					if (errmsg == '' && textStatus != null) errmsg = textStatus; | ||||
| 					if (errmsg == '') errmsg = 'Unknown error'; | ||||
| 					show_alert ('Failed - ' + errmsg, "<?php print $this->lang->line('Error')?>"); | ||||
| 				} | ||||
| 			}); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| @ -394,8 +441,13 @@ $(function () { | ||||
| 	}); | ||||
|  | ||||
| 	$(window).on ("beforeunload", function (e) { | ||||
| 		var wiki_new_name = $('#wiki_edit_name').val(); | ||||
| 		var ed = wiki_text_editor.serialize(); | ||||
| 		if (wiki_original_text != ed.wiki_edit_text_editor.value)  | ||||
|  | ||||
| 		if (populated_file_max_for_adding > cancelled_file_count_for_adding ||  | ||||
| 		    killed_file_count > 0 || | ||||
| 		    wiki_original_name != wiki_new_name || | ||||
| 		    wiki_original_text != ed.wiki_edit_text_editor.value)  | ||||
| 		{ | ||||
| 			return '<?php print $this->lang->line('MSG_DISCARD_CHANGES?'); ?>'; | ||||
| 		} | ||||
|  | ||||
		Reference in New Issue
	
	Block a user