Skip to main content

max / makenotwork

4.4 KB · 98 lines History Blame Raw
1 {%- import "partials/_ui.html" as ui -%}
2 <div class="tab-docs"><a href="/docs/splits">Docs: Collaborators &rarr;</a></div>
3
4 <div class="data-section">
5 <h2 class="subsection-title">Members & Payouts</h2>
6 <p class="section-lead">
7 Add collaborators and set their share of revenue. The project owner receives the remainder.
8 </p>
9
10 <div class="proj-members-summary">
11 <div class="proj-members-summary-row">
12 <div>
13 <div class="text-xs dimmed">Owner's share</div>
14 <div class="proj-members-stat">{{ owner_split }}%</div>
15 </div>
16 <div>
17 <div class="text-xs dimmed">Members</div>
18 <div class="proj-members-stat">{{ members.len() }}</div>
19 </div>
20 </div>
21 </div>
22
23 <details class="form-section proj-members-add">
24 <summary><h2 class="subsection-title">Add Member</h2></summary>
25 <form hx-post="/api/projects/{{ project_id }}/members"
26 hx-swap="none"
27 hx-on::after-request="if(event.detail.successful) { this.reset(); htmx.ajax('GET', '/dashboard/project/{{ project_slug }}/tabs/members', '#tab-content'); }">
28 <div class="proj-members-add-grid">
29 <div>
30 <label for="member-username" class="proj-members-field-label">Username</label>
31 <input type="text" id="member-username" name="username" required
32 placeholder="Enter username" class="proj-members-input-full w-full">
33 </div>
34 <div>
35 <label for="member-split" class="proj-members-field-label">Split %</label>
36 <input type="number" id="member-split" name="split_percent" required
37 min="1" max="99" value="50" class="proj-members-input-split w-80">
38 </div>
39 <div>
40 <button class="btn-primary" type="submit">Add</button>
41 </div>
42 </div>
43 <div>
44 <label for="member-role" class="proj-members-field-label proj-members-field-label--spaced">Role (optional)</label>
45 <input type="text" id="member-role" name="role"
46 placeholder="e.g. Producer, Artist, Engineer" class="proj-members-input-full w-full">
47 </div>
48 <div id="member-add-result" class="proj-members-add-result"></div>
49 </form>
50 </details>
51
52 {% if members.is_empty() %}
53 {% call ui::empty_state("", "No collaborators yet. Add team members above to share revenue automatically. The project owner receives 100% until splits are configured.") %}
54 {% else %}
55 <table class="data-table">
56 <thead>
57 <tr>
58 <th>Member</th>
59 <th>Role</th>
60 <th>Split</th>
61 <th>Stripe</th>
62 <th>Added</th>
63 <th></th>
64 </tr>
65 </thead>
66 <tbody>
67 {% for member in members %}
68 <tr>
69 <td>
70 <a href="/u/{{ member.username }}" class="proj-members-name-link">
71 <strong>{{ member.display_name.as_deref().unwrap_or(&member.username) }}</strong>
72 </a>
73 <div class="text-xs dimmed">@{{ member.username }}</div>
74 </td>
75 <td>{{ member.role }}</td>
76 <td class="proj-members-split-cell">{{ member.split_percent }}%</td>
77 <td>
78 {% if member.stripe_connected %}
79 <span class="badge active">Connected</span>
80 {% else %}
81 <span class="badge pending">Not connected</span>
82 {% endif %}
83 </td>
84 <td class="text-xs">{{ member.added_at }}</td>
85 <td>
86 <button class="btn-danger proj-members-remove-btn"
87 hx-delete="/api/projects/{{ project_id }}/members/{{ member.user_id }}"
88 hx-swap="none"
89 hx-on::after-request="if(event.detail.successful) htmx.ajax('GET', '/dashboard/project/{{ project_slug }}/tabs/members', '#tab-content');"
90 hx-confirm="Remove {{ member.display_name.as_deref().unwrap_or(&member.username) }} from this project?">Remove</button>
91 </td>
92 </tr>
93 {% endfor %}
94 </tbody>
95 </table>
96 {% endif %}
97 </div>
98