Xianbao QIAN
commited on
Commit
·
cbc828e
1
Parent(s):
f831b65
group by years
Browse files
src/components/AIPoliciesTable.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
import React from 'react';
|
| 2 |
import Link from 'next/link';
|
| 3 |
|
| 4 |
interface PolicyData {
|
|
@@ -14,24 +14,47 @@ interface AIPoliciesTableProps {
|
|
| 14 |
}
|
| 15 |
|
| 16 |
const AIPoliciesTable: React.FC<AIPoliciesTableProps> = ({ policies }) => {
|
| 17 |
-
const
|
| 18 |
|
| 19 |
policies.forEach((policy) => {
|
| 20 |
-
|
| 21 |
-
|
|
|
|
| 22 |
}
|
| 23 |
-
|
|
|
|
|
|
|
|
|
|
| 24 |
});
|
| 25 |
|
| 26 |
-
|
| 27 |
-
Object.values(groupedPolicies).forEach((group) => {
|
| 28 |
-
group.sort((a, b) => new Date(b.releaseDate).getTime() - new Date(a.releaseDate).getTime());
|
| 29 |
-
});
|
| 30 |
|
| 31 |
return (
|
| 32 |
<div className="my-8">
|
| 33 |
-
{
|
| 34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
<table className="w-full border-collapse table-auto">
|
| 36 |
<tbody>
|
| 37 |
{Object.entries(groupedPolicies).map(([slug, policies], index) => {
|
|
@@ -43,7 +66,7 @@ const AIPoliciesTable: React.FC<AIPoliciesTableProps> = ({ policies }) => {
|
|
| 43 |
<td className="py-2 px-4 dark:text-white">
|
| 44 |
<div>{zhPolicy?.title}</div>
|
| 45 |
<div className="text-sm text-gray-500 dark:text-gray-400">{enPolicy?.title}</div>
|
| 46 |
-
<div className="text-xs text-gray-400 dark:text-gray-500">{zhPolicy?.releaseDate}</div>
|
| 47 |
</td>
|
| 48 |
<td className="py-2 px-4">
|
| 49 |
{policies.map((policy) => (
|
|
@@ -65,7 +88,7 @@ const AIPoliciesTable: React.FC<AIPoliciesTableProps> = ({ policies }) => {
|
|
| 65 |
})}
|
| 66 |
</tbody>
|
| 67 |
</table>
|
| 68 |
-
|
| 69 |
</div>
|
| 70 |
);
|
| 71 |
};
|
|
|
|
| 1 |
+
import React, { useState } from 'react';
|
| 2 |
import Link from 'next/link';
|
| 3 |
|
| 4 |
interface PolicyData {
|
|
|
|
| 14 |
}
|
| 15 |
|
| 16 |
const AIPoliciesTable: React.FC<AIPoliciesTableProps> = ({ policies }) => {
|
| 17 |
+
const groupedPoliciesByYear: { [year: string]: { [slug: string]: PolicyData[] } } = {};
|
| 18 |
|
| 19 |
policies.forEach((policy) => {
|
| 20 |
+
const year = new Date(policy.releaseDate).getFullYear().toString();
|
| 21 |
+
if (!groupedPoliciesByYear[year]) {
|
| 22 |
+
groupedPoliciesByYear[year] = {};
|
| 23 |
}
|
| 24 |
+
if (!groupedPoliciesByYear[year][policy.slug]) {
|
| 25 |
+
groupedPoliciesByYear[year][policy.slug] = [];
|
| 26 |
+
}
|
| 27 |
+
groupedPoliciesByYear[year][policy.slug].push(policy);
|
| 28 |
});
|
| 29 |
|
| 30 |
+
const sortedYears = Object.keys(groupedPoliciesByYear).sort((a, b) => parseInt(b) - parseInt(a));
|
|
|
|
|
|
|
|
|
|
| 31 |
|
| 32 |
return (
|
| 33 |
<div className="my-8">
|
| 34 |
+
{sortedYears.map((year) => (
|
| 35 |
+
<YearSection key={year} year={year} groupedPolicies={groupedPoliciesByYear[year]} />
|
| 36 |
+
))}
|
| 37 |
+
</div>
|
| 38 |
+
);
|
| 39 |
+
};
|
| 40 |
+
|
| 41 |
+
interface YearSectionProps {
|
| 42 |
+
year: string;
|
| 43 |
+
groupedPolicies: { [slug: string]: PolicyData[] };
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
const YearSection: React.FC<YearSectionProps> = ({ year, groupedPolicies }) => {
|
| 47 |
+
const [isOpen, setIsOpen] = useState(true);
|
| 48 |
+
|
| 49 |
+
return (
|
| 50 |
+
<div className="mb-8">
|
| 51 |
+
<button
|
| 52 |
+
className="text-xl font-bold mb-2 focus:outline-none"
|
| 53 |
+
onClick={() => setIsOpen(!isOpen)}
|
| 54 |
+
>
|
| 55 |
+
{year} {isOpen ? '▼' : '▶'}
|
| 56 |
+
</button>
|
| 57 |
+
{isOpen && (
|
| 58 |
<table className="w-full border-collapse table-auto">
|
| 59 |
<tbody>
|
| 60 |
{Object.entries(groupedPolicies).map(([slug, policies], index) => {
|
|
|
|
| 66 |
<td className="py-2 px-4 dark:text-white">
|
| 67 |
<div>{zhPolicy?.title}</div>
|
| 68 |
<div className="text-sm text-gray-500 dark:text-gray-400">{enPolicy?.title}</div>
|
| 69 |
+
<div className="text-xs text-gray-400 dark:text-gray-500">{new Date(zhPolicy?.releaseDate || '').toLocaleDateString()}</div>
|
| 70 |
</td>
|
| 71 |
<td className="py-2 px-4">
|
| 72 |
{policies.map((policy) => (
|
|
|
|
| 88 |
})}
|
| 89 |
</tbody>
|
| 90 |
</table>
|
| 91 |
+
)}
|
| 92 |
</div>
|
| 93 |
);
|
| 94 |
};
|