Skip to content

Commit

Permalink
Merge pull request #25 from plone/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
libargutxi authored Jun 16, 2023
2 parents ac30678 + 87c1f99 commit 1779b58
Show file tree
Hide file tree
Showing 29 changed files with 846 additions and 188 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@


LEVELS = [
("patron", "Patronage"),
("diamond", "Diamond"),
("platinum", "Platinum"),
("gold", "Gold"),
("silver", "Silver"),
("bronze", "Bronze"),
("supporting", "Supporting"),
("oss", "Open Source"),
("patron", "Patronage"),
("organizer", "Organized by"),
]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { isInternalURL } from '@plone/volto/helpers/Url/Url';
import { Icon } from '@plone/volto/components';
import githubSVG from '../../../icons/github.svg';
import twitterSVG from '../../../icons/twitter.svg';
import { Grid } from 'semantic-ui-react';

import { PreviewImage } from '@plone/volto/components';

Expand All @@ -33,42 +34,44 @@ const PersonsSimpleListingBody = ({

return (
<>
<div className="persons-simple-listing items">
<Grid className="persons-simple-listing items" columns={4} stackable>
{items.map((item) => (
<div className="listing-item" key={item['@id']}>
<ConditionalLink item={item} condition={!isEditMode}>
<div className="listing-image-wrapper">
<PreviewImage item={item} size="mini" />
</div>
<div className="listing-body">
<h3>{item.title ? item.title : item.id}</h3>
<div className="person-social">
{item.github && (
<a
href={`https://github.com/${item.github}`}
onClick={(e) => e.stopPropagation()}
>
<Icon name={githubSVG} size="18px" />
</a>
)}
<Grid.Column key={item['@id']}>
<div className="listing-item">
<ConditionalLink item={item} condition={!isEditMode}>
<div className="speakers-preview-image">
<PreviewImage item={item} size="preview" />
</div>
<div className="listing-body">
<h3>{item.title ? item.title : item.id}</h3>
<div className="person-social">
{item.github && (
<a
href={`https://github.com/${item.github}`}
onClick={(e) => e.stopPropagation()}
>
<Icon name={githubSVG} size="18px" />
</a>
)}

{item.twitter && (
<a
href={`https://twitter.com/${item.twitter.replace(
'@',
'',
)}`}
onClick={(e) => e.stopPropagation()}
>
<Icon name={twitterSVG} size="18px" />
</a>
)}
{item.twitter && (
<a
href={`https://twitter.com/${item.twitter.replace(
'@',
'',
)}`}
onClick={(e) => e.stopPropagation()}
>
<Icon name={twitterSVG} size="18px" />
</a>
)}
</div>
</div>
</div>
</ConditionalLink>
</div>
</ConditionalLink>
</div>
</Grid.Column>
))}
</div>
</Grid>

{link && <div className="footer">{link}</div>}
</>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,12 @@ import PropTypes from 'prop-types';
import { ConditionalLink } from '@plone/volto/components';
import { flattenToAppURL } from '@plone/volto/helpers';
import cx from 'classnames';
import DefaultImageSVG from '@plone/volto/components/manage/Blocks/Listing/default-image.svg';
import { isInternalURL } from '@plone/volto/helpers/Url/Url';
import { Popup } from 'semantic-ui-react';
import PresentersInfo from '../../../components/Session/PresentersInfo/PresentersInfo';

const TalksListingBody = ({ items, linkTitle, linkHref, isEditMode }) => {
let link = null;
let href = linkHref?.[0]?.['@id'] || '';

if (isInternalURL(href)) {
link = (
<ConditionalLink to={flattenToAppURL(href)} condition={!isEditMode}>
Expand Down Expand Up @@ -55,28 +53,7 @@ const TalksListingBody = ({ items, linkTitle, linkHref, isEditMode }) => {
/>
)}
</div>
<div className="listing-image-wrapper">
{item?.presenters?.map((speaker) => (
<Popup
trigger={
<div className="speakers-preview">
{!speaker?.image && (
<img src={DefaultImageSVG} alt="" />
)}
{speaker?.image && (
<img
src={flattenToAppURL(speaker?.image.download)}
alt={item.title}
/>
)}
</div>
}
position="top center"
>
<Popup.Content>{speaker.title}</Popup.Content>
</Popup>
))}
</div>
<PresentersInfo content={item} />
</ConditionalLink>
</div>
))}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import React from 'react';
import { Modal, TransitionablePortal } from 'semantic-ui-react';
import { Button, Icon } from 'semantic-ui-react';
import { isEmpty } from 'lodash';

function FiltersModal(props) {
let { children, size = 'fullscreen', data, facets = {} } = props;
const [open, setOpen] = React.useState(false);
const definedFacets = data.facets || [];

function openModal() {
setOpen(true);
}
function closeModal() {
setOpen(false);
}
const totalFilters = definedFacets.filter(
({ field }) =>
field &&
Object.keys(facets).includes(field.value) &&
!isEmpty(facets[field.value]),
).length;
const totalfiltertext = totalFilters ? ' ' + totalFilters : '';
return (
<>
<Button className="ui button secondary" onClick={openModal}>
<Icon name="filter"></Icon>
{data.facetsTitle + totalfiltertext}
</Button>
<TransitionablePortal
open={open}
transition={{ animation: 'fade left', duration: 1000 }}
>
<Modal
open={true}
size={size}
id="fullscreen-filter-modal"
onClose={() => closeModal()}
>
<div className="modal modal-filters" id="filters_modal">
<div className="modal-filters-background">
<div className="modal-filters-container">
<div className="modal-filters-header">
<div className="modal-filters-title">
<h3 className="modal-title">{data.facetsTitle}</h3>
</div>
<div className="modal-filters-right">
<div className="modal-close modal-filters-close">
<span
className="icon-close"
aria-label="Close"
onClick={() => closeModal()}
onKeyDown={() => closeModal()}
tabIndex="0"
role="button"
></span>
</div>
</div>
</div>
<div className="modal-filters-body">
<div className="modal-filters-dropdown">
<div className="modal-filters-dropdown-container">
{children}
</div>
</div>
<div className="apply-filters-button">
<button
className="ui button"
id=""
onClick={() => closeModal()}
onKeyDown={() => closeModal()}
>
Apply filters
</button>
</div>
</div>
</div>
</div>
</div>
</Modal>
</TransitionablePortal>
</>
);
}

export default FiltersModal;
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
import { Button, Grid, Segment } from 'semantic-ui-react';
import { Facets } from '@plone/volto/components/manage/Blocks/Search/components';
import { defineMessages, useIntl } from 'react-intl';
import FiltersModal from './FiltersModal';
import SearchInput from '@plone/volto/components/manage/Blocks/Search/components/SearchInput';
import React from 'react';
import { flushSync } from 'react-dom';

const messages = defineMessages({
searchButtonText: {
id: 'Search',
defaultMessage: 'Search',
},
});

const FacetWrapper = ({ children }) => (
<Segment basic className="facet">
{children}
</Segment>
);

function setFacetsHandler(setFacets, onTriggerSearch, searchedText) {
return (f) => {
flushSync(() => {
setFacets(f);
onTriggerSearch(searchedText || '', f);
});
};
}

const PloneConfFacets = (props) => {
const {
children,
data,
facets,
setFacets,
onTriggerSearch,
searchedText, // search text for previous search
searchText, // search text currently being entered (controlled input)
isEditMode,
querystring = {},
// searchData,
// mode = 'view',
// variation,
} = props;
const { showSearchButton } = data;
const isLive = !showSearchButton;
const intl = useIntl();
if (querystring?.sortable_indexes?.effective?.title) {
querystring.sortable_indexes.effective.title = 'Publication date';
}
if (querystring?.sortable_indexes?.sortable_title?.title) {
querystring.sortable_indexes.sortable_title.title = 'Sort by title';
}
if (querystring?.sortable_indexes?.modified?.title) {
querystring.sortable_indexes.modified.title = 'Last edited';
}
return (
<Grid className="searchBlock-facets right-column-facets" stackable>
{data?.headline && (
<Grid.Row>
<Grid.Column>
{data.headline && <h2 className="headline">{data.headline}</h2>}
</Grid.Column>
</Grid.Row>
)}

<div className="filter-search-wrapper">
{(Object.keys(data).includes('showSearchInput')
? data.showSearchInput
: true) && (
<div className="search-wrapper">
<SearchInput {...props} isLive={isLive} />
{data.showSearchButton && (
<Button
primary
onClick={() => onTriggerSearch(searchText)}
aria-label={
data.searchButtonLabel ||
intl.formatMessage(messages.searchButtonText)
}
>
<span className="icon-zoom"></span>
</Button>
)}
</div>
)}
<div className="filters">
<div className="search-results-count-sort search-filters">
{data.facets?.length && (
<FiltersModal
data={data}
facets={facets}
setFacets={setFacetsHandler(
setFacets,
onTriggerSearch,
searchedText,
)}
>
<div id="right-modal-facets" className="facets">
<Facets
querystring={querystring}
data={data}
facets={facets}
isEditMode={isEditMode}
setFacets={setFacetsHandler(
setFacets,
onTriggerSearch,
searchedText,
)}
facetWrapper={FacetWrapper}
/>
</div>
</FiltersModal>
)}
</div>
</div>
</div>
<Grid.Row>
<Grid.Column mobile={12} tablet={12} computer={12}>
{children}
</Grid.Column>
</Grid.Row>
</Grid>
);
};

export default PloneConfFacets;
Loading

0 comments on commit 1779b58

Please sign in to comment.