Skip to content
Snippets Groups Projects
Verified Commit 3092ada9 authored by Daniel Göbel's avatar Daniel Göbel
Browse files

Update parsing of file tree object to handle extremely large objects

parent c659ad86
No related branches found
No related tags found
1 merge request!102Resolve "Add UI for parameter translation layer"
...@@ -17,6 +17,21 @@ import { ...@@ -17,6 +17,21 @@ import {
import { useAuthStore } from "@/stores/users"; import { useAuthStore } from "@/stores/users";
import { useNameStore } from "@/stores/names"; import { useNameStore } from "@/stores/names";
function parseFileTree(parent: string, tree?: FileTree | null): string[] {
if (tree == undefined || tree.contents == undefined) {
return [];
}
let files: string[] = [];
const currentName = parent.length > 0 ? parent + tree.name + "/" : "/";
for (const dir of tree.contents) {
files.push(currentName + dir.name);
if (dir.type === "directory") {
files = files.concat(parseFileTree(currentName, dir));
}
}
return files;
}
export const useResourceStore = defineStore({ export const useResourceStore = defineStore({
id: "resources", id: "resources",
state: () => state: () =>
...@@ -26,6 +41,7 @@ export const useResourceStore = defineStore({ ...@@ -26,6 +41,7 @@ export const useResourceStore = defineStore({
reviewableResourceMapping: {}, reviewableResourceMapping: {},
syncRequestMapping: {}, syncRequestMapping: {},
resourceTree: {}, resourceTree: {},
resourceTreeList: {},
__syncRequestsFetched: false, __syncRequestsFetched: false,
}) as { }) as {
resourceMapping: Record<string, ResourceOut>; resourceMapping: Record<string, ResourceOut>;
...@@ -33,6 +49,7 @@ export const useResourceStore = defineStore({ ...@@ -33,6 +49,7 @@ export const useResourceStore = defineStore({
reviewableResourceMapping: Record<string, ResourceOut>; reviewableResourceMapping: Record<string, ResourceOut>;
syncRequestMapping: Record<string, UserSynchronizationRequestOut>; syncRequestMapping: Record<string, UserSynchronizationRequestOut>;
resourceTree: Record<string, FileTree | null>; resourceTree: Record<string, FileTree | null>;
resourceTreeList: Record<string, string[]>;
__syncRequestsFetched: boolean; __syncRequestsFetched: boolean;
}, },
getters: { getters: {
...@@ -126,6 +143,10 @@ export const useResourceStore = defineStore({ ...@@ -126,6 +143,10 @@ export const useResourceStore = defineStore({
) )
.then((tree) => { .then((tree) => {
this.resourceTree[resource_version_id] = tree[0]; this.resourceTree[resource_version_id] = tree[0];
this.resourceTreeList[resource_version_id] = parseFileTree(
"",
tree[0],
);
return tree; return tree;
}) })
.catch((err) => { .catch((err) => {
......
...@@ -9,7 +9,7 @@ import { ...@@ -9,7 +9,7 @@ import {
} from "@/client/workflow"; } from "@/client/workflow";
import type { ClowmInfo } from "@/types/ClowmInfo"; import type { ClowmInfo } from "@/types/ClowmInfo";
import { useResourceStore } from "@/stores/resources"; import { useResourceStore } from "@/stores/resources";
import { type FileTree, Status } from "@/client/resource"; import { Status } from "@/client/resource";
const props = defineProps<{ const props = defineProps<{
versionId: string; versionId: string;
...@@ -19,12 +19,10 @@ const props = defineProps<{ ...@@ -19,12 +19,10 @@ const props = defineProps<{
const parameterState = reactive<{ const parameterState = reactive<{
extension: ParameterExtension_Input; extension: ParameterExtension_Input;
resourceParameters: Set<string>; resourceParameters: Set<string>;
resourceTreeMapped: Record<string, string[]>;
formValidated: boolean; formValidated: boolean;
}>({ }>({
extension: {}, extension: {},
resourceParameters: new Set(), resourceParameters: new Set(),
resourceTreeMapped: {},
formValidated: false, formValidated: false,
}); });
...@@ -191,33 +189,10 @@ function updateDefaultResourceVersionParam( ...@@ -191,33 +189,10 @@ function updateDefaultResourceVersionParam(
(parameterState.extension.defaults[param] as ResourcePath_Input) (parameterState.extension.defaults[param] as ResourcePath_Input)
.resource_id, .resource_id,
resource_version_id, resource_version_id,
() => {
if (resourceRepository.resourceTree[resource_version_id] != null) {
parameterState.resourceTreeMapped[resource_version_id] =
parseFileTree(
resourceRepository.resourceTree[resource_version_id],
"",
);
}
},
); );
} }
} }
function parseFileTree(tree: FileTree | null, parent: string): string[] {
if (tree === null) {
return [];
}
const currentName = parent.length > 0 ? parent + tree.name : "";
const files = parent.length > 0 ? [currentName] : [];
if (tree.contents) {
for (const dir of tree.contents) {
files.push(...parseFileTree(dir, currentName + "/"));
}
}
return files;
}
function isResource( function isResource(
param: ResourcePath_Input | string | number | boolean | undefined, param: ResourcePath_Input | string | number | boolean | undefined,
): param is ResourcePath_Input { ): param is ResourcePath_Input {
...@@ -303,18 +278,22 @@ onMounted(() => { ...@@ -303,18 +278,22 @@ onMounted(() => {
</div> </div>
<h3>Instance specific default parameters</h3> <h3>Instance specific default parameters</h3>
<div <div
class="d-flex flex-wrap overflow-y-auto p-1 border rounded border-dashed mb-2" class="d-flex flex-wrap overflow-y-auto p-1 border border-bottom-0 rounded-top border-dashed"
style="max-height: 30vh" style="max-height: 30vh"
v-if="parameterPools.defaults.length > 0"
> >
<b class="ms-1 w-100">Workflow parameters:</b> <b class="ms-1 w-100">Workflow parameters:</b>
<div <template v-if="parameterPools.defaults.length > 0">
class="w-fit border px-2 rounded cursor-pointer m-1 parameter-container" <div
v-for="(param, index) in parameterPools.defaults" class="w-fit border px-2 rounded cursor-pointer m-1 parameter-container"
:key="param" v-for="(param, index) in parameterPools.defaults"
@click="addDefaultParameter(param, index)" :key="param"
> @click="addDefaultParameter(param, index)"
{{ param }} >
{{ param }}
</div>
</template>
<div v-else class="px-2 text-secondary m-1">
<i>Empty</i>
</div> </div>
</div> </div>
<form <form
...@@ -484,7 +463,7 @@ onMounted(() => { ...@@ -484,7 +463,7 @@ onMounted(() => {
<input <input
type="text" type="text"
class="form-control rounded-end form-control-sm" class="form-control rounded-end form-control-sm"
placeholder="/path/in/resource/..." placeholder="/optional/path/in/resource/..."
minlength="2" minlength="2"
maxlength="256" maxlength="256"
pattern="\/\S*" pattern="\/\S*"
...@@ -499,13 +478,13 @@ onMounted(() => { ...@@ -499,13 +478,13 @@ onMounted(() => {
/> />
<datalist :id="'datalistOptions-' + index"> <datalist :id="'datalistOptions-' + index">
<option <option
v-for="file in parameterState.resourceTreeMapped[ v-for="file in resourceRepository.resourceTreeList[
( (
parameterState.extension.defaults[ parameterState.extension.defaults[
param param
] as ResourcePath_Input ] as ResourcePath_Input
).resource_version_id ).resource_version_id
]" ] ?? []"
:value="file" :value="file"
:key="file" :key="file"
/> />
...@@ -552,8 +531,10 @@ onMounted(() => { ...@@ -552,8 +531,10 @@ onMounted(() => {
<pre><code>{{ <pre><code>{{
parameterState.extension parameterState.extension
}}</code></pre> }}</code></pre>
<h6>Resource Tree</h6> <h6>Resource Tree processed</h6>
<pre><code>{{ parameterState.resourceTreeMapped }}</code></pre> <pre><code>{{ resourceRepository.resourceTreeList }}</code></pre>
<h6>Resource Tree raw</h6>
<pre><code>{{ resourceRepository.resourceTree }}</code></pre>
<h6>Parameter Pools</h6> <h6>Parameter Pools</h6>
<pre><code>{{ parameterPools }}</code></pre> <pre><code>{{ parameterPools }}</code></pre>
<h6>Resource Parameters</h6> <h6>Resource Parameters</h6>
......
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, reactive } from "vue"; import { computed, onMounted, reactive } from "vue";
import type { WorkflowOut, WorkflowVersion } from "@/client/workflow"; import type { WorkflowOut, WorkflowVersion } from "@/client/workflow";
import { Status } from "@/client/workflow"; import { Status } from "@/client/workflow";
import WorkflowWithVersionsCard from "@/components/workflows/WorkflowWithVersionsCard.vue"; import WorkflowWithVersionsCard from "@/components/workflows/WorkflowWithVersionsCard.vue";
...@@ -53,6 +53,12 @@ const workflowsState = reactive<{ ...@@ -53,6 +53,12 @@ const workflowsState = reactive<{
}, },
}); });
const sortedWorkflows = computed<WorkflowOut[]>(() => {
const temp = [...workflowRepository.ownWorkflows];
temp.sort((a, b) => (a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1));
return temp;
});
function workflowUpdateClicked(workflow: WorkflowOut) { function workflowUpdateClicked(workflow: WorkflowOut) {
workflowsState.updateWorkflow = workflow; workflowsState.updateWorkflow = workflow;
} }
...@@ -127,11 +133,11 @@ onMounted(() => { ...@@ -127,11 +133,11 @@ onMounted(() => {
</div> </div>
<div v-if="!workflowsState.loading"> <div v-if="!workflowsState.loading">
<card-transition-group <card-transition-group
v-if="workflowRepository.ownWorkflows.length > 0" v-if="sortedWorkflows.length > 0"
class="d-flex flex-wrap align-items-center justify-content-between mt-5" class="d-flex flex-wrap align-items-center justify-content-between mt-5"
> >
<workflow-with-versions-card <workflow-with-versions-card
v-for="workflow in workflowRepository.ownWorkflows" v-for="workflow in sortedWorkflows"
:key="workflow.workflow_id" :key="workflow.workflow_id"
:workflow="workflow" :workflow="workflow"
:loading="false" :loading="false"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment