Files
Task-Management/views/projects.php
2026-03-26 15:03:38 +07:00

175 lines
7.7 KiB
PHP

<?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>