@fuzdev/fuz_app 0.60.0 → 0.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/ui/AccountSessions.svelte +21 -6
  2. package/dist/ui/AccountSessions.svelte.d.ts.map +1 -1
  3. package/dist/ui/AdminAccounts.svelte +32 -25
  4. package/dist/ui/AdminAccounts.svelte.d.ts.map +1 -1
  5. package/dist/ui/AdminAuditLog.svelte +3 -3
  6. package/dist/ui/AdminInvites.svelte +20 -15
  7. package/dist/ui/AdminOverview.svelte +19 -21
  8. package/dist/ui/AdminOverview.svelte.d.ts.map +1 -1
  9. package/dist/ui/AdminRoleGrantHistory.svelte +3 -3
  10. package/dist/ui/AdminSessions.svelte +19 -21
  11. package/dist/ui/AdminSessions.svelte.d.ts.map +1 -1
  12. package/dist/ui/AdminSettings.svelte +1 -3
  13. package/dist/ui/AdminSettings.svelte.d.ts.map +1 -1
  14. package/dist/ui/CLAUDE.md +123 -69
  15. package/dist/ui/ConfirmButton.svelte +82 -24
  16. package/dist/ui/ConfirmButton.svelte.d.ts +8 -34
  17. package/dist/ui/ConfirmButton.svelte.d.ts.map +1 -1
  18. package/dist/ui/OpenSignupToggle.svelte +6 -4
  19. package/dist/ui/OpenSignupToggle.svelte.d.ts.map +1 -1
  20. package/dist/ui/RoleGrantOfferForm.svelte +4 -4
  21. package/dist/ui/RoleGrantOfferHistory.svelte +3 -3
  22. package/dist/ui/RoleGrantOfferInbox.svelte +10 -6
  23. package/dist/ui/RoleGrantOfferInbox.svelte.d.ts.map +1 -1
  24. package/dist/ui/account_sessions_state.svelte.d.ts +17 -7
  25. package/dist/ui/account_sessions_state.svelte.d.ts.map +1 -1
  26. package/dist/ui/account_sessions_state.svelte.js +32 -33
  27. package/dist/ui/admin_accounts_state.svelte.d.ts +48 -17
  28. package/dist/ui/admin_accounts_state.svelte.d.ts.map +1 -1
  29. package/dist/ui/admin_accounts_state.svelte.js +58 -76
  30. package/dist/ui/admin_invites_state.svelte.d.ts +14 -7
  31. package/dist/ui/admin_invites_state.svelte.d.ts.map +1 -1
  32. package/dist/ui/admin_invites_state.svelte.js +32 -48
  33. package/dist/ui/admin_sessions_state.svelte.d.ts +15 -8
  34. package/dist/ui/admin_sessions_state.svelte.d.ts.map +1 -1
  35. package/dist/ui/admin_sessions_state.svelte.js +30 -47
  36. package/dist/ui/app_settings_state.svelte.d.ts +8 -3
  37. package/dist/ui/app_settings_state.svelte.d.ts.map +1 -1
  38. package/dist/ui/app_settings_state.svelte.js +19 -27
  39. package/dist/ui/async_slot.svelte.d.ts +173 -0
  40. package/dist/ui/async_slot.svelte.d.ts.map +1 -0
  41. package/dist/ui/async_slot.svelte.js +241 -0
  42. package/dist/ui/audit_log_state.svelte.d.ts +8 -2
  43. package/dist/ui/audit_log_state.svelte.d.ts.map +1 -1
  44. package/dist/ui/audit_log_state.svelte.js +19 -18
  45. package/dist/ui/keyed_async_slot.svelte.d.ts +139 -0
  46. package/dist/ui/keyed_async_slot.svelte.d.ts.map +1 -0
  47. package/dist/ui/keyed_async_slot.svelte.js +177 -0
  48. package/dist/ui/role_grant_offers_state.svelte.d.ts +39 -7
  49. package/dist/ui/role_grant_offers_state.svelte.d.ts.map +1 -1
  50. package/dist/ui/role_grant_offers_state.svelte.js +34 -15
  51. package/dist/ui/table_state.svelte.d.ts +10 -7
  52. package/dist/ui/table_state.svelte.d.ts.map +1 -1
  53. package/dist/ui/table_state.svelte.js +11 -8
  54. package/package.json +1 -1
  55. package/dist/ui/loadable.svelte.d.ts +0 -60
  56. package/dist/ui/loadable.svelte.d.ts.map +0 -1
  57. package/dist/ui/loadable.svelte.js +0 -80
@@ -25,8 +25,8 @@
25
25
  void account_sessions.fetch();
26
26
 
27
27
  const handle_revoke_all = async (): Promise<void> => {
28
- await account_sessions.revoke_all();
29
- if (!account_sessions.error) {
28
+ await account_sessions.submit_revoke_all();
29
+ if (!account_sessions.revoke_all.error) {
30
30
  auth_state.verified = false;
31
31
  }
32
32
  };
@@ -48,11 +48,15 @@
48
48
  {/if}
49
49
  </h2>
50
50
 
51
- {#if account_sessions.loading}
51
+ {#if account_sessions.list.loading}
52
52
  <p class="text_50">loading sessions...</p>
53
- {:else if account_sessions.error}
54
- <p class="color_c_50">{account_sessions.error}</p>
53
+ {:else if account_sessions.list.error}
54
+ <p class="color_c_50">{account_sessions.list.error}</p>
55
55
  {:else}
56
+ {@const revoke_all_error = account_sessions.revoke_all.error}
57
+ {#if revoke_all_error}
58
+ <p class="color_c_50">{revoke_all_error}</p>
59
+ {/if}
56
60
  {#if account_sessions.active_count > 1}
57
61
  <div class="mb_md">
58
62
  <button type="button" onclick={() => handle_revoke_all()}>revoke all</button>
@@ -76,7 +80,18 @@
76
80
  {format_relative_time(row.expires_at)}
77
81
  </span>
78
82
  {:else if column.key === 'account_id'}
79
- <button type="button" onclick={() => account_sessions.revoke(row.id)}>revoke</button>
83
+ {@const revoking = account_sessions.revoke.loading(row.id)}
84
+ {@const revoke_error = account_sessions.revoke.error(row.id)}
85
+ <button
86
+ type="button"
87
+ disabled={revoking}
88
+ onclick={() => account_sessions.submit_revoke(row.id)}
89
+ >
90
+ {revoking ? 'revoking…' : 'revoke'}
91
+ </button>
92
+ {#if revoke_error}
93
+ <span class="color_c_50 font_size_sm">{revoke_error}</span>
94
+ {/if}
80
95
  {:else if column.format}
81
96
  {column.format(row[column.key], row)}
82
97
  {:else}
@@ -1 +1 @@
1
- {"version":3,"file":"AccountSessions.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AccountSessions.svelte"],"names":[],"mappings":"AAsGA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,eAAe;;kBAA+E,CAAC;AACnF,KAAK,eAAe,GAAG,YAAY,CAAC,OAAO,eAAe,CAAC,CAAC;AAC9D,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"AccountSessions.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AccountSessions.svelte"],"names":[],"mappings":"AAiHA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,eAAe;;kBAA+E,CAAC;AACnF,KAAK,eAAe,GAAG,YAAY,CAAC,OAAO,eAAe,CAAC,CAAC;AAC9D,eAAe,eAAe,CAAC"}
@@ -9,7 +9,11 @@
9
9
  * @module
10
10
  */
11
11
 
12
- import {AdminAccountsState, admin_accounts_rpc_context} from './admin_accounts_state.svelte.js';
12
+ import {
13
+ AdminAccountsState,
14
+ admin_accounts_rpc_context,
15
+ grant_key,
16
+ } from './admin_accounts_state.svelte.js';
13
17
  import ConfirmButton from './ConfirmButton.svelte';
14
18
  import Datatable from './Datatable.svelte';
15
19
  import type {DatatableColumn} from './datatable.js';
@@ -45,10 +49,10 @@
45
49
  </p>
46
50
  {/if}
47
51
 
48
- {#if admin_accounts.loading}
52
+ {#if admin_accounts.list.loading}
49
53
  <p class="text_50">loading accounts...</p>
50
- {:else if admin_accounts.error}
51
- <p class="color_c_50">{admin_accounts.error}</p>
54
+ {:else if admin_accounts.list.error}
55
+ <p class="color_c_50">{admin_accounts.list.error}</p>
52
56
  {:else}
53
57
  <Datatable {columns} rows={admin_accounts.accounts} height="400px">
54
58
  {#snippet cell(column, row)}
@@ -92,16 +96,17 @@
92
96
  {/if}
93
97
  {#if admin_accounts.has_rpc && row.actor}
94
98
  {@const actor_id = row.actor.id}
99
+ {@const revoke_error = admin_accounts.revoke.error(role_grant.id)}
95
100
  <ConfirmButton
96
- onconfirm={() => admin_accounts.revoke_role_grant(actor_id, role_grant.id)}
101
+ onconfirm={() => admin_accounts.submit_revoke(actor_id, role_grant.id)}
97
102
  title="revoke {role_grant.role}"
98
103
  class="sm"
99
- disabled={admin_accounts.revoking_ids.has(role_grant.id)}
100
- >
101
- {#snippet children(_popover, _confirm)}
102
- {admin_accounts.revoking_ids.has(role_grant.id) ? 'revoking…' : 'revoke'}
103
- {/snippet}
104
- </ConfirmButton>
104
+ label="revoke"
105
+ pending={admin_accounts.revoke.loading(role_grant.id)}
106
+ />
107
+ {#if revoke_error}
108
+ <span class="color_c_50 font_size_sm">{revoke_error}</span>
109
+ {/if}
105
110
  {/if}
106
111
  </div>
107
112
  {/each}
@@ -120,16 +125,17 @@
120
125
  </span>
121
126
  {/if}
122
127
  {#if admin_accounts.has_rpc}
128
+ {@const retract_error = admin_accounts.retract.error(offer.id)}
123
129
  <ConfirmButton
124
- onconfirm={() => admin_accounts.retract_offer(offer.id)}
130
+ onconfirm={() => admin_accounts.submit_retract(offer.id)}
125
131
  title="retract offer"
126
132
  class="sm"
127
- disabled={admin_accounts.retracting_ids.has(offer.id)}
128
- >
129
- {#snippet children(_popover, _confirm)}
130
- {admin_accounts.retracting_ids.has(offer.id) ? 'retracting…' : 'retract'}
131
- {/snippet}
132
- </ConfirmButton>
133
+ label="retract"
134
+ pending={admin_accounts.retract.loading(offer.id)}
135
+ />
136
+ {#if retract_error}
137
+ <span class="color_c_50 font_size_sm">{retract_error}</span>
138
+ {/if}
133
139
  {/if}
134
140
  </div>
135
141
  {/each}
@@ -139,24 +145,25 @@
139
145
  {:else if column.key === 'actor'}
140
146
  {#if admin_accounts.has_rpc}
141
147
  {#each admin_accounts.grantable_roles as role (role)}
148
+ {@const key = grant_key(row.account.id, role)}
149
+ {@const grant_error = admin_accounts.grant.error(key)}
142
150
  {#if !row.role_grants.some((p) => p.role === role) && !row.pending_offers.some((o) => o.role === role)}
143
151
  <ConfirmButton
144
- onconfirm={() => admin_accounts.create_role_grant(row.account.id, role)}
152
+ onconfirm={() => admin_accounts.submit_grant(row.account.id, role)}
145
153
  title="offer {role}"
146
154
  class="sm"
147
- disabled={admin_accounts.granting_keys.has(`${row.account.id}:${role}`)}
155
+ label={`+ ${role}`}
156
+ pending={admin_accounts.grant.loading(key)}
148
157
  >
149
- {#snippet children(_popover, _confirm)}
150
- {admin_accounts.granting_keys.has(`${row.account.id}:${role}`)
151
- ? 'offering…'
152
- : `+ ${role}`}
153
- {/snippet}
154
158
  {#snippet popover_content(_popover, do_confirm)}
155
159
  <button type="button" class="color_b bg_100" onclick={() => do_confirm()}>
156
160
  <span class="py_sm">offer '{role}' to @{row.account.username}</span>
157
161
  </button>
158
162
  {/snippet}
159
163
  </ConfirmButton>
164
+ {#if grant_error}
165
+ <span class="color_c_50 font_size_sm">{grant_error}</span>
166
+ {/if}
160
167
  {/if}
161
168
  {/each}
162
169
  {/if}
@@ -1 +1 @@
1
- {"version":3,"file":"AdminAccounts.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AdminAccounts.svelte"],"names":[],"mappings":"AA+JA,QAAA,MAAM,aAAa,2DAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"AdminAccounts.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AdminAccounts.svelte"],"names":[],"mappings":"AAmKA,QAAA,MAAM,aAAa,2DAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -98,10 +98,10 @@
98
98
  {/if}
99
99
  </div>
100
100
 
101
- {#if audit_log.loading}
101
+ {#if audit_log.list.loading}
102
102
  <p class="text_50">loading audit log...</p>
103
- {:else if audit_log.error}
104
- <p class="color_c_50">{audit_log.error}</p>
103
+ {:else if audit_log.list.error}
104
+ <p class="color_c_50">{audit_log.list.error}</p>
105
105
  {:else}
106
106
  <Datatable {columns} rows={audit_log.events} height="500px">
107
107
  {#snippet cell(column, row)}
@@ -25,12 +25,12 @@
25
25
  let invite_username = $state.raw('');
26
26
 
27
27
  const can_create = $derived(
28
- (invite_email.trim() || invite_username.trim()) && !admin_invites.creating,
28
+ (invite_email.trim() || invite_username.trim()) && !admin_invites.create.loading,
29
29
  );
30
30
 
31
31
  const handle_create = async (): Promise<void> => {
32
32
  if (!can_create) return;
33
- const success = await admin_invites.create_invite(
33
+ const success = await admin_invites.submit_create(
34
34
  invite_email.trim() || undefined,
35
35
  invite_username.trim() || undefined,
36
36
  );
@@ -80,7 +80,7 @@
80
80
  type="email"
81
81
  bind:value={invite_email}
82
82
  placeholder="email (optional)"
83
- disabled={admin_invites.creating}
83
+ disabled={admin_invites.create.loading}
84
84
  />
85
85
  </label>
86
86
  <label class="grow">
@@ -89,20 +89,24 @@
89
89
  type="text"
90
90
  bind:value={invite_username}
91
91
  placeholder="username (optional)"
92
- disabled={admin_invites.creating}
92
+ disabled={admin_invites.create.loading}
93
93
  />
94
94
  </label>
95
95
  </fieldset>
96
- <PendingButton pending={admin_invites.creating} disabled={!can_create} onclick={handle_create}>
96
+ <PendingButton
97
+ pending={admin_invites.create.loading}
98
+ disabled={!can_create}
99
+ onclick={handle_create}
100
+ >
97
101
  create invite
98
102
  </PendingButton>
99
103
  </form>
100
104
 
101
- {#if admin_invites.error}
102
- <p class="color_c_50">{admin_invites.error}</p>
105
+ {#if admin_invites.list.error || admin_invites.create.error}
106
+ <p class="color_c_50">{admin_invites.list.error ?? admin_invites.create.error}</p>
103
107
  {/if}
104
108
 
105
- {#if admin_invites.loading}
109
+ {#if admin_invites.list.loading}
106
110
  <p class="text_50">loading invites...</p>
107
111
  {:else}
108
112
  <Datatable {columns} rows={admin_invites.invites} height="400px">
@@ -129,16 +133,17 @@
129
133
  </span>
130
134
  {:else if column.key === 'id'}
131
135
  {#if !row.claimed_at}
136
+ {@const remove_error = admin_invites.remove.error(row.id)}
132
137
  <ConfirmButton
133
- onconfirm={() => admin_invites.delete_invite(row.id)}
138
+ onconfirm={() => admin_invites.submit_delete(row.id)}
134
139
  title="delete invite"
135
140
  class="sm"
136
- disabled={admin_invites.deleting_ids.has(row.id)}
137
- >
138
- {#snippet children(_popover, _confirm)}
139
- {admin_invites.deleting_ids.has(row.id) ? 'deleting...' : 'delete'}
140
- {/snippet}
141
- </ConfirmButton>
141
+ label="delete"
142
+ pending={admin_invites.remove.loading(row.id)}
143
+ />
144
+ {#if remove_error}
145
+ <span class="color_c_50 font_size_sm">{remove_error}</span>
146
+ {/if}
142
147
  {:else}
143
148
  <span class="text_50">-</span>
144
149
  {/if}
@@ -89,10 +89,10 @@
89
89
  <h3>accounts</h3>
90
90
  <a href={resolve('/admin/accounts' as any)} class="text_50 font_size_sm">view all &rarr;</a>
91
91
  </div>
92
- {#if accounts.loading}
92
+ {#if accounts.list.loading}
93
93
  <p class="text_50">loading...</p>
94
- {:else if accounts.error}
95
- <p class="color_c_50">{accounts.error}</p>
94
+ {:else if accounts.list.error}
95
+ <p class="color_c_50">{accounts.list.error}</p>
96
96
  {:else}
97
97
  <div class="baseline-row gap_xs">
98
98
  <strong class="font_size_lg">{accounts.account_count}</strong>
@@ -131,10 +131,10 @@
131
131
  <h3>sessions</h3>
132
132
  <a href={resolve('/admin/sessions' as any)} class="text_50 font_size_sm">view all &rarr;</a>
133
133
  </div>
134
- {#if sessions.loading}
134
+ {#if sessions.list.loading}
135
135
  <p class="text_50">loading...</p>
136
- {:else if sessions.error}
137
- <p class="color_c_50">{sessions.error}</p>
136
+ {:else if sessions.list.error}
137
+ <p class="color_c_50">{sessions.list.error}</p>
138
138
  {:else}
139
139
  <div class="baseline-row gap_xs">
140
140
  <strong class="font_size_lg">{sessions.active_count}</strong>
@@ -161,10 +161,10 @@
161
161
  <h3>invites</h3>
162
162
  <a href={resolve('/admin/invites' as any)} class="text_50 font_size_sm">view all &rarr;</a>
163
163
  </div>
164
- {#if invites.loading}
164
+ {#if invites.list.loading}
165
165
  <p class="text_50">loading...</p>
166
- {:else if invites.error}
167
- <p class="color_c_50">{invites.error}</p>
166
+ {:else if invites.list.error}
167
+ <p class="color_c_50">{invites.list.error}</p>
168
168
  {:else}
169
169
  <div class="baseline-row gap_sm">
170
170
  <span class="text_50">public signup</span>
@@ -206,10 +206,10 @@
206
206
  <h3>recent activity</h3>
207
207
  <a href={resolve('/admin/audit-log' as any)} class="text_50 font_size_sm">view all &rarr;</a>
208
208
  </div>
209
- {#if audit_log.loading}
209
+ {#if audit_log.list.loading}
210
210
  <p class="text_50">loading...</p>
211
- {:else if audit_log.error}
212
- <p class="color_c_50">{audit_log.error}</p>
211
+ {:else if audit_log.list.error}
212
+ <p class="color_c_50">{audit_log.list.error}</p>
213
213
  {:else if recent_events.length === 0}
214
214
  <p class="text_50">no events</p>
215
215
  {:else}
@@ -234,10 +234,10 @@
234
234
  <h3>security</h3>
235
235
  <a href={resolve('/admin/audit-log' as any)} class="text_50 font_size_sm">audit log &rarr;</a>
236
236
  </div>
237
- {#if audit_log.loading}
237
+ {#if audit_log.list.loading}
238
238
  <p class="text_50">loading...</p>
239
- {:else if audit_log.error}
240
- <p class="color_c_50">{audit_log.error}</p>
239
+ {:else if audit_log.list.error}
240
+ <p class="color_c_50">{audit_log.list.error}</p>
241
241
  {:else}
242
242
  <div class="baseline-row gap_xs">
243
243
  <strong class="font_size_lg" class:color_c_50={failed_logins.length > 0}>
@@ -271,10 +271,10 @@
271
271
  <div class="panel-header">
272
272
  <h3>system</h3>
273
273
  </div>
274
- {#if app_settings.loading}
274
+ {#if app_settings.list.loading}
275
275
  <p class="text_50">loading...</p>
276
- {:else if app_settings.error}
277
- <p class="color_c_50">{app_settings.error}</p>
276
+ {:else if app_settings.list.error}
277
+ <p class="color_c_50">{app_settings.list.error}</p>
278
278
  {:else}
279
279
  <div class="baseline-row gap_sm">
280
280
  <span class="text_50">public signup</span>
@@ -308,10 +308,8 @@
308
308
  await auth_state.logout();
309
309
  }}
310
310
  title="log out"
311
+ label="log out"
311
312
  >
312
- {#snippet children(_popover, _confirm)}
313
- log out
314
- {/snippet}
315
313
  {#snippet popover_button_content()}
316
314
  <span class="p_md"> log out </span>
317
315
  {/snippet}
@@ -1 +1 @@
1
- {"version":3,"file":"AdminOverview.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AdminOverview.svelte"],"names":[],"mappings":"AA4UA,QAAA,MAAM,aAAa,2DAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"AdminOverview.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AdminOverview.svelte"],"names":[],"mappings":"AA2UA,QAAA,MAAM,aAAa,2DAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -40,10 +40,10 @@
40
40
  <section>
41
41
  <h1>role_grant history</h1>
42
42
 
43
- {#if audit_log.loading}
43
+ {#if audit_log.role_grant_history.loading}
44
44
  <p class="text_50">loading role_grant history...</p>
45
- {:else if audit_log.error}
46
- <p class="color_c_50">{audit_log.error}</p>
45
+ {:else if audit_log.role_grant_history.error}
46
+ <p class="color_c_50">{audit_log.role_grant_history.error}</p>
47
47
  {:else}
48
48
  <Datatable {columns} rows={audit_log.role_grant_history_events} height="400px" row_key="id">
49
49
  {#snippet cell(column, row)}
@@ -40,10 +40,10 @@
40
40
  </p>
41
41
  {/if}
42
42
 
43
- {#if admin_sessions.loading}
43
+ {#if admin_sessions.list.loading}
44
44
  <p class="text_50">loading sessions...</p>
45
- {:else if admin_sessions.error}
46
- <p class="color_c_50">{admin_sessions.error}</p>
45
+ {:else if admin_sessions.list.error}
46
+ <p class="color_c_50">{admin_sessions.list.error}</p>
47
47
  {:else}
48
48
  <Datatable {columns} rows={admin_sessions.sessions} height="400px">
49
49
  {#snippet cell(column, row)}
@@ -63,30 +63,28 @@
63
63
  </span>
64
64
  {:else if column.key === 'account_id'}
65
65
  {#if admin_sessions.has_rpc}
66
+ {@const revoke_sessions_error = admin_sessions.revoke_sessions.error(row.account_id)}
67
+ {@const revoke_tokens_error = admin_sessions.revoke_tokens.error(row.account_id)}
66
68
  <ConfirmButton
67
- onconfirm={() => admin_sessions.revoke_all_for_account(row.account_id)}
69
+ onconfirm={() => admin_sessions.submit_revoke_sessions(row.account_id)}
68
70
  title="revoke all sessions for {row.username}"
69
71
  class="sm"
70
- disabled={admin_sessions.revoking_account_ids.has(row.account_id)}
71
- >
72
- {#snippet children(_popover, _confirm)}
73
- {admin_sessions.revoking_account_ids.has(row.account_id)
74
- ? 'revoking…'
75
- : 'revoke sessions'}
76
- {/snippet}
77
- </ConfirmButton>
72
+ label="revoke sessions"
73
+ pending={admin_sessions.revoke_sessions.loading(row.account_id)}
74
+ />
75
+ {#if revoke_sessions_error}
76
+ <span class="color_c_50 font_size_sm">{revoke_sessions_error}</span>
77
+ {/if}
78
78
  <ConfirmButton
79
- onconfirm={() => admin_sessions.revoke_all_tokens_for_account(row.account_id)}
79
+ onconfirm={() => admin_sessions.submit_revoke_tokens(row.account_id)}
80
80
  title="revoke all tokens for {row.username}"
81
81
  class="sm"
82
- disabled={admin_sessions.revoking_token_account_ids.has(row.account_id)}
83
- >
84
- {#snippet children(_popover, _confirm)}
85
- {admin_sessions.revoking_token_account_ids.has(row.account_id)
86
- ? 'revoking…'
87
- : 'revoke tokens'}
88
- {/snippet}
89
- </ConfirmButton>
82
+ label="revoke tokens"
83
+ pending={admin_sessions.revoke_tokens.loading(row.account_id)}
84
+ />
85
+ {#if revoke_tokens_error}
86
+ <span class="color_c_50 font_size_sm">{revoke_tokens_error}</span>
87
+ {/if}
90
88
  {/if}
91
89
  {:else if column.format}
92
90
  {column.format(row[column.key], row)}
@@ -1 +1 @@
1
- {"version":3,"file":"AdminSessions.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AdminSessions.svelte"],"names":[],"mappings":"AAwGA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,aAAa;;kBAA+E,CAAC;AACjF,KAAK,aAAa,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAC1D,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"AdminSessions.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AdminSessions.svelte"],"names":[],"mappings":"AAoGA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,aAAa;;kBAA+E,CAAC;AACjF,KAAK,aAAa,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAC1D,eAAe,aAAa,CAAC"}
@@ -30,10 +30,8 @@
30
30
  await auth_state.logout();
31
31
  }}
32
32
  title="log out"
33
+ label="log out"
33
34
  >
34
- {#snippet children(_popover, _confirm)}
35
- log out
36
- {/snippet}
37
35
  {#snippet popover_button_content()}
38
36
  <span class="p_md"> log out </span>
39
37
  {/snippet}
@@ -1 +1 @@
1
- {"version":3,"file":"AdminSettings.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AdminSettings.svelte"],"names":[],"mappings":"AA+CA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,aAAa;;kBAA+E,CAAC;AACjF,KAAK,aAAa,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAC1D,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"AdminSettings.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AdminSettings.svelte"],"names":[],"mappings":"AA8CA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,aAAa;;kBAA+E,CAAC;AACjF,KAAK,aAAa,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAC1D,eAAe,aAAa,CAAC"}