Skip to main content

max / makenotwork

4.7 KB · 106 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 data-after="reset refresh" data-arg="/dashboard/project/{{ project_slug }}/tabs/members" data-arg2="#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 mt-section">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.") %}{% endcall %}
54 {% else %}
55 <table class="data-table well">
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">
77 {{ member.split_percent }}%
78 {% if !member.accepted %}
79 <span class="badge" data-tone="warning">Invited</span>
80 <div class="text-xs dimmed">
81 Reserved, but earning nothing until they accept.
82 </div>
83 {% endif %}
84 </td>
85 <td>
86 {% if member.stripe_connected %}
87 <span class="badge" data-tone="success">Connected</span>
88 {% else %}
89 <span class="badge" data-tone="warning">Not connected</span>
90 {% endif %}
91 </td>
92 <td class="text-xs">{{ member.added_at }}</td>
93 <td>
94 <button class="btn-danger proj-members-remove-btn"
95 hx-delete="/api/projects/{{ project_id }}/members/{{ member.user_id }}"
96 hx-swap="none"
97 data-after="refresh" data-arg="/dashboard/project/{{ project_slug }}/tabs/members" data-arg2="#tab-content"
98 hx-confirm="Remove {{ member.display_name.as_deref().unwrap_or(&member.username) }} from this project?">Remove</button>
99 </td>
100 </tr>
101 {% endfor %}
102 </tbody>
103 </table>
104 {% endif %}
105 </div>
106