diff --git a/invenio_communities/assets/semantic-ui/js/invenio_communities/community/searchComponents/CommunitiesStatusFilter.js b/invenio_communities/assets/semantic-ui/js/invenio_communities/community/searchComponents/CommunitiesStatusFilter.js new file mode 100644 index 000000000..3a9ac6773 --- /dev/null +++ b/invenio_communities/assets/semantic-ui/js/invenio_communities/community/searchComponents/CommunitiesStatusFilter.js @@ -0,0 +1,57 @@ +import { i18next } from "@translations/invenio_rdm_records/i18next"; + +import React, { Component } from "react"; + +import { Menu } from "semantic-ui-react"; +import PropTypes from "prop-types"; + +export class CommunitiesStatusFilter extends Component { + render() { + const { + myCommunitiesOnClick, + allCommunitiesOnClick, + appID, + allCommunitiesSelected, + } = this.props; + + return ( + + + {i18next.t("All")} + + + {i18next.t("My communities")} + + + ); + } +} + +CommunitiesStatusFilter.propTypes = { + allCommunitiesOnClick: PropTypes.func.isRequired, + myCommunitiesOnClick: PropTypes.func.isRequired, + allCommunitiesSelected: PropTypes.bool, + appID: PropTypes.string.isRequired, +}; + +CommunitiesStatusFilter.defaultProps = { + allCommunitiesSelected: true, +}; diff --git a/invenio_communities/assets/semantic-ui/js/invenio_communities/community/searchComponents/CommunitySelectionSearch.js b/invenio_communities/assets/semantic-ui/js/invenio_communities/community/searchComponents/CommunitySelectionSearch.js new file mode 100644 index 000000000..aaba13d49 --- /dev/null +++ b/invenio_communities/assets/semantic-ui/js/invenio_communities/community/searchComponents/CommunitySelectionSearch.js @@ -0,0 +1,221 @@ +// This file is part of Invenio-RDM +// Copyright (C) 2024 CERN. +// +// Invenio-communities is free software; you can redistribute it and/or modify it +// under the terms of the MIT License; see LICENSE file for more details. + +import { i18next } from "@translations/invenio_rdm_records/i18next"; +import React, { Component } from "react"; +import { OverridableContext } from "react-overridable"; +import { InvenioSearchApi, ReactSearchKit, SearchBar, buildUID } from "react-searchkit"; +import { Button, Grid } from "semantic-ui-react"; +import PropTypes from "prop-types"; +import { + SearchConfigurationContext, + SearchAppFacets, + SearchAppResultsPane, +} from "@js/invenio_search_ui/components"; +import { GridResponsiveSidebarColumn } from "react-invenio-forms"; +import { CommunitiesStatusFilter } from "./CommunitiesStatusFilter"; + +export class CommunitySelectionSearch extends Component { + constructor(props) { + super(props); + const { + apiConfigs: { allCommunities }, + } = this.props; + + this.state = { + selectedConfig: allCommunities, + sidebarVisible: false, + }; + } + + /** + * Namespaces each component object with the specified appID. + * This is needed since the `CommunitySelectionSearch` component + * uses two search applications with distinct configs (e.g. to search in "All" or "My" communities) + */ + prefixAppID(components, appID) { + // iterate components and prefix them with ".appID" + return Object.fromEntries( + Object.entries(components).map(([key, value]) => [`${appID}.${key}`, value]) + ); + } + + render() { + const { + selectedConfig: { + searchApi: selectedSearchApi, + appId: selectedAppId, + initialQueryState: selectedInitialQueryState, + toggleText, + }, + sidebarVisible, + } = this.state; + + const { + apiConfigs: { allCommunities, myCommunities }, + autofocus, + communitiesStatusFilterEnabled, + config, + overriddenComponents, + } = this.props; + + const searchApi = new InvenioSearchApi(selectedSearchApi); + + const validatedComponents = this.prefixAppID(overriddenComponents, selectedAppId); + + const layoutOptions = { + listView: true, + gridView: false, + }; + + const context = { + selectedAppId, + buildUID: (element) => buildUID(element, "", selectedAppId), + ...config, + }; + + return ( + + + + + + {/* Start burger menu for mobile and tablet only */} + +