From 5c78d5c1d39bc4bd3ae8c82587f996f5fde3fadc Mon Sep 17 00:00:00 2001 From: "Dusan Mijatovic (PC2020)" Date: Sun, 28 Apr 2024 16:21:59 +0200 Subject: [PATCH 1/9] feat: add communities to rsd admin section --- database/024-community.sql | 193 ++++++++++++++ frontend/components/admin/AdminNav.tsx | 9 +- .../admin/communities/AddCommunityModal.tsx | 237 ++++++++++++++++++ .../admin/communities/CommunityList.tsx | 83 ++++++ .../admin/communities/CommunityListItem.tsx | 91 +++++++ .../admin/communities/NoCommunityAlert.tsx | 18 ++ .../admin/communities/apiCommunities.ts | 153 +++++++++++ .../components/admin/communities/config.ts | 60 +++++ .../components/admin/communities/index.tsx | 66 +++++ .../admin/communities/useAdminCommunities.tsx | 118 +++++++++ .../components/admin/organisations/index.tsx | 4 +- .../components/form/ControlledImageInput.tsx | 128 ++++++++++ .../software/edit/editSoftwareConfig.tsx | 1 + .../organisations/EditOrganisationModal.tsx | 120 ++------- frontend/pages/admin/communities.tsx | 70 ++++++ 15 files changed, 1248 insertions(+), 103 deletions(-) create mode 100644 database/024-community.sql create mode 100644 frontend/components/admin/communities/AddCommunityModal.tsx create mode 100644 frontend/components/admin/communities/CommunityList.tsx create mode 100644 frontend/components/admin/communities/CommunityListItem.tsx create mode 100644 frontend/components/admin/communities/NoCommunityAlert.tsx create mode 100644 frontend/components/admin/communities/apiCommunities.ts create mode 100644 frontend/components/admin/communities/config.ts create mode 100644 frontend/components/admin/communities/index.tsx create mode 100644 frontend/components/admin/communities/useAdminCommunities.tsx create mode 100644 frontend/components/form/ControlledImageInput.tsx create mode 100644 frontend/pages/admin/communities.tsx diff --git a/database/024-community.sql b/database/024-community.sql new file mode 100644 index 000000000..59753fbd8 --- /dev/null +++ b/database/024-community.sql @@ -0,0 +1,193 @@ +-- SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +-- SPDX-FileCopyrightText: 2024 Netherlands eScience Center +-- +-- SPDX-License-Identifier: Apache-2.0 + +CREATE TABLE community ( + id UUID DEFAULT gen_random_uuid() PRIMARY KEY, + slug VARCHAR(200) UNIQUE NOT NULL CHECK (slug ~ '^[a-z0-9]+(-[a-z0-9]+)*$'), + name VARCHAR(200) NOT NULL, + short_description VARCHAR(300), + description VARCHAR(10000), + primary_maintainer UUID REFERENCES account (id), + logo_id VARCHAR(40) REFERENCES image(id), + created_at TIMESTAMPTZ NOT NULL, + updated_at TIMESTAMPTZ NOT NULL +); + +-- SANITISE insert and update +-- ONLY rsd_admin and primary_maintainer can change community table +-- ONLY rsd_admin can change primary_maintainer value +CREATE FUNCTION sanitise_insert_community() RETURNS TRIGGER LANGUAGE plpgsql AS +$$ +BEGIN + NEW.id = gen_random_uuid(); + NEW.created_at = LOCALTIMESTAMP; + NEW.updated_at = NEW.created_at; + + IF CURRENT_USER = 'rsd_admin' OR (SELECT rolsuper FROM pg_roles WHERE rolname = CURRENT_USER) THEN + RETURN NEW; + END IF; + + IF NOT NEW.is_tenant AND NEW.parent IS NULL AND NEW.primary_maintainer IS NULL THEN + RETURN NEW; + END IF; + + IF (SELECT primary_maintainer FROM community o WHERE o.id = NEW.parent) = uuid(current_setting('request.jwt.claims', FALSE)::json->>'account') + AND + NEW.primary_maintainer = (SELECT primary_maintainer FROM community o WHERE o.id = NEW.parent) + THEN + RETURN NEW; + END IF; + + RAISE EXCEPTION USING MESSAGE = 'You are not allowed to add this community'; +END +$$; + +CREATE TRIGGER sanitise_insert_community BEFORE INSERT ON community FOR EACH ROW EXECUTE PROCEDURE sanitise_insert_community(); + + +CREATE FUNCTION sanitise_update_community() RETURNS TRIGGER LANGUAGE plpgsql AS +$$ +BEGIN + NEW.id = OLD.id; + NEW.created_at = OLD.created_at; + NEW.updated_at = LOCALTIMESTAMP; + + IF NEW.slug IS DISTINCT FROM OLD.slug AND CURRENT_USER IS DISTINCT FROM 'rsd_admin' AND (SELECT rolsuper FROM pg_roles WHERE rolname = CURRENT_USER) IS DISTINCT FROM TRUE THEN + RAISE EXCEPTION USING MESSAGE = 'You are not allowed to change the slug'; + END IF; + + IF CURRENT_USER <> 'rsd_admin' AND NOT (SELECT rolsuper FROM pg_roles WHERE rolname = CURRENT_USER) THEN + IF NEW.primary_maintainer IS DISTINCT FROM OLD.primary_maintainer THEN + RAISE EXCEPTION USING MESSAGE = 'You are not allowed to change the primary maintainer for community ' || OLD.name; + END IF; + END IF; + + RETURN NEW; +END +$$; + +CREATE TRIGGER sanitise_update_community BEFORE UPDATE ON community FOR EACH ROW EXECUTE PROCEDURE sanitise_update_community(); + +-- RLS community table +ALTER TABLE community ENABLE ROW LEVEL SECURITY; + +CREATE POLICY anyone_can_read ON community FOR SELECT TO rsd_web_anon, rsd_user + USING (TRUE); + +CREATE POLICY admin_all_rights ON community TO rsd_admin + USING (TRUE) + WITH CHECK (TRUE); + + +-- SOFTWARE FOR COMMUNITY +-- request status of software to be added to community +-- default value is pending +CREATE TYPE request_status AS ENUM ( + 'pending', + 'approved', + 'rejected' +); + +CREATE TABLE software_for_community ( + community UUID REFERENCES community (id), + software UUID REFERENCES software (id), + status request_status NOT NULL DEFAULT 'pending', + PRIMARY KEY (community, software) +); + +CREATE FUNCTION sanitise_update_software_for_community() RETURNS TRIGGER LANGUAGE plpgsql AS +$$ +BEGIN + NEW.community = OLD.community; + NEW.software = OLD.software; + return NEW; +END +$$; + +CREATE TRIGGER sanitise_update_software_for_community BEFORE UPDATE ON software_for_community FOR EACH ROW EXECUTE PROCEDURE sanitise_update_software_for_community(); + + +-- MAINTAINER OF COMMUNITY + +CREATE TABLE maintainer_for_community ( + maintainer UUID REFERENCES account (id), + community UUID REFERENCES community (id), + PRIMARY KEY (maintainer, community) +); + +-- INVITES FOR COMMUNITY MAINTAINER (magic link) +CREATE TABLE invite_maintainer_for_community ( + id UUID DEFAULT gen_random_uuid() PRIMARY KEY, + community UUID REFERENCES community (id) NOT NULL, + created_by UUID REFERENCES account (id), + claimed_by UUID REFERENCES account (id), + claimed_at TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT LOCALTIMESTAMP +); + +CREATE FUNCTION sanitise_insert_invite_maintainer_for_community() RETURNS TRIGGER LANGUAGE plpgsql AS +$$ +BEGIN + NEW.id = gen_random_uuid(); + NEW.created_at = LOCALTIMESTAMP; + NEW.claimed_by = NULL; + NEW.claimed_at = NULL; + return NEW; +END +$$; + +CREATE TRIGGER sanitise_insert_invite_maintainer_for_community BEFORE INSERT ON invite_maintainer_for_community FOR EACH ROW EXECUTE PROCEDURE sanitise_insert_invite_maintainer_for_community(); + +CREATE FUNCTION sanitise_update_invite_maintainer_for_community() RETURNS TRIGGER LANGUAGE plpgsql AS +$$ +BEGIN + NEW.id = OLD.id; + NEW.software = OLD.software; + NEW.created_by = OLD.created_by; + NEW.created_at = OLD.created_at; + return NEW; +END +$$; + +CREATE TRIGGER sanitise_update_invite_maintainer_for_community BEFORE UPDATE ON invite_maintainer_for_community FOR EACH ROW EXECUTE PROCEDURE sanitise_update_invite_maintainer_for_community(); + +CREATE FUNCTION accept_invitation_community(invitation UUID) RETURNS TABLE( + name VARCHAR, + slug VARCHAR +) LANGUAGE plpgsql VOLATILE SECURITY DEFINER AS +$$ +DECLARE invitation_row invite_maintainer_for_community%ROWTYPE; +DECLARE account UUID; +BEGIN + account = uuid(current_setting('request.jwt.claims', FALSE)::json->>'account'); + IF account IS NULL THEN + RAISE EXCEPTION USING MESSAGE = 'Please login first'; + END IF; + + IF invitation IS NULL THEN + RAISE EXCEPTION USING MESSAGE = 'Please provide an invitation id'; + END IF; + + SELECT * FROM invite_maintainer_for_community WHERE id = invitation INTO invitation_row; + IF invitation_row.id IS NULL THEN + RAISE EXCEPTION USING MESSAGE = 'Invitation with id ' || invitation || ' does not exist'; + END IF; + + IF invitation_row.claimed_by IS NOT NULL OR invitation_row.claimed_at IS NOT NULL THEN + RAISE EXCEPTION USING MESSAGE = 'Invitation with id ' || invitation || ' is expired'; + END IF; + +-- Only use the invitation if not already a maintainer + IF NOT EXISTS(SELECT 1 FROM maintainer_for_community WHERE maintainer = account AND community = invitation_row.community) THEN + UPDATE invite_maintainer_for_community SET claimed_by = account, claimed_at = LOCALTIMESTAMP WHERE id = invitation; + INSERT INTO maintainer_for_community VALUES (account, invitation_row.community); + END IF; + + RETURN QUERY + SELECT community.name, community.slug FROM community WHERE community.id = invitation_row.community; + RETURN; +END +$$; + diff --git a/frontend/components/admin/AdminNav.tsx b/frontend/components/admin/AdminNav.tsx index fa2ea2ed5..0eabc622f 100644 --- a/frontend/components/admin/AdminNav.tsx +++ b/frontend/components/admin/AdminNav.tsx @@ -26,6 +26,7 @@ import FluorescentIcon from '@mui/icons-material/Fluorescent' import CampaignIcon from '@mui/icons-material/Campaign' import BugReportIcon from '@mui/icons-material/BugReport' import ReceiptLongIcon from '@mui/icons-material/ReceiptLong' +import Diversity3Icon from '@mui/icons-material/Diversity3' import {editMenuItemButtonSx} from '~/config/menuItems' @@ -66,6 +67,12 @@ export const adminPages = { icon: , path: '/admin/organisations', }, + communities: { + title: 'Communities', + subtitle: '', + icon: , + path: '/admin/communities', + }, keywords:{ title: 'Keywords', subtitle: '', @@ -94,7 +101,7 @@ export const adminPages = { // extract page types from the object type pageTypes = keyof typeof adminPages -// extract page properties from forst admin item +// extract page properties from first admin item type pageProps = typeof adminPages.accounts export default function AdminNav() { diff --git a/frontend/components/admin/communities/AddCommunityModal.tsx b/frontend/components/admin/communities/AddCommunityModal.tsx new file mode 100644 index 000000000..43e207d9e --- /dev/null +++ b/frontend/components/admin/communities/AddCommunityModal.tsx @@ -0,0 +1,237 @@ +// SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) +// SPDX-FileCopyrightText: 2022 - 2023 dv4all +// SPDX-FileCopyrightText: 2022 Christian Meeßen (GFZ) +// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) (dv4all) +// SPDX-FileCopyrightText: 2022 Helmholtz Centre Potsdam - GFZ German Research Centre for Geosciences +// SPDX-FileCopyrightText: 2022 Matthias Rüster (GFZ) +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useEffect, useState} from 'react' +import Button from '@mui/material/Button' +import useMediaQuery from '@mui/material/useMediaQuery' +import Dialog from '@mui/material/Dialog' +import DialogTitle from '@mui/material/DialogTitle' +import DialogContent from '@mui/material/DialogContent' +import DialogActions from '@mui/material/DialogActions' + +import {UseFormSetValue, useForm} from 'react-hook-form' + +import {useSession} from '~/auth' +import {useDebounce} from '~/utils/useDebounce' +import {getSlugFromString} from '~/utils/getSlugFromString' +import TextFieldWithCounter from '~/components/form/TextFieldWithCounter' +import SlugTextField from '~/components/form/SlugTextField' +import SubmitButtonWithListener from '~/components/form/SubmitButtonWithListener' +import ControlledImageInput, {FormInputsForImage} from '~/components/form/ControlledImageInput' +import config from './config' +import {Community, validCommunitySlug} from './apiCommunities' + +type AddCommunityModalProps = { + open: boolean, + onCancel: () => void, + onSubmit: (item:EditCommunityProps) => Promise +} + +export type EditCommunityProps = Community & { + logo_b64?: string | null + logo_mime_type?: string | null +} + +let lastValidatedSlug = '' +const formId='add-community-form' + +export default function AddPageModal({open,onCancel,onSubmit}:AddCommunityModalProps) { + const {token} = useSession() + const smallScreen = useMediaQuery('(max-width:600px)') + const [baseUrl, setBaseUrl] = useState('') + const [slugValue, setSlugValue] = useState('') + const [validating, setValidating]=useState(false) + const {register, handleSubmit, watch, formState, setError, setValue} = useForm({ + mode: 'onChange', + defaultValues: { + slug:'', + name: '', + short_description: null, + description: null, + primary_maintainer: null, + logo_id: null, + logo_b64: null, + logo_mime_type: null + } + }) + const {errors, isValid} = formState + // watch for data change in the form + const [slug,name,short_description,logo_id,logo_b64] = watch(['slug','name','short_description','logo_id','logo_b64']) + // construct slug from title + const bouncedSlug = useDebounce(slugValue,700) + + useEffect(() => { + if (typeof location != 'undefined') { + setBaseUrl(`${location.origin}/${config.rsdRootPath}/`) + } + }, []) + + /** + * Convert name value into slugValue. + * The name is then debounced and produces bouncedSlug + * We use bouncedSlug value later on to perform call to api + */ + useEffect(() => { + const softwareSlug = getSlugFromString(name) + setSlugValue(softwareSlug) + }, [name]) + /** + * When bouncedSlug value is changed, + * we need to update slug value (value in the input) shown to user. + * This change occurs when brand_name value is changed + */ + useEffect(() => { + setValue('slug', bouncedSlug, { + shouldValidate: true + }) + }, [bouncedSlug, setValue]) + + useEffect(() => { + let abort = false + async function validateSlug() { + setValidating(true) + const isUsed = await validCommunitySlug({slug,token}) + // if (abort) return + if (isUsed === true) { + const message = `${slug} is already taken. Use letters, numbers and dash "-" to modify slug value.` + setError('slug', { + type: 'validate', + message + }) + } + lastValidatedSlug = slug + // we need to wait some time + setValidating(false) + } + if (slug !== lastValidatedSlug) { + // debugger + validateSlug() + } + return ()=>{abort=true} + },[slug,token,setError]) + + function isSaveDisabled() { + // during async validation we disable button + if (validating === true) return true + // if isValid is not true + return isValid===false + } + + function handleCancel(e:any,reason: 'backdropClick' | 'escapeKeyDown') { + // close only on escape, not if user clicks outside of the modal + if (reason==='escapeKeyDown') onCancel() + } + + return ( + + + {config.modalTitle} + +
+ + {/* hidden inputs */} + + + + + + +
+ } + /> + +
+ + + +
+ + + + +
+
+ ) +} diff --git a/frontend/components/admin/communities/CommunityList.tsx b/frontend/components/admin/communities/CommunityList.tsx new file mode 100644 index 000000000..66b296ab4 --- /dev/null +++ b/frontend/components/admin/communities/CommunityList.tsx @@ -0,0 +1,83 @@ +// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) +// SPDX-FileCopyrightText: 2023 dv4all +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useState} from 'react' +import List from '@mui/material/List' + +import ConfirmDeleteModal from '~/components/layout/ConfirmDeleteModal' +import ContentLoader from '~/components/layout/ContentLoader' +import {Community} from './apiCommunities' +import CommunityListItem from './CommunityListItem' +import NoCommunityAlert from './NoCommunityAlert' + +type DeleteOrganisationModal = { + open: boolean, + item?: Community +} + +type OrganisationsAdminListProps = { + communities: Community[] + loading: boolean + page: number + onDeleteItem: (id:string,logo_id:string|null)=>void +} + +export default function CommunityList({communities,loading,page,onDeleteItem}:OrganisationsAdminListProps) { + const [modal, setModal] = useState({ + open: false + }) + + if (loading && !page) return + + if (communities.length===0) return + + return ( + <> + + { + communities.map(item => { + return ( + setModal({ + open: true, + item + })} + /> + ) + }) + } + + +

+ Are you sure you want to delete community {modal?.item?.name}? +

+ + } + onCancel={() => { + setModal({ + open: false + }) + }} + onDelete={() => { + // call remove method if id present + if (modal.item && modal.item?.id) onDeleteItem(modal.item?.id,modal.item?.logo_id) + setModal({ + open: false + }) + }} + /> + + ) +} diff --git a/frontend/components/admin/communities/CommunityListItem.tsx b/frontend/components/admin/communities/CommunityListItem.tsx new file mode 100644 index 000000000..a1ee7a74c --- /dev/null +++ b/frontend/components/admin/communities/CommunityListItem.tsx @@ -0,0 +1,91 @@ +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) +// SPDX-FileCopyrightText: 2023 dv4all +// +// SPDX-License-Identifier: Apache-2.0 + +import {useRouter} from 'next/router' + +import IconButton from '@mui/material/IconButton' +import ListItem from '@mui/material/ListItem' +import DeleteIcon from '@mui/icons-material/Delete' +import EditIcon from '@mui/icons-material/Edit' + +import ListItemText from '@mui/material/ListItemText' +import ListItemAvatar from '@mui/material/ListItemAvatar' +import Avatar from '@mui/material/Avatar' +import {getImageUrl} from '~/utils/editImage' +import {Community} from './apiCommunities' +import config from './config' + +type OrganisationItemProps = { + item: Community, + onDelete: () => void +} + +export default function CommunityListItem({item, onDelete}: OrganisationItemProps) { + const router = useRouter() + return ( + + {/* onEdit we open community settings */} + + + + 0} + edge="end" + aria-label="delete" + onClick={() => { + onDelete() + }} + > + + + + } + sx={{ + // this makes space for buttons + paddingRight:'6.5rem', + }} + > + + + {item.name.slice(0,3)} + + + + {item.short_description} +
+ Software: 0 (not implemented!) + + } + /> +
+ ) +} diff --git a/frontend/components/admin/communities/NoCommunityAlert.tsx b/frontend/components/admin/communities/NoCommunityAlert.tsx new file mode 100644 index 000000000..9e7aca1dd --- /dev/null +++ b/frontend/components/admin/communities/NoCommunityAlert.tsx @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import Alert from '@mui/material/Alert' +import AlertTitle from '@mui/material/AlertTitle' + +export default function NoCommunityAlert() { + return ( + + No communities defined + To add community to RSD use Add button on the right. + + ) +} diff --git a/frontend/components/admin/communities/apiCommunities.ts b/frontend/components/admin/communities/apiCommunities.ts new file mode 100644 index 000000000..a2bd682fd --- /dev/null +++ b/frontend/components/admin/communities/apiCommunities.ts @@ -0,0 +1,153 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {extractCountFromHeader} from '~/utils/extractCountFromHeader' +import {createJsonHeaders, extractReturnMessage, getBaseUrl} from '~/utils/fetchHelpers' +import logger from '~/utils/logger' +import {paginationUrlParams} from '~/utils/postgrestUrl' + +export type Community={ + id?:string, + slug:string, + name:string, + short_description: string|null, + description: string|null, + primary_maintainer: string|null, + logo_id: string|null +} + +type GetCommunitiesParams={ + page: number, + rows: number, + token: string + searchFor?:string, + orderBy?:string, +} + +export async function getCommunities({page, rows, token, searchFor, orderBy}:GetCommunitiesParams){ + try{ + let query = paginationUrlParams({rows, page}) + if (searchFor) { + query+=`&name=ilike.*${searchFor}*` + } + if (orderBy) { + query+=`&order=${orderBy}` + } else { + query+='&order=name.asc' + } + // complete url + const url = `${getBaseUrl()}/community?${query}` + + // get community + const resp = await fetch(url, { + method: 'GET', + headers: { + ...createJsonHeaders(token), + // request record count to be returned + // note: it's returned in the header + 'Prefer': 'count=exact' + } + }) + + if ([200,206].includes(resp.status)) { + const communities: Community[] = await resp.json() + return { + count: extractCountFromHeader(resp.headers) ?? 0, + communities + } + } + logger(`getCommunities: ${resp.status}: ${resp.statusText}`,'warn') + return { + count: 0, + communities: [] + } + }catch(e:any){ + logger(`getCommunities: ${e.message}`,'error') + return { + count: 0, + communities: [] + } + } +} + +export async function validCommunitySlug({slug, token}: { slug: string, token: string }) { + try{ + // use server side when available + const baseUrl = getBaseUrl() + // get community by slug + let query = `community?select=slug&slug=eq.${slug}` + const url = `${baseUrl}/${query}` + // get community + const resp = await fetch(url, { + method: 'GET', + headers: { + ...createJsonHeaders(token) + } + }) + + if (resp.status === 200) { + const json: [] = await resp.json() + return json.length > 0 + } + return false + }catch(e:any){ + logger(`validCommunitySlug: ${e?.message}`, 'error') + return false + } +} + +export async function addCommunity({data,token}:{data:Community,token:string}) { + try { + const query = 'community' + const url = `/api/v1/${query}` + + const resp = await fetch(url,{ + method: 'POST', + headers: { + ...createJsonHeaders(token), + 'Prefer': 'return=representation' + }, + body: JSON.stringify(data) + }) + if (resp.status === 201) { + const json = await resp.json() + // return created page + return { + status: 200, + message: json[0] + } + } else { + return extractReturnMessage(resp, '') + } + } catch (e: any) { + logger(`addCommunity: ${e?.message}`, 'error') + return { + status: 500, + message: e?.message + } + } +} + +export async function deleteCommunityById({id,token}:{id:string,token:string}) { + try { + const query = `community?id=eq.${id}` + const url = `/api/v1/${query}` + + const resp = await fetch(url,{ + method: 'DELETE', + headers: { + ...createJsonHeaders(token) + } + }) + return extractReturnMessage(resp, '') + } catch (e: any) { + logger(`deleteCommunityById: ${e?.message}`, 'error') + return { + status: 500, + message: e?.message + } + } +} + diff --git a/frontend/components/admin/communities/config.ts b/frontend/components/admin/communities/config.ts new file mode 100644 index 000000000..24f0c3030 --- /dev/null +++ b/frontend/components/admin/communities/config.ts @@ -0,0 +1,60 @@ +// SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) +// SPDX-FileCopyrightText: 2022 - 2023 dv4all +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +const config = { + rsdRootPath:'communities', + modalTitle:'Add community', + slug: { + label: 'RSD path (slug)', + help: 'The location of this community', + baseUrl: () => { + if (typeof location != 'undefined') { + return `${location.origin}/community/` + } + return '/community' + }, + // react-hook-form validation rules + validation: { + required: 'Slug is required', + minLength: {value: 3, message: 'Minimum length is 3'}, + maxLength: {value: 100, message: 'Maximum length is 100'}, + pattern: { + value: /^[a-z0-9]+(-[a-z0-9]+)*$/, + message: 'Use letters, numbers and dash "-". Other characters are not allowed.' + } + } + }, + name: { + label: 'Name', + help: 'Community name shown in the card.', + // react-hook-form validation rules + validation: { + required: 'Name is required', + minLength: {value: 3, message: 'Minimum length is 3'}, + maxLength: {value: 100, message: 'Maximum length is 100'}, + } + }, + short_description: { + label: 'Short description', + help: 'Describe in short what is this community about.', + validation: { + // we do not show error message for this one, we use only maxLength value + maxLength: {value: 300, message: 'Maximum length is 300'}, + } + }, + // field for markdown + description: { + label: 'About page', + help: '', + validation: { + // we do not show error message for this one, we use only maxLength value + maxLength: {value: 10000, message: 'Maximum length is 10000'}, + } + }, +} + +export default config diff --git a/frontend/components/admin/communities/index.tsx b/frontend/components/admin/communities/index.tsx new file mode 100644 index 000000000..bce12e55a --- /dev/null +++ b/frontend/components/admin/communities/index.tsx @@ -0,0 +1,66 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useState,useContext} from 'react' +import Button from '@mui/material/Button' +import AddIcon from '@mui/icons-material/Add' + +import Searchbox from '~/components/search/Searchbox' +import Pagination from '~/components/pagination/Pagination' +import PaginationContext from '~/components/pagination/PaginationContext' +import AddCommunityModal, {EditCommunityProps} from './AddCommunityModal' +import CommunityList from './CommunityList' +import {useAdminCommunities} from './useAdminCommunities' + +export default function AdminCommunities() { + const [modal, setModal] = useState(false) + const {pagination:{page}} = useContext(PaginationContext) + const {loading, communities, addCommunity, deleteCommunity} = useAdminCommunities() + + async function onAddCommunity(data:EditCommunityProps){ + // add community + const ok = await addCommunity(data) + // if all ok close the modal + // on error snackbar will be shown and we leave modal open for possible corrections + if (ok===true) setModal(false) + } + + return ( + <> +
+
+
+ + +
+ +
+
+ +
+
+ { + modal ? + setModal(false)} + onSubmit={onAddCommunity} + /> + : null + } + + ) +} diff --git a/frontend/components/admin/communities/useAdminCommunities.tsx b/frontend/components/admin/communities/useAdminCommunities.tsx new file mode 100644 index 000000000..24a85e5dc --- /dev/null +++ b/frontend/components/admin/communities/useAdminCommunities.tsx @@ -0,0 +1,118 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useSession} from '~/auth' +import useSnackbar from '~/components/snackbar/useSnackbar' +import usePaginationWithSearch from '~/utils/usePaginationWithSearch' +import {Community, getCommunities, addCommunity as addCommunityToRsd, deleteCommunityById} from './apiCommunities' +import {useCallback, useEffect, useState} from 'react' +import {EditCommunityProps} from './AddCommunityModal' +import {deleteImage, upsertImage} from '~/utils/editImage' + +export function useAdminCommunities(){ + const {token} = useSession() + const {showErrorMessage} = useSnackbar() + const {searchFor, page, rows, setCount} = usePaginationWithSearch('Find community by name') + const [communities, setCommunities] = useState([]) + const [loading, setLoading] = useState(true) + + const loadCommunities = useCallback(async() => { + setLoading(true) + const {communities, count} = await getCommunities({ + token, + searchFor, + page, + rows + }) + setCommunities(communities) + setCount(count ?? 0) + setLoading(false) + // we do not include setCount in order to avoid loop + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [token, searchFor, page, rows]) + + useEffect(() => { + if (token) { + loadCommunities() + } + // we do not include setCount in order to avoid loop + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [token,searchFor,page,rows]) + + const addCommunity = useCallback(async(data:EditCommunityProps)=>{ + try{ + // UPLOAD LOGO + if (data.logo_b64 && data.logo_mime_type) { + // split base64 to use only encoded content + const b64data = data.logo_b64.split(',')[1] + const upload = await upsertImage({ + data: b64data, + mime_type: data.logo_mime_type, + token + }) + // debugger + if (upload.status === 201) { + // update data values + data.logo_id = upload.message + } else { + data.logo_id = null + showErrorMessage(`Failed to upload image. ${upload.message}`) + return false + } + } + // remove temp props + delete data?.logo_b64 + delete data?.logo_mime_type + + const resp = await addCommunityToRsd({ + data, + token + }) + + if (resp.status === 200) { + // return created item + loadCommunities() + return true + } else { + // show error + showErrorMessage(`Failed to add community. Error: ${resp.message}`) + return false + } + }catch(e:any){ + showErrorMessage(`Failed to add community. Error: ${e.message}`) + return false + } + // we do not include showErrorMessage in order to avoid loop + // eslint-disable-next-line react-hooks/exhaustive-deps + },[token,loadCommunities]) + + const deleteCommunity = useCallback(async(id:string,logo_id:string|null)=>{ + // console.log('deleteCommunity...', item) + const resp = await deleteCommunityById({id,token}) + if (resp.status!==200){ + showErrorMessage(`Failed to delete community. Error: ${resp.message}`) + } else { + // optionally try to delete logo + // but not wait on response + if (logo_id){ + await deleteImage({ + id: logo_id, + token + }) + } + // reload list + loadCommunities() + } + // we do not include showErrorMessage in order to avoid loop + // eslint-disable-next-line react-hooks/exhaustive-deps + },[token]) + + return { + loading, + communities, + addCommunity, + deleteCommunity + } +} diff --git a/frontend/components/admin/organisations/index.tsx b/frontend/components/admin/organisations/index.tsx index 7c040b470..f536f06d8 100644 --- a/frontend/components/admin/organisations/index.tsx +++ b/frontend/components/admin/organisations/index.tsx @@ -27,10 +27,10 @@ export default function OrganisationsAdminPage() { return (
-

+ {/*

RSD organisations {count} -

+ */}
diff --git a/frontend/components/form/ControlledImageInput.tsx b/frontend/components/form/ControlledImageInput.tsx new file mode 100644 index 000000000..c6438560f --- /dev/null +++ b/frontend/components/form/ControlledImageInput.tsx @@ -0,0 +1,128 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {ChangeEvent, useRef} from 'react' + +import Avatar from '@mui/material/Avatar' +import Button from '@mui/material/Button' +import DeleteIcon from '@mui/icons-material/Delete' + +import {UseFormSetValue} from 'react-hook-form' + +import {useSession} from '~/auth' +import {deleteImage, getImageUrl} from '~/utils/editImage' +import useSnackbar from '~/components/snackbar/useSnackbar' +import {handleFileUpload} from '~/utils/handleFileUpload' + +export type FormInputsForImage={ + logo_id: string|null + logo_b64?: string|null + logo_mime_type?: string|null +} + +type ImageInputProps={ + name:string + logo_b64?: string|null + logo_id?: string|null + setValue: UseFormSetValue +} + +export default function ControlledImageInput({name,logo_b64,logo_id,setValue}:ImageInputProps) { + const {token} = useSession() + const {showWarningMessage,showErrorMessage} = useSnackbar() + const imgInputRef = useRef(null) + + async function onFileUpload(e:ChangeEvent|undefined) { + if (typeof e !== 'undefined') { + const {status, message, image_b64, image_mime_type} = await handleFileUpload(e) + if (status === 200 && image_b64 && image_mime_type) { + // save image + replaceLogo(image_b64,image_mime_type) + } else if (status===413) { + showWarningMessage(message) + } else { + showErrorMessage(message) + } + } + } + + async function replaceLogo(logo_b64:string, logo_mime_type:string) { + if (logo_id) { + // remove old logo from db + const del = await deleteImage({ + id: logo_id, + token + }) + setValue('logo_id', null) + } + // write new logo to logo_b64 + // we upload the image after submit + setValue('logo_b64', logo_b64) + setValue('logo_mime_type', logo_mime_type, {shouldDirty: true}) + } + + async function deleteLogo() { + if (logo_id) { + // remove old logo from db + await deleteImage({ + id: logo_id, + token + }) + } + // remove from form values + setValue('logo_id', null) + setValue('logo_b64', null) + setValue('logo_mime_type', null, {shouldDirty: true}) + // remove image value from input + if (imgInputRef.current){ + imgInputRef.current.value = '' + } + } + + return ( +
+ + +
+ +
+
+ ) +} diff --git a/frontend/components/software/edit/editSoftwareConfig.tsx b/frontend/components/software/edit/editSoftwareConfig.tsx index f15a5b4d6..d288ecec0 100644 --- a/frontend/components/software/edit/editSoftwareConfig.tsx +++ b/frontend/components/software/edit/editSoftwareConfig.tsx @@ -169,6 +169,7 @@ export type ContributorInformationConfig = typeof contributorInformation export const organisationInformation = { title: 'Participating organisations', + modalTile: 'Organisation', findOrganisation: { title: 'Add organisation', subtitle: 'We search by name in the RSD and the ROR databases', diff --git a/frontend/components/software/edit/organisations/EditOrganisationModal.tsx b/frontend/components/software/edit/organisations/EditOrganisationModal.tsx index b811f1b54..9f6066535 100644 --- a/frontend/components/software/edit/organisations/EditOrganisationModal.tsx +++ b/frontend/components/software/edit/organisations/EditOrganisationModal.tsx @@ -2,33 +2,28 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 - 2023 Helmholtz Centre Potsdam - GFZ German Research Centre for Geosciences // SPDX-FileCopyrightText: 2022 - 2024 dv4all +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (dv4all) (dv4all) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 -import {ChangeEvent, useEffect} from 'react' -import Avatar from '@mui/material/Avatar' +import {useEffect} from 'react' import Button from '@mui/material/Button' import Dialog from '@mui/material/Dialog' import DialogActions from '@mui/material/DialogActions' import DialogContent from '@mui/material/DialogContent' import DialogTitle from '@mui/material/DialogTitle' import useMediaQuery from '@mui/material/useMediaQuery' -import DeleteIcon from '@mui/icons-material/Delete' import Alert from '@mui/material/Alert' import AlertTitle from '@mui/material/AlertTitle' -import {useForm} from 'react-hook-form' +import {UseFormSetValue, useForm} from 'react-hook-form' -import {useSession} from '~/auth' import {EditOrganisation} from '~/types/Organisation' -import {deleteImage, getImageUrl} from '~/utils/editImage' -import {handleFileUpload} from '~/utils/handleFileUpload' -import useSnackbar from '~/components/snackbar/useSnackbar' import ControlledTextField from '~/components/form/ControlledTextField' import SubmitButtonWithListener from '~/components/form/SubmitButtonWithListener' import {organisationInformation as config} from '../editSoftwareConfig' +import ControlledImageInput, {FormInputsForImage} from '~/components/form/ControlledImageInput' type EditOrganisationModalProps = { @@ -44,8 +39,6 @@ type EditOrganisationModalProps = { const formId='edit-organisation-modal' export default function EditOrganisationModal({open, onCancel, onSubmit, organisation, pos}: EditOrganisationModalProps) { - const {token} = useSession() - const {showWarningMessage,showErrorMessage} = useSnackbar() const smallScreen = useMediaQuery('(max-width:600px)') const {handleSubmit, watch, formState, reset, control, register, setValue, trigger} = useForm({ mode: 'onChange', @@ -70,7 +63,7 @@ export default function EditOrganisationModal({open, onCancel, onSubmit, organis // validate name on opening of the form // we validate organisation name because we take it // over from ROR or user input (which might not be valid entry) - // it needs to be at the end of the cicle, so we need to use setTimeout + // it needs to be at the end of the cycle, so we need to use setTimeout trigger('name') }, 0) // eslint-disable-next-line react-hooks/exhaustive-deps @@ -90,48 +83,6 @@ export default function EditOrganisationModal({open, onCancel, onSubmit, organis onCancel() } - async function onFileUpload(e:ChangeEvent|undefined) { - if (typeof e !== 'undefined') { - const {status, message, image_b64, image_mime_type} = await handleFileUpload(e) - if (status === 200 && image_b64 && image_mime_type) { - // save image - replaceLogo(image_b64,image_mime_type) - } else if (status===413) { - showWarningMessage(message) - } else { - showErrorMessage(message) - } - } - } - - async function replaceLogo(logo_b64:string, logo_mime_type:string) { - if (formData.logo_id) { - // remove old logo from db - const del = await deleteImage({ - id: formData.logo_id, - token - }) - setValue('logo_id', null) - } - // write new logo to logo_b64 - // we upload the image after submit - setValue('logo_b64', logo_b64) - setValue('logo_mime_type', logo_mime_type, {shouldDirty: true}) - } - - async function deleteLogo() { - if (formData.logo_id) { - // remove old logo from db - const del = await deleteImage({ - id: formData.logo_id, - token - }) - } - setValue('logo_id', null) - setValue('logo_b64', null) - setValue('logo_mime_type', null, {shouldDirty: true}) - } - return ( - Organisation + {config.modalTile}
+ +
-
- - -
- -
-
+ } + />
Do you have a logo? - You are the first to reference this organisation and can add a logo now. After clicking on "Save", logos can only be added by organisation maintainers. + You are the first to reference this organisation and can add a logo now. After clicking on "Save", logos can only be added by organisation maintainers. + + {pageTitle} + + + + + + + + + + ) +} + +// see documentation https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering +// export async function getServerSideProps(context:GetServerSidePropsContext) { +// try{ +// const {req} = context +// const token = req?.cookies['rsd_token'] + +// // get links to all pages server side +// const resp = await getCommunities({ +// page: 0, +// rows: 12, +// token: token ?? '' +// }) + +// return { +// // passed to the page component as props +// props: { +// count: resp?.count, +// communities: resp.communities +// }, +// } +// }catch(e){ +// return { +// notFound: true, +// } +// } +// } From ac03a932ca13a2fbd752268e2e2937f05e58d013 Mon Sep 17 00:00:00 2001 From: Dusan Mijatovic Date: Thu, 2 May 2024 17:00:01 +0200 Subject: [PATCH 2/9] Implement communities overview (#1188) feat: implement communities overview, grid and list incl. search on name and short description chore: add communities to data generation and small SQL style fixes --------- Co-authored-by: Ewan Cahen --- data-generation/main.js | 102 ++++++---- database/024-community.sql | 15 +- database/124-community-views.sql | 50 +++++ .../permissions/isMaintainerOfCommunity.ts | 62 ++++++ frontend/components/AppHeader/DesktopMenu.tsx | 28 +++ .../components/AppHeader/ResponsiveMenu.tsx | 93 +++++++++ frontend/components/AppHeader/index.tsx | 103 ++-------- .../GlobalSearchAutocomplete/index.tsx | 4 +- .../components/communities/apiCommunities.ts | 141 ++++++++++++++ .../communities/metadata/CommunityLogo.tsx | 140 ++++++++++++++ .../components/communities/metadata/index.tsx | 51 +++++ .../communities/overview/CommunitiesGrid.tsx | 26 +++ .../communities/overview/CommunitiesList.tsx | 25 +++ .../communities/overview/CommunityCard.tsx | 63 +++++++ .../overview/CommunityListItem.tsx | 45 +++++ .../communities/tabs/CommunityTabItems.tsx | 64 +++++++ .../components/communities/tabs/index.tsx | 66 +++++++ .../PageBreadcrumbs.tsx} | 19 +- .../news/overview/useNewsOverviewParams.tsx | 53 ------ .../useSearchParams.test.tsx} | 42 ++++- .../useSearchParams.tsx} | 28 +-- .../software/edit/editSoftwareConfig.tsx | 2 +- .../organisations/EditOrganisationModal.tsx | 2 +- frontend/config/menuItems.ts | 9 +- .../pages/communities/[slug]/settings.tsx | 10 + .../pages/communities/[slug]/software.tsx | 155 +++++++++++++++ frontend/pages/communities/index.tsx | 176 ++++++++++++++++++ frontend/pages/news/index.tsx | 23 ++- frontend/pages/organisations/[...slug].tsx | 13 +- frontend/pages/organisations/index.tsx | 24 +-- frontend/public/data/settings.json | 10 + frontend/utils/extractQueryParam.test.ts | 10 +- frontend/utils/extractQueryParam.ts | 12 +- 33 files changed, 1429 insertions(+), 237 deletions(-) create mode 100644 database/124-community-views.sql create mode 100644 frontend/auth/permissions/isMaintainerOfCommunity.ts create mode 100644 frontend/components/AppHeader/DesktopMenu.tsx create mode 100644 frontend/components/AppHeader/ResponsiveMenu.tsx create mode 100644 frontend/components/communities/apiCommunities.ts create mode 100644 frontend/components/communities/metadata/CommunityLogo.tsx create mode 100644 frontend/components/communities/metadata/index.tsx create mode 100644 frontend/components/communities/overview/CommunitiesGrid.tsx create mode 100644 frontend/components/communities/overview/CommunitiesList.tsx create mode 100644 frontend/components/communities/overview/CommunityCard.tsx create mode 100644 frontend/components/communities/overview/CommunityListItem.tsx create mode 100644 frontend/components/communities/tabs/CommunityTabItems.tsx create mode 100644 frontend/components/communities/tabs/index.tsx rename frontend/components/{organisation/OrganisationBreadcrumbs.tsx => layout/PageBreadcrumbs.tsx} (61%) delete mode 100644 frontend/components/news/overview/useNewsOverviewParams.tsx rename frontend/components/{organisation/overview/useOrganisationOverviewParams.test.tsx => search/useSearchParams.test.tsx} (52%) rename frontend/components/{organisation/overview/useOrganisationOverviewParams.tsx => search/useSearchParams.tsx} (60%) create mode 100644 frontend/pages/communities/[slug]/settings.tsx create mode 100644 frontend/pages/communities/[slug]/software.tsx create mode 100644 frontend/pages/communities/index.tsx diff --git a/data-generation/main.js b/data-generation/main.js index 7433aa4e3..2dbf9a689 100644 --- a/data-generation/main.js +++ b/data-generation/main.js @@ -91,7 +91,7 @@ function generateMentions(amountExtra = 100) { return result; } -async function generateSoftware(amount = 500) { +function generateSoftware(amount=500) { // real software has a real concept DOI const amountRealSoftware = Math.min(conceptDois.length, amount); const brandNames = []; @@ -358,7 +358,7 @@ function generateSoftwareHighlights(ids) { return result; } -async function generateProjects(amount = 500) { +function generateProjects(amount=500) { const result = []; const projectStatuses = ['finished', 'running', 'starting']; @@ -509,7 +509,7 @@ function generateUrlsForProjects(ids) { return result; } -async function generateOrganisations(amount = 500) { +function generateOrganisations(amount=500) { const rorIds = [ 'https://ror.org/000k1q888', 'https://ror.org/006hf6230', @@ -591,6 +591,25 @@ async function generateOrganisations(amount = 500) { return result; } +function generateCommunities(amount = 50) { + const result = []; + + for (let index = 0; index < amount; index++) { + const maxWords = faker.helpers.maybe(() => 5, {probability: 0.8}) ?? 31; + const name = generateUniqueCaseInsensitiveString(() => ('Community: ' + faker.word.words(faker.number.int({max: maxWords, min: 1}))).substring(0, 200)); + + result.push({ + slug: faker.helpers.slugify(name).toLowerCase().replaceAll(/-{2,}/g, '-').replaceAll(/-+$/g, ''), // removes double dashes and trailing dashes + name: name, + short_description: faker.helpers.maybe(() => faker.lorem.paragraphs(1, '\n\n'), {probability: 0.8}) ?? null, + description: faker.helpers.maybe(() => faker.lorem.paragraphs(1, '\n\n'), {probability: 0.8}) ?? null, + logo_id: faker.helpers.maybe(() => localOrganisationLogoIds[index % localImageIds.length], {probability: 0.8}) ?? null, + }); + } + + return result; +} + function generateMetaPages() { const result = []; @@ -636,8 +655,8 @@ function generateNews() { slug: 'never-dependency', }, { - title: 'Shutting down the RSD', - slug: 'shutting-down-the-rsd', + title: 'Sunsetting the RSD', + slug: 'sunsetting-the-rsd' }, { title: 'The last package you will ever need', @@ -651,6 +670,22 @@ function generateNews() { title: 'The 5 best dependencies you never heard about', slug: '5-best-dependencies', }, + { + title: 'Rewriting the RSD in CrabLang', + slug: 'rewrite-rsd-crablang' + }, + { + title: 'The RSD joins forces with Big Company (tm)', + slug: 'rsd-joins-big-company' + }, + { + title: '3 features you didn\'t know about', + slug: '3-features' + }, + { + title: 'Interview with RSD founders', + slug: 'interview-rsd-founders' + }, ]; const result = []; @@ -723,6 +758,17 @@ function generateProjectForOrganisation(idsProjects, idsOrganisations) { return result; } +function generateSoftwareForCommunity(idsSoftware, idsCommunities) { + const result = generateRelationsForDifferingEntities(idsCommunities, idsSoftware, 'community', 'software'); + + const statuses = [{weight: 1, value: 'pending'}, {weight: 8, value: 'approved'}, {weight: 1, value: 'rejected'}]; + result.forEach(entry => { + entry['status'] = faker.helpers.weightedArrayElement(statuses); + }); + + return result; +} + function createJWT() { const secret = process.env.PGRST_JWT_SECRET; return jwt.sign({role: 'rsd_admin'}, secret, {expiresIn: '2m'}); @@ -937,8 +983,8 @@ await Promise.all([mentionsPromise, keywordPromise, researchDomainsPromise]).the console.log('mentions, keywords, research domains done'), ); -let idsSoftware, idsFakeSoftware, idsRealSoftware, idsProjects, idsOrganisations; -const softwarePromise = postToBackend('/software', await generateSoftware()) +let idsSoftware, idsFakeSoftware, idsRealSoftware, idsProjects, idsOrganisations, idsCommunities; +const softwarePromise = postToBackend('/software', generateSoftware()) .then(resp => resp.json()) .then(async swArray => { idsSoftware = swArray.map(sw => sw['id']); @@ -954,7 +1000,7 @@ const softwarePromise = postToBackend('/software', await generateSoftware()) postToBackend('/software_for_software', generateSoftwareForSoftware(idsSoftware)); postToBackend('/software_highlight', generateSoftwareHighlights(idsSoftware.slice(0, 10))); }); -const projectPromise = postToBackend('/project', await generateProjects()) +const projectPromise = postToBackend('/project', generateProjects()) .then(resp => resp.json()) .then(async pjArray => { idsProjects = pjArray.map(sw => sw['id']); @@ -969,11 +1015,18 @@ const projectPromise = postToBackend('/project', await generateProjects()) ); postToBackend('/project_for_project', generateSoftwareForSoftware(idsProjects)); }); -const organisationPromise = postToBackend('/organisation', await generateOrganisations()) +const organisationPromise = postToBackend('/organisation', generateOrganisations()) .then(resp => resp.json()) .then(async orgArray => { idsOrganisations = orgArray.map(org => org['id']); }); + +const communityPromise = postToBackend('/community', generateCommunities()) + .then(resp => resp.json()) + .then(async commArray => { + idsCommunities = commArray.map(comm => comm['id']); + }); + await postToBackend('/meta_pages', generateMetaPages()).then(() => console.log('meta pages done')); await postToBackend('/news?select=id', generateNews()) .then(() => getFromBackend('/news')) @@ -982,29 +1035,14 @@ await postToBackend('/news?select=id', generateNews()) .then(newsIds => postToBackend('/image_for_news', generateImagesForNews(newsIds, localImageIds))) .then(() => console.log('news done')); -await Promise.all([softwarePromise, projectPromise, organisationPromise]).then(() => console.log('sw, pj, org done')); - -await postToBackend( - '/software_for_project', - generateRelationsForDifferingEntities(idsSoftware, idsProjects, 'software', 'project'), -).then(() => console.log('sw-pj done')); -await postToBackend( - '/software_for_organisation', - generateRelationsForDifferingEntities(idsSoftware, idsOrganisations, 'software', 'organisation'), -).then(() => console.log('sw-org done')); -await postToBackend('/project_for_organisation', generateProjectForOrganisation(idsProjects, idsOrganisations)).then( - () => console.log('pj-org done'), -); -await postToBackend( - '/release', - idsSoftware.map(id => ({software: id})), -) - .then(() => - postToBackend( - '/release_version', - generateRelationsForDifferingEntities(idsFakeSoftware, idsMentions, 'release_id', 'mention_id', 100), - ), - ) +await Promise.all([softwarePromise, projectPromise, organisationPromise, communityPromise]).then(() => console.log('sw, pj, org, comm done')); + +await postToBackend('/software_for_project', generateRelationsForDifferingEntities(idsSoftware, idsProjects, 'software', 'project')).then(() => console.log('sw-pj done')); +await postToBackend('/software_for_organisation', generateRelationsForDifferingEntities(idsSoftware, idsOrganisations, 'software', 'organisation')).then(() => console.log('sw-org done')); +await postToBackend('/project_for_organisation', generateProjectForOrganisation(idsProjects, idsOrganisations)).then(() => console.log('pj-org done')); +await postToBackend('/software_for_community', generateSoftwareForCommunity(idsSoftware, idsCommunities)).then(() => console.log('sw-comm done')); +await postToBackend('/release', idsSoftware.map(id => ({software: id}))) + .then(() => postToBackend('/release_version', generateRelationsForDifferingEntities(idsFakeSoftware, idsMentions, 'release_id', 'mention_id', 100))) .then(() => console.log('releases done')); console.log('Done'); diff --git a/database/024-community.sql b/database/024-community.sql index 59753fbd8..f0aeec524 100644 --- a/database/024-community.sql +++ b/database/024-community.sql @@ -1,17 +1,18 @@ -- SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +-- SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) -- SPDX-FileCopyrightText: 2024 Netherlands eScience Center -- -- SPDX-License-Identifier: Apache-2.0 CREATE TABLE community ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, - slug VARCHAR(200) UNIQUE NOT NULL CHECK (slug ~ '^[a-z0-9]+(-[a-z0-9]+)*$'), + slug VARCHAR(200) UNIQUE NOT NULL CHECK (slug ~ '^[a-z0-9]+(-[a-z0-9]+)*$'), name VARCHAR(200) NOT NULL, short_description VARCHAR(300), description VARCHAR(10000), - primary_maintainer UUID REFERENCES account (id), - logo_id VARCHAR(40) REFERENCES image(id), - created_at TIMESTAMPTZ NOT NULL, + primary_maintainer UUID REFERENCES account (id), + logo_id VARCHAR(40) REFERENCES image(id), + created_at TIMESTAMPTZ NOT NULL, updated_at TIMESTAMPTZ NOT NULL ); @@ -91,17 +92,17 @@ CREATE TYPE request_status AS ENUM ( ); CREATE TABLE software_for_community ( - community UUID REFERENCES community (id), software UUID REFERENCES software (id), + community UUID REFERENCES community (id), status request_status NOT NULL DEFAULT 'pending', - PRIMARY KEY (community, software) + PRIMARY KEY (software, community) ); CREATE FUNCTION sanitise_update_software_for_community() RETURNS TRIGGER LANGUAGE plpgsql AS $$ BEGIN - NEW.community = OLD.community; NEW.software = OLD.software; + NEW.community = OLD.community; return NEW; END $$; diff --git a/database/124-community-views.sql b/database/124-community-views.sql new file mode 100644 index 000000000..51253ca3b --- /dev/null +++ b/database/124-community-views.sql @@ -0,0 +1,50 @@ +-- SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +-- SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) +-- SPDX-FileCopyrightText: 2024 Netherlands eScience Center +-- +-- SPDX-License-Identifier: Apache-2.0 + +-- Software count by community +CREATE FUNCTION software_count_by_community() RETURNS TABLE ( + community UUID, + software_cnt BIGINT +) LANGUAGE sql STABLE AS +$$ +SELECT + community.id, + COUNT(software_for_community.software) AS software_cnt +FROM + community +LEFT JOIN + software_for_community ON community.id = software_for_community.community +GROUP BY + community.id +; +$$; + +-- rpc for community overview page +-- incl. software count +CREATE FUNCTION communities_overview() RETURNS TABLE ( + id UUID, + slug VARCHAR, + name VARCHAR, + short_description VARCHAR, + logo_id VARCHAR, + software_cnt BIGINT, + created_at TIMESTAMPTZ +) LANGUAGE sql STABLE AS +$$ +SELECT + community.id, + community.slug, + community."name", + community.short_description, + community.logo_id, + software_count_by_community.software_cnt, + community.created_at +FROM + community +LEFT JOIN + software_count_by_community() ON community.id = software_count_by_community.community +; +$$; diff --git a/frontend/auth/permissions/isMaintainerOfCommunity.ts b/frontend/auth/permissions/isMaintainerOfCommunity.ts new file mode 100644 index 000000000..a97cdd3da --- /dev/null +++ b/frontend/auth/permissions/isMaintainerOfCommunity.ts @@ -0,0 +1,62 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {RsdRole} from '~/auth/index' +import logger from '~/utils/logger' + +type isCommunityMaintainerProps = { + community: string + role?: RsdRole + account?: string + token?: string +} + +export async function isCommunityMaintainer({community, role, account, token}: isCommunityMaintainerProps) { + // if no account, token, role provided + if ( typeof account == 'undefined' || + typeof token == 'undefined' || + typeof role == 'undefined' + ) { + return false + } + + // if community provided and user role rsd_admin + if (community && role === 'rsd_admin' && account) { + return true + } + + const isMaintainer = await isMaintainerOfCommunity({ + community, + account, + token + }) + + return isMaintainer +} + +export async function isMaintainerOfCommunity({community, account, token}: isCommunityMaintainerProps) { + try { + if ( typeof account == 'undefined' || + typeof token == 'undefined' + ) { + // if no account, token, role provided + return false + } + console.error('isMaintainerOfCommunity...NOT IMPLEMENTED') + // const organisations = await getMaintainerOrganisations({ + // token + // }) + // // debugger + // if (organisations.length > 0) { + // const isMaintainer = organisations.includes(organisation) + // return isMaintainer + // } + return false + } catch (e:any) { + logger(`isMaintainerOfCommunity: ${e?.message}`, 'error') + // ERRORS AS NOT MAINTAINER + return false + } +} diff --git a/frontend/components/AppHeader/DesktopMenu.tsx b/frontend/components/AppHeader/DesktopMenu.tsx new file mode 100644 index 000000000..e67756c1f --- /dev/null +++ b/frontend/components/AppHeader/DesktopMenu.tsx @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {menuItems} from '~/config/menuItems' +import Link from 'next/link' + +import isActiveMenuItem from './isActiveMenuItem' + +export default function DesktopMenu({activePath}:{activePath:string}) { + // console.group('DesktopMenu') + // console.log('activePath...',activePath) + // console.groupEnd() + return ( +
+ {menuItems.map(item => { + const isActive = isActiveMenuItem({item, activePath}) + return ( + + {item.label} + + ) + })} +
+ ) +} diff --git a/frontend/components/AppHeader/ResponsiveMenu.tsx b/frontend/components/AppHeader/ResponsiveMenu.tsx new file mode 100644 index 000000000..33c0e4313 --- /dev/null +++ b/frontend/components/AppHeader/ResponsiveMenu.tsx @@ -0,0 +1,93 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useState, MouseEvent} from 'react' +import Link from 'next/link' +import IconButton from '@mui/material/IconButton' +import Menu from '@mui/material/Menu' +import MenuItem from '@mui/material/MenuItem' +import MenuIcon from '@mui/icons-material/Menu' + +import {menuItems} from '~/config/menuItems' +import useDisableScrollLock from '~/utils/useDisableScrollLock' +import useRsdSettings from '~/config/useRsdSettings' +import FeedbackPanelButton from '~/components/feedback/FeedbackPanelButton' +import isActiveMenuItem from './isActiveMenuItem' + +export default function ResponsiveMenu({activePath}:{activePath:string}) { + const disable = useDisableScrollLock() + const {host} = useRsdSettings() + const [anchorEl, setAnchorEl] = useState(null) + const open = Boolean(anchorEl) + + // console.group('ResponsiveMenu') + // console.log('disable...',disable) + // console.log('open...',open) + // console.groupEnd() + + function handleClickResponsiveMenu(event: MouseEvent){ + setAnchorEl(event.currentTarget) + } + + function handleCloseResponsiveMenu(){ + setAnchorEl(null) + } + + return ( +
+ + + + + {menuItems.map(item => { + const isActive = isActiveMenuItem({item, activePath}) + return ( + + + {item.label} + + + ) + })} + + {/* {host.feedback?.enabled ? + + + + : null + } */} + + +
+ ) +} diff --git a/frontend/components/AppHeader/index.tsx b/frontend/components/AppHeader/index.tsx index 2cd004d80..f6b28f91d 100644 --- a/frontend/components/AppHeader/index.tsx +++ b/frontend/components/AppHeader/index.tsx @@ -6,15 +6,11 @@ // // SPDX-License-Identifier: Apache-2.0 -import {useState, useEffect, MouseEvent} from 'react' -import IconButton from '@mui/material/IconButton' -import Menu from '@mui/material/Menu' -import MenuItem from '@mui/material/MenuItem' -import MenuIcon from '@mui/icons-material/Menu' +import {useState, useEffect} from 'react' import Link from 'next/link' + // local dependencies (project components) import {useAuth} from '~/auth' -import {menuItems} from '~/config/menuItems' import useRsdSettings from '~/config/useRsdSettings' import AddMenu from './AddMenu' import LoginButton from '~/components/login/LoginButton' @@ -23,17 +19,19 @@ import LogoApp from '~/assets/LogoApp.svg' import LogoAppSmall from '~/assets/LogoAppSmall.svg' import GlobalSearchAutocomplete from '~/components/GlobalSearchAutocomplete' import FeedbackPanelButton from '~/components/feedback/FeedbackPanelButton' -import useDisableScrollLock from '~/utils/useDisableScrollLock' -import isActiveMenuItem from './isActiveMenuItem' +import ResponsiveMenu from './ResponsiveMenu' +import DesktopMenu from './DesktopMenu' export default function AppHeader() { - const [activePath, setActivePath] = useState('/') const {session} = useAuth() + const [activePath, setActivePath] = useState('/') const status = session?.status || 'loading' const {host} = useRsdSettings() - const disable = useDisableScrollLock() - // Responsive menu - const [anchorEl, setAnchorEl] = useState(null) + + // console.group('AppHeader') + // console.log('activePath...',activePath) + // console.log('status...',status) + // console.groupEnd() useEffect(() => { // set activePath to currently loaded route/page @@ -42,19 +40,10 @@ export default function AppHeader() { } }, []) - // Responsive menu - const open = Boolean(anchorEl) - const handleClickResponsiveMenu = (event: MouseEvent) => { - setAnchorEl(event.currentTarget) - } - const handleCloseResponsiveMenu = () => { - setAnchorEl(null) - } - return (
{/* keep these styles in sync with main in MainContent.tsx */}
+ {/* Global search for desktop */} {/* Large menu*/} -
- {menuItems.map(item => { - const isActive = isActiveMenuItem({item, activePath}) - return ( - - {item.label} - - ) - })} -
+
- - {/* FEEDBACK panel */}
{host.feedback?.enabled @@ -102,65 +80,16 @@ export default function AppHeader() { : null }
- {/* ADD menu button */} {status === 'authenticated' ? : null} - - {/* Responsive menu */} -
- - - - - {menuItems.map(item => { - const isActive = isActiveMenuItem({item, activePath}) - return ( - - - {item.label} - - - ) - })} -
  • - {host.feedback?.enabled - ? - : null - } -
  • -
    -
    - + {/* LOGIN / USER MENU */}
    + + {/* Global search for tablet & mobile */}
    diff --git a/frontend/components/GlobalSearchAutocomplete/index.tsx b/frontend/components/GlobalSearchAutocomplete/index.tsx index 262ff34cc..20c0b987b 100644 --- a/frontend/components/GlobalSearchAutocomplete/index.tsx +++ b/frontend/components/GlobalSearchAutocomplete/index.tsx @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 - 2023 dv4all +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2024 Christian Meeßen (GFZ) // SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) // SPDX-FileCopyrightText: 2024 Helmholtz Centre Potsdam - GFZ German Research Centre for Geosciences @@ -162,7 +162,7 @@ export default function GlobalSearchAutocomplete(props: Props) { setOpen(false) }}>
    + className={`${props.className} relative flex w-full xl:w-[14.5rem] xl:max-w-[20rem] focus-within:w-full duration-700`}>
    {/* Search Icon */} diff --git a/frontend/components/communities/apiCommunities.ts b/frontend/components/communities/apiCommunities.ts new file mode 100644 index 000000000..8aea86c38 --- /dev/null +++ b/frontend/components/communities/apiCommunities.ts @@ -0,0 +1,141 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {RsdUser} from '~/auth' +import {extractCountFromHeader} from '~/utils/extractCountFromHeader' +import {createJsonHeaders, extractReturnMessage, getBaseUrl} from '~/utils/fetchHelpers' +import logger from '~/utils/logger' +import {paginationUrlParams} from '~/utils/postgrestUrl' + +export type CommunityListProps = { + id: string, + slug: string, + name: string, + short_description: string | null, + logo_id: string | null + software_cnt: number | null +} + +type GetCommunityListParams={ + page: number, + rows: number, + token?: string + searchFor?:string, + orderBy?:string, +} + +export async function getCommunityList({page,rows,token,searchFor,orderBy}:GetCommunityListParams){ + try{ + let query = paginationUrlParams({rows, page}) + if (searchFor) { + // search in name and short description + query+=`&or=(name.ilike.*${searchFor}*,short_description.ilike.*${searchFor}*)` + } + if (orderBy) { + query+=`&order=${orderBy}` + } else { + query+='&order=name.asc' + } + // complete url + const url = `${getBaseUrl()}/rpc/communities_overview?${query}` + + // get community + const resp = await fetch(url, { + method: 'GET', + headers: { + ...createJsonHeaders(token), + // request record count to be returned + // note: it's returned in the header + 'Prefer': 'count=exact' + } + }) + + if ([200,206].includes(resp.status)) { + const communities: CommunityListProps[] = await resp.json() + return { + count: extractCountFromHeader(resp.headers) ?? 0, + communities + } + } + logger(`getCommunityList: ${resp.status}: ${resp.statusText}`,'warn') + return { + count: 0, + communities: [] + } + }catch(e:any){ + logger(`getCommunityList: ${e.message}`,'error') + return { + count: 0, + communities: [] + } + } +} + +type GetCommunityBySlug={ + slug: string|null, + user: RsdUser|null, + token?:string +} + +export async function getCommunityBySlug({slug,user,token}:GetCommunityBySlug){ + try{ + // ignore if no slug + if (slug===null) return null + // filter on slug value + const query = `slug=eq.${slug}` + const url = `${getBaseUrl()}/rpc/communities_overview?${query}` + + // get community + const resp = await fetch(url, { + method: 'GET', + headers: { + ...createJsonHeaders(token), + // request single record + 'Accept': 'application/vnd.pgrst.object+json' + } + }) + + if (resp.status === 200) { + const json:CommunityListProps = await resp.json() + return json + } + // NOT FOUND + logger(`getCommunityBySlug: ${resp.status}:${resp.statusText}`, 'warn') + return null + }catch(e:any){ + logger(`getCommunityBySlug: ${e?.message}`, 'error') + return null + } +} + + +type PatchCommunityProps = { + id: string, + slug?: string, + name?: string, + short_description?: string | null, + logo_id?: string | null + description?: string | null +} + +export async function patchCommunity({data, token}: + { data: PatchCommunityProps, token: string }) { + try { + const url = `/api/v1/community?id=eq.${data.id}` + const resp = await fetch(url, { + method: 'PATCH', + headers: { + ...createJsonHeaders(token) + }, + body: JSON.stringify(data) + }) + return extractReturnMessage(resp) + } catch (e: any) { + return { + status: 500, + message: e?.message + } + } +} diff --git a/frontend/components/communities/metadata/CommunityLogo.tsx b/frontend/components/communities/metadata/CommunityLogo.tsx new file mode 100644 index 000000000..df8c9362f --- /dev/null +++ b/frontend/components/communities/metadata/CommunityLogo.tsx @@ -0,0 +1,140 @@ +// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) +// SPDX-FileCopyrightText: 2022 dv4all +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useEffect, useState} from 'react' + +import {useSession} from '~/auth' +import {deleteImage,getImageUrl,upsertImage} from '~/utils/editImage' +import LogoAvatar from '~/components/layout/LogoAvatar' +import useSnackbar from '~/components/snackbar/useSnackbar' +import OrganisationLogoMenu from '~/components/organisation/metadata/OrganisationLogoMenu' +import {patchCommunity} from '../apiCommunities' +// import OrganisationLogoMenu from './OrganisationLogoMenu' +// import useOrganisationContext from '../context/useOrganisationContext' + +type CommunityLogoProps = { + id: string, + name: string, + logo_id: string | null, + isMaintainer: boolean +} + +export type ImageDataProps = { + data: string, + mime_type: string +} + +export default function CommunityLogo({id,name,logo_id,isMaintainer}:CommunityLogoProps) { + const {token} = useSession() + const {showErrorMessage} = useSnackbar() + // currently shown image + const [logo, setLogo] = useState(logo_id) + + // console.group('CommunityLogo') + // console.log('id...', id) + // console.log('name...', name) + // console.log('logo_id...', logo_id) + // console.log('logo...', logo) + // console.log('isMaintainer...', isMaintainer) + // console.groupEnd() + + // Update logo when new value + // received from parent + // useEffect(() => { + // if (logo_id) setLogo(logo_id) + // },[logo_id]) + + async function addLogo({data, mime_type}: ImageDataProps) { + // split base64 to use only encoded content + const b64data = data.split(',')[1] + const resp = await upsertImage({ + data:b64data, + mime_type, + token + }) + // console.log('addLogo...resp...', resp) + if (resp.status === 201 && id) { + // update logo_id reference + const patch = await patchCommunity({ + data: { + id, + logo_id: resp.message + }, + token + }) + if (patch.status === 200) { + // if we are replacing existing logo + if (logo !== null && resp.message && + logo !== resp.message + ) { + // try to remove old logo from db + // do not await for result + // NOTE! delete MUST be after patching organisation + // because we are removing logo_id reference + deleteImage({ + id: logo, + token + }) + } + setLogo(resp.message) + } else { + showErrorMessage(`Failed to upload logo. ${resp.message}`) + } + } else { + showErrorMessage(`Failed to upload logo. ${resp.message}`) + } + } + + async function removeLogo() { + if (logo && token && id) { + // remove logo_id from organisation + const resp = await patchCommunity({ + data: { + id, + logo_id: null + }, + token + }) + // console.log('removeLogo...',resp) + if (resp.status === 200) { + // delete logo without check + const del = await deleteImage({ + id: logo, + token + }) + setLogo(null) + } else { + showErrorMessage(`Failed to remove logo. ${resp.message}`) + } + } + } + + return ( + <> + + {isMaintainer && + + } + + ) + +} diff --git a/frontend/components/communities/metadata/index.tsx b/frontend/components/communities/metadata/index.tsx new file mode 100644 index 000000000..22fc6df12 --- /dev/null +++ b/frontend/components/communities/metadata/index.tsx @@ -0,0 +1,51 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import BaseSurfaceRounded from '~/components/layout/BaseSurfaceRounded' +import Links, {LinksProps} from '~/components/organisation/metadata/Links' +import CommunityLogo from './CommunityLogo' + +type CommunityMetadataProps={ + id: string, + name: string, + short_description: string | null + logo_id: string | null + isMaintainer: boolean + links: LinksProps[] +} + +export default function CommunityMetadata({ + id,name,short_description, + logo_id,isMaintainer,links +}:CommunityMetadataProps) { + + return ( +
    + + + + +
    +

    + {name} +

    +

    + {short_description} +

    +
    +
    + +
    + +
    + ) +} diff --git a/frontend/components/communities/overview/CommunitiesGrid.tsx b/frontend/components/communities/overview/CommunitiesGrid.tsx new file mode 100644 index 000000000..a26939b28 --- /dev/null +++ b/frontend/components/communities/overview/CommunitiesGrid.tsx @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import NoContent from '~/components/layout/NoContent' +import CommunityCard from './CommunityCard' +import {CommunityListProps} from '../apiCommunities' + + +export default function CommunitiesGrid({items}:{items:CommunityListProps[]}) { + + if (typeof items == 'undefined' || items.length===0){ + return + } + + return ( +
    + {items.map((item) => ( + + ))} +
    + ) +} diff --git a/frontend/components/communities/overview/CommunitiesList.tsx b/frontend/components/communities/overview/CommunitiesList.tsx new file mode 100644 index 000000000..a3d44df3b --- /dev/null +++ b/frontend/components/communities/overview/CommunitiesList.tsx @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {Community} from '~/components/admin/communities/apiCommunities' +import NoContent from '~/components/layout/NoContent' +import {CommunityListProps} from '../apiCommunities' +import CommunityListItem from './CommunityListItem' + + +export default function CommunitiesList({items}:{items:CommunityListProps[]}) { + if (typeof items == 'undefined' || items.length===0){ + return + } + return ( +
    + {items.map((item) => ( + + ))} +
    + ) +} diff --git a/frontend/components/communities/overview/CommunityCard.tsx b/frontend/components/communities/overview/CommunityCard.tsx new file mode 100644 index 000000000..de59308fa --- /dev/null +++ b/frontend/components/communities/overview/CommunityCard.tsx @@ -0,0 +1,63 @@ +// SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) +// SPDX-FileCopyrightText: 2022 - 2023 dv4all +// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) (dv4all) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import Link from 'next/link' +import {getImageUrl} from '~/utils/editImage' +import CardTitleSubtitle from '~/components/cards/CardTitleSubtitle' +import ImageWithPlaceholder from '~/components/layout/ImageWithPlaceholder' +import CardImageFrame from '~/components/cards/CardImageFrame' +import CardContentFrame from '~/components/cards/CardContentFrame' +import OrganisationCardMetrics from '~/components/organisation/overview/card/OrganisationCardMetrics' +import {CommunityListProps} from '../apiCommunities' +// import CountryLabel from './CountryLabel' + +export default function CommunityCard({community}:{community:CommunityListProps}) { + + return ( +
    + +
    + + + + +
    + {/* */} + +
    +
    + {/* Software packages count */} +
    +
    + {community.software_cnt ?? 0} +
    +
    + software
    package{community.software_cnt === 1 ? '' : 's'} +
    +
    +
    +
    +
    + +
    + ) +} diff --git a/frontend/components/communities/overview/CommunityListItem.tsx b/frontend/components/communities/overview/CommunityListItem.tsx new file mode 100644 index 000000000..d251e389c --- /dev/null +++ b/frontend/components/communities/overview/CommunityListItem.tsx @@ -0,0 +1,45 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import Link from 'next/link' + +import ListImageWithGradientPlaceholder from '~/components/projects/overview/list/ListImageWithGradientPlaceholder' +import OverviewListItem from '~/components/software/overview/list/OverviewListItem' +import {getImageUrl} from '~/utils/editImage' +import {CommunityListProps} from '../apiCommunities' + +export default function CommunityListItem({community}:{community:CommunityListProps}) { + + return ( + + + +
    + {/* basic info */} +
    +
    + {community.name} +
    +
    + {community.short_description} +
    +
    + {/* software count */} +
    + {community.software_cnt} software packages +
    +
    + +
    + ) +} diff --git a/frontend/components/communities/tabs/CommunityTabItems.tsx b/frontend/components/communities/tabs/CommunityTabItems.tsx new file mode 100644 index 000000000..9a9ac794f --- /dev/null +++ b/frontend/components/communities/tabs/CommunityTabItems.tsx @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) (dv4all) +// SPDX-FileCopyrightText: 2023 dv4all +// +// SPDX-License-Identifier: Apache-2.0 + +import InfoIcon from '@mui/icons-material/Info' +import TerminalIcon from '@mui/icons-material/Terminal' +import SettingsIcon from '@mui/icons-material/Settings' + +import {OrganisationForOverview} from '~/types/Organisation' + +type IsVisibleProps = Partial & { + isMaintainer: boolean +} + +export type CommunityTabItemProps = { + id: string, + label: (props:any)=>string, + icon: JSX.Element, + isVisible: (props: IsVisibleProps) => boolean +} + +export type TabKey = 'about'|'software'|'settings' +export type CommunityTabProps = { + [key in TabKey]: CommunityTabItemProps +} + +/** + * Community Tab items. Defines tab values. + * NOTE! When changing the tab options also update + * TabContent.tsx file to load proper component. + */ +export const communityTabItems:CommunityTabProps = { + software: { + id:'software', + label:({software_cnt})=>`Software (${software_cnt ?? 0})`, + icon: , + isVisible: (props) => true, + }, + settings:{ + id:'settings', + label:()=>'Settings', + icon: , + // we do not show this option if not a maintainer + isVisible: ({isMaintainer}) => isMaintainer + }, + about: { + id:'about', + label:()=>'About', + icon: , + isVisible: ({description}) => { + // we always show about section to maintainer + // if (isMaintainer === true) return true + // we do not show to visitors if there is no content + if (typeof description === 'undefined') return false + else if (description === null) return false + else if (description.trim()==='') return false + // else the description is present and we show about section + else return true + }, + } +} diff --git a/frontend/components/communities/tabs/index.tsx b/frontend/components/communities/tabs/index.tsx new file mode 100644 index 000000000..f8dad7c73 --- /dev/null +++ b/frontend/components/communities/tabs/index.tsx @@ -0,0 +1,66 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import Tab from '@mui/material/Tab' +import Tabs from '@mui/material/Tabs' +import {useRouter} from 'next/router' +import {TabKey, communityTabItems} from './CommunityTabItems' + +// extract tab items (object keys) +const tabItems = Object.keys(communityTabItems) as TabKey[] + +type CommunityTabsProps={ + tab:TabKey + software_cnt: number + description: string | null + isMaintainer: boolean +} + +export default function CommunityTabs({ + tab,software_cnt,description, + isMaintainer}:CommunityTabsProps) { + + const router = useRouter() + // default tab is software + // let select_tab:TabKey = 'software' + + return ( + { + const query:any={ + slug: router.query['slug'], + tab: value, + } + // add default order for software and project tabs + if (value === 'software') { + query['order'] = 'is_featured' + } + // push route change + router.push({query},undefined,{scroll:false}) + }} + aria-label="community tabs" + > + {tabItems.map(key => { + const item = communityTabItems[key] + if (item.isVisible({ + isMaintainer, + software_cnt, + description + }) === true) { + return + }})} + + ) +} diff --git a/frontend/components/organisation/OrganisationBreadcrumbs.tsx b/frontend/components/layout/PageBreadcrumbs.tsx similarity index 61% rename from frontend/components/organisation/OrganisationBreadcrumbs.tsx rename to frontend/components/layout/PageBreadcrumbs.tsx index 1c0b68dd1..25ad3a33c 100644 --- a/frontend/components/organisation/OrganisationBreadcrumbs.tsx +++ b/frontend/components/layout/PageBreadcrumbs.tsx @@ -1,17 +1,22 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 -import Breadcrumbs, {SlugInfo} from '../layout/Breadcrumbs' +import Breadcrumbs, {SlugInfo} from './Breadcrumbs' -export default function OrganisationBreadcrumbs({slug}:{slug:string[]}) { +type PageBreadcrumbsProps={ + root: SlugInfo + slug: string[] +} + +export default function PageBreadcrumbs({root,slug}:PageBreadcrumbsProps) { function createSegments(slug: string[]) { + // debugger const segments:SlugInfo[] = [{ - label: 'organisations', - path:'/organisations' + ...root }] - let path='/organisations' + let path=root.path slug.forEach((item, pos) => { if (pos === slug.length - 1) { // last segment is current page diff --git a/frontend/components/news/overview/useNewsOverviewParams.tsx b/frontend/components/news/overview/useNewsOverviewParams.tsx deleted file mode 100644 index bfa27532d..000000000 --- a/frontend/components/news/overview/useNewsOverviewParams.tsx +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import {useRouter} from 'next/router' - -import {rowsPerPageOptions} from '~/config/pagination' -import {ssrOrganisationParams} from '~/utils/extractQueryParam' -import {QueryParams, buildFilterUrl} from '~/utils/postgrestUrl' -import {getDocumentCookie} from '~/utils/userSettings' - - -export default function useNewsOverviewParams() { - const router = useRouter() - - function handleQueryChange(key: string, value: string | string[]) { - const params: QueryParams = { - // take existing params from url (query) - ...ssrOrganisationParams(router.query), - [key]: value, - } - // on each param change we reset page - if (key !== 'page') { - params['page'] = 1 - } - if (typeof params['rows'] === 'undefined' || params['rows'] === null) { - // extract from cookie or use default - params['rows'] = getDocumentCookie('rsd_page_rows', rowsPerPageOptions[0]) - } - // construct url with all query params - const url = buildFilterUrl(params,'news') - if (key === 'page') { - // when changin page we scroll to top - router.push(url, url, {scroll: true}) - } else { - // update page url but keep scroll position - router.push(url, url, {scroll: false}) - } - } - - function resetFilters() { - // remove params from url and keep scroll position - router.push(router.pathname, router.pathname, {scroll: false}) - } - - return { - handleQueryChange, - resetFilters - } -} diff --git a/frontend/components/organisation/overview/useOrganisationOverviewParams.test.tsx b/frontend/components/search/useSearchParams.test.tsx similarity index 52% rename from frontend/components/organisation/overview/useOrganisationOverviewParams.test.tsx rename to frontend/components/search/useSearchParams.test.tsx index 6d53988f5..e41714a13 100644 --- a/frontend/components/organisation/overview/useOrganisationOverviewParams.test.tsx +++ b/frontend/components/search/useSearchParams.test.tsx @@ -1,9 +1,9 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 -import useOrganisationOverviewParams from './useOrganisationOverviewParams' +import useSearchParams from './useSearchParams' // mock next router const mockBack = jest.fn() @@ -30,7 +30,7 @@ beforeEach(() => { it('handlesQueryChange with search param', () => { // extract function - const {handleQueryChange} = useOrganisationOverviewParams() + const {handleQueryChange} = useSearchParams('organisations') // call it with random param handleQueryChange('search', 'test-value') @@ -45,7 +45,7 @@ it('handlesQueryChange with search param', () => { it('handlesQueryChange for pagination', () => { // extract function - const {handleQueryChange} = useOrganisationOverviewParams() + const {handleQueryChange} = useSearchParams('organisations') // call it with random param handleQueryChange('page', '2') @@ -62,7 +62,7 @@ it('handlesQueryChange for pagination', () => { it('resetFilters calls push without any params', () => { // extract function - const {resetFilters} = useOrganisationOverviewParams() + const {resetFilters} = useSearchParams('organisations') // call it with random param resetFilters() @@ -74,3 +74,33 @@ it('resetFilters calls push without any params', () => { {'scroll': false} ) }) + +it ('handlesQueryChange supports communities overview',()=>{ + // extract function + const {handleQueryChange} = useSearchParams('communities') + + // call it with random param + handleQueryChange('search', 'test-value') + + expect(mockPush).toBeCalledTimes(1) + expect(mockPush).toBeCalledWith( + '/communities?search=test-value&page=1&rows=12', + '/communities?search=test-value&page=1&rows=12', + {'scroll': false} + ) +}) + +it ('handlesQueryChange supports news overview',()=>{ + // extract function + const {handleQueryChange} = useSearchParams('news') + + // call it with random param + handleQueryChange('search', 'test-value') + + expect(mockPush).toBeCalledTimes(1) + expect(mockPush).toBeCalledWith( + '/news?search=test-value&page=1&rows=12', + '/news?search=test-value&page=1&rows=12', + {'scroll': false} + ) +}) diff --git a/frontend/components/organisation/overview/useOrganisationOverviewParams.tsx b/frontend/components/search/useSearchParams.tsx similarity index 60% rename from frontend/components/organisation/overview/useOrganisationOverviewParams.tsx rename to frontend/components/search/useSearchParams.tsx index 3a8c527be..51982a990 100644 --- a/frontend/components/organisation/overview/useOrganisationOverviewParams.tsx +++ b/frontend/components/search/useSearchParams.tsx @@ -1,26 +1,32 @@ -// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 dv4all -// SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 import {useRouter} from 'next/router' import {rowsPerPageOptions} from '~/config/pagination' -import {ssrOrganisationParams} from '~/utils/extractQueryParam' -import {QueryParams, ssrOrganisationUrl} from '~/utils/postgrestUrl' +import {ssrBasicParams} from '~/utils/extractQueryParam' +import {QueryParams,buildFilterUrl} from '~/utils/postgrestUrl' import {getDocumentCookie} from '~/utils/userSettings' +type RsdViews='organisations'|'communities'|'news' -export default function useOrganisationOverviewParams() { +/** + * Hook to extract basic query parameters rows, page and search from the url. + * This hook is used by organisation, news and communities overview. + * @param view the route of the overview page (organisations | communities | news) + * @returns handleQueryChange and resetFilters methods. + */ +export default function useBasicQueryParams(view:RsdViews){ const router = useRouter() function createUrl(key: string, value: string | string[]) { const params: QueryParams = { // take existing params from url (query) - ...ssrOrganisationParams(router.query), + // basic params are search, page and rows + ...ssrBasicParams(router.query), + // overwrite with new value [key]: value, } // on each param change we reset page @@ -32,14 +38,14 @@ export default function useOrganisationOverviewParams() { params['rows'] = getDocumentCookie('rsd_page_rows', rowsPerPageOptions[0]) } // construct url with all query params - const url = ssrOrganisationUrl(params) + const url = buildFilterUrl(params,view) return url } function handleQueryChange(key: string, value: string | string[]) { const url = createUrl(key, value) if (key === 'page') { - // when changin page we scroll to top + // when changing page we scroll to top router.push(url, url, {scroll: true}) } else { // update page url but keep scroll position diff --git a/frontend/components/software/edit/editSoftwareConfig.tsx b/frontend/components/software/edit/editSoftwareConfig.tsx index d288ecec0..5c444b220 100644 --- a/frontend/components/software/edit/editSoftwareConfig.tsx +++ b/frontend/components/software/edit/editSoftwareConfig.tsx @@ -169,7 +169,7 @@ export type ContributorInformationConfig = typeof contributorInformation export const organisationInformation = { title: 'Participating organisations', - modalTile: 'Organisation', + modalTitle: 'Organisation', findOrganisation: { title: 'Add organisation', subtitle: 'We search by name in the RSD and the ROR databases', diff --git a/frontend/components/software/edit/organisations/EditOrganisationModal.tsx b/frontend/components/software/edit/organisations/EditOrganisationModal.tsx index 9f6066535..a66e98caa 100644 --- a/frontend/components/software/edit/organisations/EditOrganisationModal.tsx +++ b/frontend/components/software/edit/organisations/EditOrganisationModal.tsx @@ -97,7 +97,7 @@ export default function EditOrganisationModal({open, onCancel, onSubmit, organis color: 'primary.main', fontWeight: 500 }}> - {config.modalTile} + {config.modalTitle} Software community page - settings + ) +} diff --git a/frontend/pages/communities/[slug]/software.tsx b/frontend/pages/communities/[slug]/software.tsx new file mode 100644 index 000000000..156e15de1 --- /dev/null +++ b/frontend/pages/communities/[slug]/software.tsx @@ -0,0 +1,155 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {GetServerSidePropsContext} from 'next' + +import {app} from '~/config/app' +import {getUserFromToken} from '~/auth' +import {getUserSettings} from '~/utils/userSettings' +import {CommunityListProps, getCommunityBySlug} from '~/components/communities/apiCommunities' +import {LayoutType} from '~/components/software/overview/search/ViewToggleGroup' +import PageMeta from '~/components/seo/PageMeta' +import CanonicalUrl from '~/components/seo/CanonicalUrl' +import BackgroundAndLayout from '~/components/layout/BackgroundAndLayout' +import {UserSettingsProvider} from '~/components/organisation/context/UserSettingsContext' +import PageBreadcrumbs from '~/components/layout/PageBreadcrumbs' +import BaseSurfaceRounded from '~/components/layout/BaseSurfaceRounded' +import CommunityMetadata from '~/components/communities/metadata' +import CommunityTabs from '~/components/communities/tabs' +import {isCommunityMaintainer} from '~/auth/permissions/isMaintainerOfCommunity' + +type CommunitySoftwareProps={ + community: CommunityListProps, + slug: string[], + isMaintainer: boolean, + rsd_page_rows: number, + rsd_page_layout: LayoutType +} + +export default function CommunitySoftwarePage({ + community,slug,isMaintainer, + rsd_page_rows, rsd_page_layout +}:CommunitySoftwareProps) { + + console.group('CommunitySoftwarePage') + console.log('community...', community) + console.log('slug....', slug) + console.log('isMaintainer....', isMaintainer) + console.log('rsd_page_rows....', rsd_page_rows) + console.log('rsd_page_layout....', rsd_page_layout) + console.groupEnd() + + + function getMetaDescription() { + // use organisation (short) description if available + if (community.short_description) return community.short_description + // else generate description message + return `${community?.name ?? 'The RSD community'} with ${community.software_cnt ?? 0} software packages.` + } + + return ( + <> + {/* Page Head meta tags */} + + + + + {/* COMMUNITY HEADER */} + + + + {/* TABS */} + + + + {/* TAB CONTENT */} +
    + {/* */} +

    Community software - TO DO!

    +
    +
    +
    + + ) +} + + +// fetching data server side +// see documentation https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering +export async function getServerSideProps(context:GetServerSidePropsContext) { + try{ + const {params, req, query} = context + // extract user settings from cookie + const {rsd_page_layout, rsd_page_rows} = getUserSettings(req) + // extract user id from session + const token = req?.cookies['rsd_token'] + const user = getUserFromToken(token) + // find community by slug + const community = await getCommunityBySlug({ + slug: params?.slug?.toString() ?? null, + token: req?.cookies['rsd_token'], + user + }) + // console.log('community...', community) + if (community === null){ + // returning notFound triggers 404 page + return { + notFound: true, + } + } + // get info if the user is maintainer + const isMaintainer = await isCommunityMaintainer({ + community: community.id, + role: user?.role, + account: user?.account, + token + }) + + return { + // passed to the page component as props + props: { + community, + slug: [params?.slug], + tab: query?.tab ?? null, + isMaintainer, + rsd_page_layout, + rsd_page_rows + }, + } + }catch(e){ + return { + notFound: true, + } + } +} diff --git a/frontend/pages/communities/index.tsx b/frontend/pages/communities/index.tsx new file mode 100644 index 000000000..9ff8b9c9b --- /dev/null +++ b/frontend/pages/communities/index.tsx @@ -0,0 +1,176 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useState} from 'react' +import {GetServerSidePropsContext} from 'next/types' +import Pagination from '@mui/material/Pagination' +import PaginationItem from '@mui/material/PaginationItem' + +import {app} from '~/config/app' +import {getUserSettings, setDocumentCookie} from '~/utils/userSettings' +import {ssrBasicParams} from '~/utils/extractQueryParam' +import PageMeta from '~/components/seo/PageMeta' +import PageBackground from '~/components/layout/PageBackground' +import AppHeader from '~/components/AppHeader' +import MainContent from '~/components/layout/MainContent' +import AppFooter from '~/components/AppFooter' +import SearchInput from '~/components/search/SearchInput' +import useSearchParams from '~/components/search/useSearchParams' +import SelectRows from '~/components/software/overview/search/SelectRows' +import {LayoutType} from '~/components/software/overview/search/ViewToggleGroup' +import ViewToggleGroup,{ProjectLayoutType} from '~/components/projects/overview/search/ViewToggleGroup' + +import {Community} from '~/components/admin/communities/apiCommunities' +import CommunitiesList from '~/components/communities/overview/CommunitiesList' +import CommunitiesGrid from '~/components/communities/overview/CommunitiesGrid' +import {CommunityListProps, getCommunityList} from '~/components/communities/apiCommunities' + +const pageTitle = `Communities | ${app.title}` +const pageDesc = 'List of RSD communities.' + +type CommunitiesOverviewProps={ + count: number, + page: number, + rows: number, + layout: LayoutType, + search?: string, + communities: CommunityListProps[] +} + + +export default function CommunitiesOverview({count,page,rows,layout,search,communities}:CommunitiesOverviewProps) { + const {handleQueryChange,createUrl} = useSearchParams('communities') + const initView = layout === 'masonry' ? 'grid' : layout + const [view, setView] = useState(initView) + const numPages = Math.ceil(count / rows) + + // console.group('CommunitiesOverview') + // console.log('count...', count) + // console.log('page...', page) + // console.log('rows...', rows) + // console.log('layout...', layout) + // console.log('view...', view) + // console.log('search...', search) + // console.log('communities...', communities) + // console.groupEnd() + + function setLayout(view: ProjectLayoutType) { + // update local view + setView(view) + // save to cookie + setDocumentCookie(view,'rsd_page_layout') + } + + return ( + <> + {/* Page Head meta tags */} + + + + + + + {/* Page title with search and pagination */} +
    +

    + Communities +

    +
    + handleQueryChange('search', search)} + defaultValue={search ?? ''} + /> + + +
    +
    + + {/* news cards, grid is default */} + {view === 'list' ? + + : + + } + + {/* Pagination */} + {numPages > 1 && +
    + { + if (item.page !== null) { + return ( + + + + ) + } else { + return ( + + ) + } + }} + /> +
    + } +
    + + {/* App footer */} + +
    + + ) +} + +// see documentation https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering +export async function getServerSideProps(context:GetServerSidePropsContext) { + try{ + const {req} = context + const {search, rows, page} = ssrBasicParams(context.query) + const token = req?.cookies['rsd_token'] + + // extract user settings from cookie + const {rsd_page_layout,rsd_page_rows} = getUserSettings(context.req) + // use url param if present else user settings + let page_rows = rows ?? rsd_page_rows + + // get news items list to all pages server side + const {count,communities} = await getCommunityList({ + // api uses 0 based index + page: page>0 ? page-1 : 0, + rows: page_rows, + searchFor: search, + orderBy: 'software_cnt.desc,name.asc', + token + }) + + return { + // passed to the page component as props + props: { + search, + count, + page, + rows: page_rows, + layout: rsd_page_layout, + communities, + }, + } + }catch(e){ + return { + notFound: true, + } + } +} diff --git a/frontend/pages/news/index.tsx b/frontend/pages/news/index.tsx index 7390a273e..0a18f4833 100644 --- a/frontend/pages/news/index.tsx +++ b/frontend/pages/news/index.tsx @@ -6,9 +6,10 @@ import {useState} from 'react' import {GetServerSidePropsContext} from 'next/types' import Pagination from '@mui/material/Pagination' +import PaginationItem from '@mui/material/PaginationItem' import {app} from '~/config/app' -import {ssrOrganisationParams} from '~/utils/extractQueryParam' +import {ssrBasicParams} from '~/utils/extractQueryParam' import {getUserSettings, setDocumentCookie} from '~/utils/userSettings' import PageMeta from '~/components/seo/PageMeta' import PageBackground from '~/components/layout/PageBackground' @@ -16,11 +17,11 @@ import AppHeader from '~/components/AppHeader' import MainContent from '~/components/layout/MainContent' import AppFooter from '~/components/AppFooter' import SearchInput from '~/components/search/SearchInput' +import useSearchParams from '~/components/search/useSearchParams' import SelectRows from '~/components/software/overview/search/SelectRows' import {LayoutType} from '~/components/software/overview/search/ViewToggleGroup' import ViewToggleGroup,{ProjectLayoutType} from '~/components/projects/overview/search/ViewToggleGroup' import NewsGrid from '~/components/news/overview/NewsGrid' -import useNewsOverviewParams from '~/components/news/overview/useNewsOverviewParams' import {NewsListItem, getNewsList} from '~/components/news/apiNews' import NewsList from '~/components/news/overview/list' @@ -37,7 +38,7 @@ type NewsOverviewProps={ } export default function NewsOverview({count,page,rows,layout,search,news}:NewsOverviewProps) { - const {handleQueryChange} = useNewsOverviewParams() + const {handleQueryChange,createUrl} = useSearchParams('news') const initView = layout === 'masonry' ? 'grid' : layout const [view, setView] = useState(initView) const numPages = Math.ceil(count / rows) @@ -106,8 +107,18 @@ export default function NewsOverview({count,page,rows,layout,search,news}:NewsOv { - handleQueryChange('page',page.toString()) + renderItem={item => { + if (item.page !== null) { + return ( + + + + ) + } else { + return ( + + ) + } }} />
    @@ -126,7 +137,7 @@ export default function NewsOverview({count,page,rows,layout,search,news}:NewsOv export async function getServerSideProps(context:GetServerSidePropsContext) { try{ const {req} = context - const {search, rows, page} = ssrOrganisationParams(context.query) + const {search, rows, page} = ssrBasicParams(context.query) const token = req?.cookies['rsd_token'] // extract user settings from cookie diff --git a/frontend/pages/organisations/[...slug].tsx b/frontend/pages/organisations/[...slug].tsx index 1363940a7..8c18bac75 100644 --- a/frontend/pages/organisations/[...slug].tsx +++ b/frontend/pages/organisations/[...slug].tsx @@ -1,8 +1,9 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 - 2023 dv4all // SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 @@ -18,7 +19,7 @@ import OrganisationMetadata from '~/components/organisation/metadata' import PageMeta from '~/components/seo/PageMeta' import BackgroundAndLayout from '~/components/layout/BackgroundAndLayout' import CanonicalUrl from '~/components/seo/CanonicalUrl' -import OrganisationBreadcrumbs from '~/components/organisation/OrganisationBreadcrumbs' +import PageBreadcrumbs from '~/components/layout/PageBreadcrumbs' import BaseSurfaceRounded from '~/components/layout/BaseSurfaceRounded' import OrganisationTabs from '~/components/organisation/tabs/OrganisationTabs' import TabContent from '~/components/organisation/tabs/TabContent' @@ -81,7 +82,13 @@ export default function OrganisationPage({ isMaintainer={isMaintainer} > {/* ORGANISATION HEADER */} - + {/* TABS */} diff --git a/frontend/pages/organisations/index.tsx b/frontend/pages/organisations/index.tsx index 8509328f4..349a09885 100644 --- a/frontend/pages/organisations/index.tsx +++ b/frontend/pages/organisations/index.tsx @@ -1,30 +1,30 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 - 2023 dv4all +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) // // SPDX-License-Identifier: Apache-2.0 import {MouseEvent, ChangeEvent} from 'react' import {GetServerSidePropsContext} from 'next/types' +import Link from 'next/link' import TablePagination from '@mui/material/TablePagination' import Pagination from '@mui/material/Pagination' -import Link from 'next/link' import PaginationItem from '@mui/material/PaginationItem' -import {app} from '../../config/app' -import PageTitle from '../../components/layout/PageTitle' -import Searchbox from '../../components/form/Searchbox' -import {OrganisationList} from '../../types/Organisation' -import {rowsPerPageOptions} from '../../config/pagination' -import {ssrOrganisationParams} from '../../utils/extractQueryParam' -import {getOrganisationsList} from '../../components/organisation/apiOrganisations' +import {app} from '~/config/app' +import PageTitle from '~/components/layout/PageTitle' +import Searchbox from '~/components/form/Searchbox' +import {OrganisationList} from '~/types/Organisation' +import {rowsPerPageOptions} from '~/config/pagination' +import {ssrBasicParams} from '~/utils/extractQueryParam' +import {getOrganisationsList} from '~/components/organisation/apiOrganisations' import PageMeta from '~/components/seo/PageMeta' import AppFooter from '~/components/AppFooter' import AppHeader from '~/components/AppHeader' import {getUserSettings, setDocumentCookie} from '~/utils/userSettings' -import useOrganisationOverviewParams from '~/components/organisation/overview/useOrganisationOverviewParams' +import useSearchParams from '~/components/search/useSearchParams' import OrganisationGrid from '~/components/organisation/overview/OrganisationGrid' import PageBackground from '~/components/layout/PageBackground' import CanonicalUrl from '~/components/seo/CanonicalUrl' @@ -44,7 +44,7 @@ const pageDesc = 'List of organizations involved in the development of research export default function OrganisationsOverviewPage({ organisations = [], count, page, rows, search }: OrganisationsOverviewPageProps) { - const {handleQueryChange, createUrl} = useOrganisationOverviewParams() + const {handleQueryChange,createUrl} = useSearchParams('organisations') const numPages = Math.ceil(count / rows) // console.group('OrganisationsOverviewPage') @@ -158,7 +158,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { // extract params from page-query // extract rsd_token const {req} = context - const {search, rows, page} = ssrOrganisationParams(context.query) + const {search, rows, page} = ssrBasicParams(context.query) const token = req?.cookies['rsd_token'] // extract user settings from cookie const {rsd_page_rows} = getUserSettings(context.req) diff --git a/frontend/public/data/settings.json b/frontend/public/data/settings.json index 36bef97cf..8af3b0939 100644 --- a/frontend/public/data/settings.json +++ b/frontend/public/data/settings.json @@ -39,6 +39,16 @@ "label": "Netherlands eScienceCenter", "url": "https://www.esciencecenter.nl/", "target": "_blank" + }, + { + "label": "Communities", + "url": "/communities", + "target": "_self" + }, + { + "label": "News", + "url": "/news", + "target": "_self" } ], "theme": { diff --git a/frontend/utils/extractQueryParam.test.ts b/frontend/utils/extractQueryParam.test.ts index 387cb61b2..098b49647 100644 --- a/frontend/utils/extractQueryParam.test.ts +++ b/frontend/utils/extractQueryParam.test.ts @@ -1,14 +1,14 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 - 2023 dv4all -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 import {ParsedUrlQuery} from 'node:querystring' import { decodeQueryParam, ssrSoftwareParams, - ssrProjectsParams, ssrOrganisationParams + ssrProjectsParams, ssrBasicParams } from './extractQueryParam' @@ -129,7 +129,7 @@ it('extracts ssrProjectsParams from url query', () => { expect(params).toEqual(expected) }) -it('extracts ssrOrganisationParams from url query', () => { +it('extracts ssrBasicParams from url query', () => { const query: ParsedUrlQuery = { 'search': 'another search', 'page': '3', @@ -140,7 +140,7 @@ it('extracts ssrOrganisationParams from url query', () => { page: 3, rows: 48 } - const params = ssrOrganisationParams(query) + const params = ssrBasicParams(query) expect(params).toEqual(expected) }) diff --git a/frontend/utils/extractQueryParam.ts b/frontend/utils/extractQueryParam.ts index 86c1cd192..40753bb0a 100644 --- a/frontend/utils/extractQueryParam.ts +++ b/frontend/utils/extractQueryParam.ts @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2021 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2021 - 2023 dv4all -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 @@ -256,7 +256,13 @@ export function ssrProjectsParams(query: ParsedUrlQuery) { } } -export function ssrOrganisationParams(query: ParsedUrlQuery) { +/** + * Extract basic query parameters search, page and rows. + * Used by organisation, news and communities overview pages. + * @param query + * @returns + */ +export function ssrBasicParams(query: ParsedUrlQuery) { const rows = decodeQueryParam({ query, param: 'rows', From cd6d9731472c813072c217e109415962904ee635 Mon Sep 17 00:00:00 2001 From: Dusan Mijatovic Date: Thu, 16 May 2024 15:46:46 +0200 Subject: [PATCH 3/9] feat: implement community settings page (#1195) feat: implement community settings page chore: refactor maintainers sections fix: do not show highlights section when javascript is disabled chore: add row level security for communities and improve database functions feat: add community keywords (#1199) feat: add community keywords chore: improve SQL and add keywords for communities to data generation --------- Co-authored-by: Ewan Cahen --------- Co-authored-by: Ewan Cahen --- data-generation/main.js | 1 + database/024-community.sql | 308 +++++++++++++++--- database/124-community-views.sql | 81 ++++- frontend/auth/api/authHelpers.ts | 46 ++- .../permissions/isMaintainerOfCommunity.ts | 47 ++- frontend/components/AppHeader/DesktopMenu.tsx | 2 +- frontend/components/AppHeader/index.tsx | 10 +- .../components/communities/CommunityPage.tsx | 74 +++++ .../communities/__mocks__/mockCommunity.ts | 22 ++ .../about/CommunityAboutIndex.test.tsx | 21 ++ .../components/communities/about/index.tsx | 27 ++ .../components/communities/apiCommunities.ts | 42 ++- .../components/communities/context/index.tsx | 69 ++++ .../communities/metadata/CommunityLogo.tsx | 26 +- .../components/communities/metadata/index.tsx | 57 ++-- .../communities/overview/CommunityCard.tsx | 41 ++- .../overview/CommunityListItem.tsx | 8 +- .../communities/overview/CommunityMetrics.tsx | 32 ++ .../communities/settings/SettingsContent.tsx | 26 ++ .../communities/settings/SettingsNav.tsx | 54 +++ .../communities/settings/SettingsNavItems.tsx | 36 ++ .../AutosaveCommunityDescription.tsx | 80 +++++ .../communities/settings/about-page/config.ts | 17 + .../communities/settings/about-page/index.tsx | 58 ++++ .../general/AutosaveCommunityKeywords.tsx | 174 ++++++++++ .../general/AutosaveCommunityTextField.tsx | 71 ++++ .../general/CommunityAdminSection.tsx | 49 +++ .../settings/general/apiCommunityKeywords.ts | 90 +++++ .../communities/settings/general/config.ts | 55 ++++ .../communities/settings/general/index.tsx | 89 +++++ .../general/searchForCommunityKeyword.test.ts | 27 ++ .../general/searchForCommunityKeyword.ts | 42 +++ .../components/communities/settings/index.tsx | 34 ++ .../CommunityMaintainersIndex.test.tsx | 243 ++++++++++++++ .../maintainers/CommunityMaintainersLinks.tsx | 47 +++ .../maintainers/apiCommunityMaintainers.ts | 102 ++++++ .../settings/maintainers/index.tsx | 99 ++++++ .../maintainers/useCommunityInvitations.tsx | 81 +++++ .../maintainers/useCommunityMaintainers.tsx | 67 ++++ .../communities/tabs/CommunityTabItems.tsx | 6 +- .../components/communities/tabs/index.tsx | 22 +- .../feedback/FeedbackPanelButton.test.tsx | 29 +- .../feedback/FeedbackPanelButton.tsx | 21 +- frontend/components/layout/InvitationList.tsx | 5 +- .../components/layout/ProtectedContent.tsx | 58 ++++ .../components/maintainers/InvitationList.tsx | 98 ++++++ .../MaintainerItem.tsx} | 13 +- .../maintainers/MaintainersList.tsx | 52 +++ .../components/maintainers/apiMaintainers.ts | 122 +++++++ .../ProtectedOrganisationPage.tsx | 39 --- .../components/organisation/about/index.tsx | 10 +- .../context/OrganisationContext.tsx | 6 +- .../organisation/settings/SettingsNav.tsx | 2 +- .../general/AutosaveOrganisationTextField.tsx | 6 +- .../organisation/settings/index.tsx | 11 +- .../OrganisationMaintainerLink.tsx | 115 ------- .../OrganisationMaintainerLinks.tsx | 50 +++ .../OrganisationMaintainersIndex.test.tsx | 198 +++++------ .../OrganisationMaintainersList.tsx | 61 ---- ....ts => apiOrganisationMaintainers.test.ts} | 6 +- .../maintainers/apiOrganisationMaintainers.ts | 95 ++++++ .../getMaintainersOfOrganisation.ts | 38 --- .../settings/maintainers/index.tsx | 85 ++--- .../useOrganisationInvitations.tsx | 81 +++++ .../useOrganisationMaintainers.tsx | 176 ++-------- .../EditProjectMaintainersIndex.test.tsx | 118 ++++++- .../maintainers/ProjectMaintainerLink.tsx | 106 ------ .../maintainers/ProjectMaintainerLinks.tsx | 49 +++ .../maintainers/ProjectMaintainersList.tsx | 70 ---- .../edit/maintainers/apiProjectMaintainers.ts | 54 +++ .../projects/edit/maintainers/index.tsx | 85 ++--- .../maintainers/useProjectInvitations.tsx | 81 +++++ .../edit/maintainers/useProjectMaintainer.tsx | 156 --------- .../maintainers/useProjectMaintainers.tsx | 79 +++++ .../EditSoftwareMaintainersIndex.test.tsx | 117 ++++++- .../maintainers/SoftwareMaintainerLink.tsx | 107 ------ .../maintainers/SoftwareMaintainerLinks.tsx | 46 +++ .../maintainers/apiSoftwareMaintainers.ts | 94 ++++++ .../software/edit/maintainers/index.tsx | 80 +---- .../maintainers/useSoftwareInvitations.tsx | 78 +++++ .../maintainers/useSoftwareMaintainers.tsx | 203 +++--------- .../software/overview/SoftwareHighlights.tsx | 8 +- frontend/next.config.js | 17 +- frontend/pages/communities/[slug]/about.tsx | 126 +++++++ .../pages/communities/[slug]/settings.tsx | 121 ++++++- .../pages/communities/[slug]/software.tsx | 101 ++---- frontend/pages/communities/index.tsx | 6 +- frontend/pages/invite/community/[id].tsx | 123 +++++++ frontend/pages/invite/organisation/[id].tsx | 4 +- frontend/pages/organisations/[...slug].tsx | 5 +- frontend/styles/custom.css | 13 +- frontend/styles/global.css | 6 +- frontend/utils/jest/WithCommunityContext.tsx | 22 ++ frontend/utils/useDisableScrollLock.tsx | 4 +- 94 files changed, 4329 insertions(+), 1610 deletions(-) create mode 100644 frontend/components/communities/CommunityPage.tsx create mode 100644 frontend/components/communities/__mocks__/mockCommunity.ts create mode 100644 frontend/components/communities/about/CommunityAboutIndex.test.tsx create mode 100644 frontend/components/communities/about/index.tsx create mode 100644 frontend/components/communities/context/index.tsx create mode 100644 frontend/components/communities/overview/CommunityMetrics.tsx create mode 100644 frontend/components/communities/settings/SettingsContent.tsx create mode 100644 frontend/components/communities/settings/SettingsNav.tsx create mode 100644 frontend/components/communities/settings/SettingsNavItems.tsx create mode 100644 frontend/components/communities/settings/about-page/AutosaveCommunityDescription.tsx create mode 100644 frontend/components/communities/settings/about-page/config.ts create mode 100644 frontend/components/communities/settings/about-page/index.tsx create mode 100644 frontend/components/communities/settings/general/AutosaveCommunityKeywords.tsx create mode 100644 frontend/components/communities/settings/general/AutosaveCommunityTextField.tsx create mode 100644 frontend/components/communities/settings/general/CommunityAdminSection.tsx create mode 100644 frontend/components/communities/settings/general/apiCommunityKeywords.ts create mode 100644 frontend/components/communities/settings/general/config.ts create mode 100644 frontend/components/communities/settings/general/index.tsx create mode 100644 frontend/components/communities/settings/general/searchForCommunityKeyword.test.ts create mode 100644 frontend/components/communities/settings/general/searchForCommunityKeyword.ts create mode 100644 frontend/components/communities/settings/index.tsx create mode 100644 frontend/components/communities/settings/maintainers/CommunityMaintainersIndex.test.tsx create mode 100644 frontend/components/communities/settings/maintainers/CommunityMaintainersLinks.tsx create mode 100644 frontend/components/communities/settings/maintainers/apiCommunityMaintainers.ts create mode 100644 frontend/components/communities/settings/maintainers/index.tsx create mode 100644 frontend/components/communities/settings/maintainers/useCommunityInvitations.tsx create mode 100644 frontend/components/communities/settings/maintainers/useCommunityMaintainers.tsx create mode 100644 frontend/components/layout/ProtectedContent.tsx create mode 100644 frontend/components/maintainers/InvitationList.tsx rename frontend/components/{projects/edit/maintainers/ProjectMaintainer.tsx => maintainers/MaintainerItem.tsx} (81%) create mode 100644 frontend/components/maintainers/MaintainersList.tsx create mode 100644 frontend/components/maintainers/apiMaintainers.ts delete mode 100644 frontend/components/organisation/ProtectedOrganisationPage.tsx delete mode 100644 frontend/components/organisation/settings/maintainers/OrganisationMaintainerLink.tsx create mode 100644 frontend/components/organisation/settings/maintainers/OrganisationMaintainerLinks.tsx delete mode 100644 frontend/components/organisation/settings/maintainers/OrganisationMaintainersList.tsx rename frontend/components/organisation/settings/maintainers/{getMaintainersOfOrganisation.test.ts => apiOrganisationMaintainers.test.ts} (85%) create mode 100644 frontend/components/organisation/settings/maintainers/apiOrganisationMaintainers.ts delete mode 100644 frontend/components/organisation/settings/maintainers/getMaintainersOfOrganisation.ts create mode 100644 frontend/components/organisation/settings/maintainers/useOrganisationInvitations.tsx delete mode 100644 frontend/components/projects/edit/maintainers/ProjectMaintainerLink.tsx create mode 100644 frontend/components/projects/edit/maintainers/ProjectMaintainerLinks.tsx delete mode 100644 frontend/components/projects/edit/maintainers/ProjectMaintainersList.tsx create mode 100644 frontend/components/projects/edit/maintainers/apiProjectMaintainers.ts create mode 100644 frontend/components/projects/edit/maintainers/useProjectInvitations.tsx delete mode 100644 frontend/components/projects/edit/maintainers/useProjectMaintainer.tsx create mode 100644 frontend/components/projects/edit/maintainers/useProjectMaintainers.tsx delete mode 100644 frontend/components/software/edit/maintainers/SoftwareMaintainerLink.tsx create mode 100644 frontend/components/software/edit/maintainers/SoftwareMaintainerLinks.tsx create mode 100644 frontend/components/software/edit/maintainers/apiSoftwareMaintainers.ts create mode 100644 frontend/components/software/edit/maintainers/useSoftwareInvitations.tsx create mode 100644 frontend/pages/communities/[slug]/about.tsx create mode 100644 frontend/pages/invite/community/[id].tsx create mode 100644 frontend/utils/jest/WithCommunityContext.tsx diff --git a/data-generation/main.js b/data-generation/main.js index 2dbf9a689..bd5498068 100644 --- a/data-generation/main.js +++ b/data-generation/main.js @@ -1025,6 +1025,7 @@ const communityPromise = postToBackend('/community', generateCommunities()) .then(resp => resp.json()) .then(async commArray => { idsCommunities = commArray.map(comm => comm['id']); + postToBackend('/keyword_for_community', generateKeywordsForEntity(idsCommunities, idsKeywords, 'community')) }); await postToBackend('/meta_pages', generateMetaPages()).then(() => console.log('meta pages done')); diff --git a/database/024-community.sql b/database/024-community.sql index f0aeec524..5a446eedb 100644 --- a/database/024-community.sql +++ b/database/024-community.sql @@ -30,17 +30,6 @@ BEGIN RETURN NEW; END IF; - IF NOT NEW.is_tenant AND NEW.parent IS NULL AND NEW.primary_maintainer IS NULL THEN - RETURN NEW; - END IF; - - IF (SELECT primary_maintainer FROM community o WHERE o.id = NEW.parent) = uuid(current_setting('request.jwt.claims', FALSE)::json->>'account') - AND - NEW.primary_maintainer = (SELECT primary_maintainer FROM community o WHERE o.id = NEW.parent) - THEN - RETURN NEW; - END IF; - RAISE EXCEPTION USING MESSAGE = 'You are not allowed to add this community'; END $$; @@ -59,10 +48,8 @@ BEGIN RAISE EXCEPTION USING MESSAGE = 'You are not allowed to change the slug'; END IF; - IF CURRENT_USER <> 'rsd_admin' AND NOT (SELECT rolsuper FROM pg_roles WHERE rolname = CURRENT_USER) THEN - IF NEW.primary_maintainer IS DISTINCT FROM OLD.primary_maintainer THEN - RAISE EXCEPTION USING MESSAGE = 'You are not allowed to change the primary maintainer for community ' || OLD.name; - END IF; + IF NEW.primary_maintainer IS DISTINCT FROM OLD.primary_maintainer AND CURRENT_USER IS DISTINCT FROM 'rsd_admin' AND (SELECT rolsuper FROM pg_roles WHERE rolname = CURRENT_USER) IS DISTINCT FROM TRUE THEN + RAISE EXCEPTION USING MESSAGE = 'You are not allowed to change the primary maintainer for community ' || OLD.name; END IF; RETURN NEW; @@ -71,52 +58,66 @@ $$; CREATE TRIGGER sanitise_update_community BEFORE UPDATE ON community FOR EACH ROW EXECUTE PROCEDURE sanitise_update_community(); + +-- MAINTAINER OF COMMUNITY +CREATE TABLE maintainer_for_community ( + maintainer UUID REFERENCES account (id), + community UUID REFERENCES community (id), + PRIMARY KEY (maintainer, community) +); + + +-- Needed for RLS on various tables +CREATE FUNCTION communities_of_current_maintainer() RETURNS SETOF UUID STABLE +LANGUAGE sql SECURITY DEFINER AS +$$ + SELECT + id + FROM + community + WHERE + primary_maintainer = uuid(current_setting('request.jwt.claims', FALSE)::json->>'account') + UNION + SELECT + community + FROM + maintainer_for_community + WHERE + maintainer = uuid(current_setting('request.jwt.claims', FALSE)::json->>'account'); +$$; + + -- RLS community table ALTER TABLE community ENABLE ROW LEVEL SECURITY; CREATE POLICY anyone_can_read ON community FOR SELECT TO rsd_web_anon, rsd_user USING (TRUE); +CREATE POLICY maintainer_all_rights ON community TO rsd_user + USING (id IN (SELECT * FROM communities_of_current_maintainer())) + WITH CHECK (TRUE); + CREATE POLICY admin_all_rights ON community TO rsd_admin USING (TRUE) WITH CHECK (TRUE); --- SOFTWARE FOR COMMUNITY --- request status of software to be added to community --- default value is pending -CREATE TYPE request_status AS ENUM ( - 'pending', - 'approved', - 'rejected' -); - -CREATE TABLE software_for_community ( - software UUID REFERENCES software (id), - community UUID REFERENCES community (id), - status request_status NOT NULL DEFAULT 'pending', - PRIMARY KEY (software, community) -); +-- RLS maintainer_for_community table +ALTER TABLE maintainer_for_community ENABLE ROW LEVEL SECURITY; -CREATE FUNCTION sanitise_update_software_for_community() RETURNS TRIGGER LANGUAGE plpgsql AS -$$ -BEGIN - NEW.software = OLD.software; - NEW.community = OLD.community; - return NEW; -END -$$; +CREATE POLICY maintainer_select ON maintainer_for_community FOR SELECT TO rsd_user + USING (community IN (SELECT * FROM communities_of_current_maintainer())); -CREATE TRIGGER sanitise_update_software_for_community BEFORE UPDATE ON software_for_community FOR EACH ROW EXECUTE PROCEDURE sanitise_update_software_for_community(); +CREATE POLICY maintainer_delete ON maintainer_for_community FOR DELETE TO rsd_user + USING (community IN (SELECT * FROM communities_of_current_maintainer())); +CREATE POLICY maintainer_insert ON maintainer_for_community FOR INSERT TO rsd_user + WITH CHECK (community IN (SELECT * FROM communities_of_current_maintainer())); --- MAINTAINER OF COMMUNITY +CREATE POLICY admin_all_rights ON maintainer_for_community TO rsd_admin + USING (TRUE) + WITH CHECK (TRUE); -CREATE TABLE maintainer_for_community ( - maintainer UUID REFERENCES account (id), - community UUID REFERENCES community (id), - PRIMARY KEY (maintainer, community) -); -- INVITES FOR COMMUNITY MAINTAINER (magic link) CREATE TABLE invite_maintainer_for_community ( @@ -145,7 +146,7 @@ CREATE FUNCTION sanitise_update_invite_maintainer_for_community() RETURNS TRIGGE $$ BEGIN NEW.id = OLD.id; - NEW.software = OLD.software; + NEW.community = OLD.community; NEW.created_by = OLD.created_by; NEW.created_at = OLD.created_at; return NEW; @@ -154,7 +155,99 @@ $$; CREATE TRIGGER sanitise_update_invite_maintainer_for_community BEFORE UPDATE ON invite_maintainer_for_community FOR EACH ROW EXECUTE PROCEDURE sanitise_update_invite_maintainer_for_community(); +-- RLS invite_maintainer_for_community table +ALTER TABLE invite_maintainer_for_community ENABLE ROW LEVEL SECURITY; + +CREATE POLICY maintainer_select ON invite_maintainer_for_community FOR SELECT TO rsd_user + USING (community IN (SELECT * FROM communities_of_current_maintainer()) + OR created_by = uuid(current_setting('request.jwt.claims', FALSE)::json->>'account') + OR claimed_by = uuid(current_setting('request.jwt.claims', FALSE)::json->>'account')); + +CREATE POLICY maintainer_delete ON invite_maintainer_for_community FOR DELETE TO rsd_user + USING (community IN (SELECT * FROM communities_of_current_maintainer()) + OR created_by = uuid(current_setting('request.jwt.claims', FALSE)::json->>'account') + OR claimed_by = uuid(current_setting('request.jwt.claims', FALSE)::json->>'account')); + +CREATE POLICY maintainer_insert ON invite_maintainer_for_community FOR INSERT TO rsd_user + WITH CHECK (community IN (SELECT * FROM communities_of_current_maintainer()) AND created_by = uuid(current_setting('request.jwt.claims', FALSE)::json->>'account')); + +CREATE POLICY admin_all_rights ON invite_maintainer_for_community TO rsd_admin + USING (TRUE) + WITH CHECK (TRUE); + + +-- COMMUNITY maintainers list with basic personal info +-- used in the community maintainers page +CREATE FUNCTION maintainers_of_community(community_id UUID) RETURNS TABLE ( + maintainer UUID, + name VARCHAR[], + email VARCHAR[], + affiliation VARCHAR[], + is_primary BOOLEAN +) LANGUAGE plpgsql STABLE SECURITY DEFINER AS +$$ +DECLARE account_authenticated UUID; +BEGIN + account_authenticated = uuid(current_setting('request.jwt.claims', FALSE)::json->>'account'); + IF account_authenticated IS NULL THEN + RAISE EXCEPTION USING MESSAGE = 'Please login first'; + END IF; + + IF community_id IS NULL THEN + RAISE EXCEPTION USING MESSAGE = 'Please provide a community id'; + END IF; + + IF NOT community_id IN (SELECT * FROM communities_of_current_maintainer()) AND + CURRENT_USER IS DISTINCT FROM 'rsd_admin' AND ( + SELECT rolsuper FROM pg_roles WHERE rolname = CURRENT_USER + ) IS DISTINCT FROM TRUE THEN + RAISE EXCEPTION USING MESSAGE = 'You are not a maintainer of this community'; + END IF; + + RETURN QUERY + -- primary maintainer of community + SELECT + community.primary_maintainer AS maintainer, + ARRAY_AGG(login_for_account."name") AS name, + ARRAY_AGG(login_for_account.email) AS email, + ARRAY_AGG(login_for_account.home_organisation) AS affiliation, + TRUE AS is_primary + FROM + community + INNER JOIN + login_for_account ON community.primary_maintainer = login_for_account.account + WHERE + community.id = community_id + GROUP BY + community.id,community.primary_maintainer + -- append second selection + UNION + -- other maintainers of community + SELECT + maintainer_for_community.maintainer, + ARRAY_AGG(login_for_account."name") AS name, + ARRAY_AGG(login_for_account.email) AS email, + ARRAY_AGG(login_for_account.home_organisation) AS affiliation, + FALSE AS is_primary + FROM + maintainer_for_community + INNER JOIN + login_for_account ON maintainer_for_community.maintainer = login_for_account.account + WHERE + maintainer_for_community.community = community_id + GROUP BY + maintainer_for_community.community, maintainer_for_community.maintainer + -- primary as first record + ORDER BY is_primary DESC; + RETURN; +END +$$; + +-- ACCEPT MAGIC LINK INVITATION +-- REGISTER user with this link as maintainer of community +-- RETURN basic info about community on SUCCESS CREATE FUNCTION accept_invitation_community(invitation UUID) RETURNS TABLE( + id UUID, name VARCHAR, slug VARCHAR ) LANGUAGE plpgsql VOLATILE SECURITY DEFINER AS @@ -171,7 +264,11 @@ BEGIN RAISE EXCEPTION USING MESSAGE = 'Please provide an invitation id'; END IF; - SELECT * FROM invite_maintainer_for_community WHERE id = invitation INTO invitation_row; + SELECT * FROM + invite_maintainer_for_community + WHERE + invite_maintainer_for_community.id = invitation INTO invitation_row; + IF invitation_row.id IS NULL THEN RAISE EXCEPTION USING MESSAGE = 'Invitation with id ' || invitation || ' does not exist'; END IF; @@ -181,14 +278,123 @@ BEGIN END IF; -- Only use the invitation if not already a maintainer - IF NOT EXISTS(SELECT 1 FROM maintainer_for_community WHERE maintainer = account AND community = invitation_row.community) THEN - UPDATE invite_maintainer_for_community SET claimed_by = account, claimed_at = LOCALTIMESTAMP WHERE id = invitation; - INSERT INTO maintainer_for_community VALUES (account, invitation_row.community); + IF NOT EXISTS( + SELECT + maintainer_for_community.maintainer + FROM + maintainer_for_community + WHERE + maintainer_for_community.maintainer=account AND maintainer_for_community.community=invitation_row.community + UNION + SELECT + community.primary_maintainer AS maintainer + FROM + community + WHERE + community.primary_maintainer=account AND community.id=invitation_row.community + LIMIT 1 + ) THEN + + UPDATE invite_maintainer_for_community + SET claimed_by = account, claimed_at = LOCALTIMESTAMP + WHERE invite_maintainer_for_community.id = invitation; + + INSERT INTO maintainer_for_community + VALUES (account, invitation_row.community); + END IF; RETURN QUERY - SELECT community.name, community.slug FROM community WHERE community.id = invitation_row.community; + SELECT + community.id, + community.name, + community.slug + FROM + community + WHERE + community.id = invitation_row.community; RETURN; END $$; + +-- SOFTWARE FOR COMMUNITY +-- request status of software to be added to community +-- default value is pending +CREATE TYPE request_status AS ENUM ( + 'pending', + 'approved', + 'rejected' +); + +CREATE TABLE software_for_community ( + software UUID REFERENCES software (id), + community UUID REFERENCES community (id), + status request_status NOT NULL DEFAULT 'pending', + PRIMARY KEY (software, community) +); + +CREATE FUNCTION sanitise_update_software_for_community() RETURNS TRIGGER LANGUAGE plpgsql AS +$$ +BEGIN + NEW.software = OLD.software; + NEW.community = OLD.community; + return NEW; +END +$$; + +CREATE TRIGGER sanitise_update_software_for_community BEFORE UPDATE ON software_for_community FOR EACH ROW EXECUTE PROCEDURE sanitise_update_software_for_community(); + + +-- RLS software_for_community table +ALTER TABLE software_for_community ENABLE ROW LEVEL SECURITY; + +CREATE POLICY anyone_can_read ON software_for_community FOR SELECT TO rsd_web_anon, rsd_user + USING (software IN (SELECT id FROM software)); + +CREATE POLICY maintainer_can_read ON software_for_community FOR SELECT TO rsd_user + USING (software IN (SELECT * FROM software_of_current_maintainer()) OR community IN (SELECT * FROM communities_of_current_maintainer())); + +CREATE POLICY maintainer_software_insert ON software_for_community FOR INSERT TO rsd_user + WITH CHECK (status = 'pending' AND software IN (SELECT * FROM software_of_current_maintainer())); + +CREATE POLICY maintainer_community_insert ON software_for_community FOR INSERT TO rsd_user + WITH CHECK (community IN (SELECT * FROM communities_of_current_maintainer())); + +CREATE POLICY maintainer_community_update ON software_for_community FOR UPDATE TO rsd_user + USING (community IN (SELECT * FROM communities_of_current_maintainer())); + +CREATE POLICY maintainer_software_delete ON software_for_community FOR DELETE TO rsd_user + USING ((status = 'pending' OR status = 'approved') AND software IN (SELECT * FROM software_of_current_maintainer())); + +CREATE POLICY maintainer_community_delete ON software_for_community FOR DELETE TO rsd_user + USING (community IN (SELECT * FROM communities_of_current_maintainer())); + +CREATE POLICY admin_all_rights ON software_for_community TO rsd_admin + USING (TRUE) + WITH CHECK (TRUE); + + +-- KEYWORDS for community +CREATE TABLE keyword_for_community ( + community UUID REFERENCES community (id), + keyword UUID REFERENCES keyword (id), + PRIMARY KEY (community, keyword) +); + + +-- RLS keyword_for_community table +ALTER TABLE keyword_for_community ENABLE ROW LEVEL SECURITY; + +CREATE POLICY anyone_can_read ON keyword_for_community FOR SELECT TO rsd_web_anon, rsd_user + USING (TRUE); + +CREATE POLICY maintainer_insert ON keyword_for_community FOR INSERT TO rsd_user + WITH CHECK (community IN (SELECT * FROM communities_of_current_maintainer())); + +CREATE POLICY maintainer_delete ON keyword_for_community FOR DELETE TO rsd_user + USING (community IN (SELECT * FROM communities_of_current_maintainer())); + +CREATE POLICY admin_all_rights ON keyword_for_community TO rsd_admin + USING (TRUE) + WITH CHECK (TRUE); diff --git a/database/124-community-views.sql b/database/124-community-views.sql index 51253ca3b..93d1abcff 100644 --- a/database/124-community-views.sql +++ b/database/124-community-views.sql @@ -22,15 +22,89 @@ GROUP BY ; $$; + +-- Keywords with the count used by +-- by search to show existing keywords with the count +CREATE FUNCTION keyword_count_for_community() RETURNS TABLE ( + id UUID, + keyword CITEXT, + cnt BIGINT +) LANGUAGE sql STABLE AS +$$ + SELECT + keyword.id, + keyword.value AS keyword, + keyword_count.cnt + FROM + keyword + LEFT JOIN + (SELECT + keyword_for_community.keyword, + COUNT(keyword_for_community.keyword) AS cnt + FROM + keyword_for_community + GROUP BY keyword_for_community.keyword + ) AS keyword_count ON keyword.id = keyword_count.keyword; +$$; + +-- Keywords by community +-- for editing keywords of specific community +CREATE FUNCTION keywords_by_community() RETURNS TABLE ( + id UUID, + keyword CITEXT, + community UUID +) LANGUAGE sql STABLE AS +$$ + SELECT + keyword.id, + keyword.value AS keyword, + keyword_for_community.community + FROM + keyword_for_community + INNER JOIN + keyword ON keyword.id = keyword_for_community.keyword; +$$; +-- using filter ?community=eq.UUID + +-- Keywords grouped by community for filtering +-- We use array for selecting community with specific keywords +-- We use text value for "wild card" search +CREATE FUNCTION keyword_filter_for_community() RETURNS TABLE ( + community UUID, + keywords CITEXT[], + keywords_text TEXT +) LANGUAGE sql STABLE AS +$$ + SELECT + keyword_for_community.community AS community, + ARRAY_AGG( + keyword.value + ORDER BY value + ) AS keywords, + STRING_AGG( + keyword.value,' ' + ORDER BY value + ) AS keywords_text + FROM + keyword_for_community + INNER JOIN + keyword ON keyword.id = keyword_for_community.keyword + GROUP BY keyword_for_community.community; +$$; + + -- rpc for community overview page --- incl. software count +-- incl. software count and keyword list (for card) CREATE FUNCTION communities_overview() RETURNS TABLE ( id UUID, slug VARCHAR, name VARCHAR, short_description VARCHAR, logo_id VARCHAR, + primary_maintainer UUID, software_cnt BIGINT, + keywords CITEXT[], + description VARCHAR, created_at TIMESTAMPTZ ) LANGUAGE sql STABLE AS $$ @@ -40,11 +114,16 @@ SELECT community."name", community.short_description, community.logo_id, + community.primary_maintainer, software_count_by_community.software_cnt, + keyword_filter_for_community.keywords, + community.description, community.created_at FROM community LEFT JOIN software_count_by_community() ON community.id = software_count_by_community.community +LEFT JOIN + keyword_filter_for_community() ON community.id=keyword_filter_for_community.community ; $$; diff --git a/frontend/auth/api/authHelpers.ts b/frontend/auth/api/authHelpers.ts index cb7ef0ad4..ac03ff3d9 100644 --- a/frontend/auth/api/authHelpers.ts +++ b/frontend/auth/api/authHelpers.ts @@ -1,13 +1,13 @@ // SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 dv4all +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) // // SPDX-License-Identifier: Apache-2.0 import logger from '~/utils/logger' -import {createJsonHeaders, extractReturnMessage} from '~/utils/fetchHelpers' +import {createJsonHeaders, extractReturnMessage, getBaseUrl} from '~/utils/fetchHelpers' export type RedirectToProps = { authorization_endpoint: string, @@ -184,3 +184,45 @@ export async function claimOrganisationMaintainerInvite({id, token, frontend = f } } } + + +export async function claimCommunityMaintainerInvite({id, token}: + { id: string, token?: string}) { + try { + const query = 'rpc/accept_invitation_community' + let url = `${getBaseUrl()}/${query}` + + const resp = await fetch(url, { + method: 'POST', + headers: { + ...createJsonHeaders(token), + 'Accept': 'application/vnd.pgrst.object + json', + }, + body: JSON.stringify({ + 'invitation': id + }) + }) + if (resp.status === 200) { + const json = await resp.json() + return { + communityInfo: json, + error: null + } + } + logger(`claimCommunityMaintainerInvite failed: ${resp?.status} ${resp.statusText}`, 'error') + const error = await extractReturnMessage(resp) + return { + communityInfo: null, + error + } + } catch (e: any) { + logger(`claimCommunityMaintainerInvite failed: ${e?.message}`, 'error') + return { + communityInfo: null, + error: { + status: 500, + message: e?.message + } + } + } +} diff --git a/frontend/auth/permissions/isMaintainerOfCommunity.ts b/frontend/auth/permissions/isMaintainerOfCommunity.ts index a97cdd3da..1146a5832 100644 --- a/frontend/auth/permissions/isMaintainerOfCommunity.ts +++ b/frontend/auth/permissions/isMaintainerOfCommunity.ts @@ -4,6 +4,7 @@ // SPDX-License-Identifier: Apache-2.0 import {RsdRole} from '~/auth/index' +import {createJsonHeaders, getBaseUrl} from '~/utils/fetchHelpers' import logger from '~/utils/logger' type isCommunityMaintainerProps = { @@ -44,15 +45,15 @@ export async function isMaintainerOfCommunity({community, account, token}: isCom // if no account, token, role provided return false } - console.error('isMaintainerOfCommunity...NOT IMPLEMENTED') - // const organisations = await getMaintainerOrganisations({ - // token - // }) - // // debugger - // if (organisations.length > 0) { - // const isMaintainer = organisations.includes(organisation) - // return isMaintainer - // } + const communities = await getCommunitiesOfMaintainer({ + token + }) + // console.log('isMaintainerOfCommunity...',communities) + // debugger + if (communities.length > 0) { + const isMaintainer = communities.includes(community) + return isMaintainer + } return false } catch (e:any) { logger(`isMaintainerOfCommunity: ${e?.message}`, 'error') @@ -60,3 +61,31 @@ export async function isMaintainerOfCommunity({community, account, token}: isCom return false } } + +export async function getCommunitiesOfMaintainer({token}: + {token: string}) { + try { + // without token api request is not needed + if (!token) return [] + // build url + const query = 'rpc/communities_of_current_maintainer' + let url = `${getBaseUrl()}/${query}` + const resp = await fetch(url, { + method: 'GET', + headers: createJsonHeaders(token) + }) + if (resp.status === 200) { + const json = await resp.json() + return json + } + // ERRORS AS NOT MAINTAINER + logger(`getCommunitiesOfMaintainer: ${resp.status}:${resp.statusText}`, 'warn') + return [] + } catch(e:any) { + // ERRORS AS NOT MAINTAINER + logger(`getCommunitiesOfMaintainer: ${e.message}`, 'error') + return [] + } +} + +export default isMaintainerOfCommunity diff --git a/frontend/components/AppHeader/DesktopMenu.tsx b/frontend/components/AppHeader/DesktopMenu.tsx index e67756c1f..c5a5f0b9e 100644 --- a/frontend/components/AppHeader/DesktopMenu.tsx +++ b/frontend/components/AppHeader/DesktopMenu.tsx @@ -14,7 +14,7 @@ export default function DesktopMenu({activePath}:{activePath:string}) { // console.groupEnd() return (
    + className="hidden text-center lg:flex-1 lg:flex lg:justify-evenly lg:gap-5 xl:justify-start"> {menuItems.map(item => { const isActive = isActiveMenuItem({item, activePath}) return ( diff --git a/frontend/components/AppHeader/index.tsx b/frontend/components/AppHeader/index.tsx index f6b28f91d..3242b4c27 100644 --- a/frontend/components/AppHeader/index.tsx +++ b/frontend/components/AppHeader/index.tsx @@ -74,12 +74,10 @@ export default function AppHeader() {
    {/* FEEDBACK panel */} -
    - {host.feedback?.enabled - ? - : null - } -
    + {host.feedback?.enabled + ? + : null + } {/* ADD menu button */} {status === 'authenticated' ? : null} {/* Responsive menu */} diff --git a/frontend/components/communities/CommunityPage.tsx b/frontend/components/communities/CommunityPage.tsx new file mode 100644 index 000000000..15582144a --- /dev/null +++ b/frontend/components/communities/CommunityPage.tsx @@ -0,0 +1,74 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import BackgroundAndLayout from '../layout/BackgroundAndLayout' +import BaseSurfaceRounded from '../layout/BaseSurfaceRounded' +import PageBreadcrumbs from '../layout/PageBreadcrumbs' +import {UserSettingsProvider} from '../organisation/context/UserSettingsContext' +import {LayoutType} from '../software/overview/search/ViewToggleGroup' +import CommunityMetadata from './metadata' +import {TabKey} from './tabs/CommunityTabItems' +import CommunityTabs from './tabs' +import {CommunityProvider} from './context' +import {EditCommunityProps} from './apiCommunities' + +type CommunityPageProps={ + selectTab: TabKey + community: EditCommunityProps + slug: string[] + isMaintainer: boolean + rsd_page_layout: LayoutType + rsd_page_rows: number + children: JSX.Element | JSX.Element[] +} + +export default function CommunityPage({ + community,rsd_page_layout,isMaintainer, + rsd_page_rows,slug, children, selectTab +}:CommunityPageProps) { + return ( + + + + {/* COMMUNITY HEADER */} + + + + + {/* TABS */} + + + + {/* TAB CONTENT */} +
    + {children} +
    +
    +
    +
    + ) +} diff --git a/frontend/components/communities/__mocks__/mockCommunity.ts b/frontend/components/communities/__mocks__/mockCommunity.ts new file mode 100644 index 000000000..29d5a641d --- /dev/null +++ b/frontend/components/communities/__mocks__/mockCommunity.ts @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) +// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) (dv4all) +// SPDX-FileCopyrightText: 2022 dv4all +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {CommunityListProps} from '../apiCommunities' + +const mockCommunity: CommunityListProps = { + 'id': '91c2ffa7-bce6-4488-be00-6613a2d99f51', + 'slug': 'dutch-research-council', + 'name': 'Dutch Research Council Community', + 'short_description': 'This is short description', + 'logo_id': null, + 'software_cnt': 1, + 'primary_maintainer': '91c2ffa7-bce6-4488-be00-6613a2d99f52', + 'description': '# About page\n\nThis is short text for about page.\n\n## Subtitle\n\nThis is subtitle.' +} + +export default mockCommunity diff --git a/frontend/components/communities/about/CommunityAboutIndex.test.tsx b/frontend/components/communities/about/CommunityAboutIndex.test.tsx new file mode 100644 index 000000000..e1d6b2f55 --- /dev/null +++ b/frontend/components/communities/about/CommunityAboutIndex.test.tsx @@ -0,0 +1,21 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {screen, render} from '@testing-library/react' + +import AboutPage from './index' +import mockCommunity from '../__mocks__/mockCommunity' + +describe('frontend/components/community/about/index.tsx', () => { + + it('renders markdown title # About page', () => { + render( + + ) + const aboutPage = screen.getByText(/# About page/) + expect(aboutPage).toBeInTheDocument() + }) + +}) diff --git a/frontend/components/communities/about/index.tsx b/frontend/components/communities/about/index.tsx new file mode 100644 index 000000000..921560fa0 --- /dev/null +++ b/frontend/components/communities/about/index.tsx @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import ReactMarkdownWithSettings from '~/components/layout/ReactMarkdownWithSettings' +import BaseSurfaceRounded from '~/components/layout/BaseSurfaceRounded' + +export default function AboutCommunityPage({description}:{description?:string}) { + // if description is present we return markdown page + if (description) { + return ( + + {description ? + + : null + } + + ) + } +} diff --git a/frontend/components/communities/apiCommunities.ts b/frontend/components/communities/apiCommunities.ts index 8aea86c38..85f71163a 100644 --- a/frontend/components/communities/apiCommunities.ts +++ b/frontend/components/communities/apiCommunities.ts @@ -8,16 +8,26 @@ import {extractCountFromHeader} from '~/utils/extractCountFromHeader' import {createJsonHeaders, extractReturnMessage, getBaseUrl} from '~/utils/fetchHelpers' import logger from '~/utils/logger' import {paginationUrlParams} from '~/utils/postgrestUrl' +import {KeywordForCommunity} from './settings/general/apiCommunityKeywords' +import {Community} from '../admin/communities/apiCommunities' -export type CommunityListProps = { +// New type based on Community but replace +// id with new type +export type CommunityListProps = Omit & { + // id is always present id: string, - slug: string, - name: string, - short_description: string | null, - logo_id: string | null - software_cnt: number | null + // additional props + software_cnt: number | null, + keywords: string[] | null } +// New type based on CommunityListProps but replace +// the keywords type +export type EditCommunityProps = Omit & { + keywords: KeywordForCommunity[] +} + + type GetCommunityListParams={ page: number, rows: number, @@ -79,7 +89,7 @@ type GetCommunityBySlug={ token?:string } -export async function getCommunityBySlug({slug,user,token}:GetCommunityBySlug){ +export async function getCommunityBySlug({slug,token}:GetCommunityBySlug){ try{ // ignore if no slug if (slug===null) return null @@ -113,17 +123,19 @@ export async function getCommunityBySlug({slug,user,token}:GetCommunityBySlug){ type PatchCommunityProps = { id: string, - slug?: string, - name?: string, - short_description?: string | null, - logo_id?: string | null - description?: string | null + data:{ + slug?: string, + name?: string, + short_description?: string | null, + logo_id?: string | null + description?: string | null + }, + token: string } -export async function patchCommunity({data, token}: - { data: PatchCommunityProps, token: string }) { +export async function patchCommunityTable({id, data, token}:PatchCommunityProps) { try { - const url = `/api/v1/community?id=eq.${data.id}` + const url = `/api/v1/community?id=eq.${id}` const resp = await fetch(url, { method: 'PATCH', headers: { diff --git a/frontend/components/communities/context/index.tsx b/frontend/components/communities/context/index.tsx new file mode 100644 index 000000000..fe8a1b4a0 --- /dev/null +++ b/frontend/components/communities/context/index.tsx @@ -0,0 +1,69 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {PropsWithChildren, createContext, useCallback, useContext, useState} from 'react' +import {EditCommunityProps} from '~/components/communities/apiCommunities' + +type UpdateCommunityProps = { + key: keyof EditCommunityProps, + value: any +} + +type CommunityContextProps = PropsWithChildren & { + community: EditCommunityProps, + isMaintainer: boolean, + updateCommunity: ({key,value}:UpdateCommunityProps)=>void +} + +const emptyCommunity:EditCommunityProps = { + id:'', + name: '', + slug: '', + short_description: null, + description: null, + primary_maintainer: null, + logo_id: null, + software_cnt: null, + keywords: [], +} + +const CommunityContext = createContext({ + community: emptyCommunity, + isMaintainer: false, + updateCommunity: ({key,value}:UpdateCommunityProps)=> {} +}) + +export function CommunityProvider({community:initCommunity,isMaintainer:initMaintainer,...props}:any){ + const [community, setCommunity] = useState(initCommunity) + const [isMaintainer] = useState(initMaintainer ?? false) + + const updateCommunity = useCallback(({key,value}:UpdateCommunityProps)=>{ + if (community){ + const comm = { + ...community, + [key]:value + } + setCommunity(comm) + } + },[community]) + + return ( + + ) +} + +export function useCommunityContext(){ + const {community,isMaintainer,updateCommunity} = useContext(CommunityContext) + return { + community, + isMaintainer, + updateCommunity + } +} diff --git a/frontend/components/communities/metadata/CommunityLogo.tsx b/frontend/components/communities/metadata/CommunityLogo.tsx index df8c9362f..58f043214 100644 --- a/frontend/components/communities/metadata/CommunityLogo.tsx +++ b/frontend/components/communities/metadata/CommunityLogo.tsx @@ -1,20 +1,16 @@ -// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2022 dv4all -// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 -import {useEffect, useState} from 'react' +import {useState} from 'react' import {useSession} from '~/auth' import {deleteImage,getImageUrl,upsertImage} from '~/utils/editImage' import LogoAvatar from '~/components/layout/LogoAvatar' import useSnackbar from '~/components/snackbar/useSnackbar' import OrganisationLogoMenu from '~/components/organisation/metadata/OrganisationLogoMenu' -import {patchCommunity} from '../apiCommunities' -// import OrganisationLogoMenu from './OrganisationLogoMenu' -// import useOrganisationContext from '../context/useOrganisationContext' +import {patchCommunityTable} from '../apiCommunities' type CommunityLogoProps = { id: string, @@ -42,12 +38,6 @@ export default function CommunityLogo({id,name,logo_id,isMaintainer}:CommunityLo // console.log('isMaintainer...', isMaintainer) // console.groupEnd() - // Update logo when new value - // received from parent - // useEffect(() => { - // if (logo_id) setLogo(logo_id) - // },[logo_id]) - async function addLogo({data, mime_type}: ImageDataProps) { // split base64 to use only encoded content const b64data = data.split(',')[1] @@ -59,9 +49,9 @@ export default function CommunityLogo({id,name,logo_id,isMaintainer}:CommunityLo // console.log('addLogo...resp...', resp) if (resp.status === 201 && id) { // update logo_id reference - const patch = await patchCommunity({ + const patch = await patchCommunityTable({ + id, data: { - id, logo_id: resp.message }, token @@ -92,9 +82,9 @@ export default function CommunityLogo({id,name,logo_id,isMaintainer}:CommunityLo async function removeLogo() { if (logo && token && id) { // remove logo_id from organisation - const resp = await patchCommunity({ + const resp = await patchCommunityTable({ + id, data: { - id, logo_id: null }, token diff --git a/frontend/components/communities/metadata/index.tsx b/frontend/components/communities/metadata/index.tsx index 22fc6df12..11dc74924 100644 --- a/frontend/components/communities/metadata/index.tsx +++ b/frontend/components/communities/metadata/index.tsx @@ -4,47 +4,44 @@ // SPDX-License-Identifier: Apache-2.0 import BaseSurfaceRounded from '~/components/layout/BaseSurfaceRounded' -import Links, {LinksProps} from '~/components/organisation/metadata/Links' +import {useCommunityContext} from '../context' import CommunityLogo from './CommunityLogo' +import KeywordList from '~/components/cards/KeywordList' -type CommunityMetadataProps={ - id: string, - name: string, - short_description: string | null - logo_id: string | null - isMaintainer: boolean - links: LinksProps[] -} +export default function CommunityMetadata() { + const {community,isMaintainer} = useCommunityContext() + // generate simple list + const keywordList = community?.keywords?.map(keyword=>keyword.keyword) -export default function CommunityMetadata({ - id,name,short_description, - logo_id,isMaintainer,links -}:CommunityMetadataProps) { + // console.group('CommunityMetadata') + // console.log('isMaintainer...', isMaintainer) + // console.log('keywordList...', keywordList) + // console.log('community...', community) + // console.groupEnd() return (
    - -
    -

    - {name} -

    -

    - {short_description} -

    -
    -
    - -
    + +

    + {community?.name} +

    +

    + {community?.short_description} +

    +
    ) diff --git a/frontend/components/communities/overview/CommunityCard.tsx b/frontend/components/communities/overview/CommunityCard.tsx index de59308fa..6828a6fe6 100644 --- a/frontend/components/communities/overview/CommunityCard.tsx +++ b/frontend/components/communities/overview/CommunityCard.tsx @@ -1,8 +1,5 @@ -// SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2022 - 2023 dv4all -// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) (dv4all) -// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 @@ -12,9 +9,9 @@ import CardTitleSubtitle from '~/components/cards/CardTitleSubtitle' import ImageWithPlaceholder from '~/components/layout/ImageWithPlaceholder' import CardImageFrame from '~/components/cards/CardImageFrame' import CardContentFrame from '~/components/cards/CardContentFrame' -import OrganisationCardMetrics from '~/components/organisation/overview/card/OrganisationCardMetrics' import {CommunityListProps} from '../apiCommunities' -// import CountryLabel from './CountryLabel' +import KeywordList from '~/components/cards/KeywordList' +import CommunityMetrics from './CommunityMetrics' export default function CommunityCard({community}:{community:CommunityListProps}) { @@ -37,23 +34,23 @@ export default function CommunityCard({community}:{community:CommunityListProps} /> -
    - {/* */} - + + {/* keywords */} +
    +
    -
    - {/* Software packages count */} -
    -
    - {community.software_cnt ?? 0} -
    -
    - software
    package{community.software_cnt === 1 ? '' : 's'} -
    -
    + + {/* Metrics */} +
    +
    diff --git a/frontend/components/communities/overview/CommunityListItem.tsx b/frontend/components/communities/overview/CommunityListItem.tsx index d251e389c..8d8734763 100644 --- a/frontend/components/communities/overview/CommunityListItem.tsx +++ b/frontend/components/communities/overview/CommunityListItem.tsx @@ -9,8 +9,10 @@ import ListImageWithGradientPlaceholder from '~/components/projects/overview/lis import OverviewListItem from '~/components/software/overview/list/OverviewListItem' import {getImageUrl} from '~/utils/editImage' import {CommunityListProps} from '../apiCommunities' +import CommunityMetrics from './CommunityMetrics' export default function CommunityListItem({community}:{community:CommunityListProps}) { + const imgSrc = getImageUrl(community.logo_id ?? null) return ( @@ -21,7 +23,7 @@ export default function CommunityListItem({community}:{community:CommunityListPr className='flex-1 flex items-center hover:text-inherit bg-base-100 rounded-sm' >
    @@ -35,8 +37,8 @@ export default function CommunityListItem({community}:{community:CommunityListPr
    {/* software count */} -
    - {community.software_cnt} software packages +
    +
    diff --git a/frontend/components/communities/overview/CommunityMetrics.tsx b/frontend/components/communities/overview/CommunityMetrics.tsx new file mode 100644 index 000000000..806729a17 --- /dev/null +++ b/frontend/components/communities/overview/CommunityMetrics.tsx @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import Tooltip from '@mui/material/Tooltip' +import TerminalIcon from '@mui/icons-material/Terminal' + +type CommunityMetricsProps = { + software_cnt: number +} + +export default function CommunityMetrics({software_cnt}:CommunityMetricsProps) { + + function softwareMessage(){ + if (software_cnt && software_cnt === 1) { + return `${software_cnt} software package` + } + return `${software_cnt ?? 0} software packages` + } + + return ( + <> + +
    + + {software_cnt ?? 0} +
    +
    + + ) +} diff --git a/frontend/components/communities/settings/SettingsContent.tsx b/frontend/components/communities/settings/SettingsContent.tsx new file mode 100644 index 000000000..996118d37 --- /dev/null +++ b/frontend/components/communities/settings/SettingsContent.tsx @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useRouter} from 'next/router' + +import CommunityAboutPage from './about-page' +import CommunityMaintainers from './maintainers' +import CommunityGeneralSettings from './general' + + +export default function CommunitySettingsContent() { + const router = useRouter() + const tab = router.query['tab']?.toString() ?? '' + + switch (tab) { + case 'about': + return + case 'maintainers': + return + default: + return + } + +} diff --git a/frontend/components/communities/settings/SettingsNav.tsx b/frontend/components/communities/settings/SettingsNav.tsx new file mode 100644 index 000000000..3740ac79f --- /dev/null +++ b/frontend/components/communities/settings/SettingsNav.tsx @@ -0,0 +1,54 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useRouter} from 'next/router' +import List from '@mui/material/List' +import ListItemButton from '@mui/material/ListItemButton' +import ListItemIcon from '@mui/material/ListItemIcon' +import ListItemText from '@mui/material/ListItemText' + +import {editMenuItemButtonSx} from '~/config/menuItems' +import {settingsMenu} from './SettingsNavItems' + +export default function CommunitySettingsNav() { + const router = useRouter() + const tab = router.query['tab'] ?? 'general' + // console.group('CommunitySettingsNav') + // console.log('description...', organisation.description) + // console.groupEnd() + return ( + + {settingsMenu.map((item, pos) => { + const selected = tab === settingsMenu[pos].id + return ( + { + router.push({ + query: { + ...router.query, + tab: item.id + } + },{},{scroll:false}) + }} + sx={editMenuItemButtonSx} + > + + {item.icon} + + + + ) + })} + + ) +} diff --git a/frontend/components/communities/settings/SettingsNavItems.tsx b/frontend/components/communities/settings/SettingsNavItems.tsx new file mode 100644 index 000000000..893229181 --- /dev/null +++ b/frontend/components/communities/settings/SettingsNavItems.tsx @@ -0,0 +1,36 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import InfoIcon from '@mui/icons-material/Info' +import PersonIcon from '@mui/icons-material/Person' +import SettingsIcon from '@mui/icons-material/Settings' + +export type SettingsMenuProps = { + id: string, + status: string, + label: (props?:any)=>string, + icon: JSX.Element +} + +export const settingsMenu: SettingsMenuProps[] = [ + { + id:'general', + label:()=>'General settings', + icon: , + status: 'Community details' + }, + { + id:'maintainers', + label:()=>'Maintainers', + icon: , + status: 'Maintainers of community', + }, + { + id:'about', + label:()=>'About', + icon: , + status: 'Custom about page', + } +] diff --git a/frontend/components/communities/settings/about-page/AutosaveCommunityDescription.tsx b/frontend/components/communities/settings/about-page/AutosaveCommunityDescription.tsx new file mode 100644 index 000000000..7afe09e45 --- /dev/null +++ b/frontend/components/communities/settings/about-page/AutosaveCommunityDescription.tsx @@ -0,0 +1,80 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useController, useFormContext} from 'react-hook-form' + +import {useSession} from '~/auth' +import MarkdownInputWithPreview from '~/components/form/MarkdownInputWithPreview' +import useSnackbar from '~/components/snackbar/useSnackbar' +import {Community} from '~/components/admin/communities/apiCommunities' +import {patchCommunityTable} from '../../apiCommunities' +import {useCommunityContext} from '../../context' + +type AutosaveControlledMarkdownProps = { + name: keyof Community + maxLength: number +} + +export default function AutosaveCommunityDescription(props: AutosaveControlledMarkdownProps) { + const {token} = useSession() + const {showErrorMessage} = useSnackbar() + const {name,maxLength} = props + const {register,control,resetField} = useFormContext() + const {community,updateCommunity} = useCommunityContext() + const {field:{value},fieldState:{isDirty,error}} = useController({ + control, + name + }) + + async function saveMarkdown() { + let description = null + // we do not save when error or no change + if (isDirty === false || error) return + // only if not empty string, we use null when empty + if (value !== '') description = value + // patch community table + const resp = await patchCommunityTable({ + id: community?.id ?? '', + data: { + [name]: description + }, + token + }) + + // console.group('AutosaveCommunityDescription') + // console.log('saved...', name) + // console.log('status...', resp?.status) + // console.groupEnd() + + if (resp?.status !== 200) { + showErrorMessage(`Failed to save ${name}. ${resp?.message}`) + } else { + // debugger + updateCommunity({ + key: name, + value + }) + // debugger + resetField(name, { + defaultValue:value + }) + } + } + + return ( + saveMarkdown()} + /> + ) +} diff --git a/frontend/components/communities/settings/about-page/config.ts b/frontend/components/communities/settings/about-page/config.ts new file mode 100644 index 000000000..e7496a232 --- /dev/null +++ b/frontend/components/communities/settings/about-page/config.ts @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +const config = { + description: { + title: 'About page', + subtitle: 'Provide the content of about page. If content is not provided about page is hidden.', + validation: { + minLength: {value: 16, message: 'Minimum length is 16'}, + maxLength: {value: 10000, message: 'Maximum length is 10.000'}, + } + } +} + +export default config diff --git a/frontend/components/communities/settings/about-page/index.tsx b/frontend/components/communities/settings/about-page/index.tsx new file mode 100644 index 000000000..2c5005ff8 --- /dev/null +++ b/frontend/components/communities/settings/about-page/index.tsx @@ -0,0 +1,58 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {FormProvider, useForm} from 'react-hook-form' + +import BaseSurfaceRounded from '~/components/layout/BaseSurfaceRounded' +import EditSectionTitle from '~/components/layout/EditSectionTitle' +import config from './config' +import AutosaveOrganisationDescription from './AutosaveCommunityDescription' + +import {useCommunityContext} from '~/components/communities/context' + +type AboutPageFormProps = { + id?: string + description?: string | null +} + + +export default function CommunityAboutPage() { + const {community} = useCommunityContext() + + const methods = useForm({ + mode: 'onChange', + defaultValues: { + id: community?.id, + description: community?.description + } + }) + + return ( + + + + {/* hidden inputs */} + + + + + + + ) +} diff --git a/frontend/components/communities/settings/general/AutosaveCommunityKeywords.tsx b/frontend/components/communities/settings/general/AutosaveCommunityKeywords.tsx new file mode 100644 index 000000000..c4d6beb85 --- /dev/null +++ b/frontend/components/communities/settings/general/AutosaveCommunityKeywords.tsx @@ -0,0 +1,174 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import Chip from '@mui/material/Chip' +import {useFormContext} from 'react-hook-form' + +import {useSession} from '~/auth' +import {createOrGetKeyword, silentKeywordDelete} from '~/utils/editKeywords' +import {sortOnStrProp} from '~/utils/sortFn' +import useSnackbar from '~/components/snackbar/useSnackbar' +import FindKeyword, {Keyword} from '~/components/keyword/FindKeyword' +import {EditCommunityProps} from '~/components/communities/apiCommunities' +import { + KeywordForCommunity, + addKeywordsToCommunity, deleteKeywordFromCommunity +} from './apiCommunityKeywords' +import {searchForCommunityKeyword} from './searchForCommunityKeyword' +import config from './config' +import {useCommunityContext} from '../../context' + +export type SoftwareKeywordsProps={ + software_id:string, + concept_doi?:string +} + +export default function AutosaveCommunityKeywords(){ + const {token} = useSession() + const {showErrorMessage, showInfoMessage} = useSnackbar() + const {watch,setValue} = useFormContext() + const {updateCommunity} = useCommunityContext() + const [id,keywords] = watch(['id','keywords']) + + // console.group('AutosaveCommunityKeywords') + // console.log('id...', id) + // console.log('keywords...', keywords) + // console.groupEnd() + + function setKeywords(items:KeywordForCommunity[]){ + // save keywords in the form context + setValue('keywords',items,{ + shouldDirty: false, + shouldTouch: false, + shouldValidate: false + }) + // update in the context + updateCommunity({ + key:'keywords', + value: items + }) + } + + async function onAdd(selected: Keyword) { + // check if already added + const find = keywords.filter(item => item.keyword.trim().toLowerCase() === selected.keyword.trim().toLowerCase()) + // debugger + let resp + if (find.length === 0) { + resp = await addKeywordsToCommunity({ + data:{ + community:id, + keyword: selected.id + }, + token + }) + if (resp.status===200){ + const items = [ + ...keywords, + { + ...selected, + community:id + } + ].sort((a,b)=>sortOnStrProp(a,b,'keyword')) + setKeywords(items) + }else{ + showErrorMessage(`Failed to save keyword. ${resp.message}`) + } + }else{ + showInfoMessage(`${selected.keyword.trim()} is already in the list`) + } + } + + async function onCreate(selected: string) { + // check if already exists + const find = keywords.filter(item => item.keyword.trim().toLowerCase() === selected.trim().toLowerCase()) + // debugger + if (find.length === 0) { + // create or get existing keyword + let resp = await createOrGetKeyword({ + keyword: selected, + token + }) + if (resp.status === 201) { + const keyword = { + id: resp.message.id, + keyword: resp.message.value, + software: id, + cnt: null + } + // add keyword after created + await onAdd(keyword) + }else{ + showErrorMessage(`Failed to save keyword. ${resp.message}`) + } + }else{ + showInfoMessage(`${selected.trim()} is already in the list`) + } + } + + async function onRemove(pos:number) { + const item = keywords[pos] + if (item.community && item.id){ + const resp = await deleteKeywordFromCommunity({ + community: item.community, + keyword: item.id, + token + }) + if (resp.status===200){ + const items=[ + ...keywords.slice(0,pos), + ...keywords.slice(pos+1) + ] + setKeywords(items) + // try to delete this keyword from keyword table + // delete will fail if the keyword is referenced + // therefore we do not check the status + const del = await silentKeywordDelete({ + keyword: item.keyword, + token + }) + }else{ + showErrorMessage(`Failed to delete keyword. ${resp.message}`) + } + } + } + + return ( +
    + +
    + {keywords.map((item, pos) => { + return( +
    + onRemove(pos)} + sx={{ + textTransform:'capitalize' + }} + /> +
    + ) + })} +
    +
    + ) +} diff --git a/frontend/components/communities/settings/general/AutosaveCommunityTextField.tsx b/frontend/components/communities/settings/general/AutosaveCommunityTextField.tsx new file mode 100644 index 000000000..7c3016f7c --- /dev/null +++ b/frontend/components/communities/settings/general/AutosaveCommunityTextField.tsx @@ -0,0 +1,71 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useFormContext} from 'react-hook-form' +import {useRouter} from 'next/router' + +import {useSession} from '~/auth' +import AutosaveControlledTextField, {OnSaveProps} from '~/components/form/AutosaveControlledTextField' +import {ControlledTextFieldOptions} from '~/components/form/ControlledTextField' +import useSnackbar from '~/components/snackbar/useSnackbar' +import {Community} from '~/components/admin/communities/apiCommunities' +import {patchCommunityTable} from '~/components/communities/apiCommunities' +import {useCommunityContext} from '~/components/communities/context' + +export type AutosaveCommunityTextFieldProps = { + options: ControlledTextFieldOptions + rules?: any +} + +export default function AutosaveCommunityTextField({options,rules}:AutosaveCommunityTextFieldProps) { + const router = useRouter() + const {token} = useSession() + const {community,updateCommunity} = useCommunityContext() + const {showErrorMessage} = useSnackbar() + const {control, resetField} = useFormContext() + + async function saveCommunityInfo({name, value}: OnSaveProps) { + // console.group('AutosaveCommunityTextField') + // console.log('name...', name) + // console.log('value...', value) + // console.log('id...', id) + // console.groupEnd() + // patch project table + const resp = await patchCommunityTable({ + id: community?.id ?? '', + data: { + [name]:value + }, + token + }) + + if (resp?.status !== 200) { + showErrorMessage(`Failed to save ${name}. ${resp?.message}`) + } else { + // debugger + updateCommunity({ + key: options.name, + value + }) + // debugger + resetField(options.name, { + defaultValue:value + }) + if (name === 'slug') { + const url = `/communities/${value}/settings?tab=general` + router.push(url, url, {scroll: false}) + } + } + } + + return ( + + ) +} diff --git a/frontend/components/communities/settings/general/CommunityAdminSection.tsx b/frontend/components/communities/settings/general/CommunityAdminSection.tsx new file mode 100644 index 000000000..7112a50a4 --- /dev/null +++ b/frontend/components/communities/settings/general/CommunityAdminSection.tsx @@ -0,0 +1,49 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useFormContext} from 'react-hook-form' + +import config from './config' +import AutosaveOrganisationTextField from './AutosaveCommunityTextField' + +export default function CommunityAdminSection() { + const {watch, control, resetField} = useFormContext() + const [ + id, slug, primary_maintainer + ] = watch([ + 'id', 'slug', 'primary_maintainer' + ]) + + return ( + <> +

    Admin section

    +
    + {/*
    Community ID: {id}
    */} + + +
    + + ) +} diff --git a/frontend/components/communities/settings/general/apiCommunityKeywords.ts b/frontend/components/communities/settings/general/apiCommunityKeywords.ts new file mode 100644 index 000000000..99628df94 --- /dev/null +++ b/frontend/components/communities/settings/general/apiCommunityKeywords.ts @@ -0,0 +1,90 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import logger from '~/utils/logger' +import {createJsonHeaders, extractReturnMessage, getBaseUrl} from '~/utils/fetchHelpers' + +export type CommunityKeyword = { + community: string + keyword: string +} + +export type KeywordForCommunity = { + id: string + community: string + keyword: string +} + +/** + * Loading community keywords for editing + * @param uuid + * @param token + * @returns + */ +export async function getKeywordsByCommunity(uuid:string,token?:string){ + try{ + const query = `rpc/keywords_by_community?community=eq.${uuid}&order=keyword.asc` + let url = `${getBaseUrl()}/${query}` + const resp = await fetch(url, { + method: 'GET', + headers: createJsonHeaders(token) + }) + if (resp.status===200){ + const data:KeywordForCommunity[] = await resp.json() + return data + } + logger(`getKeywordsByCommunity ${resp.status} ${resp.statusText}`,'warn') + return [] + }catch(e:any){ + logger(`getKeywordsByCommunity: ${e?.message}`,'error') + return [] + } +} + +export async function addKeywordsToCommunity({data, token}: + {data: CommunityKeyword | CommunityKeyword[], token: string }) { + try { + // POST + const url = '/api/v1/keyword_for_community' + const resp = await fetch(url, { + method: 'POST', + headers: { + ...createJsonHeaders(token), + // this will add new items and update existing + 'Prefer': 'resolution=merge-duplicates' + }, + body: JSON.stringify(data) + }) + return extractReturnMessage(resp, '') + } catch (e: any) { + logger(`addKeywordsToCommunity: ${e?.message}`, 'error') + return { + status: 500, + message: e?.message + } + } +} + +export async function deleteKeywordFromCommunity({community, keyword, token}: + { community: string, keyword: string, token: string }) { + try { + // DELETE record based on community and keyword uuid + const query = `keyword_for_community?community=eq.${community}&keyword=eq.${keyword}` + const url = `/api/v1/${query}` + const resp = await fetch(url, { + method: 'DELETE', + headers: { + ...createJsonHeaders(token) + } + }) + return extractReturnMessage(resp, community ?? '') + } catch (e: any) { + logger(`deleteKeywordFromCommunity: ${e?.message}`, 'error') + return { + status: 500, + message: e?.message + } + } +} diff --git a/frontend/components/communities/settings/general/config.ts b/frontend/components/communities/settings/general/config.ts new file mode 100644 index 000000000..383ef9232 --- /dev/null +++ b/frontend/components/communities/settings/general/config.ts @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +const config = { + name: { + label: 'Name', + help: 'Community name', + validation: { + required: 'Name is required', + minLength: {value: 2, message: 'Minimum length is 2'}, + maxLength: {value: 200, message: 'Maximum length is 200'}, + } + }, + short_description: { + label: 'Short description', + help: 'Short text used in the community card', + validation: { + minLength: {value: 6, message: 'Minimum length is 6'}, + maxLength: {value: 300, message: 'Maximum length is 300'}, + } + }, + slug: { + label: 'RSD path', + help: 'Use letters, numbers and dash "-". Other characters are not allowed.', + validation: { + required: 'Rsd path is required', + minLength: {value: 2, message: 'Minimum length is 2'}, + maxLength: {value: 200, message: 'Maximum length is 200'}, + pattern: { + value: /^[a-z0-9]+(-[a-z0-9]+)*$/, + message: 'Use letters, numbers and dash "-". Other characters are not allowed.' + } + } + }, + primary_maintainer: { + label: 'Primary maintainer', + help: 'Provide account id of the primary maintainer.', + validation: { + minLength: {value: 36, message: 'Minimum length is 36'}, + maxLength: {value: 36, message: 'Maximum length is 36'} + } + }, + keywords: { + label: 'Find or add keyword', + help: 'Select from top 30 list or start typing for more suggestions', + validation: { + //use in find keyword input box + minLength: 1, + } + }, +} + +export default config diff --git a/frontend/components/communities/settings/general/index.tsx b/frontend/components/communities/settings/general/index.tsx new file mode 100644 index 000000000..4656b28a0 --- /dev/null +++ b/frontend/components/communities/settings/general/index.tsx @@ -0,0 +1,89 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {FormProvider, useForm} from 'react-hook-form' + +import {useSession} from '~/auth' +import BaseSurfaceRounded from '~/components/layout/BaseSurfaceRounded' +import {useCommunityContext} from '~/components/communities/context' +import config from './config' +import CommunityAdminSection from './CommunityAdminSection' +import AutosaveCommunityTextField from './AutosaveCommunityTextField' +import AutosaveCommunityKeywords from './AutosaveCommunityKeywords' +import {EditCommunityProps} from '../../apiCommunities' + + +export default function CommunityGeneralSettings() { + const {user} = useSession() + const {community} = useCommunityContext() + const methods = useForm({ + mode: 'onChange', + defaultValues: community + }) + // extract used methods + const {watch, register} = methods + + const [name,short_description]=watch(['name','short_description']) + + // console.group('OrganisationGeneralSettings') + // console.log('short_description...', short_description) + // console.log('website....', website) + // console.log('isMaintainer....', isMaintainer) + // console.groupEnd() + + return ( + + +
    + {/* hidden inputs */} + + +

    General settings

    + + + +
    + + + + + {/* RSD admin section */} + {user?.role === 'rsd_admin' ? + + : null + } + +
    +
    + ) +} diff --git a/frontend/components/communities/settings/general/searchForCommunityKeyword.test.ts b/frontend/components/communities/settings/general/searchForCommunityKeyword.test.ts new file mode 100644 index 000000000..15cad532e --- /dev/null +++ b/frontend/components/communities/settings/general/searchForCommunityKeyword.test.ts @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {mockResolvedValueOnce} from '~/utils/jest/mockFetch' +import {searchForCommunityKeyword} from './searchForCommunityKeyword' + +beforeEach(() => { + jest.clearAllMocks() +}) + +it('searchForCommunityKeyword calls api with proper params', async() => { + const searchFor = 'Search for keyword' + const expectUrl = `/api/v1/rpc/keyword_count_for_community?keyword=ilike.*${encodeURIComponent(searchFor)}*&order=cnt.desc.nullslast,keyword.asc&limit=30` + const expectPayload = { + 'method': 'GET' + } + + mockResolvedValueOnce('OK') + + const resp = await searchForCommunityKeyword({searchFor}) + + // validate api call + expect(global.fetch).toBeCalledTimes(1) + expect(global.fetch).toBeCalledWith(expectUrl, expectPayload) +}) diff --git a/frontend/components/communities/settings/general/searchForCommunityKeyword.ts b/frontend/components/communities/settings/general/searchForCommunityKeyword.ts new file mode 100644 index 000000000..612a567c0 --- /dev/null +++ b/frontend/components/communities/settings/general/searchForCommunityKeyword.ts @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import logger from '~/utils/logger' +import {Keyword} from '~/components/keyword/FindKeyword' +import {getBaseUrl} from '~/utils/fetchHelpers' + + +// this is always frontend call +export async function searchForCommunityKeyword( + {searchFor}: { searchFor: string } +) { + try { + const searchForEncoded = encodeURIComponent(searchFor) + const baseUrl = getBaseUrl() + let query = '' + if (searchForEncoded) { + query = `keyword=ilike.*${searchForEncoded}*&order=cnt.desc.nullslast,keyword.asc&limit=30` + } else { + query = 'order=cnt.desc.nullslast,keyword.asc&limit=30' + } + // GET top 30 matches + const url = `${baseUrl}/rpc/keyword_count_for_community?${query}` + const resp = await fetch(url, { + method: 'GET' + }) + + if (resp.status === 200) { + const json: Keyword[] = await resp.json() + return json + } + // return extractReturnMessage(resp, project ?? '') + logger(`searchForCommunityKeyword: ${resp.status} ${resp.statusText}`, 'warn') + return [] + } catch (e: any) { + logger(`searchForCommunityKeyword: ${e?.message}`, 'error') + return [] + } +} + diff --git a/frontend/components/communities/settings/index.tsx b/frontend/components/communities/settings/index.tsx new file mode 100644 index 000000000..8827f361c --- /dev/null +++ b/frontend/components/communities/settings/index.tsx @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useSession} from '~/auth' +import UserAgreementModal from '~/components/user/settings/UserAgreementModal' +import ProtectedContent from '~/components/layout/ProtectedContent' +import BaseSurfaceRounded from '~/components/layout/BaseSurfaceRounded' +import SettingsNav from './SettingsNav' +import SettingsContent from './SettingsContent' + +export default function CommunitySettingsContent({isMaintainer}:{isMaintainer:boolean}) { + const {status,user} = useSession() + + return ( + + +
    + + + + {/* dynamic load of settings tabs */} + +
    +
    + ) +} diff --git a/frontend/components/communities/settings/maintainers/CommunityMaintainersIndex.test.tsx b/frontend/components/communities/settings/maintainers/CommunityMaintainersIndex.test.tsx new file mode 100644 index 000000000..6ae2058f3 --- /dev/null +++ b/frontend/components/communities/settings/maintainers/CommunityMaintainersIndex.test.tsx @@ -0,0 +1,243 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {fireEvent, render, screen, within} from '@testing-library/react' +import {WithAppContext, mockSession} from '~/utils/jest/WithAppContext' +import {WithCommunityContext} from '~/utils/jest/WithCommunityContext' + +import {defaultSession} from '~/auth' +import CommunityMaintainers from './index' +import mockCommunity from '../../__mocks__/mockCommunity' + +// MOCK user agreement call +// jest.mock('~/components/user/settings/useUserAgreements') + +// MOCK useCommunityMaintainers hook +const mockDeleteMaintainer = jest.fn() +const dummyMaintainersData={ + loading: false, + maintainers:[], + deleteMaintainer: mockDeleteMaintainer +} +const mockUseCommunityMaintainers = jest.fn((props)=>dummyMaintainersData) +jest.mock('./useCommunityMaintainers', () => ({ + useCommunityMaintainers:jest.fn((props)=>mockUseCommunityMaintainers(props)) +})) + +// MOCK useCommunityInvitations hook +const mockCreateInvitation = jest.fn() +const mockDeleteInvitation = jest.fn() +const dummyInvitationData={ + magicLink: null, + unusedInvitations:[], + createInvitation: mockCreateInvitation, + deleteInvitation: mockDeleteInvitation +} +const mockUseCommunityInvitations = jest.fn((props)=>dummyInvitationData) +jest.mock('./useCommunityInvitations', () => ({ + useCommunityInvitations:jest.fn((props)=>mockUseCommunityInvitations(props)) +})) + +const dummyProps = { + ...mockCommunity, + isMaintainer: false +} + +const dummyMaintainer = [ + {account: 'test-account-id-1', name: 'John Doe 1', email: 'test1@email.com', affiliation: 'Company 1', disableDelete: false}, + {account: 'test-account-id-2', name: 'John Doe 2', email: null, affiliation: null, disableDelete: false}, +] + +const dummyInvitations = [ + {id:'test-link-id-1',created_at: new Date().toISOString(),type:'community'}, + {id:'test-link-id-2',created_at: new Date().toISOString(),type:'community'}, + {id:'test-link-id-3',created_at: new Date().toISOString(),type:'community'} +] + +describe('frontend/components/organisation/maintainers/index.tsx', () => { + + beforeEach(() => { + // reset mock counters + jest.clearAllMocks() + }) + + it('shows loader when hook returns loading=true', () => { + // user is authenticated + defaultSession.status = 'authenticated' + defaultSession.token = 'test-token' + // it is maintainer of this organisation + dummyProps.isMaintainer = true + dummyMaintainersData.loading = true + // mock hook return with loading true + mockUseCommunityMaintainers.mockReturnValueOnce(dummyMaintainersData) + + render( + + + + + + ) + + const loader = screen.getByRole('progressbar') + expect(loader).toBeInTheDocument() + }) + + it('shows "No maintainers" message', async () => { + // user is authenticated + defaultSession.status = 'authenticated' + defaultSession.token = 'test-token' + // it is maintainer of this organisation + dummyProps.isMaintainer = true + dummyMaintainersData.loading = false + // mock hook return with loading true + mockUseCommunityMaintainers.mockReturnValueOnce(dummyMaintainersData) + + render( + + + + + + ) + const noMaintainers = await screen.findByText('No maintainers') + expect(noMaintainers).toBeInTheDocument() + }) + + it('renders component with "Generate invite link" button', () => { + // it is maintainer of this organisation + dummyProps.isMaintainer = true + dummyMaintainersData.loading = false + // mock hook return with loading true + mockUseCommunityMaintainers.mockReturnValueOnce(dummyMaintainersData) + + render( + + + + + + ) + + const inviteBtn = screen.getByRole('button', {name: 'Generate invite link'}) + expect(inviteBtn).toBeInTheDocument() + // screen.debug() + }) + + it('shows maintainer name (in the list)', async () => { + // MOCK maintainers call + const dummyRawMaintainers = [{ + 'maintainer': 'a050aaf3-9c46-490c-ade3-aeeb6a05b1d1', + 'name': 'Jordan Ross Belfort', + 'email': 'Jordan.Belfort@harvard-example.edu', + 'affiliation': 'harvard-example.edu', + 'is_primary': false + }] + // user is authenticated + defaultSession.status = 'authenticated' + defaultSession.token = 'test-token' + dummyMaintainersData.maintainers = dummyRawMaintainers as any + dummyMaintainersData.loading = false + // mock hook return with loading true + mockUseCommunityMaintainers.mockReturnValueOnce(dummyMaintainersData) + // it is maintainer of this organisation + dummyProps.isMaintainer = true + + render( + + + + + + ) + + const maintainer = await screen.findByText(dummyRawMaintainers[0].name) + expect(maintainer).toBeInTheDocument() + }) + + it('shows maintainer list with all items', () => { + dummyMaintainersData.maintainers = dummyMaintainer as any + dummyMaintainersData.loading = false + // mock hook return with loading true + mockUseCommunityMaintainers.mockReturnValueOnce(dummyMaintainersData) + // it is maintainer of this organisation + dummyProps.isMaintainer = true + + render( + + + + + + ) + + const maintainerItem = screen.getAllByTestId('maintainer-list-item') + expect(maintainerItem.length).toEqual(dummyMaintainer.length) + }) + + it('maintainer cannot be deleted when disableDelete===true', () => { + // set disable flag on first item + dummyMaintainer[0].disableDelete = true + dummyMaintainersData.maintainers = dummyMaintainer as any + dummyMaintainersData.loading = false + // mock hook return with loading true + mockUseCommunityMaintainers.mockReturnValueOnce(dummyMaintainersData) + // it is maintainer of this organisation + dummyProps.isMaintainer = true + + render( + + + + + + ) + + const maintainerItem = screen.getAllByTestId('maintainer-list-item') + const deleteBtn = within(maintainerItem[0]).getByRole('button',{name:'delete'}) + expect(deleteBtn).toBeDisabled() + }) + + it('calls createInvitation method to create new invitation',()=>{ + // it is maintainer of this organisation + dummyProps.isMaintainer = true + + render( + + + + + + ) + + // click on generate invite + const btnInvite = screen.getByRole('button',{name:'Generate invite link'}) + fireEvent.click(btnInvite) + + expect(mockCreateInvitation).toBeCalledTimes(1) + }) + + it('shows unused links list',()=>{ + // it is maintainer of this organisation + dummyProps.isMaintainer = true + dummyInvitationData.magicLink = null + dummyInvitationData.unusedInvitations = dummyInvitations as any + + mockUseCommunityInvitations.mockReturnValueOnce(dummyInvitationData) + + render( + + + + + + ) + + // check number of unused invitations + const unusedInvites = screen.getAllByTestId('unused-invitation-item') + expect(unusedInvites.length).toEqual(dummyInvitations.length) + }) + +}) diff --git a/frontend/components/communities/settings/maintainers/CommunityMaintainersLinks.tsx b/frontend/components/communities/settings/maintainers/CommunityMaintainersLinks.tsx new file mode 100644 index 000000000..390d3427e --- /dev/null +++ b/frontend/components/communities/settings/maintainers/CommunityMaintainersLinks.tsx @@ -0,0 +1,47 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import Button from '@mui/material/Button' +import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh' + +import InvitationList from '~/components/maintainers/InvitationList' +import {useCommunityContext} from '~/components/communities/context' +import {useCommunityInvitations} from './useCommunityInvitations' + +export default function CommunityMaintainerLinks() { + const {community} = useCommunityContext() + const {unusedInvitations,createInvitation,deleteInvitation} = useCommunityInvitations({community:community?.id ?? ''}) + + // console.group('CommunityMaintainerLinks') + // console.log('id...', id) + // console.log('name...', name) + // console.log('magicLink...', magicLink) + // console.log('unusedInvitations...', unusedInvitations) + // console.groupEnd() + + return ( + <> + +
    + + + ) +} diff --git a/frontend/components/communities/settings/maintainers/apiCommunityMaintainers.ts b/frontend/components/communities/settings/maintainers/apiCommunityMaintainers.ts new file mode 100644 index 000000000..babc90fe1 --- /dev/null +++ b/frontend/components/communities/settings/maintainers/apiCommunityMaintainers.ts @@ -0,0 +1,102 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {createJsonHeaders, extractReturnMessage, getBaseUrl} from '~/utils/fetchHelpers' +import logger from '~/utils/logger' + +export type MaintainerOfCommunity = { + // unique maintainer id + maintainer: string + name: string[] + email: string[] + affiliation: string[], + is_primary?: boolean +} + +export async function getMaintainersOfCommunity({community, token}: + { community: string, token: string}) { + try { + let query = `rpc/maintainers_of_community?community_id=${community}` + let url = `${getBaseUrl()}/${query}` + + const resp = await fetch(url, { + method: 'GET', + headers: createJsonHeaders(token) + }) + + if (resp.status === 200) { + const json: MaintainerOfCommunity[] = await resp.json() + return json + } + // ERRORS + logger(`getMaintainersOfCommunity: ${resp.status}:${resp.statusText} community: ${community}`, 'warn') + return [] + } catch (e: any) { + logger(`getMaintainersOfCommunity: ${e?.message}`, 'error') + return [] + } +} + +export async function deleteMaintainerFromCommunity({maintainer,community,token}: + {maintainer:string,community:string,token:string}) { + try { + let query = `maintainer_for_community?maintainer=eq.${maintainer}&community=eq.${community}` + let url = `${getBaseUrl()}/${query}` + + const resp = await fetch(url, { + method: 'DELETE', + headers: createJsonHeaders(token) + }) + + return extractReturnMessage(resp) + + } catch (e: any) { + logger(`deleteMaintainerFromCommunity: ${e?.message}`, 'error') + return { + status: 500, + message: e?.message + } + } +} + +export async function communityMaintainerLink({community, account, token}: + { community: string, account: string, token: string }) { + try { + // POST + const url = `${getBaseUrl()}/invite_maintainer_for_community` + const resp = await fetch(url, { + method: 'POST', + headers: { + ...createJsonHeaders(token), + 'Prefer': 'return=headers-only' + }, + body: JSON.stringify({ + community, + created_by:account + }) + }) + if (resp.status === 201) { + const id = resp.headers.get('location')?.split('.')[1] + if (id) { + const link = `${location.origin}/invite/community/${id}` + return { + status: 201, + message: link + } + } + return { + status: 400, + message: 'Id is missing' + } + } + return extractReturnMessage(resp, community ?? '') + } catch (e: any) { + logger(`communityMaintainerLink: ${e?.message}`, 'error') + return { + status: 500, + message: e?.message + } + } +} diff --git a/frontend/components/communities/settings/maintainers/index.tsx b/frontend/components/communities/settings/maintainers/index.tsx new file mode 100644 index 000000000..413320251 --- /dev/null +++ b/frontend/components/communities/settings/maintainers/index.tsx @@ -0,0 +1,99 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useState} from 'react' +import BaseSurfaceRounded from '~/components/layout/BaseSurfaceRounded' +import EditSectionTitle from '~/components/layout/EditSectionTitle' +import ContentLoader from '~/components/layout/ContentLoader' +import ConfirmDeleteModal from '~/components/layout/ConfirmDeleteModal' +import MaintainersList from '~/components/maintainers/MaintainersList' +import {maintainers as config} from '~/components/projects/edit/maintainers/config' +import {useCommunityContext} from '~/components/communities/context' +import {useCommunityMaintainers} from './useCommunityMaintainers' +import CommunityMaintainerLinks from './CommunityMaintainersLinks' + +type DeleteModal = { + open: boolean, + // unique account id + account?: string, + displayName?: string +} + +export default function CommunityMaintainersPage() { + const {community} = useCommunityContext() + const {loading,maintainers,deleteMaintainer} = useCommunityMaintainers({community: community?.id}) + const [modal, setModal] = useState({ + open: false + }) + + // console.group('CommunityMaintainersPage') + // console.log('id...', id) + // console.log('modal...', modal) + // console.log('maintainers...', maintainers) + // console.log('loading...', loading) + // console.groupEnd() + + if (loading) { + return ( + + ) + } + + function closeModal() { + setModal({ + open: false, + }) + } + + function onDeleteMaintainer(pos: number) { + const maintainer = maintainers[pos] + if (maintainer) { + setModal({ + open: true, + account: maintainer.account, + displayName: maintainer.name + }) + } + } + + return ( + <> + +
    + + +
    +
    + + +
    +
    + Are you sure you want to remove {modal.displayName ?? 'No name'}?

    + } + onCancel={closeModal} + onDelete={()=>{ + deleteMaintainer(modal.account) + closeModal() + }} + /> + + ) +} + diff --git a/frontend/components/communities/settings/maintainers/useCommunityInvitations.tsx b/frontend/components/communities/settings/maintainers/useCommunityInvitations.tsx new file mode 100644 index 000000000..aaadb3638 --- /dev/null +++ b/frontend/components/communities/settings/maintainers/useCommunityInvitations.tsx @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useCallback, useEffect, useState} from 'react' + +import {useSession} from '~/auth' +import {Invitation, deleteMaintainerLink, getUnusedInvitations} from '~/components/maintainers/apiMaintainers' +import {communityMaintainerLink} from './apiCommunityMaintainers' +import useSnackbar from '~/components/snackbar/useSnackbar' + +export function useCommunityInvitations({community}:{community?:string}) { + const {token,user} = useSession() + const {showErrorMessage} = useSnackbar() + const [unusedInvitations,setUnusedInvitations] = useState([]) + const [magicLink, setMagicLink] = useState(null) + + const loadUnusedInvitations = useCallback(()=>{ + // get unused invitation + getUnusedInvitations({ + id: community ?? '', + type: 'community', + token + }).then(items=>{ + // update + setUnusedInvitations(items) + }).catch(e=>{ + // update on error to empty array + setUnusedInvitations([]) + }) + },[community,token]) + + useEffect(()=>{ + let abort = false + if (community && token){ + loadUnusedInvitations() + } + return ()=>{abort=true} + },[community,token,loadUnusedInvitations]) + + const createInvitation = useCallback(async()=>{ + if (community && user?.account){ + const resp = await communityMaintainerLink({ + community, + account: user?.account, + token + }) + if (resp.status===201){ + // set magic link prop to new link + setMagicLink(resp.message) + // reload unused invitations + loadUnusedInvitations() + }else{ + showErrorMessage(`Failed to create invitation. ${resp.message}`) + } + } + // IGNORE showErrorMessage dependency + // eslint-disable-next-line react-hooks/exhaustive-deps + },[community,user?.account,token,loadUnusedInvitations]) + + const deleteInvitation = useCallback(async(invitation:Invitation)=>{ + const resp = await deleteMaintainerLink({ + invitation, + token + }) + if (resp.status===200){ + loadUnusedInvitations() + }else{ + showErrorMessage(`Failed to delete invitation. ${resp.message}`) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + },[token,loadUnusedInvitations]) + + return { + magicLink, + unusedInvitations, + deleteInvitation, + createInvitation + } +} diff --git a/frontend/components/communities/settings/maintainers/useCommunityMaintainers.tsx b/frontend/components/communities/settings/maintainers/useCommunityMaintainers.tsx new file mode 100644 index 000000000..040e0f674 --- /dev/null +++ b/frontend/components/communities/settings/maintainers/useCommunityMaintainers.tsx @@ -0,0 +1,67 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useState,useEffect} from 'react' + +import {useSession} from '~/auth' +import useSnackbar from '~/components/snackbar/useSnackbar' +import {MaintainerProps, rawMaintainersToMaintainers} from '~/components/maintainers/apiMaintainers' +import {deleteMaintainerFromCommunity, getMaintainersOfCommunity} from './apiCommunityMaintainers' + +export function useCommunityMaintainers({community}:{community?: string}) { + const {token} = useSession() + const {showErrorMessage} = useSnackbar() + const [maintainers, setMaintainers] = useState([]) + const [loading, setLoading] = useState(true) + + useEffect(() => { + let abort = false + async function getMaintainers() { + if (community && token) { + setLoading(true) + + const raw_maintainers = await getMaintainersOfCommunity({ + community, + token + }) + const maintainers = rawMaintainersToMaintainers(raw_maintainers) + + if (abort) return null + // update maintainers state + setMaintainers(maintainers) + // update loading flag + setLoading(false) + } + } + + getMaintainers() + + return ()=>{abort=true} + }, [community,token]) + + async function deleteMaintainer(account?: string) { + // console.log('delete maintainer...pos...', pos) + if (account && community) { + const resp = await deleteMaintainerFromCommunity({ + maintainer: account, + community, + token + }) + if (resp.status === 200) { + // remove account + const newMaintainersList = maintainers.filter(item=>item.account!==account) + setMaintainers(newMaintainersList) + } else { + showErrorMessage(`Failed to remove maintainer. ${resp.message}`) + } + } + } + + return { + loading, + maintainers, + deleteMaintainer + } +} diff --git a/frontend/components/communities/tabs/CommunityTabItems.tsx b/frontend/components/communities/tabs/CommunityTabItems.tsx index 9a9ac794f..30f198a13 100644 --- a/frontend/components/communities/tabs/CommunityTabItems.tsx +++ b/frontend/components/communities/tabs/CommunityTabItems.tsx @@ -1,7 +1,5 @@ -// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) (dv4all) -// SPDX-FileCopyrightText: 2023 dv4all +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 diff --git a/frontend/components/communities/tabs/index.tsx b/frontend/components/communities/tabs/index.tsx index f8dad7c73..dc4f57a69 100644 --- a/frontend/components/communities/tabs/index.tsx +++ b/frontend/components/communities/tabs/index.tsx @@ -19,12 +19,10 @@ type CommunityTabsProps={ } export default function CommunityTabs({ - tab,software_cnt,description, - isMaintainer}:CommunityTabsProps) { + tab,software_cnt,description,isMaintainer +}:CommunityTabsProps) { const router = useRouter() - // default tab is software - // let select_tab:TabKey = 'software' return ( { - const query:any={ - slug: router.query['slug'], - tab: value, + // create url + const url:any={ + pathname:`/communities/[slug]/${value}`, + query:{ + slug: router.query['slug'] + } } // add default order for software and project tabs if (value === 'software') { - query['order'] = 'is_featured' + url.query['order'] = 'is_featured' } // push route change - router.push({query},undefined,{scroll:false}) + router.push(url,undefined,{scroll:false}) }} aria-label="community tabs" > @@ -59,6 +60,9 @@ export default function CommunityTabs({ software_cnt, })} value={key} + sx={{ + minWidth:'9rem' + }} /> }})} diff --git a/frontend/components/feedback/FeedbackPanelButton.test.tsx b/frontend/components/feedback/FeedbackPanelButton.test.tsx index 10b1060db..e681aa371 100644 --- a/frontend/components/feedback/FeedbackPanelButton.test.tsx +++ b/frontend/components/feedback/FeedbackPanelButton.test.tsx @@ -1,5 +1,9 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 -import {render, screen} from '@testing-library/react' +import {fireEvent, render, screen, within} from '@testing-library/react' import FeedbackPanelButton from './FeedbackPanelButton' // todo: add tests for FeedbackPanelButton @@ -10,6 +14,27 @@ it('it has feedback button', () => { issues_page_url="test-issue-url" /> ) - const btn = screen.getByRole('button',{name:'Send feedback'}) + const btn = screen.getByTestId('feedback-button') expect(btn).toBeInTheDocument() + expect(btn).toBeEnabled() +}) + +it('shows feedback dialog with cancel and sendfeedback', () => { + render( + + ) + // click feedback button + const btn = screen.getByTestId('feedback-button') + fireEvent.click(btn) + + + const dialog = screen.getByRole('dialog') + // has cancel button + const cancel = within(dialog).getByRole('button',{name:'Cancel'}) + // has save link + const send = within(dialog).getByRole('link',{name:'Send feedback'}) + // screen.debug() }) diff --git a/frontend/components/feedback/FeedbackPanelButton.tsx b/frontend/components/feedback/FeedbackPanelButton.tsx index 4802c07b0..830270bf5 100644 --- a/frontend/components/feedback/FeedbackPanelButton.tsx +++ b/frontend/components/feedback/FeedbackPanelButton.tsx @@ -1,19 +1,18 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 - 2023 dv4all -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 // import * as React from 'react' import {useState} from 'react' -import {MailOutlineOutlined} from '@mui/icons-material' +import MailOutlineOutlined from '@mui/icons-material/MailOutlineOutlined' import Dialog from '@mui/material/Dialog' import useMediaQuery from '@mui/material/useMediaQuery' import {useTheme} from '@mui/material/styles' import LinkIcon from '@mui/icons-material/Link' import WebIcon from '@mui/icons-material/Web' -import Divider from '@mui/material/Divider' import CaretIcon from '~/components/icons/caret.svg' import getBrowser from '~/utils/getBrowser' @@ -63,20 +62,14 @@ User Agent: ${navigator.userAgent}` return (
    - {/* If desktop size */} - - {/*If mobile size */} -
    - - -
    + } + + // rsd_admin has full access + if (status === 'authenticated' && role==='rsd_admin') { + logger('ProtectedContent...authenticated user...rsd_admin', 'info') + return children + } + + // authenticated maintainer has access + if (status === 'authenticated' && isMaintainer===true) { + logger('ProtectedContent...authenticated user...isMaintainer', 'info') + return children + } + + // 403 FORBIDDEN + if (status === 'authenticated' && isMaintainer===false){ + logger('ProtectedContent...403...FORBIDDEN', 'info') + return ( + + ) + } + + // ELSE 401 + logger('ProtectedContent...401...FORBIDDEN', 'info') + return ( + + ) +} diff --git a/frontend/components/maintainers/InvitationList.tsx b/frontend/components/maintainers/InvitationList.tsx new file mode 100644 index 000000000..614ab9c29 --- /dev/null +++ b/frontend/components/maintainers/InvitationList.tsx @@ -0,0 +1,98 @@ +// SPDX-FileCopyrightText: 2022 - 2024 Netherlands eScience Center +// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) +// SPDX-FileCopyrightText: 2022 Ewan Cahen (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2022 dv4all +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// +// SPDX-License-Identifier: Apache-2.0 + +import List from '@mui/material/List' +import ListItem from '@mui/material/ListItem' +import CopyIcon from '@mui/icons-material/ContentCopy' +import DeleteIcon from '@mui/icons-material/Delete' +import EmailIcon from '@mui/icons-material/Email' +import IconButton from '@mui/material/IconButton' +import ListItemText from '@mui/material/ListItemText' + +import copyToClipboard from '~/utils/copyToClipboard' +import useSnackbar from '~/components/snackbar/useSnackbar' +import EditSectionTitle from '~/components/layout/EditSectionTitle' +import {Invitation} from './apiMaintainers' + + +type InvitationListProps={ + subject:string + body:string + invitations: Invitation[], + onDelete: (invitation:Invitation)=>Promise +} + +export default function InvitationList({subject,body,invitations,onDelete}:InvitationListProps) { + const {showErrorMessage, showInfoMessage} = useSnackbar() + + async function toClipboard(message?: string) { + if (message) { + const copied = await copyToClipboard(message) + // notify user about copy action + if (copied) { + showInfoMessage('Copied to clipboard') + } else { + showErrorMessage(`Failed to copy link ${message}`) + } + } + } + + if(invitations.length === 0) return null + + return ( + <> + + + {invitations.map(inv => { + const currentLink = `${location.origin}/invite/${inv.type}/${inv.id}` + return ( + + + + + toClipboard(currentLink)}> + + + onDelete(inv)}> + + +
    + } + sx={{ + // make space for 3 buttons + paddingRight:'9rem' + }} + > + + + ) + })} + + + ) +} diff --git a/frontend/components/projects/edit/maintainers/ProjectMaintainer.tsx b/frontend/components/maintainers/MaintainerItem.tsx similarity index 81% rename from frontend/components/projects/edit/maintainers/ProjectMaintainer.tsx rename to frontend/components/maintainers/MaintainerItem.tsx index 7877cfd8b..8a8cf738a 100644 --- a/frontend/components/projects/edit/maintainers/ProjectMaintainer.tsx +++ b/frontend/components/maintainers/MaintainerItem.tsx @@ -1,5 +1,7 @@ // SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 dv4all +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 @@ -9,20 +11,19 @@ import ListItemAvatar from '@mui/material/ListItemAvatar' import DeleteIcon from '@mui/icons-material/Delete' import IconButton from '@mui/material/IconButton' -import {MaintainerOfProject} from './useProjectMaintainer' -import ContributorAvatar from '~/components/software/ContributorAvatar' import {getDisplayInitials, splitName} from '~/utils/getDisplayName' +import ContributorAvatar from '~/components/software/ContributorAvatar' +import {MaintainerProps} from './apiMaintainers' -type ProjectMaintainerProps = { +type MaintainerItemProps = { pos:number - maintainer: MaintainerOfProject - onEdit: (pos: number) => void + maintainer: MaintainerProps onDelete: (pos: number) => void disableDelete?: boolean } -export default function ProjectMaintainer({pos, maintainer, onEdit, onDelete, disableDelete}: ProjectMaintainerProps) { +export default function MaintainerItem({pos, maintainer, onDelete, disableDelete}: MaintainerItemProps) { const {name, email, affiliation} = maintainer const displayInitials = getDisplayInitials(splitName(name)) return ( diff --git a/frontend/components/maintainers/MaintainersList.tsx b/frontend/components/maintainers/MaintainersList.tsx new file mode 100644 index 000000000..c9b5da27d --- /dev/null +++ b/frontend/components/maintainers/MaintainersList.tsx @@ -0,0 +1,52 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import Alert from '@mui/material/Alert' +import AlertTitle from '@mui/material/AlertTitle' +import List from '@mui/material/List' + +import MaintainerItem from './MaintainerItem' +import {MaintainerProps} from './apiMaintainers' + + +type MaintainerListProps = { + maintainers: MaintainerProps[] + onDelete:(pos:number)=>void +} + +export default function MaintainersList({maintainers,onDelete}:MaintainerListProps) { + + if (maintainers.length === 0) { + return ( + + No maintainers + Add maintainer by using invite link button! + + ) + } + + function renderList() { + return maintainers.map((item, pos) => { + return ( + + ) + }) + } + + return ( + + {renderList()} + + ) +} diff --git a/frontend/components/maintainers/apiMaintainers.ts b/frontend/components/maintainers/apiMaintainers.ts new file mode 100644 index 000000000..bd47b7352 --- /dev/null +++ b/frontend/components/maintainers/apiMaintainers.ts @@ -0,0 +1,122 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import logger from '~/utils/logger' +import {createJsonHeaders, extractReturnMessage, getBaseUrl} from '~/utils/fetchHelpers' + +export type RawMaintainerProps = { + // unique maintainer id + maintainer: string + name: string[] + email: string[] + affiliation: string[], + is_primary?: boolean +} + +export type MaintainerProps = { + // unique maintainer id + account: string + name: string + email: string + affiliation: string, + // primary maintainer cannot be deleted + // last maintainer can be deleted only by rsd-admin + disableDelete?: boolean +} + +export function rawMaintainersToMaintainers(raw_maintainers: RawMaintainerProps[]) { + try { + const maintainers:MaintainerProps[] = [] + raw_maintainers.forEach(item => { + let maintainerWithMostInfo: MaintainerProps | null = null + let bestScore = -1 + // use name as second loop indicator + item.name.forEach((name, pos) => { + let score = 0 + if (name) { + score += 1 + } + if (item.email[pos]) { + score += 1 + } + if (item.affiliation[pos]) { + score += 1 + } + + if (score <= bestScore) { + return + } + const maintainer: MaintainerProps = { + account: item.maintainer, + name, + email: item.email[pos] ? item.email[pos] : '', + affiliation: item.affiliation[pos] ? item.affiliation[pos] : '', + // primary maintainer cannot be deleted + disableDelete: item?.is_primary ?? false + } + + maintainerWithMostInfo = maintainer + bestScore = score + }) + maintainers.push(maintainerWithMostInfo as unknown as MaintainerProps) + }) + return maintainers + } catch (e:any) { + logger(`rawMaintainersToMaintainers: ${e?.message}`,'error') + return [] + } +} + +export async function deleteMaintainerLink({invitation,token}:{invitation: Invitation,token:string}) { + try{ + const query = `invite_maintainer_for_${invitation.type}?id=eq.${invitation.id}` + const url = `${getBaseUrl()}/${query}` + const resp = await fetch(url, { + headers: createJsonHeaders(token), + method: 'DELETE' + }) + return extractReturnMessage(resp) + }catch(e:any){ + return { + status:500, + message: e.message + } + } +} + +export type InvitationType = 'software' | 'project' | 'organisation' | 'community' + +export type Invitation = { + id: string, + created_at: string, + expires_at: string, + type: InvitationType +} + +type getUnusedInvitationsProps={ + id: string, + type: InvitationType + token?: string +} + +export async function getUnusedInvitations({id,type,token}:getUnusedInvitationsProps) { + try{ + const query = `invite_maintainer_for_${type}?select=id,created_at,expires_at&order=created_at&${type}=eq.${id}&claimed_by=is.null&claimed_at=is.null` + + const url = `${getBaseUrl()}/${query}` + + const resp = await fetch(url, { + headers: createJsonHeaders(token) + }) + const invitations: Invitation[] = await resp.json() + invitations.forEach(invitation => { + invitation.type = type + }) + return invitations + }catch(e:any){ + logger(`getUnusedInvitations: ${e?.message}`,'error') + return [] + } +} diff --git a/frontend/components/organisation/ProtectedOrganisationPage.tsx b/frontend/components/organisation/ProtectedOrganisationPage.tsx deleted file mode 100644 index e2baff747..000000000 --- a/frontend/components/organisation/ProtectedOrganisationPage.tsx +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2022 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import {useSession} from '~/auth' -import PageErrorMessage from '../layout/PageErrorMessage' - -type ProtectOrganisationPageProps={ - children: any, - isMaintainer: boolean -} - -export default function ProtectedOrganisationPage({children,isMaintainer}:ProtectOrganisationPageProps) { - const {status,user} = useSession() - // not authenticated - if (status !== 'authenticated') { - return ( - - ) - } - // authenticated but not the maintainer or rsd_admin = 403 - if (status === 'authenticated' && - user?.role !== 'rsd_admin' && - isMaintainer === false) { - return ( - - ) - } - // authenticated mantainer or rsd_admin - // can see the content (children) - return children -} diff --git a/frontend/components/organisation/about/index.tsx b/frontend/components/organisation/about/index.tsx index 07f11e098..b8ad614a0 100644 --- a/frontend/components/organisation/about/index.tsx +++ b/frontend/components/organisation/about/index.tsx @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 - 2023 dv4all -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 @@ -27,7 +27,7 @@ export function AboutPagePlaceholder() { About section not defined

    - The about section is not visible to vistors because it does not have any content. + The about section is not visible to visitors because it does not have any content.

    To activate the about section, add content to the about section @@ -43,8 +43,8 @@ export default function AboutPage() { if (description) { return ( ({ }) export function OrganisationProvider(props: any) { - // desctucture organisation + // destucture organisation const {organisation:initOrganisation, isMaintainer:initMaintainer} = props // set state - use initOrganisation at start const [organisation, setOrganisation] = useState(initOrganisation) diff --git a/frontend/components/organisation/settings/SettingsNav.tsx b/frontend/components/organisation/settings/SettingsNav.tsx index 46856463e..390eb6b2f 100644 --- a/frontend/components/organisation/settings/SettingsNav.tsx +++ b/frontend/components/organisation/settings/SettingsNav.tsx @@ -14,7 +14,7 @@ import ListItemText from '@mui/material/ListItemText' import {editMenuItemButtonSx} from '~/config/menuItems' import {settingsMenu} from './SettingsNavItems' -export default function SettingsNav() { +export default function OrganisationSettingsNav() { const router = useRouter() const settings = router.query['settings'] ?? 'general' // console.group('OrganisationNav') diff --git a/frontend/components/organisation/settings/general/AutosaveOrganisationTextField.tsx b/frontend/components/organisation/settings/general/AutosaveOrganisationTextField.tsx index 0ef55708b..6dc9eaf2a 100644 --- a/frontend/components/organisation/settings/general/AutosaveOrganisationTextField.tsx +++ b/frontend/components/organisation/settings/general/AutosaveOrganisationTextField.tsx @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 dv4all -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2024 Christian Meeßen (GFZ) // SPDX-FileCopyrightText: 2024 Helmholtz Centre Potsdam - GFZ German Research Centre for Geosciences // @@ -40,7 +40,7 @@ export default function AutosaveOrganisationTextField({options,rules}:AutosaveOr token }) - // console.group('AutosaveSoftwareTextField') + // console.group('AutosaveOrganisationTextField') // console.log('saved...', options.name) // console.log('value...', value) // console.log('status...', resp?.status) diff --git a/frontend/components/organisation/settings/index.tsx b/frontend/components/organisation/settings/index.tsx index 3c9601eee..7be04817d 100644 --- a/frontend/components/organisation/settings/index.tsx +++ b/frontend/components/organisation/settings/index.tsx @@ -7,20 +7,23 @@ // // SPDX-License-Identifier: Apache-2.0 -import ProtectedOrganisationPage from '../ProtectedOrganisationPage' +import {useSession} from '~/auth' import UserAgreementModal from '~/components/user/settings/UserAgreementModal' import useOrganisationContext from '../context/useOrganisationContext' import BaseSurfaceRounded from '~/components/layout/BaseSurfaceRounded' import SettingsNav from './SettingsNav' import SettingsPageContent from './SettingsPageContent' +import ProtectedContent from '~/components/layout/ProtectedContent' -// const formId='organisation-settings-form' export default function OrganisationSettings() { const {isMaintainer} = useOrganisationContext() + const {status,user} = useSession() return ( - @@ -33,6 +36,6 @@ export default function OrganisationSettings() { {/* dynamic load of settings page */}
    - + ) } diff --git a/frontend/components/organisation/settings/maintainers/OrganisationMaintainerLink.tsx b/frontend/components/organisation/settings/maintainers/OrganisationMaintainerLink.tsx deleted file mode 100644 index f23af1385..000000000 --- a/frontend/components/organisation/settings/maintainers/OrganisationMaintainerLink.tsx +++ /dev/null @@ -1,115 +0,0 @@ -// SPDX-FileCopyrightText: 2022 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2022 Ewan Cahen (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2022 dv4all -// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) -// -// SPDX-License-Identifier: Apache-2.0 - -import {useEffect, useState} from 'react' -import Button from '@mui/material/Button' -import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh' -import EmailIcon from '@mui/icons-material/Email' -import CopyIcon from '@mui/icons-material/ContentCopy' - -import {copyToClipboard,canCopyToClipboard} from '~/utils/copyToClipboard' -import useSnackbar from '~/components/snackbar/useSnackbar' -import {organisationMaintainerLink} from './useOrganisationMaintainers' -import InvitationList from '~/components/layout/InvitationList' -import {Invitation} from '~/types/Invitation' -import {getUnusedInvitations} from '~/utils/getUnusedInvitations' -import CopyToClipboard from '~/components/layout/CopyToClipboard' - -export default function OrganisationMaintainerLink({organisation, name, account, token}: - {organisation: string, name: string, account: string, token: string}) { - const {showErrorMessage,showInfoMessage} = useSnackbar() - const [magicLink, setMagicLink] = useState(null) - const [unusedInvitations, setUnusedInvitations] = useState([]) - const canCopy = useState(canCopyToClipboard()) - - async function fetchUnusedInvitations() { - setUnusedInvitations(await getUnusedInvitations('organisation', organisation, token)) - } - - // eslint-disable-next-line react-hooks/exhaustive-deps - useEffect(() => {fetchUnusedInvitations()}, []) - - async function createInviteLink() { - const resp = await organisationMaintainerLink({ - organisation, - account, - token - }) - if (resp.status === 201) { - setMagicLink(resp.message) - fetchUnusedInvitations() - } else { - showErrorMessage(`Failed to generate maintainer link. ${resp.message}`) - } - } - - async function toClipboard() { - if (magicLink) { - // copy doi to clipboard - const copied = await copyToClipboard(magicLink) - // notify user about copy action - if (copied) { - showInfoMessage('Copied to clipboard') - } else { - showErrorMessage(`Failed to copy link ${magicLink}`) - } - } - } - - function renderLinkOptions() { - if (magicLink) { - return ( -
    -

    {magicLink}

    -
    - - - -
    -
    - ) - } - return null - } - - return ( - <> - - {renderLinkOptions()} -
    - fetchUnusedInvitations()} - /> - - ) -} diff --git a/frontend/components/organisation/settings/maintainers/OrganisationMaintainerLinks.tsx b/frontend/components/organisation/settings/maintainers/OrganisationMaintainerLinks.tsx new file mode 100644 index 000000000..c5ef5c6db --- /dev/null +++ b/frontend/components/organisation/settings/maintainers/OrganisationMaintainerLinks.tsx @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import Button from '@mui/material/Button' +import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh' + +import InvitationList from '~/components/maintainers/InvitationList' +import useOrganisationContext from '~/components/organisation/context/useOrganisationContext' +import {useOrganisationInvitations} from './useOrganisationInvitations' + +export default function OrganisationMaintainerLinks() { + const {id,name} = useOrganisationContext() + const { + unusedInvitations,magicLink, + createInvitation,deleteInvitation + } = useOrganisationInvitations({organisation:id}) + + // console.group('OrganisationMaintainerLinks') + // console.log('id...', id) + // console.log('name...', name) + // console.log('magicLink...', magicLink) + // console.log('unusedInvitations...', unusedInvitations) + // console.groupEnd() + + return ( + <> + +
    + + + ) +} diff --git a/frontend/components/organisation/settings/maintainers/OrganisationMaintainersIndex.test.tsx b/frontend/components/organisation/settings/maintainers/OrganisationMaintainersIndex.test.tsx index 761526846..8056e2050 100644 --- a/frontend/components/organisation/settings/maintainers/OrganisationMaintainersIndex.test.tsx +++ b/frontend/components/organisation/settings/maintainers/OrganisationMaintainersIndex.test.tsx @@ -1,12 +1,12 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 - 2023 dv4all -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 -import {render, screen, waitForElementToBeRemoved} from '@testing-library/react' +import {render, screen, within} from '@testing-library/react' import {WithAppContext, mockSession} from '~/utils/jest/WithAppContext' import {WithOrganisationContext} from '~/utils/jest/WithOrganisationContext' @@ -15,30 +15,50 @@ import OrganisationMaintainers from './index' import mockOrganisation from '../../__mocks__/mockOrganisation' // MOCK user agreement call -jest.mock('~/components/user/settings/useUserAgreements') - -const mockMaintainerOfOrganisation=jest.fn,any[]>((props)=>Promise.resolve([])) -jest.mock('./getMaintainersOfOrganisation', () => ({ - getMaintainersOfOrganisation:jest.fn((props)=>mockMaintainerOfOrganisation(props)) +// jest.mock('~/components/user/settings/useUserAgreements') + +// MOCK useOrganisationMaintainers hook +const mockDeleteMaintainer = jest.fn() +const dummyMaintainersData={ + loading: false, + maintainers:[], + deleteMaintainer: mockDeleteMaintainer +} +const mockUseOrganisationMaintainers = jest.fn((props)=>dummyMaintainersData) +jest.mock('./useOrganisationMaintainers', () => ({ + useOrganisationMaintainers:jest.fn((props)=>mockUseOrganisationMaintainers(props)) })) -// MOCK unused invitations api call -const getUnusedInvitations = jest.fn((props) => { - // console.log('mocked...getUnusedInvitations...props...', props) - return Promise.resolve([]) -}) -// Mock -jest.mock('~/utils/getUnusedInvitations', () => { - return { - getUnusedInvitations:jest.fn((props)=>getUnusedInvitations(props)) - } -}) +// MOCK useOrganisationInvitations hook +const mockCreateInvitation = jest.fn() +const mockDeleteInvitation = jest.fn() +const dummyInvitationData={ + magicLink: null, + unusedInvitations:[], + createInvitation: mockCreateInvitation, + deleteInvitation: mockDeleteInvitation +} +const mockUseOrganisationInvitations = jest.fn((props)=>dummyInvitationData) +jest.mock('./useOrganisationInvitations', () => ({ + useOrganisationInvitations:jest.fn((props)=>mockUseOrganisationInvitations(props)) +})) const dummyProps = { organisation: mockOrganisation, isMaintainer: false } +const mockMaintainers = [ + {account: 'test-account-id-1', name: 'John Doe 1', email: 'test1@email.com', affiliation: 'Company 1', disableDelete: false}, + {account: 'test-account-id-2', name: 'John Doe 2', email: null, affiliation: null, disableDelete: false}, +] + +const dummyInvitations = [ + {id:'test-link-id-1',created_at: new Date().toISOString(),type:'community'}, + {id:'test-link-id-2',created_at: new Date().toISOString(),type:'community'}, + {id:'test-link-id-3',created_at: new Date().toISOString(),type:'community'} +] + describe('frontend/components/organisation/maintainers/index.tsx', () => { beforeEach(() => { @@ -46,25 +66,15 @@ describe('frontend/components/organisation/maintainers/index.tsx', () => { jest.clearAllMocks() }) - - it('shows 401 when no token provided', () => { - render( - - - - ) - const msg401 = screen.getByRole('heading', { - name: '401' - }) - expect(msg401).toBeInTheDocument() - }) - - it('shows 403 when user is not organisation maintainer', async () => { + it('shows loader when hook returns loading=true', () => { // user is authenticated defaultSession.status = 'authenticated' defaultSession.token = 'test-token' - // it is not maintainer of this organisation - dummyProps.isMaintainer = false + // it is maintainer of this organisation + dummyProps.isMaintainer = true + dummyMaintainersData.loading = true + // mock hook return with loading true + mockUseOrganisationMaintainers.mockReturnValueOnce(dummyMaintainersData) render( @@ -73,22 +83,20 @@ describe('frontend/components/organisation/maintainers/index.tsx', () => { ) - const msg403 = await screen.findByRole('heading', { - name: '403' - }) - expect(msg403).toBeInTheDocument() + + const loader = screen.getByRole('progressbar') + expect(loader).toBeInTheDocument() }) it('shows "No maintainers" message', async () => { // user is authenticated defaultSession.status = 'authenticated' defaultSession.token = 'test-token' - // it is maintainer of this organisation dummyProps.isMaintainer = true - - // mock empty response array - mockMaintainerOfOrganisation.mockResolvedValueOnce([]) + dummyMaintainersData.loading = false + // mock hook return with loading true + mockUseOrganisationMaintainers.mockReturnValueOnce(dummyMaintainersData) render( @@ -101,78 +109,85 @@ describe('frontend/components/organisation/maintainers/index.tsx', () => { expect(noMaintainers).toBeInTheDocument() }) - it('shows maintainer list item', async () => { - // MOCK maintainers call - const dummyRawMaintainers = [{ - 'maintainer': 'a050aaf3-9c46-490c-ade3-aeeb6a05b1d1', - 'name': ['Jordan Ross Belfort'], - 'email': ['Jordan.Belfort@harvard-example.edu'], - 'affiliation': ['harvard-example.edu'], - 'is_primary': false - }] - // mock empty response array - mockMaintainerOfOrganisation.mockResolvedValueOnce(dummyRawMaintainers) - // user is authenticated - defaultSession.status = 'authenticated' - defaultSession.token = 'test-token' + it('renders component with "Generate invite link" button', () => { // it is maintainer of this organisation dummyProps.isMaintainer = true + dummyMaintainersData.loading = false + // mock hook return with loading true + mockUseOrganisationMaintainers.mockReturnValueOnce(dummyMaintainersData) render( - + + {/* */} ) - await waitForElementToBeRemoved(() => screen.getByRole('progressbar')) - - const maintainer = await screen.findByText(dummyRawMaintainers[0].name[0]) - expect(maintainer).toBeInTheDocument() + const inviteBtn = screen.getByRole('button', {name: 'Generate invite link'}) + expect(inviteBtn).toBeInTheDocument() + // screen.debug() }) - it('renders component with "Generate invite link" button', async () => { + it('shows maintainer name (in the list)', async () => { + // MOCK maintainers call + const dummyRawMaintainers = [{ + 'maintainer': 'a050aaf3-9c46-490c-ade3-aeeb6a05b1d1', + 'name': 'Jordan Ross Belfort', + 'email': 'Jordan.Belfort@harvard-example.edu', + 'affiliation': 'harvard-example.edu', + 'is_primary': false + }] + // user is authenticated + defaultSession.status = 'authenticated' + defaultSession.token = 'test-token' + dummyMaintainersData.maintainers = dummyRawMaintainers as any + dummyMaintainersData.loading = false + // mock hook return with loading true + mockUseOrganisationMaintainers.mockReturnValueOnce(dummyMaintainersData) // it is maintainer of this organisation dummyProps.isMaintainer = true render( - + - {/* */} ) - // wait loader to be removed - await waitForElementToBeRemoved(screen.getByRole('progressbar')) - const inviteBtn = screen.getByRole('button', {name: 'Generate invite link'}) - expect(inviteBtn).toBeInTheDocument() - // screen.debug() + const maintainer = await screen.findByText(dummyRawMaintainers[0].name) + expect(maintainer).toBeInTheDocument() }) - it('protects maintainer page when isMaintainer=false', async () => { + it('shows maintainer list with all items', () => { + dummyMaintainersData.maintainers = mockMaintainers as any + dummyMaintainersData.loading = false + // mock hook return with loading true + mockUseOrganisationMaintainers.mockReturnValueOnce(dummyMaintainersData) // it is maintainer of this organisation - dummyProps.isMaintainer = false + dummyProps.isMaintainer = true render( - {/* */} ) - // wait loader to be removed - await waitForElementToBeRemoved(screen.getByRole('progressbar')) - const page403 = screen.getByRole('heading', {name: '403'}) - expect(page403).toBeInTheDocument() - // screen.debug() + const maintainerItem = screen.getAllByTestId('maintainer-list-item') + expect(maintainerItem.length).toEqual(mockMaintainers.length) }) - it('shows no maintainer message when maintainers=[]', async () => { + it('maintainer cannot be deleted when disableDelete===true', () => { + // set disable flag on first item + mockMaintainers[0].disableDelete = true + dummyMaintainersData.maintainers = mockMaintainers as any + dummyMaintainersData.loading = false + // mock hook return with loading true + mockUseOrganisationMaintainers.mockReturnValueOnce(dummyMaintainersData) // it is maintainer of this organisation dummyProps.isMaintainer = true @@ -183,21 +198,19 @@ describe('frontend/components/organisation/maintainers/index.tsx', () => { ) - // wait loader to be removed - await waitForElementToBeRemoved(screen.getByRole('progressbar')) - const noItemsMsg = screen.getByText('No maintainers') - expect(noItemsMsg).toBeInTheDocument() + const maintainerItem = screen.getAllByTestId('maintainer-list-item') + const deleteBtn = within(maintainerItem[0]).getByRole('button',{name:'delete'}) + expect(deleteBtn).toBeDisabled() }) - it('shows maintainer list', async () => { - const mockMaintainers = [ - {account: 'test-account-id', name: ['John Doe'], email: [], affiliation: [], is_primary: false}, - {account: 'test-account-id', name: ['John Doe'], email: [], affiliation: [], is_primary: false}, - ] - mockMaintainerOfOrganisation.mockResolvedValueOnce(mockMaintainers) + it('shows unused links list',()=>{ // it is maintainer of this organisation dummyProps.isMaintainer = true + dummyInvitationData.magicLink = null + dummyInvitationData.unusedInvitations = dummyInvitations as any + + mockUseOrganisationInvitations.mockReturnValueOnce(dummyInvitationData) render( @@ -206,11 +219,10 @@ describe('frontend/components/organisation/maintainers/index.tsx', () => { ) - // wait loader to be removed - await waitForElementToBeRemoved(screen.getByRole('progressbar')) - const maintainerItem = screen.getAllByTestId('maintainer-list-item') - expect(maintainerItem.length).toEqual(mockMaintainers.length) + // check number of unused invitations + const unusedInvites = screen.getAllByTestId('unused-invitation-item') + expect(unusedInvites.length).toEqual(dummyInvitations.length) }) }) diff --git a/frontend/components/organisation/settings/maintainers/OrganisationMaintainersList.tsx b/frontend/components/organisation/settings/maintainers/OrganisationMaintainersList.tsx deleted file mode 100644 index b4a3f5d9c..000000000 --- a/frontend/components/organisation/settings/maintainers/OrganisationMaintainersList.tsx +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2022 dv4all -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// -// SPDX-License-Identifier: Apache-2.0 - -import Alert from '@mui/material/Alert' -import AlertTitle from '@mui/material/AlertTitle' -import List from '@mui/material/List' -import logger from '~/utils/logger' - -import ProjectMaintainer from '~/components/projects/edit/maintainers/ProjectMaintainer' -import {MaintainerOfOrganisation} from './useOrganisationMaintainers' - -type ProjectMaintainerListProps = { - maintainers: MaintainerOfOrganisation[] - onDelete:(pos:number)=>void -} - -export default function OrganisationMaintainersList({maintainers,onDelete}:ProjectMaintainerListProps) { - - if (maintainers.length === 0) { - return ( - - No maintainers - Add project mantainer by using invite link button! - - ) - } - - function onEdit(pos:number) { - logger('onEdit...NOT SUPPORTED FOR MAINTAINERS','info') - } - - function renderList() { - return maintainers.map((item, pos) => { - return ( - - ) - }) - } - - // console.log('OrganisationMaintainersList...maintainers...', maintainers) - - return ( - - {renderList()} - - ) -} diff --git a/frontend/components/organisation/settings/maintainers/getMaintainersOfOrganisation.test.ts b/frontend/components/organisation/settings/maintainers/apiOrganisationMaintainers.test.ts similarity index 85% rename from frontend/components/organisation/settings/maintainers/getMaintainersOfOrganisation.test.ts rename to frontend/components/organisation/settings/maintainers/apiOrganisationMaintainers.test.ts index 10f9e941a..a41eee2f8 100644 --- a/frontend/components/organisation/settings/maintainers/getMaintainersOfOrganisation.test.ts +++ b/frontend/components/organisation/settings/maintainers/apiOrganisationMaintainers.test.ts @@ -1,11 +1,11 @@ // SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 dv4all -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 -import {getMaintainersOfOrganisation} from './getMaintainersOfOrganisation' +import {getMaintainersOfOrganisation} from './apiOrganisationMaintainers' import {mockResolvedValueOnce} from '~/utils/jest/mockFetch' const mockResponse = [{ diff --git a/frontend/components/organisation/settings/maintainers/apiOrganisationMaintainers.ts b/frontend/components/organisation/settings/maintainers/apiOrganisationMaintainers.ts new file mode 100644 index 000000000..87fedd9b8 --- /dev/null +++ b/frontend/components/organisation/settings/maintainers/apiOrganisationMaintainers.ts @@ -0,0 +1,95 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import logger from '~/utils/logger' +import {createJsonHeaders, extractReturnMessage, getBaseUrl} from '~/utils/fetchHelpers' +import {RawMaintainerProps} from '~/components/maintainers/apiMaintainers' + +export async function getMaintainersOfOrganisation({organisation, token}: + { organisation: string, token: string}) { + try { + // console.log('getMaintainersOfOrganisation.organisation', organisation) + const query = `rpc/maintainers_of_organisation?organisation_id=${organisation}` + const url = `${getBaseUrl()}/${query}` + + const resp = await fetch(url, { + method: 'GET', + headers: createJsonHeaders(token) + }) + + if (resp.status === 200) { + const json: RawMaintainerProps[] = await resp.json() + return json + } + // ERRORS + logger(`getMaintainersOfOrganisation: ${resp.status}:${resp.statusText} organisation: ${organisation}`, 'warn') + return [] + } catch (e: any) { + logger(`getMaintainersOfOrganisation: ${e?.message}`, 'error') + return [] + } +} + +export async function deleteMaintainerFromOrganisation({maintainer,organisation,token}: + {maintainer:string,organisation:string,token:string}) { + try { + const query = `maintainer_for_organisation?maintainer=eq.${maintainer}&organisation=eq.${organisation}` + const url = `${getBaseUrl()}/${query}` + + const resp = await fetch(url, { + method: 'DELETE', + headers: createJsonHeaders(token) + }) + + return extractReturnMessage(resp) + + } catch (e: any) { + logger(`deleteMaintainerFromSoftware: ${e?.message}`, 'error') + return { + status: 500, + message: e?.message + } + } +} + +export async function organisationMaintainerLink({organisation, account, token}: + { organisation: string, account: string, token: string }) { + try { + // POST + const url = `${getBaseUrl()}/invite_maintainer_for_organisation` + const resp = await fetch(url, { + method: 'POST', + headers: { + ...createJsonHeaders(token), + 'Prefer': 'return=headers-only' + }, + body: JSON.stringify({ + organisation, + created_by:account + }) + }) + if (resp.status === 201) { + const id = resp.headers.get('location')?.split('.')[1] + if (id) { + const link = `${location.origin}/invite/organisation/${id}` + return { + status: 201, + message: link + } + } + return { + status: 400, + message: 'Id is missing' + } + } + return extractReturnMessage(resp, organisation ?? '') + } catch (e: any) { + logger(`organisationMaintainerLink: ${e?.message}`, 'error') + return { + status: 500, + message: e?.message + } + } +} diff --git a/frontend/components/organisation/settings/maintainers/getMaintainersOfOrganisation.ts b/frontend/components/organisation/settings/maintainers/getMaintainersOfOrganisation.ts deleted file mode 100644 index 3626173fb..000000000 --- a/frontend/components/organisation/settings/maintainers/getMaintainersOfOrganisation.ts +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2022 dv4all -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// -// SPDX-License-Identifier: Apache-2.0 - -import {createJsonHeaders} from '~/utils/fetchHelpers' -import logger from '~/utils/logger' -import {RawMaintainerOfOrganisation} from './useOrganisationMaintainers' - -export async function getMaintainersOfOrganisation({organisation, token, frontend = true}: - { organisation: string, token: string, frontend?: boolean }) { - try { - // console.log('getMaintainersOfOrganisation.organisation', organisation) - let query = `rpc/maintainers_of_organisation?organisation_id=${organisation}` - let url = `/api/v1/${query}` - if (frontend === false) { - url = `${process.env.POSTGREST_URL}/${query}` - } - - const resp = await fetch(url, { - method: 'GET', - headers: createJsonHeaders(token) - }) - - if (resp.status === 200) { - const json: RawMaintainerOfOrganisation[] = await resp.json() - return json - } - // ERRORS - logger(`getMaintainersOfOrganisation: ${resp.status}:${resp.statusText} organisation: ${organisation}`, 'warn') - return [] - } catch (e: any) { - logger(`getMaintainersOfOrganisation: ${e?.message}`, 'error') - return [] - } -} diff --git a/frontend/components/organisation/settings/maintainers/index.tsx b/frontend/components/organisation/settings/maintainers/index.tsx index ce1e6e0ea..dbf90a273 100644 --- a/frontend/components/organisation/settings/maintainers/index.tsx +++ b/frontend/components/organisation/settings/maintainers/index.tsx @@ -1,53 +1,44 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2022 - 2023 Netherlands eScience Center // SPDX-FileCopyrightText: 2022 - 2023 dv4all +// SPDX-FileCopyrightText: 2022 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2022 Ewan Cahen (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 Christian Meeßen (GFZ) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 Helmholtz Centre Potsdam - GFZ German Research Centre for Geosciences // // SPDX-License-Identifier: Apache-2.0 import {useState} from 'react' -import {useSession} from '~/auth' import ContentLoader from '~/components/layout/ContentLoader' import EditSectionTitle from '~/components/layout/EditSectionTitle' import {maintainers as config} from '~/components/projects/edit/maintainers/config' import ConfirmDeleteModal from '~/components/layout/ConfirmDeleteModal' -import useSnackbar from '~/components/snackbar/useSnackbar' -import useOrganisationMaintainers, { - deleteMaintainerFromOrganisation -} from './useOrganisationMaintainers' -import OrganisationMaintainerLink from './OrganisationMaintainerLink' -import OrganisationMaintainersList from './OrganisationMaintainersList' -import ProtectedOrganisationPage from '../../ProtectedOrganisationPage' import BaseSurfaceRounded from '~/components/layout/BaseSurfaceRounded' -import useOrganisationContext from '../../context/useOrganisationContext' +import MaintainersList from '~/components/maintainers/MaintainersList' +import useOrganisationContext from '~/components/organisation/context/useOrganisationContext' +import {useOrganisationMaintainers} from './useOrganisationMaintainers' +import OrganisationMaintainerLinks from './OrganisationMaintainerLinks' type DeleteModal = { open: boolean, - pos?: number, - displayName?:string + // unique account id + account?: string, + displayName?: string } - export default function OrganisationMaintainers() { - const {token,user} = useSession() - const {id,name,isMaintainer} = useOrganisationContext() - const {showErrorMessage} = useSnackbar() - const {loading,maintainers,setMaintainers} = useOrganisationMaintainers({ - organisation: id ?? '', - token + const {id} = useOrganisationContext() + const {loading,maintainers,deleteMaintainer} = useOrganisationMaintainers({ + organisation: id ?? '' }) const [modal, setModal] = useState({ open: false }) // console.group('OrganisationMaintainers') - // console.log('OrganisationMaintainers.maintainers...', maintainers) - // console.log('OrganisationMaintainers.organisationMaintainers...', organisationMaintainers) - // console.log('OrganisationMaintainers.loading...', loading) + // console.log('maintainers...', maintainers) + // console.log('loading...', loading) // console.groupEnd() if (loading) { @@ -67,39 +58,14 @@ export default function OrganisationMaintainers() { if (maintainer) { setModal({ open: true, - pos, + account: maintainer.account, displayName: maintainer.name }) } } - async function deleteMaintainer(pos: number) { - // console.log('delete maintainer...pos...', pos) - closeModal() - const admin = maintainers[pos] - if (admin) { - const resp = await deleteMaintainerFromOrganisation({ - maintainer: admin.account, - organisation: id ?? '', - token, - frontend: true - }) - if (resp.status === 200) { - const newMaintainersList = [ - ...maintainers.slice(0, pos), - ...maintainers.slice(pos+1) - ] - setMaintainers(newMaintainersList) - } else { - showErrorMessage(`Failed to remove maintainer. ${resp.message}`) - } - } - } - return ( - + <> - @@ -118,12 +84,7 @@ export default function OrganisationMaintainers() { title={config.inviteLink.title} subtitle={config.inviteLink.subtitle} /> - +
    Are you sure you want to remove {modal.displayName ?? 'No name'}?

    } - onCancel={() => { - setModal({ - open:false - }) - }} - onDelete={()=>deleteMaintainer(modal.pos ?? 0)} + onCancel={closeModal} + onDelete={()=>deleteMaintainer(modal.account)} /> - + ) } diff --git a/frontend/components/organisation/settings/maintainers/useOrganisationInvitations.tsx b/frontend/components/organisation/settings/maintainers/useOrganisationInvitations.tsx new file mode 100644 index 000000000..5e960ccbc --- /dev/null +++ b/frontend/components/organisation/settings/maintainers/useOrganisationInvitations.tsx @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useCallback, useEffect, useState} from 'react' + +import {useSession} from '~/auth' +import useSnackbar from '~/components/snackbar/useSnackbar' +import {Invitation, deleteMaintainerLink, getUnusedInvitations} from '~/components/maintainers/apiMaintainers' +import {organisationMaintainerLink} from './apiOrganisationMaintainers' + +export function useOrganisationInvitations({organisation}:{organisation?:string}) { + const {token,user} = useSession() + const {showErrorMessage} = useSnackbar() + const [unusedInvitations,setUnusedInvitations] = useState([]) + const [magicLink, setMagicLink] = useState(null) + + const loadUnusedInvitations = useCallback(()=>{ + // get unused invitation + getUnusedInvitations({ + id: organisation ?? '', + type: 'organisation', + token + }).then(items=>{ + // update + setUnusedInvitations(items) + }).catch(e=>{ + // update on error to empty array + setUnusedInvitations([]) + }) + },[organisation,token]) + + useEffect(()=>{ + let abort = false + if (organisation && token){ + loadUnusedInvitations() + } + return ()=>{abort=true} + },[organisation,token,loadUnusedInvitations]) + + const createInvitation = useCallback(async()=>{ + if (organisation && user?.account){ + const resp = await organisationMaintainerLink({ + organisation, + account: user?.account, + token + }) + if (resp.status===201){ + // set magic link prop to new link + setMagicLink(resp.message) + // reload unused invitations + loadUnusedInvitations() + }else{ + showErrorMessage(`Failed to create invitation. ${resp.message}`) + } + } + // IGNORE showErrorMessage dependency + // eslint-disable-next-line react-hooks/exhaustive-deps + },[organisation,user?.account,token,loadUnusedInvitations]) + + const deleteInvitation = useCallback(async(invitation:Invitation)=>{ + const resp = await deleteMaintainerLink({ + invitation, + token + }) + if (resp.status===200){ + loadUnusedInvitations() + }else{ + showErrorMessage(`Failed to delete invitation. ${resp.message}`) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + },[token,loadUnusedInvitations]) + + return { + magicLink, + unusedInvitations, + deleteInvitation, + createInvitation + } +} diff --git a/frontend/components/organisation/settings/maintainers/useOrganisationMaintainers.tsx b/frontend/components/organisation/settings/maintainers/useOrganisationMaintainers.tsx index 61d9d2605..10a170b2e 100644 --- a/frontend/components/organisation/settings/maintainers/useOrganisationMaintainers.tsx +++ b/frontend/components/organisation/settings/maintainers/useOrganisationMaintainers.tsx @@ -1,50 +1,36 @@ // SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 dv4all +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) // // SPDX-License-Identifier: Apache-2.0 import {useState,useEffect} from 'react' -import {createJsonHeaders, extractReturnMessage} from '~/utils/fetchHelpers' -import logger from '~/utils/logger' -import {getMaintainersOfOrganisation} from './getMaintainersOfOrganisation' -export type RawMaintainerOfOrganisation = { - // unique maintainer id - maintainer: string - name: string[] - email: string[] - affiliation: string[], - is_primary?: boolean -} +import {useSession} from '~/auth' +import {MaintainerProps, rawMaintainersToMaintainers} from '~/components/maintainers/apiMaintainers' +import useSnackbar from '~/components/snackbar/useSnackbar' +import { + deleteMaintainerFromOrganisation, + getMaintainersOfOrganisation +} from './apiOrganisationMaintainers' -export type MaintainerOfOrganisation = { - // unique maintainer id - account: string - name: string - email: string - affiliation: string, - is_primary?: boolean -} -export default function useOrganisationMaintainers({organisation, token}: - {organisation: string, token: string }) { - const [maintainers, setMaintainers] = useState([]) +export function useOrganisationMaintainers({organisation}:{organisation: string}) { + const {token} = useSession() + const {showErrorMessage} = useSnackbar() + const [maintainers, setMaintainers] = useState([]) const [loading, setLoading] = useState(true) useEffect(() => { let abort = false async function getMaintainers() { - // console.log('useOrganisationMaintainers.useEffect.getMaintainers') setLoading(true) const raw_maintainers = await getMaintainersOfOrganisation({ organisation, - token, - frontend:true + token }) - // console.log('useOrganisationMaintainers.useEffect...raw_maintainers',raw_maintainers) const maintainers = rawMaintainersToMaintainers(raw_maintainers) if (abort) return null // update maintainers state @@ -52,7 +38,6 @@ export default function useOrganisationMaintainers({organisation, token}: // update loading flag setLoading(false) } - // console.log('useOrganisationMaintainers.useEffect...') if (organisation && token) { getMaintainers() } else if (token==='') { @@ -61,128 +46,29 @@ export default function useOrganisationMaintainers({organisation, token}: return ()=>{abort=true} }, [organisation,token]) - if (token === '') { - return { - loading: false, - maintainers, - setMaintainers + + async function deleteMaintainer(account?:string) { + // console.log('delete maintainer...pos...', pos) + if (account && organisation) { + const resp = await deleteMaintainerFromOrganisation({ + maintainer: account, + organisation, + token + }) + if (resp.status === 200) { + // remove account + const newMaintainersList = maintainers.filter(item=>item.account!==account) + setMaintainers(newMaintainersList) + // setMaintainers(newMaintainersList) + } else { + showErrorMessage(`Failed to remove maintainer. ${resp.message}`) + } } } - // console.log('useOrganisationMaintainers.loading...', loading) - // console.log('useOrganisationMaintainers.organisation...',organisation) - // console.log('useOrganisationMaintainers.token...',token) return { loading, maintainers, - setMaintainers - } -} - -export function rawMaintainersToMaintainers(raw_maintainers: RawMaintainerOfOrganisation[]) { - try { - const maintainers:MaintainerOfOrganisation[] = [] - raw_maintainers.forEach(item => { - let maintainerWithMostInfo: MaintainerOfOrganisation | null = null - let bestScore = -1 - // use name as second loop indicator - item.name.forEach((name, pos) => { - let score = 0 - if (name) { - score += 1 - } - if (item.email[pos]) { - score += 1 - } - if (item.affiliation[pos]) { - score += 1 - } - - if (score <= bestScore) { - return - } - const maintainer: MaintainerOfOrganisation = { - account: item.maintainer, - name, - email: item.email[pos] ? item.email[pos] : '', - affiliation: item.affiliation[pos] ? item.affiliation[pos] : '', - is_primary: item?.is_primary ?? false - } - - maintainerWithMostInfo = maintainer - bestScore = score - }) - maintainers.push(maintainerWithMostInfo as unknown as MaintainerOfOrganisation) - }) - return maintainers - } catch (e:any) { - logger(`rawMaintainersToMaintainers: ${e?.message}`,'error') - return [] - } -} - - -export async function deleteMaintainerFromOrganisation({maintainer,organisation,token,frontend=true}: - {maintainer:string,organisation:string,token:string,frontend?:boolean}) { - try { - let query = `maintainer_for_organisation?maintainer=eq.${maintainer}&organisation=eq.${organisation}` - let url = `/api/v1/${query}` - if (frontend === false) { - url = `${process.env.POSTGREST_URL}/${query}` - } - - const resp = await fetch(url, { - method: 'DELETE', - headers: createJsonHeaders(token) - }) - - return extractReturnMessage(resp) - - } catch (e: any) { - logger(`deleteMaintainerFromSoftware: ${e?.message}`, 'error') - return { - status: 500, - message: e?.message - } - } -} - -export async function organisationMaintainerLink({organisation, account, token}: - { organisation: string, account: string, token: string }) { - try { - // POST - const url = '/api/v1/invite_maintainer_for_organisation' - const resp = await fetch(url, { - method: 'POST', - headers: { - ...createJsonHeaders(token), - 'Prefer': 'return=headers-only' - }, - body: JSON.stringify({ - organisation, - created_by:account - }) - }) - if (resp.status === 201) { - const id = resp.headers.get('location')?.split('.')[1] - if (id) { - const link = `${location.origin}/invite/organisation/${id}` - return { - status: 201, - message: link - } - } - return { - status: 400, - message: 'Id is missing' - } - } - return extractReturnMessage(resp, organisation ?? '') - } catch (e: any) { - logger(`organisationMaintainerLink: ${e?.message}`, 'error') - return { - status: 500, - message: e?.message - } + deleteMaintainer } } diff --git a/frontend/components/projects/edit/maintainers/EditProjectMaintainersIndex.test.tsx b/frontend/components/projects/edit/maintainers/EditProjectMaintainersIndex.test.tsx index 5c299df30..1ef7e823e 100644 --- a/frontend/components/projects/edit/maintainers/EditProjectMaintainersIndex.test.tsx +++ b/frontend/components/projects/edit/maintainers/EditProjectMaintainersIndex.test.tsx @@ -1,35 +1,88 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) (dv4all) // SPDX-FileCopyrightText: 2022 - 2023 dv4all -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 -import {render, screen, waitForElementToBeRemoved} from '@testing-library/react' +import {render, screen} from '@testing-library/react' import {WithAppContext, mockSession} from '~/utils/jest/WithAppContext' import {WithProjectContext} from '~/utils/jest/WithProjectContext' -import {mockResolvedValueOnce} from '~/utils/jest/mockFetch' import ProjectMaintainers from './index' import editProjectState from '../__mocks__/editProjectState' -// MOCK user agreement call -jest.mock('~/components/user/settings/useUserAgreements') -// MOCKS -const mockGetUnusedInvitations=jest.fn(props=>Promise.resolve([])) -jest.mock('~/utils/getUnusedInvitations', () => ({ - getUnusedInvitations: jest.fn(props=>mockGetUnusedInvitations(props)) +// MOCK useProjectMaintainers hook +const mockDeleteMaintainer = jest.fn() +const dummyMaintainersData={ + loading: false, + maintainers:[], + deleteMaintainer: mockDeleteMaintainer +} +const mockUseProjectMaintainers = jest.fn((props)=>dummyMaintainersData) +jest.mock('./useProjectMaintainers', () => ({ + useProjectMaintainers:jest.fn((props)=>mockUseProjectMaintainers(props)) })) +// MOCK useProjectInvitations hook +const mockCreateInvitation = jest.fn() +const mockDeleteInvitation = jest.fn() +const dummyInvitationData={ + magicLink: null, + unusedInvitations:[], + createInvitation: mockCreateInvitation, + deleteInvitation: mockDeleteInvitation +} +const mockUseProjectInvitations = jest.fn((props)=>dummyInvitationData) +jest.mock('./useProjectInvitations', () => ({ + useProjectInvitations:jest.fn((props)=>mockUseProjectInvitations(props)) +})) + + +const dummyMaintainers = [ + {account: 'test-account-id-1', name: 'John Doe 1', email: 'test1@email.com', affiliation: 'Company 1', disableDelete: false}, + {account: 'test-account-id-2', name: 'John Doe 2', email: null, affiliation: null, disableDelete: false}, +] + +const dummyInvitations = [ + {id:'test-link-id-1',created_at: new Date().toISOString(),type:'community'}, + {id:'test-link-id-2',created_at: new Date().toISOString(),type:'community'}, + {id:'test-link-id-3',created_at: new Date().toISOString(),type:'community'} +] + + describe('frontend/components/projects/edit/maintainers/index.tsx', () => { beforeEach(() => { jest.clearAllMocks() }) + it('shows loader when hook returns loading=true', () => { + // user is authenticated + mockSession.status = 'authenticated' + mockSession.token = 'test-token' + // it is maintainer of this organisation + dummyMaintainersData.loading = true + // mock hook return with loading true + mockUseProjectMaintainers.mockReturnValueOnce(dummyMaintainersData) + + render( + + + + + + ) + + const loader = screen.getByRole('progressbar') + expect(loader).toBeInTheDocument() + }) + it('renders no maintainers', async() => { // mock no maintainers - mockResolvedValueOnce([]) + dummyMaintainersData.loading = false + // mock hook return with loading true + mockUseProjectMaintainers.mockReturnValueOnce(dummyMaintainersData) render( @@ -39,11 +92,48 @@ describe('frontend/components/projects/edit/maintainers/index.tsx', () => { ) - // wait for loader to be removed - await waitForElementToBeRemoved(screen.getByRole('progressbar')) - // shows no maintainers message const noMaintainers = screen.getByText('No maintainers') expect(noMaintainers).toBeInTheDocument() }) + + it('shows maintainer list with all items', async() => { + // mock maintainers + dummyMaintainersData.maintainers = dummyMaintainers as any + dummyMaintainersData.loading = false + // mock hook return with loading true + mockUseProjectMaintainers.mockReturnValueOnce(dummyMaintainersData) + + render( + + + + + + ) + + const maintainerItem = screen.getAllByTestId('maintainer-list-item') + expect(maintainerItem.length).toEqual(dummyMaintainers.length) + }) + + it('shows unused links list',()=>{ + // it is maintainer of this organisation + dummyInvitationData.magicLink = null + dummyInvitationData.unusedInvitations = dummyInvitations as any + + mockUseProjectInvitations.mockReturnValueOnce(dummyInvitationData) + + render( + + + + + + ) + + // check number of unused invitations + const unusedInvites = screen.getAllByTestId('unused-invitation-item') + expect(unusedInvites.length).toEqual(dummyInvitations.length) + }) + }) diff --git a/frontend/components/projects/edit/maintainers/ProjectMaintainerLink.tsx b/frontend/components/projects/edit/maintainers/ProjectMaintainerLink.tsx deleted file mode 100644 index b8cf8f813..000000000 --- a/frontend/components/projects/edit/maintainers/ProjectMaintainerLink.tsx +++ /dev/null @@ -1,106 +0,0 @@ -// SPDX-FileCopyrightText: 2022 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2022 Ewan Cahen (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2022 dv4all -// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) -// -// SPDX-License-Identifier: Apache-2.0 - -import {useEffect, useState} from 'react' -import Button from '@mui/material/Button' -import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh' -import EmailIcon from '@mui/icons-material/Email' -import CopyIcon from '@mui/icons-material/ContentCopy' - -import {createMaintainerLink} from '~/utils/editProject' -import {copyToClipboard,canCopyToClipboard} from '~/utils/copyToClipboard' -import useSnackbar from '~/components/snackbar/useSnackbar' -import InvitationList from '~/components/layout/InvitationList' -import {Invitation} from '~/types/Invitation' -import {getUnusedInvitations} from '~/utils/getUnusedInvitations' -import CopyToClipboard from '~/components/layout/CopyToClipboard' - -export default function ProjectMaintainerLink({project,title,account,token}: {project: string, title: string, account: string, token: string}) { - const {showErrorMessage,showInfoMessage} = useSnackbar() - const [magicLink, setMagicLink] = useState(null) - const [unusedInvitations, setUnusedInvitations] = useState([]) - const canCopy = useState(canCopyToClipboard()) - - async function fetchUnusedInvitations() { - setUnusedInvitations(await getUnusedInvitations('project', project, token)) - } - - // eslint-disable-next-line react-hooks/exhaustive-deps - useEffect(() => {fetchUnusedInvitations()}, []) - - async function createInviteLink() { - const resp = await createMaintainerLink({ - project, - account, - token - }) - if (resp.status === 201) { - setMagicLink(resp.message) - fetchUnusedInvitations() - } else { - showErrorMessage(`Failed to generate maintainer link. ${resp.message}`) - } - } - - async function toClipboard(copied:boolean) { - // notify user about copy action - if (copied) { - showInfoMessage('Copied to clipboard') - } else { - showErrorMessage(`Failed to copy link ${magicLink}`) - } - } - - function renderLinkOptions() { - if (magicLink) { - return ( -
    -

    {magicLink}

    -
    - - - -
    -
    - ) - } - return null - } - - return ( - <> - -
    - {renderLinkOptions()} - fetchUnusedInvitations()}/> - - ) -} diff --git a/frontend/components/projects/edit/maintainers/ProjectMaintainerLinks.tsx b/frontend/components/projects/edit/maintainers/ProjectMaintainerLinks.tsx new file mode 100644 index 000000000..281777110 --- /dev/null +++ b/frontend/components/projects/edit/maintainers/ProjectMaintainerLinks.tsx @@ -0,0 +1,49 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import Button from '@mui/material/Button' +import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh' + +import InvitationList from '~/components/maintainers/InvitationList' +import {useProjectInvitations} from './useProjectInvitations' +import useProjectContext from '../useProjectContext' + +export default function ProjectMaintainerLinks() { + const {project} = useProjectContext() + const { + unusedInvitations,magicLink, + createInvitation,deleteInvitation + } = useProjectInvitations({project:project.id}) + + // console.group('ProjectMaintainerLinks') + // console.log('project...', project) + // console.log('magicLink...', magicLink) + // console.log('unusedInvitations...', unusedInvitations) + // console.groupEnd() + + return ( + <> + +
    + + + ) +} diff --git a/frontend/components/projects/edit/maintainers/ProjectMaintainersList.tsx b/frontend/components/projects/edit/maintainers/ProjectMaintainersList.tsx deleted file mode 100644 index d6383eda1..000000000 --- a/frontend/components/projects/edit/maintainers/ProjectMaintainersList.tsx +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2022 - 2023 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import Alert from '@mui/material/Alert' -import AlertTitle from '@mui/material/AlertTitle' -import List from '@mui/material/List' -import {useSession} from '~/auth' -import logger from '~/utils/logger' - -import ProjectMaintainer from './ProjectMaintainer' -import {MaintainerOfProject} from './useProjectMaintainer' - -type ProjectMaintainerListProps = { - maintainers: MaintainerOfProject[] - onDelete:(pos:number)=>void -} - -export default function ProjectMaintainersList({maintainers,onDelete}:ProjectMaintainerListProps) { - const {user} = useSession() - - if (maintainers.length === 0) { - return ( - - No maintainers - Add project mantainer by using invite link button! - - ) - } - - function onEdit(pos:number) { - logger('onEdit...NOT SUPPORTED FOR MAINTAINERS','info') - } - - function isDeleteDisabled() { - // we allow rsd_admin to remove last mantainer too - if (user?.role === 'rsd_admin' && maintainers?.length > 0) { - return false - } else if (maintainers?.length > 1) { - // common maintainer can remove untill the last mantainer - return false - } - return true - } - - function renderList() { - return maintainers.map((item, pos) => { - return ( - - ) - }) - } - - return ( - - {renderList()} - - ) -} diff --git a/frontend/components/projects/edit/maintainers/apiProjectMaintainers.ts b/frontend/components/projects/edit/maintainers/apiProjectMaintainers.ts new file mode 100644 index 000000000..9c1b000ef --- /dev/null +++ b/frontend/components/projects/edit/maintainers/apiProjectMaintainers.ts @@ -0,0 +1,54 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import logger from '~/utils/logger' +import {createJsonHeaders, extractReturnMessage, getBaseUrl} from '~/utils/fetchHelpers' +import {RawMaintainerProps} from '~/components/maintainers/apiMaintainers' + +export async function getMaintainersOfProject({project, token}: + {project: string, token: string}) { + try { + const query = `rpc/maintainers_of_project?project_id=${project}` + const url = `${getBaseUrl()}/${query}` + + const resp = await fetch(url, { + method: 'GET', + headers: createJsonHeaders(token) + }) + + if (resp.status === 200) { + const json:RawMaintainerProps[] = await resp.json() + return json + } + // ERRORS + logger(`getMaintainersOfProject: ${resp.status}:${resp.statusText} project: ${project}`, 'warn') + return [] + } catch (e: any) { + logger(`getMaintainersOfProject: ${e?.message}`, 'error') + return [] + } +} + +export async function deleteMaintainerFromProject({maintainer,project,token}: + {maintainer:string,project:string,token:string}) { + try { + const query = `maintainer_for_project?maintainer=eq.${maintainer}&project=eq.${project}` + const url = `${getBaseUrl()}/${query}` + + const resp = await fetch(url, { + method: 'DELETE', + headers: createJsonHeaders(token) + }) + + return extractReturnMessage(resp) + + } catch (e: any) { + logger(`deleteMaintainerFromProject: ${e?.message}`, 'error') + return { + status: 500, + message: e?.message + } + } +} diff --git a/frontend/components/projects/edit/maintainers/index.tsx b/frontend/components/projects/edit/maintainers/index.tsx index 3760919f7..afcf5ec73 100644 --- a/frontend/components/projects/edit/maintainers/index.tsx +++ b/frontend/components/projects/edit/maintainers/index.tsx @@ -1,53 +1,39 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 - 2023 dv4all +// SPDX-FileCopyrightText: 2022 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2022 Ewan Cahen (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2022 Netherlands eScience Center +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) // // SPDX-License-Identifier: Apache-2.0 -import {useEffect,useState} from 'react' +import {useState} from 'react' -import {useSession} from '~/auth' import ContentLoader from '~/components/layout/ContentLoader' import EditSection from '~/components/layout/EditSection' import EditSectionTitle from '~/components/layout/EditSectionTitle' +import ConfirmDeleteModal from '~/components/layout/ConfirmDeleteModal' +import MaintainersList from '~/components/maintainers/MaintainersList' import useProjectContext from '../useProjectContext' -import useProjectMaintainers, {deleteMaintainerFromProject, MaintainerOfProject} from './useProjectMaintainer' -import ProjectMaintainersList from './ProjectMaintainersList' -import ProjectMaintainerLink from './ProjectMaintainerLink' import {maintainers as config} from './config' -import ConfirmDeleteModal from '~/components/layout/ConfirmDeleteModal' -import useSnackbar from '~/components/snackbar/useSnackbar' +import ProjectMaintainerLinks from './ProjectMaintainerLinks' +import {useProjectMaintainers} from './useProjectMaintainers' type DeleteModal = { open: boolean, - pos?: number, - displayName?:string + // unique account id + account?: string, + displayName?: string } - export default function ProjectMaintainers() { - const {token,user} = useSession() - const {showErrorMessage} = useSnackbar() const {project} = useProjectContext() - const {loading,maintainers} = useProjectMaintainers({ - project: project.id, - token + const {loading,maintainers,deleteMaintainer} = useProjectMaintainers({ + project: project.id }) - const [projectMaintainers, setProjectMaintaners] = useState([]) const [modal, setModal] = useState({ open: false }) - useEffect(() => { - let abort = false - if (loading === false && - abort === false) { - setProjectMaintaners(maintainers) - } - return () => { abort = true } - },[maintainers,loading]) - if (loading) { return ( @@ -56,7 +42,7 @@ export default function ProjectMaintainers() { function closeModal() { setModal({ - open: false + open: false, }) } @@ -65,35 +51,12 @@ export default function ProjectMaintainers() { if (maintainer) { setModal({ open: true, - pos, + account: maintainer.account, displayName: maintainer.name }) } } - async function deleteMaintainer(pos: number) { - // console.log('delete maintainer...pos...', pos) - closeModal() - const admin = maintainers[pos] - if (admin) { - const resp = await deleteMaintainerFromProject({ - maintainer: admin.account, - project: project.id, - token, - frontend: true - }) - if (resp.status === 200) { - const newMaintainersList = [ - ...maintainers.slice(0, pos), - ...maintainers.slice(pos+1) - ] - setProjectMaintaners(newMaintainersList) - } else { - showErrorMessage(`Failed to remove maintainer. ${resp.message}`) - } - } - } - return ( <> @@ -101,9 +64,9 @@ export default function ProjectMaintainers() { -
    @@ -111,12 +74,7 @@ export default function ProjectMaintainers() { title={config.inviteLink.title} subtitle={config.inviteLink.subtitle} /> - +
    Are you sure you want to remove {modal.displayName ?? 'No name'}?

    } - onCancel={() => { - setModal({ - open:false - }) + onCancel={closeModal} + onDelete={()=>{ + deleteMaintainer(modal.account) + closeModal() }} - onDelete={()=>deleteMaintainer(modal.pos ?? 0)} /> ) diff --git a/frontend/components/projects/edit/maintainers/useProjectInvitations.tsx b/frontend/components/projects/edit/maintainers/useProjectInvitations.tsx new file mode 100644 index 000000000..2023bcbba --- /dev/null +++ b/frontend/components/projects/edit/maintainers/useProjectInvitations.tsx @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useCallback, useEffect, useState} from 'react' + +import {useSession} from '~/auth' +import {Invitation, deleteMaintainerLink, getUnusedInvitations} from '~/components/maintainers/apiMaintainers' +import useSnackbar from '~/components/snackbar/useSnackbar' +import {createMaintainerLink} from '~/utils/editProject' + +export function useProjectInvitations({project}:{project?:string}) { + const {token,user} = useSession() + const {showErrorMessage} = useSnackbar() + const [unusedInvitations,setUnusedInvitations] = useState([]) + const [magicLink, setMagicLink] = useState(null) + + const loadUnusedInvitations = useCallback(()=>{ + // get unused invitation + getUnusedInvitations({ + id: project ?? '', + type: 'project', + token + }).then(items=>{ + // update + setUnusedInvitations(items) + }).catch(e=>{ + // update on error to empty array + setUnusedInvitations([]) + }) + },[project,token]) + + useEffect(()=>{ + let abort = false + if (project && token){ + loadUnusedInvitations() + } + return ()=>{abort=true} + },[project,token,loadUnusedInvitations]) + + const createInvitation = useCallback(async()=>{ + if (project && user?.account){ + const resp = await createMaintainerLink({ + project, + account:user?.account, + token + }) + if (resp.status===201){ + // set magic link prop to new link + setMagicLink(resp.message) + // reload unused invitations + loadUnusedInvitations() + }else{ + showErrorMessage(`Failed to create invitation. ${resp.message}`) + } + } + // IGNORE showErrorMessage dependency + // eslint-disable-next-line react-hooks/exhaustive-deps + },[project,user?.account,token,loadUnusedInvitations]) + + const deleteInvitation = useCallback(async(invitation:Invitation)=>{ + const resp = await deleteMaintainerLink({ + invitation, + token + }) + if (resp.status===200){ + loadUnusedInvitations() + }else{ + showErrorMessage(`Failed to delete invitation. ${resp.message}`) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + },[token,loadUnusedInvitations]) + + return { + magicLink, + unusedInvitations, + deleteInvitation, + createInvitation + } +} diff --git a/frontend/components/projects/edit/maintainers/useProjectMaintainer.tsx b/frontend/components/projects/edit/maintainers/useProjectMaintainer.tsx deleted file mode 100644 index 9e455b08e..000000000 --- a/frontend/components/projects/edit/maintainers/useProjectMaintainer.tsx +++ /dev/null @@ -1,156 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) (dv4all) -// SPDX-FileCopyrightText: 2022 dv4all -// SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2024 Netherlands eScience Center -// -// SPDX-License-Identifier: Apache-2.0 - -import {useState,useEffect} from 'react' -import {createJsonHeaders, extractReturnMessage} from '~/utils/fetchHelpers' -import logger from '~/utils/logger' - -export type RawMaintainerOfProject = { - // unique maintainer id - maintainer: string - name: string[] - email: string[] - affiliation: string[], -} - -export type MaintainerOfProject = { - // unique maintainer id - account: string - name: string - email: string - affiliation: string, -} - -export async function getMaintainersOfProject({project, token, frontend=true}: - {project: string, token: string,frontend?:boolean}) { - try { - let query = `rpc/maintainers_of_project?project_id=${project}` - let url = `/api/v1/${query}` - if (frontend === false) { - url = `${process.env.POSTGREST_URL}/${query}` - } - - const resp = await fetch(url, { - method: 'GET', - headers: createJsonHeaders(token) - }) - - if (resp.status === 200) { - const json:RawMaintainerOfProject[] = await resp.json() - return json - } - // ERRORS - logger(`getMaintainersOfSoftware: ${resp.status}:${resp.statusText} project: ${project}`, 'warn') - return [] - } catch (e: any) { - logger(`getMaintainersOfSoftware: ${e?.message}`, 'error') - return [] - } -} - -export default function useProjectMaintainers({project, token}: - {project: string, token: string }) { - const [maintainers, setMaintainers] = useState([]) - const [loading, setLoading] = useState(true) - const [loadedProject, setLoadedProject] = useState('') - - useEffect(() => { - let abort = false - async function getMaintainers() { - setLoading(true) - const raw_maintainers = await getMaintainersOfProject({ - project, - token, - frontend:true - }) - const maintainers = rawMaintainersToMaintainers(raw_maintainers) - if (abort) return null - // update maintainers state - setMaintainers(maintainers) - setLoadedProject(project) - // update loading flag - setLoading(false) - } - - if (project && token && project!==loadedProject) { - getMaintainers() - } - return ()=>{abort=true} - },[project,token,loadedProject]) - - return { - maintainers, - loading - } -} - -export function rawMaintainersToMaintainers(raw_maintainers: RawMaintainerOfProject[]) { - try { - const maintainers:MaintainerOfProject[] = [] - raw_maintainers.forEach(item => { - let maintainerWithMostInfo: MaintainerOfProject | null = null - let bestScore = -1 - // use name as second loop indicator - item.name.forEach((name, pos) => { - let score = 0 - if (name) { - score += 1 - } - if (item.email[pos]) { - score += 1 - } - if (item.affiliation[pos]) { - score += 1 - } - - if (score <= bestScore) { - return - } - const maintainer: MaintainerOfProject = { - account: item.maintainer, - name, - email: item.email[pos] ? item.email[pos] : '', - affiliation: item.affiliation[pos] ? item.affiliation[pos] : '' - } - - maintainerWithMostInfo = maintainer - bestScore = score - }) - maintainers.push(maintainerWithMostInfo as unknown as MaintainerOfProject) - }) - return maintainers - } catch (e:any) { - logger(`rawMaintainersToMaintainers: ${e?.message}`,'error') - return [] - } -} - -export async function deleteMaintainerFromProject({maintainer,project,token,frontend=true}: - {maintainer:string,project:string,token:string,frontend?:boolean}) { - try { - let query = `maintainer_for_project?maintainer=eq.${maintainer}&project=eq.${project}` - let url = `/api/v1/${query}` - if (frontend === false) { - url = `${process.env.POSTGREST_URL}/${query}` - } - - const resp = await fetch(url, { - method: 'DELETE', - headers: createJsonHeaders(token) - }) - - return extractReturnMessage(resp) - - } catch (e: any) { - logger(`deleteMaintainerFromProject: ${e?.message}`, 'error') - return { - status: 500, - message: e?.message - } - } -} diff --git a/frontend/components/projects/edit/maintainers/useProjectMaintainers.tsx b/frontend/components/projects/edit/maintainers/useProjectMaintainers.tsx new file mode 100644 index 000000000..a7d7ea0c0 --- /dev/null +++ b/frontend/components/projects/edit/maintainers/useProjectMaintainers.tsx @@ -0,0 +1,79 @@ +// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) +// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) (dv4all) +// SPDX-FileCopyrightText: 2022 dv4all +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useState,useEffect} from 'react' + +import {useSession} from '~/auth' +import useSnackbar from '~/components/snackbar/useSnackbar' +import {MaintainerProps, rawMaintainersToMaintainers} from '~/components/maintainers/apiMaintainers' +import {deleteMaintainerFromProject, getMaintainersOfProject} from './apiProjectMaintainers' + +export function useProjectMaintainers({project}:{project: string}) { + const {token,user} = useSession() + const {showErrorMessage} = useSnackbar() + const [maintainers, setMaintainers] = useState([]) + const [loading, setLoading] = useState(true) + + // console.group('useProjectMaintainers') + // console.log('project...',project) + // console.log('token...',token) + // console.groupEnd() + + useEffect(() => { + let abort = false + async function getMaintainers() { + setLoading(true) + const raw_maintainers = await getMaintainersOfProject({ + project, + token + }) + const maintainers = rawMaintainersToMaintainers(raw_maintainers) + if (abort) return null + // update maintainers state + setMaintainers(maintainers) + // update loading flag + setLoading(false) + } + + if (project && token) { + getMaintainers() + } + return ()=>{abort=true} + },[project,token]) + + async function deleteMaintainer(account?:string){ + if (account && project){ + const resp = await deleteMaintainerFromProject({ + maintainer: account, + project, + token + }) + if (resp.status === 200) { + // remove account + const newMaintainersList = maintainers.filter(item=>item.account!==account) + setMaintainers(newMaintainersList) + } else { + showErrorMessage(`Failed to remove maintainer. ${resp.message}`) + } + } + } + + // last maintainer can be deleted only by rsd-admin + if (maintainers?.length===1 && user?.role!=='rsd_admin'){ + // disable delete button on last maintainer + maintainers[0].disableDelete = true + } + + return { + loading, + maintainers, + setMaintainers, + deleteMaintainer + } +} diff --git a/frontend/components/software/edit/maintainers/EditSoftwareMaintainersIndex.test.tsx b/frontend/components/software/edit/maintainers/EditSoftwareMaintainersIndex.test.tsx index 679d50d27..8b8ec898d 100644 --- a/frontend/components/software/edit/maintainers/EditSoftwareMaintainersIndex.test.tsx +++ b/frontend/components/software/edit/maintainers/EditSoftwareMaintainersIndex.test.tsx @@ -1,37 +1,92 @@ // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) (dv4all) // SPDX-FileCopyrightText: 2023 dv4all +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 -import {render, screen, waitForElementToBeRemoved} from '@testing-library/react' +import {render, screen} from '@testing-library/react' import {WithAppContext, mockSession} from '~/utils/jest/WithAppContext' import {WithSoftwareContext} from '~/utils/jest/WithSoftwareContext' -import {mockResolvedValueOnce} from '~/utils/jest/mockFetch' import SoftwareMaintainers from './index' // MOCKS import {initialState as softwareState} from '~/components/software/edit/editSoftwareContext' -// MOCK getUnusedInvitations -const mockGetUnusedInvitations=jest.fn(props=>Promise.resolve([])) -jest.mock('~/utils/getUnusedInvitations', () => ({ - getUnusedInvitations: jest.fn(props=>mockGetUnusedInvitations(props)) +// MOCK useSoftwareMaintainers hook +const mockDeleteMaintainer = jest.fn() +const dummyMaintainersData={ + loading: false, + maintainers:[], + deleteMaintainer: mockDeleteMaintainer +} +const mockUseSoftwareMaintainers = jest.fn((props)=>dummyMaintainersData) +jest.mock('./useSoftwareMaintainers', () => ({ + useSoftwareMaintainers:jest.fn((props)=>mockUseSoftwareMaintainers(props)) })) +// MOCK useSoftwareInvitations hook +const mockCreateInvitation = jest.fn() +const mockDeleteInvitation = jest.fn() +const dummyInvitationData={ + magicLink: null, + unusedInvitations:[], + createInvitation: mockCreateInvitation, + deleteInvitation: mockDeleteInvitation +} +const mockUseSoftwareInvitations = jest.fn((props)=>dummyInvitationData) +jest.mock('./useSoftwareInvitations', () => ({ + useSoftwareInvitations:jest.fn((props)=>mockUseSoftwareInvitations(props)) +})) + + +const dummyMaintainers = [ + {account: 'test-account-id-1', name: 'John Doe 1', email: 'test1@email.com', affiliation: 'Company 1', disableDelete: false}, + {account: 'test-account-id-2', name: 'John Doe 2', email: null, affiliation: null, disableDelete: false}, +] + +const dummyInvitations = [ + {id:'test-link-id-1',created_at: new Date().toISOString(),type:'community'}, + {id:'test-link-id-2',created_at: new Date().toISOString(),type:'community'}, + {id:'test-link-id-3',created_at: new Date().toISOString(),type:'community'} +] + describe('frontend/components/software/edit/maintainers/index.tsx', () => { beforeEach(() => { jest.clearAllMocks() }) - it('renders no maintainers', async() => { - // resolve no maintainers - mockResolvedValueOnce([]) + it('shows loader when hook returns loading=true', () => { + // user is authenticated + mockSession.status = 'authenticated' + mockSession.token = 'test-token' + // it is maintainer of this organisation + dummyMaintainersData.loading = true + // mock hook return with loading true + mockUseSoftwareMaintainers.mockReturnValueOnce(dummyMaintainersData) + render( + + + + + + ) + + const loader = screen.getByRole('progressbar') + expect(loader).toBeInTheDocument() + }) + + it('renders no maintainers', async() => { // software id required for requests softwareState.software.id = 'software-test-id' + // it is maintainer of this organisation + dummyMaintainersData.loading = false + // mock hook return with loading true + mockUseSoftwareMaintainers.mockReturnValueOnce(dummyMaintainersData) render( @@ -41,9 +96,47 @@ describe('frontend/components/software/edit/maintainers/index.tsx', () => { ) - // wait for loader to be removed - await waitForElementToBeRemoved(screen.getByRole('progressbar')) // validate no maintainers message - const noMaintainersMsg = screen.getByText('No maintainers') + screen.getByText('No maintainers') + }) + + it('shows maintainer list with all items', async() => { + // mock maintainers + dummyMaintainersData.maintainers = dummyMaintainers as any + dummyMaintainersData.loading = false + // mock hook return with loading true + mockUseSoftwareMaintainers.mockReturnValueOnce(dummyMaintainersData) + + render( + + + + + + ) + + const maintainerItem = screen.getAllByTestId('maintainer-list-item') + expect(maintainerItem.length).toEqual(dummyMaintainers.length) }) + + it('shows unused links list',()=>{ + // it is maintainer of this organisation + dummyInvitationData.magicLink = null + dummyInvitationData.unusedInvitations = dummyInvitations as any + + mockUseSoftwareInvitations.mockReturnValueOnce(dummyInvitationData) + + render( + + + + + + ) + + // check number of unused invitations + const unusedInvites = screen.getAllByTestId('unused-invitation-item') + expect(unusedInvites.length).toEqual(dummyInvitations.length) + }) + }) diff --git a/frontend/components/software/edit/maintainers/SoftwareMaintainerLink.tsx b/frontend/components/software/edit/maintainers/SoftwareMaintainerLink.tsx deleted file mode 100644 index 7468b0886..000000000 --- a/frontend/components/software/edit/maintainers/SoftwareMaintainerLink.tsx +++ /dev/null @@ -1,107 +0,0 @@ -// SPDX-FileCopyrightText: 2022 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2022 Ewan Cahen (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2022 dv4all -// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) -// -// SPDX-License-Identifier: Apache-2.0 - -import {useState} from 'react' -import Button from '@mui/material/Button' -import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh' -import EmailIcon from '@mui/icons-material/Email' -import CopyIcon from '@mui/icons-material/ContentCopy' - -import {copyToClipboard,canCopyToClipboard} from '~/utils/copyToClipboard' -import useSnackbar from '~/components/snackbar/useSnackbar' -import {softwareMaintainerLink} from './useSoftwareMaintainers' -import {useEffect} from 'react' - -import {Invitation} from '~/types/Invitation' -import InvitationList from '~/components/layout/InvitationList' -import {getUnusedInvitations} from '~/utils/getUnusedInvitations' -import CopyToClipboard from '~/components/layout/CopyToClipboard' - -export default function SoftwareMaintainerLink({software,brand_name,account,token}: {software: string, brand_name: string, account: string,token: string}) { - const {showErrorMessage,showInfoMessage} = useSnackbar() - const [magicLink, setMagicLink] = useState(null) - const [unusedInvitations, setUnusedInvitations] = useState([]) - const canCopy = useState(canCopyToClipboard()) - - async function fetchUnusedInvitations() { - setUnusedInvitations(await getUnusedInvitations('software', software, token)) - } - - // eslint-disable-next-line react-hooks/exhaustive-deps - useEffect(() => {fetchUnusedInvitations()}, []) - - async function createInviteLink() { - const resp = await softwareMaintainerLink({ - software, - account, - token - }) - if (resp.status === 201) { - setMagicLink(resp.message) - fetchUnusedInvitations() - } else { - showErrorMessage(`Failed to generate maintainer link. ${resp.message}`) - } - } - - async function toClipboard(copied:boolean) { - // notify user about copy action - if (copied) { - showInfoMessage('Copied to clipboard') - } else { - showErrorMessage(`Failed to copy link ${magicLink}`) - } - } - - function renderLinkOptions() { - if (magicLink) { - return ( -
    -

    {magicLink}

    -
    - - -
    -
    - ) - } - return null - } - - return ( - <> - -
    - {renderLinkOptions()} - fetchUnusedInvitations()}/> - - ) -} diff --git a/frontend/components/software/edit/maintainers/SoftwareMaintainerLinks.tsx b/frontend/components/software/edit/maintainers/SoftwareMaintainerLinks.tsx new file mode 100644 index 000000000..88a434c82 --- /dev/null +++ b/frontend/components/software/edit/maintainers/SoftwareMaintainerLinks.tsx @@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import Button from '@mui/material/Button' +import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh' + +import InvitationList from '~/components/maintainers/InvitationList' +import useSoftwareContext from '../useSoftwareContext' +import {useSoftwareInvitations} from './useSoftwareInvitations' + +export default function SoftwareMaintainerLinks() { + const {software} = useSoftwareContext() + const {unusedInvitations,createInvitation,deleteInvitation} = useSoftwareInvitations({software:software.id}) + + // console.group('SoftwareMaintainerLinks') + // console.log('software...', software) + // console.log('magicLink...', magicLink) + // console.log('unusedInvitations...', unusedInvitations) + // console.groupEnd() + + return ( + <> + +
    + + + ) +} diff --git a/frontend/components/software/edit/maintainers/apiSoftwareMaintainers.ts b/frontend/components/software/edit/maintainers/apiSoftwareMaintainers.ts new file mode 100644 index 000000000..7a05a6be7 --- /dev/null +++ b/frontend/components/software/edit/maintainers/apiSoftwareMaintainers.ts @@ -0,0 +1,94 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import logger from '~/utils/logger' +import {createJsonHeaders, extractReturnMessage, getBaseUrl} from '~/utils/fetchHelpers' +import {RawMaintainerProps} from '~/components/maintainers/apiMaintainers' + +export async function getMaintainersOfSoftware({software, token}: + {software: string, token: string}) { + try { + const query = `rpc/maintainers_of_software?software_id=${software}` + const url = `${getBaseUrl()}/${query}` + + const resp = await fetch(url, { + method: 'GET', + headers: createJsonHeaders(token) + }) + + if (resp.status === 200) { + const json:RawMaintainerProps[] = await resp.json() + return json + } + // ERRORS + logger(`getMaintainersOfSoftware: ${resp.status}:${resp.statusText} software: ${software}`, 'warn') + return [] + } catch (e: any) { + logger(`getMaintainersOfSoftware: ${e?.message}`, 'error') + return [] + } +} + +export async function deleteMaintainerFromSoftware({maintainer,software,token}: + {maintainer:string,software:string,token:string}) { + try { + const query = `maintainer_for_software?maintainer=eq.${maintainer}&software=eq.${software}` + const url = `${getBaseUrl()}/${query}` + + const resp = await fetch(url, { + method: 'DELETE', + headers: createJsonHeaders(token) + }) + + return extractReturnMessage(resp) + + } catch (e: any) { + logger(`deleteMaintainerFromSoftware: ${e?.message}`, 'error') + return { + status: 500, + message: e?.message + } + } +} + +export async function softwareMaintainerLink({software, account, token}: + { software: string, account: string, token: string }) { + try { + // POST + const url = `${getBaseUrl()}/invite_maintainer_for_software` + const resp = await fetch(url, { + method: 'POST', + headers: { + ...createJsonHeaders(token), + 'Prefer': 'return=headers-only' + }, + body: JSON.stringify({ + software, + created_by:account + }) + }) + if (resp.status === 201) { + const id = resp.headers.get('location')?.split('.')[1] + if (id) { + const link = `${location.origin}/invite/software/${id}` + return { + status: 201, + message: link + } + } + return { + status: 400, + message: 'Id is missing' + } + } + return extractReturnMessage(resp, software ?? '') + } catch (e: any) { + logger(`softwareMaintainerLink: ${e?.message}`, 'error') + return { + status: 500, + message: e?.message + } + } +} diff --git a/frontend/components/software/edit/maintainers/index.tsx b/frontend/components/software/edit/maintainers/index.tsx index 6ca140e1c..dde62829f 100644 --- a/frontend/components/software/edit/maintainers/index.tsx +++ b/frontend/components/software/edit/maintainers/index.tsx @@ -1,52 +1,37 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 - 2023 dv4all +// SPDX-FileCopyrightText: 2022 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2022 Ewan Cahen (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2022 Netherlands eScience Center +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) // // SPDX-License-Identifier: Apache-2.0 -import {useEffect,useState} from 'react' +import {useState} from 'react' -import {useSession} from '~/auth' import ContentLoader from '~/components/layout/ContentLoader' import EditSection from '~/components/layout/EditSection' import EditSectionTitle from '~/components/layout/EditSectionTitle' -import ProjectMaintainersList from '~/components/projects/edit/maintainers/ProjectMaintainersList' import {maintainers as config} from '~/components/projects/edit/maintainers/config' import ConfirmDeleteModal from '~/components/layout/ConfirmDeleteModal' -import useSnackbar from '~/components/snackbar/useSnackbar' +import MaintainersList from '~/components/maintainers/MaintainersList' import useSoftwareContext from '../useSoftwareContext' -import useSoftwareMaintainers, { - deleteMaintainerFromSoftware, MaintainerOfSoftware -} from './useSoftwareMaintainers' -import SoftwareMaintainerLink from './SoftwareMaintainerLink' +import {useSoftwareMaintainers} from './useSoftwareMaintainers' +import SoftwareMaintainerLinks from './SoftwareMaintainerLinks' type DeleteModal = { open: boolean, - pos?: number, - displayName?:string + // unique account id + account?: string, + displayName?: string } export default function SoftwareMaintainers() { - const {token,user} = useSession() - const {showErrorMessage} = useSnackbar() const {software} = useSoftwareContext() - const {loading,maintainers} = useSoftwareMaintainers() - const [projectMaintainers, setProjectMaintaners] = useState([]) + const {loading,maintainers,deleteMaintainer} = useSoftwareMaintainers({software:software.id}) const [modal, setModal] = useState({ open: false }) - useEffect(() => { - let abort = false - if (loading === false && - abort === false) { - setProjectMaintaners(maintainers) - // setLoading(false) - } - return () => { abort = true } - },[maintainers,loading]) - if (loading) { return ( @@ -64,35 +49,12 @@ export default function SoftwareMaintainers() { if (maintainer) { setModal({ open: true, - pos, + account: maintainer.account, displayName: maintainer.name }) } } - async function deleteMaintainer(pos: number) { - // console.log('delete maintainer...pos...', pos) - closeModal() - const admin = maintainers[pos] - if (admin) { - const resp = await deleteMaintainerFromSoftware({ - maintainer: admin.account, - software: software.id ?? '', - token, - frontend: true - }) - if (resp.status === 200) { - const newMaintainersList = [ - ...maintainers.slice(0, pos), - ...maintainers.slice(pos+1) - ] - setProjectMaintaners(newMaintainersList) - } else { - showErrorMessage(`Failed to remove maintainer. ${resp.message}`) - } - } - } - return ( <> @@ -100,9 +62,9 @@ export default function SoftwareMaintainers() { -
    @@ -110,12 +72,7 @@ export default function SoftwareMaintainers() { title={config.inviteLink.title} subtitle={config.inviteLink.subtitle} /> - +
    Are you sure you want to remove {modal.displayName ?? 'No name'}?

    } - onCancel={() => { - setModal({ - open:false - }) + onCancel={closeModal} + onDelete={()=>{ + deleteMaintainer(modal.account) + closeModal() }} - onDelete={()=>deleteMaintainer(modal.pos ?? 0)} /> ) diff --git a/frontend/components/software/edit/maintainers/useSoftwareInvitations.tsx b/frontend/components/software/edit/maintainers/useSoftwareInvitations.tsx new file mode 100644 index 000000000..9f44a470a --- /dev/null +++ b/frontend/components/software/edit/maintainers/useSoftwareInvitations.tsx @@ -0,0 +1,78 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useCallback, useEffect, useState} from 'react' + +import {useSession} from '~/auth' +import {Invitation, deleteMaintainerLink, getUnusedInvitations} from '~/components/maintainers/apiMaintainers' +import useSnackbar from '~/components/snackbar/useSnackbar' +import {softwareMaintainerLink} from './apiSoftwareMaintainers' + +export function useSoftwareInvitations({software}:{software?:string}) { + const {token,user} = useSession() + const {showErrorMessage} = useSnackbar() + const [unusedInvitations,setUnusedInvitations] = useState([]) + // const [magicLink, setMagicLink] = useState(null) + + const loadUnusedInvitations = useCallback(()=>{ + // get unused invitation + getUnusedInvitations({ + id: software ?? '', + type: 'software', + token + }).then(items=>{ + // update + setUnusedInvitations(items) + }).catch(e=>{ + // update on error to empty array + setUnusedInvitations([]) + }) + },[software,token]) + + useEffect(()=>{ + let abort = false + if (software && token){ + loadUnusedInvitations() + } + return ()=>{abort=true} + },[software,token,loadUnusedInvitations]) + + const createInvitation = useCallback(async()=>{ + if (software && user?.account){ + const resp = await softwareMaintainerLink({ + software, + account:user?.account, + token + }) + if (resp.status===201){ + // reload unused invitation list + loadUnusedInvitations() + }else{ + showErrorMessage(`Failed to create invitation. ${resp.message}`) + } + } + // IGNORE showErrorMessage dependency + // eslint-disable-next-line react-hooks/exhaustive-deps + },[software,user?.account,token,loadUnusedInvitations]) + + const deleteInvitation = useCallback(async(invitation:Invitation)=>{ + const resp = await deleteMaintainerLink({ + invitation, + token + }) + if (resp.status===200){ + loadUnusedInvitations() + }else{ + showErrorMessage(`Failed to delete invitation. ${resp.message}`) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + },[token,loadUnusedInvitations]) + + return { + unusedInvitations, + deleteInvitation, + createInvitation + } +} diff --git a/frontend/components/software/edit/maintainers/useSoftwareMaintainers.tsx b/frontend/components/software/edit/maintainers/useSoftwareMaintainers.tsx index 0070d6b70..cb3972c63 100644 --- a/frontend/components/software/edit/maintainers/useSoftwareMaintainers.tsx +++ b/frontend/components/software/edit/maintainers/useSoftwareMaintainers.tsx @@ -1,198 +1,79 @@ // SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 dv4all +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) // SPDX-FileCopyrightText: 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 import {useState,useEffect} from 'react' -import {useSession} from '~/auth' -import {createJsonHeaders, extractReturnMessage} from '~/utils/fetchHelpers' -import logger from '~/utils/logger' -import useSoftwareContext from '../useSoftwareContext' - -export type RawMaintainerOfSoftware = { - // unique maintainer id - maintainer: string - name: string[] - email: string[] - affiliation: string[], -} - -export type MaintainerOfSoftware = { - // unique maintainer id - account: string - name: string - email: string - affiliation: string, -} - -export async function getMaintainersOfSoftware({software, token, frontend=true}: - {software: string, token: string,frontend?:boolean}) { - try { - let query = `rpc/maintainers_of_software?software_id=${software}` - let url = `/api/v1/${query}` - if (frontend === false) { - url = `${process.env.POSTGREST_URL}/${query}` - } - - const resp = await fetch(url, { - method: 'GET', - headers: createJsonHeaders(token) - }) - - if (resp.status === 200) { - const json:RawMaintainerOfSoftware[] = await resp.json() - return json - } - // ERRORS - logger(`getMaintainersOfSoftware: ${resp.status}:${resp.statusText} software: ${software}`, 'warn') - return [] - } catch (e: any) { - logger(`getMaintainersOfSoftware: ${e?.message}`, 'error') - return [] - } -} -export default function useSoftwareMaintainers() { - const {token} = useSession() - const {software} = useSoftwareContext() - const [maintainers, setMaintainers] = useState([]) +import {useSession} from '~/auth' +import useSnackbar from '~/components/snackbar/useSnackbar' +import {MaintainerProps, rawMaintainersToMaintainers} from '~/components/maintainers/apiMaintainers' +import {deleteMaintainerFromSoftware, getMaintainersOfSoftware} from './apiSoftwareMaintainers' + +export function useSoftwareMaintainers({software}:{software: string}) { + const {token,user} = useSession() + const {showErrorMessage} = useSnackbar() + const [maintainers, setMaintainers] = useState([]) const [loading, setLoading] = useState(true) - const [loadedSoftware, setLoadedSoftware] = useState('') + + // console.group('useSoftwareMaintainers') + // console.log('software...',software) + // console.log('token...',token) + // console.groupEnd() useEffect(() => { let abort = false async function getMaintainers() { setLoading(true) const raw_maintainers = await getMaintainersOfSoftware({ - software: software.id ?? '', - token, - frontend:true + software, + token }) const maintainers = rawMaintainersToMaintainers(raw_maintainers) if (abort) return null // update maintainers state setMaintainers(maintainers) // keep track what is loaded - setLoadedSoftware(software?.id ?? '') + // setLoadedSoftware(software?.id ?? '') // update loading flag setLoading(false) } - if (software.id && token && - software.id !== loadedSoftware) { + if (software && token) { getMaintainers() } return()=>{abort=true} - },[software?.id,token,loadedSoftware]) - - return {maintainers, loading} -} - -export function rawMaintainersToMaintainers(raw_maintainers: RawMaintainerOfSoftware[]) { - try { - const maintainers:MaintainerOfSoftware[] = [] - raw_maintainers.forEach(item => { - let maintainerWithMostInfo: MaintainerOfSoftware | null = null - let bestScore = -1 - // use name as second loop indicator - item.name.forEach((name, pos) => { - let score = 0 - if (name) { - score += 1 - } - if (item.email[pos]) { - score += 1 - } - if (item.affiliation[pos]) { - score += 1 - } + },[software,token]) - if (score <= bestScore) { - return - } - const maintainer: MaintainerOfSoftware = { - account: item.maintainer, - name, - email: item.email[pos] ? item.email[pos] : '', - affiliation: item.affiliation[pos] ? item.affiliation[pos] : '' - } - - maintainerWithMostInfo = maintainer - bestScore = score + async function deleteMaintainer(account?:string){ + if (account && software){ + const resp = await deleteMaintainerFromSoftware({ + maintainer: account, + software, + token }) - maintainers.push(maintainerWithMostInfo as unknown as MaintainerOfSoftware) - }) - return maintainers - } catch (e:any) { - logger(`rawMaintainersToMaintainers: ${e?.message}`,'error') - return [] - } -} - - -export async function deleteMaintainerFromSoftware({maintainer,software,token,frontend=true}: - {maintainer:string,software:string,token:string,frontend?:boolean}) { - try { - let query = `maintainer_for_software?maintainer=eq.${maintainer}&software=eq.${software}` - let url = `/api/v1/${query}` - if (frontend === false) { - url = `${process.env.POSTGREST_URL}/${query}` + if (resp.status === 200) { + // remove account + const newMaintainersList = maintainers.filter(item=>item.account!==account) + setMaintainers(newMaintainersList) + } else { + showErrorMessage(`Failed to remove maintainer. ${resp.message}`) + } } + } - const resp = await fetch(url, { - method: 'DELETE', - headers: createJsonHeaders(token) - }) - - return extractReturnMessage(resp) - - } catch (e: any) { - logger(`deleteMaintainerFromSoftware: ${e?.message}`, 'error') - return { - status: 500, - message: e?.message - } + // last maintainer can be deleted only by rsd-admin + if (maintainers?.length===1 && user?.role!=='rsd_admin'){ + // disable delete button on last maintainer + maintainers[0].disableDelete = true } -} -export async function softwareMaintainerLink({software, account, token}: - { software: string, account: string, token: string }) { - try { - // POST - const url = '/api/v1/invite_maintainer_for_software' - const resp = await fetch(url, { - method: 'POST', - headers: { - ...createJsonHeaders(token), - 'Prefer': 'return=headers-only' - }, - body: JSON.stringify({ - software, - created_by:account - }) - }) - if (resp.status === 201) { - const id = resp.headers.get('location')?.split('.')[1] - if (id) { - const link = `${location.origin}/invite/software/${id}` - return { - status: 201, - message: link - } - } - return { - status: 400, - message: 'Id is missing' - } - } - return extractReturnMessage(resp, software ?? '') - } catch (e: any) { - logger(`createMaintainerLink: ${e?.message}`, 'error') - return { - status: 500, - message: e?.message - } + return { + loading, + maintainers, + deleteMaintainer } } diff --git a/frontend/components/software/overview/SoftwareHighlights.tsx b/frontend/components/software/overview/SoftwareHighlights.tsx index 291cd2c28..5856c69ae 100644 --- a/frontend/components/software/overview/SoftwareHighlights.tsx +++ b/frontend/components/software/overview/SoftwareHighlights.tsx @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 - 2024 Christian Meeßen (GFZ) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 - 2024 Helmholtz Centre Potsdam - GFZ German Research Centre for Geosciences -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 dv4all // // SPDX-License-Identifier: Apache-2.0 @@ -24,14 +24,14 @@ export default function SoftwareHighlights({highlights}: { highlights: SoftwareH const {host} = useRsdSettings() const router = useRouter() - // if there are no hightlights we do not show this section + // if there are no highlights we do not show this section if (highlights.length===0) return null // show carousel only on first page if (typeof router.query.page === 'string' && parseInt(router.query.page) > 1) return null return ( -
    +
    // SPDX-FileCopyrightText: 2022 Jesús García Gonzalez (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) // // SPDX-License-Identifier: Apache-2.0 @@ -18,7 +18,7 @@ module.exports = { output: 'standalone', // enable source maps in production? productionBrowserSourceMaps: true, - // disable strict mode if you want react to render compent once + // disable strict mode if you want react to render component once // see for more info https://nextjs.org/docs/api-reference/next.config.js/react-strict-mode reactStrictMode: false, eslint: { @@ -39,6 +39,17 @@ module.exports = { ] }, + async redirects() { + return [ + // default community redirect to software page + { + source: '/communities/:slug', + destination: '/communities/:slug/software', + permanent: true, + } + ] + }, + webpack(config) { config.module.rules.push({ test: /\.svg$/i, diff --git a/frontend/pages/communities/[slug]/about.tsx b/frontend/pages/communities/[slug]/about.tsx new file mode 100644 index 000000000..022492d26 --- /dev/null +++ b/frontend/pages/communities/[slug]/about.tsx @@ -0,0 +1,126 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {GetServerSidePropsContext} from 'next' + +import {app} from '~/config/app' +import {getUserFromToken} from '~/auth' +import {getUserSettings} from '~/utils/userSettings' +import {EditCommunityProps, getCommunityBySlug} from '~/components/communities/apiCommunities' +import {LayoutType} from '~/components/software/overview/search/ViewToggleGroup' +import PageMeta from '~/components/seo/PageMeta' +import CanonicalUrl from '~/components/seo/CanonicalUrl' +import {isCommunityMaintainer} from '~/auth/permissions/isMaintainerOfCommunity' +import AboutCommunityPage from '~/components/communities/about' +import CommunityPage from '~/components/communities/CommunityPage' +import {getKeywordsByCommunity} from '~/components/communities/settings/general/apiCommunityKeywords' + +type CommunityAboutPage={ + community: EditCommunityProps, + slug: string[], + isMaintainer: boolean, + rsd_page_rows: number, + rsd_page_layout: LayoutType +} + +export default function CommunityAboutPage({ + community,slug,isMaintainer, + rsd_page_rows, rsd_page_layout +}:CommunityAboutPage) { + + // console.group('CommunityAboutPage') + // console.log('community...', community) + // console.log('slug....', slug) + // console.log('isMaintainer....', isMaintainer) + // console.log('rsd_page_rows....', rsd_page_rows) + // console.log('rsd_page_layout....', rsd_page_layout) + // console.groupEnd() + + function getMetaDescription() { + // use organisation (short) description if available + if (community.short_description) return community.short_description + // else generate description message + return `${community?.name ?? 'The RSD community'} with ${community.software_cnt ?? 0} software packages.` + } + + return ( + <> + {/* Page Head meta tags */} + + + {/* */} + + + + + ) +} + + +// fetching data server side +// see documentation https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering +export async function getServerSideProps(context:GetServerSidePropsContext) { + try{ + const {params, req, query} = context + // extract user settings from cookie + const {rsd_page_layout, rsd_page_rows} = getUserSettings(req) + // extract user id from session + const token = req?.cookies['rsd_token'] + const user = getUserFromToken(token) + // find community by slug + const community = await getCommunityBySlug({ + slug: params?.slug?.toString() ?? null, + token: req?.cookies['rsd_token'], + user + }) + // console.log('community...', community) + if (community === null || community?.description === null){ + // returning notFound triggers 404 page + return { + notFound: true, + } + } + // get info if the user is maintainer + const [isMaintainer,keywords] = await Promise.all([ + isCommunityMaintainer({ + community: community.id ?? '', + role: user?.role, + account: user?.account, + token + }), + getKeywordsByCommunity(community.id,token) + ]) + + return { + // passed to the page component as props + props: { + community:{ + ...community, + // use keywords for editing + keywords + }, + slug: [params?.slug], + tab: query?.tab ?? null, + isMaintainer, + rsd_page_layout, + rsd_page_rows + }, + } + }catch(e){ + return { + notFound: true, + } + } +} diff --git a/frontend/pages/communities/[slug]/settings.tsx b/frontend/pages/communities/[slug]/settings.tsx index 89bc5e4c9..d34b30f64 100644 --- a/frontend/pages/communities/[slug]/settings.tsx +++ b/frontend/pages/communities/[slug]/settings.tsx @@ -3,8 +3,125 @@ // // SPDX-License-Identifier: Apache-2.0 -export default function CommunitySettings() { +import {GetServerSidePropsContext} from 'next' + +import {app} from '~/config/app' +import {getUserFromToken} from '~/auth' +import {isCommunityMaintainer} from '~/auth/permissions/isMaintainerOfCommunity' +import {getUserSettings} from '~/utils/userSettings' +import {EditCommunityProps, getCommunityBySlug} from '~/components/communities/apiCommunities' +import {LayoutType} from '~/components/software/overview/search/ViewToggleGroup' +import PageMeta from '~/components/seo/PageMeta' +import CanonicalUrl from '~/components/seo/CanonicalUrl' +import CommunitySettingsContent from '~/components/communities/settings' +import CommunityPage from '~/components/communities/CommunityPage' +import {getKeywordsByCommunity} from '~/components/communities/settings/general/apiCommunityKeywords' + +type CommunitySoftwareProps={ + community: EditCommunityProps, + slug: string[], + isMaintainer: boolean, + rsd_page_rows: number, + rsd_page_layout: LayoutType +} + +export default function CommunitySettingsPage({ + community,slug, isMaintainer, + rsd_page_rows, rsd_page_layout +}:CommunitySoftwareProps) { + + // console.group('CommunitySettingsPage') + // console.log('community...', community) + // console.log('slug....', slug) + // console.log('isMaintainer....', isMaintainer) + // console.log('rsd_page_rows....', rsd_page_rows) + // console.log('rsd_page_layout....', rsd_page_layout) + // console.groupEnd() + + + function getMetaDescription() { + // use organisation (short) description if available + if (community.short_description) return community.short_description + // else generate description message + return `${community?.name ?? 'The RSD community'} with ${community.software_cnt ?? 0} software packages.` + } + return ( -

    Software community page - settings

    + <> + {/* Page Head meta tags */} + + + + + + ) } + +// fetching data server side +// see documentation https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering +export async function getServerSideProps(context:GetServerSidePropsContext) { + try{ + const {params, req, query} = context + // extract user settings from cookie + const {rsd_page_layout, rsd_page_rows} = getUserSettings(req) + // extract user id from session + const token = req?.cookies['rsd_token'] + const user = getUserFromToken(token) + // find community by slug + const community = await getCommunityBySlug({ + slug: params?.slug?.toString() ?? null, + token: req?.cookies['rsd_token'], + user + }) + // console.log('community...', community) + if (community === null){ + // returning notFound triggers 404 page + return { + notFound: true, + } + } + // get info if the user is maintainer + const [isMaintainer,keywords] = await Promise.all([ + isCommunityMaintainer({ + community: community.id ?? '', + role: user?.role, + account: user?.account, + token + }), + getKeywordsByCommunity(community.id,token) + ]) + + return { + // passed to the page component as props + props: { + community:{ + ...community, + // use keywords for editing + keywords + }, + slug: [params?.slug], + tab: query?.tab ?? null, + isMaintainer, + rsd_page_layout, + rsd_page_rows + }, + } + }catch(e){ + return { + notFound: true, + } + } +} diff --git a/frontend/pages/communities/[slug]/software.tsx b/frontend/pages/communities/[slug]/software.tsx index 156e15de1..4c5e5a2f0 100644 --- a/frontend/pages/communities/[slug]/software.tsx +++ b/frontend/pages/communities/[slug]/software.tsx @@ -8,20 +8,16 @@ import {GetServerSidePropsContext} from 'next' import {app} from '~/config/app' import {getUserFromToken} from '~/auth' import {getUserSettings} from '~/utils/userSettings' -import {CommunityListProps, getCommunityBySlug} from '~/components/communities/apiCommunities' +import {EditCommunityProps, getCommunityBySlug} from '~/components/communities/apiCommunities' import {LayoutType} from '~/components/software/overview/search/ViewToggleGroup' import PageMeta from '~/components/seo/PageMeta' import CanonicalUrl from '~/components/seo/CanonicalUrl' -import BackgroundAndLayout from '~/components/layout/BackgroundAndLayout' -import {UserSettingsProvider} from '~/components/organisation/context/UserSettingsContext' -import PageBreadcrumbs from '~/components/layout/PageBreadcrumbs' -import BaseSurfaceRounded from '~/components/layout/BaseSurfaceRounded' -import CommunityMetadata from '~/components/communities/metadata' -import CommunityTabs from '~/components/communities/tabs' import {isCommunityMaintainer} from '~/auth/permissions/isMaintainerOfCommunity' +import CommunityPage from '~/components/communities/CommunityPage' +import {getKeywordsByCommunity} from '~/components/communities/settings/general/apiCommunityKeywords' type CommunitySoftwareProps={ - community: CommunityListProps, + community: EditCommunityProps, slug: string[], isMaintainer: boolean, rsd_page_rows: number, @@ -33,14 +29,13 @@ export default function CommunitySoftwarePage({ rsd_page_rows, rsd_page_layout }:CommunitySoftwareProps) { - console.group('CommunitySoftwarePage') - console.log('community...', community) - console.log('slug....', slug) - console.log('isMaintainer....', isMaintainer) - console.log('rsd_page_rows....', rsd_page_rows) - console.log('rsd_page_layout....', rsd_page_layout) - console.groupEnd() - + // console.group('CommunitySoftwarePage') + // console.log('community...', community) + // console.log('slug....', slug) + // console.log('isMaintainer....', isMaintainer) + // console.log('rsd_page_rows....', rsd_page_rows) + // console.log('rsd_page_layout....', rsd_page_layout) + // console.groupEnd() function getMetaDescription() { // use organisation (short) description if available @@ -57,49 +52,16 @@ export default function CommunitySoftwarePage({ description={getMetaDescription()} /> - - - {/* COMMUNITY HEADER */} - - - - {/* TABS */} - - - - {/* TAB CONTENT */} -
    - {/* */} -

    Community software - TO DO!

    -
    -
    -
    + +

    Community software - TO DO!

    +
    ) } @@ -129,17 +91,24 @@ export async function getServerSideProps(context:GetServerSidePropsContext) { } } // get info if the user is maintainer - const isMaintainer = await isCommunityMaintainer({ - community: community.id, - role: user?.role, - account: user?.account, - token - }) + const [isMaintainer,keywords] = await Promise.all([ + isCommunityMaintainer({ + community: community.id ?? '', + role: user?.role, + account: user?.account, + token + }), + getKeywordsByCommunity(community.id,token) + ]) return { // passed to the page component as props props: { - community, + community:{ + ...community, + // use keywords for editing + keywords + }, slug: [params?.slug], tab: query?.tab ?? null, isMaintainer, diff --git a/frontend/pages/communities/index.tsx b/frontend/pages/communities/index.tsx index 9ff8b9c9b..ffb4f103b 100644 --- a/frontend/pages/communities/index.tsx +++ b/frontend/pages/communities/index.tsx @@ -5,6 +5,7 @@ import {useState} from 'react' import {GetServerSidePropsContext} from 'next/types' +import Link from 'next/link' import Pagination from '@mui/material/Pagination' import PaginationItem from '@mui/material/PaginationItem' @@ -22,7 +23,6 @@ import SelectRows from '~/components/software/overview/search/SelectRows' import {LayoutType} from '~/components/software/overview/search/ViewToggleGroup' import ViewToggleGroup,{ProjectLayoutType} from '~/components/projects/overview/search/ViewToggleGroup' -import {Community} from '~/components/admin/communities/apiCommunities' import CommunitiesList from '~/components/communities/overview/CommunitiesList' import CommunitiesGrid from '~/components/communities/overview/CommunitiesGrid' import {CommunityListProps, getCommunityList} from '~/components/communities/apiCommunities' @@ -113,9 +113,9 @@ export default function CommunitiesOverview({count,page,rows,layout,search,commu renderItem={item => { if (item.page !== null) { return ( - + - + ) } else { return ( diff --git a/frontend/pages/invite/community/[id].tsx b/frontend/pages/invite/community/[id].tsx new file mode 100644 index 000000000..f8d54f921 --- /dev/null +++ b/frontend/pages/invite/community/[id].tsx @@ -0,0 +1,123 @@ +// SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) +// SPDX-FileCopyrightText: 2022 - 2023 dv4all +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {GetServerSidePropsContext} from 'next' +import Head from 'next/head' +import Link from 'next/link' + +import {claimCommunityMaintainerInvite} from '~/auth/api/authHelpers' +import {getAccountFromToken} from '~/auth/jwtUtils' +import ContentInTheMiddle from '~/components/layout/ContentInTheMiddle' +import DefaultLayout from '~/components/layout/DefaultLayout' +import PageErrorMessage from '~/components/layout/PageErrorMessage' +import PageTitle from '~/components/layout/PageTitle' + +type InviteCommunityMaintainerProps = { + communityInfo: { + id: string, + name: string, + slug: string + }|null, + error: { + status: number, + message: string + }|null +} + +export default function InviteCommunityMaintainer({communityInfo, error}: InviteCommunityMaintainerProps) { + + // console.group('InviteCommunityMaintainer') + // console.log('communityInfo..', communityInfo) + // console.log('error..', error) + // console.groupEnd() + + function renderContent() { + if (typeof error == 'undefined' || error === null) { + return ( + +

    + You are now a maintainer of {communityInfo?.name ?? 'missing'}! +   + + Open community page + +

    +
    + ) + } + return ( + + ) + } + + return ( + + + Community Maintainer Invite | RSD + + + {renderContent()} + + ) +} + +// fetching data server side +// see documentation https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering +export async function getServerSideProps(context: GetServerSidePropsContext) { + // extract from page-query + const {params,req} = context + // extract rsd_token + const token = req?.cookies['rsd_token'] + // extract id + const id = params?.id + + // extract account id from token + const account = getAccountFromToken(token) + // console.log('account...', account) + if (typeof account == 'undefined') { + return { + props: { + projectInfo: null, + error: { + status: 401, + message: 'You need to sign in to RSD first!' + } + } + } + } + + if (id) { + // claim the software maintainer invite + const resp:InviteCommunityMaintainerProps = await claimCommunityMaintainerInvite({ + id: id.toString(), + token + }) + // returns id of community + if (resp?.communityInfo?.id) { + // pass software info to page component as props + return { + props: { + communityInfo: resp.communityInfo + } + } + } + // error from first request + return { + props: resp + } + } + + return { + props: { + communityInfo:null, + error: { + status: 404, + message: 'This invite is invalid. It\'s missing invite id. Please ask the community maintainer to provide you a new link.' + } + } + } +} diff --git a/frontend/pages/invite/organisation/[id].tsx b/frontend/pages/invite/organisation/[id].tsx index e475e6ee7..7108dac7d 100644 --- a/frontend/pages/invite/organisation/[id].tsx +++ b/frontend/pages/invite/organisation/[id].tsx @@ -1,5 +1,7 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 - 2023 dv4all +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 @@ -132,7 +134,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { organisationInfo:null, error: { status: 404, - message: 'This invite is invalid. It\'s missing invite id. Please ask the organisation mantainer to provide you a new link.' + message: 'This invite is invalid. It\'s missing invite id. Please ask the organisation maintainer to provide you a new link.' } } } diff --git a/frontend/pages/organisations/[...slug].tsx b/frontend/pages/organisations/[...slug].tsx index 8c18bac75..c7d5ba3dd 100644 --- a/frontend/pages/organisations/[...slug].tsx +++ b/frontend/pages/organisations/[...slug].tsx @@ -1,9 +1,8 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 - 2023 dv4all -// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center +// SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) // // SPDX-License-Identifier: Apache-2.0 @@ -99,7 +98,7 @@ export default function OrganisationPage({ {/* TAB CONTENT */} -
    +
    diff --git a/frontend/styles/custom.css b/frontend/styles/custom.css index dee2d556f..5c4668b01 100644 --- a/frontend/styles/custom.css +++ b/frontend/styles/custom.css @@ -1,8 +1,8 @@ /* * SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) * SPDX-FileCopyrightText: 2022 - 2023 dv4all - * SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) - * SPDX-FileCopyrightText: 2023 Netherlands eScience Center + * SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) + * SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center * * SPDX-License-Identifier: Apache-2.0 */ @@ -179,4 +179,11 @@ body { opacity: 0; animation-name: fadeInUp; -webkit-animation-name: fadeInUp; -} \ No newline at end of file +} + +/* fallback styles when JS is not supported */ +@media (scripting: none) { + .hide-on-no-script{ + display: none; + } +} diff --git a/frontend/styles/global.css b/frontend/styles/global.css index f6f50293a..50b5641b4 100644 --- a/frontend/styles/global.css +++ b/frontend/styles/global.css @@ -1,8 +1,8 @@ /* * SPDX-FileCopyrightText: 2021 - 2023 Dusan Mijatovic (dv4all) * SPDX-FileCopyrightText: 2021 - 2023 dv4all - * SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) - * SPDX-FileCopyrightText: 2023 Netherlands eScience Center + * SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) + * SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center * * SPDX-License-Identifier: Apache-2.0 */ @@ -26,7 +26,7 @@ body{ NOTE ! when changing this value we need to update useDisableScrollLock hook in utils folder too. */ - min-width: 23rem; + min-width: 30rem; } #__next { diff --git a/frontend/utils/jest/WithCommunityContext.tsx b/frontend/utils/jest/WithCommunityContext.tsx new file mode 100644 index 000000000..2580ce897 --- /dev/null +++ b/frontend/utils/jest/WithCommunityContext.tsx @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) (dv4all) +// SPDX-FileCopyrightText: 2022 - 2023 dv4all +// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {CommunityProvider} from '~/components/communities/context/index' + +/** + * Wraps tested component with the EditProjectProvider (context) + * @param param0 + * @returns + */ +export function WithCommunityContext(props?:any) { + return ( + + ) +} diff --git a/frontend/utils/useDisableScrollLock.tsx b/frontend/utils/useDisableScrollLock.tsx index 8a2e66de4..95de514f4 100644 --- a/frontend/utils/useDisableScrollLock.tsx +++ b/frontend/utils/useDisableScrollLock.tsx @@ -1,5 +1,7 @@ // SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 dv4all +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 @@ -14,6 +16,6 @@ import useMediaQuery from '@mui/material/useMediaQuery' * @returns boolean */ export default function useDisableScrollLock() { - const disable = useMediaQuery('(max-width:23rem)') + const disable = useMediaQuery('(max-width:30rem)') return disable } From f8516f70f2d4cd6740f70cbb80ee8ba5aa728ab3 Mon Sep 17 00:00:00 2001 From: Dusan Mijatovic Date: Thu, 30 May 2024 11:04:50 +0200 Subject: [PATCH 4/9] feat: implement community software page and refactor organisation software page (#1213) feat: add seprate tabs for pending requests and rejected requirest fix: data generation fix formatting (main.js) --- data-generation/main.js | 68 ++-- database/124-community-views.sql | 309 +++++++++++++++++- .../permissions/isMaintainerOfCommunity.ts | 2 +- .../components/communities/CommunityPage.tsx | 2 + .../components/communities/apiCommunities.ts | 77 ++++- .../components/communities/context/index.tsx | 2 + .../communities/overview/CommunityCard.tsx | 7 +- .../overview/CommunityListItem.tsx | 7 +- .../communities/overview/CommunityMetrics.tsx | 17 +- .../software/CommunitySoftwareOverview.tsx | 84 +++++ .../software/apiCommunitySoftware.ts | 246 ++++++++++++++ .../software/card/AdminSoftwareGridCard.tsx | 69 ++++ .../software/card/StatusBanner.tsx | 56 ++++ .../software/card/useAdminMenuOptions.tsx | 59 ++++ .../software/card/useSoftwareCardActions.tsx | 75 +++++ .../filters/OrderCommunitySoftwareBy.tsx | 45 +++ .../filters/apiCommunitySoftwareFilters.ts | 150 +++++++++ .../communities/software/filters/index.tsx | 88 +++++ .../components/communities/software/index.tsx | 105 ++++++ .../software/list/AdminSoftwareListItem.tsx | 54 +++ .../communities/software/search/index.tsx | 92 ++++++ .../communities/tabs/CommunityTabItems.tsx | 26 +- .../components/communities/tabs/index.tsx | 15 +- .../FiltersModal.tsx} | 30 +- .../filter/useFilterQueryChange.test.tsx | 70 ++++ .../filter/useFilterQueryChange.tsx | 60 ++++ .../projects/filters/OrgOrderProjectsBy.tsx | 56 +++- .../filters/OrgProjectFiltersModal.tsx | 60 ---- .../filters/OrgProjectKeywordsFilter.tsx | 29 -- .../filters/OrgProjectOrganisationsFilter.tsx | 28 -- .../filters/OrgResearchDomainFilter.tsx | 34 -- .../{OrgProjectFilters.tsx => index.tsx} | 47 +-- .../filters/useProjectOrderOptions.tsx | 47 --- .../organisation/projects/index.tsx | 2 +- .../search/OrgSearchProjectSection.tsx | 28 +- .../projects/useOrganisationProjects.tsx | 7 +- .../organisation/projects/useQueryChange.tsx | 51 +-- .../software/filters/OrgOrderSoftwareBy.tsx | 55 +++- .../filters/OrgSoftwareKeywordsFilter.tsx | 29 -- .../filters/OrgSoftwareLanguagesFilter.tsx | 28 -- .../filters/OrgSoftwareLicensesFilter.tsx | 29 -- .../{OrgSoftwareFilters.tsx => index.tsx} | 46 ++- .../filters/useSoftwareOrderOptions.tsx | 45 --- .../software/filters/useSoftwareParams.tsx | 11 +- .../organisation/software/index.tsx | 2 +- .../search/OrgSearchSoftwareSection.tsx | 24 +- .../software/useOrganisationSoftware.tsx | 6 +- .../overview/filters/ProjectFiltersModal.tsx | 9 +- .../filters/ProjectKeywordsFilter.tsx | 28 -- .../filters/ProjectOrganisationsFilter.tsx | 33 -- .../filters/ProjectResearchDomainFilter.tsx | 34 -- .../filters/{ProjectFilters.tsx => index.tsx} | 46 +-- .../filters/SoftwareKeywordsFilter.tsx | 82 ----- .../filters/SoftwareLanguagesFilter.tsx | 28 -- .../filters/SoftwareLicensesFilter.tsx | 29 -- .../software/overview/filters/index.tsx | 50 +-- .../overview/search/SoftwareSearchSection.tsx | 6 +- frontend/pages/communities/[slug]/about.tsx | 17 +- .../pages/communities/[slug]/rejected.tsx | 156 +++++++++ .../pages/communities/[slug]/requests.tsx | 156 +++++++++ .../pages/communities/[slug]/settings.tsx | 17 +- .../pages/communities/[slug]/software.tsx | 86 +++-- frontend/pages/communities/index.tsx | 2 +- frontend/pages/projects/index.tsx | 6 +- frontend/utils/pagination.ts | 5 + 65 files changed, 2376 insertions(+), 893 deletions(-) create mode 100644 frontend/components/communities/software/CommunitySoftwareOverview.tsx create mode 100644 frontend/components/communities/software/apiCommunitySoftware.ts create mode 100644 frontend/components/communities/software/card/AdminSoftwareGridCard.tsx create mode 100644 frontend/components/communities/software/card/StatusBanner.tsx create mode 100644 frontend/components/communities/software/card/useAdminMenuOptions.tsx create mode 100644 frontend/components/communities/software/card/useSoftwareCardActions.tsx create mode 100644 frontend/components/communities/software/filters/OrderCommunitySoftwareBy.tsx create mode 100644 frontend/components/communities/software/filters/apiCommunitySoftwareFilters.ts create mode 100644 frontend/components/communities/software/filters/index.tsx create mode 100644 frontend/components/communities/software/index.tsx create mode 100644 frontend/components/communities/software/list/AdminSoftwareListItem.tsx create mode 100644 frontend/components/communities/software/search/index.tsx rename frontend/components/{organisation/software/filters/OrgSoftwareFiltersModal.tsx => filter/FiltersModal.tsx} (67%) create mode 100644 frontend/components/filter/useFilterQueryChange.test.tsx create mode 100644 frontend/components/filter/useFilterQueryChange.tsx delete mode 100644 frontend/components/organisation/projects/filters/OrgProjectFiltersModal.tsx delete mode 100644 frontend/components/organisation/projects/filters/OrgProjectKeywordsFilter.tsx delete mode 100644 frontend/components/organisation/projects/filters/OrgProjectOrganisationsFilter.tsx delete mode 100644 frontend/components/organisation/projects/filters/OrgResearchDomainFilter.tsx rename frontend/components/organisation/projects/filters/{OrgProjectFilters.tsx => index.tsx} (68%) delete mode 100644 frontend/components/organisation/projects/filters/useProjectOrderOptions.tsx delete mode 100644 frontend/components/organisation/software/filters/OrgSoftwareKeywordsFilter.tsx delete mode 100644 frontend/components/organisation/software/filters/OrgSoftwareLanguagesFilter.tsx delete mode 100644 frontend/components/organisation/software/filters/OrgSoftwareLicensesFilter.tsx rename frontend/components/organisation/software/filters/{OrgSoftwareFilters.tsx => index.tsx} (61%) delete mode 100644 frontend/components/organisation/software/filters/useSoftwareOrderOptions.tsx delete mode 100644 frontend/components/projects/overview/filters/ProjectKeywordsFilter.tsx delete mode 100644 frontend/components/projects/overview/filters/ProjectOrganisationsFilter.tsx delete mode 100644 frontend/components/projects/overview/filters/ProjectResearchDomainFilter.tsx rename frontend/components/projects/overview/filters/{ProjectFilters.tsx => index.tsx} (61%) delete mode 100644 frontend/components/software/overview/filters/SoftwareKeywordsFilter.tsx delete mode 100644 frontend/components/software/overview/filters/SoftwareLanguagesFilter.tsx delete mode 100644 frontend/components/software/overview/filters/SoftwareLicensesFilter.tsx create mode 100644 frontend/pages/communities/[slug]/rejected.tsx create mode 100644 frontend/pages/communities/[slug]/requests.tsx diff --git a/data-generation/main.js b/data-generation/main.js index bd5498068..bc489aeea 100644 --- a/data-generation/main.js +++ b/data-generation/main.js @@ -91,7 +91,7 @@ function generateMentions(amountExtra = 100) { return result; } -function generateSoftware(amount=500) { +function generateSoftware(amount = 500) { // real software has a real concept DOI const amountRealSoftware = Math.min(conceptDois.length, amount); const brandNames = []; @@ -358,7 +358,7 @@ function generateSoftwareHighlights(ids) { return result; } -function generateProjects(amount=500) { +function generateProjects(amount = 500) { const result = []; const projectStatuses = ['finished', 'running', 'starting']; @@ -509,7 +509,7 @@ function generateUrlsForProjects(ids) { return result; } -function generateOrganisations(amount=500) { +function generateOrganisations(amount = 500) { const rorIds = [ 'https://ror.org/000k1q888', 'https://ror.org/006hf6230', @@ -596,14 +596,18 @@ function generateCommunities(amount = 50) { for (let index = 0; index < amount; index++) { const maxWords = faker.helpers.maybe(() => 5, {probability: 0.8}) ?? 31; - const name = generateUniqueCaseInsensitiveString(() => ('Community: ' + faker.word.words(faker.number.int({max: maxWords, min: 1}))).substring(0, 200)); + const name = generateUniqueCaseInsensitiveString(() => + ('Community: ' + faker.word.words(faker.number.int({max: maxWords, min: 1}))).substring(0, 200), + ); result.push({ slug: faker.helpers.slugify(name).toLowerCase().replaceAll(/-{2,}/g, '-').replaceAll(/-+$/g, ''), // removes double dashes and trailing dashes name: name, short_description: faker.helpers.maybe(() => faker.lorem.paragraphs(1, '\n\n'), {probability: 0.8}) ?? null, description: faker.helpers.maybe(() => faker.lorem.paragraphs(1, '\n\n'), {probability: 0.8}) ?? null, - logo_id: faker.helpers.maybe(() => localOrganisationLogoIds[index % localImageIds.length], {probability: 0.8}) ?? null, + logo_id: + faker.helpers.maybe(() => localOrganisationLogoIds[index % localImageIds.length], {probability: 0.8}) ?? + null, }); } @@ -656,7 +660,7 @@ function generateNews() { }, { title: 'Sunsetting the RSD', - slug: 'sunsetting-the-rsd' + slug: 'sunsetting-the-rsd', }, { title: 'The last package you will ever need', @@ -672,19 +676,19 @@ function generateNews() { }, { title: 'Rewriting the RSD in CrabLang', - slug: 'rewrite-rsd-crablang' + slug: 'rewrite-rsd-crablang', }, { title: 'The RSD joins forces with Big Company (tm)', - slug: 'rsd-joins-big-company' + slug: 'rsd-joins-big-company', }, { - title: '3 features you didn\'t know about', - slug: '3-features' + title: "3 features you didn't know about", + slug: '3-features', }, { title: 'Interview with RSD founders', - slug: 'interview-rsd-founders' + slug: 'interview-rsd-founders', }, ]; @@ -761,7 +765,11 @@ function generateProjectForOrganisation(idsProjects, idsOrganisations) { function generateSoftwareForCommunity(idsSoftware, idsCommunities) { const result = generateRelationsForDifferingEntities(idsCommunities, idsSoftware, 'community', 'software'); - const statuses = [{weight: 1, value: 'pending'}, {weight: 8, value: 'approved'}, {weight: 1, value: 'rejected'}]; + const statuses = [ + {weight: 1, value: 'pending'}, + {weight: 8, value: 'approved'}, + {weight: 1, value: 'rejected'}, + ]; result.forEach(entry => { entry['status'] = faker.helpers.weightedArrayElement(statuses); }); @@ -1025,7 +1033,7 @@ const communityPromise = postToBackend('/community', generateCommunities()) .then(resp => resp.json()) .then(async commArray => { idsCommunities = commArray.map(comm => comm['id']); - postToBackend('/keyword_for_community', generateKeywordsForEntity(idsCommunities, idsKeywords, 'community')) + postToBackend('/keyword_for_community', generateKeywordsForEntity(idsCommunities, idsKeywords, 'community')); }); await postToBackend('/meta_pages', generateMetaPages()).then(() => console.log('meta pages done')); @@ -1036,14 +1044,34 @@ await postToBackend('/news?select=id', generateNews()) .then(newsIds => postToBackend('/image_for_news', generateImagesForNews(newsIds, localImageIds))) .then(() => console.log('news done')); -await Promise.all([softwarePromise, projectPromise, organisationPromise, communityPromise]).then(() => console.log('sw, pj, org, comm done')); +await Promise.all([softwarePromise, projectPromise, organisationPromise, communityPromise]).then(() => + console.log('sw, pj, org, comm done'), +); -await postToBackend('/software_for_project', generateRelationsForDifferingEntities(idsSoftware, idsProjects, 'software', 'project')).then(() => console.log('sw-pj done')); -await postToBackend('/software_for_organisation', generateRelationsForDifferingEntities(idsSoftware, idsOrganisations, 'software', 'organisation')).then(() => console.log('sw-org done')); -await postToBackend('/project_for_organisation', generateProjectForOrganisation(idsProjects, idsOrganisations)).then(() => console.log('pj-org done')); -await postToBackend('/software_for_community', generateSoftwareForCommunity(idsSoftware, idsCommunities)).then(() => console.log('sw-comm done')); -await postToBackend('/release', idsSoftware.map(id => ({software: id}))) - .then(() => postToBackend('/release_version', generateRelationsForDifferingEntities(idsFakeSoftware, idsMentions, 'release_id', 'mention_id', 100))) +await postToBackend( + '/software_for_project', + generateRelationsForDifferingEntities(idsSoftware, idsProjects, 'software', 'project'), +).then(() => console.log('sw-pj done')); +await postToBackend( + '/software_for_organisation', + generateRelationsForDifferingEntities(idsSoftware, idsOrganisations, 'software', 'organisation'), +).then(() => console.log('sw-org done')); +await postToBackend('/project_for_organisation', generateProjectForOrganisation(idsProjects, idsOrganisations)).then( + () => console.log('pj-org done'), +); +await postToBackend('/software_for_community', generateSoftwareForCommunity(idsSoftware, idsCommunities)).then(() => + console.log('sw-comm done'), +); +await postToBackend( + '/release', + idsSoftware.map(id => ({software: id})), +) + .then(() => + postToBackend( + '/release_version', + generateRelationsForDifferingEntities(idsFakeSoftware, idsMentions, 'release_id', 'mention_id', 100), + ), + ) .then(() => console.log('releases done')); console.log('Done'); diff --git a/database/124-community-views.sql b/database/124-community-views.sql index 93d1abcff..ad4aa5843 100644 --- a/database/124-community-views.sql +++ b/database/124-community-views.sql @@ -5,26 +5,69 @@ -- SPDX-License-Identifier: Apache-2.0 -- Software count by community -CREATE FUNCTION software_count_by_community() RETURNS TABLE ( +-- BY DEFAULT we return count of approved software +-- IF public is FALSE we return approved software that is not published too +CREATE FUNCTION software_count_by_community(public BOOLEAN DEFAULT TRUE) RETURNS TABLE ( community UUID, software_cnt BIGINT ) LANGUAGE sql STABLE AS $$ SELECT - community.id, - COUNT(software_for_community.software) AS software_cnt + software_for_community.community, + COUNT(DISTINCT software_for_community.software) AS software_cnt FROM - community -LEFT JOIN - software_for_community ON community.id = software_for_community.community + software_for_community +WHERE + software_for_community.status = 'approved' AND ( + NOT public OR software IN (SELECT id FROM software WHERE is_published) + ) GROUP BY - community.id + software_for_community.community ; $$; +-- Pending software count by community +-- BY DEFAULT we return count of approved software +-- IF public is FALSE we return total count (as far as RLS allows) +CREATE FUNCTION pending_count_by_community() RETURNS TABLE ( + community UUID, + pending_cnt BIGINT +) LANGUAGE sql STABLE AS +$$ +SELECT + software_for_community.community, + COUNT(DISTINCT software_for_community.software) AS pending_cnt +FROM + software_for_community +WHERE + software_for_community.status = 'pending' +GROUP BY + software_for_community.community +; +$$; --- Keywords with the count used by --- by search to show existing keywords with the count +-- Rejected software count by community +-- BY DEFAULT we return count of approved software +-- IF public is FALSE we return total count (as far as RLS allows) +CREATE FUNCTION rejected_count_by_community() RETURNS TABLE ( + community UUID, + rejected_cnt BIGINT +) LANGUAGE sql STABLE AS +$$ +SELECT + software_for_community.community, + COUNT(DISTINCT software_for_community.software) AS rejected_cnt +FROM + software_for_community +WHERE + software_for_community.status = 'rejected' +GROUP BY + software_for_community.community +; +$$; + +-- Keywords with the count used by keyword settings +-- to show existing keywords with the count CREATE FUNCTION keyword_count_for_community() RETURNS TABLE ( id UUID, keyword CITEXT, @@ -94,8 +137,9 @@ $$; -- rpc for community overview page --- incl. software count and keyword list (for card) -CREATE FUNCTION communities_overview() RETURNS TABLE ( +-- BY DEFAULT we return count of approved software +-- IF public is FALSE we return total count (as far as RLS allows) +CREATE FUNCTION communities_overview(public BOOLEAN DEFAULT TRUE) RETURNS TABLE ( id UUID, slug VARCHAR, name VARCHAR, @@ -103,6 +147,8 @@ CREATE FUNCTION communities_overview() RETURNS TABLE ( logo_id VARCHAR, primary_maintainer UUID, software_cnt BIGINT, + pending_cnt BIGINT, + rejected_cnt BIGINT, keywords CITEXT[], description VARCHAR, created_at TIMESTAMPTZ @@ -116,14 +162,253 @@ SELECT community.logo_id, community.primary_maintainer, software_count_by_community.software_cnt, + pending_count_by_community.pending_cnt, + rejected_count_by_community.rejected_cnt, keyword_filter_for_community.keywords, community.description, community.created_at FROM community LEFT JOIN - software_count_by_community() ON community.id = software_count_by_community.community + software_count_by_community(public) ON community.id = software_count_by_community.community +LEFT JOIN + pending_count_by_community() ON community.id = pending_count_by_community.community +LEFT JOIN + rejected_count_by_community() ON community.id = rejected_count_by_community.community LEFT JOIN keyword_filter_for_community() ON community.id=keyword_filter_for_community.community ; $$; + + +-- SOFTWARE info by community +-- we filter this view at least by community_id (uuid) +CREATE FUNCTION software_by_community(community_id UUID) RETURNS TABLE ( + id UUID, + slug VARCHAR, + brand_name VARCHAR, + short_statement VARCHAR, + image_id VARCHAR, + is_published BOOLEAN, + updated_at TIMESTAMPTZ, + status request_status, + keywords CITEXT[], + prog_lang TEXT[], + licenses VARCHAR[], + contributor_cnt BIGINT, + mention_cnt BIGINT +) LANGUAGE sql STABLE AS +$$ + +SELECT DISTINCT ON (software.id) + software.id, + software.slug, + software.brand_name, + software.short_statement, + software.image_id, + software.is_published, + software.updated_at, + software_for_community.status, + keyword_filter_for_software.keywords, + prog_lang_filter_for_software.prog_lang, + license_filter_for_software.licenses, + count_software_contributors.contributor_cnt, + count_software_mentions.mention_cnt +FROM + software +LEFT JOIN + software_for_community ON software.id=software_for_community.software +LEFT JOIN + count_software_contributors() ON software.id=count_software_contributors.software +LEFT JOIN + count_software_mentions() ON software.id=count_software_mentions.software +LEFT JOIN + keyword_filter_for_software() ON software.id=keyword_filter_for_software.software +LEFT JOIN + prog_lang_filter_for_software() ON software.id=prog_lang_filter_for_software.software +LEFT JOIN + license_filter_for_software() ON software.id=license_filter_for_software.software +WHERE + software_for_community.community = community_id +; +$$; + + +-- SOFTWARE OF COMMUNITY LIST FOR SEARCH +-- WITH keywords, programming languages and licenses for filtering +CREATE FUNCTION software_by_community_search( + community_id UUID, + search VARCHAR +) RETURNS TABLE ( + id UUID, + slug VARCHAR, + brand_name VARCHAR, + short_statement VARCHAR, + image_id VARCHAR, + is_published BOOLEAN, + updated_at TIMESTAMPTZ, + status request_status, + keywords CITEXT[], + prog_lang TEXT[], + licenses VARCHAR[], + contributor_cnt BIGINT, + mention_cnt BIGINT +) LANGUAGE sql STABLE AS +$$ +SELECT DISTINCT ON (software.id) + software.id, + software.slug, + software.brand_name, + software.short_statement, + software.image_id, + software.is_published, + software.updated_at, + software_for_community.status, + keyword_filter_for_software.keywords, + prog_lang_filter_for_software.prog_lang, + license_filter_for_software.licenses, + count_software_contributors.contributor_cnt, + count_software_mentions.mention_cnt +FROM + software +LEFT JOIN + software_for_community ON software.id=software_for_community.software +LEFT JOIN + count_software_contributors() ON software.id=count_software_contributors.software +LEFT JOIN + count_software_mentions() ON software.id=count_software_mentions.software +LEFT JOIN + keyword_filter_for_software() ON software.id=keyword_filter_for_software.software +LEFT JOIN + prog_lang_filter_for_software() ON software.id=prog_lang_filter_for_software.software +LEFT JOIN + license_filter_for_software() ON software.id=license_filter_for_software.software +WHERE + software_for_community.community = community_id AND ( + software.brand_name ILIKE CONCAT('%', search, '%') + OR + software.slug ILIKE CONCAT('%', search, '%') + OR + software.short_statement ILIKE CONCAT('%', search, '%') + OR + keyword_filter_for_software.keywords_text ILIKE CONCAT('%', search, '%') + ) +ORDER BY + software.id, + CASE + WHEN brand_name ILIKE search THEN 0 + WHEN brand_name ILIKE CONCAT(search, '%') THEN 1 + WHEN brand_name ILIKE CONCAT('%', search, '%') THEN 2 + ELSE 3 + END, + CASE + WHEN slug ILIKE search THEN 0 + WHEN slug ILIKE CONCAT(search, '%') THEN 1 + WHEN slug ILIKE CONCAT('%', search, '%') THEN 2 + ELSE 3 + END, + CASE + WHEN short_statement ILIKE search THEN 0 + WHEN short_statement ILIKE CONCAT(search, '%') THEN 1 + WHEN short_statement ILIKE CONCAT('%', search, '%') THEN 2 + ELSE 3 + END +; +$$; + + +-- REACTIVE KEYWORD FILTER WITH COUNTS FOR SOFTWARE +-- PROVIDES AVAILABLE KEYWORDS FOR APPLIED FILTERS +CREATE FUNCTION com_software_keywords_filter( + community_id UUID, + software_status request_status DEFAULT 'approved', + search_filter TEXT DEFAULT '', + keyword_filter CITEXT[] DEFAULT '{}', + prog_lang_filter TEXT[] DEFAULT '{}', + license_filter VARCHAR[] DEFAULT '{}' +) RETURNS TABLE ( + keyword CITEXT, + keyword_cnt INTEGER +) LANGUAGE sql STABLE AS +$$ +SELECT + UNNEST(keywords) AS keyword, + COUNT(id) AS keyword_cnt +FROM + software_by_community_search(community_id,search_filter) +WHERE + software_by_community_search.status = software_status + AND + COALESCE(keywords, '{}') @> keyword_filter + AND + COALESCE(prog_lang, '{}') @> prog_lang_filter + AND + COALESCE(licenses, '{}') @> license_filter +GROUP BY + keyword +; +$$; + +-- REACTIVE PROGRAMMING LANGUAGES WITH COUNTS FOR SOFTWARE +-- PROVIDES AVAILABLE PROGRAMMING LANGUAGES FOR APPLIED FILTERS +CREATE FUNCTION com_software_languages_filter( + community_id UUID, + software_status request_status DEFAULT 'approved', + search_filter TEXT DEFAULT '', + keyword_filter CITEXT[] DEFAULT '{}', + prog_lang_filter TEXT[] DEFAULT '{}', + license_filter VARCHAR[] DEFAULT '{}' +) RETURNS TABLE ( + prog_language TEXT, + prog_language_cnt INTEGER +) LANGUAGE sql STABLE AS +$$ +SELECT + UNNEST(prog_lang) AS prog_language, + COUNT(id) AS prog_language_cnt +FROM + software_by_community_search(community_id,search_filter) +WHERE + software_by_community_search.status = software_status + AND + COALESCE(keywords, '{}') @> keyword_filter + AND + COALESCE(prog_lang, '{}') @> prog_lang_filter + AND + COALESCE(licenses, '{}') @> license_filter +GROUP BY + prog_language +; +$$; + +-- REACTIVE LICENSES FILTER WITH COUNTS FOR SOFTWARE +-- PROVIDES AVAILABLE LICENSES FOR APPLIED FILTERS +CREATE FUNCTION com_software_licenses_filter( + community_id UUID, + software_status request_status DEFAULT 'approved', + search_filter TEXT DEFAULT '', + keyword_filter CITEXT[] DEFAULT '{}', + prog_lang_filter TEXT[] DEFAULT '{}', + license_filter VARCHAR[] DEFAULT '{}' +) RETURNS TABLE ( + license VARCHAR, + license_cnt INTEGER +) LANGUAGE sql STABLE AS +$$ +SELECT + UNNEST(licenses) AS license, + COUNT(id) AS license_cnt +FROM + software_by_community_search(community_id,search_filter) +WHERE + software_by_community_search.status = software_status + AND + COALESCE(keywords, '{}') @> keyword_filter + AND + COALESCE(prog_lang, '{}') @> prog_lang_filter + AND + COALESCE(licenses, '{}') @> license_filter +GROUP BY + license +; +$$; diff --git a/frontend/auth/permissions/isMaintainerOfCommunity.ts b/frontend/auth/permissions/isMaintainerOfCommunity.ts index 1146a5832..8dda42fa2 100644 --- a/frontend/auth/permissions/isMaintainerOfCommunity.ts +++ b/frontend/auth/permissions/isMaintainerOfCommunity.ts @@ -75,7 +75,7 @@ export async function getCommunitiesOfMaintainer({token}: headers: createJsonHeaders(token) }) if (resp.status === 200) { - const json = await resp.json() + const json:string[] = await resp.json() return json } // ERRORS AS NOT MAINTAINER diff --git a/frontend/components/communities/CommunityPage.tsx b/frontend/components/communities/CommunityPage.tsx index 15582144a..e995e767f 100644 --- a/frontend/components/communities/CommunityPage.tsx +++ b/frontend/components/communities/CommunityPage.tsx @@ -59,6 +59,8 @@ export default function CommunityPage({ diff --git a/frontend/components/communities/apiCommunities.ts b/frontend/components/communities/apiCommunities.ts index 85f71163a..865c3441a 100644 --- a/frontend/components/communities/apiCommunities.ts +++ b/frontend/components/communities/apiCommunities.ts @@ -10,6 +10,7 @@ import logger from '~/utils/logger' import {paginationUrlParams} from '~/utils/postgrestUrl' import {KeywordForCommunity} from './settings/general/apiCommunityKeywords' import {Community} from '../admin/communities/apiCommunities' +import {isCommunityMaintainer} from '~/auth/permissions/isMaintainerOfCommunity' // New type based on Community but replace // id with new type @@ -18,6 +19,8 @@ export type CommunityListProps = Omit & { id: string, // additional props software_cnt: number | null, + pending_cnt: number | null, + rejected_cnt: number | null, keywords: string[] | null } @@ -89,13 +92,76 @@ type GetCommunityBySlug={ token?:string } -export async function getCommunityBySlug({slug,token}:GetCommunityBySlug){ +export async function getCommunityBySlug({slug,user,token}:GetCommunityBySlug){ + try{ + // ignore if no slug + if (slug===null) return { + community: null, + isMaintainer:false + } + // get id from slug + const com = await getCommunityIdFromSlug({slug,token}) + if (com===null) return { + community: null, + isMaintainer:false + } + // console.log('com...',com) + // get info if the user is maintainer + const isMaintainer = await isCommunityMaintainer({ + community: com.id, + role: user?.role, + account: user?.account, + token + }) + // console.log('isMaintainer...',isMaintainer) + // filter on id value + let query = `id=eq.${com.id}` + if (isMaintainer===true) { + //if user is maintainer of this community + //we request the counts of all items + query +='&public=false' + } + const url = `${getBaseUrl()}/rpc/communities_overview?${query}` + // console.log('url...',url) + // get community + const resp = await fetch(url, { + method: 'GET', + headers: { + ...createJsonHeaders(token), + // request single record + 'Accept': 'application/vnd.pgrst.object+json' + } + }) + + if (resp.status === 200) { + const json:CommunityListProps = await resp.json() + return { + community: json, + isMaintainer + } + } + // NOT FOUND + logger(`getCommunityBySlug: ${resp.status}:${resp.statusText}`, 'warn') + return { + community: null, + isMaintainer + } + }catch(e:any){ + logger(`getCommunityBySlug: ${e?.message}`, 'error') + return { + community: null, + isMaintainer: false + } + } +} + +export async function getCommunityIdFromSlug({slug,token}:{slug:string,token?:string}){ try{ // ignore if no slug if (slug===null) return null // filter on slug value const query = `slug=eq.${slug}` - const url = `${getBaseUrl()}/rpc/communities_overview?${query}` + const url = `${getBaseUrl()}/community?select=id&${query}` // get community const resp = await fetch(url, { @@ -108,19 +174,18 @@ export async function getCommunityBySlug({slug,token}:GetCommunityBySlug){ }) if (resp.status === 200) { - const json:CommunityListProps = await resp.json() + const json:{id:string} = await resp.json() return json } // NOT FOUND - logger(`getCommunityBySlug: ${resp.status}:${resp.statusText}`, 'warn') + logger(`getCommunityId: ${resp.status}:${resp.statusText}`, 'warn') return null }catch(e:any){ - logger(`getCommunityBySlug: ${e?.message}`, 'error') + logger(`getCommunityId: ${e?.message}`, 'error') return null } } - type PatchCommunityProps = { id: string, data:{ diff --git a/frontend/components/communities/context/index.tsx b/frontend/components/communities/context/index.tsx index fe8a1b4a0..d5ca41c9b 100644 --- a/frontend/components/communities/context/index.tsx +++ b/frontend/components/communities/context/index.tsx @@ -26,6 +26,8 @@ const emptyCommunity:EditCommunityProps = { primary_maintainer: null, logo_id: null, software_cnt: null, + pending_cnt: null, + rejected_cnt: null, keywords: [], } diff --git a/frontend/components/communities/overview/CommunityCard.tsx b/frontend/components/communities/overview/CommunityCard.tsx index 6828a6fe6..828fd4f22 100644 --- a/frontend/components/communities/overview/CommunityCard.tsx +++ b/frontend/components/communities/overview/CommunityCard.tsx @@ -19,7 +19,7 @@ export default function CommunityCard({community}:{community:CommunityListProps}
    @@ -50,7 +50,10 @@ export default function CommunityCard({community}:{community:CommunityListProps} {/* Metrics */}
    - +
    diff --git a/frontend/components/communities/overview/CommunityListItem.tsx b/frontend/components/communities/overview/CommunityListItem.tsx index 8d8734763..4b85c8b01 100644 --- a/frontend/components/communities/overview/CommunityListItem.tsx +++ b/frontend/components/communities/overview/CommunityListItem.tsx @@ -19,7 +19,7 @@ export default function CommunityListItem({community}:{community:CommunityListPr {/* software count */}
    - +
    diff --git a/frontend/components/communities/overview/CommunityMetrics.tsx b/frontend/components/communities/overview/CommunityMetrics.tsx index 806729a17..f7e928fc6 100644 --- a/frontend/components/communities/overview/CommunityMetrics.tsx +++ b/frontend/components/communities/overview/CommunityMetrics.tsx @@ -5,12 +5,14 @@ import Tooltip from '@mui/material/Tooltip' import TerminalIcon from '@mui/icons-material/Terminal' +import FlagOutlinedIcon from '@mui/icons-material/FlagOutlined' type CommunityMetricsProps = { software_cnt: number + pending_cnt: number } -export default function CommunityMetrics({software_cnt}:CommunityMetricsProps) { +export default function CommunityMetrics({software_cnt,pending_cnt}:CommunityMetricsProps) { function softwareMessage(){ if (software_cnt && software_cnt === 1) { @@ -19,6 +21,13 @@ export default function CommunityMetrics({software_cnt}:CommunityMetricsProps) { return `${software_cnt ?? 0} software packages` } + function pendingMessage(){ + if (pending_cnt && pending_cnt === 1) { + return `${pending_cnt} request to join` + } + return `${pending_cnt ?? 0} requests to join` + } + return ( <> @@ -27,6 +36,12 @@ export default function CommunityMetrics({software_cnt}:CommunityMetricsProps) { {software_cnt ?? 0}
    + +
    + + {pending_cnt ?? 0} +
    +
    ) } diff --git a/frontend/components/communities/software/CommunitySoftwareOverview.tsx b/frontend/components/communities/software/CommunitySoftwareOverview.tsx new file mode 100644 index 000000000..09d3e6d4b --- /dev/null +++ b/frontend/components/communities/software/CommunitySoftwareOverview.tsx @@ -0,0 +1,84 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import Link from 'next/link' + +import NoContent from '~/components/layout/NoContent' +import {ProjectLayoutType} from '~/components/projects/overview/search/ViewToggleGroup' +import SoftwareGridCard from '~/components/software/overview/cards/SoftwareGridCard' +import SoftwareListItemContent from '~/components/software/overview/list/SoftwareListItemContent' +import SoftwareOverviewGrid from '~/components/software/overview/cards/SoftwareOverviewGrid' +import SoftwareOverviewList from '~/components/software/overview/list/SoftwareOverviewList' +import OverviewListItem from '~/components/software/overview/list/OverviewListItem' +import {useCommunityContext} from '~/components/communities/context' +import AdminSoftwareGridCard from './card/AdminSoftwareGridCard' +import AdminSoftwareListItem from './list/AdminSoftwareListItem' +import {SoftwareOfCommunity} from './apiCommunitySoftware' + +type CommunitySoftwareOverviewProps = { + layout: ProjectLayoutType + software: SoftwareOfCommunity[] + rows: number +} + +export default function CommunitySoftwareOverview({layout,software,rows}: CommunitySoftwareOverviewProps) { + const {community:{software_cnt},isMaintainer} = useCommunityContext() + // max item to be set to rows + let itemCnt = rows + if (software_cnt && software_cnt < rows) itemCnt = software_cnt + + // console.group('CommunitySoftwareOverview') + // console.log('isMaintainer...', isMaintainer) + // console.log('software_cnt...', software_cnt) + // console.log('software...', software) + // console.log('loading...', loading) + // console.log('layout...', layout) + // console.groupEnd() + + if (!software || software.length === 0) { + return + } + + if (layout === 'list') { + return ( + + {software.map(item => { + if (isMaintainer) { + return + } + + return ( + + + + + + ) + })} + + ) + } + + // GRID as default + return ( + + {software.map((item) => { + if (isMaintainer) { + return ( + + ) + } + return + })} + + ) + +} diff --git a/frontend/components/communities/software/apiCommunitySoftware.ts b/frontend/components/communities/software/apiCommunitySoftware.ts new file mode 100644 index 000000000..85cf4bb31 --- /dev/null +++ b/frontend/components/communities/software/apiCommunitySoftware.ts @@ -0,0 +1,246 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {ParsedUrlQuery} from 'querystring' + +import logger from '~/utils/logger' +import {extractCountFromHeader} from '~/utils/extractCountFromHeader' +import {createJsonHeaders, extractReturnMessage, getBaseUrl} from '~/utils/fetchHelpers' +import {baseQueryString} from '~/utils/postgrestUrl' +import {ssrSoftwareParams} from '~/utils/extractQueryParam' +import {getKeywordsByCommunity} from '~/components/communities/settings/general/apiCommunityKeywords' +import {CommunityListProps} from '~/components/communities/apiCommunities' +import {comSoftwareKeywordsFilter, comSoftwareLanguagesFilter, comSoftwareLicensesFilter} from './filters/apiCommunitySoftwareFilters' +import {getSoftwareOrderOptions} from './filters/OrderCommunitySoftwareBy' + +export type CommunityRequestStatus='approved'|'pending'|'rejected' + +export type SoftwareForCommunityParams = { + community: string, + software_status: CommunityRequestStatus + searchFor?: string + keywords?: string[] | null + prog_lang?: string[] | null + licenses?: string[] | null + order?: string + page: number, + rows: number, + isMaintainer: boolean + token?: string, +} + +export type SoftwareOfCommunity = { + id: string + slug: string + brand_name: string + short_statement: string + image_id: string|null + is_published: boolean + updated_at: string + status: CommunityRequestStatus + keywords: string[], + prog_lang: string[], + licenses: string, + contributor_cnt: number | null + mention_cnt: number | null +} + +export async function getSoftwareForCommunity({ + community, searchFor, keywords, prog_lang, + licenses, order, page, rows, token, + isMaintainer, software_status +}: SoftwareForCommunityParams) { + try { + // baseUrl + const baseUrl = getBaseUrl() + let url = `${baseUrl}/rpc/software_by_community?community_id=${community}` + // SEARCH + if (searchFor) { + // use different RPC for search + const encodedSearch = encodeURIComponent(searchFor) + url = `${baseUrl}/rpc/software_by_community_search?community_id=${community}&search=${encodedSearch}` + } + // filter for status + url+= `&status=eq.${software_status}` + // filter for approved only if not maintainer + if (!isMaintainer) { + url += '&is_published=eq.true' + } + // FILTERS + let filters = baseQueryString({ + keywords, + prog_lang, + licenses, + limit: rows, + offset: page ? page * rows : undefined + }) + if (filters) { + url += `&${filters}` + } + // ORDER + if (order) { + // extract order direction from definitions + const orderInfo = getSoftwareOrderOptions(isMaintainer).find(item=>item.key===order) + // ordering options require "stable" secondary order + // to ensure proper pagination. We use slug for this purpose + if (orderInfo) url += `&order=${order}.${orderInfo.direction},slug.asc` + }else { + // default order is mentions count + url += '&order=mention_cnt.desc.nullslast,slug.asc' + } + // console.log('getSoftwareForCommunity...url...', url) + const resp = await fetch(url, { + method: 'GET', + headers: { + ...createJsonHeaders(token), + // request record count to be returned + // note: it's returned in the header + 'Prefer': 'count=exact' + } + }) + if ([200, 206].includes(resp.status)) { + const json: SoftwareOfCommunity[] = await resp.json() + return { + count: extractCountFromHeader(resp.headers) ?? 0, + data: json + } + } + // otherwise request failed + logger(`getSoftwareForCommunity: ${resp.status} ${resp.statusText}`, 'warn') + // we log and return zero + return { + count: 0, + data: [] + } + } catch (e: any) { + // otherwise request failed + logger(`getSoftwareForCommunity: ${e.message}`, 'error') + // we log and return zero + return { + count: 0, + data: [] + } + } +} + +type SsrCommunitySoftwareDataProps={ + community: CommunityListProps, + software_status: CommunityRequestStatus + query: ParsedUrlQuery + isMaintainer: boolean + token?: string +} + +/** + * Get community software page data server side. + */ +export async function ssrCommunitySoftwareProps({community,software_status,query,isMaintainer,token}:SsrCommunitySoftwareDataProps){ + try{ + // extract and decode query params + const {search, keywords, prog_lang, licenses, order, rows, page} = ssrSoftwareParams(query) + + // get other data + const [ + software, + keywordsList, + languagesList, + licensesList, + communityKeywords + ] = await Promise.all([ + getSoftwareForCommunity({ + community: community.id, + software_status, + searchFor: search, + keywords, + prog_lang, + licenses, + order, + rows: rows ?? 12, + page: page ? page-1 : 0, + isMaintainer, + token + }), + comSoftwareKeywordsFilter({ + id: community.id, + software_status, + search, + keywords, + prog_lang, + licenses + }), + comSoftwareLanguagesFilter({ + id: community.id, + software_status, + search, + keywords, + prog_lang, + licenses + }), + comSoftwareLicensesFilter({ + id: community.id, + software_status, + search, + keywords, + prog_lang, + licenses + }), + getKeywordsByCommunity(community.id,token) + ]) + + return{ + isMaintainer, + software, + keywordsList, + languagesList, + licensesList, + community:{ + ...community, + // use keywords for editing + keywords: communityKeywords + } + } + + }catch(e:any){ + // otherwise request failed + logger(`ssrCommunitySoftwareProps: ${e.message}`, 'error') + // we log and return zero + return { + isMaintainer: false, + communityKeywords:[], + software:{ + count:0, + data: [] + }, + keywordsList:[], + languagesList:[], + licensesList:[], + community + } + } +} + + +export async function patchSoftwareForCommunity({software, community, data, token}: + { software: string, community: string, data: any, token: string }) { + try { + const query = `software=eq.${software}&community=eq.${community}` + const url = `${getBaseUrl()}/software_for_community?${query}` + const resp = await fetch(url, { + method: 'PATCH', + headers: { + ...createJsonHeaders(token), + 'Prefer': 'return=headers-only' + }, + body: JSON.stringify(data) + }) + return extractReturnMessage(resp) + } catch (e: any) { + // debugger + return { + status: 500, + message: e?.message + } + } +} diff --git a/frontend/components/communities/software/card/AdminSoftwareGridCard.tsx b/frontend/components/communities/software/card/AdminSoftwareGridCard.tsx new file mode 100644 index 000000000..aa3eb60a1 --- /dev/null +++ b/frontend/components/communities/software/card/AdminSoftwareGridCard.tsx @@ -0,0 +1,69 @@ +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) +// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) (dv4all) +// SPDX-FileCopyrightText: 2023 dv4all +// +// SPDX-License-Identifier: Apache-2.0 + +import Link from 'next/link' + +import IconBtnMenuOnAction from '~/components/menu/IconBtnMenuOnAction' +import SoftwareCardContent from '~/components/software/overview/cards/SoftwareCardContent' +import {SoftwareOfCommunity} from '../apiCommunitySoftware' +import {useSoftwareCardActions} from './useSoftwareCardActions' +import StatusBanner from './StatusBanner' + +type AdminSoftwareCardProps = { + item: SoftwareOfCommunity +} + +export default function AdminSoftwareGridCard({item:software}: AdminSoftwareCardProps) { + const {menuOptions, onAction} = useSoftwareCardActions({software}) + + // console.group('AdminSoftwareGridCard') + // console.log('item...', item) + // console.log('status...', software.status) + // console.log('is_published...', software.is_published) + // console.log('is_featured...', software.is_featured) + // console.groupEnd() + + return ( +
    + + {/* standard software card with link */} + + + + + {/* menu and status icons - at the top of the card */} +
    +
    +
    + +
    +
    + +
    +
    + ) + +} diff --git a/frontend/components/communities/software/card/StatusBanner.tsx b/frontend/components/communities/software/card/StatusBanner.tsx new file mode 100644 index 000000000..b88b8c805 --- /dev/null +++ b/frontend/components/communities/software/card/StatusBanner.tsx @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {CommunityRequestStatus} from '../apiCommunitySoftware' + +type StatusBannerProps = { + status: CommunityRequestStatus + is_published: boolean + width?: string + borderRadius?: string + letterSpacing?: string +} + +export default function StatusBanner({ + status, + is_published, + width = '10rem', + borderRadius = '0 0.5rem 0.5rem 0', + letterSpacing = '0.125rem' +}: StatusBannerProps) { + + if (status==='rejected') { + return ( +
    + Rejected +
    + ) + } + if (status==='pending'){ + return ( +
    + Pending +
    + ) + } + + if (is_published === false){ + return ( +
    + Not published +
    + ) + } + +} diff --git a/frontend/components/communities/software/card/useAdminMenuOptions.tsx b/frontend/components/communities/software/card/useAdminMenuOptions.tsx new file mode 100644 index 000000000..abb2f68f4 --- /dev/null +++ b/frontend/components/communities/software/card/useAdminMenuOptions.tsx @@ -0,0 +1,59 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useEffect, useState} from 'react' +import RemoveCircleIcon from '@mui/icons-material/RemoveCircle' +import Check from '@mui/icons-material/Check' + +import {IconBtnMenuOption} from '~/components/menu/IconBtnMenuOnAction' +import {CommunityRequestStatus} from '../apiCommunitySoftware' +import {SoftwareMenuAction} from './useSoftwareCardActions' + +type AdminMenuOptionsProps = { + status: CommunityRequestStatus + is_published: boolean +} + +export default function useAdminMenuOptions({ + status, is_published +}: AdminMenuOptionsProps) { + + const [menuOptions, setMenuOptions] = useState[]>([]) + + useEffect(() => { + let abort = false + if (typeof status !='undefined') { + const options: IconBtnMenuOption[] = [] + switch(status){ + case 'approved': + + } + if (status === 'approved') { + options.push({ + type: 'action', + key: 'deny', + label: 'Reject affiliation', + icon: , + action: {type: 'DENY'} + }) + } else { + options.push({ + type: 'action', + key: 'approve', + label: 'Allow affiliation', + icon: , + action: {type: 'APPROVE'} + }) + } + if (abort) return + setMenuOptions(options) + } + return ()=>{abort=true} + }, [status,is_published]) + + return { + menuOptions + } +} diff --git a/frontend/components/communities/software/card/useSoftwareCardActions.tsx b/frontend/components/communities/software/card/useSoftwareCardActions.tsx new file mode 100644 index 000000000..0fe8aaeda --- /dev/null +++ b/frontend/components/communities/software/card/useSoftwareCardActions.tsx @@ -0,0 +1,75 @@ +// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) +// SPDX-FileCopyrightText: 2022 dv4all +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useState} from 'react' + +import {useSession} from '~/auth' +import logger from '~/utils/logger' +import useSnackbar from '~/components/snackbar/useSnackbar' +import {useCommunityContext} from '../../context' +import {CommunityRequestStatus, SoftwareOfCommunity, patchSoftwareForCommunity} from '../apiCommunitySoftware' +import useAdminMenuOptions from './useAdminMenuOptions' + +export type SoftwareCardWithMenuProps = { + software: SoftwareOfCommunity +} + +export type SoftwareMenuAction = { + type: 'APPROVE' | 'DENY', + payload?: string +} + +export function useSoftwareCardActions({software}: SoftwareCardWithMenuProps) { + const {token} = useSession() + const {community:{id}} = useCommunityContext() + const {showErrorMessage} = useSnackbar() + const {menuOptions} = useAdminMenuOptions({ + status: software.status, + is_published: software.is_published + }) + + // refresh "signal" for child component(s) to reload project item after update + // and updated menuOptions + const [_, setRefresh] = useState(0) + + async function setStatus(status: CommunityRequestStatus) { + const resp = await patchSoftwareForCommunity({ + software: software.id, + community: id ?? '', + token, + data: { + status + } + }) + if (resp.status !== 200) { + showErrorMessage(`Failed to update ${software.brand_name}. ${resp.message}`) + } else { + // directly update object value + software.status = status + // send refresh signal - to reload changes + setRefresh(v=>v+1) + } + } + + function onAction(action: SoftwareMenuAction) { + switch (action.type) { + case 'APPROVE': + setStatus('approved') + break + case 'DENY': + setStatus('rejected') + break + default: + logger(`Action type ${action.type} NOT SUPPORTED. Check your spelling.`, 'warn') + } + } + + return { + menuOptions, + onAction + } +} diff --git a/frontend/components/communities/software/filters/OrderCommunitySoftwareBy.tsx b/frontend/components/communities/software/filters/OrderCommunitySoftwareBy.tsx new file mode 100644 index 000000000..1780c8a57 --- /dev/null +++ b/frontend/components/communities/software/filters/OrderCommunitySoftwareBy.tsx @@ -0,0 +1,45 @@ +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) +// SPDX-FileCopyrightText: 2023 dv4all +// SPDX-FileCopyrightText: 2024 Christian Meeßen (GFZ) +// SPDX-FileCopyrightText: 2024 Helmholtz Centre Potsdam - GFZ German Research Centre for Geosciences +// +// SPDX-License-Identifier: Apache-2.0 + +import OrderBy from '~/components/filter/OrderBy' +import useSoftwareParams from '~/components/organisation/software/filters/useSoftwareParams' +import {softwareOrderOptions} from '~/components/software/overview/filters/OrderSoftwareBy' +import useFilterQueryChange from '~/components/filter/useFilterQueryChange' +import {useCommunityContext} from '../../context' + +const adminOrderOptions = [ + {key: 'is_published', label: 'Not published', direction: 'asc.nullslast'}, +] + +export function getSoftwareOrderOptions(isMaintainer:boolean) { + if (isMaintainer) { + const order = [ + ...softwareOrderOptions, + ...adminOrderOptions + ] + return order + } else { + return softwareOrderOptions + } +} + +export default function OrderCommunitySoftwareBy() { + const {isMaintainer} = useCommunityContext() + const {order} = useSoftwareParams() + const {handleQueryChange} = useFilterQueryChange() + const orderOptions = getSoftwareOrderOptions(isMaintainer) + + return ( + + ) +} diff --git a/frontend/components/communities/software/filters/apiCommunitySoftwareFilters.ts b/frontend/components/communities/software/filters/apiCommunitySoftwareFilters.ts new file mode 100644 index 000000000..6c8bebbcb --- /dev/null +++ b/frontend/components/communities/software/filters/apiCommunitySoftwareFilters.ts @@ -0,0 +1,150 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import logger from '~/utils/logger' +import {createJsonHeaders, getBaseUrl} from '~/utils/fetchHelpers' +import {KeywordFilterOption} from '~/components/filter/KeywordsFilter' +import {buildSoftwareFilter} from '~/components/software/overview/filters/softwareFiltersApi' +import {LicensesFilterOption} from '~/components/filter/LicensesFilter' +import {LanguagesFilterOption} from '~/components/filter/ProgrammingLanguagesFilter' +import {CommunityRequestStatus} from '../apiCommunitySoftware' + +export type CommunitySoftwareFilterProps = { + id: string + software_status: CommunityRequestStatus + search?: string | null + keywords?: string[] | null + prog_lang?: string[] | null + licenses?: string[] | null + token?:string +} + +export function buildCommunitySoftwareFilter({id, software_status, search, keywords, prog_lang, licenses}: CommunitySoftwareFilterProps) { + const filter = { + // additional organisation filter + community_id: id, + software_status, + // add default software filter params + ...buildSoftwareFilter({ + search, + keywords, + prog_lang, + licenses + }) + } + // console.group('buildCommunitySoftwareFilter') + // console.log('filter...', filter) + // console.groupEnd() + return filter +} + +export async function comSoftwareKeywordsFilter({ + id, software_status, search, keywords, prog_lang, licenses, token +}: CommunitySoftwareFilterProps) { + try { + + const query = 'rpc/com_software_keywords_filter?order=keyword' + const url = `${getBaseUrl()}/${query}` + const filter = buildCommunitySoftwareFilter({ + id, + software_status, + search, + keywords, + prog_lang, + licenses + }) + + const resp = await fetch(url, { + method: 'POST', + headers: createJsonHeaders(token), + // we pass params in the body of POST + body: JSON.stringify(filter) + }) + + if (resp.status === 200) { + const json: KeywordFilterOption[] = await resp.json() + return json + } + + logger(`comSoftwareKeywordsFilter: ${resp.status} ${resp.statusText}`, 'warn') + return [] + + } catch (e: any) { + logger(`comSoftwareKeywordsFilter: ${e?.message}`, 'error') + return [] + } +} + +export async function comSoftwareLanguagesFilter({ + id,software_status,search, keywords, prog_lang, licenses, token}: CommunitySoftwareFilterProps) { + try { + const query = 'rpc/com_software_languages_filter?order=prog_language' + const url = `${getBaseUrl()}/${query}` + const filter = buildCommunitySoftwareFilter({ + id, + software_status, + search, + keywords, + prog_lang, + licenses + }) + + const resp = await fetch(url, { + method: 'POST', + headers: createJsonHeaders(token), + // we pass params in the body of POST + body: JSON.stringify(filter) + }) + + if (resp.status === 200) { + const json: LanguagesFilterOption[] = await resp.json() + return json + } + + logger(`comSoftwareLanguagesFilter: ${resp.status} ${resp.statusText}`, 'warn') + return [] + + } catch (e: any) { + logger(`comSoftwareLanguagesFilter: ${e?.message}`, 'error') + return [] + } +} + +export async function comSoftwareLicensesFilter({ + id,software_status,search, keywords, prog_lang, licenses, token}: CommunitySoftwareFilterProps) { + try { + const query = 'rpc/com_software_licenses_filter?order=license' + const url = `${getBaseUrl()}/${query}` + const filter = buildCommunitySoftwareFilter({ + id, + software_status, + search, + keywords, + prog_lang, + licenses + }) + + const resp = await fetch(url, { + method: 'POST', + headers: createJsonHeaders(token), + // we pass params in the body of POST + body: JSON.stringify(filter) + }) + + if (resp.status === 200) { + const json: LicensesFilterOption[] = await resp.json() + return json + } + + logger(`comSoftwareLicensesFilter: ${resp.status} ${resp.statusText}`, 'warn') + return [] + + } catch (e: any) { + logger(`comSoftwareLicensesFilter: ${e?.message}`, 'error') + return [] + } +} + + diff --git a/frontend/components/communities/software/filters/index.tsx b/frontend/components/communities/software/filters/index.tsx new file mode 100644 index 000000000..f066e0725 --- /dev/null +++ b/frontend/components/communities/software/filters/index.tsx @@ -0,0 +1,88 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useRouter} from 'next/router' + +import {decodeJsonParam} from '~/utils/extractQueryParam' +import FilterHeader from '~/components/filter/FilterHeader' +import KeywordsFilter, {KeywordFilterOption} from '~/components/filter/KeywordsFilter' +import LicensesFilter, {LicensesFilterOption} from '~/components/filter/LicensesFilter' +import ProgrammingLanguagesFilter, {LanguagesFilterOption} from '~/components/filter/ProgrammingLanguagesFilter' +import useFilterQueryChange from '~/components/filter/useFilterQueryChange' + +import useSoftwareParams from '~/components/organisation/software/filters/useSoftwareParams' +import OrderCommunitySoftwareBy from './OrderCommunitySoftwareBy' + + +type CommunitySoftwareFiltersProps = { + keywordsList: KeywordFilterOption[] + languagesList: LanguagesFilterOption[] + licensesList: LicensesFilterOption[] +} + +export default function CommunitySoftwareFilters({ + keywordsList,languagesList,licensesList +}:CommunitySoftwareFiltersProps) { + const router = useRouter() + const {handleQueryChange} = useFilterQueryChange() + // extract query params + const {filterCnt,keywords_json,prog_lang_json,licenses_json} = useSoftwareParams() + // decode query params + const keywords = decodeJsonParam(keywords_json, []) + const prog_lang = decodeJsonParam(prog_lang_json, []) + const licenses= decodeJsonParam(licenses_json,[]) + + // debugger + function clearDisabled() { + if (filterCnt && filterCnt > 0) return false + return true + } + + function resetFilters(){ + // use basic params + const query: any = { + slug: router.query.slug, + // keep order if provided + order: router.query?.order ? router.query?.order : 'mention_cnt' + } + router.push({query},undefined,{scroll: false}) + } + + return ( + <> + + {/* Order by */} + + {/* Keywords */} +
    + +
    + {/* Program languages */} +
    + +
    + {/* Licenses */} +
    + +
    + + ) +} diff --git a/frontend/components/communities/software/index.tsx b/frontend/components/communities/software/index.tsx new file mode 100644 index 000000000..a9d0612ef --- /dev/null +++ b/frontend/components/communities/software/index.tsx @@ -0,0 +1,105 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useState} from 'react' +import useMediaQuery from '@mui/material/useMediaQuery' +import Pagination from '@mui/material/Pagination' + +import {setDocumentCookie} from '~/utils/userSettings' +import UserAgreementModal from '~/components/user/settings/UserAgreementModal' +import {LayoutType} from '~/components/software/overview/search/ViewToggleGroup' +import {ProjectLayoutType} from '~/components/projects/overview/search/ViewToggleGroup' +import FiltersPanel from '~/components/filter/FiltersPanel' +import {useCommunityContext} from '~/components/communities/context' +import {KeywordFilterOption} from '~/components/filter/KeywordsFilter' +import {LanguagesFilterOption} from '~/components/filter/ProgrammingLanguagesFilter' +import {LicensesFilterOption} from '~/components/filter/LicensesFilter' +import useFilterQueryChange from '~/components/filter/useFilterQueryChange' + +import CommunitySoftwareFilters from './filters' +import SearchCommunitySoftwareSection from './search' +import CommunitySoftwareOverview from './CommunitySoftwareOverview' +import {SoftwareOfCommunity} from './apiCommunitySoftware' + +type CommunitySoftwareProps={ + software: SoftwareOfCommunity[] + count: number + rows: number + page: number + rsd_page_layout: LayoutType + keywordsList: KeywordFilterOption[], + languagesList: LanguagesFilterOption[], + licensesList: LicensesFilterOption[], +} + +export default function CommunitySoftware({ + software,count,page,rows,rsd_page_layout, + keywordsList, languagesList, licensesList +}:CommunitySoftwareProps) { + const smallScreen = useMediaQuery('(max-width:640px)') + const {isMaintainer} = useCommunityContext() + const {handleQueryChange} = useFilterQueryChange() + // if masonry we change to grid + const initView = rsd_page_layout === 'masonry' ? 'grid' : rsd_page_layout + const [view, setView] = useState(initView ?? 'grid') + const numPages = Math.ceil(count / rows) + + function setLayout(view: ProjectLayoutType) { + // update local view + setView(view) + // save to cookie + setDocumentCookie(view,'rsd_page_layout') + } + + return ( + <> + {/* Only when maintainer */} + {isMaintainer && } + {/* Page grid with 2 sections: left filter panel and main content */} +
    + {/* Filters panel large screen */} + {smallScreen === false && + + + + } +
    + {/* Search & mobile filter modal */} + + {/* software overview/content */} + + {/* Pagination */} + {numPages > 1 && +
    + { + handleQueryChange('page',page.toString()) + }} + /> +
    + } +
    +
    + + ) +} diff --git a/frontend/components/communities/software/list/AdminSoftwareListItem.tsx b/frontend/components/communities/software/list/AdminSoftwareListItem.tsx new file mode 100644 index 000000000..a625541af --- /dev/null +++ b/frontend/components/communities/software/list/AdminSoftwareListItem.tsx @@ -0,0 +1,54 @@ +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import Link from 'next/link' + +import IconBtnMenuOnAction from '~/components/menu/IconBtnMenuOnAction' +import OverviewListItem from '~/components/software/overview/list/OverviewListItem' +import SoftwareListItemContent from '~/components/software/overview/list/SoftwareListItemContent' +import StatusBanner from '~/components/communities/software/card/StatusBanner' +import {useSoftwareCardActions} from '~/components/communities/software/card/useSoftwareCardActions' +import {SoftwareOfCommunity} from '~/components/communities/software/apiCommunitySoftware' + +type AdminSoftwareListItem = { + item: SoftwareOfCommunity +} + +export default function AdminSoftwareListItem({item:software}: AdminSoftwareListItem) { + const {menuOptions, onAction} = useSoftwareCardActions({software}) + + return ( + + {/* standard software list item with link */} + + + } + {...software} + /> + + {/* admin menu */} +
    +
    + +
    + +
    +
    + ) +} diff --git a/frontend/components/communities/software/search/index.tsx b/frontend/components/communities/software/search/index.tsx new file mode 100644 index 000000000..a6637ef1f --- /dev/null +++ b/frontend/components/communities/software/search/index.tsx @@ -0,0 +1,92 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useState} from 'react' +import Button from '@mui/material/Button' + +import {getPageRange} from '~/utils/pagination' +import SearchInput from '~/components/search/SearchInput' +import SelectRows from '~/components/software/overview/search/SelectRows' +import ViewToggleGroup, {ProjectLayoutType} from '~/components/projects/overview/search/ViewToggleGroup' +import useSoftwareParams from '~/components/organisation/software/filters/useSoftwareParams' +import FiltersModal from '~/components/filter/FiltersModal' +import {KeywordFilterOption} from '~/components/filter/KeywordsFilter' +import {LanguagesFilterOption} from '~/components/filter/ProgrammingLanguagesFilter' +import {LicensesFilterOption} from '~/components/filter/LicensesFilter' +import useFilterQueryChange from '~/components/filter/useFilterQueryChange' +import CommunitySoftwareFilters from '../filters/index' + +type SearchSoftwareSectionProps = { + count: number + keywordsList: KeywordFilterOption[], + languagesList: LanguagesFilterOption[], + licensesList: LicensesFilterOption[], + smallScreen: boolean + layout: ProjectLayoutType + setView: (view:ProjectLayoutType) => void +} + +export default function SearchCommunitySoftwareSection({ + count, layout, keywordsList, smallScreen, + languagesList, licensesList, setView +}: SearchSoftwareSectionProps) { + const {search,page,rows,filterCnt} = useSoftwareParams() + const {handleQueryChange} = useFilterQueryChange() + const [modal, setModal] = useState(false) + + const placeholder = filterCnt > 0 ? 'Find within selection' : 'Find software' + + // console.group('SearchCommunitySoftwareSection') + // console.log('page...', page) + // console.log('rows...', rows) + // console.log('search...', search) + // console.groupEnd() + + return ( +
    +
    + handleQueryChange('search', search)} + defaultValue={search ?? ''} + /> + + +
    +
    +
    + {getPageRange(rows, page, count)} +
    + {smallScreen === true && + + } +
    + {smallScreen ? + + + + : undefined + } +
    + ) +} diff --git a/frontend/components/communities/tabs/CommunityTabItems.tsx b/frontend/components/communities/tabs/CommunityTabItems.tsx index 30f198a13..85c9cc039 100644 --- a/frontend/components/communities/tabs/CommunityTabItems.tsx +++ b/frontend/components/communities/tabs/CommunityTabItems.tsx @@ -3,9 +3,11 @@ // // SPDX-License-Identifier: Apache-2.0 -import InfoIcon from '@mui/icons-material/Info' import TerminalIcon from '@mui/icons-material/Terminal' -import SettingsIcon from '@mui/icons-material/Settings' +import BlockIcon from '@mui/icons-material/Block' +import SettingsOutlinedIcon from '@mui/icons-material/SettingsOutlined' +import FlagOutlinedIcon from '@mui/icons-material/FlagOutlined' +import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined' import {OrganisationForOverview} from '~/types/Organisation' @@ -20,7 +22,7 @@ export type CommunityTabItemProps = { isVisible: (props: IsVisibleProps) => boolean } -export type TabKey = 'about'|'software'|'settings' +export type TabKey = 'about'|'software'|'requests'|'rejected'|'settings' export type CommunityTabProps = { [key in TabKey]: CommunityTabItemProps } @@ -37,17 +39,31 @@ export const communityTabItems:CommunityTabProps = { icon: , isVisible: (props) => true, }, + requests:{ + id:'requests', + label:({pending_cnt})=>`Requests (${pending_cnt ?? 0})`, + icon: , + // we do not show this option if not a maintainer + isVisible: ({isMaintainer}) => isMaintainer + }, + rejected:{ + id:'rejected', + label:({rejected_cnt})=>`Rejected (${rejected_cnt ?? 0})`, + icon: , + // we do not show this option if not a maintainer + isVisible: ({isMaintainer}) => isMaintainer + }, settings:{ id:'settings', label:()=>'Settings', - icon: , + icon: , // we do not show this option if not a maintainer isVisible: ({isMaintainer}) => isMaintainer }, about: { id:'about', label:()=>'About', - icon: , + icon: , isVisible: ({description}) => { // we always show about section to maintainer // if (isMaintainer === true) return true diff --git a/frontend/components/communities/tabs/index.tsx b/frontend/components/communities/tabs/index.tsx index dc4f57a69..3c9ff8e9b 100644 --- a/frontend/components/communities/tabs/index.tsx +++ b/frontend/components/communities/tabs/index.tsx @@ -14,12 +14,15 @@ const tabItems = Object.keys(communityTabItems) as TabKey[] type CommunityTabsProps={ tab:TabKey software_cnt: number + pending_cnt: number + rejected_cnt: number description: string | null isMaintainer: boolean } export default function CommunityTabs({ - tab,software_cnt,description,isMaintainer + tab,software_cnt,pending_cnt,rejected_cnt, + description,isMaintainer }:CommunityTabsProps) { const router = useRouter() @@ -38,8 +41,11 @@ export default function CommunityTabs({ } } // add default order for software and project tabs - if (value === 'software') { - url.query['order'] = 'is_featured' + if (value === 'software' || + value === 'requests' || + value === 'rejected' + ) { + url.query['order'] = 'mention_cnt' } // push route change router.push(url,undefined,{scroll:false}) @@ -50,7 +56,6 @@ export default function CommunityTabs({ const item = communityTabItems[key] if (item.isVisible({ isMaintainer, - software_cnt, description }) === true) { return void + title?: string + children?: JSX.Element | JSX.Element[] } -export default function OrgSoftwareFiltersModal({ - open, setModal -}:SoftwareFiltersModalProps) { +export default function FiltersModal({open,setModal,children,title='Filters'}:FiltersModalProps) { const smallScreen = useMediaQuery('(max-width:640px)') + return ( - Filters + {title}
    - + {/* the filter content component is added here */} + {children}
    +
    diff --git a/frontend/components/filter/useFilterQueryChange.test.tsx b/frontend/components/filter/useFilterQueryChange.test.tsx new file mode 100644 index 000000000..c540282e6 --- /dev/null +++ b/frontend/components/filter/useFilterQueryChange.test.tsx @@ -0,0 +1,70 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useEffect} from 'react' +import {render} from '@testing-library/react' +import useFilterQueryChange from './useFilterQueryChange' + +// mock next router +const mockBack = jest.fn() +const mockReplace = jest.fn() +const mockPush = jest.fn() + +jest.mock('next/router', () => ({ + useRouter: () => ({ + back: mockBack, + replace: mockReplace, + push: mockPush, + pathname: '/organisations', + query: { + slug:'test-slug-project', + rows: 12, + page: 1, + } + }) +})) + +beforeEach(() => { + jest.resetAllMocks() +}) + +function WrappedHandleChangeHook({param,value}:{param: string, value: string | string[]}) { + // extract function + const {handleQueryChange} = useFilterQueryChange() + + useEffect(() => { + // call it with random param + handleQueryChange(param, value) + },[param,value,handleQueryChange]) + + return ( +
    WrappedHandleChangeHook
    + ) +} + + +it('handleQueryChange with search param', () => { + + render() + + expect(mockPush).toBeCalledTimes(1) + expect(mockPush).toBeCalledWith( + {'query': {'page': 1, 'rows': 12, 'slug': 'test-slug-project','search': 'test-value'}}, + undefined, + {'scroll': false} + ) +}) + +it('handleQueryChange pagination', () => { + + render() + + expect(mockPush).toBeCalledTimes(1) + expect(mockPush).toBeCalledWith( + {'query': {'page': '2', 'rows': 12, 'slug': 'test-slug-project'}}, + undefined, + {'scroll': true} + ) +}) diff --git a/frontend/components/filter/useFilterQueryChange.tsx b/frontend/components/filter/useFilterQueryChange.tsx new file mode 100644 index 000000000..f1277b943 --- /dev/null +++ b/frontend/components/filter/useFilterQueryChange.tsx @@ -0,0 +1,60 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useCallback} from 'react' +import {useRouter} from 'next/router' + +import {rowsPerPageOptions} from '~/config/pagination' +import {encodeQueryValue} from '~/utils/extractQueryParam' +import {QueryParams} from '~/utils/postgrestUrl' +import {getDocumentCookie} from '~/utils/userSettings' + + +export default function useFilterQueryChange(){ + const router = useRouter() + + const handleQueryChange = useCallback((key: string, value: string | string[]) => { + const params: QueryParams = { + [key]: encodeQueryValue(value), + } + // on each param change we reset page + if (key !== 'page') { + params['page'] = 1 + } + if (typeof params['rows'] === 'undefined' || params['rows'] === null) { + // extract from cookie or use default + params['rows'] = getDocumentCookie('rsd_page_rows', rowsPerPageOptions[0]) + } + + // update query parameters + const query:any = { + ...router.query, + ...params + } + + if (value === '' || value === null || typeof value === 'undefined') { + // remove query param + delete query[key] + } + + // construct url with all query params + if (key === 'page') { + // console.group('useFilterQueryChange') + // console.log('scroll...true') + // console.groupEnd() + // on page change we scroll to top + router.push({query},undefined,{scroll: true}) + } else { + // console.group('useFilterQueryChange') + // console.log('scroll...false') + // console.groupEnd() + router.push({query},undefined,{scroll: false}) + } + }, [router]) + + return { + handleQueryChange + } +} diff --git a/frontend/components/organisation/projects/filters/OrgOrderProjectsBy.tsx b/frontend/components/organisation/projects/filters/OrgOrderProjectsBy.tsx index f0662aa34..bc2902edb 100644 --- a/frontend/components/organisation/projects/filters/OrgOrderProjectsBy.tsx +++ b/frontend/components/organisation/projects/filters/OrgOrderProjectsBy.tsx @@ -1,6 +1,6 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 dv4all // // SPDX-License-Identifier: Apache-2.0 @@ -8,24 +8,46 @@ import OrderBy from '~/components/filter/OrderBy' import useQueryChange from '../useQueryChange' import useProjectParams from '../useProjectParams' -import useProjectOrderOptions from './useProjectOrderOptions' +import {projectOrderOptions} from '~/components/projects/overview/filters/OrderProjectsBy' +import useOrganisationContext from '~/components/organisation/context/useOrganisationContext' -export default function OrgOrderProjectsBy() { - const {order} = useProjectParams() - const {handleQueryChange} = useQueryChange() - const orderOptions = useProjectOrderOptions() +// additional admin options +export const adminOptions = [ + {key: 'status', label: 'Blocked', direction: 'asc.nullslast'}, + {key: 'is_published', label: 'Not published', direction:'asc.nullslast'} +] - // we load component only if there are options - if (orderOptions.length > 0) { - return ( - - ) +export function getProjectOrderOptions(isMaintainer:boolean) { + // if maintainer additional order options are added + if (isMaintainer) { + const order = [ + ...projectOrderOptions, + // organisation specific option + {key: 'is_featured', label: 'Pinned', direction: 'desc.nullslast'}, + ...adminOptions + ] + return order + } else { + return [ + ...projectOrderOptions, + // organisation specific option + {key: 'is_featured', label: 'Pinned', direction: 'desc.nullslast'}, + ] } +} - return null +export default function OrgOrderProjectsBy() { + const {isMaintainer} = useOrganisationContext() + const {order} = useProjectParams() + const orderOptions = getProjectOrderOptions(isMaintainer) + const {handleQueryChange} = useQueryChange() + + return ( + + ) } diff --git a/frontend/components/organisation/projects/filters/OrgProjectFiltersModal.tsx b/frontend/components/organisation/projects/filters/OrgProjectFiltersModal.tsx deleted file mode 100644 index b3d4453a1..000000000 --- a/frontend/components/organisation/projects/filters/OrgProjectFiltersModal.tsx +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import Dialog from '@mui/material/Dialog' -import DialogContent from '@mui/material/DialogContent' -import DialogTitle from '@mui/material/DialogTitle' -import useMediaQuery from '@mui/material/useMediaQuery' -import DialogActions from '@mui/material/DialogActions' -import Button from '@mui/material/Button' -import OrgProjectFilters from './OrgProjectFilters' - -type ProjectFiltersModalProps = { - open: boolean, - setModal:(open:boolean)=>void -} - -export default function OrgProjectFiltersModal({ - open, setModal -}:ProjectFiltersModalProps) { - const smallScreen = useMediaQuery('(max-width:640px)') - return ( - - - Filters - - -
    - -
    -
    - - - -
    - ) -} diff --git a/frontend/components/organisation/projects/filters/OrgProjectKeywordsFilter.tsx b/frontend/components/organisation/projects/filters/OrgProjectKeywordsFilter.tsx deleted file mode 100644 index 01c7f07e1..000000000 --- a/frontend/components/organisation/projects/filters/OrgProjectKeywordsFilter.tsx +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import KeywordsFilter, {KeywordFilterOption} from '~/components/filter/KeywordsFilter' -import useQueryChange from '../useQueryChange' - -type ProjectKeywordsFilterProps = { - keywords: string[], - keywordsList: KeywordFilterOption[] -} - -export default function OrgProjectKeywordsFilter({keywords, keywordsList}: ProjectKeywordsFilterProps) { - const {handleQueryChange} = useQueryChange() - - return ( -
    - -
    - ) - -} diff --git a/frontend/components/organisation/projects/filters/OrgProjectOrganisationsFilter.tsx b/frontend/components/organisation/projects/filters/OrgProjectOrganisationsFilter.tsx deleted file mode 100644 index 97bc577ad..000000000 --- a/frontend/components/organisation/projects/filters/OrgProjectOrganisationsFilter.tsx +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import OrganisationsFilter, {OrganisationOption} from '~/components/filter/OrganisationsFilter' -import useQueryChange from '../useQueryChange' - -type OrganisationFilterProps = { - organisations: string[], - organisationsList: OrganisationOption[] -} - -export default function OrgProjectOrganisationsFilter({organisations, organisationsList}: OrganisationFilterProps) { - const {handleQueryChange} = useQueryChange() - - return ( -
    - -
    - ) -} diff --git a/frontend/components/organisation/projects/filters/OrgResearchDomainFilter.tsx b/frontend/components/organisation/projects/filters/OrgResearchDomainFilter.tsx deleted file mode 100644 index 02f8bc9c8..000000000 --- a/frontend/components/organisation/projects/filters/OrgResearchDomainFilter.tsx +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import ResearchDomainFilter, {ResearchDomainOption} from '~/components/filter/ResearchDomainFilter' -import useQueryChange from '../useQueryChange' - -type ResearchDomainFilterProps = { - domains: string[], - domainsList: ResearchDomainOption[] -} - -export default function OrgResearchDomainFilter({domains, domainsList}: ResearchDomainFilterProps) { - const {handleQueryChange} = useQueryChange() - - // console.group('OrgResearchDomainFilter') - // console.log('domainsList...', domainsList) - // console.log('options...', options) - // console.groupEnd() - - return ( -
    - -
    - ) - -} diff --git a/frontend/components/organisation/projects/filters/OrgProjectFilters.tsx b/frontend/components/organisation/projects/filters/index.tsx similarity index 68% rename from frontend/components/organisation/projects/filters/OrgProjectFilters.tsx rename to frontend/components/organisation/projects/filters/index.tsx index 8cd7866d4..9ca27f6bb 100644 --- a/frontend/components/organisation/projects/filters/OrgProjectFilters.tsx +++ b/frontend/components/organisation/projects/filters/index.tsx @@ -1,6 +1,6 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 dv4all // // SPDX-License-Identifier: Apache-2.0 @@ -8,16 +8,16 @@ import FilterHeader from '~/components/filter/FilterHeader' import {decodeJsonParam} from '~/utils/extractQueryParam' +import KeywordsFilter from '~/components/filter/KeywordsFilter' +import ResearchDomainFilter from '~/components/filter/ResearchDomainFilter' +import OrganisationsFilter from '~/components/filter/OrganisationsFilter' +import ProjectStatusFilter from '~/components/projects/overview/filters/ProjectStatusFilter' import useQueryChange from '../useQueryChange' -import OrgOrderProjectsBy from './OrgOrderProjectsBy' -import OrgProjectKeywordsFilter from './OrgProjectKeywordsFilter' import useProjectParams from '../useProjectParams' +import OrgOrderProjectsBy from './OrgOrderProjectsBy' import useOrgProjectKeywordsList from './useOrgProjectKeywordsList' -import OrgResearchDomainFilter from './OrgResearchDomainFilter' import useOrgProjectDomainsFilter from './useOrgProjectDomainsList' -import OrgProjectOrganisationsFilter from './OrgProjectOrganisationsFilter' import useOrgProjectOrganisationList from './useOrgProjectOrganisationsList' -import ProjectStatusFilter from '~/components/projects/overview/filters/ProjectStatusFilter' import useOrgProjectStatusList from './useOrgProjectStatusList' export default function OrgProjectFilters() { @@ -54,20 +54,29 @@ export default function OrgProjectFilters() { handleQueryChange={handleQueryChange} /> {/* Keywords */} - +
    + +
    {/* Research domains */} - +
    + +
    {/* Participating organisations */} - +
    + +
    ) } diff --git a/frontend/components/organisation/projects/filters/useProjectOrderOptions.tsx b/frontend/components/organisation/projects/filters/useProjectOrderOptions.tsx deleted file mode 100644 index 26107e1c1..000000000 --- a/frontend/components/organisation/projects/filters/useProjectOrderOptions.tsx +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// -// SPDX-License-Identifier: Apache-2.0 - -import {useEffect, useState} from 'react' -import {OrderOption} from '~/components/filter/OrderBy' -import {projectOrderOptions} from '~/components/projects/overview/filters/OrderProjectsBy' -import useOrganisationContext from '../../context/useOrganisationContext' - -// additional admin options -export const adminOptions = [ - {key: 'status', label: 'Blocked', direction: 'asc.nullslast'}, - {key: 'is_published', label: 'Not published', direction:'asc.nullslast'} -] - -export function getProjectOrderOptions(isMaintainer:boolean) { - // if maintainer additional order options are added - if (isMaintainer) { - const order = [ - ...projectOrderOptions, - // organisation specific option - {key: 'is_featured', label: 'Pinned', direction: 'desc.nullslast'}, - ...adminOptions - ] - return order - } else { - return [ - ...projectOrderOptions, - // organisation specific option - {key: 'is_featured', label: 'Pinned', direction: 'desc.nullslast'}, - ] - } -} - -export default function useProjectOrderOptions() { - const {isMaintainer} = useOrganisationContext() - const [orderOptions, setOrderOptions] = useState([]) - - useEffect(() => { - const orderOptions = getProjectOrderOptions(isMaintainer) - setOrderOptions(orderOptions) - },[isMaintainer]) - - return orderOptions - -} diff --git a/frontend/components/organisation/projects/index.tsx b/frontend/components/organisation/projects/index.tsx index d17b10b29..e864c50cb 100644 --- a/frontend/components/organisation/projects/index.tsx +++ b/frontend/components/organisation/projects/index.tsx @@ -15,7 +15,7 @@ import {ProjectLayoutType} from '~/components/projects/overview/search/ViewToggl import {setDocumentCookie} from '~/utils/userSettings' import useOrganisationContext from '../context/useOrganisationContext' import {useUserSettings} from '../context/UserSettingsContext' -import OrgProjectFilters from './filters/OrgProjectFilters' +import OrgProjectFilters from './filters' import useOrganisationProjects from './useOrganisationProjects' import OrgSearchProjectSection from './search/OrgSearchProjectSection' import useProjectParams from './useProjectParams' diff --git a/frontend/components/organisation/projects/search/OrgSearchProjectSection.tsx b/frontend/components/organisation/projects/search/OrgSearchProjectSection.tsx index c30e6ac26..018c83a99 100644 --- a/frontend/components/organisation/projects/search/OrgSearchProjectSection.tsx +++ b/frontend/components/organisation/projects/search/OrgSearchProjectSection.tsx @@ -1,31 +1,27 @@ +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2023 dv4all // SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) // // SPDX-License-Identifier: Apache-2.0 +import {useState} from 'react' import useMediaQuery from '@mui/material/useMediaQuery' import Button from '@mui/material/Button' +import {getPageRange} from '~/utils/pagination' import SearchInput from '~/components/search/SearchInput' import SelectRows from '~/components/software/overview/search/SelectRows' +import FiltersModal from '~/components/filter/FiltersModal' import ViewToggleGroup, {ProjectLayoutType} from '~/components/projects/overview/search/ViewToggleGroup' -import useQueryChange from '../useQueryChange' -import {useState} from 'react' -import OrgProjectFiltersModal from '../filters/OrgProjectFiltersModal' -import useProjectParams from '../useProjectParams' -import {getPageRange} from '~/utils/pagination' +import OrgProjectFilters from '~/components/organisation/projects/filters/index' +import useQueryChange from '~/components/organisation/projects/useQueryChange' +import useProjectParams from '~/components/organisation/projects/useProjectParams' type SearchSectionProps = { - // search?: string | null - // page: number - // rows: number count: number - // placeholder: string layout: ProjectLayoutType - // setModal: (modal: boolean) => void setView: (view:ProjectLayoutType)=>void } @@ -77,12 +73,14 @@ export default function OrganisationSearchProjectSection({ }
    - { - smallScreen === true && - + > + + + : undefined }
    diff --git a/frontend/components/organisation/projects/useOrganisationProjects.tsx b/frontend/components/organisation/projects/useOrganisationProjects.tsx index 5925f7f63..1359cd960 100644 --- a/frontend/components/organisation/projects/useOrganisationProjects.tsx +++ b/frontend/components/organisation/projects/useOrganisationProjects.tsx @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 dv4all -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 @@ -13,7 +13,8 @@ import {decodeJsonParam} from '~/utils/extractQueryParam' import {getProjectsForOrganisation} from '../apiOrganisations' import useProjectParams from './useProjectParams' import useOrganisationContext from '../context/useOrganisationContext' -import {getProjectOrderOptions} from './filters/useProjectOrderOptions' +import {getProjectOrderOptions} from './filters/OrgOrderProjectsBy' + type State = { count: number, diff --git a/frontend/components/organisation/projects/useQueryChange.tsx b/frontend/components/organisation/projects/useQueryChange.tsx index 1fec8c592..236503cf3 100644 --- a/frontend/components/organisation/projects/useQueryChange.tsx +++ b/frontend/components/organisation/projects/useQueryChange.tsx @@ -1,63 +1,22 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 import {useCallback} from 'react' import {useRouter} from 'next/router' -import {rowsPerPageOptions} from '~/config/pagination' -import {encodeQueryValue} from '~/utils/extractQueryParam' -import {QueryParams} from '~/utils/postgrestUrl' -import {getDocumentCookie} from '~/utils/userSettings' -import {TabKey} from '../tabs/OrganisationTabItems' +import useFilterQueryChange from '~/components/filter/useFilterQueryChange' +import {TabKey} from '~/components/organisation/tabs/OrganisationTabItems' export default function useQueryChange() { const router = useRouter() + const {handleQueryChange} = useFilterQueryChange() // console.group('useQueryChange') // console.log('hook called...') // console.groupEnd() - const handleQueryChange = useCallback((key: string, value: string | string[]) => { - const params: QueryParams = { - [key]: encodeQueryValue(value), - } - // on each param change we reset page - if (key !== 'page') { - params['page'] = 1 - } - if (typeof params['rows'] === 'undefined' || params['rows'] === null) { - // extract from cookie or use default - params['rows'] = getDocumentCookie('rsd_page_rows', rowsPerPageOptions[0]) - } - - // update query parameters - const query:any = { - ...router.query, - ...params - } - - if (value === '' || value === null || typeof value === 'undefined') { - // remove query param - delete query[key] - } - - // construct url with all query params - if (key === 'page') { - // console.group('useQueryChange') - // console.log('scroll...true') - // console.groupEnd() - // on page change we scroll to top - router.push({query},undefined,{scroll: true}) - } else { - // console.group('useQueryChange') - // console.log('scroll...false') - // console.groupEnd() - router.push({query},undefined,{scroll: false}) - } - }, [router]) - const resetFilters = useCallback((tab: TabKey) => { // use basic params const query: any = { diff --git a/frontend/components/organisation/software/filters/OrgOrderSoftwareBy.tsx b/frontend/components/organisation/software/filters/OrgOrderSoftwareBy.tsx index 5494e5d9d..ee2975f2e 100644 --- a/frontend/components/organisation/software/filters/OrgOrderSoftwareBy.tsx +++ b/frontend/components/organisation/software/filters/OrgOrderSoftwareBy.tsx @@ -1,30 +1,51 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 dv4all // // SPDX-License-Identifier: Apache-2.0 import OrderBy from '~/components/filter/OrderBy' import useQueryChange from '~/components/organisation/projects/useQueryChange' +import {softwareOrderOptions} from '~/components/software/overview/filters/OrderSoftwareBy' +import useOrganisationContext from '~/components/organisation/context/useOrganisationContext' import useSoftwareParams from './useSoftwareParams' -import useSoftwareOrderOptions from './useSoftwareOrderOptions' -export default function OrgOrderProjectsBy() { - const {order} = useSoftwareParams() - const {handleQueryChange} = useQueryChange() - const softwareOrderOptions = useSoftwareOrderOptions() +const adminOrderOptions = [ + {key: 'status', label: 'Blocked', direction: 'asc.nullslast'}, + {key: 'is_published', label: 'Not published', direction: 'asc.nullslast'}, +] - // we load component only if there are options - if (softwareOrderOptions.length > 0) { - return ( - - ) +export function getSoftwareOrderOptions(isMaintainer:boolean) { + if (isMaintainer) { + const order = [ + ...softwareOrderOptions, + // additional organisation option (should be default) + {key: 'is_featured', label: 'Pinned', direction: 'desc.nullslast'}, + ...adminOrderOptions + ] + return order + } else { + return [ + ...softwareOrderOptions, + // additional organisation option (should be default) + {key: 'is_featured', label: 'Pinned', direction: 'desc.nullslast'} + ] } +} + + +export default function OrgOrderSoftwareBy() { + const {isMaintainer} = useOrganisationContext() + const {order} = useSoftwareParams() + const orderOptions = getSoftwareOrderOptions(isMaintainer) + const {handleQueryChange} = useQueryChange() - return null + return ( + + ) } diff --git a/frontend/components/organisation/software/filters/OrgSoftwareKeywordsFilter.tsx b/frontend/components/organisation/software/filters/OrgSoftwareKeywordsFilter.tsx deleted file mode 100644 index f30525d46..000000000 --- a/frontend/components/organisation/software/filters/OrgSoftwareKeywordsFilter.tsx +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import KeywordsFilter, {KeywordFilterOption} from '~/components/filter/KeywordsFilter' -import useQueryChange from '~/components/organisation/projects/useQueryChange' - -type SoftwareKeywordsFilterProps = { - keywords: string[], - keywordsList: KeywordFilterOption[] -} - -export default function OrgSoftwareKeywordsFilter({keywords, keywordsList}: SoftwareKeywordsFilterProps) { - const {handleQueryChange} = useQueryChange() - - return ( -
    - -
    - ) - -} diff --git a/frontend/components/organisation/software/filters/OrgSoftwareLanguagesFilter.tsx b/frontend/components/organisation/software/filters/OrgSoftwareLanguagesFilter.tsx deleted file mode 100644 index ce3456f72..000000000 --- a/frontend/components/organisation/software/filters/OrgSoftwareLanguagesFilter.tsx +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import ProgrammingLanguagesFilter, {LanguagesFilterOption} from '~/components/filter/ProgrammingLanguagesFilter' -import useQueryChange from '../../projects/useQueryChange' - -type ProgrammingLanguagesFilterProps = { - prog_lang: string[], - languagesList: LanguagesFilterOption[] -} - -export default function SoftwareLanguagesFilter({prog_lang, languagesList}: ProgrammingLanguagesFilterProps) { - const {handleQueryChange} = useQueryChange() - - return ( -
    - -
    - ) -} diff --git a/frontend/components/organisation/software/filters/OrgSoftwareLicensesFilter.tsx b/frontend/components/organisation/software/filters/OrgSoftwareLicensesFilter.tsx deleted file mode 100644 index dde0fdc4e..000000000 --- a/frontend/components/organisation/software/filters/OrgSoftwareLicensesFilter.tsx +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import useQueryChange from '~/components/organisation/projects/useQueryChange' -import LicensesFilter, {LicensesFilterOption} from '~/components/filter/LicensesFilter' - - -type LicensesFilterProps = { - licenses: string[], - licensesList: LicensesFilterOption[], -} - -export default function SoftwareLicensesFilter({licenses, licensesList}: LicensesFilterProps) { - const {handleQueryChange} = useQueryChange() - - return ( -
    - -
    - ) -} diff --git a/frontend/components/organisation/software/filters/OrgSoftwareFilters.tsx b/frontend/components/organisation/software/filters/index.tsx similarity index 61% rename from frontend/components/organisation/software/filters/OrgSoftwareFilters.tsx rename to frontend/components/organisation/software/filters/index.tsx index fcff5b898..11f206dbb 100644 --- a/frontend/components/organisation/software/filters/OrgSoftwareFilters.tsx +++ b/frontend/components/organisation/software/filters/index.tsx @@ -1,6 +1,6 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 dv4all // // SPDX-License-Identifier: Apache-2.0 @@ -9,17 +9,18 @@ import FilterHeader from '~/components/filter/FilterHeader' import {decodeJsonParam} from '~/utils/extractQueryParam' import useQueryChange from '~/components/organisation/projects/useQueryChange' +import KeywordsFilter from '~/components/filter/KeywordsFilter' +import ProgrammingLanguagesFilter from '~/components/filter/ProgrammingLanguagesFilter' +import LicensesFilter from '~/components/filter/LicensesFilter' + import OrgOrderSoftwareBy from './OrgOrderSoftwareBy' -import OrgProjectKeywordsFilter from './OrgSoftwareKeywordsFilter' import useSoftwareParams from './useSoftwareParams' import useOrgSoftwareKeywordsList from './useOrgSoftwareKeywordsList' -import OrgSoftwareLicensesFilter from './OrgSoftwareLicensesFilter' import useOrgSoftwareLicensesList from './useOrgSoftwareLicensesList' -import OrgSoftwareLanguagesFilter from './OrgSoftwareLanguagesFilter' import useOrgSoftwareLanguagesList from './useOrgSoftwareLanguagesList' export default function OrgSoftwareFilters() { - const {resetFilters} = useQueryChange() + const {resetFilters,handleQueryChange} = useQueryChange() const {filterCnt,keywords_json,prog_lang_json,licenses_json} = useSoftwareParams() const {keywordsList} = useOrgSoftwareKeywordsList() const {languagesList} = useOrgSoftwareLanguagesList() @@ -45,20 +46,29 @@ export default function OrgSoftwareFilters() { {/* Order by */} {/* Keywords */} - +
    + +
    {/* Program languages */} - +
    + +
    {/* Licenses */} - +
    + +
    ) } diff --git a/frontend/components/organisation/software/filters/useSoftwareOrderOptions.tsx b/frontend/components/organisation/software/filters/useSoftwareOrderOptions.tsx deleted file mode 100644 index 86197eb39..000000000 --- a/frontend/components/organisation/software/filters/useSoftwareOrderOptions.tsx +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// -// SPDX-License-Identifier: Apache-2.0 - -import {useEffect, useState} from 'react' -import {softwareOrderOptions} from '~/components/software/overview/filters/OrderSoftwareBy' -import useOrganisationContext from '../../context/useOrganisationContext' -import {OrderOption} from '~/components/filter/OrderBy' - -const adminOrderOptions = [ - {key: 'status', label: 'Blocked', direction: 'asc.nullslast'}, - {key: 'is_published', label: 'Not published', direction: 'asc.nullslast'}, -] - -export function getSoftwareOrderOptions(isMaintainer:boolean) { - if (isMaintainer) { - const order = [ - ...softwareOrderOptions, - // additional organisation option (should be default) - {key: 'is_featured', label: 'Pinned', direction: 'desc.nullslast'}, - ...adminOrderOptions - ] - return order - } else { - return [ - ...softwareOrderOptions, - // additional organisation option (should be default) - {key: 'is_featured', label: 'Pinned', direction: 'desc.nullslast'} - ] - } -} - -export default function useSoftwareOrderOptions() { - const {isMaintainer} = useOrganisationContext() - const [softwareOrder,setSoftwareOrder] = useState([]) - - useEffect(() => { - const order = getSoftwareOrderOptions(isMaintainer) - setSoftwareOrder(order) - }, [isMaintainer]) - - return softwareOrder - -} diff --git a/frontend/components/organisation/software/filters/useSoftwareParams.tsx b/frontend/components/organisation/software/filters/useSoftwareParams.tsx index 70f86155c..dfe62e0b5 100644 --- a/frontend/components/organisation/software/filters/useSoftwareParams.tsx +++ b/frontend/components/organisation/software/filters/useSoftwareParams.tsx @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 @@ -8,12 +8,10 @@ import {getSoftwareParams} from '~/utils/extractQueryParam' import {useUserSettings} from '../../context/UserSettingsContext' export default function useSoftwareParams() { - // initalise router + // initialise router const router = useRouter() // get user preferences const {rsd_page_rows} = useUserSettings() - // extract project specific params - // const params = ssrProjectsParams(router.query) // use encoded array params as json string to avoid // useEffect re-renders in api hooks const params = getSoftwareParams(router.query) @@ -37,9 +35,8 @@ export default function useSoftwareParams() { // console.log('params...', params) // console.log('rsd_page_rows...', rsd_page_rows) // console.groupEnd() - // extract user prefference - // return these + // return params & count return { ...params, filterCnt diff --git a/frontend/components/organisation/software/index.tsx b/frontend/components/organisation/software/index.tsx index f135c4764..7cb82af0a 100644 --- a/frontend/components/organisation/software/index.tsx +++ b/frontend/components/organisation/software/index.tsx @@ -15,7 +15,7 @@ import {useUserSettings} from '../context/UserSettingsContext' import {ProjectLayoutType} from '~/components/projects/overview/search/ViewToggleGroup' import {setDocumentCookie} from '~/utils/userSettings' import FiltersPanel from '~/components/filter/FiltersPanel' -import OrgSoftwareFilters from './filters/OrgSoftwareFilters' +import OrgSoftwareFilters from './filters/index' import useSoftwareParams from './filters/useSoftwareParams' import useQueryChange from '../projects/useQueryChange' import OrgSearchSoftwareSection from './search/OrgSearchSoftwareSection' diff --git a/frontend/components/organisation/software/search/OrgSearchSoftwareSection.tsx b/frontend/components/organisation/software/search/OrgSearchSoftwareSection.tsx index 07501db6a..a0460e6b7 100644 --- a/frontend/components/organisation/software/search/OrgSearchSoftwareSection.tsx +++ b/frontend/components/organisation/software/search/OrgSearchSoftwareSection.tsx @@ -1,5 +1,5 @@ +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2023 dv4all // SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) @@ -10,22 +10,18 @@ import {useState} from 'react' import useMediaQuery from '@mui/material/useMediaQuery' import Button from '@mui/material/Button' +import {getPageRange} from '~/utils/pagination' import SearchInput from '~/components/search/SearchInput' import SelectRows from '~/components/software/overview/search/SelectRows' import ViewToggleGroup, {ProjectLayoutType} from '~/components/projects/overview/search/ViewToggleGroup' import useQueryChange from '~/components/organisation/projects/useQueryChange' -import OrgSoftwareFiltersModal from '../filters/OrgSoftwareFiltersModal' -import useSoftwareParams from '../filters/useSoftwareParams' -import {getPageRange} from '~/utils/pagination' +import FiltersModal from '~/components/filter/FiltersModal' +import useSoftwareParams from '~/components/organisation/software/filters/useSoftwareParams' +import OrgSoftwareFilters from '~/components/organisation/software/filters/index' type SearchSectionProps = { - // search?: string | null - // page: number - // rows: number count: number - // placeholder: string layout: ProjectLayoutType - // setModal: (modal: boolean) => void setView: (view:ProjectLayoutType)=>void } @@ -77,12 +73,14 @@ export default function OrgSearchSoftwareSection({ } - { - smallScreen === true && - + > + + + : undefined } diff --git a/frontend/components/organisation/software/useOrganisationSoftware.tsx b/frontend/components/organisation/software/useOrganisationSoftware.tsx index 3601618fb..36a00475d 100644 --- a/frontend/components/organisation/software/useOrganisationSoftware.tsx +++ b/frontend/components/organisation/software/useOrganisationSoftware.tsx @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 dv4all -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 @@ -13,7 +13,7 @@ import {SoftwareOfOrganisation} from '~/types/Organisation' import {getSoftwareForOrganisation} from '../apiOrganisations' import useOrganisationContext from '../context/useOrganisationContext' import useSoftwareParams from './filters/useSoftwareParams' -import {getSoftwareOrderOptions} from './filters/useSoftwareOrderOptions' +import {getSoftwareOrderOptions} from './filters/OrgOrderSoftwareBy' type State = { count: number, diff --git a/frontend/components/projects/overview/filters/ProjectFiltersModal.tsx b/frontend/components/projects/overview/filters/ProjectFiltersModal.tsx index da1bc8502..f8fd620a1 100644 --- a/frontend/components/projects/overview/filters/ProjectFiltersModal.tsx +++ b/frontend/components/projects/overview/filters/ProjectFiltersModal.tsx @@ -1,6 +1,6 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 dv4all // // SPDX-License-Identifier: Apache-2.0 @@ -13,8 +13,9 @@ import DialogActions from '@mui/material/DialogActions' import Button from '@mui/material/Button' import {KeywordFilterOption} from '~/components/filter/KeywordsFilter' import {ResearchDomainOption} from '~/components/filter/ResearchDomainFilter' -import {OrganisationOption} from './ProjectOrganisationsFilter' -import ProjectFilters from './ProjectFilters' +import {OrganisationOption} from '~/components/filter/OrganisationsFilter' + +import ProjectFilters from './index' import {StatusFilterOption} from './ProjectStatusFilter' type ProjectFiltersModalProps = { diff --git a/frontend/components/projects/overview/filters/ProjectKeywordsFilter.tsx b/frontend/components/projects/overview/filters/ProjectKeywordsFilter.tsx deleted file mode 100644 index 74ea59788..000000000 --- a/frontend/components/projects/overview/filters/ProjectKeywordsFilter.tsx +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import useProjectOverviewParams from '../useProjectOverviewParams' -import KeywordsFilter, {KeywordFilterOption} from '~/components/filter/KeywordsFilter' - -type ProjectKeywordsFilterProps = { - keywords: string[], - keywordsList: KeywordFilterOption[] -} - -export default function ProjectKeywordsFilter({keywords, keywordsList}: ProjectKeywordsFilterProps) { - const {handleQueryChange} = useProjectOverviewParams() - - return ( -
    - -
    - ) -} diff --git a/frontend/components/projects/overview/filters/ProjectOrganisationsFilter.tsx b/frontend/components/projects/overview/filters/ProjectOrganisationsFilter.tsx deleted file mode 100644 index 575a8232e..000000000 --- a/frontend/components/projects/overview/filters/ProjectOrganisationsFilter.tsx +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import useProjectOverviewParams from '../useProjectOverviewParams' -import OrganisationsFilter from '~/components/filter/OrganisationsFilter' - -export type OrganisationOption = { - organisation: string, - organisation_cnt: number -} - -type OrganisationFilterProps = { - organisations: string[], - organisationsList: OrganisationOption[] -} - -export default function ProjectOrganisationsFilter({organisations, organisationsList}: OrganisationFilterProps) { - const {handleQueryChange} = useProjectOverviewParams() - - return ( -
    - -
    - ) -} diff --git a/frontend/components/projects/overview/filters/ProjectResearchDomainFilter.tsx b/frontend/components/projects/overview/filters/ProjectResearchDomainFilter.tsx deleted file mode 100644 index 8f66abd40..000000000 --- a/frontend/components/projects/overview/filters/ProjectResearchDomainFilter.tsx +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import ResearchDomainFilter, {ResearchDomainOption} from '~/components/filter/ResearchDomainFilter' -import useProjectOverviewParams from '../useProjectOverviewParams' - -type ResearchDomainFilterProps = { - domains: string[], - domainsList: ResearchDomainOption[] -} - -export default function ProjectResearchDomainFilter({domains, domainsList}: ResearchDomainFilterProps) { - const {handleQueryChange} = useProjectOverviewParams() - - // console.group('ResearchDomainFilter') - // console.log('domainsList...', domainsList) - // console.log('options...', options) - // console.groupEnd() - - return ( -
    - -
    - ) - -} diff --git a/frontend/components/projects/overview/filters/ProjectFilters.tsx b/frontend/components/projects/overview/filters/index.tsx similarity index 61% rename from frontend/components/projects/overview/filters/ProjectFilters.tsx rename to frontend/components/projects/overview/filters/index.tsx index 9f5cd3965..347ef9c1f 100644 --- a/frontend/components/projects/overview/filters/ProjectFilters.tsx +++ b/frontend/components/projects/overview/filters/index.tsx @@ -1,19 +1,17 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 dv4all // // SPDX-License-Identifier: Apache-2.0 import FilterHeader from '~/components/filter/FilterHeader' -import {KeywordFilterOption} from '~/components/filter/KeywordsFilter' -import {ResearchDomainOption} from '~/components/filter/ResearchDomainFilter' +import KeywordsFilter, {KeywordFilterOption} from '~/components/filter/KeywordsFilter' +import OrganisationsFilter, {OrganisationOption} from '~/components/filter/OrganisationsFilter' +import ResearchDomainFilter, {ResearchDomainOption} from '~/components/filter/ResearchDomainFilter' import useProjectOverviewParams from '../useProjectOverviewParams' -import ProjectKeywordsFilter from './ProjectKeywordsFilter' -import ProjectResearchDomainFilter from './ProjectResearchDomainFilter' import OrderProjectsBy from './OrderProjectsBy' -import ProjectOrganisationsFilter, {OrganisationOption} from './ProjectOrganisationsFilter' import ProjectStatusFilter, {StatusFilterOption} from './ProjectStatusFilter' type ProjectFiltersProps = { @@ -68,21 +66,29 @@ export default function ProjectFilters({ handleQueryChange={handleQueryChange} /> {/* Keywords */} - +
    + +
    {/* Research domains */} - +
    + +
    {/* Participating organisations */} - - +
    + +
    ) } diff --git a/frontend/components/software/overview/filters/SoftwareKeywordsFilter.tsx b/frontend/components/software/overview/filters/SoftwareKeywordsFilter.tsx deleted file mode 100644 index dc09f316e..000000000 --- a/frontend/components/software/overview/filters/SoftwareKeywordsFilter.tsx +++ /dev/null @@ -1,82 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import {useEffect, useState} from 'react' -import Autocomplete from '@mui/material/Autocomplete' -import TextField from '@mui/material/TextField' - -import {KeywordFilterOption} from '~/components/filter/KeywordsFilter' -import FilterTitle from '~/components/filter/FilterTitle' -import FilterOption from '~/components/filter/FilterOption' -import useSoftwareOverviewParams from '../useSoftwareOverviewParams' - -type SoftwareKeywordsFilterProps = { - keywords: string[], - keywordsList: KeywordFilterOption[] -} - -export default function SoftwareKeywordsFilter({keywords, keywordsList}: SoftwareKeywordsFilterProps) { - const {handleQueryChange} = useSoftwareOverviewParams() - const [selected, setSelected] = useState([]) - const [options, setOptions] = useState(keywordsList) - - // console.group('KeywordsFilter') - // console.log('keywordsList...', keywordsList) - // console.log('options...', options) - // console.groupEnd() - - useEffect(() => { - if (keywords.length > 0 && keywordsList.length) { - const selectedKeywords = keywordsList.filter(option => { - return keywords.includes(option.keyword) - }) - setSelected(selectedKeywords) - } else { - setSelected([]) - } - setOptions(keywordsList) - },[keywords,keywordsList]) - - return ( -
    - - (option.keyword)} - isOptionEqualToValue={(option, value) => { - return option.keyword === value.keyword - }} - defaultValue={[]} - filterSelectedOptions - renderOption={(props, option) => ( - - )} - renderInput={(params) => ( - - )} - onChange={(event, newValue) => { - // extract values into string[] for url query - const queryFilter = newValue.map(item => item.keyword) - handleQueryChange('keywords', queryFilter) - }} - /> -
    - ) -} diff --git a/frontend/components/software/overview/filters/SoftwareLanguagesFilter.tsx b/frontend/components/software/overview/filters/SoftwareLanguagesFilter.tsx deleted file mode 100644 index 7ab9adea9..000000000 --- a/frontend/components/software/overview/filters/SoftwareLanguagesFilter.tsx +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import useSoftwareOverviewParams from '../useSoftwareOverviewParams' -import ProgrammingLanguagesFilter, {LanguagesFilterOption} from '~/components/filter/ProgrammingLanguagesFilter' - -type ProgrammingLanguagesFilterProps = { - prog_lang: string[], - languagesList: LanguagesFilterOption[] -} - -export default function SoftwareLanguagesFilter({prog_lang, languagesList}: ProgrammingLanguagesFilterProps) { - const {handleQueryChange} = useSoftwareOverviewParams() - - return ( -
    - -
    - ) -} diff --git a/frontend/components/software/overview/filters/SoftwareLicensesFilter.tsx b/frontend/components/software/overview/filters/SoftwareLicensesFilter.tsx deleted file mode 100644 index 363fd520c..000000000 --- a/frontend/components/software/overview/filters/SoftwareLicensesFilter.tsx +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 dv4all -// -// SPDX-License-Identifier: Apache-2.0 - -import useSoftwareOverviewParams from '../useSoftwareOverviewParams' -import LicensesFilter, {LicensesFilterOption} from '~/components/filter/LicensesFilter' - - -type LicensesFilterProps = { - licenses: string[], - licensesList: LicensesFilterOption[], -} - -export default function SoftwareLicensesFilter({licenses, licensesList}: LicensesFilterProps) { - const {handleQueryChange} = useSoftwareOverviewParams() - - return ( -
    - -
    - ) -} diff --git a/frontend/components/software/overview/filters/index.tsx b/frontend/components/software/overview/filters/index.tsx index 8ac1d2bc2..d01d6dfd7 100644 --- a/frontend/components/software/overview/filters/index.tsx +++ b/frontend/components/software/overview/filters/index.tsx @@ -1,7 +1,7 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 dv4all // SPDX-FileCopyrightText: 2024 Christian Meeßen (GFZ) // SPDX-FileCopyrightText: 2024 Helmholtz Centre Potsdam - GFZ German Research Centre for Geosciences @@ -9,14 +9,11 @@ // SPDX-License-Identifier: Apache-2.0 import FilterHeader from '~/components/filter/FilterHeader' -import {LicensesFilterOption} from '~/components/filter/LicensesFilter' -import {LanguagesFilterOption} from '~/components/filter/ProgrammingLanguagesFilter' -import {KeywordFilterOption} from '~/components/filter/KeywordsFilter' +import KeywordsFilter, {KeywordFilterOption} from '~/components/filter/KeywordsFilter' +import ProgrammingLanguagesFilter, {LanguagesFilterOption} from '~/components/filter/ProgrammingLanguagesFilter' +import LicensesFilter, {LicensesFilterOption} from '~/components/filter/LicensesFilter' import useSoftwareOverviewParams from '../useSoftwareOverviewParams' import OrderSoftwareBy, {OrderHighlightsBy} from './OrderSoftwareBy' -import SoftwareKeywordsFilter from './SoftwareKeywordsFilter' -import SoftwareLanguagesFilter from './SoftwareLanguagesFilter' -import SoftwareLicensesFilter from './SoftwareLicensesFilter' export type LicenseWithCount = { license: string; @@ -46,7 +43,7 @@ export default function SoftwareFilters({ orderBy, highlightsOnly = false }:SoftwareFilterProps) { - const {resetFilters} = useSoftwareOverviewParams() + const {resetFilters,handleQueryChange} = useSoftwareOverviewParams() function clearDisabled() { if (filterCnt && filterCnt > 0) return false @@ -64,20 +61,29 @@ export default function SoftwareFilters({ {highlightsOnly && } {!highlightsOnly && } {/* Keywords */} - - {/* Programme Languages */} - +
    + +
    + {/* Programming Languages */} +
    + +
    {/* Licenses */} - +
    + +
    ) } diff --git a/frontend/components/software/overview/search/SoftwareSearchSection.tsx b/frontend/components/software/overview/search/SoftwareSearchSection.tsx index 7b296099e..68763b892 100644 --- a/frontend/components/software/overview/search/SoftwareSearchSection.tsx +++ b/frontend/components/software/overview/search/SoftwareSearchSection.tsx @@ -1,5 +1,5 @@ +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2023 dv4all // SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) @@ -9,11 +9,11 @@ import useMediaQuery from '@mui/material/useMediaQuery' import Button from '@mui/material/Button' +import {getPageRange} from '~/utils/pagination' import SearchInput from '~/components/search/SearchInput' +import useSoftwareOverviewParams from '../useSoftwareOverviewParams' import ViewToggleGroup, {LayoutType} from './ViewToggleGroup' import SelectRows from './SelectRows' -import useSoftwareOverviewParams from '../useSoftwareOverviewParams' -import {getPageRange} from '~/utils/pagination' type SearchSectionProps = { page: number diff --git a/frontend/pages/communities/[slug]/about.tsx b/frontend/pages/communities/[slug]/about.tsx index 022492d26..8beac7688 100644 --- a/frontend/pages/communities/[slug]/about.tsx +++ b/frontend/pages/communities/[slug]/about.tsx @@ -12,7 +12,6 @@ import {EditCommunityProps, getCommunityBySlug} from '~/components/communities/a import {LayoutType} from '~/components/software/overview/search/ViewToggleGroup' import PageMeta from '~/components/seo/PageMeta' import CanonicalUrl from '~/components/seo/CanonicalUrl' -import {isCommunityMaintainer} from '~/auth/permissions/isMaintainerOfCommunity' import AboutCommunityPage from '~/components/communities/about' import CommunityPage from '~/components/communities/CommunityPage' import {getKeywordsByCommunity} from '~/components/communities/settings/general/apiCommunityKeywords' @@ -80,34 +79,26 @@ export async function getServerSideProps(context:GetServerSidePropsContext) { const token = req?.cookies['rsd_token'] const user = getUserFromToken(token) // find community by slug - const community = await getCommunityBySlug({ + const {community:com, isMaintainer} = await getCommunityBySlug({ slug: params?.slug?.toString() ?? null, token: req?.cookies['rsd_token'], user }) // console.log('community...', community) - if (community === null || community?.description === null){ + if (com === null || com?.description === null){ // returning notFound triggers 404 page return { notFound: true, } } // get info if the user is maintainer - const [isMaintainer,keywords] = await Promise.all([ - isCommunityMaintainer({ - community: community.id ?? '', - role: user?.role, - account: user?.account, - token - }), - getKeywordsByCommunity(community.id,token) - ]) + const keywords = await getKeywordsByCommunity(com.id,token) return { // passed to the page component as props props: { community:{ - ...community, + ...com, // use keywords for editing keywords }, diff --git a/frontend/pages/communities/[slug]/rejected.tsx b/frontend/pages/communities/[slug]/rejected.tsx new file mode 100644 index 000000000..6ef68f87b --- /dev/null +++ b/frontend/pages/communities/[slug]/rejected.tsx @@ -0,0 +1,156 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {GetServerSidePropsContext} from 'next' + +import {app} from '~/config/app' +import {getUserFromToken} from '~/auth' +import {getUserSettings} from '~/utils/userSettings' +import PageMeta from '~/components/seo/PageMeta' +import CanonicalUrl from '~/components/seo/CanonicalUrl' +import {KeywordFilterOption} from '~/components/filter/KeywordsFilter' +import {LanguagesFilterOption} from '~/components/filter/ProgrammingLanguagesFilter' +import {LicensesFilterOption} from '~/components/filter/LicensesFilter' +import {LayoutType} from '~/components/software/overview/search/ViewToggleGroup' +import {EditCommunityProps, getCommunityBySlug} from '~/components/communities/apiCommunities' +import CommunityPage from '~/components/communities/CommunityPage' +import CommunitySoftware from '~/components/communities/software' +import {SoftwareOfCommunity, ssrCommunitySoftwareProps} from '~/components/communities/software/apiCommunitySoftware' + +type CommunitySoftwareProps={ + community: EditCommunityProps, + software: SoftwareOfCommunity[], + slug: string[], + isMaintainer: boolean, + rsd_page_rows: number, + rsd_page_layout: LayoutType, + count: number, + keywordsList: KeywordFilterOption[], + languagesList: LanguagesFilterOption[], + licensesList: LicensesFilterOption[], +} + +export default function CommunityRejectedSoftwarePage({ + community,slug,isMaintainer, + rsd_page_rows, rsd_page_layout, + software, count, keywordsList, + languagesList, licensesList +}:CommunitySoftwareProps) { + + // console.group('CommunityRejectedSoftwarePage') + // console.log('community...', community) + // console.log('slug....', slug) + // console.log('software....', software) + // console.log('isMaintainer....', isMaintainer) + // console.log('rsd_page_rows....', rsd_page_rows) + // console.log('rsd_page_layout....', rsd_page_layout) + // console.log('keywordsList....', keywordsList) + // console.log('languagesList....', languagesList) + // console.log('licensesList....', licensesList) + // console.groupEnd() + + function getMetaDescription() { + // use organisation (short) description if available + if (community.short_description) return community.short_description + // else generate description message + return `${community?.name ?? 'The RSD community'} with ${community.software_cnt ?? 0} software packages.` + } + + return ( + <> + {/* Page Head meta tags */} + + + + + + + ) +} + + +// fetching data server side +// see documentation https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering +export async function getServerSideProps(context:GetServerSidePropsContext) { + try{ + const {params, req, query} = context + // extract user settings from cookie + const {rsd_page_layout, rsd_page_rows} = getUserSettings(req) + + // extract user id from session + const token = req?.cookies['rsd_token'] + const user = getUserFromToken(token) + + // get community by slug and isMaintainer info + const {community:com,isMaintainer} = await getCommunityBySlug({ + slug: params?.slug?.toString() ?? null, + token: req?.cookies['rsd_token'], + user + }) + // console.log('community...', community) + if (com === null){ + // returning notFound triggers 404 page + return { + notFound: true, + } + } + // deconstruct data + const { + software, + keywordsList, + languagesList, + licensesList, + // community with updated keywords + community + } = await ssrCommunitySoftwareProps({ + community: com, + software_status: 'rejected', + query: query, + isMaintainer, + token + }) + + // update community count to actual count + // community.software_cnt = software.count + return { + // passed to the page component as props + props: { + community, + slug: [params?.slug], + isMaintainer, + rsd_page_layout, + rsd_page_rows, + count: software.count, + software: software.data, + keywordsList, + languagesList, + licensesList + }, + } + }catch(e){ + return { + notFound: true, + } + } +} diff --git a/frontend/pages/communities/[slug]/requests.tsx b/frontend/pages/communities/[slug]/requests.tsx new file mode 100644 index 000000000..92b05aaf0 --- /dev/null +++ b/frontend/pages/communities/[slug]/requests.tsx @@ -0,0 +1,156 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {GetServerSidePropsContext} from 'next' + +import {app} from '~/config/app' +import {getUserFromToken} from '~/auth' +import {getUserSettings} from '~/utils/userSettings' +import PageMeta from '~/components/seo/PageMeta' +import CanonicalUrl from '~/components/seo/CanonicalUrl' +import {KeywordFilterOption} from '~/components/filter/KeywordsFilter' +import {LanguagesFilterOption} from '~/components/filter/ProgrammingLanguagesFilter' +import {LicensesFilterOption} from '~/components/filter/LicensesFilter' +import {LayoutType} from '~/components/software/overview/search/ViewToggleGroup' +import {EditCommunityProps, getCommunityBySlug} from '~/components/communities/apiCommunities' +import CommunityPage from '~/components/communities/CommunityPage' +import CommunitySoftware from '~/components/communities/software' +import {SoftwareOfCommunity, ssrCommunitySoftwareProps} from '~/components/communities/software/apiCommunitySoftware' + +type CommunitySoftwareProps={ + community: EditCommunityProps, + software: SoftwareOfCommunity[], + slug: string[], + isMaintainer: boolean, + rsd_page_rows: number, + rsd_page_layout: LayoutType, + count: number, + keywordsList: KeywordFilterOption[], + languagesList: LanguagesFilterOption[], + licensesList: LicensesFilterOption[], +} + +export default function RequestsToJoinCommunity({ + community,slug,isMaintainer, + rsd_page_rows, rsd_page_layout, + software, count, keywordsList, + languagesList, licensesList +}:CommunitySoftwareProps) { + + // console.group('RequestsToJoinCommunity') + // console.log('community...', community) + // console.log('slug....', slug) + // console.log('software....', software) + // console.log('isMaintainer....', isMaintainer) + // console.log('rsd_page_rows....', rsd_page_rows) + // console.log('rsd_page_layout....', rsd_page_layout) + // console.log('keywordsList....', keywordsList) + // console.log('languagesList....', languagesList) + // console.log('licensesList....', licensesList) + // console.groupEnd() + + function getMetaDescription() { + // use organisation (short) description if available + if (community.short_description) return community.short_description + // else generate description message + return `${community?.name ?? 'The RSD community'} with ${community.software_cnt ?? 0} software packages.` + } + + return ( + <> + {/* Page Head meta tags */} + + + + + + + ) +} + + +// fetching data server side +// see documentation https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering +export async function getServerSideProps(context:GetServerSidePropsContext) { + try{ + const {params, req, query} = context + // extract user settings from cookie + const {rsd_page_layout, rsd_page_rows} = getUserSettings(req) + + // extract user id from session + const token = req?.cookies['rsd_token'] + const user = getUserFromToken(token) + + // get community by slug and isMaintainer info + const {community:com,isMaintainer} = await getCommunityBySlug({ + slug: params?.slug?.toString() ?? null, + token: req?.cookies['rsd_token'], + user + }) + // console.log('community...', community) + if (com === null){ + // returning notFound triggers 404 page + return { + notFound: true, + } + } + // deconstruct data + const { + software, + keywordsList, + languagesList, + licensesList, + // community with updated keywords + community + } = await ssrCommunitySoftwareProps({ + community: com, + software_status: 'pending', + query: query, + isMaintainer, + token + }) + + // update community count to actual count + // community.software_cnt = software.count + return { + // passed to the page component as props + props: { + community, + slug: [params?.slug], + isMaintainer, + rsd_page_layout, + rsd_page_rows, + count: software.count, + software: software.data, + keywordsList, + languagesList, + licensesList + }, + } + }catch(e){ + return { + notFound: true, + } + } +} diff --git a/frontend/pages/communities/[slug]/settings.tsx b/frontend/pages/communities/[slug]/settings.tsx index d34b30f64..005e1c4a5 100644 --- a/frontend/pages/communities/[slug]/settings.tsx +++ b/frontend/pages/communities/[slug]/settings.tsx @@ -80,35 +80,28 @@ export async function getServerSideProps(context:GetServerSidePropsContext) { // extract user id from session const token = req?.cookies['rsd_token'] const user = getUserFromToken(token) + // find community by slug - const community = await getCommunityBySlug({ + const {community:com,isMaintainer} = await getCommunityBySlug({ slug: params?.slug?.toString() ?? null, token: req?.cookies['rsd_token'], user }) // console.log('community...', community) - if (community === null){ + if (com === null){ // returning notFound triggers 404 page return { notFound: true, } } // get info if the user is maintainer - const [isMaintainer,keywords] = await Promise.all([ - isCommunityMaintainer({ - community: community.id ?? '', - role: user?.role, - account: user?.account, - token - }), - getKeywordsByCommunity(community.id,token) - ]) + const keywords = await getKeywordsByCommunity(com.id,token) return { // passed to the page component as props props: { community:{ - ...community, + ...com, // use keywords for editing keywords }, diff --git a/frontend/pages/communities/[slug]/software.tsx b/frontend/pages/communities/[slug]/software.tsx index 4c5e5a2f0..fb7efdacf 100644 --- a/frontend/pages/communities/[slug]/software.tsx +++ b/frontend/pages/communities/[slug]/software.tsx @@ -8,33 +8,47 @@ import {GetServerSidePropsContext} from 'next' import {app} from '~/config/app' import {getUserFromToken} from '~/auth' import {getUserSettings} from '~/utils/userSettings' -import {EditCommunityProps, getCommunityBySlug} from '~/components/communities/apiCommunities' -import {LayoutType} from '~/components/software/overview/search/ViewToggleGroup' import PageMeta from '~/components/seo/PageMeta' import CanonicalUrl from '~/components/seo/CanonicalUrl' -import {isCommunityMaintainer} from '~/auth/permissions/isMaintainerOfCommunity' +import {KeywordFilterOption} from '~/components/filter/KeywordsFilter' +import {LanguagesFilterOption} from '~/components/filter/ProgrammingLanguagesFilter' +import {LicensesFilterOption} from '~/components/filter/LicensesFilter' +import {LayoutType} from '~/components/software/overview/search/ViewToggleGroup' +import {EditCommunityProps, getCommunityBySlug} from '~/components/communities/apiCommunities' import CommunityPage from '~/components/communities/CommunityPage' -import {getKeywordsByCommunity} from '~/components/communities/settings/general/apiCommunityKeywords' +import CommunitySoftware from '~/components/communities/software' +import {SoftwareOfCommunity, ssrCommunitySoftwareProps} from '~/components/communities/software/apiCommunitySoftware' type CommunitySoftwareProps={ community: EditCommunityProps, + software: SoftwareOfCommunity[], slug: string[], isMaintainer: boolean, rsd_page_rows: number, - rsd_page_layout: LayoutType + rsd_page_layout: LayoutType, + count: number, + keywordsList: KeywordFilterOption[], + languagesList: LanguagesFilterOption[], + licensesList: LicensesFilterOption[], } export default function CommunitySoftwarePage({ community,slug,isMaintainer, - rsd_page_rows, rsd_page_layout + rsd_page_rows, rsd_page_layout, + software, count, keywordsList, + languagesList, licensesList }:CommunitySoftwareProps) { // console.group('CommunitySoftwarePage') // console.log('community...', community) // console.log('slug....', slug) + // console.log('software....', software) // console.log('isMaintainer....', isMaintainer) // console.log('rsd_page_rows....', rsd_page_rows) // console.log('rsd_page_layout....', rsd_page_layout) + // console.log('keywordsList....', keywordsList) + // console.log('languagesList....', languagesList) + // console.log('licensesList....', licensesList) // console.groupEnd() function getMetaDescription() { @@ -60,7 +74,16 @@ export default function CommunitySoftwarePage({ rsd_page_layout={rsd_page_layout} selectTab='software' > -

    Community software - TO DO!

    + ) @@ -74,46 +97,55 @@ export async function getServerSideProps(context:GetServerSidePropsContext) { const {params, req, query} = context // extract user settings from cookie const {rsd_page_layout, rsd_page_rows} = getUserSettings(req) + // extract user id from session const token = req?.cookies['rsd_token'] const user = getUserFromToken(token) - // find community by slug - const community = await getCommunityBySlug({ + + // get community by slug and isMaintainer info + const {community:com,isMaintainer} = await getCommunityBySlug({ slug: params?.slug?.toString() ?? null, token: req?.cookies['rsd_token'], user }) // console.log('community...', community) - if (community === null){ + if (com === null){ // returning notFound triggers 404 page return { notFound: true, } } - // get info if the user is maintainer - const [isMaintainer,keywords] = await Promise.all([ - isCommunityMaintainer({ - community: community.id ?? '', - role: user?.role, - account: user?.account, - token - }), - getKeywordsByCommunity(community.id,token) - ]) + // deconstruct data + const { + software, + keywordsList, + languagesList, + licensesList, + // community with updated keywords + community + } = await ssrCommunitySoftwareProps({ + community: com, + software_status: 'approved', + query: query, + isMaintainer, + token + }) + // update community count to actual count + // community.software_cnt = software.count return { // passed to the page component as props props: { - community:{ - ...community, - // use keywords for editing - keywords - }, + community, slug: [params?.slug], - tab: query?.tab ?? null, isMaintainer, rsd_page_layout, - rsd_page_rows + rsd_page_rows, + count: software.count, + software: software.data, + keywordsList, + languagesList, + licensesList }, } }catch(e){ diff --git a/frontend/pages/communities/index.tsx b/frontend/pages/communities/index.tsx index ffb4f103b..0e5188b2c 100644 --- a/frontend/pages/communities/index.tsx +++ b/frontend/pages/communities/index.tsx @@ -153,7 +153,7 @@ export async function getServerSideProps(context:GetServerSidePropsContext) { page: page>0 ? page-1 : 0, rows: page_rows, searchFor: search, - orderBy: 'software_cnt.desc,name.asc', + orderBy: 'software_cnt.desc.nullslast,name.asc', token }) diff --git a/frontend/pages/projects/index.tsx b/frontend/pages/projects/index.tsx index 7f50abe03..963b392e8 100644 --- a/frontend/pages/projects/index.tsx +++ b/frontend/pages/projects/index.tsx @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2021 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2021 - 2023 dv4all +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) // // SPDX-License-Identifier: Apache-2.0 @@ -41,7 +41,7 @@ import { projectStatusFilter } from '~/components/projects/overview/filters/projectFiltersApi' import {projectOrderOptions} from '~/components/projects/overview/filters/OrderProjectsBy' -import ProjectFilters from '~/components/projects/overview/filters/ProjectFilters' +import ProjectFilters from '~/components/projects/overview/filters/index' import ProjectSearchSection from '~/components/projects/overview/search/ProjectSearchSection' import ProjectOverviewContent from '~/components/projects/overview/ProjectOverviewContent' import ProjectFiltersModal from '~/components/projects/overview/filters/ProjectFiltersModal' @@ -67,7 +67,7 @@ export type ProjectOverviewPageProps = { } const pageTitle = `Projects | ${app.title}` -const pageDesc = 'The list of research projects registerd in the Research Software Directory.' +const pageDesc = 'The list of research projects in the Research Software Directory.' export default function ProjectsOverviewPage({ search, order, diff --git a/frontend/utils/pagination.ts b/frontend/utils/pagination.ts index 27821d2f1..4ba963db5 100644 --- a/frontend/utils/pagination.ts +++ b/frontend/utils/pagination.ts @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2024 Ewan Cahen (Netherlands eScience Center) // SPDX-FileCopyrightText: 2024 Netherlands eScience Center // @@ -8,5 +9,9 @@ export function getPageRange(rows: number, page: number, total: number): string page = 1 } + if (total===0){ + return '0-0 of 0' + } + return `${(page - 1) * rows + 1}-${Math.min(total, page * rows)} of ${total}` } From 096881a42668e8bc7adf841d2b14f2952b565449 Mon Sep 17 00:00:00 2001 From: Dusan Mijatovic Date: Tue, 4 Jun 2024 10:03:13 +0200 Subject: [PATCH 5/9] feat: create support for modules in settings.json feat: improve delete of communities in admin section docs: add communities to documentation chore: update docusaurus and lock versions chore: remove communities from modules fix: revert back font size when less than 4 items in the menu fix: remove unused variable --- documentation/assets/screenshots-template.xcf | Bin 4442522 -> 4761307 bytes .../assets/screenshots-template.xcf.license | 4 +- .../03-rsd-instance/01-getting-started.md | 13 +- .../01-getting-started.md.license | 2 +- .../docs/03-rsd-instance/02-configurations.md | 20 +- .../02-configurations.md.license | 2 +- .../docs/03-rsd-instance/03-administration.md | 35 +- .../img/admin-communities.webp | Bin 0 -> 92288 bytes .../img/admin-communities.webp.license | 4 + documentation/package-lock.json | 3014 ++++++++--------- documentation/package-lock.json.license | 4 +- documentation/package.json | 18 +- documentation/package.json.license | 4 +- .../components/AppHeader/AppHeader.test.tsx | 26 +- frontend/components/AppHeader/DesktopMenu.tsx | 5 +- .../components/AppHeader/ResponsiveMenu.tsx | 17 +- .../admin/communities/CommunityList.tsx | 6 +- .../admin/communities/CommunityListItem.tsx | 28 +- .../admin/communities/apiCommunities.ts | 56 - .../admin/communities/useAdminCommunities.tsx | 7 +- frontend/components/cards/KeywordList.tsx | 6 +- .../feedback/FeedbackPanelButton.tsx | 8 +- frontend/config/defaultSettings.json | 3 +- frontend/config/getSettingsServerSide.ts | 10 +- frontend/config/menuItems.ts | 12 +- frontend/config/rsdSettingsReducer.ts | 7 +- frontend/config/useMenuItems.tsx | 24 + frontend/config/userMenuItems.tsx | 27 +- frontend/public/data/settings.json | 8 +- frontend/utils/useDisableScrollLock.tsx | 4 +- 30 files changed, 1562 insertions(+), 1812 deletions(-) create mode 100644 documentation/docs/03-rsd-instance/img/admin-communities.webp create mode 100644 documentation/docs/03-rsd-instance/img/admin-communities.webp.license create mode 100644 frontend/config/useMenuItems.tsx diff --git a/documentation/assets/screenshots-template.xcf b/documentation/assets/screenshots-template.xcf index 1308201df0d6730ecedc705a6b9bc8640d5dce28..835d93a225947bfb5eadaec372874b055b95a5c6 100644 GIT binary patch delta 837196 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 z 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�P3Wnt$fj2Rs7T;HdWI#es><`IMtW*id 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%0D>gGU;w&He_nmvB+i8r3B1n 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%0DItSfk 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ϏrO#ur3gjl9Nh9$x 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 z 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

    gqV{CL;XJtxaa`h;tJB0QPY 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

    ?T^u%Tf{ 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

    *^bf?Y0%$=*2di0yYjeWV%534 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

    DuxGV0ho^m5)7i-!oki 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 SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center -SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) SPDX-License-Identifier: CC-BY-4.0 diff --git a/documentation/docs/03-rsd-instance/02-configurations.md b/documentation/docs/03-rsd-instance/02-configurations.md index 42bfdb728..6ecc91ee9 100644 --- a/documentation/docs/03-rsd-instance/02-configurations.md +++ b/documentation/docs/03-rsd-instance/02-configurations.md @@ -149,6 +149,8 @@ The `host` section of settings.json defines following settings. **Most of them s - `login_info_url`: the link to getting access documentation shown in the "Sign in with" modal. It is relevant only if you use more than one authentication provider. If you use only one authentication provider "Sign in with" modal is not used, instead the user is directly redirected to authentication page. - `terms_of_service_url`: the link to your Terms of Service page. Used on the user profile page to let user accept the terms of service - `privacy_statement_url`: the link to your privacy statement page. Used on the user profile page to let user accept the privacy statement. +- `software_highlights`: the definitions for the software highlights section on the top of the software overview page. You can specify title and the number of items loaded in the carousel. The default values are shown below. +- `modules`: defines RSD "modules" displayed in the main menu in the page header. Possible values are: software, projects, organisations and communities. ```json ... @@ -165,11 +167,24 @@ The `host` section of settings.json defines following settings. **Most of them s }, "login_info_url":"https://research-software-directory.github.io/documentation/getting-access.html", "terms_of_service_url": "/page/terms-of-service/", - "privacy_statement_url": "/page/privacy-statement/" + "privacy_statement_url": "/page/privacy-statement/", + "software_highlights": { + "title": "Software Highlights", + "limit": 5, + "description": null + }, + "modules":["software","projects","organisations"] } ... ``` +:::tip host modules + +- Note that the communities module is not included in the default settings definitions. +- Note that disabled module pages still can be accessed when "proper" url is used. +- You can enable it by adding "communities" into the modules array and the menu option will appear. + ::: + ## UI theming The look and feel of RSD can be customised with desired colors and fonts. In the settings.json the `theme` section defines all colors and fonts that can be customized. In addition, you can overwrite global styles (index.css), custom fonts and additional images. @@ -181,6 +196,7 @@ The look and feel of RSD can be customised with desired colors and fonts. In the - When customizing RSD styles we advice to mount custom fonts in the styles folder close to index.css - The footer logo should be mounted into `/app/public/images`. Then you can use relative image path `/images/your-logo.svg` in the settings.json - Your [starting point should be our default files](https://github.com/research-software-directory/RSD-as-a-service/tree/main/frontend/public) where you adjust the values you want to be different. + ::: ### Example mounting custom definitions @@ -223,7 +239,7 @@ RSD uses default settings.json if alternative is not mounted into `/app/public/d "url": "rsd@esciencecenter.nl", "issues_page_url": "https://github.com/research-software-directory/RSD-as-a-service/issues" }, - "login_info_url":"https://research-software-directory.github.io/documentation/getting-access.html", + "login_info_url": "https://research-software-directory.github.io/documentation/getting-access.html", "terms_of_service_url": "/page/terms-of-service/", "privacy_statement_url": "/page/privacy-statement/" }, diff --git a/documentation/docs/03-rsd-instance/02-configurations.md.license b/documentation/docs/03-rsd-instance/02-configurations.md.license index 8f990f9e0..b4a2c9483 100644 --- a/documentation/docs/03-rsd-instance/02-configurations.md.license +++ b/documentation/docs/03-rsd-instance/02-configurations.md.license @@ -1,6 +1,6 @@ +SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) SPDX-FileCopyrightText: 2023 - 2024 Ewan Cahen (Netherlands eScience Center) SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center -SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) SPDX-FileCopyrightText: 2024 Christian Meeßen (GFZ) SPDX-FileCopyrightText: 2024 Dusan Mijatovic (dv4all) (dv4all) SPDX-FileCopyrightText: 2024 Helmholtz Centre Potsdam - GFZ German Research Centre for Geosciences diff --git a/documentation/docs/03-rsd-instance/03-administration.md b/documentation/docs/03-rsd-instance/03-administration.md index 3e284cd6f..09fa9ffad 100644 --- a/documentation/docs/03-rsd-instance/03-administration.md +++ b/documentation/docs/03-rsd-instance/03-administration.md @@ -4,7 +4,7 @@ This section describes administration options available in the RSD. :::tip To be able to log in as RSD administrator you first need to define a list of rsd admin users in the .env file. -See [Login as rsd administrator in the getting started section](/rsd-instance/getting-started/#login-as-rsd-adminstrator). +See [Login as rsd administrator in the getting started section](/rsd-instance/getting-started/#log-in-as-rsd-administrator). ::: ## Public pages @@ -56,7 +56,7 @@ You can customise the software highlights section in the `settings.json` by chan This section shows the list of ORCIDs that are allowed to log in to the RSD. Because anyone can create an ORCID account, we decided to limit access only to ORCID users that are approved by an RSD administrator. :::warning -In order to be able to log in with ORCID credentials, the [ORCID authentication provider needs to be enabled](/rsd-instance/configurations/#enable-orcid-authentication) and the ORCID of that user need to be added to this list. +In order to be able to log in with ORCID credentials, the [ORCID authentication provider needs to be enabled](/rsd-instance/configurations/#enable-orcid-authentication-and-coupling) and the ORCID of that user need to be added to this list. ::: You can add, search and delete ORCIDs from the RSD. Use the bulk import button to add up to 50 ORCID users to the RSD at once. @@ -128,6 +128,37 @@ The settings are visible in the _Admin section_ under the _General settings_ tab ![Organisation Admin section](img/admin-organisation-admin-section.webp) +## Communities + +Administrators can create and edit all properties of the community. The communities enable grouping of software entries by specific functionality or research discipline. One software entry can be part of multiple communities. + +:::tip +Only RSD administrators can create communities. +::: + +![image](img/admin-communities.webp) + +### Add community + +To create new community use "Add" button. Provide name, short description and logo in the modal. + +### Edit community + +Use "edit" button to open all community settings. You will be forwarded to community settings page. + +### Delete community + +Use "delete" button to delete a community. If "delete" button is disabled you will need to remove "related" items first. + +:::tip + +To enable delete button: + +- remove the community from all software (accepted, pending and rejected) requests +- remove all keywords in community settings + +::: + ## Keywords RSD comes with a predefined list of keywords. You can change the list by adding new keywords or deleting the existing entries. diff --git a/documentation/docs/03-rsd-instance/img/admin-communities.webp b/documentation/docs/03-rsd-instance/img/admin-communities.webp new file mode 100644 index 0000000000000000000000000000000000000000..14de51bb52db22c6318a289e38010e1353620d1d GIT binary patch literal 92288 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 literal 0 HcmV?d00001 diff --git a/documentation/docs/03-rsd-instance/img/admin-communities.webp.license b/documentation/docs/03-rsd-instance/img/admin-communities.webp.license new file mode 100644 index 000000000..ebbf407d4 --- /dev/null +++ b/documentation/docs/03-rsd-instance/img/admin-communities.webp.license @@ -0,0 +1,4 @@ +SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +SPDX-FileCopyrightText: 2024 Netherlands eScience Center + +SPDX-License-Identifier: CC-BY-4.0 diff --git a/documentation/package-lock.json b/documentation/package-lock.json index 1f26b3925..d92f1affc 100644 --- a/documentation/package-lock.json +++ b/documentation/package-lock.json @@ -8,17 +8,17 @@ "name": "rsd-documentation", "version": "2.0.0", "dependencies": { - "@docusaurus/core": "3.0.0", - "@docusaurus/preset-classic": "3.0.0", - "@mdx-js/react": "^3.0.0", - "docusaurus-lunr-search": "^3.3.0", - "prism-react-renderer": "^2.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "@docusaurus/core": "3.3.2", + "@docusaurus/preset-classic": "3.3.2", + "@mdx-js/react": "3.0.0", + "docusaurus-lunr-search": "3.3.0", + "prism-react-renderer": "2.3.1", + "react": "18.2.0", + "react-dom": "18.2.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.0.0", - "@docusaurus/types": "3.0.0" + "@docusaurus/module-type-aliases": "3.3.2", + "@docusaurus/types": "3.3.2" }, "engines": { "node": ">=18.0" @@ -66,74 +66,74 @@ } }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.20.0.tgz", - "integrity": "sha512-uujahcBt4DxduBTvYdwO3sBfHuJvJokiC3BP1+O70fglmE1ShkH8lpXqZBac1rrU3FnNYSUs4pL9lBdTKeRPOQ==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.3.tgz", + "integrity": "sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==", "dependencies": { - "@algolia/cache-common": "4.20.0" + "@algolia/cache-common": "4.23.3" } }, "node_modules/@algolia/cache-common": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.20.0.tgz", - "integrity": "sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ==" + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.23.3.tgz", + "integrity": "sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==" }, "node_modules/@algolia/cache-in-memory": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.20.0.tgz", - "integrity": "sha512-Wm9ak/IaacAZXS4mB3+qF/KCoVSBV6aLgIGFEtQtJwjv64g4ePMapORGmCyulCFwfePaRAtcaTbMcJF+voc/bg==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.23.3.tgz", + "integrity": "sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==", "dependencies": { - "@algolia/cache-common": "4.20.0" + "@algolia/cache-common": "4.23.3" } }, "node_modules/@algolia/client-account": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.20.0.tgz", - "integrity": "sha512-GGToLQvrwo7am4zVkZTnKa72pheQeez/16sURDWm7Seyz+HUxKi3BM6fthVVPUEBhtJ0reyVtuK9ArmnaKl10Q==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.23.3.tgz", + "integrity": "sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==", "dependencies": { - "@algolia/client-common": "4.20.0", - "@algolia/client-search": "4.20.0", - "@algolia/transporter": "4.20.0" + "@algolia/client-common": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/transporter": "4.23.3" } }, "node_modules/@algolia/client-analytics": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.20.0.tgz", - "integrity": "sha512-EIr+PdFMOallRdBTHHdKI3CstslgLORQG7844Mq84ib5oVFRVASuuPmG4bXBgiDbcsMLUeOC6zRVJhv1KWI0ug==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.23.3.tgz", + "integrity": "sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==", "dependencies": { - "@algolia/client-common": "4.20.0", - "@algolia/client-search": "4.20.0", - "@algolia/requester-common": "4.20.0", - "@algolia/transporter": "4.20.0" + "@algolia/client-common": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" } }, "node_modules/@algolia/client-common": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.20.0.tgz", - "integrity": "sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.23.3.tgz", + "integrity": "sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==", "dependencies": { - "@algolia/requester-common": "4.20.0", - "@algolia/transporter": "4.20.0" + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" } }, "node_modules/@algolia/client-personalization": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.20.0.tgz", - "integrity": "sha512-N9+zx0tWOQsLc3K4PVRDV8GUeOLAY0i445En79Pr3zWB+m67V+n/8w4Kw1C5LlbHDDJcyhMMIlqezh6BEk7xAQ==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.23.3.tgz", + "integrity": "sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==", "dependencies": { - "@algolia/client-common": "4.20.0", - "@algolia/requester-common": "4.20.0", - "@algolia/transporter": "4.20.0" + "@algolia/client-common": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" } }, "node_modules/@algolia/client-search": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.20.0.tgz", - "integrity": "sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.3.tgz", + "integrity": "sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==", "dependencies": { - "@algolia/client-common": "4.20.0", - "@algolia/requester-common": "4.20.0", - "@algolia/transporter": "4.20.0" + "@algolia/client-common": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/transporter": "4.23.3" } }, "node_modules/@algolia/events": { @@ -142,47 +142,65 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "node_modules/@algolia/logger-common": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.20.0.tgz", - "integrity": "sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ==" + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.23.3.tgz", + "integrity": "sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==" }, "node_modules/@algolia/logger-console": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.20.0.tgz", - "integrity": "sha512-THlIGG1g/FS63z0StQqDhT6bprUczBI8wnLT3JWvfAQDZX5P6fCg7dG+pIrUBpDIHGszgkqYEqECaKKsdNKOUA==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.23.3.tgz", + "integrity": "sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==", + "dependencies": { + "@algolia/logger-common": "4.23.3" + } + }, + "node_modules/@algolia/recommend": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.23.3.tgz", + "integrity": "sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==", "dependencies": { - "@algolia/logger-common": "4.20.0" + "@algolia/cache-browser-local-storage": "4.23.3", + "@algolia/cache-common": "4.23.3", + "@algolia/cache-in-memory": "4.23.3", + "@algolia/client-common": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/logger-common": "4.23.3", + "@algolia/logger-console": "4.23.3", + "@algolia/requester-browser-xhr": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/requester-node-http": "4.23.3", + "@algolia/transporter": "4.23.3" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.20.0.tgz", - "integrity": "sha512-HbzoSjcjuUmYOkcHECkVTwAelmvTlgs48N6Owt4FnTOQdwn0b8pdht9eMgishvk8+F8bal354nhx/xOoTfwiAw==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.3.tgz", + "integrity": "sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==", "dependencies": { - "@algolia/requester-common": "4.20.0" + "@algolia/requester-common": "4.23.3" } }, "node_modules/@algolia/requester-common": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.20.0.tgz", - "integrity": "sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng==" + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.23.3.tgz", + "integrity": "sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==" }, "node_modules/@algolia/requester-node-http": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.20.0.tgz", - "integrity": "sha512-ocJ66L60ABSSTRFnCHIEZpNHv6qTxsBwJEPfYaSBsLQodm0F9ptvalFkHMpvj5DfE22oZrcrLbOYM2bdPJRHng==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.23.3.tgz", + "integrity": "sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==", "dependencies": { - "@algolia/requester-common": "4.20.0" + "@algolia/requester-common": "4.23.3" } }, "node_modules/@algolia/transporter": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.20.0.tgz", - "integrity": "sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.23.3.tgz", + "integrity": "sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==", "dependencies": { - "@algolia/cache-common": "4.20.0", - "@algolia/logger-common": "4.20.0", - "@algolia/requester-common": "4.20.0" + "@algolia/cache-common": "4.23.3", + "@algolia/logger-common": "4.23.3", + "@algolia/requester-common": "4.23.3" } }, "node_modules/@ampproject/remapping": { @@ -198,104 +216,40 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", + "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.6", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", + "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", + "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helpers": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/traverse": "^7.24.6", + "@babel/types": "^7.24.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -319,13 +273,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", + "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -355,13 +309,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", + "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -447,31 +401,31 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", + "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", + "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", + "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -489,26 +443,26 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", + "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", + "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -529,9 +483,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz", + "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==", "engines": { "node": ">=6.9.0" } @@ -569,11 +523,11 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", + "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -591,36 +545,36 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", + "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", + "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", + "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", + "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", "engines": { "node": ">=6.9.0" } @@ -639,26 +593,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz", + "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", + "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.6", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -729,9 +683,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", + "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1591,11 +1545,11 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz", - "integrity": "sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.6.tgz", + "integrity": "sha512-vQfyXRtG/kNIcTYRd/49uJnwvMig9X3R4XsTVXRml2RFupZFY+2RDuK+/ymb+MfX2WuIHAgUZc2xEvQrnI7QCg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -2048,32 +2002,32 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", + "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", + "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", + "dependencies": { + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -2081,12 +2035,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", + "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2111,18 +2065,18 @@ } }, "node_modules/@docsearch/css": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", - "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==" + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", + "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==" }, "node_modules/@docsearch/react": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", - "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", + "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", "dependencies": { "@algolia/autocomplete-core": "1.9.3", "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.5.2", + "@docsearch/css": "3.6.0", "algoliasearch": "^4.19.1" }, "peerDependencies": { @@ -2147,12 +2101,12 @@ } }, "node_modules/@docusaurus/core": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.0.0.tgz", - "integrity": "sha512-bHWtY55tJTkd6pZhHrWz1MpWuwN4edZe0/UWgFF7PW/oJeDZvLSXKqwny3L91X1/LGGoypBGkeZn8EOuKeL4yQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.3.2.tgz", + "integrity": "sha512-PzKMydKI3IU1LmeZQDi+ut5RSuilbXnA8QdowGeJEgU8EJjmx3rBHNT1LxQxOVqNEwpWi/csLwd9bn7rUjggPA==", "dependencies": { - "@babel/core": "^7.22.9", - "@babel/generator": "^7.22.9", + "@babel/core": "^7.23.3", + "@babel/generator": "^7.23.3", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-transform-runtime": "^7.22.9", "@babel/preset-env": "^7.22.9", @@ -2161,15 +2115,12 @@ "@babel/runtime": "^7.22.6", "@babel/runtime-corejs3": "^7.22.6", "@babel/traverse": "^7.22.8", - "@docusaurus/cssnano-preset": "3.0.0", - "@docusaurus/logger": "3.0.0", - "@docusaurus/mdx-loader": "3.0.0", - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "3.0.0", - "@docusaurus/utils-common": "3.0.0", - "@docusaurus/utils-validation": "3.0.0", - "@slorber/static-site-generator-webpack-plugin": "^4.0.7", - "@svgr/webpack": "^6.5.1", + "@docusaurus/cssnano-preset": "3.3.2", + "@docusaurus/logger": "3.3.2", + "@docusaurus/mdx-loader": "3.3.2", + "@docusaurus/utils": "3.3.2", + "@docusaurus/utils-common": "3.3.2", + "@docusaurus/utils-validation": "3.3.2", "autoprefixer": "^10.4.14", "babel-loader": "^9.1.3", "babel-plugin-dynamic-import-node": "^2.3.3", @@ -2183,12 +2134,13 @@ "copy-webpack-plugin": "^11.0.0", "core-js": "^3.31.1", "css-loader": "^6.8.1", - "css-minimizer-webpack-plugin": "^4.2.2", - "cssnano": "^5.1.15", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", "del": "^6.1.1", "detect-port": "^1.5.1", "escape-html": "^1.0.3", "eta": "^2.2.0", + "eval": "^0.1.8", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "html-minifier-terser": "^7.2.0", @@ -2197,12 +2149,13 @@ "leven": "^3.1.0", "lodash": "^4.17.21", "mini-css-extract-plugin": "^2.7.6", + "p-map": "^4.0.0", "postcss": "^8.4.26", "postcss-loader": "^7.3.3", "prompts": "^2.4.2", "react-dev-utils": "^12.0.1", "react-helmet-async": "^1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", "react-loadable-ssr-addon-v5-slorber": "^1.0.1", "react-router": "^5.3.4", "react-router-config": "^5.1.1", @@ -2215,7 +2168,6 @@ "tslib": "^2.6.0", "update-notifier": "^6.0.2", "url-loader": "^4.1.1", - "wait-on": "^7.0.1", "webpack": "^5.88.1", "webpack-bundle-analyzer": "^4.9.0", "webpack-dev-server": "^4.15.1", @@ -2234,13 +2186,13 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.0.0.tgz", - "integrity": "sha512-FHiRfwmVvIVdIGsHcijUOaX7hMn0mugVYB7m4GkpYI6Mi56zwQV4lH5p7DxcW5CUYNWMVxz2loWSCiWEm5ikwA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.3.2.tgz", + "integrity": "sha512-+5+epLk/Rp4vFML4zmyTATNc3Is+buMAL6dNjrMWahdJCJlMWMPd/8YfU+2PA57t8mlSbhLJ7vAZVy54cd1vRQ==", "dependencies": { - "cssnano-preset-advanced": "^5.3.10", - "postcss": "^8.4.26", - "postcss-sort-media-queries": "^4.4.1", + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.4.38", + "postcss-sort-media-queries": "^5.2.0", "tslib": "^2.6.0" }, "engines": { @@ -2248,9 +2200,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.0.0.tgz", - "integrity": "sha512-6eX0eOfioMQCk+qgCnHvbLLuyIAA+r2lSID6d6JusiLtDKmYMfNp3F4yyE8bnb0Abmzt2w68XwptEFYyALSAXw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.3.2.tgz", + "integrity": "sha512-Ldu38GJ4P8g4guN7d7pyCOJ7qQugG7RVyaxrK8OnxuTlaImvQw33aDRwaX2eNmX8YK6v+//Z502F4sOZbHHCHQ==", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" @@ -2260,15 +2212,13 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.0.0.tgz", - "integrity": "sha512-JkGge6WYDrwjNgMxwkb6kNQHnpISt5L1tMaBWFDBKeDToFr5Kj29IL35MIQm0RfrnoOfr/29RjSH4aRtvlAR0A==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.3.2.tgz", + "integrity": "sha512-AFRxj/aOk3/mfYDPxE3wTbrjeayVRvNSZP7mgMuUlrb2UlPRbSVAFX1k2RbgAJrnTSwMgb92m2BhJgYRfptN3g==", "dependencies": { - "@babel/parser": "^7.22.7", - "@babel/traverse": "^7.22.8", - "@docusaurus/logger": "3.0.0", - "@docusaurus/utils": "3.0.0", - "@docusaurus/utils-validation": "3.0.0", + "@docusaurus/logger": "3.3.2", + "@docusaurus/utils": "3.3.2", + "@docusaurus/utils-validation": "3.3.2", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -2300,9 +2250,9 @@ } }, "node_modules/@docusaurus/mdx-loader/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/@docusaurus/mdx-loader/node_modules/unist-util-visit": { "version": "5.0.0", @@ -2319,18 +2269,17 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.0.0.tgz", - "integrity": "sha512-CfC6CgN4u/ce+2+L1JdsHNyBd8yYjl4De2B2CBj2a9F7WuJ5RjV1ciuU7KDg8uyju+NRVllRgvJvxVUjCdkPiw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.3.2.tgz", + "integrity": "sha512-b/XB0TBJah5yKb4LYuJT4buFvL0MGAb0+vJDrJtlYMguRtsEBkf2nWl5xP7h4Dlw6ol0hsHrCYzJ50kNIOEclw==", "dependencies": { - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "3.0.0", + "@docusaurus/types": "3.3.2", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", "@types/react-router-dom": "*", "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" }, "peerDependencies": { "react": "*", @@ -2338,17 +2287,17 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.0.0.tgz", - "integrity": "sha512-iA8Wc3tIzVnROJxrbIsU/iSfixHW16YeW9RWsBw7hgEk4dyGsip9AsvEDXobnRq3lVv4mfdgoS545iGWf1Ip9w==", - "dependencies": { - "@docusaurus/core": "3.0.0", - "@docusaurus/logger": "3.0.0", - "@docusaurus/mdx-loader": "3.0.0", - "@docusaurus/types": "3.0.0", - "@docusaurus/utils": "3.0.0", - "@docusaurus/utils-common": "3.0.0", - "@docusaurus/utils-validation": "3.0.0", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.3.2.tgz", + "integrity": "sha512-fJU+dmqp231LnwDJv+BHVWft8pcUS2xVPZdeYH6/ibH1s2wQ/sLcmUrGWyIv/Gq9Ptj8XWjRPMghlxghuPPoxg==", + "dependencies": { + "@docusaurus/core": "3.3.2", + "@docusaurus/logger": "3.3.2", + "@docusaurus/mdx-loader": "3.3.2", + "@docusaurus/types": "3.3.2", + "@docusaurus/utils": "3.3.2", + "@docusaurus/utils-common": "3.3.2", + "@docusaurus/utils-validation": "3.3.2", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", @@ -2369,9 +2318,9 @@ } }, "node_modules/@docusaurus/plugin-content-blog/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/@docusaurus/plugin-content-blog/node_modules/unist-util-visit": { "version": "5.0.0", @@ -2388,17 +2337,18 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.0.0.tgz", - "integrity": "sha512-MFZsOSwmeJ6rvoZMLieXxPuJsA9M9vn7/mUZmfUzSUTeHAeq+fEqvLltFOxcj4DVVDTYlQhgWYd+PISIWgamKw==", - "dependencies": { - "@docusaurus/core": "3.0.0", - "@docusaurus/logger": "3.0.0", - "@docusaurus/mdx-loader": "3.0.0", - "@docusaurus/module-type-aliases": "3.0.0", - "@docusaurus/types": "3.0.0", - "@docusaurus/utils": "3.0.0", - "@docusaurus/utils-validation": "3.0.0", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.3.2.tgz", + "integrity": "sha512-Dm1ri2VlGATTN3VGk1ZRqdRXWa1UlFubjaEL6JaxaK7IIFqN/Esjpl+Xw10R33loHcRww/H76VdEeYayaL76eg==", + "dependencies": { + "@docusaurus/core": "3.3.2", + "@docusaurus/logger": "3.3.2", + "@docusaurus/mdx-loader": "3.3.2", + "@docusaurus/module-type-aliases": "3.3.2", + "@docusaurus/types": "3.3.2", + "@docusaurus/utils": "3.3.2", + "@docusaurus/utils-common": "3.3.2", + "@docusaurus/utils-validation": "3.3.2", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -2417,15 +2367,15 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.0.0.tgz", - "integrity": "sha512-EXYHXK2Ea1B5BUmM0DgSwaOYt8EMSzWtYUToNo62Q/EoWxYOQFdWglYnw3n7ZEGyw5Kog4LHaRwlazAdmDomvQ==", - "dependencies": { - "@docusaurus/core": "3.0.0", - "@docusaurus/mdx-loader": "3.0.0", - "@docusaurus/types": "3.0.0", - "@docusaurus/utils": "3.0.0", - "@docusaurus/utils-validation": "3.0.0", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.3.2.tgz", + "integrity": "sha512-EKc9fQn5H2+OcGER8x1aR+7URtAGWySUgULfqE/M14+rIisdrBstuEZ4lUPDRrSIexOVClML82h2fDS+GSb8Ew==", + "dependencies": { + "@docusaurus/core": "3.3.2", + "@docusaurus/mdx-loader": "3.3.2", + "@docusaurus/types": "3.3.2", + "@docusaurus/utils": "3.3.2", + "@docusaurus/utils-validation": "3.3.2", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" @@ -2439,15 +2389,15 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.0.0.tgz", - "integrity": "sha512-gSV07HfQgnUboVEb3lucuVyv5pEoy33E7QXzzn++3kSc/NLEimkjXh3sSnTGOishkxCqlFV9BHfY/VMm5Lko5g==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.3.2.tgz", + "integrity": "sha512-oBIBmwtaB+YS0XlmZ3gCO+cMbsGvIYuAKkAopoCh0arVjtlyPbejzPrHuCoRHB9G7abjNZw7zoONOR8+8LM5+Q==", "dependencies": { - "@docusaurus/core": "3.0.0", - "@docusaurus/types": "3.0.0", - "@docusaurus/utils": "3.0.0", - "@microlink/react-json-view": "^1.22.2", + "@docusaurus/core": "3.3.2", + "@docusaurus/types": "3.3.2", + "@docusaurus/utils": "3.3.2", "fs-extra": "^11.1.1", + "react-json-view-lite": "^1.2.0", "tslib": "^2.6.0" }, "engines": { @@ -2459,13 +2409,13 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.0.0.tgz", - "integrity": "sha512-0zcLK8w+ohmSm1fjUQCqeRsjmQc0gflvXnaVA/QVVCtm2yCiBtkrSGQXqt4MdpD7Xq8mwo3qVd5nhIcvrcebqw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.3.2.tgz", + "integrity": "sha512-jXhrEIhYPSClMBK6/IA8qf1/FBoxqGXZvg7EuBax9HaK9+kL3L0TJIlatd8jQJOMtds8mKw806TOCc3rtEad1A==", "dependencies": { - "@docusaurus/core": "3.0.0", - "@docusaurus/types": "3.0.0", - "@docusaurus/utils-validation": "3.0.0", + "@docusaurus/core": "3.3.2", + "@docusaurus/types": "3.3.2", + "@docusaurus/utils-validation": "3.3.2", "tslib": "^2.6.0" }, "engines": { @@ -2477,13 +2427,13 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.0.0.tgz", - "integrity": "sha512-asEKavw8fczUqvXu/s9kG2m1epLnHJ19W6CCCRZEmpnkZUZKiM8rlkDiEmxApwIc2JDDbIMk+Y2TMkJI8mInbQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.3.2.tgz", + "integrity": "sha512-vcrKOHGbIDjVnNMrfbNpRQR1x6Jvcrb48kVzpBAOsKbj9rXZm/idjVAXRaewwobHdOrJkfWS/UJoxzK8wyLRBQ==", "dependencies": { - "@docusaurus/core": "3.0.0", - "@docusaurus/types": "3.0.0", - "@docusaurus/utils-validation": "3.0.0", + "@docusaurus/core": "3.3.2", + "@docusaurus/types": "3.3.2", + "@docusaurus/utils-validation": "3.3.2", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" }, @@ -2496,13 +2446,13 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.0.0.tgz", - "integrity": "sha512-lytgu2eyn+7p4WklJkpMGRhwC29ezj4IjPPmVJ8vGzcSl6JkR1sADTHLG5xWOMuci420xZl9dGEiLTQ8FjCRyA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.3.2.tgz", + "integrity": "sha512-ldkR58Fdeks0vC+HQ+L+bGFSJsotQsipXD+iKXQFvkOfmPIV6QbHRd7IIcm5b6UtwOiK33PylNS++gjyLUmaGw==", "dependencies": { - "@docusaurus/core": "3.0.0", - "@docusaurus/types": "3.0.0", - "@docusaurus/utils-validation": "3.0.0", + "@docusaurus/core": "3.3.2", + "@docusaurus/types": "3.3.2", + "@docusaurus/utils-validation": "3.3.2", "tslib": "^2.6.0" }, "engines": { @@ -2514,16 +2464,16 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.0.0.tgz", - "integrity": "sha512-cfcONdWku56Oi7Hdus2uvUw/RKRRlIGMViiHLjvQ21CEsEqnQ297MRoIgjU28kL7/CXD/+OiANSq3T1ezAiMhA==", - "dependencies": { - "@docusaurus/core": "3.0.0", - "@docusaurus/logger": "3.0.0", - "@docusaurus/types": "3.0.0", - "@docusaurus/utils": "3.0.0", - "@docusaurus/utils-common": "3.0.0", - "@docusaurus/utils-validation": "3.0.0", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.3.2.tgz", + "integrity": "sha512-/ZI1+bwZBhAgC30inBsHe3qY9LOZS+79fRGkNdTcGHRMcdAp6Vw2pCd1gzlxd/xU+HXsNP6cLmTOrggmRp3Ujg==", + "dependencies": { + "@docusaurus/core": "3.3.2", + "@docusaurus/logger": "3.3.2", + "@docusaurus/types": "3.3.2", + "@docusaurus/utils": "3.3.2", + "@docusaurus/utils-common": "3.3.2", + "@docusaurus/utils-validation": "3.3.2", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" @@ -2537,23 +2487,23 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.0.0.tgz", - "integrity": "sha512-90aOKZGZdi0+GVQV+wt8xx4M4GiDrBRke8NO8nWwytMEXNrxrBxsQYFRD1YlISLJSCiHikKf3Z/MovMnQpnZyg==", - "dependencies": { - "@docusaurus/core": "3.0.0", - "@docusaurus/plugin-content-blog": "3.0.0", - "@docusaurus/plugin-content-docs": "3.0.0", - "@docusaurus/plugin-content-pages": "3.0.0", - "@docusaurus/plugin-debug": "3.0.0", - "@docusaurus/plugin-google-analytics": "3.0.0", - "@docusaurus/plugin-google-gtag": "3.0.0", - "@docusaurus/plugin-google-tag-manager": "3.0.0", - "@docusaurus/plugin-sitemap": "3.0.0", - "@docusaurus/theme-classic": "3.0.0", - "@docusaurus/theme-common": "3.0.0", - "@docusaurus/theme-search-algolia": "3.0.0", - "@docusaurus/types": "3.0.0" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.3.2.tgz", + "integrity": "sha512-1SDS7YIUN1Pg3BmD6TOTjhB7RSBHJRpgIRKx9TpxqyDrJ92sqtZhomDc6UYoMMLQNF2wHFZZVGFjxJhw2VpL+Q==", + "dependencies": { + "@docusaurus/core": "3.3.2", + "@docusaurus/plugin-content-blog": "3.3.2", + "@docusaurus/plugin-content-docs": "3.3.2", + "@docusaurus/plugin-content-pages": "3.3.2", + "@docusaurus/plugin-debug": "3.3.2", + "@docusaurus/plugin-google-analytics": "3.3.2", + "@docusaurus/plugin-google-gtag": "3.3.2", + "@docusaurus/plugin-google-tag-manager": "3.3.2", + "@docusaurus/plugin-sitemap": "3.3.2", + "@docusaurus/theme-classic": "3.3.2", + "@docusaurus/theme-common": "3.3.2", + "@docusaurus/theme-search-algolia": "3.3.2", + "@docusaurus/types": "3.3.2" }, "engines": { "node": ">=18.0" @@ -2563,43 +2513,31 @@ "react-dom": "^18.0.0" } }, - "node_modules/@docusaurus/react-loadable": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", - "dependencies": { - "@types/react": "*", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": "*" - } - }, "node_modules/@docusaurus/theme-classic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.0.0.tgz", - "integrity": "sha512-wWOHSrKMn7L4jTtXBsb5iEJ3xvTddBye5PjYBnWiCkTAlhle2yMdc4/qRXW35Ot+OV/VXu6YFG8XVUJEl99z0A==", - "dependencies": { - "@docusaurus/core": "3.0.0", - "@docusaurus/mdx-loader": "3.0.0", - "@docusaurus/module-type-aliases": "3.0.0", - "@docusaurus/plugin-content-blog": "3.0.0", - "@docusaurus/plugin-content-docs": "3.0.0", - "@docusaurus/plugin-content-pages": "3.0.0", - "@docusaurus/theme-common": "3.0.0", - "@docusaurus/theme-translations": "3.0.0", - "@docusaurus/types": "3.0.0", - "@docusaurus/utils": "3.0.0", - "@docusaurus/utils-common": "3.0.0", - "@docusaurus/utils-validation": "3.0.0", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.3.2.tgz", + "integrity": "sha512-gepHFcsluIkPb4Im9ukkiO4lXrai671wzS3cKQkY9BXQgdVwsdPf/KS0Vs4Xlb0F10fTz+T3gNjkxNEgSN9M0A==", + "dependencies": { + "@docusaurus/core": "3.3.2", + "@docusaurus/mdx-loader": "3.3.2", + "@docusaurus/module-type-aliases": "3.3.2", + "@docusaurus/plugin-content-blog": "3.3.2", + "@docusaurus/plugin-content-docs": "3.3.2", + "@docusaurus/plugin-content-pages": "3.3.2", + "@docusaurus/theme-common": "3.3.2", + "@docusaurus/theme-translations": "3.3.2", + "@docusaurus/types": "3.3.2", + "@docusaurus/utils": "3.3.2", + "@docusaurus/utils-common": "3.3.2", + "@docusaurus/utils-validation": "3.3.2", "@mdx-js/react": "^3.0.0", - "clsx": "^1.2.1", + "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.0", "infima": "0.2.0-alpha.43", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.26", - "prism-react-renderer": "^2.1.0", + "prism-react-renderer": "^2.3.0", "prismjs": "^1.29.0", "react-router-dom": "^5.3.4", "rtlcss": "^4.1.0", @@ -2614,24 +2552,32 @@ "react-dom": "^18.0.0" } }, + "node_modules/@docusaurus/theme-classic/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, "node_modules/@docusaurus/theme-common": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.0.0.tgz", - "integrity": "sha512-PahRpCLRK5owCMEqcNtUeTMOkTUCzrJlKA+HLu7f+8osYOni617YurXvHASCsSTxurjXaLz/RqZMnASnqATxIA==", - "dependencies": { - "@docusaurus/mdx-loader": "3.0.0", - "@docusaurus/module-type-aliases": "3.0.0", - "@docusaurus/plugin-content-blog": "3.0.0", - "@docusaurus/plugin-content-docs": "3.0.0", - "@docusaurus/plugin-content-pages": "3.0.0", - "@docusaurus/utils": "3.0.0", - "@docusaurus/utils-common": "3.0.0", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.3.2.tgz", + "integrity": "sha512-kXqSaL/sQqo4uAMQ4fHnvRZrH45Xz2OdJ3ABXDS7YVGPSDTBC8cLebFrRR4YF9EowUHto1UC/EIklJZQMG/usA==", + "dependencies": { + "@docusaurus/mdx-loader": "3.3.2", + "@docusaurus/module-type-aliases": "3.3.2", + "@docusaurus/plugin-content-blog": "3.3.2", + "@docusaurus/plugin-content-docs": "3.3.2", + "@docusaurus/plugin-content-pages": "3.3.2", + "@docusaurus/utils": "3.3.2", + "@docusaurus/utils-common": "3.3.2", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", - "clsx": "^1.2.1", + "clsx": "^2.0.0", "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^2.1.0", + "prism-react-renderer": "^2.3.0", "tslib": "^2.6.0", "utility-types": "^3.10.0" }, @@ -2643,22 +2589,30 @@ "react-dom": "^18.0.0" } }, + "node_modules/@docusaurus/theme-common/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.0.0.tgz", - "integrity": "sha512-PyMUNIS9yu0dx7XffB13ti4TG47pJq3G2KE/INvOFb6M0kWh+wwCnucPg4WAOysHOPh+SD9fjlXILoLQstgEIA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.3.2.tgz", + "integrity": "sha512-qLkfCl29VNBnF1MWiL9IyOQaHxUvicZp69hISyq/xMsNvFKHFOaOfk9xezYod2Q9xx3xxUh9t/QPigIei2tX4w==", "dependencies": { "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.0.0", - "@docusaurus/logger": "3.0.0", - "@docusaurus/plugin-content-docs": "3.0.0", - "@docusaurus/theme-common": "3.0.0", - "@docusaurus/theme-translations": "3.0.0", - "@docusaurus/utils": "3.0.0", - "@docusaurus/utils-validation": "3.0.0", + "@docusaurus/core": "3.3.2", + "@docusaurus/logger": "3.3.2", + "@docusaurus/plugin-content-docs": "3.3.2", + "@docusaurus/theme-common": "3.3.2", + "@docusaurus/theme-translations": "3.3.2", + "@docusaurus/utils": "3.3.2", + "@docusaurus/utils-validation": "3.3.2", "algoliasearch": "^4.18.0", "algoliasearch-helper": "^3.13.3", - "clsx": "^1.2.1", + "clsx": "^2.0.0", "eta": "^2.2.0", "fs-extra": "^11.1.1", "lodash": "^4.17.21", @@ -2673,10 +2627,18 @@ "react-dom": "^18.0.0" } }, + "node_modules/@docusaurus/theme-search-algolia/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, "node_modules/@docusaurus/theme-translations": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.0.0.tgz", - "integrity": "sha512-p/H3+5LdnDtbMU+csYukA6601U1ld2v9knqxGEEV96qV27HsHfP63J9Ta2RBZUrNhQAgrwFzIc9GdDO8P1Baag==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.3.2.tgz", + "integrity": "sha512-bPuiUG7Z8sNpGuTdGnmKl/oIPeTwKr0AXLGu9KaP6+UFfRZiyWbWE87ti97RrevB2ffojEdvchNujparR3jEZQ==", "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -2686,10 +2648,11 @@ } }, "node_modules/@docusaurus/types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.0.0.tgz", - "integrity": "sha512-Qb+l/hmCOVemReuzvvcFdk84bUmUFyD0Zi81y651ie3VwMrXqC7C0E7yZLKMOsLj/vkqsxHbtkAuYMI89YzNzg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.3.2.tgz", + "integrity": "sha512-5p201S7AZhliRxTU7uMKtSsoC8mgPA9bs9b5NQg1IRdRxJfflursXNVsgc3PcMqiUTul/v1s3k3rXXFlRE890w==", "dependencies": { + "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", "commander": "^5.1.0", @@ -2705,12 +2668,13 @@ } }, "node_modules/@docusaurus/utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.0.0.tgz", - "integrity": "sha512-JwGjh5mtjG9XIAESyPxObL6CZ6LO/yU4OSTpq7Q0x+jN25zi/AMbvLjpSyZzWy+qm5uQiFiIhqFaOxvy+82Ekg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.3.2.tgz", + "integrity": "sha512-f4YMnBVymtkSxONv4Y8js3Gez9IgHX+Lcg6YRMOjVbq8sgCcdYK1lf6SObAuz5qB/mxiSK7tW0M9aaiIaUSUJg==", "dependencies": { - "@docusaurus/logger": "3.0.0", - "@svgr/webpack": "^6.5.1", + "@docusaurus/logger": "3.3.2", + "@docusaurus/utils-common": "3.3.2", + "@svgr/webpack": "^8.1.0", "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", @@ -2721,6 +2685,7 @@ "js-yaml": "^4.1.0", "lodash": "^4.17.21", "micromatch": "^4.0.5", + "prompts": "^2.4.2", "resolve-pathname": "^3.0.0", "shelljs": "^0.8.5", "tslib": "^2.6.0", @@ -2740,9 +2705,9 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.0.0.tgz", - "integrity": "sha512-7iJWAtt4AHf4PFEPlEPXko9LZD/dbYnhLe0q8e3GRK1EXZyRASah2lznpMwB3lLmVjq/FR6ZAKF+E0wlmL5j0g==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.3.2.tgz", + "integrity": "sha512-QWFTLEkPYsejJsLStgtmetMFIA3pM8EPexcZ4WZ7b++gO5jGVH7zsipREnCHzk6+eDgeaXfkR6UPaTt86bp8Og==", "dependencies": { "tslib": "^2.6.0" }, @@ -2759,12 +2724,13 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.0.0.tgz", - "integrity": "sha512-MlIGUspB/HBW5CYgHvRhmkZbeMiUWKbyVoCQYvbGN8S19SSzVgzyy97KRpcjCOYYeEdkhmRCUwFBJBlLg3IoNQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.3.2.tgz", + "integrity": "sha512-itDgFs5+cbW9REuC7NdXals4V6++KifgVMzoGOOOSIifBQw+8ULhy86u5e1lnptVL0sv8oAjq2alO7I40GR7pA==", "dependencies": { - "@docusaurus/logger": "3.0.0", - "@docusaurus/utils": "3.0.0", + "@docusaurus/logger": "3.3.2", + "@docusaurus/utils": "3.3.2", + "@docusaurus/utils-common": "3.3.2", "joi": "^17.9.2", "js-yaml": "^4.1.0", "tslib": "^2.6.0" @@ -2814,13 +2780,13 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -2835,9 +2801,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } @@ -2857,9 +2823,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -2871,9 +2837,9 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, "node_modules/@mdx-js/mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.0.tgz", - "integrity": "sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", + "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", @@ -2905,17 +2871,17 @@ } }, "node_modules/@mdx-js/mdx/node_modules/@types/hast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.2.tgz", - "integrity": "sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } }, "node_modules/@mdx-js/mdx/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/@mdx-js/mdx/node_modules/source-map": { "version": "0.7.4", @@ -2955,21 +2921,6 @@ "react": ">=16" } }, - "node_modules/@microlink/react-json-view": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/@microlink/react-json-view/-/react-json-view-1.23.0.tgz", - "integrity": "sha512-HYJ1nsfO4/qn8afnAMhuk7+5a1vcjEaS8Gm5Vpr1SqdHDY0yLBJGpA+9DvKyxyVKaUkXzKXt3Mif9RcmFSdtYg==", - "dependencies": { - "flux": "~4.0.1", - "react-base16-styling": "~0.6.0", - "react-lifecycles-compat": "~3.0.4", - "react-textarea-autosize": "~8.3.2" - }, - "peerDependencies": { - "react": ">= 15", - "react-dom": ">= 15" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3045,9 +2996,9 @@ "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==" }, "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -3088,25 +3039,12 @@ "micromark-util-symbol": "^1.0.1" } }, - "node_modules/@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", - "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", - "dependencies": { - "eval": "^0.1.8", - "p-map": "^4.0.0", - "webpack-sources": "^3.2.2" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", - "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3147,11 +3085,11 @@ } }, "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", - "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3162,11 +3100,11 @@ } }, "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", - "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3177,11 +3115,11 @@ } }, "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", - "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3192,11 +3130,11 @@ } }, "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", - "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3207,9 +3145,9 @@ } }, "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", - "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", "engines": { "node": ">=12" }, @@ -3222,21 +3160,21 @@ } }, "node_modules/@svgr/babel-preset": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", - "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3247,18 +3185,18 @@ } }, "node_modules/@svgr/core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", - "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3266,15 +3204,15 @@ } }, "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", - "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "dependencies": { - "@babel/types": "^7.20.0", + "@babel/types": "^7.21.3", "entities": "^4.4.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3282,37 +3220,37 @@ } }, "node_modules/@svgr/plugin-jsx": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", - "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", "svg-parser": "^2.0.4" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { - "@svgr/core": "^6.0.0" + "@svgr/core": "*" } }, "node_modules/@svgr/plugin-svgo": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", - "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", "dependencies": { - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "svgo": "^2.8.0" + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3323,21 +3261,21 @@ } }, "node_modules/@svgr/webpack": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", - "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", "dependencies": { - "@babel/core": "^7.19.6", - "@babel/plugin-transform-react-constant-elements": "^7.18.12", - "@babel/preset-env": "^7.19.4", + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@svgr/core": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "@svgr/plugin-svgo": "^6.5.1" + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3406,9 +3344,9 @@ } }, "node_modules/@types/debug": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.10.tgz", - "integrity": "sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dependencies": { "@types/ms": "*" } @@ -3437,9 +3375,9 @@ "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==" }, "node_modules/@types/estree-jsx": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.2.tgz", - "integrity": "sha512-GNBWlGBMjiiiL5TSkvPtOteuXsiVitw5MYGY1UYlrAq0SKyczsls6sCD7TZ8fsjRsvCVxml7EbyjJezPb3DrSA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", "dependencies": { "@types/estree": "*" } @@ -3508,22 +3446,22 @@ } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", - "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dependencies": { "@types/istanbul-lib-report": "*" } @@ -3534,9 +3472,9 @@ "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==" }, "node_modules/@types/mdast": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.2.tgz", - "integrity": "sha512-tYR83EignvhYO9iU3kDg8V28M0jqyh9zzp5GV+EO+AYnyUl3P5ltkTeJuTiFZQFz670FSb3EwT/6LQdX+UdKfw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dependencies": { "@types/unist": "*" } @@ -3552,9 +3490,9 @@ "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==" }, "node_modules/@types/ms": { - "version": "0.7.33", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.33.tgz", - "integrity": "sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==" + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { "version": "20.8.7", @@ -3634,9 +3572,9 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, "node_modules/@types/sax": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.6.tgz", - "integrity": "sha512-A1mpYCYu1aHFayy8XKN57ebXeAbh9oQIZ1wXcno6b1ESUAfMBDMx7mf/QGlYwcMRaFryh9YBuH03i/3FlPGDkQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", "dependencies": { "@types/node": "*" } @@ -3695,17 +3633,17 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.29", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", - "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", - "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==" + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", @@ -3987,30 +3925,31 @@ } }, "node_modules/algoliasearch": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.20.0.tgz", - "integrity": "sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.20.0", - "@algolia/cache-common": "4.20.0", - "@algolia/cache-in-memory": "4.20.0", - "@algolia/client-account": "4.20.0", - "@algolia/client-analytics": "4.20.0", - "@algolia/client-common": "4.20.0", - "@algolia/client-personalization": "4.20.0", - "@algolia/client-search": "4.20.0", - "@algolia/logger-common": "4.20.0", - "@algolia/logger-console": "4.20.0", - "@algolia/requester-browser-xhr": "4.20.0", - "@algolia/requester-common": "4.20.0", - "@algolia/requester-node-http": "4.20.0", - "@algolia/transporter": "4.20.0" + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.3.tgz", + "integrity": "sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.23.3", + "@algolia/cache-common": "4.23.3", + "@algolia/cache-in-memory": "4.23.3", + "@algolia/client-account": "4.23.3", + "@algolia/client-analytics": "4.23.3", + "@algolia/client-common": "4.23.3", + "@algolia/client-personalization": "4.23.3", + "@algolia/client-search": "4.23.3", + "@algolia/logger-common": "4.23.3", + "@algolia/logger-console": "4.23.3", + "@algolia/recommend": "4.23.3", + "@algolia/requester-browser-xhr": "4.23.3", + "@algolia/requester-common": "4.23.3", + "@algolia/requester-node-http": "4.23.3", + "@algolia/transporter": "4.23.3" } }, "node_modules/algoliasearch-helper": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.15.0.tgz", - "integrity": "sha512-DGUnK3TGtDQsaUE4ayF/LjSN0DGsuYThB8WBgnnDY0Wq04K6lNVruO3LfqJOgSfDiezp+Iyt8Tj4YKHi+/ivSA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.21.0.tgz", + "integrity": "sha512-hjVOrL15I3Y3K8xG0icwG1/tWE+MocqBrhW6uVBWpU+/kVEMK0BnM2xdssj6mZM61eJ4iRxHR0djEI3ENOpR8w==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -4117,11 +4056,6 @@ "node": ">=8" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, "node_modules/astring": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", @@ -4130,11 +4064,6 @@ "astring": "bin/astring" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -4152,9 +4081,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "funding": [ { "type": "opencollective", @@ -4170,9 +4099,9 @@ } ], "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -4187,15 +4116,6 @@ "postcss": "^8.1.0" } }, - "node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, "node_modules/babel-loader": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", @@ -4278,11 +4198,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/base16": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" - }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -4314,12 +4229,12 @@ } }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -4327,7 +4242,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -4415,9 +4330,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "funding": [ { "type": "opencollective", @@ -4433,9 +4348,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -4495,13 +4410,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4547,9 +4467,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001551", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz", - "integrity": "sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==", + "version": "1.0.30001625", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001625.tgz", + "integrity": "sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==", "funding": [ { "type": "opencollective", @@ -4862,17 +4782,6 @@ "node": ">=10" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -5021,9 +4930,9 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -5145,26 +5054,28 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "dependencies": { - "node-fetch": "^2.6.12" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/cross-spawn": { @@ -5206,11 +5117,11 @@ } }, "node_modules/css-declaration-sorter": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", - "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", "engines": { - "node": "^10 || ^12 || >=14" + "node": "^14 || ^16 || >=18" }, "peerDependencies": { "postcss": "^8.0.9" @@ -5242,16 +5153,16 @@ } }, "node_modules/css-minimizer-webpack-plugin": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", - "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", "dependencies": { - "cssnano": "^5.1.8", - "jest-worker": "^29.1.2", - "postcss": "^8.4.17", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" }, "engines": { "node": ">= 14.15.0" @@ -5305,15 +5216,15 @@ "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==" }, "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">=8.0.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, "node_modules/css-what": { @@ -5339,108 +5250,128 @@ } }, "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/cssnano" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/cssnano-preset-advanced": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", - "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", "dependencies": { - "autoprefixer": "^10.4.12", - "cssnano-preset-default": "^5.2.14", - "postcss-discard-unused": "^5.1.0", - "postcss-merge-idents": "^5.1.1", - "postcss-reduce-idents": "^5.2.0", - "postcss-zindex": "^5.1.0" + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dependencies": { - "css-tree": "^1.1.2" + "css-tree": "~2.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" + }, "node_modules/csstype": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", @@ -5535,16 +5466,19 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-lazy-prop": { @@ -5592,14 +5526,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -5951,9 +5877,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.563", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.563.tgz", - "integrity": "sha512-dg5gj5qOgfZNkPNeyKBZQAQitIQ/xwfIDmEQJHCbXaD9ebTZxwJXUsDYcBlAvZGZLi+/354l35J1wkmP6CqYaw==" + "version": "1.4.787", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.787.tgz", + "integrity": "sha512-d0EFmtLPjctczO3LogReyM2pbBiiZbnsKnGF+cdZhsYzHm/A0GV7W94kqzLD8SN4O3f3iHlgLUChqghgyznvCQ==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -6021,6 +5947,25 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", @@ -6171,16 +6116,13 @@ } }, "node_modules/estree-util-value-to-estree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz", - "integrity": "sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.1.1.tgz", + "integrity": "sha512-5mvUrF2suuv5f5cGDnDphIy4/gW86z82kl5qG6mM9z04SEQI4FB5Apmaw/TGEf3l55nLtMs5s51dmhUzvAHQCA==", "dependencies": { "@types/estree": "^1.0.0", "is-plain-obj": "^4.0.0" }, - "engines": { - "node": ">=16.0.0" - }, "funding": { "url": "https://github.com/sponsors/remcohaszing" } @@ -6199,9 +6141,9 @@ } }, "node_modules/estree-util-visit/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/estree-walker": { "version": "3.0.3", @@ -6286,16 +6228,16 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -6448,33 +6390,6 @@ "node": ">=0.8.0" } }, - "node_modules/fbemitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", - "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", - "dependencies": { - "fbjs": "^3.0.0" - } - }, - "node_modules/fbjs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", - "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", - "dependencies": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^1.0.35" - } - }, - "node_modules/fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" - }, "node_modules/feed": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", @@ -6637,22 +6552,10 @@ "flat": "cli.js" } }, - "node_modules/flux": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", - "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", - "dependencies": { - "fbemitter": "^3.0.0", - "fbjs": "^3.0.1" - }, - "peerDependencies": { - "react": "^15.0.2 || ^16.0.0 || ^17.0.0" - } - }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -6788,19 +6691,6 @@ "node": ">=6" } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/form-data-encoder": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", @@ -6935,15 +6825,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7190,11 +7084,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7269,17 +7163,17 @@ } }, "node_modules/hast-util-from-parse5/node_modules/@types/hast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.2.tgz", - "integrity": "sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } }, "node_modules/hast-util-from-parse5/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/hast-util-has-property": { "version": "1.0.4", @@ -7312,17 +7206,17 @@ } }, "node_modules/hast-util-parse-selector/node_modules/@types/hast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.2.tgz", - "integrity": "sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } }, "node_modules/hast-util-raw": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.1.tgz", - "integrity": "sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.3.tgz", + "integrity": "sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -7344,17 +7238,17 @@ } }, "node_modules/hast-util-raw/node_modules/@types/hast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.2.tgz", - "integrity": "sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } }, "node_modules/hast-util-raw/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/hast-util-raw/node_modules/unist-util-visit": { "version": "5.0.0", @@ -7471,25 +7365,31 @@ } }, "node_modules/hast-util-to-estree/node_modules/@types/hast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.2.tgz", - "integrity": "sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } }, "node_modules/hast-util-to-jsx-runtime": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.2.0.tgz", - "integrity": "sha512-wSlp23N45CMjDg/BPW8zvhEi3R+8eRE1qFbjEyAUzMCzu2l1Wzwakq+Tlia9nkCtEl5mDxa7nKHsvYJ6Gfn21A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", "dependencies": { + "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", + "style-to-object": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" }, @@ -7499,17 +7399,30 @@ } }, "node_modules/hast-util-to-jsx-runtime/node_modules/@types/hast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.2.tgz", - "integrity": "sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } }, "node_modules/hast-util-to-jsx-runtime/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", + "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", + "dependencies": { + "inline-style-parser": "0.2.3" + } }, "node_modules/hast-util-to-parse5": { "version": "8.0.0", @@ -7530,9 +7443,9 @@ } }, "node_modules/hast-util-to-parse5/node_modules/@types/hast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.2.tgz", - "integrity": "sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -7573,9 +7486,9 @@ } }, "node_modules/hast-util-whitespace/node_modules/@types/hast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.2.tgz", - "integrity": "sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -7597,9 +7510,9 @@ } }, "node_modules/hastscript/node_modules/@types/hast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.2.tgz", - "integrity": "sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -7947,9 +7860,9 @@ } }, "node_modules/image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", "dependencies": { "queue": "6.0.2" }, @@ -7957,7 +7870,7 @@ "image-size": "bin/image-size.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.x" } }, "node_modules/immediate": { @@ -8425,13 +8338,13 @@ } }, "node_modules/joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "version": "17.13.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.1.tgz", + "integrity": "sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==", "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -8556,11 +8469,14 @@ } }, "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lines-and-columns": { @@ -8608,11 +8524,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash.curry": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" - }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -8628,11 +8539,6 @@ "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" }, - "node_modules/lodash.flow": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" - }, "node_modules/lodash.invokemap": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz", @@ -8760,9 +8666,9 @@ } }, "node_modules/mdast-util-directive/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.1", @@ -8791,9 +8697,9 @@ } }, "node_modules/mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -8814,9 +8720,9 @@ } }, "node_modules/mdast-util-from-markdown/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { "version": "2.0.0", @@ -8896,9 +8802,9 @@ } }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9024,17 +8930,17 @@ } }, "node_modules/mdast-util-mdx-expression/node_modules/@types/hast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.2.tgz", - "integrity": "sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } }, "node_modules/mdast-util-mdx-jsx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -9056,17 +8962,17 @@ } }, "node_modules/mdast-util-mdx-jsx/node_modules/@types/hast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.2.tgz", - "integrity": "sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } }, "node_modules/mdast-util-mdx-jsx/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/mdast-util-mdxjs-esm": { "version": "2.0.1", @@ -9086,17 +8992,17 @@ } }, "node_modules/mdast-util-mdxjs-esm/node_modules/@types/hast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.2.tgz", - "integrity": "sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } }, "node_modules/mdast-util-phrasing": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz", - "integrity": "sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" @@ -9107,9 +9013,9 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz", - "integrity": "sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -9118,7 +9024,8 @@ "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0" + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", @@ -9126,17 +9033,17 @@ } }, "node_modules/mdast-util-to-hast/node_modules/@types/hast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.2.tgz", - "integrity": "sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } }, "node_modules/mdast-util-to-hast/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/mdast-util-to-hast/node_modules/unist-util-visit": { "version": "5.0.0", @@ -9172,9 +9079,9 @@ } }, "node_modules/mdast-util-to-markdown/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { "version": "5.0.0", @@ -9203,9 +9110,9 @@ } }, "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" }, "node_modules/media-typer": { "version": "0.3.0", @@ -9287,9 +9194,9 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", - "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", "funding": [ { "type": "GitHub Sponsors", @@ -9339,9 +9246,9 @@ } }, "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9410,9 +9317,9 @@ } }, "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9459,9 +9366,9 @@ } }, "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9527,9 +9434,9 @@ } }, "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9599,9 +9506,9 @@ } }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9700,9 +9607,9 @@ } }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9781,9 +9688,9 @@ } }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9859,9 +9766,9 @@ } }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9933,9 +9840,9 @@ } }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10018,9 +9925,9 @@ } }, "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10072,9 +9979,9 @@ } }, "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10127,9 +10034,9 @@ } }, "node_modules/micromark-factory-label/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10186,9 +10093,9 @@ } }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10294,9 +10201,9 @@ } }, "node_modules/micromark-factory-title/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10368,9 +10275,9 @@ } }, "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10489,9 +10396,9 @@ } }, "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10596,9 +10503,9 @@ } }, "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10670,9 +10577,9 @@ } }, "node_modules/micromark-util-events-to-acorn/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { "version": "2.0.0", @@ -10776,9 +10683,9 @@ } }, "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10810,9 +10717,9 @@ ] }, "node_modules/micromark-util-subtokenize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", - "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10895,9 +10802,9 @@ } }, "node_modules/micromark/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11066,9 +10973,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -11105,20 +11012,23 @@ } }, "node_modules/node-emoji": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.0.tgz", - "integrity": "sha512-tcsBm9C6FmPN5Wo7OjFi9lgMyJjvkAeirmjR/ax8Ttfqy4N8PoFic26uqFTIgayHPNI5FH4ltUvfh9kHzwcK9A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", "dependencies": { - "@sindresorhus/is": "^3.1.2", + "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", "emojilib": "^2.4.0", "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/node-emoji/node_modules/@sindresorhus/is": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-3.1.2.tgz", - "integrity": "sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "engines": { "node": ">=10" }, @@ -11126,25 +11036,6 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -11154,9 +11045,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/nopt": { "version": "1.0.10", @@ -11188,17 +11079,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/not": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/not/-/not-0.1.0.tgz", @@ -11688,9 +11568,9 @@ } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -11706,114 +11586,117 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "dependencies": { - "postcss-selector-parser": "^6.0.9", + "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, "peerDependencies": { "postcss": "^8.2.2" } }, "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", - "colord": "^2.9.1", + "colord": "^2.9.3", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-discard-unused": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", - "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", "dependencies": { - "postcss-selector-parser": "^6.0.5" + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-loader": { @@ -11837,136 +11720,111 @@ "webpack": "^5.0.0" } }, - "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/postcss-merge-idents": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", - "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", + "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", "dependencies": { - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" + "stylehacks": "^6.1.1" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", "dependencies": { - "postcss-selector-parser": "^6.0.5" + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-modules-extract-imports": { @@ -12025,192 +11883,191 @@ } }, "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", "dependencies": { - "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", "dependencies": { - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-reduce-idents": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", - "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", + "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.23.0", "caniuse-api": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -12220,46 +12077,46 @@ } }, "node_modules/postcss-sort-media-queries": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", - "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", + "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", "dependencies": { - "sort-css-media-queries": "2.1.0" + "sort-css-media-queries": "2.2.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=14.0.0" }, "peerDependencies": { - "postcss": "^8.4.16" + "postcss": "^8.4.23" } }, "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", "dependencies": { "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" + "svgo": "^3.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >= 18" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", "dependencies": { - "postcss-selector-parser": "^6.0.5" + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-value-parser": { @@ -12268,14 +12125,14 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/postcss-zindex": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", - "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", + "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/pretty-error": { @@ -12296,17 +12153,25 @@ } }, "node_modules/prism-react-renderer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.1.0.tgz", - "integrity": "sha512-I5cvXHjA1PVGbGm1MsWCpvBCRrYyxEri0MC7/JbfIfYfcXAxHyO5PaUjs3A8H5GW6kJcLhTHxxMaOZZpRZD2iQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", + "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", "dependencies": { "@types/prismjs": "^1.26.0", - "clsx": "^1.2.1" + "clsx": "^2.0.0" }, "peerDependencies": { "react": ">=16.0.0" } }, + "node_modules/prism-react-renderer/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, "node_modules/prismjs": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", @@ -12320,14 +12185,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dependencies": { - "asap": "~2.0.3" - } - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -12351,9 +12208,9 @@ } }, "node_modules/property-information": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz", - "integrity": "sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -12403,11 +12260,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pure-color": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" - }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -12477,9 +12329,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -12531,17 +12383,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-base16-styling": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", - "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", - "dependencies": { - "base16": "^1.0.0", - "lodash.curry": "^4.0.1", - "lodash.flow": "^3.3.0", - "pure-color": "^1.2.0" - } - }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -12703,19 +12544,24 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + "node_modules/react-json-view-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.4.0.tgz", + "integrity": "sha512-wh6F6uJyYAmQ4fK0e8dSQMEWuvTs2Wr3el3sLD9bambX1+pSWUVXIz1RFaoy3TI1mZ0FqdpKq9YgbgTTgyrmXA==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + } }, "node_modules/react-loadable": { "name": "@docusaurus/react-loadable", - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "dependencies": { - "@types/react": "*", - "prop-types": "^15.6.2" + "@types/react": "*" }, "peerDependencies": { "react": "*" @@ -12784,22 +12630,6 @@ "react": ">=15" } }, - "node_modules/react-textarea-autosize": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", - "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", - "dependencies": { - "@babel/runtime": "^7.10.2", - "use-composed-ref": "^1.3.0", - "use-latest": "^1.2.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -13108,9 +12938,9 @@ } }, "node_modules/rehype-raw/node_modules/@types/hast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.2.tgz", - "integrity": "sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -13186,9 +13016,9 @@ } }, "node_modules/remark-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.0.tgz", - "integrity": "sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", + "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" @@ -13214,9 +13044,9 @@ } }, "node_modules/remark-rehype": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.0.0.tgz", - "integrity": "sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -13230,9 +13060,9 @@ } }, "node_modules/remark-rehype/node_modules/@types/hast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.2.tgz", - "integrity": "sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -13496,14 +13326,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -13529,9 +13351,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" }, "node_modules/scheduler": { "version": "0.23.0", @@ -13559,6 +13381,12 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/search-insights": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.14.0.tgz", + "integrity": "sha512-OLN6MsPMCghDOqlCtsIsYgtsC0pnwVTyT9Mu6A3ewOj1DxvzZF6COrn2g86E/c05xbktB0XN04m/t1Z+n+fTGw==", + "peer": true + }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -13793,24 +13621,21 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -13876,13 +13701,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13912,9 +13741,9 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/sitemap": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", - "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", + "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", @@ -13953,6 +13782,15 @@ "node": ">=8" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -13964,9 +13802,9 @@ } }, "node_modules/sort-css-media-queries": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", - "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", + "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", "engines": { "node": ">= 6.3.0" } @@ -13980,9 +13818,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } @@ -14049,12 +13887,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -14118,9 +13950,9 @@ } }, "node_modules/stringify-entities": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", - "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -14190,18 +14022,18 @@ } }, "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/supports-color": { @@ -14232,23 +14064,27 @@ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" }, "bin": { "svgo": "bin/svgo" }, "engines": { - "node": ">=10.13.0" + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" } }, "node_modules/svgo/node_modules/commander": { @@ -14259,69 +14095,6 @@ "node": ">= 10" } }, - "node_modules/svgo/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/svgo/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/svgo/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -14565,11 +14338,6 @@ "node": ">=6" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -14580,9 +14348,9 @@ } }, "node_modules/trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -14643,26 +14411,17 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/ua-parser-js": { - "version": "1.0.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", - "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": "*" + "node": ">=14.17" } }, "node_modules/undici-types": { @@ -14733,9 +14492,9 @@ } }, "node_modules/unified/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/unique-string": { "version": "3.0.0", @@ -14785,9 +14544,9 @@ } }, "node_modules/unist-util-is/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/unist-util-position": { "version": "5.0.0", @@ -14814,14 +14573,14 @@ } }, "node_modules/unist-util-position-from-estree/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/unist-util-position/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/unist-util-remove-position": { "version": "5.0.0", @@ -14837,9 +14596,9 @@ } }, "node_modules/unist-util-remove-position/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/unist-util-remove-position/node_modules/unist-util-visit": { "version": "5.0.0", @@ -14868,9 +14627,9 @@ } }, "node_modules/unist-util-stringify-position/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/unist-util-visit": { "version": "2.0.3", @@ -14900,9 +14659,9 @@ } }, "node_modules/unist-util-visit-parents/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/unist-util-visit/node_modules/unist-util-is": { "version": "4.1.0", @@ -15147,43 +14906,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/use-composed-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", - "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-latest": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", - "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", - "dependencies": { - "use-isomorphic-layout-effect": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -15195,9 +14917,9 @@ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, "node_modules/utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", "engines": { "node": ">= 4" } @@ -15259,9 +14981,9 @@ } }, "node_modules/vfile-location/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/vfile-message": { "version": "4.0.2", @@ -15277,32 +14999,14 @@ } }, "node_modules/vfile-message/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/vfile/node_modules/@types/unist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.1.tgz", - "integrity": "sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==" - }, - "node_modules/wait-on": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.1.0.tgz", - "integrity": "sha512-U7TF/OYYzAg+OoiT/B8opvN48UHt0QYMi4aD3PjRFpybQ+o6czQF8Ig3SKCCMJdxpBrCalIJ4O00FBof27Fu9Q==", - "dependencies": { - "axios": "^0.27.2", - "joi": "^17.11.0", - "lodash": "^4.17.21", - "minimist": "^1.2.8", - "rxjs": "^7.8.1" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=12.0.0" - } + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/watchpack": { "version": "2.4.0", @@ -15333,11 +15037,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, "node_modules/webpack": { "version": "5.89.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", @@ -15423,9 +15122,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -15672,15 +15371,6 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/documentation/package-lock.json.license b/documentation/package-lock.json.license index b1cf00429..027afd8aa 100644 --- a/documentation/package-lock.json.license +++ b/documentation/package-lock.json.license @@ -1,6 +1,6 @@ -SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) +SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) (dv4all) -SPDX-FileCopyrightText: 2023 Netherlands eScience Center SPDX-FileCopyrightText: 2023 dv4all SPDX-License-Identifier: Apache-2.0 diff --git a/documentation/package.json b/documentation/package.json index 5c5b4ca66..c88bd7422 100644 --- a/documentation/package.json +++ b/documentation/package.json @@ -15,17 +15,17 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "3.0.0", - "@docusaurus/preset-classic": "3.0.0", - "@mdx-js/react": "^3.0.0", - "docusaurus-lunr-search": "^3.3.0", - "prism-react-renderer": "^2.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "@docusaurus/core": "3.3.2", + "@docusaurus/preset-classic": "3.3.2", + "@mdx-js/react": "3.0.0", + "docusaurus-lunr-search": "3.3.0", + "prism-react-renderer": "2.3.1", + "react": "18.2.0", + "react-dom": "18.2.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.0.0", - "@docusaurus/types": "3.0.0" + "@docusaurus/module-type-aliases": "3.3.2", + "@docusaurus/types": "3.3.2" }, "browserslist": { "production": [ diff --git a/documentation/package.json.license b/documentation/package.json.license index b1cf00429..027afd8aa 100644 --- a/documentation/package.json.license +++ b/documentation/package.json.license @@ -1,6 +1,6 @@ -SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) +SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) (dv4all) -SPDX-FileCopyrightText: 2023 Netherlands eScience Center SPDX-FileCopyrightText: 2023 dv4all SPDX-License-Identifier: Apache-2.0 diff --git a/frontend/components/AppHeader/AppHeader.test.tsx b/frontend/components/AppHeader/AppHeader.test.tsx index fdd420a0f..a7d957ec9 100644 --- a/frontend/components/AppHeader/AppHeader.test.tsx +++ b/frontend/components/AppHeader/AppHeader.test.tsx @@ -1,14 +1,19 @@ // SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 dv4all +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 import {render, screen} from '@testing-library/react' -import {WrappedComponentWithProps} from '~/utils/jest/WrappedComponents' +import {WithAppContext} from '~/utils/jest/WithAppContext' import {menuItems} from '~/config/menuItems' +import defaultSettings from '~/config/defaultSettings.json' +import {RsdSettingsState} from '~/config/rsdSettingsReducer' import AppHeader from './index' + // mocks login providers list const redirectUrl = 'https://test-login-redirect.com' jest.mock('~/auth/api/useLoginProviders', () => { @@ -19,7 +24,14 @@ jest.mock('~/auth/api/useLoginProviders', () => { }) beforeEach(() => { - render(WrappedComponentWithProps(AppHeader,)) + jest.clearAllMocks() + render( + + + + ) }) it('renders AppHeader with header tag', () => { @@ -28,18 +40,18 @@ it('renders AppHeader with header tag', () => { expect(header).toBeInTheDocument() }) -it('renders AppHeader with 2 searchboxes', () => { +it('renders AppHeader with 2 search boxes', () => { // has searchbox const search = screen.getAllByTestId('global-search') - // two searchboxes, one for mobile and one for larger screens?!? + // two search boxes, one for mobile and one for larger screens?!? expect(search).toHaveLength(2) }) -it('renders AppHeader with links and logo link', () => { +it('renders AppHeader with links to defined modules and logo link', () => { // has searchbox const links = screen.getAllByRole('link') - // menu items + logo link + feedback link - expect(links).toHaveLength(menuItems.length + 2) + // menu items defined in modules + logo link + feedback link + expect(links).toHaveLength(defaultSettings.host.modules.length + 2) // screen.debug() }) diff --git a/frontend/components/AppHeader/DesktopMenu.tsx b/frontend/components/AppHeader/DesktopMenu.tsx index c5a5f0b9e..f2d939e91 100644 --- a/frontend/components/AppHeader/DesktopMenu.tsx +++ b/frontend/components/AppHeader/DesktopMenu.tsx @@ -3,18 +3,19 @@ // // SPDX-License-Identifier: Apache-2.0 -import {menuItems} from '~/config/menuItems' import Link from 'next/link' +import useMenuItems from '~/config/useMenuItems' import isActiveMenuItem from './isActiveMenuItem' export default function DesktopMenu({activePath}:{activePath:string}) { + const menuItems = useMenuItems() // console.group('DesktopMenu') // console.log('activePath...',activePath) // console.groupEnd() return (

    + className={`hidden text-center lg:flex-1 lg:flex lg:justify-evenly lg:gap-5 xl:justify-start ${menuItems.length < 4 ? 'text-lg' : ''}`}> {menuItems.map(item => { const isActive = isActiveMenuItem({item, activePath}) return ( diff --git a/frontend/components/AppHeader/ResponsiveMenu.tsx b/frontend/components/AppHeader/ResponsiveMenu.tsx index 33c0e4313..db13dd974 100644 --- a/frontend/components/AppHeader/ResponsiveMenu.tsx +++ b/frontend/components/AppHeader/ResponsiveMenu.tsx @@ -10,15 +10,13 @@ import Menu from '@mui/material/Menu' import MenuItem from '@mui/material/MenuItem' import MenuIcon from '@mui/icons-material/Menu' -import {menuItems} from '~/config/menuItems' import useDisableScrollLock from '~/utils/useDisableScrollLock' -import useRsdSettings from '~/config/useRsdSettings' -import FeedbackPanelButton from '~/components/feedback/FeedbackPanelButton' +import useMenuItems from '~/config/useMenuItems' import isActiveMenuItem from './isActiveMenuItem' export default function ResponsiveMenu({activePath}:{activePath:string}) { + const menuItems = useMenuItems() const disable = useDisableScrollLock() - const {host} = useRsdSettings() const [anchorEl, setAnchorEl] = useState(null) const open = Boolean(anchorEl) @@ -76,17 +74,6 @@ export default function ResponsiveMenu({activePath}:{activePath:string}) { ) })} - - {/* {host.feedback?.enabled ? - - - - : null - } */} -
    ) diff --git a/frontend/components/admin/communities/CommunityList.tsx b/frontend/components/admin/communities/CommunityList.tsx index 66b296ab4..9f12df9e9 100644 --- a/frontend/components/admin/communities/CommunityList.tsx +++ b/frontend/components/admin/communities/CommunityList.tsx @@ -10,17 +10,17 @@ import List from '@mui/material/List' import ConfirmDeleteModal from '~/components/layout/ConfirmDeleteModal' import ContentLoader from '~/components/layout/ContentLoader' -import {Community} from './apiCommunities' +import {CommunityListProps} from '~/components/communities/apiCommunities' import CommunityListItem from './CommunityListItem' import NoCommunityAlert from './NoCommunityAlert' type DeleteOrganisationModal = { open: boolean, - item?: Community + item?: CommunityListProps } type OrganisationsAdminListProps = { - communities: Community[] + communities: CommunityListProps[] loading: boolean page: number onDeleteItem: (id:string,logo_id:string|null)=>void diff --git a/frontend/components/admin/communities/CommunityListItem.tsx b/frontend/components/admin/communities/CommunityListItem.tsx index a1ee7a74c..92386f9e9 100644 --- a/frontend/components/admin/communities/CommunityListItem.tsx +++ b/frontend/components/admin/communities/CommunityListItem.tsx @@ -11,21 +11,32 @@ import IconButton from '@mui/material/IconButton' import ListItem from '@mui/material/ListItem' import DeleteIcon from '@mui/icons-material/Delete' import EditIcon from '@mui/icons-material/Edit' - import ListItemText from '@mui/material/ListItemText' import ListItemAvatar from '@mui/material/ListItemAvatar' import Avatar from '@mui/material/Avatar' + import {getImageUrl} from '~/utils/editImage' -import {Community} from './apiCommunities' +import {CommunityListProps} from '~/components/communities/apiCommunities' import config from './config' type OrganisationItemProps = { - item: Community, + item: CommunityListProps, onDelete: () => void } export default function CommunityListItem({item, onDelete}: OrganisationItemProps) { - const router = useRouter() + + function isDeletedDisabled(){ + // if any of software in community + if (item.software_cnt && item?.software_cnt > 0 ) return true + if (item.rejected_cnt && item?.rejected_cnt > 0 ) return true + if (item.pending_cnt && item?.pending_cnt > 0 ) return true + // if keywords are defined + if (item.keywords && item.keywords?.length > 0 ) return true + // otherwise it can be deleted + return false + } + return ( 0} + disabled={isDeletedDisabled()} edge="end" aria-label="delete" onClick={() => { @@ -82,7 +93,12 @@ export default function CommunityListItem({item, onDelete}: OrganisationItemProp <> {item.short_description}
    - Software: 0 (not implemented!) + + Software: {item.software_cnt ?? 0} + Pending requests: {item.pending_cnt ?? 0} + Rejected requests: {item.rejected_cnt ?? 0} + Keywords: {item.keywords?.length ?? 0} + } /> diff --git a/frontend/components/admin/communities/apiCommunities.ts b/frontend/components/admin/communities/apiCommunities.ts index a2bd682fd..5a5229c7e 100644 --- a/frontend/components/admin/communities/apiCommunities.ts +++ b/frontend/components/admin/communities/apiCommunities.ts @@ -3,10 +3,8 @@ // // SPDX-License-Identifier: Apache-2.0 -import {extractCountFromHeader} from '~/utils/extractCountFromHeader' import {createJsonHeaders, extractReturnMessage, getBaseUrl} from '~/utils/fetchHelpers' import logger from '~/utils/logger' -import {paginationUrlParams} from '~/utils/postgrestUrl' export type Community={ id?:string, @@ -18,60 +16,6 @@ export type Community={ logo_id: string|null } -type GetCommunitiesParams={ - page: number, - rows: number, - token: string - searchFor?:string, - orderBy?:string, -} - -export async function getCommunities({page, rows, token, searchFor, orderBy}:GetCommunitiesParams){ - try{ - let query = paginationUrlParams({rows, page}) - if (searchFor) { - query+=`&name=ilike.*${searchFor}*` - } - if (orderBy) { - query+=`&order=${orderBy}` - } else { - query+='&order=name.asc' - } - // complete url - const url = `${getBaseUrl()}/community?${query}` - - // get community - const resp = await fetch(url, { - method: 'GET', - headers: { - ...createJsonHeaders(token), - // request record count to be returned - // note: it's returned in the header - 'Prefer': 'count=exact' - } - }) - - if ([200,206].includes(resp.status)) { - const communities: Community[] = await resp.json() - return { - count: extractCountFromHeader(resp.headers) ?? 0, - communities - } - } - logger(`getCommunities: ${resp.status}: ${resp.statusText}`,'warn') - return { - count: 0, - communities: [] - } - }catch(e:any){ - logger(`getCommunities: ${e.message}`,'error') - return { - count: 0, - communities: [] - } - } -} - export async function validCommunitySlug({slug, token}: { slug: string, token: string }) { try{ // use server side when available diff --git a/frontend/components/admin/communities/useAdminCommunities.tsx b/frontend/components/admin/communities/useAdminCommunities.tsx index 24a85e5dc..2f7dfa09b 100644 --- a/frontend/components/admin/communities/useAdminCommunities.tsx +++ b/frontend/components/admin/communities/useAdminCommunities.tsx @@ -6,21 +6,22 @@ import {useSession} from '~/auth' import useSnackbar from '~/components/snackbar/useSnackbar' import usePaginationWithSearch from '~/utils/usePaginationWithSearch' -import {Community, getCommunities, addCommunity as addCommunityToRsd, deleteCommunityById} from './apiCommunities' +import {addCommunity as addCommunityToRsd, deleteCommunityById} from './apiCommunities' import {useCallback, useEffect, useState} from 'react' import {EditCommunityProps} from './AddCommunityModal' import {deleteImage, upsertImage} from '~/utils/editImage' +import {CommunityListProps, getCommunityList} from '~/components/communities/apiCommunities' export function useAdminCommunities(){ const {token} = useSession() const {showErrorMessage} = useSnackbar() const {searchFor, page, rows, setCount} = usePaginationWithSearch('Find community by name') - const [communities, setCommunities] = useState([]) + const [communities, setCommunities] = useState([]) const [loading, setLoading] = useState(true) const loadCommunities = useCallback(async() => { setLoading(true) - const {communities, count} = await getCommunities({ + const {communities, count} = await getCommunityList({ token, searchFor, page, diff --git a/frontend/components/cards/KeywordList.tsx b/frontend/components/cards/KeywordList.tsx index f41d7db62..453f88f96 100644 --- a/frontend/components/cards/KeywordList.tsx +++ b/frontend/components/cards/KeywordList.tsx @@ -1,6 +1,6 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 dv4all // // SPDX-License-Identifier: Apache-2.0 @@ -22,7 +22,7 @@ export default function KeywordList({keywords=[], visibleNumberOfKeywords = 3}:
  • {keyword}
  • ))} diff --git a/frontend/components/feedback/FeedbackPanelButton.tsx b/frontend/components/feedback/FeedbackPanelButton.tsx index 830270bf5..5b4ae8581 100644 --- a/frontend/components/feedback/FeedbackPanelButton.tsx +++ b/frontend/components/feedback/FeedbackPanelButton.tsx @@ -13,16 +13,17 @@ import useMediaQuery from '@mui/material/useMediaQuery' import {useTheme} from '@mui/material/styles' import LinkIcon from '@mui/icons-material/Link' import WebIcon from '@mui/icons-material/Web' -import CaretIcon from '~/components/icons/caret.svg' + import getBrowser from '~/utils/getBrowser' +import useDisableScrollLock from '~/utils/useDisableScrollLock' +import CaretIcon from '~/components/icons/caret.svg' export default function FeedbackPanelButton({feedback_email, issues_page_url, closeFeedbackPanel}: { feedback_email: string, issues_page_url: string, closeFeedbackPanel?: () => void } ) { - + const disable = useDisableScrollLock() const [text, setText] = useState('') const [open, setOpen] = useState(false) - const theme = useTheme() const fullScreen = useMediaQuery(theme.breakpoints.down('sm')) @@ -76,6 +77,7 @@ User Agent: ${navigator.userAgent}` open={open} onClose={handleClose} aria-labelledby="responsive-dialog-title" + disableScrollLock={disable} >
    ) } diff --git a/frontend/pages/invite/project/[id].tsx b/frontend/pages/invite/project/[id].tsx index aa74ed3a9..5edfe5947 100644 --- a/frontend/pages/invite/project/[id].tsx +++ b/frontend/pages/invite/project/[id].tsx @@ -1,13 +1,15 @@ +// SPDX-FileCopyrightText: 2022 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 Ewan Cahen (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2022 Netherlands eScience Center // SPDX-FileCopyrightText: 2022 dv4all +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) // // SPDX-License-Identifier: Apache-2.0 import {GetServerSidePropsContext} from 'next' import Head from 'next/head' -import Link from 'next/link' +import LinkIcon from '@mui/icons-material/Link' +import Button from '@mui/material/Button' import {claimProjectMaintainerInvite} from '~/auth/api/authHelpers' import {getAccountFromToken} from '~/auth/jwtUtils' @@ -41,13 +43,29 @@ export default function InviteProjectMaintainer({projectInfo, error}: } return ( -

    - You are now a maintainer of {projectInfo?.title ?? 'missing'}! -   - - Open project - -

    +
    +

    + { + projectInfo?.title ? + You are now a maintainer of {projectInfo?.title} + : You are now a maintainer + } +

    + +
    ) } @@ -101,7 +119,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { projectInfo:null, error: { status: 404, - message: 'This invite is invalid. It\'s missing invite id. Please ask the project mantainer to provide you a new link.' + message: 'This invite is invalid. It\'s missing invite id. Please ask the project maintainer to provide you a new link.' } } } diff --git a/frontend/pages/invite/software/[id].tsx b/frontend/pages/invite/software/[id].tsx index d8aa17af3..fcafb821e 100644 --- a/frontend/pages/invite/software/[id].tsx +++ b/frontend/pages/invite/software/[id].tsx @@ -1,11 +1,14 @@ // SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 dv4all +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 import {GetServerSidePropsContext} from 'next' import Head from 'next/head' -import Link from 'next/link' +import LinkIcon from '@mui/icons-material/Link' +import Button from '@mui/material/Button' import {claimSoftwareMaintainerInvite} from '~/auth/api/authHelpers' import {getAccountFromToken} from '~/auth/jwtUtils' @@ -25,8 +28,7 @@ type InviteSoftwareMaintainerProps = { }|null } -export default function InviteSoftwareMaintainer({softwareInfo, error}: - InviteSoftwareMaintainerProps) { +export default function InviteSoftwareMaintainer({softwareInfo, error}: InviteSoftwareMaintainerProps) { // console.group('InviteSoftwareMaintainer') // console.log('softwareInfo..', softwareInfo) // console.log('error..', error) @@ -39,13 +41,29 @@ export default function InviteSoftwareMaintainer({softwareInfo, error}: } return ( -

    - You are now a maintainer of {softwareInfo?.brand_name ?? 'missing'}! -   - - Open software - -

    +
    +

    + { + softwareInfo?.brand_name ? + You are now a maintainer of {softwareInfo?.brand_name} + : You are now a maintainer + } +

    + +
    ) } @@ -103,7 +121,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { softwareInfo:null, error: { status: 404, - message: 'This invite is invalid. It\'s missing invite id. Please ask the software mantainer to provide you a new link.' + message: 'This invite is invalid. It\'s missing invite id. Please ask the software maintainer to provide you a new link.' } } } diff --git a/frontend/public/data/settings.json b/frontend/public/data/settings.json index 6b08a57fc..c4083b2bb 100644 --- a/frontend/public/data/settings.json +++ b/frontend/public/data/settings.json @@ -18,7 +18,7 @@ "limit": 5, "description": null }, - "modules":["software","projects","organisations","communities"] + "modules":["software","projects","organisations"] }, "links": [ {
    diff --git a/frontend/config/defaultSettings.json b/frontend/config/defaultSettings.json index 6abcfb534..9d21f87aa 100644 --- a/frontend/config/defaultSettings.json +++ b/frontend/config/defaultSettings.json @@ -17,7 +17,8 @@ "title": "Software Highlights", "limit": 3, "description": null - } + }, + "modules":["software","projects","organisations"] }, "links": [ { diff --git a/frontend/config/getSettingsServerSide.ts b/frontend/config/getSettingsServerSide.ts index b92312ee0..398c7dc81 100644 --- a/frontend/config/getSettingsServerSide.ts +++ b/frontend/config/getSettingsServerSide.ts @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 - 2023 dv4all // SPDX-FileCopyrightText: 2023 - 2024 Christian Meeßen (GFZ) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) // SPDX-FileCopyrightText: 2023 - 2024 Helmholtz Centre Potsdam - GFZ German Research Centre for Geosciences -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 @@ -33,12 +33,12 @@ export async function getRsdSettings() { } else { logger(`Failed to load theme settings. ${resp.status} ${resp.statusText}`, 'warn') // return default settings - return defaultSettings + return defaultSettings as RsdSettingsState } } catch (e: any) { logger(`Failed to load theme settings. ${e.message}`, 'error') // return default settings - return defaultSettings + return defaultSettings as RsdSettingsState } } @@ -58,7 +58,7 @@ export async function getSettingsServerSide(req: IncomingMessage | undefined, qu } // compose all settings - const rsdSettings = { + const rsdSettings:RsdSettingsState = { ...defaultRsdSettings, host: settings.host, links: settings.links, diff --git a/frontend/config/menuItems.ts b/frontend/config/menuItems.ts index 6ebaf1396..2a13eac58 100644 --- a/frontend/config/menuItems.ts +++ b/frontend/config/menuItems.ts @@ -8,6 +8,8 @@ // // SPDX-License-Identifier: Apache-2.0 +import {RsdModule} from './rsdSettingsReducer' + export type MenuItemType = { type?: 'link' | 'function' |'divider' label: string, @@ -21,14 +23,16 @@ export type MenuItemType = { // optional, but fn is provided it will have higher priority // than path fn?: Function, + // enables filtering of menuItems for the instance (defined in settings.json) + module?: RsdModule } // routes defined for nav/menu // used in components/AppHeader export const menuItems:MenuItemType[] = [ - {path: '/software?order=mention_cnt', match:'/software', label:'Software'}, - {path: '/projects?order=impact_cnt', match: '/projects', label: 'Projects'}, - {path: '/organisations', match: '/organisations', label: 'Organisations'}, - {path: '/communities', match: '/communities', label: 'Communities'} + {path: '/software?order=mention_cnt', match:'/software', label:'Software', module:'software'}, + {path: '/projects?order=impact_cnt', match: '/projects', label: 'Projects', module:'projects'}, + {path: '/organisations', match: '/organisations', label: 'Organisations', module:'organisations'}, + {path: '/communities', match: '/communities', label: 'Communities', module:'communities'} ] // ListItemButton styles for menus used on the edit pages diff --git a/frontend/config/rsdSettingsReducer.ts b/frontend/config/rsdSettingsReducer.ts index 9b8e34952..edeb6290a 100644 --- a/frontend/config/rsdSettingsReducer.ts +++ b/frontend/config/rsdSettingsReducer.ts @@ -19,6 +19,8 @@ export type RsdSettingsState = { announcement?: string | null } +export type RsdModule= 'software'| 'projects' | 'organisations' | 'communities' | 'news' | 'user' + export type RsdHost = { name: string, email: string, @@ -37,7 +39,8 @@ export type RsdHost = { title: string, limit: number, description?: string | null - } + }, + modules?: RsdModule[] } export type CustomLink = { @@ -67,7 +70,7 @@ export type RsdSettingsAction = { export type RsdSettingsDispatch = (action: RsdSettingsAction)=>void -export const defaultRsdSettings: RsdSettingsState = defaultSettings +export const defaultRsdSettings = defaultSettings as RsdSettingsState export function rsdSettingsReducer(state: RsdSettingsState, action: RsdSettingsAction) { // console.group('rsdSettingsReducer') diff --git a/frontend/config/useMenuItems.tsx b/frontend/config/useMenuItems.tsx new file mode 100644 index 000000000..fd29b54e1 --- /dev/null +++ b/frontend/config/useMenuItems.tsx @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {menuItems} from '~/config/menuItems' +import useRsdSettings from './useRsdSettings' + +export default function useMenuItems(){ + // get host settings + const {host} = useRsdSettings() + // filter menu items for this RSD instance + const items = menuItems.filter(item=> { + // if modules are defined in settings.json and in menuItems + if (host?.modules && host?.modules?.length > 0 && item.module){ + // include only options defined for this RSD host + return host.modules.includes(item.module) + } + // else all menuItems are allowed by default + return true + }) + + return items +} diff --git a/frontend/config/userMenuItems.tsx b/frontend/config/userMenuItems.tsx index 4af115fb4..abd737e8b 100644 --- a/frontend/config/userMenuItems.tsx +++ b/frontend/config/userMenuItems.tsx @@ -24,58 +24,69 @@ export function getUserMenuItems( const userMenuItems: MenuItemType[] = [ { + module: 'user', type: 'link', label:'My software', active: ['rsd_admin', 'rsd_user'].includes(role), path:'/user/software', - icon: + icon: , }, { + module: 'user', type: 'link', label:'My projects', active:['rsd_admin','rsd_user'].includes(role), path:'/user/projects', - icon: + icon: , }, { + module: 'user', type: 'link', label: 'My organisations', active:['rsd_admin','rsd_user'].includes(role), path: '/user/organisations', - icon: + icon: , }, { + module: 'user', type: 'divider', label: 'divider1', active: ['rsd_admin', 'rsd_user'].includes(role), }, { + module: 'user', type: 'link', label: 'My settings', active: ['rsd_admin','rsd_user'].includes(role), path: '/user/settings', - icon: + icon: , }, { + module: 'user', type: 'divider', label: 'divider2', - active: ['rsd_admin'].includes(role) + active: ['rsd_admin'].includes(role), }, { + module: 'user', type: 'link', label: 'Administration', active: ['rsd_admin'].includes(role), path: '/admin/public-pages', - icon: + icon: , },{ + module: 'user', type: 'divider', label: 'divider3', - active: ['rsd_admin'].includes(role) + active: ['rsd_admin'].includes(role), }, { + module: 'user', type: 'link', label: 'News', active: ['rsd_admin'].includes(role), path: '/news', - icon: + icon: , }, { + module: 'user', type: 'divider', label: 'divider4', active: ['rsd_admin','rsd_user'].includes(role), }, { + module: 'user', label: 'Logout', active: ['rsd_admin', 'rsd_user'].includes(role), icon: , diff --git a/frontend/public/data/settings.json b/frontend/public/data/settings.json index 8af3b0939..c4083b2bb 100644 --- a/frontend/public/data/settings.json +++ b/frontend/public/data/settings.json @@ -17,7 +17,8 @@ "title": "Software Highlights", "limit": 5, "description": null - } + }, + "modules":["software","projects","organisations"] }, "links": [ { @@ -40,11 +41,6 @@ "url": "https://www.esciencecenter.nl/", "target": "_blank" }, - { - "label": "Communities", - "url": "/communities", - "target": "_self" - }, { "label": "News", "url": "/news", diff --git a/frontend/utils/useDisableScrollLock.tsx b/frontend/utils/useDisableScrollLock.tsx index 95de514f4..974d2aef6 100644 --- a/frontend/utils/useDisableScrollLock.tsx +++ b/frontend/utils/useDisableScrollLock.tsx @@ -8,8 +8,8 @@ import useMediaQuery from '@mui/material/useMediaQuery' /** - * Hook to decide if we need to disable scroll lock on popover menus. - * Currenty our header required minimum size of 23rem to fit all items: + * Hook to decide if we need to disable scroll lock on pop-over menus. + * Currently our header required minimum size of 23rem to fit all items: * logo, add button, mobile menu and the profile menu. The min-width * is defined in /styles/global.css * NOTE! when changing this value we need to update global.css too From 2bce2de256c832dba64a65932b7401ec895042f4 Mon Sep 17 00:00:00 2001 From: Dusan Mijatovic Date: Mon, 10 Jun 2024 11:05:02 +0200 Subject: [PATCH 6/9] feat: add communities to edit software (#1220) test: fix broken test and extend with communties check note: communties is disabled by default --- database/124-community-views.sql | 49 ++++++ database/999-add-categories.sql.example | 2 +- frontend/__tests__/SoftwareEditPage.test.tsx | 34 +++- .../software/card/useAdminMenuOptions.tsx | 22 ++- .../software/edit/EditSoftwareNav.tsx | 45 +++--- .../communities/CommunityStatusBanner.tsx | 43 +++++ .../edit/communities/FindCommunity.tsx | 153 ++++++++++++++++++ .../communities/SoftwareCommunitiesInfo.tsx | 32 ++++ .../communities/SoftwareCommunityList.tsx | 34 ++++ .../communities/SoftwareCommunityListItem.tsx | 86 ++++++++++ .../communities/apiSoftwareCommunities.ts | 104 ++++++++++++ .../software/edit/communities/config.ts | 20 +++ .../software/edit/communities/index.tsx | 112 +++++++++++++ .../communities/useSoftwareCommunities.tsx | 85 ++++++++++ .../software/edit/editSoftwarePages.tsx | 15 +- .../software/edit/organisations/index.tsx | 8 +- 16 files changed, 812 insertions(+), 32 deletions(-) create mode 100644 frontend/components/software/edit/communities/CommunityStatusBanner.tsx create mode 100644 frontend/components/software/edit/communities/FindCommunity.tsx create mode 100644 frontend/components/software/edit/communities/SoftwareCommunitiesInfo.tsx create mode 100644 frontend/components/software/edit/communities/SoftwareCommunityList.tsx create mode 100644 frontend/components/software/edit/communities/SoftwareCommunityListItem.tsx create mode 100644 frontend/components/software/edit/communities/apiSoftwareCommunities.ts create mode 100644 frontend/components/software/edit/communities/config.ts create mode 100644 frontend/components/software/edit/communities/index.tsx create mode 100644 frontend/components/software/edit/communities/useSoftwareCommunities.tsx diff --git a/database/124-community-views.sql b/database/124-community-views.sql index ad4aa5843..d81d3ff91 100644 --- a/database/124-community-views.sql +++ b/database/124-community-views.sql @@ -412,3 +412,52 @@ GROUP BY license ; $$; + +-- GET COMMUNITIES OF SPECIFIC SOFTWARE +-- for software-edit-section +CREATE FUNCTION communities_of_software(software_id UUID) RETURNS TABLE ( + id UUID, + slug VARCHAR, + status request_status, + name VARCHAR, + short_description VARCHAR, + logo_id VARCHAR, + primary_maintainer UUID, + software_cnt BIGINT, + pending_cnt BIGINT, + rejected_cnt BIGINT, + keywords CITEXT[], + description VARCHAR, + created_at TIMESTAMPTZ +) LANGUAGE sql STABLE AS +$$ +SELECT + community.id, + community.slug, + software_for_community.status, + community."name", + community.short_description, + community.logo_id, + community.primary_maintainer, + software_count_by_community.software_cnt, + pending_count_by_community.pending_cnt, + rejected_count_by_community.rejected_cnt, + keyword_filter_for_community.keywords, + community.description, + community.created_at +FROM + community +LEFT JOIN + software_count_by_community() ON community.id = software_count_by_community.community +LEFT JOIN + pending_count_by_community() ON community.id = pending_count_by_community.community +LEFT JOIN + rejected_count_by_community() ON community.id = rejected_count_by_community.community +LEFT JOIN + keyword_filter_for_community() ON community.id = keyword_filter_for_community.community +INNER JOIN + software_for_community ON community.id = software_for_community.community +WHERE + software_for_community.software = software_id +; +$$; diff --git a/database/999-add-categories.sql.example b/database/999-add-categories.sql.example index f2e338a65..34b7d226d 100644 --- a/database/999-add-categories.sql.example +++ b/database/999-add-categories.sql.example @@ -17,7 +17,7 @@ AS $$ DECLARE parent3 uuid; BEGIN INSERT INTO category(short_name, name, properties) VALUES - ('Research fruits', 'Some simple research fruits', "{icon:'science'}"::json) RETURNING id INTO parent1; + ('Research fruits', 'Some simple research fruits', '{"icon":"science"}'::json) RETURNING id INTO parent1; -- INSERT INTO category(parent, short_name, name) VALUES (parent1, 'Apple', 'Apple: An apple a day keeps...'), diff --git a/frontend/__tests__/SoftwareEditPage.test.tsx b/frontend/__tests__/SoftwareEditPage.test.tsx index 3b27db16e..74654820c 100644 --- a/frontend/__tests__/SoftwareEditPage.test.tsx +++ b/frontend/__tests__/SoftwareEditPage.test.tsx @@ -16,6 +16,8 @@ import {initialState as softwareState} from '~/components/software/edit/editSoft import {editSoftwarePage} from '~/components/software/edit/editSoftwarePages' import editSoftwareData from '~/components/software/edit/information/__mocks__/useSoftwareTableData.json' import {softwareInformation as config} from '~/components/software/edit/editSoftwareConfig' +import defaultSettings from '~/config/defaultSettings.json' +import {RsdSettingsState} from '~/config/rsdSettingsReducer' // MOCKS // we mock default providers used in page header @@ -116,8 +118,8 @@ describe('pages/software/[slug]/edit/[page].tsx', () => { await waitForElementToBeRemoved(screen.getByRole('progressbar')) //validate all nav items shown - const navItems = screen.getAllByTestId('edit-software-nav-item') - expect(navItems.length).toEqual(editSoftwarePage.length) + // const navItems = screen.getAllByTestId('edit-software-nav-item') + // expect(navItems.length).toEqual(editSoftwarePage.length) // wait for info loader to be removed // await waitForElementToBeRemoved(screen.getByRole('progressbar')) @@ -131,4 +133,32 @@ describe('pages/software/[slug]/edit/[page].tsx', () => { }) expect(brand_name).toHaveValue(editSoftwareData.brand_name) }) + + it('does not render communities menu option', async () => { + // return isMaintainer + mockIsMaintainer.mockResolvedValueOnce(true) + // module list without "communities" + defaultSettings.host.modules = ['software','projects','organisations'] + // nav options without communities + const editSoftwareNavItems = editSoftwarePage.filter(item=>item.id!=='communities') + // render components + render( + + + + + + + + ) + // wait for loader to be removed + await waitForElementToBeRemoved(screen.getByRole('progressbar')) + + //validate all nav items shown + const navItems = screen.getAllByTestId('edit-software-nav-item') + expect(navItems.length).toEqual(editSoftwareNavItems.length) + }) }) diff --git a/frontend/components/communities/software/card/useAdminMenuOptions.tsx b/frontend/components/communities/software/card/useAdminMenuOptions.tsx index abb2f68f4..33e9b5bf6 100644 --- a/frontend/components/communities/software/card/useAdminMenuOptions.tsx +++ b/frontend/components/communities/software/card/useAdminMenuOptions.tsx @@ -26,11 +26,22 @@ export default function useAdminMenuOptions({ let abort = false if (typeof status !='undefined') { const options: IconBtnMenuOption[] = [] - switch(status){ - case 'approved': - - } - if (status === 'approved') { + // accept/reject pending requests + if (status==='pending'){ + options.push({ + type: 'action', + key: 'approve', + label: 'Allow affiliation', + icon: , + action: {type: 'APPROVE'} + },{ + type: 'action', + key: 'deny', + label: 'Reject affiliation', + icon: , + action: {type: 'DENY'} + }) + } else if (status === 'approved') { options.push({ type: 'action', key: 'deny', @@ -39,6 +50,7 @@ export default function useAdminMenuOptions({ action: {type: 'DENY'} }) } else { + // rejected status options.push({ type: 'action', key: 'approve', diff --git a/frontend/components/software/edit/EditSoftwareNav.tsx b/frontend/components/software/edit/EditSoftwareNav.tsx index 7d3dde9f6..54cb153bf 100644 --- a/frontend/components/software/edit/EditSoftwareNav.tsx +++ b/frontend/components/software/edit/EditSoftwareNav.tsx @@ -14,33 +14,42 @@ import ListItemText from '@mui/material/ListItemText' import {editMenuItemButtonSx} from '~/config/menuItems' import {editSoftwarePage} from './editSoftwarePages' +import useRsdSettings from '~/config/useRsdSettings' export default function EditSoftwareNav({slug,pageId}:{slug:string,pageId:string}) { const router = useRouter() + const {host} = useRsdSettings() + + // default is true to follow useMenuItems approach + const showCommunities = host.modules ? host.modules.includes('communities') : true return ( diff --git a/frontend/components/software/edit/communities/CommunityStatusBanner.tsx b/frontend/components/software/edit/communities/CommunityStatusBanner.tsx new file mode 100644 index 000000000..c3dc88285 --- /dev/null +++ b/frontend/components/software/edit/communities/CommunityStatusBanner.tsx @@ -0,0 +1,43 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {CommunityRequestStatus} from '~/components/communities/software/apiCommunitySoftware' + +type CommunityStatusBannerProps = { + readonly status: CommunityRequestStatus + readonly width?: string + readonly borderRadius?: string + readonly letterSpacing?: string +} + +export default function CommunityStatusBanner({ + status, + width = '100%', + borderRadius = '0 0.5rem 0.5rem 0', + letterSpacing = '0.125rem' +}: CommunityStatusBannerProps){ + + let classes:string + + switch(status){ + case 'approved': + classes = 'bg-success' + break + case 'rejected': + classes = 'bg-error' + break + default: + classes = 'bg-warning' + } + + return ( +
    + {status} +
    + ) +} diff --git a/frontend/components/software/edit/communities/FindCommunity.tsx b/frontend/components/software/edit/communities/FindCommunity.tsx new file mode 100644 index 000000000..134f7d6d0 --- /dev/null +++ b/frontend/components/software/edit/communities/FindCommunity.tsx @@ -0,0 +1,153 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {HTMLAttributes, useState} from 'react' + +import {useSession} from '~/auth' +import logger from '~/utils/logger' +import AsyncAutocompleteSC, {AutocompleteOption} from '~/components/form/AsyncAutocompleteSC' +import {CommunityListProps, getCommunityList} from '~/components/communities/apiCommunities' +import {config} from './config' + +type FindCommunityProps={ + readonly onAdd: (item: CommunityListProps) => void, +} + +export default function FindCommunity({onAdd}:FindCommunityProps) { + const {token} = useSession() + const [options, setOptions] = useState[]>([]) + const [status, setStatus] = useState<{ + loading: boolean, + foundFor: string | undefined + }>({ + loading: false, + foundFor: undefined + }) + + async function searchCommunity(searchFor: string) { + setStatus({loading:true,foundFor:undefined}) + const {communities} = await getCommunityList({ + page: 0, + rows: 100, + searchFor, + token + }) + const options = communities.map(item=>{ + return { + key: item.id, + label: item.name, + data: item + } + }) + // set options + setOptions(options ?? []) + // stop loading + setStatus({ + loading: false, + foundFor: searchFor + }) + } + + function clearSearch() { + // reset + setStatus({ + loading: false, + foundFor: undefined + }) + setOptions([]) + } + + function onAddCommunity(selected:AutocompleteOption) { + if (selected && selected.data) { + onAdd({ + ...selected.data + }) + // reset + clearSearch() + } + } + + function createCommunity(newInputValue: string) { + // onCreate(newInputValue) + logger('create not support','warn') + } + + function renderAddOption(props: HTMLAttributes, + option: AutocompleteOption) { + // if more than one option we add border at the bottom + // we assume that first option is Add "new item" + if (options.length > 1) { + if (props?.className) { + props.className+=' mb-2 border-b' + } else { + props.className='mb-2 border-b' + } + } + return ( +
  • + {/* if new option (has input) show label and count */} + {`Add "${option.label}"`} +
  • + ) + } + + function renderOption(props: HTMLAttributes, + option: AutocompleteOption) { + // when value is not found option returns input prop + // if (option?.input) { + // // if input is over minLength + // if (option?.input.length > config.findCommunity.validation.minLength) { + // // we offer an option to create this entry + // return renderAddOption(props,option) + // } else { + // return null + // } + // } + return ( +
  • + {/* */} +
    +
    {option.label}
    +
    + {option.data.short_description} +
    + {/*
    + {option.data.keywords?.join(' ')} +
    */} +
    +
  • + ) + } + + return ( +
    + +
    + ) +} diff --git a/frontend/components/software/edit/communities/SoftwareCommunitiesInfo.tsx b/frontend/components/software/edit/communities/SoftwareCommunitiesInfo.tsx new file mode 100644 index 000000000..437267926 --- /dev/null +++ b/frontend/components/software/edit/communities/SoftwareCommunitiesInfo.tsx @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import Alert from '@mui/material/Alert' +import AlertTitle from '@mui/material/AlertTitle' + +export default function SoftwareCommunitiesInfo() { + return ( + + How to join a community? +

    + Use search to find the community you want to join. + After you select community, it is added to your community list with the initial status of pending request. +

    +

    + Your software will be listed in the request section of the community for community administrators to approve your request. + The community maintainer will inspect your request and approve or deny your membership. +

    +

    + The status of your community requests is shown in the overview in the top right corner and will one of the following: + pending, accepted or rejected. +

    +
    + ) +} diff --git a/frontend/components/software/edit/communities/SoftwareCommunityList.tsx b/frontend/components/software/edit/communities/SoftwareCommunityList.tsx new file mode 100644 index 000000000..344fbff79 --- /dev/null +++ b/frontend/components/software/edit/communities/SoftwareCommunityList.tsx @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import Alert from '@mui/material/Alert' +import AlertTitle from '@mui/material/AlertTitle' +import List from '@mui/material/List' + +import {CommunitiesOfSoftware} from './apiSoftwareCommunities' +import SoftwareCommunityListItem from './SoftwareCommunityListItem' + +type OrganisationListProps = { + readonly communities: CommunitiesOfSoftware[] + readonly onDelete: (id: string) => void +} + +export default function SoftwareCommunityList({communities,onDelete}:OrganisationListProps) { + + if (communities.length === 0) { + return ( + + No community membership + Apply for community membership using search! + + ) + } + + return ( + + {communities.map((item)=>)} + + ) +} diff --git a/frontend/components/software/edit/communities/SoftwareCommunityListItem.tsx b/frontend/components/software/edit/communities/SoftwareCommunityListItem.tsx new file mode 100644 index 000000000..8beacaba2 --- /dev/null +++ b/frontend/components/software/edit/communities/SoftwareCommunityListItem.tsx @@ -0,0 +1,86 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import ListItem from '@mui/material/ListItem' +import ListItemAvatar from '@mui/material/ListItemAvatar' +import Avatar from '@mui/material/Avatar' +import ListItemText from '@mui/material/ListItemText' +import IconButton from '@mui/material/IconButton' +import DeleteIcon from '@mui/icons-material/Delete' + +import {getImageUrl} from '~/utils/editImage' +import {CommunitiesOfSoftware} from './apiSoftwareCommunities' +import CommunityStatusBanner from './CommunityStatusBanner' + +type SoftwareCommunityItemProps={ + community: CommunitiesOfSoftware + onDelete: (id: string) => void +} + +export default function SoftwareCommunityListItem({community,onDelete}:SoftwareCommunityItemProps) { + return ( + { + onDelete(community.id) + }} + sx={{marginRight: '1rem'}} + > + + + } + sx={{ + // position:'relative', + // this makes space for buttons + paddingRight:'7.5rem', + '&:hover': { + backgroundColor:'grey.100' + }, + }} + > +
    + +
    + + + {community.name.slice(0,3)} + + + + {community.name} +
    + } + secondary={community.short_description} + /> + + ) +} diff --git a/frontend/components/software/edit/communities/apiSoftwareCommunities.ts b/frontend/components/software/edit/communities/apiSoftwareCommunities.ts new file mode 100644 index 000000000..632193f22 --- /dev/null +++ b/frontend/components/software/edit/communities/apiSoftwareCommunities.ts @@ -0,0 +1,104 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import logger from '~/utils/logger' +import {createJsonHeaders, extractReturnMessage, getBaseUrl} from '~/utils/fetchHelpers' +import {CommunityListProps} from '~/components/communities/apiCommunities' +import {CommunityRequestStatus} from '~/components/communities/software/apiCommunitySoftware' + +export type CommunitiesOfSoftware = CommunityListProps & { + status: CommunityRequestStatus +} + +export async function getCommunitiesForSoftware({software,token}:{software:string,token:string}){ + try{ + const query = `rpc/communities_of_software?software_id=${software}&order=name.asc` + const url = `${getBaseUrl()}/${query}` + + const resp = await fetch(url, { + method: 'GET', + headers: { + ...createJsonHeaders(token) + }, + }) + + if (resp.status === 200) { + const json: CommunitiesOfSoftware[] = await resp.json() + return json + } + + // otherwise request failed + logger(`getCommunitiesForSoftware: ${resp.status} ${resp.statusText}`, 'warn') + return [] + + }catch(e:any){ + logger(`getCommunitiesForSoftware: ${e?.message}`, 'error') + return [] + } +} + +type RequestToJoinCommunity={ + software:string, + community:string, + token:string +} + +export async function requestToJoinCommunity({software,community,token}:RequestToJoinCommunity){ + try{ + const url = `${getBaseUrl()}/software_for_community` + + const resp = await fetch(url, { + method: 'POST', + headers: { + ...createJsonHeaders(token) + }, + body:JSON.stringify({ + software, + community + }) + }) + + return extractReturnMessage(resp,community) + + }catch(e:any){ + logger(`requestToJoinCommunity: ${e?.message}`, 'error') + return { + status: 500, + message: e.message + } + } +} + +export async function removeSoftwareFromCommunity({software,community,token}:RequestToJoinCommunity){ + try{ + if (software && community){ + const query = `software=eq.${software}&community=eq.${community}` + const url = `${getBaseUrl()}/software_for_community?${query}` + + const resp = await fetch(url, { + method: 'DELETE', + headers: { + ...createJsonHeaders(token) + }, + body:JSON.stringify({ + software, + community + }) + }) + return extractReturnMessage(resp,community) + }else{ + return { + status: 400, + message: 'Missing software OR community id' + } + } + }catch(e:any){ + logger(`requestToJoinCommunity: ${e?.message}`, 'error') + return { + status: 500, + message: e.message + } + } +} diff --git a/frontend/components/software/edit/communities/config.ts b/frontend/components/software/edit/communities/config.ts new file mode 100644 index 000000000..13981f82a --- /dev/null +++ b/frontend/components/software/edit/communities/config.ts @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +export const config = { + title: 'Your communities', + findCommunity: { + title: 'Join community', + subtitle: 'We search by community name in the RSD', + label: 'Find RSD community', + help: 'At least the first 2 letters of the community name', + validation: { + // custom validation rule, not in use by react-hook-form + minLength: 2, + } + }, +} + +export default config diff --git a/frontend/components/software/edit/communities/index.tsx b/frontend/components/software/edit/communities/index.tsx new file mode 100644 index 000000000..f3f22d4d4 --- /dev/null +++ b/frontend/components/software/edit/communities/index.tsx @@ -0,0 +1,112 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useState} from 'react' + +import ConfirmDeleteModal from '~/components/layout/ConfirmDeleteModal' +import EditSection from '~/components/layout/EditSection' +import EditSectionTitle from '~/components/layout/EditSectionTitle' +import ContentLoader from '~/components/layout/ContentLoader' +import useSoftwareContext from '~/components/software/edit/useSoftwareContext' +import {CommunityListProps} from '~/components/communities/apiCommunities' +import config from './config' +import {useSoftwareCommunities} from './useSoftwareCommunities' +import FindCommunity from './FindCommunity' +import SoftwareCommunityList from './SoftwareCommunityList' +import SoftwareCommunitiesInfo from './SoftwareCommunitiesInfo' + +export default function SoftwareCommunities() { + const {software} = useSoftwareContext() + const {loading,communities,joinCommunity,leaveCommunity} = useSoftwareCommunities(software.id) + const [modal, setModal] = useState<{ + open: boolean, + id: string | null, + name: string | null + }>({ + open: false, + id: null, + name: null + }) + + // if loading show loader + if (loading) return ( + + ) + + + function onDeleteCommunity(id:string){ + const com = communities.find(item=>item.id===id) + if (com){ + setModal({ + open: true, + id: com.id, + name: com.name + }) + } + } + + function deleteCommunity(id:string){ + // console.log('deleteCommunity...', id) + leaveCommunity({ + software:software.id, + community: id + }) + } + + function onAddCommunity(community:CommunityListProps){ + // console.log('onAddCommunity...', community) + joinCommunity({ + software:software.id, + community + }) + } + + return ( + <> + +
    +

    + {config.title} + {communities?.length ?? 0} +

    + +
    +
    + + + + + +
    +
    + {modal.open && + Are you sure you want to remove {modal.name ?? ''}?

    + } + onCancel={()=>setModal({open:false,id:null,name:null})} + onDelete={()=>{ + // only if id present + if(modal.id) { + deleteCommunity(modal.id) + } + // we close modal anyway + setModal({open:false,id:null,name:null}) + }} + /> + } + + ) +} diff --git a/frontend/components/software/edit/communities/useSoftwareCommunities.tsx b/frontend/components/software/edit/communities/useSoftwareCommunities.tsx new file mode 100644 index 000000000..fa04284cb --- /dev/null +++ b/frontend/components/software/edit/communities/useSoftwareCommunities.tsx @@ -0,0 +1,85 @@ +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center +// +// SPDX-License-Identifier: Apache-2.0 + +import {useCallback, useEffect, useState} from 'react' + +import {useSession} from '~/auth' +import useSnackbar from '~/components/snackbar/useSnackbar' +import {CommunityListProps} from '~/components/communities/apiCommunities' +import {CommunityRequestStatus} from '~/components/communities/software/apiCommunitySoftware' +import { + CommunitiesOfSoftware, getCommunitiesForSoftware, + removeSoftwareFromCommunity, requestToJoinCommunity +} from './apiSoftwareCommunities' + +export function useSoftwareCommunities(software:string){ + const {token} = useSession() + const [loading,setLoading] = useState(true) + const [communities,setCommunities] = useState([]) + const {showErrorMessage} = useSnackbar() + + useEffect(()=>{ + if (software && token){ + getCommunitiesForSoftware({ + software, + token + }) + .then(data=>{ + setCommunities(data) + }) + .finally(()=>setLoading(false)) + } + },[software,token]) + + const joinCommunity = useCallback(async({software,community}:{software:string,community:CommunityListProps})=>{ + const resp = await requestToJoinCommunity({ + software, + community:community.id, + token + }) + // update if added + if (resp.status===200){ + setCommunities((data)=>{ + return [ + ...data, + { + ...community, + status: 'pending' as CommunityRequestStatus + } + ] + }) + } else { + showErrorMessage(`Failed to join community ${community.name}. ${resp.message}`) + } + // ignore showErrorMessage dependency + // eslint-disable-next-line react-hooks/exhaustive-deps + },[token]) + + const leaveCommunity = useCallback(async({software,community}:{software:string,community:string})=>{ + const resp = await removeSoftwareFromCommunity({ + software, + community, + token + }) + // update if deleted + if (resp.status===200){ + setCommunities((data)=>{ + const newData = data.filter(item=>item.id!==community) + return newData + }) + } else { + showErrorMessage(`Failed to leave community. ${resp.message}`) + } + // ignore showErrorMessage dependency + // eslint-disable-next-line react-hooks/exhaustive-deps + },[token]) + + return{ + communities, + loading, + joinCommunity, + leaveCommunity + } +} diff --git a/frontend/components/software/edit/editSoftwarePages.tsx b/frontend/components/software/edit/editSoftwarePages.tsx index 207067084..7a0749ea0 100644 --- a/frontend/components/software/edit/editSoftwarePages.tsx +++ b/frontend/components/software/edit/editSoftwarePages.tsx @@ -20,6 +20,8 @@ import MiscellaneousServicesIcon from '@mui/icons-material/MiscellaneousServices import JoinInnerIcon from '@mui/icons-material/JoinInner' import DonutLargeIcon from '@mui/icons-material/DonutLarge' import ArticleIcon from '@mui/icons-material/Article' +import Diversity3Icon from '@mui/icons-material/Diversity3' + // use dynamic imports instead const SoftwareContributors = dynamic(() => import('./contributors'),{ @@ -37,7 +39,7 @@ const SoftwareMaintainers = dynamic(() => import('./maintainers'),{ const SoftwareMentions = dynamic(() => import('./mentions'),{ loading: ()=> }) -const SoftwareOgranisations = dynamic(() => import('./organisations'),{ +const SoftwareOrganisations = dynamic(() => import('./organisations'),{ loading: ()=> }) const PackageManagers = dynamic(() => import('./package-managers'),{ @@ -55,6 +57,9 @@ const SoftwareTestimonials = dynamic(() => import('./testimonials'),{ const SoftwareServices = dynamic(() => import('./services'),{ loading: ()=> }) +const SoftwareCommunities = dynamic(() => import('./communities'),{ + loading: ()=> +}) export type EditSoftwarePageProps = { @@ -87,7 +92,7 @@ export const editSoftwarePage:EditSoftwarePageProps[] = [{ id: 'organisations', label: 'Organisations', icon: , - render: () => , + render: () => , status: '' },{ id: 'mentions', @@ -119,6 +124,12 @@ export const editSoftwarePage:EditSoftwarePageProps[] = [{ icon: , render: () => , status: '' +},{ + id: 'communities', + label: 'Communities', + icon: , + render: () => , + status: '' },{ id: 'maintainers', label: 'Maintainers', diff --git a/frontend/components/software/edit/organisations/index.tsx b/frontend/components/software/edit/organisations/index.tsx index 8f1a53211..7717ebab4 100644 --- a/frontend/components/software/edit/organisations/index.tsx +++ b/frontend/components/software/edit/organisations/index.tsx @@ -1,8 +1,8 @@ // SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 - 2023 dv4all -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 @@ -44,7 +44,7 @@ export type EditOrganisationModalProps = ModalProps & { organisation?: EditOrganisation } -export default function SoftwareOganisations() { +export default function SoftwareOrganisations() { const {token,user} = useSession() const {showInfoMessage,showErrorMessage} = useSnackbar() const {software} = useSoftwareContext() @@ -62,7 +62,7 @@ export default function SoftwareOganisations() { } }) - // console.group('SoftwareOganisations') + // console.group('SoftwareOrganisations') // console.log('loading...', loading) // console.log('organisations...', organisations) // console.groupEnd() From b65b958c1c009b4affabf7e12c7f796a83e82e80 Mon Sep 17 00:00:00 2001 From: "Dusan Mijatovic (PC2020)" Date: Mon, 10 Jun 2024 11:54:30 +0200 Subject: [PATCH 7/9] chore: update deployment settings.json. chore: bump rsd-frontent verion. chore: next.js to latest version --- deployment/rsd/data/settings.json | 8 +- deployment/rsd/data/settings.json.license | 4 +- docker-compose.yml | 2 +- frontend/package.json | 4 +- frontend/yarn.lock | 140 +++++++++++----------- 5 files changed, 83 insertions(+), 75 deletions(-) diff --git a/deployment/rsd/data/settings.json b/deployment/rsd/data/settings.json index d58a0d6d7..9e2161781 100644 --- a/deployment/rsd/data/settings.json +++ b/deployment/rsd/data/settings.json @@ -14,9 +14,11 @@ "terms_of_service_url": "/page/terms-of-service/", "privacy_statement_url": "/page/privacy-statement/", "software_highlights": { - "title": "Software Highlights", - "description": null - } + "title": "Software Highlights", + "limit": 5, + "description": null + }, + "modules":["software","projects","organisations"] }, "links": [ { diff --git a/deployment/rsd/data/settings.json.license b/deployment/rsd/data/settings.json.license index 1ed030337..3dd20f7f9 100644 --- a/deployment/rsd/data/settings.json.license +++ b/deployment/rsd/data/settings.json.license @@ -1,6 +1,6 @@ SPDX-FileCopyrightText: 2022 - 2023 Dusan Mijatovic (dv4all) SPDX-FileCopyrightText: 2022 - 2023 dv4all -SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) -SPDX-FileCopyrightText: 2023 Netherlands eScience Center +SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center SPDX-License-Identifier: Apache-2.0 diff --git a/docker-compose.yml b/docker-compose.yml index 6a9e22076..e1413200d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -110,7 +110,7 @@ services: # dockerfile to use for build dockerfile: Dockerfile # update version number to correspond to frontend/package.json - image: rsd/frontend:2.8.4 + image: rsd/frontend:2.16.0 environment: # it uses values from .env file - POSTGREST_URL diff --git a/frontend/package.json b/frontend/package.json index 2e17de2b1..9c63a490d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "rsd-frontend", - "version": "2.8.1", + "version": "2.16.0", "private": true, "scripts": { "dev": "next dev", @@ -32,7 +32,7 @@ "cookie": "0.5.0", "d3": "7.8.2", "jsonwebtoken": "9.0.0", - "next": "14.1.0", + "next": "14.2.3", "nprogress": "0.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index b8b0c71e6..5216dcf11 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1607,10 +1607,10 @@ prop-types "^15.8.1" react-is "^18.2.0" -"@next/env@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.0.tgz#43d92ebb53bc0ae43dcc64fb4d418f8f17d7a341" - integrity sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw== +"@next/env@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.3.tgz#d6def29d1c763c0afb397343a15a82e7d92353a0" + integrity sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA== "@next/eslint-plugin-next@14.0.4": version "14.0.4" @@ -1619,50 +1619,50 @@ dependencies: glob "7.1.7" -"@next/swc-darwin-arm64@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz#70a57c87ab1ae5aa963a3ba0f4e59e18f4ecea39" - integrity sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ== - -"@next/swc-darwin-x64@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz#0863a22feae1540e83c249384b539069fef054e9" - integrity sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g== - -"@next/swc-linux-arm64-gnu@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz#893da533d3fce4aec7116fe772d4f9b95232423c" - integrity sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ== - -"@next/swc-linux-arm64-musl@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz#d81ddcf95916310b8b0e4ad32b637406564244c0" - integrity sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g== - -"@next/swc-linux-x64-gnu@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz#18967f100ec19938354332dcb0268393cbacf581" - integrity sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ== - -"@next/swc-linux-x64-musl@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz#77077cd4ba8dda8f349dc7ceb6230e68ee3293cf" - integrity sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg== - -"@next/swc-win32-arm64-msvc@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz#5f0b8cf955644104621e6d7cc923cad3a4c5365a" - integrity sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ== - -"@next/swc-win32-ia32-msvc@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz#21f4de1293ac5e5a168a412b139db5d3420a89d0" - integrity sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw== - -"@next/swc-win32-x64-msvc@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz#e561fb330466d41807123d932b365cf3d33ceba2" - integrity sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg== +"@next/swc-darwin-arm64@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz#db1a05eb88c0224089b815ad10ac128ec79c2cdb" + integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== + +"@next/swc-darwin-x64@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz#a3f8af05b5f9a52ac3082e66ac29e125ab1d7b9c" + integrity sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA== + +"@next/swc-linux-arm64-gnu@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz#4e63f43879285b52554bfd39e6e0cc78a9b27bbf" + integrity sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA== + +"@next/swc-linux-arm64-musl@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz#ebdaed26214448b1e6f2c3e8b3cd29bfba387990" + integrity sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw== + +"@next/swc-linux-x64-gnu@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz#19e3bcc137c3b582a1ab867106817e5c90a20593" + integrity sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w== + +"@next/swc-linux-x64-musl@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz#794a539b98e064169cf0ff7741b2a4fb16adec7d" + integrity sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ== + +"@next/swc-win32-arm64-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz#eda9fa0fbf1ff9113e87ac2668ee67ce9e5add5a" + integrity sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A== + +"@next/swc-win32-ia32-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz#7c1190e3f640ab16580c6bdbd7d0e766b9920457" + integrity sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw== + +"@next/swc-win32-x64-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz#2be4e39ee25bfbd85be78eea17c0e7751dc4323c" + integrity sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1820,11 +1820,17 @@ "@svgr/plugin-jsx" "8.0.1" "@svgr/plugin-svgo" "8.0.1" -"@swc/helpers@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" - integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/helpers@0.5.5": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.5.tgz#12689df71bfc9b21c4f4ca00ae55f2f16c8b77c0" + integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== dependencies: + "@swc/counter" "^0.1.3" tslib "^2.4.0" "@tailwindcss/typography@0.5.9": @@ -6229,28 +6235,28 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -next@14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/next/-/next-14.1.0.tgz#b31c0261ff9caa6b4a17c5af019ed77387174b69" - integrity sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q== +next@14.2.3: + version "14.2.3" + resolved "https://registry.yarnpkg.com/next/-/next-14.2.3.tgz#f117dd5d5f20c307e7b8e4f9c1c97d961008925d" + integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== dependencies: - "@next/env" "14.1.0" - "@swc/helpers" "0.5.2" + "@next/env" "14.2.3" + "@swc/helpers" "0.5.5" busboy "1.6.0" caniuse-lite "^1.0.30001579" graceful-fs "^4.2.11" postcss "8.4.31" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-darwin-arm64" "14.1.0" - "@next/swc-darwin-x64" "14.1.0" - "@next/swc-linux-arm64-gnu" "14.1.0" - "@next/swc-linux-arm64-musl" "14.1.0" - "@next/swc-linux-x64-gnu" "14.1.0" - "@next/swc-linux-x64-musl" "14.1.0" - "@next/swc-win32-arm64-msvc" "14.1.0" - "@next/swc-win32-ia32-msvc" "14.1.0" - "@next/swc-win32-x64-msvc" "14.1.0" + "@next/swc-darwin-arm64" "14.2.3" + "@next/swc-darwin-x64" "14.2.3" + "@next/swc-linux-arm64-gnu" "14.2.3" + "@next/swc-linux-arm64-musl" "14.2.3" + "@next/swc-linux-x64-gnu" "14.2.3" + "@next/swc-linux-x64-musl" "14.2.3" + "@next/swc-win32-arm64-msvc" "14.2.3" + "@next/swc-win32-ia32-msvc" "14.2.3" + "@next/swc-win32-x64-msvc" "14.2.3" no-case@^3.0.4: version "3.0.4" From 3a39755069a13e9ca18b5b0d1784ca7496bb0580 Mon Sep 17 00:00:00 2001 From: "Dusan Mijatovic (PC2020)" Date: Mon, 10 Jun 2024 14:41:28 +0200 Subject: [PATCH 8/9] fix: only rsd-admin can remove rejected community request from software fix: linting errors after rebase --- .../software/card/useAdminMenuOptions.tsx | 13 +++++++++++++ .../software/card/useSoftwareCardActions.tsx | 5 ++++- frontend/components/layout/InvitationList.tsx | 2 +- .../edit/communities/SoftwareCommunityList.tsx | 15 +++++++++++++-- .../communities/SoftwareCommunityListItem.tsx | 5 +++-- frontend/public/data/settings.json | 2 +- 6 files changed, 35 insertions(+), 7 deletions(-) diff --git a/frontend/components/communities/software/card/useAdminMenuOptions.tsx b/frontend/components/communities/software/card/useAdminMenuOptions.tsx index 33e9b5bf6..be687e1db 100644 --- a/frontend/components/communities/software/card/useAdminMenuOptions.tsx +++ b/frontend/components/communities/software/card/useAdminMenuOptions.tsx @@ -6,6 +6,7 @@ import {useEffect, useState} from 'react' import RemoveCircleIcon from '@mui/icons-material/RemoveCircle' import Check from '@mui/icons-material/Check' +import PendingActionsIcon from '@mui/icons-material/PendingActions' import {IconBtnMenuOption} from '~/components/menu/IconBtnMenuOnAction' import {CommunityRequestStatus} from '../apiCommunitySoftware' @@ -48,6 +49,12 @@ export default function useAdminMenuOptions({ label: 'Reject affiliation', icon: , action: {type: 'DENY'} + },{ + type: 'action', + key: 'pending', + label: 'Postpone affiliation', + icon: , + action: {type: 'PENDING'} }) } else { // rejected status @@ -57,6 +64,12 @@ export default function useAdminMenuOptions({ label: 'Allow affiliation', icon: , action: {type: 'APPROVE'} + },{ + type: 'action', + key: 'pending', + label: 'Postpone affiliation', + icon: , + action: {type: 'PENDING'} }) } if (abort) return diff --git a/frontend/components/communities/software/card/useSoftwareCardActions.tsx b/frontend/components/communities/software/card/useSoftwareCardActions.tsx index 0fe8aaeda..d6e62d93b 100644 --- a/frontend/components/communities/software/card/useSoftwareCardActions.tsx +++ b/frontend/components/communities/software/card/useSoftwareCardActions.tsx @@ -19,7 +19,7 @@ export type SoftwareCardWithMenuProps = { } export type SoftwareMenuAction = { - type: 'APPROVE' | 'DENY', + type: 'APPROVE' | 'DENY' | 'PENDING', payload?: string } @@ -63,6 +63,9 @@ export function useSoftwareCardActions({software}: SoftwareCardWithMenuProps) { case 'DENY': setStatus('rejected') break + case 'PENDING': + setStatus('pending') + break default: logger(`Action type ${action.type} NOT SUPPORTED. Check your spelling.`, 'warn') } diff --git a/frontend/components/layout/InvitationList.tsx b/frontend/components/layout/InvitationList.tsx index 4a00411b4..dcc5f6c8d 100644 --- a/frontend/components/layout/InvitationList.tsx +++ b/frontend/components/layout/InvitationList.tsx @@ -68,7 +68,7 @@ export default function InvitationList({invitations, token, onDeleteCallback}: { const expiresAt = new Date(inv.expires_at) const daysValid = Math.ceil((expiresAt.valueOf() - now.valueOf()) / (1000 * 60 * 60 * 24)) let expiredText: string - expiredText = getExpiredText(daysValid); + expiredText = getExpiredText(daysValid) return ( diff --git a/frontend/components/software/edit/communities/SoftwareCommunityList.tsx b/frontend/components/software/edit/communities/SoftwareCommunityList.tsx index 344fbff79..68c7c6a41 100644 --- a/frontend/components/software/edit/communities/SoftwareCommunityList.tsx +++ b/frontend/components/software/edit/communities/SoftwareCommunityList.tsx @@ -7,6 +7,7 @@ import Alert from '@mui/material/Alert' import AlertTitle from '@mui/material/AlertTitle' import List from '@mui/material/List' +import {useSession} from '~/auth' import {CommunitiesOfSoftware} from './apiSoftwareCommunities' import SoftwareCommunityListItem from './SoftwareCommunityListItem' @@ -16,7 +17,7 @@ type OrganisationListProps = { } export default function SoftwareCommunityList({communities,onDelete}:OrganisationListProps) { - + const {user} = useSession() if (communities.length === 0) { return ( @@ -28,7 +29,17 @@ export default function SoftwareCommunityList({communities,onDelete}:Organisatio return ( - {communities.map((item)=>)} + { + communities.map(item =>{ + // software maintainer cannot remove rejected community status + if (user?.role !== 'rsd_admin' && item.status==='rejected') { + return + } + return ( + + ) + }) + } ) } diff --git a/frontend/components/software/edit/communities/SoftwareCommunityListItem.tsx b/frontend/components/software/edit/communities/SoftwareCommunityListItem.tsx index 8beacaba2..f2c0132c6 100644 --- a/frontend/components/software/edit/communities/SoftwareCommunityListItem.tsx +++ b/frontend/components/software/edit/communities/SoftwareCommunityListItem.tsx @@ -16,7 +16,7 @@ import CommunityStatusBanner from './CommunityStatusBanner' type SoftwareCommunityItemProps={ community: CommunitiesOfSoftware - onDelete: (id: string) => void + onDelete?: (id: string) => void } export default function SoftwareCommunityListItem({community,onDelete}:SoftwareCommunityItemProps) { @@ -30,9 +30,10 @@ export default function SoftwareCommunityListItem({community,onDelete}:SoftwareC edge="end" aria-label="delete" onClick={() => { - onDelete(community.id) + if (onDelete) onDelete(community.id) }} sx={{marginRight: '1rem'}} + disabled={typeof onDelete == 'undefined'} > diff --git a/frontend/public/data/settings.json b/frontend/public/data/settings.json index c4083b2bb..6b08a57fc 100644 --- a/frontend/public/data/settings.json +++ b/frontend/public/data/settings.json @@ -18,7 +18,7 @@ "limit": 5, "description": null }, - "modules":["software","projects","organisations"] + "modules":["software","projects","organisations","communities"] }, "links": [ { From c4b96c4debe94a5037478dfa79ba002e5f3c3052 Mon Sep 17 00:00:00 2001 From: "Dusan Mijatovic (PC2020)" Date: Mon, 10 Jun 2024 17:17:32 +0200 Subject: [PATCH 9/9] refactor: use utc timezone, enable expiration date for community maintainers, improve link button on invite confirmation page --- database/015-create-maintainer-tables.sql | 7 +- database/024-community.sql | 6 +- frontend/components/layout/InvitationList.tsx | 83 ------------------- .../components/maintainers/InvitationList.tsx | 15 +++- frontend/pages/invite/community/[id].tsx | 32 +++++-- frontend/pages/invite/organisation/[id].tsx | 31 +++++-- frontend/pages/invite/project/[id].tsx | 38 ++++++--- frontend/pages/invite/software/[id].tsx | 40 ++++++--- frontend/public/data/settings.json | 2 +- 9 files changed, 129 insertions(+), 125 deletions(-) delete mode 100644 frontend/components/layout/InvitationList.tsx diff --git a/database/015-create-maintainer-tables.sql b/database/015-create-maintainer-tables.sql index da1964410..ffc428df4 100644 --- a/database/015-create-maintainer-tables.sql +++ b/database/015-create-maintainer-tables.sql @@ -2,6 +2,7 @@ -- SPDX-FileCopyrightText: 2021 - 2024 Netherlands eScience Center -- SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) -- SPDX-FileCopyrightText: 2022 dv4all +-- SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) -- -- SPDX-License-Identifier: Apache-2.0 @@ -32,7 +33,7 @@ CREATE TABLE invite_maintainer_for_project ( claimed_by UUID REFERENCES account (id), claimed_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT LOCALTIMESTAMP, - expires_at TIMESTAMP NOT NULL GENERATED ALWAYS AS (created_at AT TIME ZONE 'UTC' + INTERVAL '31 days') STORED + expires_at TIMESTAMPTZ NOT NULL GENERATED ALWAYS AS (created_at AT TIME ZONE 'UTC' + INTERVAL '31 days') STORED ); CREATE FUNCTION sanitise_insert_invite_maintainer_for_project() RETURNS TRIGGER LANGUAGE plpgsql AS @@ -107,7 +108,7 @@ CREATE TABLE invite_maintainer_for_software ( claimed_by UUID REFERENCES account (id), claimed_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT LOCALTIMESTAMP, - expires_at TIMESTAMP NOT NULL GENERATED ALWAYS AS (created_at AT TIME ZONE 'UTC' + INTERVAL '31 days') STORED + expires_at TIMESTAMPTZ NOT NULL GENERATED ALWAYS AS (created_at AT TIME ZONE 'UTC' + INTERVAL '31 days') STORED ); CREATE FUNCTION sanitise_insert_invite_maintainer_for_software() RETURNS TRIGGER LANGUAGE plpgsql AS @@ -185,7 +186,7 @@ CREATE TABLE invite_maintainer_for_organisation ( claimed_by UUID REFERENCES account (id), claimed_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT LOCALTIMESTAMP, - expires_at TIMESTAMP NOT NULL GENERATED ALWAYS AS (created_at AT TIME ZONE 'UTC' + INTERVAL '31 days') STORED + expires_at TIMESTAMPTZ NOT NULL GENERATED ALWAYS AS (created_at AT TIME ZONE 'UTC' + INTERVAL '31 days') STORED ); CREATE FUNCTION sanitise_insert_invite_maintainer_for_organisation() RETURNS TRIGGER LANGUAGE plpgsql AS diff --git a/database/024-community.sql b/database/024-community.sql index 5a446eedb..5fb20922e 100644 --- a/database/024-community.sql +++ b/database/024-community.sql @@ -126,7 +126,8 @@ CREATE TABLE invite_maintainer_for_community ( created_by UUID REFERENCES account (id), claimed_by UUID REFERENCES account (id), claimed_at TIMESTAMPTZ, - created_at TIMESTAMPTZ NOT NULL DEFAULT LOCALTIMESTAMP + created_at TIMESTAMPTZ NOT NULL DEFAULT LOCALTIMESTAMP, + expires_at TIMESTAMPTZ NOT NULL GENERATED ALWAYS AS (created_at AT TIME ZONE 'UTC' + INTERVAL '31 days') STORED ); CREATE FUNCTION sanitise_insert_invite_maintainer_for_community() RETURNS TRIGGER LANGUAGE plpgsql AS @@ -273,7 +274,8 @@ BEGIN RAISE EXCEPTION USING MESSAGE = 'Invitation with id ' || invitation || ' does not exist'; END IF; - IF invitation_row.claimed_by IS NOT NULL OR invitation_row.claimed_at IS NOT NULL THEN + IF invitation_row.claimed_by IS NOT NULL OR invitation_row.claimed_at IS NOT NULL OR + invitation_row.expires_at < CURRENT_TIMESTAMP THEN RAISE EXCEPTION USING MESSAGE = 'Invitation with id ' || invitation || ' is expired'; END IF; diff --git a/frontend/components/layout/InvitationList.tsx b/frontend/components/layout/InvitationList.tsx deleted file mode 100644 index dcc5f6c8d..000000000 --- a/frontend/components/layout/InvitationList.tsx +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-FileCopyrightText: 2022 - 2024 Ewan Cahen (Netherlands eScience Center) -// SPDX-FileCopyrightText: 2022 - 2024 Netherlands eScience Center -// SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) -// SPDX-FileCopyrightText: 2022 dv4all -// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) -// -// SPDX-License-Identifier: Apache-2.0 - -import List from '@mui/material/List' -import ListItem from '@mui/material/ListItem' -import CopyIcon from '@mui/icons-material/ContentCopy' -import DeleteIcon from '@mui/icons-material/Delete' -import IconButton from '@mui/material/IconButton' -import ListItemText from '@mui/material/ListItemText' - -import {createJsonHeaders} from '~/utils/fetchHelpers' -import copyToClipboard from '~/utils/copyToClipboard' -import useSnackbar from '~/components/snackbar/useSnackbar' -import {Invitation} from '../maintainers/apiMaintainers' -import EditSectionTitle from './EditSectionTitle' - -export default function InvitationList({invitations, token, onDeleteCallback}: {invitations: Invitation[], token: string, onDeleteCallback: Function}) { - const {showErrorMessage, showInfoMessage} = useSnackbar() - - async function deleteMaintainerLink(invitation: Invitation) { - const resp = await fetch(`/api/v1/invite_maintainer_for_${invitation.type}?id=eq.${invitation.id}`, { - headers: createJsonHeaders(token), - method: 'DELETE' - }) - if (resp.status !== 204) showErrorMessage('Failed to delete invitation.') - onDeleteCallback() - } - - async function toClipboard(message?: string) { - if (message) { - const copied = await copyToClipboard(message) - // notify user about copy action - if (copied) { - showInfoMessage('Copied to clipboard') - } else { - showErrorMessage(`Failed to copy link ${message}`) - } - } - } - - function getExpiredText(daysValid: number): string { - if (daysValid <= 0) { - return 'this invitation is expired' - } else if (daysValid === 1) { - return 'expires in less than a day' - } else { - return `expires in ${daysValid} days` - } - } - - if(invitations.length === 0) return null - const now = new Date() - - return ( - <> - - - {invitations.map(inv => { - const currentLink = `${location.origin}/invite/${inv.type}/${inv.id}` - const expiresAt = new Date(inv.expires_at) - const daysValid = Math.ceil((expiresAt.valueOf() - now.valueOf()) / (1000 * 60 * 60 * 24)) - let expiredText: string - expiredText = getExpiredText(daysValid) - return ( - - - toClipboard(currentLink)}> - deleteMaintainerLink(inv)}> - - ) - })} - - - ) -} diff --git a/frontend/components/maintainers/InvitationList.tsx b/frontend/components/maintainers/InvitationList.tsx index 614ab9c29..1d7126717 100644 --- a/frontend/components/maintainers/InvitationList.tsx +++ b/frontend/components/maintainers/InvitationList.tsx @@ -27,6 +27,16 @@ type InvitationListProps={ onDelete: (invitation:Invitation)=>Promise } +function getExpiredText(daysValid: number): string { + if (daysValid <= 0) { + return 'this invitation is expired' + } else if (daysValid === 1) { + return 'expires in less than a day' + } else { + return `expires in ${daysValid} days` + } +} + export default function InvitationList({subject,body,invitations,onDelete}:InvitationListProps) { const {showErrorMessage, showInfoMessage} = useSnackbar() @@ -53,6 +63,9 @@ export default function InvitationList({subject,body,invitations,onDelete}:Invit {invitations.map(inv => { const currentLink = `${location.origin}/invite/${inv.type}/${inv.id}` + const expiresAt = new Date(inv.expires_at) + const daysValid = Math.ceil((expiresAt.valueOf() - new Date().valueOf()) / (1000 * 60 * 60 * 24)) + const expiredText = getExpiredText(daysValid) return ( diff --git a/frontend/pages/invite/community/[id].tsx b/frontend/pages/invite/community/[id].tsx index f8d54f921..a469ce5c0 100644 --- a/frontend/pages/invite/community/[id].tsx +++ b/frontend/pages/invite/community/[id].tsx @@ -7,7 +7,8 @@ import {GetServerSidePropsContext} from 'next' import Head from 'next/head' -import Link from 'next/link' +import LinkIcon from '@mui/icons-material/Link' +import Button from '@mui/material/Button' import {claimCommunityMaintainerInvite} from '~/auth/api/authHelpers' import {getAccountFromToken} from '~/auth/jwtUtils' @@ -39,13 +40,30 @@ export default function InviteCommunityMaintainer({communityInfo, error}: Invite if (typeof error == 'undefined' || error === null) { return ( -

    - You are now a maintainer of {communityInfo?.name ?? 'missing'}! -   - +
    +

    + { + communityInfo?.name ? + You are now a maintainer of {communityInfo?.name} + : You are now a maintainer + } + +

    +

    + +
    ) } diff --git a/frontend/pages/invite/organisation/[id].tsx b/frontend/pages/invite/organisation/[id].tsx index 7108dac7d..beee23795 100644 --- a/frontend/pages/invite/organisation/[id].tsx +++ b/frontend/pages/invite/organisation/[id].tsx @@ -7,7 +7,8 @@ import {GetServerSidePropsContext} from 'next' import Head from 'next/head' -import Link from 'next/link' +import LinkIcon from '@mui/icons-material/Link' +import Button from '@mui/material/Button' import {claimOrganisationMaintainerInvite} from '~/auth/api/authHelpers' import {getAccountFromToken} from '~/auth/jwtUtils' @@ -39,13 +40,29 @@ export default function InviteOrganisationMaintainer({organisationInfo, error}: if (typeof error == 'undefined' || error === null) { return ( -

    - You are now a maintainer of {organisationInfo?.name ?? 'missing'}! -   - +
    +

    + { + organisationInfo?.name ? + You are now a maintainer of {organisationInfo?.name} + : You are now a maintainer + } +

    +

    + +

    wFHnU@n|_^6AkfQ(oT_>p%n{5mSMR-pk~`b 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 UwZB!)-4?viw9@<}IHJM-1D5BU7XSbN delta 517545 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%0D^0QM*HLc*E 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 %xRatulE4WNJ0HOkynL%nGeHX_G5GOfIOF8Z*en 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