Implement MentionItem and MentionTypeahead

This commit is contained in:
Justin Edmund 2023-08-21 17:28:29 -07:00
parent 0d1630bb1c
commit e47b800ac7
2 changed files with 81 additions and 27 deletions

View file

@ -14,6 +14,22 @@
}
}
.header {
h3 {
font-size: $font-medium;
font-weight: $bold;
}
p {
font-size: $font-small;
}
&.border {
border-top: 1px solid var(--text-tertiary);
padding-top: $unit-2x;
}
}
.notice {
background-color: var(--notice-bg);
border-radius: $input-corner;
@ -34,11 +50,16 @@
.fields {
display: flex;
flex-direction: column;
gap: $unit-2x;
padding: 0 $unit-4x;
gap: $unit-4x;
section {
display: flex;
flex-direction: column;
gap: $unit-2x;
padding: 0 $unit-4x;
@include breakpoint(phone) {
gap: $unit-4x;
margin-bottom: $unit * 24;
@include breakpoint(phone) {
gap: $unit-4x;
margin-bottom: $unit * 24;
}
}
}

View file

@ -19,6 +19,7 @@ import type { DialogProps } from '@radix-ui/react-dialog'
import styles from './index.module.scss'
import MentionTableField from '~components/common/MentionTableField'
import classNames from 'classnames'
interface Props extends DialogProps {
defaultFilterSet: FilterSet
@ -48,8 +49,8 @@ const FilterModal = (props: Props) => {
const [chargeAttackOpen, setChargeAttackOpen] = useState(false)
const [fullAutoOpen, setFullAutoOpen] = useState(false)
const [autoGuardOpen, setAutoGuardOpen] = useState(false)
const [inclusions, setInclusions] = useState<string[]>([])
const [exclusions, setExclusions] = useState<string[]>([])
const [inclusions, setInclusions] = useState<MentionItem[]>([])
const [exclusions, setExclusions] = useState<MentionItem[]>([])
const [filterSet, setFilterSet] = useState<FilterSet>({})
// Filter states
@ -85,7 +86,11 @@ const FilterModal = (props: Props) => {
// Hooks
useEffect(() => {
if (props.open !== undefined) setOpen(props.open)
if (props.open !== undefined) {
setOpen(props.open)
// When should we reset the filter state?
}
})
useEffect(() => {
@ -134,8 +139,8 @@ const FilterModal = (props: Props) => {
setCookie('filters', filters, { path: '/' })
}
if (inclusions.length > 0) filters.includes = inclusions.join(',')
if (exclusions.length > 0) filters.excludes = exclusions.join(',')
if (inclusions.length > 0) filters.includes = inclusions
if (exclusions.length > 0) filters.excludes = exclusions
props.sendAdvancedFilters(filters)
openChange()
@ -391,23 +396,33 @@ const FilterModal = (props: Props) => {
)
// Inclusions and exclusions
function storeInclusions(value: MentionItem[]) {
setInclusions(value)
}
function storeExclusions(value: MentionItem[]) {
setExclusions(value)
}
const inclusionField = (
<MentionTableField
name="inclusion"
description={t('modals.filters.descriptions.inclusion')}
inclusions={inclusions}
exclusions={exclusions}
placeholder={t('modals.filters.placeholders.inclusion')}
label={t('modals.filters.labels.inclusion')}
onUpdate={(value) => setInclusions(value)}
onUpdate={storeInclusions}
/>
)
const exclusionField = (
<MentionTableField
name="exclusion"
description={t('modals.filters.descriptions.exclusion')}
inclusions={exclusions}
exclusions={inclusions}
placeholder={t('modals.filters.placeholders.exclusion')}
label={t('modals.filters.labels.exclusion')}
onUpdate={(value) => setExclusions(value)}
onUpdate={storeExclusions}
/>
)
@ -439,19 +454,37 @@ const FilterModal = (props: Props) => {
<DialogHeader title={t('modals.filters.title')} />
<div className={styles.fields}>
{filterNotice()}
{inclusionField}
{exclusionField}
{chargeAttackField()}
{fullAutoField()}
{autoGuardField()}
{/* {maxButtonsField()} */}
{/* {maxTurnsField()} */}
{minCharactersField()}
{minSummonsField()}
{minWeaponsField()}
{nameQualityField()}
{userQualityField()}
{originalOnlyField()}
<section>
<div className={styles.header}>
<h3>Team items</h3>
<p>
Show or hide teams that have specific characters, weapons, or
summons
</p>
</div>
{inclusionField}
{exclusionField}
</section>
<section>
<div className={styles.header}>
<h3>Team details</h3>
<p>
Filter teams by various properties, like full auto or button
presses
</p>
</div>
{chargeAttackField()}
{fullAutoField()}
{autoGuardField()}
{/* {maxButtonsField()} */}
{/* {maxTurnsField()} */}
{minCharactersField()}
{minSummonsField()}
{minWeaponsField()}
{nameQualityField()}
{userQualityField()}
{originalOnlyField()}
</section>
</div>
<DialogFooter
ref={footerRef}