🚀 Member Event-Based Task System (Permission-Controlled)
@vivek0028 is already working on this.
Since May 6, 2026.
Assessment
This issue has not been assessed yet.
Description
This project is a production-grade Member Task System where members operate with organizer-level capabilities, controlled via a permission-based system.
✨ Features
- Event-based task management
- Permission-driven UI & actions
- Full task lifecycle:
Create → Assign → Submit → Review → Update
- Shared UI across roles (Organizer & Member)
🧠 Core Philosophy
Same UI for everyone → Different capabilities via permissions
- ❌ No restricted/limited UI for members
- ✅ One powerful system controlled via permissions
🧠 Architecture
Sidebar → Event → Tasks → Submissions → Review → Progress
🔐 Permission System
Default Permissions (All Members)
- View assigned tasks
- View task details
- Submit work
- Comment
Advanced Permissions (Organizer-Controlled)
| Permission | Description |
|---|---|
| CREATE_TASK | Create new tasks |
| ASSIGN_TASK | Assign tasks to others |
| UPDATE_STATUS | Update task status |
| EDIT_TASK | Edit tasks |
| DELETE_TASK | Delete tasks |
| MULTIPLE_SUBMISSION | Allow multiple submissions |
| LATE_SUBMISSION | Allow late submissions |
| VIEW_ALL_TASKS | View all event tasks |
🧭 Feature Flow
- Select Event
- View tasks (assigned OR all based on permission)
- Create task (if allowed)
- Assign task (if allowed)
- Submit work
- Review tasks (if allowed)
- Edit / delete tasks (if allowed)
🧱 Layout Structure
<MainLayout>
<SideBar />
<Content />
</MainLayout>
📂 Sidebar
Default Routes
SideBar.tsx
/member/dashboard
/member/tasks
Permission-Based Rendering
if (permissions.includes("CREATE_TASK")) {
show("Create Task");
}
if (permissions.includes("VIEW_ALL_TASKS")) {
show("All Tasks");
}
Requirements
Active route highlighting
Responsive (mobile drawer)
Collapsible
Permission-aware UI
📄 Pages & Features
📋 Task List Page
Route: /member/tasks
Behavior
if (permissions.includes("VIEW_ALL_TASKS")) {
fetchAllTasks();
} else {
fetchAssignedTasks();
}
Filters
Status (Todo / In Progress / Completed)
Time (Upcoming / Past)
Priority
Member (if allowed)
Search (debounced)
Actions
| Action | Permission |
|---|---|
| View | Default |
| Edit | EDIT_TASK |
| Delete | DELETE_TASK |
🔍 Task Detail Page
Route: /member/tasks/:taskId
Submission Rules
if (!permissions.includes("MULTIPLE_SUBMISSION")) { restrictSingleSubmission(); }
if (deadlinePassed && !permissions.includes("LATE_SUBMISSION")) {
disableSubmission();
}
Sections
Task Info
Submission Panel
Submission History
Status Update (if allowed)
Comments
Review Panel (if allowed)
➕ Create Task
Route: /member/tasks/create
if (!permissions.includes("CREATE_TASK")) {
redirect("/member/tasks");
}
✏️ Edit Task
if (!permissions.includes("EDIT_TASK")) {
blockAccess();
}
🗑️ Delete Task
if (!permissions.includes("DELETE_TASK")) {
blockAction();
}
🧱 Component Structure
components/
layout/
SideBar.tsx
MainLayout.tsxevent/
EventDropdown.jsxtask/
TaskTable.jsx
TaskDetail.jsx
TaskForm.jsx
SubmissionForm.jsx
CommentSection.jsx
common/
StatusBadge.jsx
PriorityBadge.jsx
ConfirmModal.jsx
SkeletonLoader.jsx
🔄 State Management
Library: React Query (TanStack Query)
State
selectedEventId
tasks
taskDetails
submissions
permissions
🌐 API
GET /api/tasks?eventId=&assignedTo=me
POST /api/tasks
PATCH /api/tasks/:id
DELETE /api/tasks/:id
POST /api/tasks/:id/submissions
POST /api/tasks/:id/comments
🎨 UI/UX Guidelines
Same UI as organizer
Only actions differ
Hide restricted features
Highlight urgent tasks
⚠️ Edge Cases
No event selected
No tasks available
Deadline passed
Permission changes dynamically
Direct URL access without permission
⚡ Performance
Cache tasks per event
Debounced search
Lazy loading
🔐 Security
Validate permissions on frontend
Backend must enforce RBAC
🧪 Testing Checklist
Permissions
Actions visible only if allowed
Create/Edit/Delete protected
Functional
Task CRUD works
Submission flow works
Filters work
UI
Responsive design
Loading states
Error handling
🚀 Implementation Plan
Phase 1: Layout + Sidebar
Phase 2: Task List + Filters
Phase 3: Task Detail + Submission
Phase 4: Permission System
Phase 5: Create/Edit/Delete
Phase 6: Final Polish
✅ Acceptance Criteria
Shared UI across roles
Permissions fully enforced
No unauthorized access
Clean, responsive UX
🏁 Final Note
This is a role-flexible system design:
Organizer → Full control
Member → Controlled power
Both operate on the same UI, enabling scalability and consistency.
If this still breaks when you paste somewhere, tell me where (VS Code, GitHub, Notion, etc.)—the fix depends on the tool.
- Dominant language
- TypeScript
- Stars
- 7
- Forks
- 17
- PR merge metrics
- No merged PRs in 30d
Getting set up
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from NexGenStudioDev/CommDesk
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
NexGenStudioDev/CommDesk#140 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
NexGenStudioDev/CommDesk#138 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
NexGenStudioDev/CommDesk#130 · 2 comments ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
NexGenStudioDev/CommDesk#123 · 2 comments ·
-
[UX] Hardcoded window dimensions not DPI-aware — UI broken on high-DPI displaysPossibly taken @anshul23102 claimed this 89 days ago. Open
NexGenStudioDev/CommDesk#141 · 1 assignee ·
All issues in NexGenStudioDev/CommDesk
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
AOSSIE-Org/DebateAI#611 ·
Maintainers usually reply within 3 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
openzim/mwoffliner#2933 ·
Maintainers usually reply within 1 day
-
Use the README category name for website links and submissionsPossibly taken @dajiaohuang claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
birobirobiro/awesome-shadcn-ui#647 ·
Maintainers usually reply within 2 days
-
Twake Drive picker: closePicker() never destroys the intent (stop() is on the promise returned by start(), not by create())Possibly taken @chibenwa claimed this today. Openclaude
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
linagora/twake-calendar-frontend#1498 · 1 comment ·
Maintainers usually reply within 1 day
-
check:passed streams:add
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
Maintainers usually reply within 1 day