Skip to content

Commit

Permalink
merge: Merge pull request #111 from arunaengine/feat/resource-relatio…
Browse files Browse the repository at this point in the history
…n-display

Improve resource landing page
  • Loading branch information
das-Abroxas authored Jan 30, 2025
2 parents d880bca + cf40a2b commit bdc03ad
Show file tree
Hide file tree
Showing 24 changed files with 766 additions and 243 deletions.
83 changes: 59 additions & 24 deletions components/card/downloads.vue
Original file line number Diff line number Diff line change
@@ -1,13 +1,22 @@
<script setup lang="ts">
import {IconCloudDown, IconCloudCancel, IconCloudCheck, IconCloudCog, IconCloudPause, IconCloudQuestion} from '@tabler/icons-vue';
import {type EndpointInfo, fetchEndpoint} from '~/composables/api_wrapper';
import { storagemodelsv2ReplicationStatus } from '../../composables/aruna_api_json';
import {
IconCloudCancel,
IconCloudCheck,
IconCloudCog,
IconCloudDown,
IconCloudPause,
IconCloudQuestion
} from '@tabler/icons-vue';
import {type EndpointInfo} from '~/composables/proto_conversions';
import {fetchEndpoint} from '~/composables/api_wrapper'
import {storagemodelsv2ReplicationStatus, v2ResourceVariant} from '~/composables/aruna_api_json';
const props = defineProps<{
endpoints: EndpointInfo[] | undefined
resourceType: v2ResourceVariant
}>();
const emit = defineEmits<{(e: 'download', endpointId: string): void}>();
const emit = defineEmits<{ (e: 'download', endpointId: string): void }>();
const endpointData = {};
await Promise.all(props.endpoints.map(async (endpointInfo: EndpointInfo) => {
Expand All @@ -20,23 +29,33 @@ await Promise.all(props.endpoints.map(async (endpointInfo: EndpointInfo) => {
}));
function toReplicationStatusIcon(variant: storagemodelsv2ReplicationStatus | undefined): string {
switch (variant) {
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_ERROR: return IconCloudCancel
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_FINISHED: return IconCloudCheck
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_RUNNING: return IconCloudCog
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_WAITING: return IconCloudPause
default: return IconCloudQuestion
}
switch (variant) {
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_ERROR:
return IconCloudCancel
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_FINISHED:
return IconCloudCheck
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_RUNNING:
return IconCloudCog
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_WAITING:
return IconCloudPause
default:
return IconCloudQuestion
}
}
function toReplicationStatusColor(variant: storagemodelsv2ReplicationStatus | undefined): string {
switch (variant) {
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_ERROR: return "red"
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_FINISHED: return "green"
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_RUNNING: return "orange"
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_WAITING: return "orange"
default: return "orange"
}
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_ERROR:
return "red"
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_FINISHED:
return "green"
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_RUNNING:
return "orange"
case storagemodelsv2ReplicationStatus.REPLICATION_STATUS_WAITING:
return "orange"
default:
return "orange"
}
}
</script>
Expand All @@ -48,13 +67,23 @@ function toReplicationStatusColor(variant: storagemodelsv2ReplicationStatus | un
<table class="min-w-full divide-y divide-aruna-text/50">
<thead>
<tr>
<th scope="col" class="px-6 py-3 text-start text-sm font-medium text-aruna-text-accent uppercase">
<th scope="col"
class="px-6 py-3 text-start text-sm font-medium text-aruna-text-accent uppercase">
Endpoint Name
</th>
<th scope="col" class="px-6 py-3 text-start text-sm font-medium text-aruna-text-accent uppercase">
<th v-if="resourceType !== v2ResourceVariant.RESOURCE_VARIANT_OBJECT"
scope="col"
class="px-6 py-3 text-start text-sm font-medium text-aruna-text-accent uppercase">
Endpoint ID
</th>
<th v-if="resourceType === v2ResourceVariant.RESOURCE_VARIANT_OBJECT"
scope="col"
class="px-6 py-3 text-start text-sm font-medium text-aruna-text-accent uppercase">
Replication Status
</th>
<th scope="col" class="px-6 py-3 text-center text-sm font-medium text-aruna-text-accent uppercase">
<th v-if="resourceType === v2ResourceVariant.RESOURCE_VARIANT_OBJECT"
scope="col"
class="px-6 py-3 text-center text-sm font-medium text-aruna-text-accent uppercase">
Download
</th>
</tr>
Expand All @@ -63,22 +92,28 @@ function toReplicationStatusColor(variant: storagemodelsv2ReplicationStatus | un
<tbody class="divide-y divide-aruna-text/50">
<tr v-for="endpoint in props.endpoints" class="hover:bg-aruna-fg">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-aruna-text">
{{ endpointData[endpoint.id].name }}
{{ endpointData[endpoint.id].name }}
</td>
<td v-if="resourceType !== v2ResourceVariant.RESOURCE_VARIANT_OBJECT"
class="px-6 py-4 whitespace-nowrap text-sm font-medium text-aruna-text">
{{ endpoint.id }}
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-aruna-text flex item-center gap-2">
<td v-if="resourceType === v2ResourceVariant.RESOURCE_VARIANT_OBJECT"
class="px-6 py-4 whitespace-nowrap text-sm font-medium text-aruna-text flex item-center gap-2">
<span class="">{{ toReplicationStatusStr(endpoint.status) }}</span>
<component :is="toReplicationStatusIcon(endpoint.status)"
class="flex-shrink-0"
:color="toReplicationStatusColor(endpoint.status)"></component>
</td>
<td class="px-6 py-4 text-center whitespace-nowrap text-sm font-medium text-aruna-text">
<td v-if="resourceType === v2ResourceVariant.RESOURCE_VARIANT_OBJECT"
class="px-6 py-4 text-center whitespace-nowrap text-sm font-medium text-aruna-text">
<button
type="button"
title="Download Object"
@click="emit('download', endpoint.id)"
:disabled="endpoint.status != storagemodelsv2ReplicationStatus.REPLICATION_STATUS_FINISHED"
class="inline-flex grow justify-center font-semibold rounded-lg border border-transparent text-aruna-text-accent hover:text-aruna-highlight disabled:opacity-50 disabled:pointer-events-none">
<IconCloudDown class="flex-shrink-0"/>
<IconCloudDown class="flex-shrink-0"/>
</button>
</td>
</tr>
Expand Down
133 changes: 133 additions & 0 deletions components/card/external_relations.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
<script setup lang="ts">
import {
IconArrowBigLeftLines,
IconArrowBigRightLines,
IconFile,
IconFolder,
IconFolders,
IconLink
} from '@tabler/icons-vue';
import {
type v2ExternalRelation,
v2ExternalRelationVariant,
type v2InternalRelation,
v2InternalRelationVariant,
type v2Relation,
v2RelationDirection,
v2ResourceVariant,
type v2ResourceWithPermission
} from '~/composables/aruna_api_json';
const props = defineProps<{
relations: v2ExternalRelation[] | undefined
}>()
const relations = toRef(() => props.relations)
// ----- Relation Pagination ----------
const page = ref<number>(1)
const pageSize = ref(10)
const displayedRelations = computed(() => {
if (relations.value) {
const start = (page.value - 1) * pageSize.value
const end = page.value * pageSize.value
return relations.value.slice(start, end)
}
return []
})
</script>

<template>
<div v-if="relations && relations.length > 10"
class="flex gap-6 p-4">
<!-- Page Size Selection -->
<Select @update:modelValue="(v) => pageSize = parseInt(v)"
:default-value="pageSize.toString()">
<SelectTrigger class="w-[180px] rounded-none border-aruna-text/50">
<SelectValue>Page size: {{ pageSize }}</SelectValue>
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>Page Size</SelectLabel>
<SelectItem v-for="size in ['1','5','10','15','25','50','100']" :value="size">{{ size }}</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
<!-- End Page Size Selection -->
<!-- Relation Pagination -->
<Pagination v-model:page="page"
v-slot="{ page }"
:total="relations.length"
:items-per-page="pageSize"
:default-page="1"
:sibling-count="1"
show-edges>
<PaginationList v-slot="{ items }" class="flex items-center gap-1">
<PaginationFirst class="border-aruna-highlight"/>
<PaginationPrev class="border-aruna-highlight"/>

<template v-for="(item, index) in items">
<PaginationListItem v-if="item.type === 'page'" :key="index" :value="item.value" as-child>
<Button class="w-9 h-9 p-0 border border-aruna-highlight"
:class="{'bg-aruna-fg text-aruna-text-accent hover:bg-aruna-bg': item.value === page}"
:variant="item.value === page ? 'default' : 'outline'">
{{ item.value }}
</Button>
</PaginationListItem>
<PaginationEllipsis v-else :key="item.type" :index="index"/>
</template>

<PaginationNext class="border-aruna-highlight"/>
<PaginationLast class="border-aruna-highlight"/>
</PaginationList>
</Pagination>
<!-- End Relation Pagination -->
</div>

<div class="-m-1.5 overflow-x-auto">
<div class="p-1.5 min-w-full inline-block align-middle">
<div class="overflow-hidden">
<table class="min-w-full divide-y divide-aruna-text/50">
<thead>
<tr>
<th scope="col" class="px-6 py-3 text-start text-sm font-medium text-aruna-text-accent uppercase">
Identifier
</th>
<th scope="col" class="px-6 py-3 text-start text-sm font-medium text-aruna-text-accent uppercase">
Type
</th>
</tr>
</thead>
<tbody class="divide-y divide-aruna-text/50">
<tr v-for="relation in displayedRelations" :key="relation.identifier">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-aruna-text">
<a v-if="relation.definedVariant == v2ExternalRelationVariant.EXTERNAL_RELATION_VARIANT_URL"
:href="`${relation.identifier}`"
target="_blank"
class="ms-1">
<IconLink class="flex-shrink-0 size-4 inline-block"/>
{{ relation.identifier }}
</a>
<span v-else>
{{ relation.identifier }}
</span>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-aruna-text">
<span v-if="relation.definedVariant === v2ExternalRelationVariant.EXTERNAL_RELATION_VARIANT_URL">
URL
</span>
<span
v-else-if="relation.definedVariant === v2ExternalRelationVariant.EXTERNAL_RELATION_VARIANT_IDENTIFIER">
Identifier
</span>
<span
v-else-if="relation.definedVariant === v2ExternalRelationVariant.EXTERNAL_RELATION_VARIANT_CUSTOM">
{{ relation.customVariant }}
</span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</template>
Loading

0 comments on commit bdc03ad

Please sign in to comment.