Merge pull request #766 from lethemanh/702-hide-date-label-when-open-search-on-table
#702 hide date label when open search bar on tablet
This commit is contained in:
@@ -35,7 +35,9 @@ import { CalendarItemList } from '../Calendar/CalendarItemList'
|
|||||||
|
|
||||||
const SEARCH_OBJECT_TYPES = ['user', 'contact']
|
const SEARCH_OBJECT_TYPES = ['user', 'contact']
|
||||||
|
|
||||||
export default function SearchBar() {
|
const SearchBar: React.FC<{
|
||||||
|
onToggleSearch?: (extendedStatus: boolean) => void
|
||||||
|
}> = ({ onToggleSearch }) => {
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
const dispatch = useAppDispatch()
|
const dispatch = useAppDispatch()
|
||||||
const calendars = useAppSelector(selectCalendars)
|
const calendars = useAppSelector(selectCalendars)
|
||||||
@@ -76,7 +78,7 @@ export default function SearchBar() {
|
|||||||
const handleFilterChange = (
|
const handleFilterChange = (
|
||||||
field: FilterField,
|
field: FilterField,
|
||||||
value: string | userAttendee[]
|
value: string | userAttendee[]
|
||||||
) => {
|
): void => {
|
||||||
setFilters(prev => ({ ...prev, [field]: value }))
|
setFilters(prev => ({ ...prev, [field]: value }))
|
||||||
if (field === 'organizers') {
|
if (field === 'organizers') {
|
||||||
setSelectedContacts(
|
setSelectedContacts(
|
||||||
@@ -96,7 +98,17 @@ export default function SearchBar() {
|
|||||||
organizers: userAttendee[]
|
organizers: userAttendee[]
|
||||||
attendees: userAttendee[]
|
attendees: userAttendee[]
|
||||||
}
|
}
|
||||||
) {
|
):
|
||||||
|
| {
|
||||||
|
search: string
|
||||||
|
filters: {
|
||||||
|
searchIn: string[]
|
||||||
|
keywords: string
|
||||||
|
organizers: string[]
|
||||||
|
attendees: string[]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| undefined {
|
||||||
const trimmedSearch = searchQuery.trim()
|
const trimmedSearch = searchQuery.trim()
|
||||||
const trimmedKeywords = filters.keywords.trim()
|
const trimmedKeywords = filters.keywords.trim()
|
||||||
|
|
||||||
@@ -133,7 +145,7 @@ export default function SearchBar() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleClearFilters = () => {
|
const handleClearFilters = (): void => {
|
||||||
setFilters({
|
setFilters({
|
||||||
searchIn: 'my-calendars',
|
searchIn: 'my-calendars',
|
||||||
keywords: '',
|
keywords: '',
|
||||||
@@ -144,11 +156,11 @@ export default function SearchBar() {
|
|||||||
setFilterError(false)
|
setFilterError(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleContactSelect = (contacts: User[]) => {
|
const handleContactSelect = (contacts: User[]): void => {
|
||||||
setSelectedContacts(contacts)
|
setSelectedContacts(contacts)
|
||||||
setSearch('')
|
setSearch('')
|
||||||
if (contacts.length > 0) {
|
if (contacts.length > 0) {
|
||||||
handleSearch('', {
|
void handleSearch('', {
|
||||||
...filters,
|
...filters,
|
||||||
organizers: contacts.map(contact =>
|
organizers: contacts.map(contact =>
|
||||||
createAttendee({
|
createAttendee({
|
||||||
@@ -168,7 +180,7 @@ export default function SearchBar() {
|
|||||||
organizers: userAttendee[]
|
organizers: userAttendee[]
|
||||||
attendees: userAttendee[]
|
attendees: userAttendee[]
|
||||||
}
|
}
|
||||||
) => {
|
): Promise<void> => {
|
||||||
const cleanedQuery = buildQuery(searchQuery, filters)
|
const cleanedQuery = buildQuery(searchQuery, filters)
|
||||||
if (cleanedQuery) {
|
if (cleanedQuery) {
|
||||||
await dispatch(searchEventsAsync(cleanedQuery))
|
await dispatch(searchEventsAsync(cleanedQuery))
|
||||||
@@ -182,7 +194,7 @@ export default function SearchBar() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
function handleClickOutside(event: MouseEvent) {
|
function handleClickOutside(event: MouseEvent): void {
|
||||||
const target = event.target as Node
|
const target = event.target as Node
|
||||||
|
|
||||||
if (filterOpen) {
|
if (filterOpen) {
|
||||||
@@ -199,12 +211,19 @@ export default function SearchBar() {
|
|||||||
|
|
||||||
if (!search.trim() && selectedContacts.length === 0) {
|
if (!search.trim() && selectedContacts.length === 0) {
|
||||||
setExtended(false)
|
setExtended(false)
|
||||||
|
onToggleSearch?.(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
document.addEventListener('mousedown', handleClickOutside)
|
document.addEventListener('mousedown', handleClickOutside)
|
||||||
return () => document.removeEventListener('mousedown', handleClickOutside)
|
return (): void =>
|
||||||
}, [filterOpen, search, selectedContacts])
|
document.removeEventListener('mousedown', handleClickOutside)
|
||||||
|
}, [filterOpen, onToggleSearch, search, selectedContacts])
|
||||||
|
|
||||||
|
const handleOpenSearch = (): void => {
|
||||||
|
setExtended(true)
|
||||||
|
onToggleSearch?.(true)
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -218,7 +237,7 @@ export default function SearchBar() {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{!extended && (
|
{!extended && (
|
||||||
<IconButton sx={{ mr: 1 }} onClick={() => setExtended(true)}>
|
<IconButton sx={{ mr: 1 }} onClick={handleOpenSearch}>
|
||||||
<SearchIcon />
|
<SearchIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
)}
|
)}
|
||||||
@@ -262,7 +281,7 @@ export default function SearchBar() {
|
|||||||
autoFocus
|
autoFocus
|
||||||
placeholder={t('common.search')}
|
placeholder={t('common.search')}
|
||||||
value={query}
|
value={query}
|
||||||
inputRef={el => {
|
inputRef={(el: HTMLInputElement | null) => {
|
||||||
inputRef.current = el
|
inputRef.current = el
|
||||||
const ref = params.InputProps.ref
|
const ref = params.InputProps.ref
|
||||||
if (typeof ref === 'function') {
|
if (typeof ref === 'function') {
|
||||||
@@ -275,7 +294,7 @@ export default function SearchBar() {
|
|||||||
}}
|
}}
|
||||||
onKeyDown={e => {
|
onKeyDown={e => {
|
||||||
if (e.key === 'Enter') {
|
if (e.key === 'Enter') {
|
||||||
handleSearch(query, filters)
|
void handleSearch(query, filters)
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
onChange={e => {
|
onChange={e => {
|
||||||
@@ -370,6 +389,7 @@ export default function SearchBar() {
|
|||||||
shouldCollapseRef.current
|
shouldCollapseRef.current
|
||||||
) {
|
) {
|
||||||
setExtended(false)
|
setExtended(false)
|
||||||
|
onToggleSearch?.(false)
|
||||||
}
|
}
|
||||||
shouldCollapseRef.current = false
|
shouldCollapseRef.current = false
|
||||||
}
|
}
|
||||||
@@ -521,7 +541,7 @@ export default function SearchBar() {
|
|||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
variant="contained"
|
variant="contained"
|
||||||
onClick={() => handleSearch(filters.keywords, filters)}
|
onClick={() => void handleSearch(filters.keywords, filters)}
|
||||||
>
|
>
|
||||||
{t('common.search')}
|
{t('common.search')}
|
||||||
</Button>
|
</Button>
|
||||||
@@ -531,3 +551,5 @@ export default function SearchBar() {
|
|||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default SearchBar
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { MainTitle } from './MainTitle'
|
|||||||
import { SharedMenubarProps } from './Menubar'
|
import { SharedMenubarProps } from './Menubar'
|
||||||
import { UserMenu } from './UserMenu'
|
import { UserMenu } from './UserMenu'
|
||||||
import { SmallNavigationControls } from './components/SmallNavigationControls'
|
import { SmallNavigationControls } from './components/SmallNavigationControls'
|
||||||
|
import { useState } from 'react'
|
||||||
|
|
||||||
export const TabletMenubar: React.FC<SharedMenubarProps> = ({
|
export const TabletMenubar: React.FC<SharedMenubarProps> = ({
|
||||||
calendarRef,
|
calendarRef,
|
||||||
@@ -27,6 +28,8 @@ export const TabletMenubar: React.FC<SharedMenubarProps> = ({
|
|||||||
}: SharedMenubarProps) => {
|
}: SharedMenubarProps) => {
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
const [displayDateLabel, setDisplayDateLabel] = useState(true)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<header className="menubar">
|
<header className="menubar">
|
||||||
<div className="left-menu">
|
<div className="left-menu">
|
||||||
@@ -53,16 +56,22 @@ export const TabletMenubar: React.FC<SharedMenubarProps> = ({
|
|||||||
<SmallNavigationControls onNavigate={onNavigate} />
|
<SmallNavigationControls onNavigate={onNavigate} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="menu-items">
|
{displayDateLabel && (
|
||||||
<div className="current-date-time">
|
<div className="menu-items">
|
||||||
<p>{dateLabel}</p>
|
<div className="current-date-time">
|
||||||
|
<p>{dateLabel}</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="right-menu">
|
<div className="right-menu">
|
||||||
<div className="search-container">
|
<div className="search-container">
|
||||||
<SearchBar />
|
<SearchBar
|
||||||
|
onToggleSearch={searchExtendedStatus =>
|
||||||
|
setDisplayDateLabel(!searchExtendedStatus)
|
||||||
|
}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="menu-items">
|
<div className="menu-items">
|
||||||
<IconButton
|
<IconButton
|
||||||
|
|||||||
Reference in New Issue
Block a user