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 { 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 { FabInput } from '../base/fab-input'; declare const Application: IApplication; interface OrdersProps { 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 */ const Orders: React.FC = ({ onSuccess, onError }) => { const { t } = useTranslation('admin'); const [filters, setFilters] = useImmer(initFilters); const [clearFilters, setClearFilters] = useState(false); const [accordion, setAccordion] = useState({}); 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 }; }); }; /** * Open/close accordion items */ const handleAccordion = (id, state) => { setAccordion({ ...accordion, [id]: state }); }; /** * Returns a className according to the status */ const statusColor = (status: string) => { switch (status) { case 'error': return 'error'; case 'canceled': return 'canceled'; case 'pending' || 'under_preparation': return 'pending'; default: return 'normal'; } }; 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')}
); }; const OrdersWrapper: React.FC = (props) => { return ( ); }; Application.Components.component('orders', react2angular(OrdersWrapper, ['onSuccess', 'onError'])); interface Filters { reference: string, status: checklistOption[], memberId: number } const initFilters: Filters = { reference: '', status: [], memberId: null };