mirror of
https://github.com/harvester/harvester-ui-extension.git
synced 2025-12-13 21:21:44 +00:00
Copied over the cluster explorers page and removed the portions about projects
Looks like the fork didn't include the projects section.
This commit is contained in:
parent
6bb4b8105b
commit
d2512e6e04
221
pkg/harvester/components/Members.vue
Normal file
221
pkg/harvester/components/Members.vue
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
<script>
|
||||||
|
import { MANAGEMENT, NORMAN, VIRTUAL_TYPES } from '@shell/config/types';
|
||||||
|
import ResourceTable from '@shell/components/ResourceTable';
|
||||||
|
import Masthead from '@shell/components/ResourceList/Masthead';
|
||||||
|
import { AGE, ROLE, STATE, PRINCIPAL } from '@shell/config/table-headers';
|
||||||
|
import Banner from '@components/Banner/Banner.vue';
|
||||||
|
import Tabbed from '@shell/components/Tabbed/index.vue';
|
||||||
|
import Tab from '@shell/components/Tabbed/Tab.vue';
|
||||||
|
import SortableTable from '@shell/components/SortableTable';
|
||||||
|
import { mapGetters } from 'vuex';
|
||||||
|
import { allHash } from '@shell/utils/promise';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'Members',
|
||||||
|
|
||||||
|
components: {
|
||||||
|
Banner,
|
||||||
|
Masthead,
|
||||||
|
ResourceTable,
|
||||||
|
Tabbed,
|
||||||
|
Tab,
|
||||||
|
SortableTable
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
// Cluster tole template binding create route - defaults to the explorer route
|
||||||
|
createLocationOverride: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {
|
||||||
|
return {
|
||||||
|
name: 'c-cluster-product-resource-create',
|
||||||
|
params: { resource: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async fetch() {
|
||||||
|
const clusterRoleTemplateBindingSchema = this.$store.getters[
|
||||||
|
`rancher/schemaFor`
|
||||||
|
](NORMAN.CLUSTER_ROLE_TEMPLATE_BINDING);
|
||||||
|
|
||||||
|
const projectRoleTemplateBindingSchema = this.$store.getters['rancher/schemaFor'](NORMAN.PROJECT_ROLE_TEMPLATE_BINDING);
|
||||||
|
|
||||||
|
this['normanClusterRTBSchema'] = clusterRoleTemplateBindingSchema;
|
||||||
|
this['normanProjectRTBSchema'] = projectRoleTemplateBindingSchema;
|
||||||
|
|
||||||
|
if (clusterRoleTemplateBindingSchema) {
|
||||||
|
Promise.all([
|
||||||
|
this.$store.dispatch(`rancher/findAll`, { type: NORMAN.CLUSTER_ROLE_TEMPLATE_BINDING }, { root: true }),
|
||||||
|
this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING })
|
||||||
|
]).then(([normanBindings]) => {
|
||||||
|
this['normanClusterRoleTemplateBindings'] = normanBindings;
|
||||||
|
this.loadingClusterBindings = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (projectRoleTemplateBindingSchema) {
|
||||||
|
this.$store.dispatch('rancher/findAll', { type: NORMAN.PROJECT_ROLE_TEMPLATE_BINDING }, { root: true })
|
||||||
|
.then((bindings) => {
|
||||||
|
this['projectRoleTemplateBindings'] = bindings;
|
||||||
|
this.loadingProjectBindings = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const hydration = {
|
||||||
|
normanPrincipals: this.$store.dispatch('rancher/findAll', { type: NORMAN.PRINCIPAL }),
|
||||||
|
mgmt: this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.USER }),
|
||||||
|
mgmtRoleTemplates: this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.ROLE_TEMPLATE }),
|
||||||
|
};
|
||||||
|
|
||||||
|
await allHash(hydration);
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
schema: this.$store.getters[`management/schemaFor`](
|
||||||
|
MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING
|
||||||
|
),
|
||||||
|
headers: [STATE, PRINCIPAL, ROLE, AGE],
|
||||||
|
createLocation: {
|
||||||
|
...this.createLocationOverride,
|
||||||
|
params: {
|
||||||
|
...this.createLocationOverride.params,
|
||||||
|
cluster: this.$store.getters['currentCluster'].id
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resource: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING,
|
||||||
|
normanClusterRTBSchema: null,
|
||||||
|
normanProjectRTBSchema: null,
|
||||||
|
normanClusterRoleTemplateBindings: [],
|
||||||
|
projectRoleTemplateBindings: [],
|
||||||
|
VIRTUAL_TYPES,
|
||||||
|
projectRoleTemplateColumns: [
|
||||||
|
STATE,
|
||||||
|
{
|
||||||
|
name: 'member',
|
||||||
|
labeKey: 'generic.name',
|
||||||
|
value: 'principalId',
|
||||||
|
formatter: 'Principal'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'role',
|
||||||
|
labelKey: 'tableHeaders.role',
|
||||||
|
value: 'roleTemplate.nameDisplay'
|
||||||
|
},
|
||||||
|
],
|
||||||
|
loadingProjectBindings: true,
|
||||||
|
loadingClusterBindings: true
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapGetters(['currentCluster']),
|
||||||
|
clusterRoleTemplateBindings() {
|
||||||
|
return this.normanClusterRoleTemplateBindings.map((b) => b.clusterroletemplatebinding) ;
|
||||||
|
},
|
||||||
|
filteredClusterRoleTemplateBindings() {
|
||||||
|
return this.clusterRoleTemplateBindings.filter(
|
||||||
|
(b) => b?.clusterName === this.$store.getters['currentCluster'].id
|
||||||
|
);
|
||||||
|
},
|
||||||
|
isLocal() {
|
||||||
|
return this.$store.getters['currentCluster'].isLocal;
|
||||||
|
},
|
||||||
|
canEditClusterMembers() {
|
||||||
|
return this.normanClusterRTBSchema?.collectionMethods.find((x) => x.toLowerCase() === 'post');
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="project-members">
|
||||||
|
<Masthead
|
||||||
|
:schema="schema"
|
||||||
|
:resource="resource"
|
||||||
|
:favorite-resource="VIRTUAL_TYPES.CLUSTER_MEMBERS"
|
||||||
|
:create-location="createLocation"
|
||||||
|
:create-button-label="t('members.createActionLabel')"
|
||||||
|
:is-creatable="false"
|
||||||
|
:type-display="t('members.clusterAndProject')"
|
||||||
|
/>
|
||||||
|
<Banner
|
||||||
|
v-if="isLocal"
|
||||||
|
color="error"
|
||||||
|
:label="t('members.localClusterWarning')"
|
||||||
|
/>
|
||||||
|
<Tabbed>
|
||||||
|
<Tab
|
||||||
|
name="cluster-membership"
|
||||||
|
:label="t('members.clusterMembership')"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-if="canEditClusterMembers"
|
||||||
|
class="row mb-10 cluster-add"
|
||||||
|
>
|
||||||
|
<router-link
|
||||||
|
:to="createLocation"
|
||||||
|
class="btn role-primary pull-right"
|
||||||
|
>
|
||||||
|
{{ t('members.createActionLabel') }}
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<ResourceTable
|
||||||
|
:schema="schema"
|
||||||
|
:headers="headers"
|
||||||
|
:rows="filteredClusterRoleTemplateBindings"
|
||||||
|
:groupable="true"
|
||||||
|
:show-grouping="true"
|
||||||
|
:namespaced="false"
|
||||||
|
:loading="$fetchState.pending || !currentCluster || loadingClusterBindings"
|
||||||
|
sub-search="subSearch"
|
||||||
|
:sub-fields="['nameDisplay']"
|
||||||
|
/>
|
||||||
|
</Tab>
|
||||||
|
</Tabbed>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang='scss' scoped>
|
||||||
|
|
||||||
|
.role {
|
||||||
|
align-items: center;
|
||||||
|
background-color: rgba(0, 0, 0, 0.05);
|
||||||
|
border: 1px solid var(--header-border);
|
||||||
|
border-radius: 5px;
|
||||||
|
color: var(--tag-text);
|
||||||
|
line-height: 20px;
|
||||||
|
padding: 2px 5px;
|
||||||
|
white-space: nowrap;
|
||||||
|
display: inline-flex;
|
||||||
|
margin-right: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.role-value {
|
||||||
|
&.text-link-enabled {
|
||||||
|
cursor: pointer;
|
||||||
|
&:hover {
|
||||||
|
color: var(--primary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ .icon-close {
|
||||||
|
margin-left: 3px;
|
||||||
|
cursor: pointer;
|
||||||
|
&:hover {
|
||||||
|
color: var(--primary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.project-members {
|
||||||
|
& :deep() .group-bar{
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.cluster-add {
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -1,9 +1,9 @@
|
|||||||
<script>
|
<script>
|
||||||
import ExplorerMembers from '@shell/components/ExplorerMembers';
|
import Members from '@pkg/components/Members';
|
||||||
import { MANAGEMENT } from '@shell/config/types';
|
import { MANAGEMENT } from '@shell/config/types';
|
||||||
import { PRODUCT_NAME as HARVESTER_PRODUCT } from '../../../../config/harvester';
|
import { PRODUCT_NAME as HARVESTER_PRODUCT } from '../../../../config/harvester';
|
||||||
export default {
|
export default {
|
||||||
components: { ExplorerMembers },
|
components: { Members },
|
||||||
inheritAttrs: false,
|
inheritAttrs: false,
|
||||||
computed: {
|
computed: {
|
||||||
createLocationOverride() {
|
createLocationOverride() {
|
||||||
@ -20,4 +20,4 @@ export default {
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template><ExplorerMembers :create-location-override="createLocationOverride" v-bind="$attrs" /></template>
|
<template><Members :create-location-override="createLocationOverride" v-bind="$attrs" /></template>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user