// import dependencies import { Menu } from '@mui/material'; import React, { useRef, useState } from 'react'; import { Box, Chip, Stack, useTheme, Icon, MenuItem, Popover, Divider, TextField, InputAdornment, IconButton, Query, Tooltip, ListItemIcon, ListItemText } from '../'; // let context let DashupContext = null; // global timer let timer; // global debounce const debounce = (func, timeout = 1000) => { // return debounced return (...args) => { // clear timeout previously clearTimeout(timer); // create new timeout timer = setTimeout(() => func(...args), timeout); }; } // create menu component const DashupUIPageFilter = (props = {}) => { // theme const theme = useTheme(); // filter button const filterButton = useRef(null); // state const [filter, setFilter] = useState(false); const [tagMenu, setTagMenu] = useState(null); const [sortMenu, setSortMenu] = useState(null); // has user const hasTags = (page) => { // get user if (props.tags) return typeof props.hasTags === 'function' ? props.hasTags() : true; // check page return !!(props.tags || page.get('data.tag') || []).length; }; // has user const hasUser = (page) => { // get user if (props.users) return typeof props.hasUser === 'function' ? props.hasUser() : true; // check page return !!(props.users || page.get('data.user') || []).length; }; // get tags const getTags = (page, fields) => { // find in page return fields.filter((f) => (props.tags || page.get('data.tag') || []).includes(f.uuid)); }; // disable menu const disableFilter = !!(typeof eden !== 'undefined' ? eden : {}).state?.share?.disableFilter; // return JSX return disableFilter ? null : ( { ({ page, dashup, setUser, getFields, getFieldStruct }) => { // get fields const fields = (props.getFields || getFields)(); // get tags const tags = props.onTag && (props.getTags || getTags)(page, fields); // get sort field const sortField = page.get('data.sort.field') && fields.find((f) => f.uuid === page.get('data.sort.field')); // return jsx return ( <> { !!props.onSearch && ( debounce(props.onSearch, 500)(e.target.value && e.target.value.length ? e.target.value : null) } defaultValue={ page.get('data.search') || page.get('user.search') || '' } InputProps={ { sx : { backgroundColor : theme.palette.mode === 'light' ? theme.palette.light.main : theme.palette.dark.main, }, size : 'small', margin : 'none', endAdornment : ( ), } } /> ) }{ !!hasUser(page) && eden?.user?.exists() && ( setUser('filter.me', !page.get('user.filter.me')) }> ) } { (page.get('user.filter.tags') || []).map((tag, i) => { // get field const field = tags.find((f) => f.uuid === tag?.field); // check field if (!field) return null; // get option const option = (field.options || []).find((opt) => opt.value === tag?.value) || {}; // jsx return ( props.onTag(field, option || tag) } /> ); }) } { !!props.onTag && hasTags(page) && ( <> setTagMenu(e.target) }> setTagMenu(null) } anchorEl={ tagMenu } > { tags.reduce((accum, tag, i) => { // arr const arr = []; // push if (i !== 0) arr.push(); // push arr.push(...(tag.options || []).map((option, i) => { // return jsx return ( !setTagMenu(null) && props.onTag(tag, option) } > { option.label } ); })); // push accum.push(...arr); return accum; }, []) } ) } { !!props.onFilter && ( 2 || filter ? 'primary' : undefined } onClick={ (e) => setFilter(!filter) }> ) } { !!sortField && ( ) : page.get('data.sort.way') === 1 ? ( ) : null } label={ sortField.label || sortField.name } onClick={ (e) => props.onSort({ field : sortField.uuid }) } onDelete={ (e) => props.onSort({}) } /> ) } { !!props.onSort && ( <> setSortMenu(e.target) }> { page.get('data.sort.way') === -1 ? ( ) : page.get('data.sort.way') === 1 ? ( ) : ( ) } setSortMenu(null) } anchorEl={ sortMenu } > { fields.map((field, i) => { // return jsx return ( !setSortMenu(null) && props.onSort({ field : field.uuid }) } > { field.label } ); }) } !setSortMenu(null) && props.onSort({ field : 'created_at' }) } > Created At !setSortMenu(null) && props.onSort({ field : 'updated_at' }) } > Updated at ) } { props.children } { !!filter && !!props.onFilter && ( setFilter(false) } anchorEl={ filterButton?.current } anchorOrigin={{ vertical : 'bottom', horizontal : 'left', }} > ) } ); } } ); }; // export default page menu export default (ctx) => { // use context DashupContext = ctx; // return actual component return DashupUIPageFilter; };