diff --git a/src/components/parameter-schema/ParameterSchemaDescriptionComponent.vue b/src/components/parameter-schema/ParameterSchemaDescriptionComponent.vue index 79063a1285586e9679ba55d776e8a4510be72423..23b4866afae6ac39bafe0f9d061db784fd2a51ac 100644 --- a/src/components/parameter-schema/ParameterSchemaDescriptionComponent.vue +++ b/src/components/parameter-schema/ParameterSchemaDescriptionComponent.vue @@ -1,5 +1,5 @@ <script setup lang="ts"> -import { computed } from "vue"; +import { computed, ref } from "vue"; import ParameterGroupDescription from "@/components/parameter-schema/description-mode/ParameterGroupDescription.vue"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; @@ -16,15 +16,28 @@ type ParameterGroup = { icon?: string; }; -const navParameterGroups = computed<ParameterGroup[]>(() => - Object.keys(parameterGroups.value).map((group) => { +const showHidden = ref<boolean>(false); + +const navParameterGroups = computed<ParameterGroup[]>(() => { + let groups = Object.keys(parameterGroups.value).map((group) => { return { group: group, title: parameterGroups.value[group]["title"], icon: parameterGroups.value[group]["fa_icon"], }; - }), -); + }); + if (!showHidden.value) { + groups = groups.filter( + // filter all groups that have only hidden parameters + (group) => + Object.keys(parameterGroups.value[group.group]["properties"]).filter( + (key) => + !parameterGroups.value[group.group]["properties"][key]["hidden"], + ).length > 0, + ); + } + return groups; +}); const parameterGroups = computed<Record<string, never>>( () => props.schema["definitions"], @@ -38,6 +51,7 @@ const parameterGroups = computed<Record<string, never>>( <parameter-group-description :parameter-group="group" :parameter-group-name="groupName" + :show-hidden="showHidden" /> </div> </div> @@ -53,15 +67,31 @@ const parameterGroups = computed<Record<string, never>>( v-for="group in navParameterGroups" :key="group.group" > - <a :href="'#' + group.group" - ><font-awesome-icon + <a :href="'#' + group.group"> + <font-awesome-icon :icon="group.icon" v-if="group.icon" class="me-2" - />{{ group.title }}</a + /> + {{ group.title }}</a > </li> </ul> + <div class="mx-auto mb-3"> + <input + type="checkbox" + class="btn-check ms-1" + id="btn-check-outlined" + v-model="showHidden" + autocomplete="off" + /> + <label class="btn btn-outline-primary" for="btn-check-outlined"> + <font-awesome-icon + :icon="showHidden ? 'fa-solid fa-eye' : 'fa-solid fa-eye-slash'" + /> + Show hidden Parameters + </label> + </div> </nav> </nav> </div> diff --git a/src/components/parameter-schema/ParameterSchemaFormComponent.vue b/src/components/parameter-schema/ParameterSchemaFormComponent.vue index 4dd82b93caac988eaa925c201c61d335546fad13..ae1a09d8a07e4f99cb4d865598e5c3876254d727 100644 --- a/src/components/parameter-schema/ParameterSchemaFormComponent.vue +++ b/src/components/parameter-schema/ParameterSchemaFormComponent.vue @@ -62,12 +62,14 @@ const formState = reactive<{ pipelineNotes: string; report_bucket?: string; errorType?: string; + showHidden: boolean; }>({ formInput: {}, validated: false, pipelineNotes: "", report_bucket: undefined, errorType: undefined, + showHidden: false, }); // Computed Properties @@ -77,15 +79,26 @@ const parameterGroups = computed<Record<string, never>>( ); // Create a list with the names of all parameter groups -const navParameterGroups = computed<ParameterGroup[]>(() => - Object.keys(parameterGroups.value).map((group) => { +const navParameterGroups = computed<ParameterGroup[]>(() => { + let groups = Object.keys(parameterGroups.value).map((group) => { return { group: group, title: parameterGroups.value[group]["title"], icon: parameterGroups.value[group]["fa_icon"], }; - }), -); + }); + if (!formState.showHidden) { + groups = groups.filter( + // filter all groups that have only hidden parameters + (group) => + Object.keys(parameterGroups.value[group.group]["properties"]).filter( + (key) => + !parameterGroups.value[group.group]["properties"][key]["hidden"], + ).length > 0, + ); + } + return groups; +}); // Watchers // ============================================================================= @@ -117,6 +130,7 @@ function updateSchema(schema: Record<string, any>) { ]); formState.formInput = Object.fromEntries(b); } + /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/ban-ts-comment, @typescript-eslint/no-unused-vars */ function startWorkflow() { errorToast?.hide(); @@ -251,6 +265,7 @@ onMounted(() => { v-if="formState.formInput[groupName]" :parameter-group-name="groupName" :parameter-group="group" + :showHidden="formState.showHidden" /> </template> </form> @@ -303,8 +318,8 @@ onMounted(() => { <nav v-if="props.schema" class="nav"> <ul class="ps-0"> <li class="nav-link"> - <a href="#pipelineGeneralOptions" - ><font-awesome-icon icon="fa-solid fa-gear" class="me-2" /> + <a href="#pipelineGeneralOptions"> + <font-awesome-icon icon="fa-solid fa-gear" class="me-2" /> General Pipeline Options </a> </li> @@ -313,15 +328,35 @@ onMounted(() => { v-for="group in navParameterGroups" :key="group.group" > - <a :href="'#' + group.group" - ><font-awesome-icon + <a :href="'#' + group.group"> + <font-awesome-icon :icon="group.icon" v-if="group.icon" class="me-2" - />{{ group.title }}</a + /> + {{ group.title }}</a > </li> </ul> + <div class="mx-auto mb-3"> + <input + type="checkbox" + class="btn-check ms-1" + id="btn-check-outlined" + v-model="formState.showHidden" + autocomplete="off" + /> + <label class="btn btn-outline-primary" for="btn-check-outlined"> + <font-awesome-icon + :icon=" + formState.showHidden + ? 'fa-solid fa-eye' + : 'fa-solid fa-eye-slash' + " + /> + Show hidden Parameters + </label> + </div> </nav> <!-- Loading nav links --> <div v-else class="placeholder-glow ps-3 pt-3"> diff --git a/src/components/parameter-schema/description-mode/ParameterDescription.vue b/src/components/parameter-schema/description-mode/ParameterDescription.vue index bace4110ccb3454541deb450e061f2161c353ebc..5769d9372eeace54a7c2c11394c6f750e0b65c52 100644 --- a/src/components/parameter-schema/description-mode/ParameterDescription.vue +++ b/src/components/parameter-schema/description-mode/ParameterDescription.vue @@ -16,6 +16,10 @@ const props = defineProps({ type: String, required: true, }, + showHidden: { + type: Boolean, + default: false, + }, }); const randomIDSuffix = Math.random().toString(16).substring(2, 8); @@ -32,7 +36,7 @@ const defaultValue = computed<string | undefined>( const enumValues = computed<string[] | undefined>( () => props.parameter["enum"]?.map((val: string) => val.toString()), ); -// const hidden = computed<boolean>(() => props.parameter["hidden"] ?? false); +const hidden = computed<boolean>(() => props.parameter["hidden"] ?? false); const parameterPattern = computed<string | undefined>( () => props.parameter["pattern"], ); @@ -48,6 +52,7 @@ const showRightColum = computed<boolean>( <template> <div class="row border-top border-bottom border-secondary align-items-start py-2" + v-if="showHidden || !hidden" > <div class="fs-6 col-3"> <font-awesome-icon :icon="icon" v-if="icon" class="me-2" /> diff --git a/src/components/parameter-schema/description-mode/ParameterGroupDescription.vue b/src/components/parameter-schema/description-mode/ParameterGroupDescription.vue index 6ced29b2ce7be8ed1ab88d209acc12eca02c9e92..c229f8f51ab8d615af6ee06670886ed8074fcd45 100644 --- a/src/components/parameter-schema/description-mode/ParameterGroupDescription.vue +++ b/src/components/parameter-schema/description-mode/ParameterGroupDescription.vue @@ -15,12 +15,16 @@ const props = defineProps({ type: String, required: true, }, + showHidden: { + type: Boolean, + default: false, + }, }); const title = computed<string>(() => props.parameterGroup["title"]); const icon = computed<string>(() => props.parameterGroup["fa_icon"]); const description = computed<string>(() => props.parameterGroup["description"]); -/* + const groupHidden = computed<boolean>(() => Object.keys(parameters.value).reduce( (acc: boolean, val: string) => acc && parameters.value[val]["hidden"], @@ -28,14 +32,13 @@ const groupHidden = computed<boolean>(() => ), ); - */ const parameters = computed<Record<string, never>>( () => props.parameterGroup["properties"], ); </script> <template> - <div class="mb-5"> + <div class="mb-5" v-if="props.showHidden || !groupHidden"> <div class="row"> <h2 :id="props.parameterGroupName"> <font-awesome-icon :icon="icon" class="me-3" v-if="icon" />{{ title }} @@ -53,6 +56,7 @@ const parameters = computed<Record<string, never>>( :required=" props.parameterGroup['required']?.includes(parameterName) ?? false " + :show-hidden="showHidden" /> </template> </div> diff --git a/src/components/parameter-schema/form-mode/ParameterGroupForm.vue b/src/components/parameter-schema/form-mode/ParameterGroupForm.vue index 4dae916a8f6d301e1b52adcafd4d31f558c99c36..e66ef66d0dfdaaa8468d303dd18325a22e7fafe5 100644 --- a/src/components/parameter-schema/form-mode/ParameterGroupForm.vue +++ b/src/components/parameter-schema/form-mode/ParameterGroupForm.vue @@ -23,6 +23,10 @@ const props = defineProps({ type: Object, required: true, }, + showHidden: { + type: Boolean, + default: false, + }, }); const title = computed<string>(() => props.parameterGroup["title"]); const icon = computed<string>(() => props.parameterGroup["fa_icon"]); @@ -71,7 +75,7 @@ watch( </script> <template> - <div class="card mb-3" :hidden="groupHidden"> + <div class="card mb-3" :hidden="!showHidden && groupHidden"> <h2 class="card-header" :id="props.parameterGroupName"> <font-awesome-icon :icon="icon" class="me-2" v-if="icon" /> {{ title }} @@ -82,7 +86,7 @@ watch( v-for="(parameter, parameterName) in parameters" :key="parameterName" > - <div :hidden="parameter['hidden']"> + <div :hidden="!showHidden && parameter['hidden']"> <div class="input-group"> <span class="input-group-text" :id="parameterName + '-help'"> <font-awesome-icon