Xianbao QIAN
commited on
Commit
·
b92b41e
1
Parent(s):
675c4b1
add citation block and filters.
Browse files- src/components/AIPoliciesTable.tsx +33 -1
- src/pages/index.tsx +17 -13
- src/types.ts +1 -0
src/components/AIPoliciesTable.tsx
CHANGED
|
@@ -18,7 +18,23 @@ const AIPoliciesTable: React.FC<AIPoliciesTableProps> = ({ policies }) => {
|
|
| 18 |
setOpenYears((prev) => ({ ...prev, [year]: !prev[year] }));
|
| 19 |
};
|
| 20 |
|
| 21 |
-
const
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
const year = new Date(policy.releaseDate).getFullYear();
|
| 23 |
if (!acc[year]) {
|
| 24 |
acc[year] = [];
|
|
@@ -39,6 +55,19 @@ const AIPoliciesTable: React.FC<AIPoliciesTableProps> = ({ policies }) => {
|
|
| 39 |
|
| 40 |
return (
|
| 41 |
<div className="container mx-auto p-6">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
{sortedYears.map((year) => (
|
| 43 |
<div key={year} className="mb-12">
|
| 44 |
<button
|
|
@@ -67,6 +96,9 @@ const AIPoliciesTable: React.FC<AIPoliciesTableProps> = ({ policies }) => {
|
|
| 67 |
<div className="text-xs text-gray-400 dark:text-gray-500 mt-2">
|
| 68 |
{formatDate(policy.releaseDate)}
|
| 69 |
</div>
|
|
|
|
|
|
|
|
|
|
| 70 |
</td>
|
| 71 |
<td className="py-6 px-6 text-right">
|
| 72 |
{policy.link.zh && (
|
|
|
|
| 18 |
setOpenYears((prev) => ({ ...prev, [year]: !prev[year] }));
|
| 19 |
};
|
| 20 |
|
| 21 |
+
const uniqueTags = Array.from(new Set(policies.flatMap(policy => policy.tags.map(tag => tag.toLowerCase())))).map(tag => tag.charAt(0).toUpperCase() + tag.slice(1));
|
| 22 |
+
|
| 23 |
+
const [selectedTags, setSelectedTags] = useState<string[]>(uniqueTags);
|
| 24 |
+
|
| 25 |
+
const handleTagChange = (tag: string) => {
|
| 26 |
+
if (selectedTags.includes(tag)) {
|
| 27 |
+
setSelectedTags(selectedTags.filter(t => t !== tag));
|
| 28 |
+
} else {
|
| 29 |
+
setSelectedTags([...selectedTags, tag]);
|
| 30 |
+
}
|
| 31 |
+
};
|
| 32 |
+
|
| 33 |
+
const filteredPolicies = selectedTags.length === 0
|
| 34 |
+
? policies
|
| 35 |
+
: policies.filter(policy => policy.tags.some(tag => selectedTags.includes(tag.charAt(0).toUpperCase() + tag.slice(1))));
|
| 36 |
+
|
| 37 |
+
const groupedPolicies = filteredPolicies.reduce((acc, policy) => {
|
| 38 |
const year = new Date(policy.releaseDate).getFullYear();
|
| 39 |
if (!acc[year]) {
|
| 40 |
acc[year] = [];
|
|
|
|
| 55 |
|
| 56 |
return (
|
| 57 |
<div className="container mx-auto p-6">
|
| 58 |
+
<div className="mb-6 flex justify-center">
|
| 59 |
+
{uniqueTags.map(tag => (
|
| 60 |
+
<label key={tag} className="inline-flex items-center mr-4">
|
| 61 |
+
<input
|
| 62 |
+
type="checkbox"
|
| 63 |
+
className="form-checkbox h-5 w-5 text-blue-600"
|
| 64 |
+
checked={selectedTags.includes(tag)}
|
| 65 |
+
onChange={() => handleTagChange(tag)}
|
| 66 |
+
/>
|
| 67 |
+
<span className="ml-2 text-gray-700 dark:text-gray-400">{tag}</span>
|
| 68 |
+
</label>
|
| 69 |
+
))}
|
| 70 |
+
</div>
|
| 71 |
{sortedYears.map((year) => (
|
| 72 |
<div key={year} className="mb-12">
|
| 73 |
<button
|
|
|
|
| 96 |
<div className="text-xs text-gray-400 dark:text-gray-500 mt-2">
|
| 97 |
{formatDate(policy.releaseDate)}
|
| 98 |
</div>
|
| 99 |
+
<div className="text-xs text-gray-400 dark:text-gray-500 mt-2">
|
| 100 |
+
{policy.tags.map(tag => tag.charAt(0).toUpperCase() + tag.slice(1)).join(', ')}
|
| 101 |
+
</div>
|
| 102 |
</td>
|
| 103 |
<td className="py-6 px-6 text-right">
|
| 104 |
{policy.link.zh && (
|
src/pages/index.tsx
CHANGED
|
@@ -37,18 +37,7 @@ export async function getStaticProps() {
|
|
| 37 |
// Read policy data from policies.json
|
| 38 |
const policiesFilePath = path.join(process.cwd(), 'content', 'policies.json');
|
| 39 |
const policiesContent = fs.readFileSync(policiesFilePath, 'utf-8');
|
| 40 |
-
const
|
| 41 |
-
|
| 42 |
-
// Transform the policy data into the expected format
|
| 43 |
-
const policyData = rawPolicyData.map((policy: any) => ({
|
| 44 |
-
zh: policy.zh,
|
| 45 |
-
en: policy.en,
|
| 46 |
-
link: {
|
| 47 |
-
zh: policy.link.zh || null, // Only include link if provided
|
| 48 |
-
en: policy.link.en || null, // Only include link if provided
|
| 49 |
-
},
|
| 50 |
-
releaseDate: policy.releaseDate,
|
| 51 |
-
}));
|
| 52 |
|
| 53 |
// Sort policyData based on releaseDate in descending order
|
| 54 |
policyData.sort((a: PolicyData, b: PolicyData) => {
|
|
@@ -100,8 +89,23 @@ const OpenSourceHeatmap: React.FC<{ policyData: PolicyData[] }> = ({
|
|
| 100 |
</h1>
|
| 101 |
|
| 102 |
<AIPoliciesTable policies={policyData} />
|
| 103 |
-
</div>
|
| 104 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 105 |
{/* <div className="text-center text-sm my-8 space-y-4">
|
| 106 |
<p>
|
| 107 |
Models, Datasets, and Spaces from the top AI labs.
|
|
|
|
| 37 |
// Read policy data from policies.json
|
| 38 |
const policiesFilePath = path.join(process.cwd(), 'content', 'policies.json');
|
| 39 |
const policiesContent = fs.readFileSync(policiesFilePath, 'utf-8');
|
| 40 |
+
const policyData = JSON.parse(policiesContent);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
|
| 42 |
// Sort policyData based on releaseDate in descending order
|
| 43 |
policyData.sort((a: PolicyData, b: PolicyData) => {
|
|
|
|
| 89 |
</h1>
|
| 90 |
|
| 91 |
<AIPoliciesTable policies={policyData} />
|
|
|
|
| 92 |
|
| 93 |
+
{/* Add citation section */}
|
| 94 |
+
<div className="mt-16">
|
| 95 |
+
<h2 className="text-2xl font-bold mb-4">Citation</h2>
|
| 96 |
+
<p className="text-gray-700 dark:text-gray-400">
|
| 97 |
+
If you use this resource in your research, please cite it as follows:
|
| 98 |
+
</p>
|
| 99 |
+
<pre className="bg-gray-100 dark:bg-gray-800 p-4 rounded mt-2">
|
| 100 |
+
{`@misc{china_ai_policy_${new Date().getFullYear()},
|
| 101 |
+
title={China AI Policy Research},
|
| 102 |
+
author={Tiezhen Wang, Adina Yakefu, Lu Cheng},
|
| 103 |
+
year={2024},
|
| 104 |
+
}`}
|
| 105 |
+
</pre>
|
| 106 |
+
</div>
|
| 107 |
+
</div>
|
| 108 |
+
|
| 109 |
{/* <div className="text-center text-sm my-8 space-y-4">
|
| 110 |
<p>
|
| 111 |
Models, Datasets, and Spaces from the top AI labs.
|
src/types.ts
CHANGED
|
@@ -6,4 +6,5 @@ export interface PolicyData {
|
|
| 6 |
en: string;
|
| 7 |
};
|
| 8 |
releaseDate: string;
|
|
|
|
| 9 |
}
|
|
|
|
| 6 |
en: string;
|
| 7 |
};
|
| 8 |
releaseDate: string;
|
| 9 |
+
tags: string[]; // Add this line
|
| 10 |
}
|