import React, { useState, useEffect } from 'react'; import { useImmer } from 'use-immer'; import { useTranslation } from 'react-i18next'; import { react2angular } from 'react2angular'; import { Loader } from '../base/loader'; import { IApplication } from '../../models/application'; import { useForm } from 'react-hook-form'; import { FabButton } from '../base/fab-button'; import { StoreListHeader } from './store-list-header'; import { AccordionItem } from './accordion-item'; import { OrderItem } from './order-item'; import { MemberSelect } from '../user/member-select'; import { User } from '../../models/user'; import { FormInput } from '../form/form-input'; import { TDateISODate } from '../../typings/date-iso'; import OrderAPI from '../../api/order'; import { Order } from '../../models/order'; declare const Application: IApplication; interface OrdersProps { currentUser?: User, onSuccess: (message: string) => void, onError: (message: string) => void, } /** * Option format, expected by react-select * @see https://github.com/JedWatson/react-select */ type selectOption = { value: number, label: string }; /** * Option format, expected by checklist */ type checklistOption = { value: number, label: string }; /** * Admin list of orders */ // TODO: delete next eslint disable // eslint-disable-next-line @typescript-eslint/no-unused-vars const Orders: React.FC = ({ currentUser, onSuccess, onError }) => { const { t } = useTranslation('admin'); const { register, getValues } = useForm(); const [orders, setOrders] = useState>([]); const [filters, setFilters] = useImmer(initFilters); const [clearFilters, setClearFilters] = useState(false); const [accordion, setAccordion] = useState({}); useEffect(() => { OrderAPI.index({}).then(res => { setOrders(res.data); }).catch(onError); }, []); useEffect(() => { applyFilters(); setClearFilters(false); }, [clearFilters]); /** * Create a new order */ const newOrder = () => { console.log('Create new order'); }; const statusOptions: checklistOption[] = [ { value: 0, label: t('app.admin.store.orders.status.error') }, { value: 1, label: t('app.admin.store.orders.status.canceled') }, { value: 2, label: t('app.admin.store.orders.status.pending') }, { value: 3, label: t('app.admin.store.orders.status.under_preparation') }, { value: 4, label: t('app.admin.store.orders.status.paid') }, { value: 5, label: t('app.admin.store.orders.status.ready') }, { value: 6, label: t('app.admin.store.orders.status.collected') }, { value: 7, label: t('app.admin.store.orders.status.refunded') } ]; /** * Apply filters */ const applyFilters = () => { console.log('Apply filters:', filters); }; /** * Clear filters */ const clearAllFilters = () => { setFilters(initFilters); setClearFilters(true); console.log('Clear all filters'); }; /** * Creates sorting options to the react-select format */ const buildOptions = (): Array => { return [ { value: 0, label: t('app.admin.store.orders.sort.newest') }, { value: 1, label: t('app.admin.store.orders.sort.oldest') } ]; }; /** * Display option: sorting */ const handleSorting = (option: selectOption) => { console.log('Sort option:', option); }; /** * Filter: by status */ const handleSelectStatus = (s: checklistOption, checked) => { const list = [...filters.status]; checked ? list.push(s) : list.splice(list.indexOf(s), 1); setFilters(draft => { return { ...draft, status: list }; }); }; /** * Filter: by member */ const handleSelectMember = (userId: number) => { setFilters(draft => { return { ...draft, memberId: userId }; }); }; /** * Filter: by period */ const handlePeriod = () => { console.log(getValues(['period_from', 'period_to'])); }; /** * Open/close accordion items */ const handleAccordion = (id, state) => { setAccordion({ ...accordion, [id]: state }); }; return (

{t('app.admin.store.orders.heading')}

{false &&
{t('app.admin.store.orders.create_order')}
}

{t('app.admin.store.orders.filter')}

{t('app.admin.store.orders.filter_clear')}
{t('app.admin.store.orders.filter_apply')}
{statusOptions.map(s => ( ))}
{t('app.admin.store.orders.filter_apply')}
{t('app.admin.store.orders.filter_apply')}
from to
{t('app.admin.store.orders.filter_apply')}
{orders.map(order => ( ))}
); }; const OrdersWrapper: React.FC = (props) => { return ( ); }; Application.Components.component('orders', react2angular(OrdersWrapper, ['currentUser', 'onSuccess', 'onError'])); interface Filters { reference: string, status: checklistOption[], memberId: number, period_from: TDateISODate, period_to: TDateISODate } const initFilters: Filters = { reference: '', status: [], memberId: null, period_from: null, period_to: null };