mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-10-08 16:02:30 +00:00
minor UX improvements
This commit is contained in:
@@ -31,6 +31,7 @@
|
||||
}
|
||||
</script>
|
||||
|
||||
<h3 class="mb-4">Add new user to instance</h3>
|
||||
<div class="flex flex-row flex-wrap gap-2 mb-2 items-end">
|
||||
<label class="block shrink min-w-0">
|
||||
<span class="text-secondary text-sm">Email</span>
|
||||
|
||||
@@ -44,6 +44,8 @@
|
||||
}
|
||||
|
||||
let tab: 'users' | 'settings' = 'users'
|
||||
|
||||
let nbDisplayed = 50
|
||||
</script>
|
||||
|
||||
<SearchItems
|
||||
@@ -75,6 +77,8 @@
|
||||
<div class="py-2 mb-4">
|
||||
<InviteGlobalUser on:new={listUsers} />
|
||||
</div>
|
||||
|
||||
<h3>All instance users</h3>
|
||||
<div class="pb-1" />
|
||||
<div>
|
||||
<input placeholder="Search users" bind:value={filter} class="input mt-1" />
|
||||
@@ -90,7 +94,7 @@
|
||||
</tr>
|
||||
<tbody slot="body" class="overflow-y-auto w-full h-full max-h-full">
|
||||
{#if filteredUsers && users}
|
||||
{#each filteredUsers as { email, super_admin, login_type, name } (email)}
|
||||
{#each filteredUsers.slice(0, nbDisplayed) as { email, super_admin, login_type, name } (email)}
|
||||
<tr class="border">
|
||||
<td>{email}</td>
|
||||
<td>{login_type}</td>
|
||||
@@ -136,6 +140,13 @@
|
||||
</tbody>
|
||||
</TableCustom>
|
||||
</div>
|
||||
{#if filteredUsers && filteredUsers?.length > 50 && nbDisplayed < filteredUsers.length}
|
||||
<span class="text-xs"
|
||||
>{nbDisplayed} users out of {filteredUsers.length}
|
||||
<button class="ml-4" on:click={() => (nbDisplayed += 50)}>load 50 more</button
|
||||
></span
|
||||
>
|
||||
{/if}
|
||||
</div>
|
||||
</TabContent>
|
||||
<TabContent value="settings">
|
||||
|
||||
@@ -387,30 +387,12 @@
|
||||
{/each}
|
||||
{:else if filteredItems.length === 0}
|
||||
<NoItemFound />
|
||||
{:else}
|
||||
{:else if treeView}
|
||||
{@const groupedItems = groupItems(items)}
|
||||
<div class="border rounded-md">
|
||||
{#if treeView}
|
||||
{#each (groupItems(items) ?? []).slice(0, nbDisplayed) as item (item['folderName'] ?? 'user__' + item['username'])}
|
||||
{#if item}
|
||||
<TreeView
|
||||
{item}
|
||||
on:scriptChanged={loadScripts}
|
||||
on:flowChanged={loadFlows}
|
||||
on:appChanged={loadApps}
|
||||
on:rawAppChanged={loadRawApps}
|
||||
on:reload={() => {
|
||||
loadScripts()
|
||||
loadFlows()
|
||||
loadApps()
|
||||
loadRawApps()
|
||||
}}
|
||||
{showCode}
|
||||
/>
|
||||
{/if}
|
||||
{/each}
|
||||
{:else}
|
||||
{#each (items ?? []).slice(0, nbDisplayed) as item (item.type + '/' + item.path)}
|
||||
<Item
|
||||
{#each groupedItems.slice(0, nbDisplayed) as item (item['folderName'] ?? 'user__' + item['username'])}
|
||||
{#if item}
|
||||
<TreeView
|
||||
{item}
|
||||
on:scriptChanged={loadScripts}
|
||||
on:flowChanged={loadFlows}
|
||||
@@ -424,10 +406,35 @@
|
||||
}}
|
||||
{showCode}
|
||||
/>
|
||||
{/each}
|
||||
{/if}
|
||||
{/if}
|
||||
{/each}
|
||||
</div>
|
||||
{#if items && items?.length > 30 && !treeView && nbDisplayed < items.length}
|
||||
{#if groupedItems.length > 30 && nbDisplayed < groupedItems.length}
|
||||
<span class="text-xs"
|
||||
>{nbDisplayed} root nodes out of {groupedItems.length}
|
||||
<button class="ml-4" on:click={() => (nbDisplayed += 30)}>load 30 more</button></span
|
||||
>
|
||||
{/if}
|
||||
{:else}
|
||||
<div class="border rounded-md">
|
||||
{#each (items ?? []).slice(0, nbDisplayed) as item (item.type + '/' + item.path)}
|
||||
<Item
|
||||
{item}
|
||||
on:scriptChanged={loadScripts}
|
||||
on:flowChanged={loadFlows}
|
||||
on:appChanged={loadApps}
|
||||
on:rawAppChanged={loadRawApps}
|
||||
on:reload={() => {
|
||||
loadScripts()
|
||||
loadFlows()
|
||||
loadApps()
|
||||
loadRawApps()
|
||||
}}
|
||||
{showCode}
|
||||
/>
|
||||
{/each}
|
||||
</div>
|
||||
{#if items && items?.length > 30 && nbDisplayed < items.length}
|
||||
<span class="text-xs"
|
||||
>{nbDisplayed} items out of {items.length}
|
||||
<button class="ml-4" on:click={() => (nbDisplayed += 30)}>load 30 more</button></span
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
</div>
|
||||
{#if opened}
|
||||
<div transition:slide>
|
||||
{#each item.items.slice(0, showMax) as subItem (subItem['path'] ?? 'folder__' + subItem['folderName'])}
|
||||
{#each item.items.slice(0, showMax) as subItem ((subItem['path'] ? subItem['type'] + '__' + subItem['path'] : undefined) ?? 'folder__' + subItem['folderName'])}
|
||||
<svelte:self
|
||||
item={subItem}
|
||||
on:scriptChanged
|
||||
@@ -71,6 +71,8 @@
|
||||
/>
|
||||
{/each}
|
||||
{#if showMax < item.items.length}
|
||||
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
||||
<div
|
||||
class="text-center text-sm text-secondary cursor-pointer hover:text-primary"
|
||||
on:click={() => {
|
||||
@@ -117,7 +119,7 @@
|
||||
</div>
|
||||
{#if opened}
|
||||
<div transition:slide>
|
||||
{#each item.items.slice(0, showMax) as subItem (subItem['path'] ?? 'folder__' + subItem['folderName'])}
|
||||
{#each item.items.slice(0, showMax) as subItem ((subItem['path'] ? subItem['type'] + '__' + subItem['path'] : undefined) ?? 'folder__' + subItem['folderName'])}
|
||||
<svelte:self
|
||||
item={subItem}
|
||||
on:scriptChanged
|
||||
|
||||
@@ -78,6 +78,8 @@
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
let nbInviteDisplayed = 50
|
||||
</script>
|
||||
|
||||
<SearchItems
|
||||
@@ -273,7 +275,7 @@
|
||||
</Head>
|
||||
<tbody class="divide-y bg-surface">
|
||||
{#if invites?.length > 0}
|
||||
{#each invites as { email, is_admin, operator }}
|
||||
{#each invites.slice(0, nbInviteDisplayed) as { email, is_admin, operator }}
|
||||
<Row>
|
||||
<Cell first>{email}</Cell>
|
||||
<Cell>
|
||||
@@ -314,6 +316,12 @@
|
||||
{/if}
|
||||
</tbody>
|
||||
</DataTable>
|
||||
{#if invites && invites?.length > 50 && nbInviteDisplayed < invites.length}
|
||||
<span class="text-xs"
|
||||
>{nbInviteDisplayed} invites out of {invites.length}
|
||||
<button class="ml-4" on:click={() => (nbInviteDisplayed += 50)}>load 50 more</button></span
|
||||
>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<PageHeader
|
||||
|
||||
@@ -26,12 +26,13 @@
|
||||
import { sendUserToast } from '$lib/toast'
|
||||
import { setQueryWithoutLoad, emptyString } from '$lib/utils'
|
||||
import { faSlack } from '@fortawesome/free-brands-svg-icons'
|
||||
import { faBarsStaggered, faScroll } from '@fortawesome/free-solid-svg-icons'
|
||||
import { faBarsStaggered, faCrown, faScroll } from '@fortawesome/free-solid-svg-icons'
|
||||
import { Slack } from 'lucide-svelte'
|
||||
|
||||
import PremiumInfo from '$lib/components/settings/PremiumInfo.svelte'
|
||||
import Toggle from '$lib/components/Toggle.svelte'
|
||||
import TestOpenaiKey from '$lib/components/copilot/TestOpenaiKey.svelte'
|
||||
import { Icon } from 'svelte-awesome'
|
||||
|
||||
const slackErrorHandler = 'hub/5792/workspace-or-schedule-error-handler-slack'
|
||||
|
||||
@@ -209,7 +210,18 @@
|
||||
|
||||
<CenteredPage>
|
||||
{#if $userStore?.is_admin || $superadmin}
|
||||
<PageHeader title="Workspace settings: {$workspaceStore}" />
|
||||
<PageHeader title="Workspace settings: {$workspaceStore}"
|
||||
>{#if $superadmin}
|
||||
<Button
|
||||
variant="border"
|
||||
color="dark"
|
||||
size="sm"
|
||||
on:click={() => goto('#superadmin-settings')}
|
||||
>
|
||||
Superadmin settings
|
||||
</Button>
|
||||
{/if}</PageHeader
|
||||
>
|
||||
|
||||
<div class="overflow-x-auto scrollbar-hidden">
|
||||
<Tabs
|
||||
|
||||
Reference in New Issue
Block a user