From 22596d3fd49a33d07c0392ea2afe45cc26e1c6e9 Mon Sep 17 00:00:00 2001
From: Mykhailo Oliinyk Something went wrong There are no people on the server There are no people matching the current search criteria
+ Something went wrong
+
+ There are no people on the server
+ There are no people matching the current search criteria Filters
-
All
-
-
+ Home Page
- Page not found
- People Page
-
-
-
-
- );
-};
diff --git a/src/components/PeopleTable/PeopleTable.tsx b/src/components/PeopleTable/PeopleTable.tsx
new file mode 100644
index 000000000..18ef4693f
--- /dev/null
+++ b/src/components/PeopleTable/PeopleTable.tsx
@@ -0,0 +1,150 @@
+import { useParams, useSearchParams } from 'react-router-dom';
+import { Person } from '../../types';
+import { PersonLink } from '../PersonLink/PersonLink';
+
+type Props = {
+ people: Person[];
+};
+
+type SortField = 'name' | 'sex' | 'born' | 'died';
+
+const getSortedPeople = (people: Person[], sort: string, order: string) => {
+ if (!sort) {
+ return people;
+ }
+
+ return [...people].sort((a, b) => {
+ const field = sort as SortField;
+ const direction = order === 'desc' ? -1 : 1;
+
+ if (field === 'born' || field === 'died') {
+ return (a[field] - b[field]) * direction;
+ }
+
+ return a[field].localeCompare(b[field]) * direction;
+ });
+};
+
+export const PeopleTable: React.FC
-
-
-
-
-
-
- Name
-
-
-
-
-
-
-
-
-
-
- Sex
-
-
-
-
-
-
-
-
-
-
- Born
-
-
-
-
-
-
-
-
-
-
- Died
-
-
-
-
-
-
-
-
- Mother
- Father
-
-
-
-
- Pieter Haverbeke
-
- m
- 1602
- 1642
- -
-
-
- Lieven van Haverbeke
-
-
-
-
-
-
-
- Anna van Hecke
-
-
- f
- 1607
- 1670
- Martijntken Beelaert
- Paschasius van Hecke
-
-
-
-
- Lieven Haverbeke
-
- m
- 1631
- 1676
-
-
- Anna van Hecke
-
-
-
- Pieter Haverbeke
-
-
-
-
-
-
- Elisabeth Hercke
-
-
- f
- 1632
- 1674
- Margriet de Brabander
- Willem Hercke
-
-
-
-
- Daniel Haverbeke
-
- m
- 1652
- 1723
-
-
- Elisabeth Hercke
-
-
-
- Lieven Haverbeke
-
-
-
-
-
-
- Joanna de Pape
-
-
- f
- 1654
- 1723
- Petronella Wauters
- Vincent de Pape
-
-
-
-
-
- Martina de Pape
-
-
- f
- 1666
- 1727
- Petronella Wauters
- Vincent de Pape
-
-
-
-
- Willem Haverbeke
-
- m
- 1668
- 1731
-
-
- Elisabeth Hercke
-
-
-
- Lieven Haverbeke
-
-
-
-
-
- Jan Haverbeke
-
- m
- 1671
- 1731
-
-
- Elisabeth Hercke
-
-
-
- Lieven Haverbeke
-
-
-
-
-
-
- Maria de Rycke
-
-
- f
- 1683
- 1724
- Laurentia van Vlaenderen
- Frederik de Rycke
-
-
-
-
-
- Livina Haverbeke
-
-
- f
- 1692
- 1743
-
-
- Joanna de Pape
-
-
-
- Daniel Haverbeke
-
-
-
-
-
-
- Pieter Bernard Haverbeke
-
-
- m
- 1695
- 1762
- Petronella Wauters
-
- Willem Haverbeke
-
-
-
-
-
-
- Lieven de Causmaecker
-
-
- m
- 1696
- 1724
- Joanna Claes
- Carel de Causmaecker
-
-
-
-
-
- Jacoba Lammens
-
-
- f
- 1699
- 1740
- Livina de Vrieze
- Lieven Lammens
-
-
-
-
- Pieter de Decker
-
- m
- 1705
- 1780
- Petronella van de Steene
- Joos de Decker
-
-
-
-
-
- Laurentia Haverbeke
-
-
- f
- 1710
- 1786
-
-
- Maria de Rycke
-
-
-
- Jan Haverbeke
-
-
-
-
-
-
- Elisabeth Haverbeke
-
-
- f
- 1711
- 1754
-
-
- Maria de Rycke
-
-
-
- Jan Haverbeke
-
-
-
-
-
- Jan van Brussel
-
- m
- 1714
- 1748
- Joanna van Rooten
- Jacobus van Brussel
-
-
-
-
-
- Bernardus de Causmaecker
-
-
- m
- 1721
- 1789
-
-
- Livina Haverbeke
-
-
-
-
- Lieven de Causmaecker
-
-
-
-
-
-
-
- Jan Francies Haverbeke
-
-
- m
- 1725
- 1779
- Livina de Vrieze
-
-
- Pieter Bernard Haverbeke
-
-
-
-
-
-
-
- Angela Haverbeke
-
-
- f
- 1728
- 1734
- Livina de Vrieze
-
-
- Pieter Bernard Haverbeke
-
-
-
-
-
-
-
- Petronella de Decker
-
-
- f
- 1731
- 1781
-
-
- Livina Haverbeke
-
-
-
- Pieter de Decker
-
-
-
-
-
-
- Jacobus Bernardus van Brussel
-
-
- m
- 1736
- 1809
-
-
- Elisabeth Haverbeke
-
-
-
- Jan van Brussel
-
-
-
-
-
-
- Pieter Antone Haverbeke
-
-
- m
- 1753
- 1798
-
-
- Petronella de Decker
-
-
-
-
- Jan Francies Haverbeke
-
-
-
-
-
-
-
- Jan Frans van Brussel
-
-
- m
- 1761
- 1833
- -
-
-
- Jacobus Bernardus van Brussel
-
-
-
-
-
-
-
- Livina Sierens
-
-
- f
- 1761
- 1826
- Maria van Waes
- Jan Sierens
-
-
-
-
-
- Joanna de Causmaecker
-
-
- f
- 1762
- 1807
- -
-
-
- Bernardus de Causmaecker
-
-
-
-
-
-
- Carel Haverbeke
-
- m
- 1796
- 1837
-
-
- Livina Sierens
-
-
-
-
- Pieter Antone Haverbeke
-
-
-
-
-
-
-
- Maria van Brussel
-
-
- f
- 1801
- 1834
-
-
- Joanna de Causmaecker
-
-
-
-
- Jan Frans van Brussel
-
-
-
-
-
-
- Carolus Haverbeke
-
- m
- 1832
- 1905
-
-
- Maria van Brussel
-
-
-
- Carel Haverbeke
-
-
-
-
-
-
- Maria Sturm
-
-
- f
- 1835
- 1917
- Seraphina Spelier
- Charles Sturm
-
-
-
-
-
- Emma de Milliano
-
-
- f
- 1876
- 1956
- Sophia van Damme
- Petrus de Milliano
-
-
-
-
- Emile Haverbeke
-
- m
- 1877
- 1968
-
-
- Maria Sturm
-
-
-
- Carolus Haverbeke
-
-
+
+
+ );
+};
diff --git a/src/components/PersonLink/PersonLink.tsx b/src/components/PersonLink/PersonLink.tsx
new file mode 100644
index 000000000..25f9eacd6
--- /dev/null
+++ b/src/components/PersonLink/PersonLink.tsx
@@ -0,0 +1,17 @@
+import { Link } from 'react-router-dom';
+import { Person } from '../../types';
+
+type Props = {
+ person: Person;
+};
+
+export const PersonLink: React.FC
+ {columns.map(({ label, field }) => (
+
+
+
+
+ {sortedPeople.map(person => {
+ const mother = person.mother || findPerson(person.motherName);
+ const father = person.father || findPerson(person.fatherName);
+
+ return (
+
+
+ {label}
+ {
+ event.preventDefault();
+ handleSort(field);
+ }}
+ href="#"
+ >
+
+
+
+
+
+
+ ))}
+
+ Mother
+ Father
+
+
+ );
+ })}
+
+
+
+
+ {person.sex}
+ {person.born}
+ {person.died}
+
+ {mother ? (
+
+
+
+ {father ? (
+
+ Home Page
;
diff --git a/src/pages/NotFoundPage/NotFoundPage.tsx b/src/pages/NotFoundPage/NotFoundPage.tsx
new file mode 100644
index 000000000..87fe719a7
--- /dev/null
+++ b/src/pages/NotFoundPage/NotFoundPage.tsx
@@ -0,0 +1,3 @@
+export const NotFoundPage = () => {
+ return Page not found
;
+};
diff --git a/src/pages/PeoplePage/PeoplePage.tsx b/src/pages/PeoplePage/PeoplePage.tsx
new file mode 100644
index 000000000..054610d5d
--- /dev/null
+++ b/src/pages/PeoplePage/PeoplePage.tsx
@@ -0,0 +1,91 @@
+import { useMemo } from 'react';
+import { Person } from '../../types';
+import { Loader } from '../../components/Loader';
+import { PeopleTable } from '../../components/PeopleTable/PeopleTable';
+import { PeopleFilters } from '../../components/PeopleFilter/PeopleFilters';
+import { useSearchParams } from 'react-router-dom';
+import { usePeople } from '../../store/PeopleContext';
+
+const getFilteredPeople = (people: Person[], searchParams: URLSearchParams) => {
+ let filtered = people;
+
+ const sex = searchParams.get('sex') || '';
+ const query = searchParams.get('query') || '';
+ const centuries = searchParams.getAll('century') || [];
+
+ if (sex) {
+ filtered = filtered.filter(person => person.sex === sex);
+ }
+
+ if (query) {
+ filtered = filtered.filter(person =>
+ [person.name, person.motherName, person.fatherName]
+ .map(name => name?.toLowerCase())
+ .some(name => name?.includes(query.toLowerCase())),
+ );
+ }
+
+ if (centuries.length) {
+ const centuryNumbers = centuries.map(Number);
+
+ filtered = filtered.filter(person =>
+ centuryNumbers.includes(Math.ceil(person.born / 100)),
+ );
+ }
+
+ return filtered;
+};
+
+export const PeoplePage = () => {
+ const { people, loading, error } = usePeople();
+ const [searchParams] = useSearchParams();
+
+ const visiblePeople = useMemo(
+ () => getFilteredPeople(people, searchParams),
+ [people, searchParams],
+ );
+
+ const showError = !loading && error;
+ const showNoPeople = !loading && !error && people.length === 0;
+ const showTable = !loading && !error && visiblePeople.length > 0;
+
+ return (
+ <>
+ People Page
+
+
There are no people on the server
)} - {showTable && ( + {showNoCriteriaMatch && (There are no people matching the current search criteria
)} - {!loading && !error && visiblePeople.length > 0 && ( -