EN · DE · RU · FR · ES

#2705: SearchFilter.jsx

projectforge-webapp/src/containers/page/list/searchFilter/SearchFilter.jsx Tipo: JavaScript/React · Rol: Página · Fuente: projectforge-webapp/src/containers/page/list/searchFilter/SearchFilter.jsx 185 líneas · 175 código · 2 comentarios · 8 en blanco
Componente React de búsqueda/filtro que proporciona entrada de consulta, criterios de filtro y gestión de resultados para vistas de listas de entidades.

Estructura del código

Hooks utilizados: Selector, Dispatch, Navigate, Location

Importaciones de: ../../../../actions, ../../../../actions/list/filter, ../../../../components/base/navigation, ../../../../components/design, ../../../../components/design/input/autoCompletion/TextAutoCompletion, ../../../../components/design/popper/AdvancedPopperAction, ../../../panel/favorite/FavoritesPanel, ../ListPage.module.scss, ./magicFilter/MagicFilters, @fortawesome/free-solid-svg-icons, @fortawesome/react-fontawesome, classnames, prop-types, react, react-redux...

Tiene PropTypes para: SearchFilter

Utiliza Módulos CSS para el estilo.

Código fuente (resumido)

import { faSearch, faSync } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import classNames from 'classnames';
import PropTypes from 'prop-types';
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { Button, Navbar } from 'reactstrap';
import { useNavigate, useLocation } from 'react-router';
import {
    createListFavorite,
    deleteListFavorite,
    dismissCurrentError,
    fetchCurrentList,
    exportCurrentList,
    startMultiSelection,
    renameListFavorite,
    selectListFavorite,
    updateListFavorite,
} from '../../../../actions';
import { changeSearchString } from '../../../../actions/list/filter';
import Navigation from '../../../../components/base/navigation';
import { Alert, Col, Spinner } from '../../../../components/design';
import TextAutoCompletion
    from '../../../../components/design/input/autoCompletion/TextAutoCompletion';
import AdvancedPopperAction from '../../../../components/design/popper/AdvancedPopperAction';
import FavoritesPanel from '../../../panel/favorite/FavoritesPanel';
import styles from '../ListPage.module.scss';
import MagicFilters from './magicFilter/MagicFilters';

function SearchFilter() {
    const category = useSelector((state) => {
        const listState = state.list;
        return listState.categories[listState.currentCategory];
    });
    const dispatch = useDispatch();
    const onErrorDismiss = () => dispatch(dismissCurrentError());
    const onFavoriteCreate = (name) => dispatch(createListFavorite({ name }));
    const onFavoriteDelete = (id) => dispatch(deleteListFavorite({ id }));
    const onFavoriteRename = (id, newName) => dispatch(renameListFavorite({ id, newName }));
    const onFavoriteSelect = (id) => dispatch(selectListFavorite({ id }));
    const onFavoriteUpdate = () => dispatch(updateListFavorite());
    const onSearchStringBlur = () => dispatch(fetchCurrentList());
    const onSearchStringChange = (completion) => dispatch(changeSearchString(completion));
    const onSearchStringDelete = () => dispatch(changeSearchString(''));
    const onSyncButtonClick = () => dispatch(fetchCurrentList(true));
    const onExportButtonClick = () => dispatch(exportCurrentList());
    const onMultiSelectionButtonClick = () => dispatch(startMultiSelection());

    const {
        error,
        filter,
        filterFavorites,
        isFetching,
        newlySwitched,
        quickSelectUrl,
        standardEditPage,
        ui,
        useModalEditDialog,
    } = category;

    const navigate = useNavigate();
    const location = useLocation();

    const onSelectQuickSelection = ({ id }) => {
        let url = `/${standardEditPage.replace(':id', id)}`;

        if (useModalEditDialog) {
            // Añadir parámetro de consulta modal=true para que el backend sepa que se abrió en contexto modal
            url += url.includes('?') ? '&modal=true' : '?modal=true';
            navigate(url, { state: { background: location } });
        } else {
            navigate(url);
        }
    };

    return (
        <>
            <div className={styles.searchRow}>
                {/* FLEX-BOX ESTÁ CONFIGURADO EN REVERSO EN PANTALLAS GRANDES */}
                <div className={classNames(styles.container, styles.flex)}>
                    {/* Renderizar el menú si está cargado. */}
                    {ui && ui.pageMenu && (
                        <Col>
                            <Navbar>
                                <Navigation
                                    entries={ui.pageMenu}
                                    // Dejar que el menú flote a la derecha.
                                    className="ml-auto"
                                />
                            </Navbar>
                        </Col>
                    )}
                </div>
                <div className={styles.container}>
                    <FavoritesPanel
                        onFavoriteCreate={onFavoriteCreate}
                        onFavoriteDelete={onFavoriteDelete}
                        onFavoriteRename={onFavoriteRename}
                        onFavoriteSelect={onFavoriteSelect}
                        onFavoriteUpdate={onFavoriteUpdate}
                        favorites={filterFavorites}
                        currentFavoriteId={filter.id}
                        isModified
                        closeOnSelect={false}
                        translations={ui.translations}
                        htmlId="searchFilterFavoritesPopover"
                        newFavoriteI18nKey="favorite.filter.addNew"
                    />
                    {ui && ui.excelExportSupported && (
                        <Button
                            id="excelExport"
                            color="primary"
                            onClick={onExportButtonClick}
                            outline
                        >
                            {ui.translations.exportAsXls}
                        </Button>
                    )}
                    {ui && ui.multiSelectionSupported && (
                        <Button
// ... (truncado, total 185 líneas)

Historial de Git

bf988bc6d Eliminar 43 vulnerabilidades npm: react-scripts→Vite, ESLint 9, limpieza de dependencias, corrección de errores
d5a25864e SearchFilter.jsx abre el diálogo de edición en ventana modal, si AbstractPagesRest.useModalDialog == true
0aea09df2 WIP: Análisis de texto de direcciones
8eb9bed9c Páginas de Wicket eliminadas. Iniciada importación de vcards. Modificado diseño del botón Exportar como Excel en páginas de lista.
b35853f98 Páginas de direcciones: la página de vista ahora se muestra como diálogo modal (error corregido en backend con Claude Code).