From 5235a9fa885f7ee923a15b41c633e439415c4e79 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 7 Oct 2025 17:01:46 +0000 Subject: [PATCH] v1 --- add_paper.php | 66 +++++ assets/css/custom.css | 61 +++++ assets/js/main.js | 45 ++++ assets/vm-shot-2025-10-07T17-01-12-455Z.jpg | Bin 0 -> 17606 bytes db/config.php | 46 +++- db/migrations/001_create_papers_table.sql | 10 + delete_paper.php | 31 +++ edit_paper.php | 99 +++++++ index.php | 277 +++++++++----------- partials/footer.php | 12 + partials/header.php | 45 ++++ privacy.php | 9 + sitemap.xml | 16 ++ 13 files changed, 557 insertions(+), 160 deletions(-) create mode 100644 add_paper.php create mode 100644 assets/css/custom.css create mode 100644 assets/js/main.js create mode 100644 assets/vm-shot-2025-10-07T17-01-12-455Z.jpg create mode 100644 db/migrations/001_create_papers_table.sql create mode 100644 delete_paper.php create mode 100644 edit_paper.php create mode 100644 partials/footer.php create mode 100644 partials/header.php create mode 100644 privacy.php create mode 100644 sitemap.xml diff --git a/add_paper.php b/add_paper.php new file mode 100644 index 0000000..08e1626 --- /dev/null +++ b/add_paper.php @@ -0,0 +1,66 @@ + +prepare("INSERT INTO papers (title, authors, publication, year, notes) VALUES (?, ?, ?, ?, ?)"); + $stmt->execute([$title, $authors, $publication, $year, $notes]); + header("Location: /?toast=" . urlencode('Paper added successfully!')); + exit; + } catch (PDOException $e) { + // In a real app, you'd log this error. + header("Location: /add_paper.php?toast=" . urlencode('Error adding paper.')); + exit; + } + } +} + +include 'partials/header.php'; +?> + +
+
+
+
+
+ Icon of a document or a book +

Add a New Paper

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+
+ + diff --git a/assets/css/custom.css b/assets/css/custom.css new file mode 100644 index 0000000..f7dcb1c --- /dev/null +++ b/assets/css/custom.css @@ -0,0 +1,61 @@ + +/* General Body Styles */ +body { + font-family: 'Inter', sans-serif; + background-color: #f8f9fa; + color: #343a40; +} + +/* Typography */ +h1, h2, h3, h4, h5, h6 { + font-family: 'Playfair Display', serif; + font-weight: 700; +} + +/* Buttons */ +.btn-primary { + background-image: linear-gradient(45deg, #007bff, #0056b3); + border: none; + transition: transform 0.2s; +} + +.btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); +} + +/* Cards */ +.card { + border-radius: 0.5rem; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05); +} + +/* Header */ +.hero { + background: url('https://picsum.photos/1600/400') no-repeat center center; + background-size: cover; + color: white; + padding: 4rem 0; + text-align: center; +} + +.hero h1 { + font-size: 3.5rem; + text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5); +} + +/* Form */ +.form-container { + background: white; + padding: 2rem; + border-radius: 0.5rem; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); +} + +/* Toast Notifications */ +.toast-container { + position: fixed; + top: 1rem; + right: 1rem; + z-index: 1050; +} diff --git a/assets/js/main.js b/assets/js/main.js new file mode 100644 index 0000000..a18f5f2 --- /dev/null +++ b/assets/js/main.js @@ -0,0 +1,45 @@ + +// Client-side validation for the add paper form +document.addEventListener('DOMContentLoaded', () => { + const form = document.querySelector('#add-paper-form'); + if (form) { + form.addEventListener('submit', (event) => { + let isValid = true; + const requiredFields = form.querySelectorAll('[required]'); + requiredFields.forEach(field => { + if (!field.value) { + isValid = false; + field.classList.add('is-invalid'); + } else { + field.classList.remove('is-invalid'); + } + }); + + if (!isValid) { + event.preventDefault(); + alert('Please fill out all required fields.'); + } + }); + } + + // Show toast from URL parameter + const urlParams = new URLSearchParams(window.location.search); + const toastMessage = urlParams.get('toast'); + if (toastMessage) { + const toastContainer = document.querySelector('.toast-container'); + if (toastContainer) { + const toast = ` + + `; + toastContainer.innerHTML = toast; + } + } +}); diff --git a/assets/vm-shot-2025-10-07T17-01-12-455Z.jpg b/assets/vm-shot-2025-10-07T17-01-12-455Z.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7cd944e3ed044a74de0e90c8aa26d8886bda0a2c GIT binary patch literal 17606 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 literal 0 HcmV?d00001 diff --git a/db/config.php b/db/config.php index bb98f7d..82f2f5e 100644 --- a/db/config.php +++ b/db/config.php @@ -1,17 +1,35 @@ PDO::ERRMODE_EXCEPTION, - PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, - ]); - } - return $pdo; + static $pdoconn = null; + if ($pdoconn === null) { + $host = '127.0.0.1'; + $db = 'lamp_app'; + $user = 'lamp_user'; + $pass = ''; + $charset = 'utf8mb4'; + + $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; + $options = [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ]; + try { + $pdoconn = new PDO($dsn, $user, $pass, $options); + } catch (\PDOException $e) { + throw new \PDOException($e->getMessage(), (int)$e->getCode()); + } + } + return $pdoconn; } + +function run_migrations() { + $pdo = db(); + $migration_files = glob(__DIR__ . '/migrations/*.sql'); + foreach ($migration_files as $file) { + $sql = file_get_contents($file); + $pdo->exec($sql); + } +} + +run_migrations(); \ No newline at end of file diff --git a/db/migrations/001_create_papers_table.sql b/db/migrations/001_create_papers_table.sql new file mode 100644 index 0000000..2e59062 --- /dev/null +++ b/db/migrations/001_create_papers_table.sql @@ -0,0 +1,10 @@ + +CREATE TABLE IF NOT EXISTS papers ( + id INT AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(255) NOT NULL, + authors VARCHAR(255) NOT NULL, + publication VARCHAR(255), + year INT, + notes TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); diff --git a/delete_paper.php b/delete_paper.php new file mode 100644 index 0000000..274d3ff --- /dev/null +++ b/delete_paper.php @@ -0,0 +1,31 @@ +prepare("SELECT id FROM papers WHERE id = ?"); +$stmt->execute([$paper_id]); +if ($stmt->rowCount() === 0) { + // Paper not found, maybe already deleted + header("Location: index.php?error=notfound"); + exit; +} + +// Delete the paper +try { + $stmt = $pdo->prepare("DELETE FROM papers WHERE id = ?"); + $stmt->execute([$paper_id]); + header("Location: index.php?success=deleted"); + exit; +} catch (PDOException $e) { + // Log error if you have a logging system + header("Location: index.php?error=deletfailed"); + exit; +} diff --git a/edit_paper.php b/edit_paper.php new file mode 100644 index 0000000..46b7d36 --- /dev/null +++ b/edit_paper.php @@ -0,0 +1,99 @@ +prepare("SELECT * FROM papers WHERE id = ?"); +$stmt->execute([$paper_id]); +$paper = $stmt->fetch(); + +if (!$paper) { + header("Location: index.php"); + exit; +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $title = trim($_POST['title'] ?? ''); + $authors = trim($_POST['authors'] ?? ''); + $publication = trim($_POST['publication'] ?? ''); + $year = filter_input(INPUT_POST, 'year', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1900, 'max_range' => date('Y') + 1]]); + $notes = trim($_POST['notes'] ?? ''); + + if (empty($title) || empty($authors)) { + $feedback = ['type' => 'danger', 'message' => 'Title and Authors are required.']; + } elseif ($year === false) { + $feedback = ['type' => 'danger', 'message' => 'Invalid year.']; + } else { + try { + $stmt = $pdo->prepare("UPDATE papers SET title = ?, authors = ?, publication = ?, year = ?, notes = ? WHERE id = ?"); + $stmt->execute([$title, $authors, $publication, $year, $notes, $paper_id]); + header("Location: index.php?success=updated"); + exit; + } catch (PDOException $e) { + $feedback = ['type' => 'danger', 'message' => 'Error updating paper: ' . $e->getMessage()]; + } + } + // To show feedback on the same page, we need to repopulate the paper variable with submitted data + $paper['title'] = $title; + $paper['authors'] = $authors; + $paper['publication'] = $publication; + $paper['year'] = $year; + $paper['notes'] = $notes; +} +?> + +
+
+
+
+
+

Edit Paper

+
+
+ +
+ +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + Cancel +
+
+
+
+
+
+ + diff --git a/index.php b/index.php index 7205f3d..d2dbe10 100644 --- a/index.php +++ b/index.php @@ -1,150 +1,135 @@ prepare("SELECT COUNT(*) FROM papers WHERE title LIKE :search OR authors LIKE :search OR publication LIKE :search"); + $count_stmt->execute(['search' => "%$search%"]); +} else { + $count_stmt = $pdo->query("SELECT COUNT(*) FROM papers"); +} +$total_papers = $count_stmt->fetchColumn(); +$total_pages = ceil($total_papers / $papers_per_page); + +// Get papers for the current page +if ($search) { + $stmt = $pdo->prepare("SELECT * FROM papers WHERE title LIKE :search OR authors LIKE :search OR publication LIKE :search ORDER BY created_at DESC LIMIT :limit OFFSET :offset"); + $stmt->bindValue(':search', "%$search%", PDO::PARAM_STR); + $stmt->bindValue(':limit', $papers_per_page, PDO::PARAM_INT); + $stmt->bindValue(':offset', $offset, PDO::PARAM_INT); + $stmt->execute(); +} else { + $stmt = $pdo->prepare("SELECT * FROM papers ORDER BY created_at DESC LIMIT :limit OFFSET :offset"); + $stmt->bindValue(':limit', $papers_per_page, PDO::PARAM_INT); + $stmt->bindValue(':offset', $offset, PDO::PARAM_INT); + $stmt->execute(); +} + +$papers = $stmt->fetchAll(); ?> - - - - - - New Style - - - - - - - - - - - - - - - - - - - - - -
-
-

Analyzing your requirements and generating your website…

-
- Loading… -
-

AI is collecting your requirements and applying the first changes.

-

This page will update automatically as the plan is implemented.

-

Runtime: PHP — UTC

+ +
+
+

Your Paper Collection

+

A central place to manage all your academic papers.

+ Add a New Paper
-
-
- Page updated: (UTC) -
- - + + +
+ 'success', 'message' => 'Paper deleted successfully.']; + } + if ($_GET['success'] === 'updated') { + $feedback = ['type' => 'success', 'message' => 'Paper updated successfully.']; + } + } + if (isset($_GET['error'])) { + if ($_GET['error'] === 'notfound') { + $feedback = ['type' => 'danger', 'message' => 'Paper not found.']; + } + if ($_GET['error'] === 'deletfailed') { + $feedback = ['type' => 'danger', 'message' => 'Error deleting paper.']; + } + } + ?> + + + + +
+
+ + +
+
+ +

Recently Added

+
+ +
+

No papers added yet. Add your first one!

+
+ + +
+
+
+
+
+

+ + Publication:
+ + + Year:
+ + + Notes: 100 ? '...' : '') ?>
+ +

+
+ Edit + Delete +
+
+
+
+ + +
+ + + 1): ?> + + +
+ + \ No newline at end of file diff --git a/partials/footer.php b/partials/footer.php new file mode 100644 index 0000000..364fd6c --- /dev/null +++ b/partials/footer.php @@ -0,0 +1,12 @@ + +
+
+

© PaperCRM. All rights reserved.

+ Company logo placeholder +
+
+ + + + + diff --git a/partials/header.php b/partials/header.php new file mode 100644 index 0000000..52f55a8 --- /dev/null +++ b/partials/header.php @@ -0,0 +1,45 @@ + + + + + + + Paper CRM + + + + + + + + + + + + + + + +
+ +
diff --git a/privacy.php b/privacy.php new file mode 100644 index 0000000..1fe192c --- /dev/null +++ b/privacy.php @@ -0,0 +1,9 @@ + + + +
+

Privacy Policy

+

This is a placeholder for your privacy policy.

+
+ + diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..02ee735 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,16 @@ + + + + + / + 1.0 + + + /add_paper.php + 0.8 + + + /privacy.php + 0.5 + +