Add group icons to access tile and reduce API calls

This commit is contained in:
Andrew Kingston 2022-09-23 15:13:02 +01:00
parent d30353326b
commit 3479176021
3 changed files with 67 additions and 33 deletions

View File

@ -23,7 +23,7 @@
import AccessTab from "../_components/AccessTab.svelte" import AccessTab from "../_components/AccessTab.svelte"
import { API } from "api" import { API } from "api"
import { store } from "builderStore" import { store } from "builderStore"
import { apps, auth } from "stores/portal" import { apps, auth, groups } from "stores/portal"
import analytics, { Events, EventSource } from "analytics" import analytics, { Events, EventSource } from "analytics"
import { AppStatus } from "constants" import { AppStatus } from "constants"
import AppLockModal from "components/common/AppLockModal.svelte" import AppLockModal from "components/common/AppLockModal.svelte"
@ -192,6 +192,7 @@
try { try {
await API.syncApp(application) await API.syncApp(application)
deployments = await fetchDeployments() deployments = await fetchDeployments()
await groups.actions.init()
if (!apps.length) { if (!apps.length) {
await apps.load() await apps.load()
} }

View File

@ -78,8 +78,6 @@
onMount(async () => { onMount(async () => {
try { try {
await groups.actions.init()
await apps.load()
await roles.fetch() await roles.fetch()
} catch (error) { } catch (error) {
notifications.error(error) notifications.error(error)

View File

@ -5,10 +5,11 @@
import { store } from "builderStore" import { store } from "builderStore"
import clientPackage from "@budibase/client/package.json" import clientPackage from "@budibase/client/package.json"
import { processStringSync } from "@budibase/string-templates" import { processStringSync } from "@budibase/string-templates"
import { users, auth, apps } from "stores/portal" import { users, auth, apps, groups } from "stores/portal"
import { createEventDispatcher } from "svelte" import { createEventDispatcher } from "svelte"
import { fetchData } from "@budibase/frontend-core" import { fetchData } from "@budibase/frontend-core"
import { API } from "api" import { API } from "api"
import GroupIcon from "../../manage/groups/_components/GroupIcon.svelte"
export let app export let app
export let deployments export let deployments
@ -40,6 +41,13 @@
appId: apps.getProdAppID(app.devId), appId: apps.getProdAppID(app.devId),
}, },
}) })
$: prodAppId = apps.getProdAppID(app.devId)
$: appGroups = $groups.filter(group => {
if (!group.roles) {
return false
}
return groups.actions.getGroupAppIds(group).includes(prodAppId)
})
const unpublishApp = () => { const unpublishApp = () => {
dispatch("unpublish", app) dispatch("unpublish", app)
@ -156,19 +164,35 @@
}} }}
dataCy={"access"} dataCy={"access"}
> >
<div class="last-edited-content"> {#if appUsers.length || appGroups.length}
{#if appUsers.length}
<Layout noPadding gap="S"> <Layout noPadding gap="S">
<div class="users-tab"> <div class="access-tab-content">
{#if appUsers.length}
<div class="users">
<div class="list">
{#each appUsers.slice(0, 4) as user} {#each appUsers.slice(0, 4) as user}
<Avatar size="M" initials={getInitials(user)} /> <Avatar size="M" initials={getInitials(user)} />
{/each} {/each}
</div> </div>
<div class="text">
<div class="users-text">
{appUsers.length} {appUsers.length}
{appUsers.length > 1 ? `users have` : `user has`} access to this {appUsers.length > 1 ? "users" : "user"} assigned
app </div>
</div>
{/if}
{#if appGroups.length}
<div class="groups">
<div class="list">
{#each appGroups.slice(0, 4) as group}
<GroupIcon {group} />
{/each}
</div>
<div class="text">
{appGroups.length} user
{appGroups.length > 1 ? "groups" : "group"} assigned
</div>
</div>
{/if}
</div> </div>
</Layout> </Layout>
{:else} {:else}
@ -179,7 +203,6 @@
</div> </div>
</Layout> </Layout>
{/if} {/if}
</div>
</DashCard> </DashCard>
{/if} {/if}
</div> </div>
@ -236,14 +259,26 @@
grid-template-columns: repeat(auto-fill, minmax(30%, 1fr)); grid-template-columns: repeat(auto-fill, minmax(30%, 1fr));
} }
.users-tab { .access-tab-content {
display: flex; display: flex;
gap: var(--spacing-s); flex-direction: row;
justify-content: flex-start;
align-items: flex-start;
gap: var(--spacing-xl);
flex-wrap: wrap;
}
.access-tab-content > * {
flex: 1 1 0;
}
.access-tab-content .list {
display: flex;
gap: 4px;
}
.access-tab-content .text {
color: var(--spectrum-global-color-gray-600);
margin-top: var(--spacing-s);
} }
.users-text {
color: var(--spectrum-global-color-gray-600);
}
.overview-tab .bottom, .overview-tab .bottom,
.automation-metrics { .automation-metrics {
display: grid; display: grid;