diff --git a/website/src/components/SearchPage/SearchFullUI.tsx b/website/src/components/SearchPage/SearchFullUI.tsx index 36179f3bf..3d367713e 100644 --- a/website/src/components/SearchPage/SearchFullUI.tsx +++ b/website/src/components/SearchPage/SearchFullUI.tsx @@ -24,10 +24,15 @@ import { import { type OrderBy } from '../../types/lapis.ts'; import type { ReferenceGenomesSequenceNames } from '../../types/referencesGenomes.ts'; import type { ClientConfig } from '../../types/runtimeConfig.ts'; +import { + getFieldValuesFromQuery, + getColumnVisibilitiesFromQuery, + getFieldVisibilitiesFromQuery, + VISIBILITY_PREFIX, + COLUMN_VISIBILITY_PREFIX, + getLapisSearchParameters, +} from '../../utils/search.ts'; import ErrorBox from '../common/ErrorBox.tsx'; -import { getFieldValuesFromQuery, getColumnVisibilitiesFromQuery, getFieldVisibilitiesFromQuery, VISIBILITY_PREFIX, COLUMN_VISIBILITY_PREFIX, getLapisSearchParameters } from '../../utils/search.ts'; - - interface InnerSearchFullUIProps { accessToken?: string; @@ -91,17 +96,12 @@ export const InnerSearchFullUI = ({ const [page, setPage] = useState(1); const searchVisibilities = useMemo(() => { - return getFieldVisibilitiesFromQuery(schema, state) - - - }, [schema.metadata, state]); + return getFieldVisibilitiesFromQuery(schema, state); + }, [schema, state]); const columnVisibilities = useMemo(() => { - return getColumnVisibilitiesFromQuery(schema, state) - - - - }, [schema.metadata, schema.tableColumns, state]); + return getColumnVisibilitiesFromQuery(schema, state); + }, [schema, state]); const columnsToShow = useMemo(() => { return schema.metadata @@ -130,8 +130,7 @@ export const InnerSearchFullUI = ({ }; const fieldValues = useMemo(() => { - return getFieldValuesFromQuery(state, hiddenFieldValues) - + return getFieldValuesFromQuery(state, hiddenFieldValues); }, [state, hiddenFieldValues]); const setAFieldValue: SetAFieldValue = (fieldName, value) => { @@ -175,8 +174,7 @@ export const InnerSearchFullUI = ({ const detailsHook = hooks.useDetails({}, {}); const lapisSearchParameters = useMemo(() => { - return getLapisSearchParameters(fieldValues, referenceGenomesSequenceNames) - + return getLapisSearchParameters(fieldValues, referenceGenomesSequenceNames); }, [fieldValues, referenceGenomesSequenceNames]); useEffect(() => { @@ -282,14 +280,11 @@ export const InnerSearchFullUI = ({ {(detailsHook.isPaused || aggregatedHook.isPaused) && (!detailsHook.isSuccess || !aggregatedHook.isSuccess) && ( - - { - - JSON.stringify(detailsHook) !== `{"error":null,"failureCount":0,"failureReason":null,"isPaused":true,"status":"loading","variables":{"versionStatus":"LATEST_VERSION","isRevocation":"false","accession":["s"],"nucleotideMutations":["A23T"],"aminoAcidMutations":[],"nucleotideInsertions":[],"aminoAcidInsertions":[],"fields":["date","country","division","pango_lineage","accessionVersion"],"limit":100,"offset":0,"orderBy":[{"field":"date","type":"descending"}]},"isLoading":true,"isSuccess":false,"isError":false,"isIdle":false}` - ? "did not match" : "matched" - } -

{JSON.stringify(detailsHook) }

- + {JSON.stringify(detailsHook) !== + `{"error":null,"failureCount":0,"failureReason":null,"isPaused":true,"status":"loading","variables":{"versionStatus":"LATEST_VERSION","isRevocation":"false","accession":["s"],"nucleotideMutations":["A23T"],"aminoAcidMutations":[],"nucleotideInsertions":[],"aminoAcidInsertions":[],"fields":["date","country","division","pango_lineage","accessionVersion"],"limit":100,"offset":0,"orderBy":[{"field":"date","type":"descending"}]},"isLoading":true,"isSuccess":false,"isError":false,"isIdle":false}` + ? 'did not match' + : 'matched'} +

{JSON.stringify(detailsHook)}

)} {!(totalSequences === undefined && oldCount === null) && ( diff --git a/website/src/pages/[organism]/search/index.astro b/website/src/pages/[organism]/search/index.astro index 0b319fc4a..378479c46 100644 --- a/website/src/pages/[organism]/search/index.astro +++ b/website/src/pages/[organism]/search/index.astro @@ -9,9 +9,9 @@ import { getAccessToken } from '../../../utils/getAccessToken'; import { getMyGroups } from '../../../utils/getMyGroups'; import { getReferenceGenomesSequenceNames } from '../../../utils/search'; const HIDDEN_FIELD_VALUES = { - [VERSION_STATUS_FIELD]: siloVersionStatuses.latestVersion, - [IS_REVOCATION_FIELD]: 'false', - } + [VERSION_STATUS_FIELD]: siloVersionStatuses.latestVersion, + [IS_REVOCATION_FIELD]: 'false', +}; const { organism: cleanedOrganism } = cleanOrganism(Astro.params.organism); @@ -22,8 +22,7 @@ if (!cleanedOrganism) { }; } - -//const [visibilities, columnVisibilities, fieldValues] = getVisibilitiesAndFieldValuesFromQueryParams() +// const [visibilities, columnVisibilities, fieldValues] = getVisibilitiesAndFieldValuesFromQueryParams() const clientConfig = getRuntimeConfig().public; const schema = getSchema(cleanedOrganism.key); diff --git a/website/src/pages/[organism]/submission/[groupId]/released.astro b/website/src/pages/[organism]/submission/[groupId]/released.astro index ff61a8570..1eac3ad43 100644 --- a/website/src/pages/[organism]/submission/[groupId]/released.astro +++ b/website/src/pages/[organism]/submission/[groupId]/released.astro @@ -31,11 +31,11 @@ const accessToken = getAccessToken(Astro.locals.session); const referenceGenomeSequenceNames = getReferenceGenomesSequenceNames(cleanedOrganism.key); const hiddenFieldValues = { - [VERSION_STATUS_FIELD]: siloVersionStatuses.latestVersion, - [GROUP_ID_FIELD]: group.groupId, - } + [VERSION_STATUS_FIELD]: siloVersionStatuses.latestVersion, + [GROUP_ID_FIELD]: group.groupId, +}; -const preloadedData = getPreloadedSearchData(Astro.url.searchParams, hiddenFieldValues, schema, cleanedOrganism.key) +// const preloadedData = getPreloadedSearchData(Astro.url.searchParams, hiddenFieldValues, schema, cleanedOrganism.key) --- diff --git a/website/src/utils/KeycloakClientManager.ts b/website/src/utils/KeycloakClientManager.ts index 9a5ef671b..80260b0cf 100644 --- a/website/src/utils/KeycloakClientManager.ts +++ b/website/src/utils/KeycloakClientManager.ts @@ -26,7 +26,7 @@ export class KeycloakClientManager { } catch (error: any) { if (error.code !== 'ECONNREFUSED') { this.logger.error(`Error discovering keycloak issuer: ${error}`); - //throw error; + // throw error; } this.logger.warn(`Connection refused when trying to discover the keycloak issuer at url: ${issuerUrl}`); } diff --git a/website/src/utils/search.ts b/website/src/utils/search.ts index c289553c6..78ab058ee 100644 --- a/website/src/utils/search.ts +++ b/website/src/utils/search.ts @@ -1,10 +1,8 @@ -import type { TableSequenceData } from '../components/SearchPage/Table.tsx'; -import { parseMutationString } from '../components/SearchPage/fields/MutationField.tsx'; -import { getReferenceGenomes } from '../config.ts'; -import type { MetadataFilter } from '../types/config.ts'; -import type { ReferenceGenomesSequenceNames, ReferenceAccession, NamedSequence } from '../types/referencesGenomes.ts'; - - +import type { TableSequenceData } from '../components/SearchPage/Table'; +import { parseMutationString } from '../components/SearchPage/fields/MutationField'; +import { getReferenceGenomes } from '../config'; +import type { MetadataFilter, Schema } from '../types/config'; +import type { ReferenceGenomesSequenceNames, ReferenceAccession, NamedSequence } from '../types/referencesGenomes'; export const VISIBILITY_PREFIX = 'visibility_'; @@ -13,14 +11,15 @@ export const COLUMN_VISIBILITY_PREFIX = 'column_'; const ORDER_KEY = 'orderBy'; const ORDER_DIRECTION_KEY = 'order'; - - export type SearchResponse = { data: TableSequenceData[]; totalCount: number; }; -export function addHiddenFilters(searchFormFilter: MetadataFilter[], hiddenFilters: MetadataFilter[]) { +export function addHiddenFilters( + searchFormFilter: MetadataFilter[], + hiddenFilters: MetadataFilter[], +): MetadataFilter[] { const searchFormFilterNames = searchFormFilter.map((filter) => filter.name); const hiddenFiltersToAdd = hiddenFilters.filter((filter) => !searchFormFilterNames.includes(filter.name)); return [...searchFormFilter, ...hiddenFiltersToAdd]; @@ -42,51 +41,54 @@ export const getReferenceGenomesSequenceNames = (organism: string): ReferenceGen }; }; +type VisibilityAccessor = (field: MetadataFilter) => boolean; -const getFieldOrColumnVisibilitiesFromQuery = (schema, state, visibilityPrefix, initiallyVisibleAccessor) => { - +const getFieldOrColumnVisibilitiesFromQuery = ( + schema: Schema, + state: Record, + visibilityPrefix: string, + initiallyVisibleAccessor: VisibilityAccessor, +): Map => { const visibilities = new Map(); - schema.metadata.forEach((field) => { - if (field.hideOnSequenceDetailsPage === true) { - return; - } - visibilities.set(field.name, initiallyVisibleAccessor(field) === true); - }); - - const visibilityKeys = Object.keys(state).filter((key) => key.startsWith(visibilityPrefix)); - - for (const key of visibilityKeys) { - visibilities.set(key.slice(visibilityPrefix.length), state[key] === 'true'); + schema.metadata.forEach((field) => { + if (field.hideOnSequenceDetailsPage === true) { + return; } - return visibilities; -} + visibilities.set(field.name, initiallyVisibleAccessor(field) === true); + }); -export const getFieldVisibilitiesFromQuery = (schema, state) => { - const initiallyVisibleAccessor = field => field.initiallyVisible - return getFieldOrColumnVisibilitiesFromQuery(schema, state, VISIBILITY_PREFIX, initiallyVisibleAccessor) -} + const visibilityKeys = Object.keys(state).filter((key) => key.startsWith(visibilityPrefix)); -export const getColumnVisibilitiesFromQuery = (schema, state) => { + for (const key of visibilityKeys) { + visibilities.set(key.slice(visibilityPrefix.length), state[key] === 'true'); + } + return visibilities; +}; -const initiallyVisibleAccessor = field => schema.tableColumns.includes(field.name) - return getFieldOrColumnVisibilitiesFromQuery(schema, state, COLUMN_VISIBILITY_PREFIX, initiallyVisibleAccessor) -} +export const getFieldVisibilitiesFromQuery = (schema: Schema, state: Record): Map => { + const initiallyVisibleAccessor: VisibilityAccessor = (field) => field.initiallyVisible === true; + return getFieldOrColumnVisibilitiesFromQuery(schema, state, VISIBILITY_PREFIX, initiallyVisibleAccessor); +}; +export const getColumnVisibilitiesFromQuery = (schema: Schema, state: Record): Map => { + const initiallyVisibleAccessor: VisibilityAccessor = (field) => schema.tableColumns.includes(field.name); + return getFieldOrColumnVisibilitiesFromQuery(schema, state, COLUMN_VISIBILITY_PREFIX, initiallyVisibleAccessor); +}; -export const getFieldValuesFromQuery = (state, hiddenFieldValues) => { +export const getFieldValuesFromQuery = ( + state: Record, + hiddenFieldValues: Record, +): Record => { const fieldKeys = Object.keys(state) - .filter((key) => !key.startsWith(VISIBILITY_PREFIX) && !key.startsWith(COLUMN_VISIBILITY_PREFIX)) - .filter((key) => key !== ORDER_KEY && key !== ORDER_DIRECTION_KEY); - -const values: Record = { ...hiddenFieldValues }; -for (const key of fieldKeys) { - values[key] = state[key]; -} -return values; - - -} + .filter((key) => !key.startsWith(VISIBILITY_PREFIX) && !key.startsWith(COLUMN_VISIBILITY_PREFIX)) + .filter((key) => key !== ORDER_KEY && key !== ORDER_DIRECTION_KEY); + const values: Record = { ...hiddenFieldValues }; + for (const key of fieldKeys) { + values[key] = state[key]; + } + return values; +}; const textAccessionsToList = (text: string): string[] => { const accessions = text @@ -103,39 +105,48 @@ const textAccessionsToList = (text: string): string[] => { return accessions; }; +export const getLapisSearchParameters = ( + fieldValues: Record, + referenceGenomesSequenceNames: ReferenceGenomesSequenceNames, +): Record => { + const sequenceFilters = Object.fromEntries( + Object.entries(fieldValues).filter(([, value]) => value !== undefined && value !== ''), + ); -export const getLapisSearchParameters = (fieldValues, referenceGenomesSequenceNames) => - { - const sequenceFilters = Object.fromEntries( - Object.entries(fieldValues).filter(([, value]) => value !== undefined && value !== ''), - ); + if (sequenceFilters.accession !== '' && sequenceFilters.accession !== undefined) { + sequenceFilters.accession = textAccessionsToList(sequenceFilters.accession); + } - if (sequenceFilters.accession !== '' && sequenceFilters.accession !== undefined) { - sequenceFilters.accession = textAccessionsToList(sequenceFilters.accession); - } + delete sequenceFilters.mutation; - delete sequenceFilters.mutation; - - const mutationFilter = parseMutationString(fieldValues.mutation ?? '', referenceGenomesSequenceNames); - - return { - ...sequenceFilters, - nucleotideMutations: mutationFilter - .filter((m) => m.baseType === 'nucleotide' && m.mutationType === 'substitutionOrDeletion') - .map((m) => m.text), - aminoAcidMutations: mutationFilter - .filter((m) => m.baseType === 'aminoAcid' && m.mutationType === 'substitutionOrDeletion') - .map((m) => m.text), - nucleotideInsertions: mutationFilter - .filter((m) => m.baseType === 'nucleotide' && m.mutationType === 'insertion') - .map((m) => m.text), - aminoAcidInsertions: mutationFilter - .filter((m) => m.baseType === 'aminoAcid' && m.mutationType === 'insertion') - .map((m) => m.text), - }; - } + const mutationFilter = parseMutationString(fieldValues.mutation ?? '', referenceGenomesSequenceNames); -export const getPreloadedSearchData = (searchParams, hiddenFieldValues, schema, organismName) => - { + return { + ...sequenceFilters, + nucleotideMutations: mutationFilter + .filter((m) => m.baseType === 'nucleotide' && m.mutationType === 'substitutionOrDeletion') + .map((m) => m.text), + aminoAcidMutations: mutationFilter + .filter((m) => m.baseType === 'aminoAcid' && m.mutationType === 'substitutionOrDeletion') + .map((m) => m.text), + nucleotideInsertions: mutationFilter + .filter((m) => m.baseType === 'nucleotide' && m.mutationType === 'insertion') + .map((m) => m.text), + aminoAcidInsertions: mutationFilter + .filter((m) => m.baseType === 'aminoAcid' && m.mutationType === 'insertion') + .map((m) => m.text), + }; +}; + +/* +export const getPreloadedSearchData = ( + searchParams: URLSearchParams, + hiddenFieldValues: Record, + schema: Schema, + organismName: string +): Record => { + // This function is empty in the original code, so I'm leaving it as is + return {}; +}; - } \ No newline at end of file +*/