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 { .notice {
background-color: var(--notice-bg); background-color: var(--notice-bg);
border-radius: $input-corner; border-radius: $input-corner;
@ -34,11 +50,16 @@
.fields { .fields {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: $unit-2x; gap: $unit-4x;
padding: 0 $unit-4x; section {
display: flex;
flex-direction: column;
gap: $unit-2x;
padding: 0 $unit-4x;
@include breakpoint(phone) { @include breakpoint(phone) {
gap: $unit-4x; gap: $unit-4x;
margin-bottom: $unit * 24; 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 styles from './index.module.scss'
import MentionTableField from '~components/common/MentionTableField' import MentionTableField from '~components/common/MentionTableField'
import classNames from 'classnames'
interface Props extends DialogProps { interface Props extends DialogProps {
defaultFilterSet: FilterSet defaultFilterSet: FilterSet
@ -48,8 +49,8 @@ const FilterModal = (props: Props) => {
const [chargeAttackOpen, setChargeAttackOpen] = useState(false) const [chargeAttackOpen, setChargeAttackOpen] = useState(false)
const [fullAutoOpen, setFullAutoOpen] = useState(false) const [fullAutoOpen, setFullAutoOpen] = useState(false)
const [autoGuardOpen, setAutoGuardOpen] = useState(false) const [autoGuardOpen, setAutoGuardOpen] = useState(false)
const [inclusions, setInclusions] = useState<string[]>([]) const [inclusions, setInclusions] = useState<MentionItem[]>([])
const [exclusions, setExclusions] = useState<string[]>([]) const [exclusions, setExclusions] = useState<MentionItem[]>([])
const [filterSet, setFilterSet] = useState<FilterSet>({}) const [filterSet, setFilterSet] = useState<FilterSet>({})
// Filter states // Filter states
@ -85,7 +86,11 @@ const FilterModal = (props: Props) => {
// Hooks // Hooks
useEffect(() => { useEffect(() => {
if (props.open !== undefined) setOpen(props.open) if (props.open !== undefined) {
setOpen(props.open)
// When should we reset the filter state?
}
}) })
useEffect(() => { useEffect(() => {
@ -134,8 +139,8 @@ const FilterModal = (props: Props) => {
setCookie('filters', filters, { path: '/' }) setCookie('filters', filters, { path: '/' })
} }
if (inclusions.length > 0) filters.includes = inclusions.join(',') if (inclusions.length > 0) filters.includes = inclusions
if (exclusions.length > 0) filters.excludes = exclusions.join(',') if (exclusions.length > 0) filters.excludes = exclusions
props.sendAdvancedFilters(filters) props.sendAdvancedFilters(filters)
openChange() openChange()
@ -391,23 +396,33 @@ const FilterModal = (props: Props) => {
) )
// Inclusions and exclusions // Inclusions and exclusions
function storeInclusions(value: MentionItem[]) {
setInclusions(value)
}
function storeExclusions(value: MentionItem[]) {
setExclusions(value)
}
const inclusionField = ( const inclusionField = (
<MentionTableField <MentionTableField
name="inclusion" name="inclusion"
description={t('modals.filters.descriptions.inclusion')} inclusions={inclusions}
exclusions={exclusions}
placeholder={t('modals.filters.placeholders.inclusion')} placeholder={t('modals.filters.placeholders.inclusion')}
label={t('modals.filters.labels.inclusion')} label={t('modals.filters.labels.inclusion')}
onUpdate={(value) => setInclusions(value)} onUpdate={storeInclusions}
/> />
) )
const exclusionField = ( const exclusionField = (
<MentionTableField <MentionTableField
name="exclusion" name="exclusion"
description={t('modals.filters.descriptions.exclusion')} inclusions={exclusions}
exclusions={inclusions}
placeholder={t('modals.filters.placeholders.exclusion')} placeholder={t('modals.filters.placeholders.exclusion')}
label={t('modals.filters.labels.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')} /> <DialogHeader title={t('modals.filters.title')} />
<div className={styles.fields}> <div className={styles.fields}>
{filterNotice()} {filterNotice()}
{inclusionField} <section>
{exclusionField} <div className={styles.header}>
{chargeAttackField()} <h3>Team items</h3>
{fullAutoField()} <p>
{autoGuardField()} Show or hide teams that have specific characters, weapons, or
{/* {maxButtonsField()} */} summons
{/* {maxTurnsField()} */} </p>
{minCharactersField()} </div>
{minSummonsField()} {inclusionField}
{minWeaponsField()} {exclusionField}
{nameQualityField()} </section>
{userQualityField()} <section>
{originalOnlyField()} <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> </div>
<DialogFooter <DialogFooter
ref={footerRef} ref={footerRef}