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:
lethemanh
2026-04-10 14:42:38 +07:00
committed by GitHub
2 changed files with 50 additions and 19 deletions
+36 -14
View File
@@ -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
+14 -5
View File
@@ -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