mirror of
https://github.com/ClusterCockpit/cc-backend
synced 2025-04-29 14:41:43 +02:00
adapt and improve svelte taglist component
This commit is contained in:
parent
277f964b30
commit
a3fb471546
@ -2,49 +2,142 @@
|
|||||||
@component Tag List Svelte Component. Displays All Tags, Allows deletion.
|
@component Tag List Svelte Component. Displays All Tags, Allows deletion.
|
||||||
|
|
||||||
Properties:
|
Properties:
|
||||||
- `authlevel Int!`: Current Users Authority Level
|
- `username String!`: Users username.
|
||||||
- `tagmap Object!`: Map of Appwide Tags
|
- `isAdmin Bool!`: User has Admin Auth.
|
||||||
|
- `tagmap Object!`: Map of accessible, appwide tags. Prefiltered in backend.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// import { Card, CardHeader, CardTitle } from "@sveltestrap/sveltestrap";
|
import {
|
||||||
|
gql,
|
||||||
|
getContextClient,
|
||||||
|
mutationStore,
|
||||||
|
} from "@urql/svelte";
|
||||||
|
import {
|
||||||
|
Badge,
|
||||||
|
InputGroup,
|
||||||
|
Icon,
|
||||||
|
Button,
|
||||||
|
Spinner,
|
||||||
|
} from "@sveltestrap/sveltestrap";
|
||||||
|
import {
|
||||||
|
init,
|
||||||
|
} from "./generic/utils.js";
|
||||||
|
|
||||||
// export let authlevel;
|
export let username;
|
||||||
|
export let isAdmin;
|
||||||
export let tagmap;
|
export let tagmap;
|
||||||
|
|
||||||
|
const {} = init();
|
||||||
|
const client = getContextClient();
|
||||||
|
|
||||||
|
let pendingChange = "none";
|
||||||
|
|
||||||
|
const removeTagMutation = ({ tagIds }) => {
|
||||||
|
return mutationStore({
|
||||||
|
client: client,
|
||||||
|
query: gql`
|
||||||
|
mutation ($job: ID!, $tagIds: [ID!]!) {
|
||||||
|
removeTag(tagIds: $tagIds) {
|
||||||
|
id
|
||||||
|
type
|
||||||
|
name
|
||||||
|
scope
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
variables: { tagIds },
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
function removeTag(tag, tagType) {
|
||||||
|
pendingChange = tagType;
|
||||||
|
removeTagMutation({tagIds: [tag.id] }).subscribe(
|
||||||
|
(res) => {
|
||||||
|
if (res.fetching === false && !res.error) {
|
||||||
|
tagmap = res.data.removeTag;
|
||||||
|
pendingChange = "none";
|
||||||
|
} else if (res.fetching === false && res.error) {
|
||||||
|
throw res.error;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$: console.log(username, isAdmin)
|
||||||
|
$: console.log(pendingChange, tagmap)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row justify-content-center">
|
<div class="row justify-content-center">
|
||||||
<div class="col-10">
|
<div class="col-10">
|
||||||
{#each Object.entries(tagmap) as [tagType, tagList]}
|
{#each Object.entries(tagmap) as [tagType, tagList]}
|
||||||
<div class="my-3 p-2 bg-secondary rounded text-white"> <!-- text-capitalize -->
|
<div class="my-3 p-2 bg-secondary rounded text-white"> <!-- text-capitalize -->
|
||||||
Tag Type: <b>{tagType}</b>
|
Tag Type: <b>{tagType}</b>
|
||||||
<span style="float: right; padding-bottom: 0.4rem; padding-top: 0.4rem;" class="badge bg-light text-secondary">
|
{#if pendingChange === tagType}
|
||||||
{tagList.length} Tag{(tagList.length != 1)?'s':''}
|
<Spinner size="sm" secondary />
|
||||||
</span>
|
{/if}
|
||||||
</div>
|
<span style="float: right; padding-bottom: 0.4rem; padding-top: 0.4rem;" class="badge bg-light text-secondary">
|
||||||
{#each tagList as tag (tag.id)}
|
{tagList.length} Tag{(tagList.length != 1)?'s':''}
|
||||||
{#if tag.scope == "global"}
|
</span>
|
||||||
<a class="btn btn-outline-secondary" href="/monitoring/jobs/?tag={tag.id}" role="button">
|
|
||||||
{tag.name}
|
|
||||||
<span class="badge bg-primary mr-1">{tag.count} Job{(tag.count != 1)?'s':''}</span>
|
|
||||||
<span style="background-color:#c85fc8;" class="badge text-dark">Global</span>
|
|
||||||
</a>
|
|
||||||
{:else if tag.scope == "admin"}
|
|
||||||
<a class="btn btn-outline-secondary" href="/monitoring/jobs/?tag={tag.id}" role="button">
|
|
||||||
{tag.name}
|
|
||||||
<span class="badge bg-primary mr-1">{tag.count} Job{(tag.count != 1)?'s':''}</span>
|
|
||||||
<span style="background-color:#19e5e6;" class="badge text-dark">Admin</span>
|
|
||||||
</a>
|
|
||||||
{:else}
|
|
||||||
<a class="btn btn-outline-secondary" href="/monitoring/jobs/?tag={tag.id}" role="button">
|
|
||||||
{tag.name}
|
|
||||||
<span class="badge bg-primary mr-1">{tag.count} Job{(tag.count != 1)?'s':''}</span>
|
|
||||||
<span class="badge bg-warning text-dark">Private</span>
|
|
||||||
</a>
|
|
||||||
{/if}
|
|
||||||
{/each}
|
|
||||||
{/each}
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="d-inline-flex flex-wrap">
|
||||||
|
{#each tagList as tag (tag.id)}
|
||||||
|
{#if tag.scope == "global"}
|
||||||
|
<InputGroup class="w-auto flex-nowrap" style="margin-right: 0.5rem; margin-bottom: 0.5rem;">
|
||||||
|
<Button outline color="secondary" href="/monitoring/jobs/?tag={tag.id}" target="_blank">
|
||||||
|
<Badge color="light" style="font-size:medium;" border>{tag.name}</Badge> :
|
||||||
|
<Badge color="primary" pill>{tag.count} Job{(tag.count != 1)?'s':''}</Badge>
|
||||||
|
<Badge style="background-color:#c85fc8 !important;" pill>Global</Badge>
|
||||||
|
</Button>
|
||||||
|
{#if isAdmin}
|
||||||
|
<Button
|
||||||
|
size="sm"
|
||||||
|
color="danger"
|
||||||
|
on:click={() => removeTag(tag, tagType)}
|
||||||
|
>
|
||||||
|
<Icon name="x" />
|
||||||
|
</Button>
|
||||||
|
{/if}
|
||||||
|
</InputGroup>
|
||||||
|
{:else if tag.scope == "admin"}
|
||||||
|
<InputGroup class="w-auto flex-nowrap" style="margin-right: 0.5rem; margin-bottom: 0.5rem;">
|
||||||
|
<Button outline color="secondary" href="/monitoring/jobs/?tag={tag.id}" target="_blank">
|
||||||
|
<Badge color="light" style="font-size:medium;" border>{tag.name}</Badge> :
|
||||||
|
<Badge color="primary" pill>{tag.count} Job{(tag.count != 1)?'s':''}</Badge>
|
||||||
|
<Badge style="background-color:#19e5e6 !important;" pill>Admin</Badge>
|
||||||
|
</Button>
|
||||||
|
{#if isAdmin}
|
||||||
|
<Button
|
||||||
|
size="sm"
|
||||||
|
color="danger"
|
||||||
|
on:click={() => removeTag(tag, tagType)}
|
||||||
|
>
|
||||||
|
<Icon name="x" />
|
||||||
|
</Button>
|
||||||
|
{/if}
|
||||||
|
</InputGroup>
|
||||||
|
{:else}
|
||||||
|
<InputGroup class="w-auto flex-nowrap" style="margin-right: 0.5rem; margin-bottom: 0.5rem;">
|
||||||
|
<Button outline color="secondary" href="/monitoring/jobs/?tag={tag.id}" target="_blank">
|
||||||
|
<Badge color="light" style="font-size:medium;" border>{tag.name}</Badge> :
|
||||||
|
<Badge color="primary" pill>{tag.count} Job{(tag.count != 1)?'s':''}</Badge>
|
||||||
|
<Badge color="warning" pill>Private</Badge>
|
||||||
|
</Button>
|
||||||
|
{#if tag.scope == username}
|
||||||
|
<Button
|
||||||
|
size="sm"
|
||||||
|
color="danger"
|
||||||
|
on:click={() => removeTag(tag, tagType)}
|
||||||
|
>
|
||||||
|
<Icon name="x" />
|
||||||
|
</Button>
|
||||||
|
{/if}
|
||||||
|
</InputGroup>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -4,9 +4,13 @@ import Tags from './Tags.root.svelte'
|
|||||||
new Tags({
|
new Tags({
|
||||||
target: document.getElementById('svelte-app'),
|
target: document.getElementById('svelte-app'),
|
||||||
props: {
|
props: {
|
||||||
// authlevel: authlevel,
|
username: username,
|
||||||
|
isAdmin: isAdmin,
|
||||||
tagmap: tagmap,
|
tagmap: tagmap,
|
||||||
}
|
},
|
||||||
|
context: new Map([
|
||||||
|
['cc-config', clusterCockpitConfig]
|
||||||
|
])
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,8 +6,10 @@
|
|||||||
{{end}}
|
{{end}}
|
||||||
{{define "javascript"}}
|
{{define "javascript"}}
|
||||||
<script>
|
<script>
|
||||||
const authlevel = {{ .User.GetAuthLevel }};
|
const username = {{ .User.Username }};
|
||||||
|
const isAdmin = {{ .User.HasRole .Roles.admin }};
|
||||||
const tagmap = {{ .Infos.tagmap }};
|
const tagmap = {{ .Infos.tagmap }};
|
||||||
|
const clusterCockpitConfig = {{ .Config }};
|
||||||
</script>
|
</script>
|
||||||
<script src='/build/taglist.js'></script>
|
<script src='/build/taglist.js'></script>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user