diff --git a/src/lib/components/molecules/MoreFilters.svelte b/src/lib/components/molecules/MoreFilters.svelte
new file mode 100644
index 0000000..1251c4b
--- /dev/null
+++ b/src/lib/components/molecules/MoreFilters.svelte
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/src/lib/components/molecules/Pagination.svelte b/src/lib/components/molecules/Pagination.svelte
new file mode 100644
index 0000000..d3a2bff
--- /dev/null
+++ b/src/lib/components/molecules/Pagination.svelte
@@ -0,0 +1,50 @@
+
+
+
+
+
diff --git a/src/lib/components/molecules/Projects.svelte b/src/lib/components/molecules/Projects.svelte
new file mode 100644
index 0000000..a13f1ad
--- /dev/null
+++ b/src/lib/components/molecules/Projects.svelte
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/src/lib/components/molecules/Search.svelte b/src/lib/components/molecules/Search.svelte
new file mode 100644
index 0000000..158e357
--- /dev/null
+++ b/src/lib/components/molecules/Search.svelte
@@ -0,0 +1,41 @@
+
+
+
+
+
diff --git a/src/lib/components/molecules/Starred.svelte b/src/lib/components/molecules/Starred.svelte
new file mode 100644
index 0000000..cd66666
--- /dev/null
+++ b/src/lib/components/molecules/Starred.svelte
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/src/lib/components/organisms/FileTable.svelte b/src/lib/components/organisms/FileTable.svelte
new file mode 100644
index 0000000..b625919
--- /dev/null
+++ b/src/lib/components/organisms/FileTable.svelte
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+ {$_(i18n.heading.name)}
+
+ |
+
+ {$_(i18n.heading.lastUpdated)}
+ |
+
+
+
+ {#each projects as project}
+
+
+
+
+
+ {project.name}
+ {#each project.members as member}
+
+
+
+ {/each}
+
+
+ {project.description}
+
+
+
+ |
+
+
+
+
+
+
+
+
+ {$_(i18n.table.updated, {
+ values: {
+ relativeTime: project.lastUpdated.toISOString()
+ }
+ })}
+
+
+ |
+
+ {/each}
+
+
diff --git a/src/lib/components/pages/Projects.svelte b/src/lib/components/pages/Projects.svelte
new file mode 100644
index 0000000..6fa6de7
--- /dev/null
+++ b/src/lib/components/pages/Projects.svelte
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/src/lib/components/templates/Profile.svelte b/src/lib/components/templates/Profile.svelte
index dfcfa48..5657f09 100644
--- a/src/lib/components/templates/Profile.svelte
+++ b/src/lib/components/templates/Profile.svelte
@@ -20,6 +20,13 @@ You should have received a copy of the GNU Affero General Public License along w
import Created from '../atoms/Created.svelte';
import DisplayName from '../atoms/DisplayName.svelte';
+ /**
+ * Translation keys.
+ */
+ const i18n = {
+ heading: 'page.profile.heading'
+ };
+
/**
* Required context for populating the template.
*/
diff --git a/src/lib/components/templates/Projects.svelte b/src/lib/components/templates/Projects.svelte
new file mode 100644
index 0000000..1358f29
--- /dev/null
+++ b/src/lib/components/templates/Projects.svelte
@@ -0,0 +1,76 @@
+
+
+
+
+
diff --git a/src/lib/i18n/locales/de.json b/src/lib/i18n/locales/de.json
index 417e113..ac729e1 100644
--- a/src/lib/i18n/locales/de.json
+++ b/src/lib/i18n/locales/de.json
@@ -79,6 +79,38 @@
"heading": "Projekte"
}
},
+ "projects": {
+ "file_table": {
+ "updated": ""
+ },
+ "form": {
+ "fields": {
+ "more_filters": {
+ "submit": ""
+ },
+ "projects": {
+ "submit": ""
+ },
+ "search": {
+ "placeholder": "",
+ "submit": ""
+ },
+ "starred": {
+ "submit": ""
+ }
+ }
+ },
+ "nav": {
+ "next": "",
+ "previous": ""
+ },
+ "table": {
+ "heading": {
+ "last_updated": "",
+ "name": ""
+ }
+ }
+ },
"welcome": "Willkommen bei Anvil!"
}
}
diff --git a/src/lib/i18n/locales/en.json b/src/lib/i18n/locales/en.json
index 2ae8919..a4c0bf3 100644
--- a/src/lib/i18n/locales/en.json
+++ b/src/lib/i18n/locales/en.json
@@ -79,6 +79,38 @@
"heading": "Projects"
}
},
+ "projects": {
+ "file_table": {
+ "updated": "Updated {relativeTime}"
+ },
+ "form": {
+ "fields": {
+ "more_filters": {
+ "submit": "More Filters"
+ },
+ "projects": {
+ "submit": "My projects"
+ },
+ "search": {
+ "placeholder": "Search or filter",
+ "submit": "Submit"
+ },
+ "starred": {
+ "submit": "Starred"
+ }
+ }
+ },
+ "nav": {
+ "next": "Next",
+ "previous": "Previous"
+ },
+ "table": {
+ "heading": {
+ "last_updated": "Last updated",
+ "name": "Name"
+ }
+ }
+ },
"welcome": "Welcome to Anvil!"
}
}
diff --git a/src/lib/i18n/locales/he.json b/src/lib/i18n/locales/he.json
index 4463811..36013e5 100644
--- a/src/lib/i18n/locales/he.json
+++ b/src/lib/i18n/locales/he.json
@@ -79,6 +79,38 @@
"heading": "פרויקטים"
}
},
+ "projects": {
+ "file_table": {
+ "updated": ""
+ },
+ "form": {
+ "fields": {
+ "more_filters": {
+ "submit": ""
+ },
+ "projects": {
+ "submit": ""
+ },
+ "search": {
+ "placeholder": "",
+ "submit": ""
+ },
+ "starred": {
+ "submit": ""
+ }
+ }
+ },
+ "nav": {
+ "next": "",
+ "previous": ""
+ },
+ "table": {
+ "heading": {
+ "last_updated": "",
+ "name": ""
+ }
+ }
+ },
"welcome": ""
}
}
diff --git a/src/routes/projects/+page.server.js b/src/routes/projects/+page.server.js
new file mode 100644
index 0000000..13ff6ea
--- /dev/null
+++ b/src/routes/projects/+page.server.js
@@ -0,0 +1,92 @@
+/* Providing context for ImportProject page.
+ * Copyright (C) 2024 André Jaenisch
+ * SPDX-FileCopyrightText: 2024 André Jaenisch
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License along with this program. If not, see .
+ */
+
+/** @type {import('./$types').PageServerLoad} */
+export async function load({ params }) {
+ return {
+ projects: [
+ {
+ name: 'Project A',
+ description:
+ 'This software project is a web-based application that will allow users to book appointments online.',
+ avatar: 'https://example.com',
+ // Date back three months
+ lastUpdated: new Date(Date.now() - 3 * 30 * 24 * 60 * 60 * 1000),
+ members: [
+ {
+ name: 'Person A',
+ avatar: 'https://example.com',
+ slug: 'a'
+ },
+ {
+ name: 'Person B',
+ avatar: 'https://example.com',
+ slug: 'b'
+ },
+ {
+ name: 'Person C',
+ avatar: 'https://example.com',
+ slug: 'c'
+ }
+ ],
+ tags: [
+ {
+ name: 'ActivityPub',
+ link: '/tag/ActivityPub'
+ },
+ {
+ name: 'css',
+ link: '/tag/css'
+ },
+ {
+ name: 'guile',
+ link: '/tag/guile'
+ }
+ ]
+ },
+ {
+ name: 'Project B',
+ description:
+ 'This software project is a web-based application that will allow users to book appointments online.',
+ avatar: 'https://example.com',
+ // Date back three months
+ lastUpdated: new Date(Date.now() - 3 * 30 * 24 * 60 * 60 * 1000),
+ members: [
+ {
+ name: 'Person A',
+ avatar: 'https://example.com',
+ slug: 'a'
+ },
+ {
+ name: 'Person B',
+ avatar: 'https://example.com',
+ slug: 'b'
+ }
+ ],
+ tags: [
+ {
+ name: 'ActivityPub',
+ link: '/tag/ActivityPub'
+ },
+ {
+ name: 'css',
+ link: '/tag/css'
+ },
+ {
+ name: 'guile',
+ link: '/tag/guile'
+ }
+ ]
+ }
+ ]
+ };
+}
diff --git a/src/routes/projects/+page.svelte b/src/routes/projects/+page.svelte
new file mode 100644
index 0000000..eaa2a98
--- /dev/null
+++ b/src/routes/projects/+page.svelte
@@ -0,0 +1,14 @@
+
+
+
+
+