import React from 'react'; import { UxTListEntry } from "App/services/UxtestingService"; import { observer } from 'mobx-react-lite'; import { useStore } from 'App/mstore'; import { numberWithCommas } from 'App/utils'; import { Button, Input, Typography, Tag, Avatar, Modal, Space } from 'antd'; import AnimatedSVG from 'Shared/AnimatedSVG'; import { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG'; import { Loader, NoContent, Pagination, Link } from 'UI'; import { checkForRecent, getDateFromMill } from 'App/date'; import { UnorderedListOutlined, ArrowRightOutlined } from '@ant-design/icons'; import { useHistory, useParams } from 'react-router-dom'; import { withSiteId, usabilityTestingEdit, usabilityTestingView } from 'App/routes'; import { debounce } from 'App/utils'; import withPageTitle from 'HOCs/withPageTitle'; const { Search } = Input; const PER_PAGE = 10; let debouncedSearch: any = () => null const defaultDescription = `To evaluate the usability of [Feature Name], focusing on user interaction, efficiency, and satisfaction. The aim is to identify any usability issues that users may encounter, understand how they navigate [Feature Name], and gauge the intuitiveness of the workflow.` function TestsTable() { const inputRef = React.useRef(null); const [newTestTitle, setNewTestTitle] = React.useState(''); const [newTestDescription, setNewTestDescription] = React.useState(defaultDescription); const [isModalVisible, setIsModalVisible] = React.useState(false); const { uxtestingStore } = useStore(); const onSearch = (value: string) => { uxtestingStore.setQuery(value); debouncedSearch() } React.useEffect(() => { uxtestingStore.getList(); debouncedSearch = debounce(uxtestingStore.getList, 500) }, []); const onPageChange = (page: number) => { uxtestingStore.setPage(page); uxtestingStore.getList(); }; // @ts-ignore const { siteId } = useParams(); const history = useHistory(); const onClose = (confirmed: boolean) => { if (confirmed) { uxtestingStore.initNewTest(newTestTitle, newTestDescription); setNewTestDescription(''); setNewTestTitle(''); redirect('new'); } setIsModalVisible(false); }; const openModal = () => { setIsModalVisible(true); setTimeout(() => { inputRef.current?.focus(); }, 10); }; const redirect = (path: string) => { history.push(withSiteId(usabilityTestingEdit(path), siteId)); }; return (
onClose(true)} onCancel={() => onClose(false)} footer={ } > Title setNewTestTitle(e.target.value)} /> Test Objective (optional) setNewTestDescription(e.target.value)} placeholder="Share a brief statement about what you aim to discover through this study." />
Usability Tests
onSearch(v.target.value)} onSearch={onSearch} style={{ width: 200 }} />
Test Title
Created by
Updated at
Status
{uxtestingStore.searchQuery === '' ? "You haven't created any usability tests yet" : 'No matching results'}
} > {uxtestingStore.tests.map((test) => ( ))}
{uxtestingStore.isLoading || uxtestingStore.tests?.length === 0 ? null : ( <>
Showing{' '} {(uxtestingStore.page - 1) * PER_PAGE + 1} to{' '} {(uxtestingStore.page - 1) * PER_PAGE + uxtestingStore.tests.length} {' '} of {numberWithCommas(uxtestingStore.total)}{' '} tests.
)}
); } const statusMap = { preview: "Preview", 'in-progress': "In progress", paused: "Paused", closed: "Completed", } function Row({ test, siteId }: { test: UxTListEntry, siteId: string }) { const link = usabilityTestingView(test.testId.toString()) const editLink = usabilityTestingEdit(test.testId.toString()) const history = useHistory() const redirect = () => { history.push(withSiteId(test.status === 'preview' ? editLink : link, siteId)) } return (
} />
{test.title}
{test.description}
{test.createdBy.name} {checkForRecent(getDateFromMill(test.updatedAt)!, 'LLL dd, yyyy, hh:mm a')} {statusMap[test.status]}
); } const colors = { 'in-progress': 'green', closed: 'geekblue', paused: 'grey', preview: 'orange', } as const function Cell({ size, children }: { size: number; children?: React.ReactNode }) { return
{children}
; } export default withPageTitle('Usability Tests')(observer(TestsTable))