initial commit
This commit is contained in:
174
views/projects.php
Normal file
174
views/projects.php
Normal file
@@ -0,0 +1,174 @@
|
||||
|
||||
<?php
|
||||
$parent_id = $_GET['folder'] ?? null;
|
||||
|
||||
if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['create_folder'])) {
|
||||
$stmt = $pdo->prepare("INSERT INTO projects (name, is_folder, parent_id, owner_id) VALUES (?, 1, ?, ?)");
|
||||
$stmt->execute([$_POST['name'], $parent_id, $user_id]);
|
||||
}
|
||||
|
||||
if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_item'])) {
|
||||
$stmt = $pdo->prepare("DELETE FROM projects WHERE id=? AND owner_id=?");
|
||||
$stmt->execute([$_POST['item_id'], $user_id]);
|
||||
}
|
||||
|
||||
if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['edit_item'])) {
|
||||
$stmt = $pdo->prepare("UPDATE projects SET name=? WHERE id=? AND owner_id=?");
|
||||
$stmt->execute([$_POST['new_name'], $_POST['item_id'], $user_id]);
|
||||
}
|
||||
|
||||
if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['upload_file']) && isset($_FILES['file'])) {
|
||||
$name = $_FILES['file']['name'];
|
||||
$tmp_name = $_FILES['file']['tmp_name'];
|
||||
$path = 'uploads/' . time() . '_' . $name;
|
||||
move_uploaded_file($tmp_name, $path);
|
||||
|
||||
$stmt = $pdo->prepare("INSERT INTO projects (name, is_folder, parent_id, file_path, owner_id) VALUES (?, 0, ?, ?, ?)");
|
||||
$stmt->execute([$name, $parent_id, $path, $user_id]);
|
||||
echo "OK"; exit; // For AJAX
|
||||
}
|
||||
|
||||
if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['share_project'])) {
|
||||
$pr_id = $_POST['project_id'];
|
||||
$share = $_POST['share_target']; // 'user_1'
|
||||
$parts = explode('_', $share);
|
||||
|
||||
$stmt = $pdo->prepare("INSERT INTO project_shares (project_id, share_type, share_id) VALUES (?, ?, ?)");
|
||||
$stmt->execute([$pr_id, $parts[0], $parts[1]]);
|
||||
|
||||
$pr = query("SELECT name FROM projects WHERE id=?", [$pr_id])->fetch();
|
||||
$msg = "A project/file '{$pr['name']}' has been shared with you.";
|
||||
if($parts[0] === 'user') notify_user($parts[1], $msg);
|
||||
else notify_group($parts[1], $msg);
|
||||
}
|
||||
|
||||
// Fetch items in current folder
|
||||
$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';
|
||||
|
||||
$parent_cond = $parent_id ? "p.parent_id = ?" : "p.parent_id IS NULL";
|
||||
$sql = "SELECT p.*, (p.owner_id = ?) as is_mine, u.username as owner_name FROM projects p
|
||||
LEFT JOIN project_shares ps ON p.id = ps.project_id
|
||||
LEFT JOIN users u ON p.owner_id = u.id
|
||||
WHERE ($parent_cond) AND (
|
||||
p.owner_id = ?
|
||||
OR (ps.share_type='user' AND ps.share_id = ?)
|
||||
OR (ps.share_type='group' AND ps.share_id IN ($group_in))
|
||||
) GROUP BY p.id ORDER BY p.is_folder DESC, p.name ASC";
|
||||
|
||||
$params = [$user_id];
|
||||
if($parent_id) $params[] = $parent_id;
|
||||
$params = array_merge($params, [$user_id, $user_id], $my_group_ids);
|
||||
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$items = $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>Project Files Explorer</h1>
|
||||
</div>
|
||||
|
||||
<div class="flex-between">
|
||||
<?php if($parent_id):
|
||||
$parent = query("SELECT parent_id FROM projects WHERE id=?", [$parent_id])->fetch();
|
||||
?>
|
||||
<a href="?action=projects&folder=<?= $parent['parent_id'] ?>" class="btn btn-secondary">← Back</a>
|
||||
<?php else: ?>
|
||||
<div>Root Directory</div>
|
||||
<?php endif; ?>
|
||||
<div style="display:flex; gap:1rem;">
|
||||
<form method="POST" style="display:flex; gap:0.5rem;">
|
||||
<input type="text" name="name" class="form-control" placeholder="New Folder Name" required>
|
||||
<button type="submit" name="create_folder" class="btn">New Folder</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card" style="margin-top:1.5rem;">
|
||||
<!-- Drag Drop Zone -->
|
||||
<div id="dropzone" class="dropzone" ondragover="this.classList.add('dragover'); return false;" ondragleave="this.classList.remove('dragover');" ondrop="handleDrop(event)">
|
||||
SVG Drop files here to upload instantly
|
||||
<br><br><span style="color:var(--text-light); font-size:0.875rem;">(HTML5 Drag & Drop)</span>
|
||||
</div>
|
||||
|
||||
<div style="margin-top:2rem;">
|
||||
<?php foreach($items as $item): ?>
|
||||
<div class="project-item">
|
||||
<div style="display:flex; align-items:center; gap:0.5rem; flex:1;">
|
||||
<span style="font-size:1.5rem;"><?= $item['is_folder'] ? '📁' : '📄' ?></span>
|
||||
<?php if($item['is_folder']): ?>
|
||||
<a href="?action=projects&folder=<?= $item['id'] ?>" style="font-weight:600;"><?= htmlspecialchars($item['name']) ?></a>
|
||||
<?php else: ?>
|
||||
<a href="<?= htmlspecialchars($item['file_path']) ?>" target="_blank"><?= htmlspecialchars($item['name']) ?></a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div style="width:200px; color:var(--text-light); font-size:0.875rem;">
|
||||
Owner: <?= htmlspecialchars($item['owner_name']) ?>
|
||||
<?= !$item['is_mine'] ? '<span class="badge" style="background:#10B981; font-size:10px;">Shared</span>' : '' ?>
|
||||
</div>
|
||||
|
||||
<div style="display:flex; gap:0.5rem;">
|
||||
<?php if($item['is_mine']): ?>
|
||||
<form method="POST" style="display:inline; display:flex; gap:0.5rem;">
|
||||
<input type="hidden" name="project_id" value="<?= $item['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_project" class="btn btn-sm" title="Share">🔗</button>
|
||||
</form>
|
||||
<form method="POST" style="display:inline; display:flex; gap:0.5rem;" onsubmit="return confirm('Delete this item?')">
|
||||
<input type="hidden" name="item_id" value="<?= $item['id'] ?>">
|
||||
<button type="button" class="btn btn-sm btn-secondary" title="Rename" onclick="renameItem(<?= $item['id'] ?>, '<?= htmlspecialchars(addslashes($item['name'])) ?>')">✏️</button>
|
||||
<button type="submit" name="delete_item" class="btn btn-sm btn-danger" title="Delete">🗑️</button>
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
<?php if(!$items): ?><p style="margin-top:1rem;">Empty folder.</p><?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Rename form hidden -->
|
||||
<form method="POST" id="rename-form" style="display:none;">
|
||||
<input type="hidden" name="edit_item" value="1">
|
||||
<input type="hidden" name="item_id" id="rn-item_id">
|
||||
<input type="hidden" name="new_name" id="rn-new_name">
|
||||
</form>
|
||||
|
||||
<script>
|
||||
function renameItem(id, currName) {
|
||||
let nn = prompt("Enter new name:", currName);
|
||||
if(nn && nn.trim()!=='' && nn !== currName) {
|
||||
document.getElementById('rn-item_id').value = id;
|
||||
document.getElementById('rn-new_name').value = nn;
|
||||
document.getElementById('rename-form').submit();
|
||||
}
|
||||
}
|
||||
|
||||
function handleDrop(e) {
|
||||
e.preventDefault();
|
||||
e.currentTarget.classList.remove('dragover');
|
||||
|
||||
let dt = e.dataTransfer;
|
||||
let files = dt.files;
|
||||
|
||||
if(files.length > 0) {
|
||||
let formData = new FormData();
|
||||
formData.append('upload_file', '1');
|
||||
formData.append('file', files[0]);
|
||||
|
||||
fetch('?action=projects&folder=<?= $parent_id ?>', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
}).then(res => {
|
||||
window.location.reload();
|
||||
});
|
||||
}
|
||||
}
|
||||
</script>
|
||||
Reference in New Issue
Block a user