Implement MentionItem and MentionTypeahead
This commit is contained in:
parent
0d1630bb1c
commit
e47b800ac7
2 changed files with 81 additions and 27 deletions
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue