84 lines
4.1 KiB
PHP
84 lines
4.1 KiB
PHP
|
|
<?php
|
|
if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['create_note'])) {
|
|
$stmt = $pdo->prepare("INSERT INTO notes (title, content, owner_id) VALUES (?, ?, ?)");
|
|
$stmt->execute([$_POST['title'], $_POST['content'], $user_id]);
|
|
}
|
|
|
|
if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['share_note'])) {
|
|
$n_id = $_POST['note_id'];
|
|
$share = $_POST['share_target']; // 'user_1'
|
|
$parts = explode('_', $share);
|
|
|
|
$stmt = $pdo->prepare("INSERT INTO note_shares (note_id, share_type, share_id) VALUES (?, ?, ?)");
|
|
$stmt->execute([$n_id, $parts[0], $parts[1]]);
|
|
|
|
$n = query("SELECT title FROM notes WHERE id=?", [$n_id])->fetch();
|
|
$msg = "A note '{$n['title']}' has been shared with you.";
|
|
if($parts[0] === 'user') notify_user($parts[1], $msg);
|
|
else notify_group($parts[1], $msg);
|
|
}
|
|
|
|
// Fetch Notes
|
|
$user_groups = get_user_groups($user_id);
|
|
$my_group_ids = array_column($user_groups, 'id');
|
|
$group_in = implode(',', array_fill(0, count($my_group_ids), '?')) ?: '0';
|
|
|
|
$sql = "SELECT n.*, (n.owner_id = ?) as is_mine FROM notes n
|
|
LEFT JOIN note_shares ns ON n.id = ns.note_id
|
|
WHERE n.owner_id = ?
|
|
OR (ns.share_type='user' AND ns.share_id = ?)
|
|
OR (ns.share_type='group' AND ns.share_id IN ($group_in))
|
|
GROUP BY n.id ORDER BY n.created_at DESC";
|
|
$params = array_merge([$user_id, $user_id, $user_id], $my_group_ids);
|
|
$stmt = $pdo->prepare($sql);
|
|
$stmt->execute($params);
|
|
$notes = $stmt->fetchAll();
|
|
|
|
$all_users = query("SELECT id, username FROM users WHERE id != ?", [$user_id])->fetchAll();
|
|
$all_groups = query("SELECT * FROM groups")->fetchAll();
|
|
?>
|
|
<div class="header">
|
|
<h1>Markdown Notes</h1>
|
|
</div>
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
|
|
|
<div style="display:grid; grid-template-columns: 1fr 2fr; gap:1.5rem;">
|
|
<div class="card">
|
|
<h3>Create Note</h3>
|
|
<form method="POST" style="margin-top:1rem;">
|
|
<div class="form-group"><input type="text" name="title" class="form-control" placeholder="Note Title" required></div>
|
|
<div class="form-group">
|
|
<textarea name="content" class="form-control" placeholder="Markdown supported..." style="min-height:200px;" required></textarea>
|
|
</div>
|
|
<button type="submit" name="create_note" class="btn">Save Note</button>
|
|
</form>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<h3>My Notes</h3>
|
|
<?php foreach($notes as $n): ?>
|
|
<div style="border:1px solid var(--border); border-radius:1rem; padding:1.5rem; margin-bottom:1.5rem;">
|
|
<div style="display:flex; justify-content:space-between; margin-bottom:1rem;">
|
|
<h4 style="font-size:1.2rem; color:var(--primary);"><?= htmlspecialchars($n['title']) ?> <?= !$n['is_mine'] ? '<span class="badge" style="background:#10B981; font-size:10px;">Shared</span>' : '' ?></h4>
|
|
<?php if($n['is_mine']): ?>
|
|
<form method="POST" style="display:inline; display:flex; gap:0.5rem;">
|
|
<input type="hidden" name="note_id" value="<?= $n['id'] ?>">
|
|
<select name="share_target" class="form-control" style="width:auto; padding:0.25rem;">
|
|
<?php foreach($all_users as $u): ?><option value="user_<?= $u['id'] ?>">User: <?= htmlspecialchars($u['username']) ?></option><?php endforeach; ?>
|
|
<?php foreach($all_groups as $g): ?><option value="group_<?= $g['id'] ?>">Group: <?= htmlspecialchars($g['name']) ?></option><?php endforeach; ?>
|
|
</select>
|
|
<button type="submit" name="share_note" class="btn btn-sm">Share</button>
|
|
</form>
|
|
<?php endif; ?>
|
|
</div>
|
|
<div class="markdown-body" style="background:var(--bg); padding:1rem; border-radius:0.5rem; font-size:0.95rem;">
|
|
<script>document.write(marked.parse(`<?= str_replace(array('\\', '`', '$'), array('\\\\', '\\`', '\\$'), (string)$n['content']) ?>`));</script>
|
|
</div>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
<?php if(!$notes): ?><p>No notes written yet.</p><?php endif; ?>
|
|
</div>
|
|
</div>
|