Bläddra i källkod

Добавлена вставка картинок

Вадим Королёв 1 år sedan
förälder
incheckning
f9726c73eb

+ 1 - 0
.gitignore

@@ -4,3 +4,4 @@ src/.env
 src/jquery
 src/jqueryui
 src/db.sqlite3
+src/img/regen/rgn*

+ 7 - 3
src/controllers/ApiController.php

@@ -28,9 +28,13 @@ class ApiController extends Controller {
 	// Обновление отчёта
 	public function updateReport() {
 		$report = ReportModel::getById($_POST['id']);
-		$report['notice'] = $_POST['notice'];
-		$report['work_number'] = $_POST['work_number'];
-		$report['work_type'] = $_POST['work_type'];
+
+		$fields = ['work_number', 'work_type', 'notice', 'markup'];
+		foreach ($fields as $field) {
+			if (isset($_POST[$field])) {
+				$report[$field] = $_POST[$field];
+			}
+		}
 		ReportModel::update($report);
 		echo json_encode($report);
 	}

+ 28 - 1
src/controllers/RegenController.php

@@ -3,6 +3,32 @@
 
 class RegenController extends Controller {
 
+	// Загрузка изображений
+	public function uploadImage() {
+
+		if (is_uploaded_file($_FILES['file']['tmp_name'])) {
+			$mime_type = mime_content_type($_FILES['file']['tmp_name']);
+			$filepath = tempnam(rootdir."/img/regen", "rgnupload");
+
+			if ($mime_type == "image/png") {
+				// Конвертирование png в gif
+				$png_image = imagecreatefrompng($_FILES['file']['tmp_name']);
+				$gif_image = imagecreatetruecolor(imagesx($png_image), imagesy($png_image));
+				imagecopy($gif_image, $png_image, 0, 0, 0, 0, imagesx($png_image), imagesy($png_image));
+				imagegif($gif_image, $filepath);
+			} else {
+				// Просто перемещение файла
+				$filepath = tempnam(rootdir."/img/regen", "rgnupload");
+				move_uploaded_file($_FILES['file']['tmp_name'], $filepath);
+			}
+
+			$output = ["ok"=>true, "filename"=>basename($filepath)];
+		} else {
+			$output = ["ok"=>false];
+		}
+		echo json_encode($output);
+	}
+
 	// Список отчётов по дисциплине
 	public function listReports() {
 		$parts = explode("/", $this->request_uri);
@@ -43,7 +69,8 @@ class RegenController extends Controller {
 			"page_title" => "Regen: редактирование отчёта",
 			"crumbs" => ["Главная"=>"/", "Regen: редактирование отчёта" => "/"],
 			"markup" => $report['markup'],
-			"filename" => $subject['name']." #".$report['work_number']." - Королёв"
+			"filename" => $subject['name']." #".$report['work_number']." - Королёв",
+			"report_id" => $report_id
 		]);
 		$view->view();
 	}

+ 1 - 0
src/index.php

@@ -19,6 +19,7 @@ $router->register('/grades/get', ['GradesController', 'collect']);
 
 // Regen
 $router->register('/regen/new', ['RegenController', 'newReport']);
+$router->register('/regen/upload-image', ['RegenController', 'uploadImage']);
 $router->register('/regen/edit/\d+', ['RegenController', 'edit']);
 $router->register("/regen/gethtml", ['RegenController', 'getHtml']);
 $router->register("/regen/archive", ['RegenController', 'archive']);

+ 64 - 0
src/js/regenpreview.js

@@ -4,23 +4,72 @@
 var current_state = 0;
 var markup_area = $('#markuparea');
 var preview_area = $('#preview');
+var saveButton = $('#saveMarkupButton');
 
 $(document).ready(function() {
 	textAreaAdjust(document.getElementById("markuparea"));
+
+	$("#saveForm").submit(function(e) {
+		e.preventDefault();
+		saveMarkup();
+	});
+
+	// Сохранение на Ctrl+S
+	document.addEventListener("keydown", function(e) {
+	  if (e.keyCode === 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)) {
+		e.preventDefault();
+		saveMarkup();
+	  }
+	}, false);
+
+	// Вставка картинок на Ctrl+V
+	// https://stackoverflow.com/a/6338207
+	$("#markuparea").on('paste', function (e) {
+		let items = (e.clipboardData || e.originalEvent.clipboardData).items;
+		for (let index in items) {
+			let item = items[index];
+			if (item.kind === 'file') {
+
+				// Загрузка файла через jQuery AJAX
+				// https://stackoverflow.com/a/13333478
+				var fd = new FormData();
+				fd.append('file', item.getAsFile());
+
+				$.ajax({
+					url: "/regen/upload-image",
+					type: "post",
+					data: fd,
+					processData: false,
+					contentType: false,
+					success: function (response) {
+						response = JSON.parse(response);
+
+						if (response.ok) {
+							const line = "?"+response.filename+":"+"Подпись изображения";
+							markup_area.val(markup_area.val() + line);
+						}
+					}
+				});
+			}
+		}
+	});
 });
 
 $("#switchPreview").click(function() {
 	markup_area.hide();
 	preview_area.show();
 	updatePreview();
+	saveMarkup();
 });
 
 $("#switchMarkup").click(function() {
 	markup_area.show();
 	preview_area.hide();
+	saveMarkup();
 });
 
 $("#printReport").click(function() {
+	saveMarkup();
 	updatePreview(true);
 })
 
@@ -47,4 +96,19 @@ function updatePreview(then_print=false) {
 			}
 		}
 	);
+}
+
+// Сохраняет разметку для данного отчёта
+function saveMarkup() {
+	$.ajax({
+		url: "/reports/update",
+		type: "post",
+		data: {
+			id: $("#idInput").val(),
+			markup: $("#markuparea").val()
+		},
+		success: function() {
+			saveButton.blur();
+		}
+	});
 }

+ 2 - 1
src/models/ReportModel.php

@@ -18,11 +18,12 @@ class ReportModel extends Model {
 	// Обновляет запись в таблице
 	public static function update($report) {
 		$db = Database::getConnection();
-		$stm = $db->prepare("UPDATE ".static::$table_name." SET notice=:notice,work_number=:work_number,work_type=:work_type WHERE id=:id");
+		$stm = $db->prepare("UPDATE ".static::$table_name." SET notice=:notice,work_number=:work_number,work_type=:work_type,markup=:markup WHERE id=:id");
 		$stm->bindValue(":id", $report['id']);
 		$stm->bindValue(":notice", $report['notice']);
 		$stm->bindValue(":work_number", $report['work_number']);
 		$stm->bindValue(":work_type", $report['work_type']);
+		$stm->bindValue(":markup", $report['markup']);
 		$stm->execute();
 	}
 }

+ 0 - 2
src/views/LayoutView.php

@@ -33,10 +33,8 @@ class LayoutView extends View {
 		<meta http-equiv="Cache-control" content="public">
 		<title><?= $this->page_title ?></title>
 		<link rel='icon' type='image/png' href='/img/favicons/pockit.png'>
-		<link rel="stylesheet" href="/jqueryui/themes/base/jquery-ui.min.css">
 		<link rel="stylesheet" href="/css/pockit.css">
 		<script src="/jquery/jquery.min.js"></script>
-		<script src="/jqueryui/jquery-ui.min.js"></script>
 		<script src="/js/pockit.js"></script>
 		<?php $this->customHead() ?>
 	</head>

+ 1 - 1
src/views/RegenArchiveView.php

@@ -43,7 +43,7 @@ class RegenArchiveView extends LayoutView {
             <div id='subject`+subject.id+`' class='crud-item'>
                 <p>`+subject.name+`</p>
                 <div class='crud-buttons'>
-                    <button>Отчёты</button>
+                    <button onclick='document.location.href = "/regen/archive/`+subject.id+`"'>Отчёты</button>
                     <button onclick='crudUpdateShowWindow("subjects", {"Название": {type: "plain", name: "name", default: "`+subject.name+`"}, "Шифр": {type: "plain", name: "code", default: "`+subject.code+`"}, "Преподаватель": {type: "crudRead", name: "teacher_id", route: "teachers", default:`+subject.teacher_id+`}, "ID": {type: "hidden", name: "id", default: `+subject.id+`}}, "Обновление дисциплины", updateSubject)'>Изменить</button>
                     <button onclick='crudDelete("subjects", `+subject.id+`, "subject`+subject.id+`")' class='danger'>Удалить</button>
                 </div>

+ 5 - 1
src/views/RegenEditView.php

@@ -4,6 +4,7 @@
 class RegenEditView extends LayoutView {
 	protected $markup;
 	protected $filename;
+	protected $report_id;
 
 	public function customHead():void { ?>
 <link rel="stylesheet" href="/css/regen-report.css">
@@ -23,9 +24,12 @@ class RegenEditView extends LayoutView {
 </div>
 
 <div class='card no-print'>
+	<form id='saveForm'>
+		<input id='idInput' type='hidden' name='id' value='<?=$this->report_id?>'>
+		<button id='saveMarkupButton' class='form-control createbutton'>Сохранить</button>
+	</form>
 	<p>Название файла: <span class='filename'><?= $this->filename ?></span></p>
 </div>
-
  
 <script src="/js/regenpreview.js"></script>
 <?php }

+ 6 - 6
src/views/RegenNewReportView.php

@@ -10,14 +10,14 @@ class RegenNewReportView extends LayoutView {
 
 <h1 class='text-center'>Создание отчёта</h1>
 
-<?php if (isset($this->error_text)) {?>
-	<div class='card error'>
-		<?= $this->error_text ?>
-	</div>
-<?php } ?>
-
 <form action="/regen/new" method="POST">
 	<div class="card">
+		<?php if (isset($this->error_text)) {?>
+			<div class='card error'>
+				<?= $this->error_text ?>
+			</div>
+		<?php } ?>
+
 		<div class="form-control-container">
 			<label for="sel-subject_id">Предмет</label>
 			<select class="form-control" id="sel-subject_id" name="subject_id">