feat: update API controllers, validations, and Vue components

- Modified Api/Authors.Controller.ts to use only personal types and sort by dataset_count.
- Completely rewritten AvatarController.ts.
- Added new Api/CollectionsController.ts for querying collections and collection_roles.
- Modified Api/DatasetController.ts to preload titles, identifier and order by server_date_published.
- Modified FileController.ts to serve files from /storage/app/data/ instead of /storage/app/public.
- Added new Api/UserController for requesting submitters (getSubmitters).
- Improved OaiController.ts with performant DB queries for better ResumptionToken handling.
- Modified Submitter/DatasetController.ts by adding a categorize method for library classification.
- Rewritten ResumptionToken.ts.
- Improved TokenWorkerService.ts to utilize browser fingerprint.
- Edited dataset.ts by adding the doiIdentifier property.
- Enhanced person.ts to improve the fullName property.
- Completely rewritten AsideMenuItem.vue component.
- Updated CarBoxClient.vue to use TypeScript.
- Added new CardBoxDataset.vue for displaying recent datasets on the dashboard.
- Completely rewritten TableSampleClients.vue for the dashboard.
- Completely rewritten UserAvatar.vue.
- Made small layout changes in Dashboard.vue.
- Added new Category.vue for browsing scientific collections.
- Adapted the pinia store in main.ts.
- Added additional routes in start/routes.ts and start/api/routes.ts.
- Improved referenceValidation.ts for better ISBN existence checking.
- NPM dependency updates.
This commit is contained in:
Kaimbacher 2025-03-14 17:39:58 +01:00
parent 36cd7a757b
commit b540547e4c
34 changed files with 1757 additions and 1018 deletions

View file

@ -2,7 +2,6 @@
import { Head } from '@inertiajs/vue3';
import { computed, onMounted } from 'vue';
import { MainService } from '@/Stores/main';
// import { Inertia } from '@inertiajs/inertia';
import {
mdiAccountMultiple,
mdiDatabaseOutline,
@ -13,21 +12,18 @@ import {
mdiGithub,
mdiChartPie,
} from '@mdi/js';
// import { containerMaxW } from '@/config.js'; // "xl:max-w-6xl xl:mx-auto"
// import * as chartConfig from '@/Components/Charts/chart.config.js';
import LineChart from '@/Components/Charts/LineChart.vue';
import UserCard from '@/Components/unused/UserCard.vue';
import SectionMain from '@/Components/SectionMain.vue';
import CardBoxWidget from '@/Components/CardBoxWidget.vue';
import CardBox from '@/Components/CardBox.vue';
import TableSampleClients from '@/Components/TableSampleClients.vue';
import NotificationBar from '@/Components/NotificationBar.vue';
// import NotificationBar from '@/Components/NotificationBar.vue';
import BaseButton from '@/Components/BaseButton.vue';
import CardBoxTransaction from '@/Components/CardBoxTransaction.vue';
import CardBoxClient from '@/Components/CardBoxClient.vue';
import LayoutAuthenticated from '@/Layouts/LayoutAuthenticated.vue';
import SectionTitleLineWithButton from '@/Components/SectionTitleLineWithButton.vue';
import SectionBannerStarOnGitHub from '@/Components/SectionBannerStarOnGitea.vue';
import CardBoxDataset from '@/Components/CardBoxDataset.vue';
const mainService = MainService()
// const chartData = ref();
@ -37,36 +33,32 @@ const fillChartData = async () => {
// chartData.value = mainService.graphData;
};
const chartData = computed(() => mainService.graphData);
onMounted(async () => {
await mainService.fetchChartData("2022");
});
;
/* Fetch sample data */
mainService.fetch('clients');
mainService.fetch('history');
// onMounted(async () => {
// await mainService.fetchChartData("2022");
// });
mainService.fetchApi('authors');
mainService.fetchApi('datasets');
// mainService.fetch('clients');
// mainService.fetch('history');
// mainService.fetchApi('authors');
// mainService.fetchApi('datasets');
// const clientBarItems = computed(() => mainService.clients.slice(0, 4));
const transactionBarItems = computed(() => mainService.history);
// const transactionBarItems = computed(() => mainService.history);
const authorBarItems = computed(() => mainService.authors.slice(0, 4));
const authorBarItems = computed(() => mainService.authors.slice(0, 5));
const authors = computed(() => mainService.authors);
const datasets = computed(() => mainService.datasets);
// const props = defineProps({
// user: {
// type: Object,
// default: () => ({}),
// }
// });
const datasetBarItems = computed(() => mainService.datasets.slice(0, 5));
// let test = datasets.value;
// console.log(test);
</script>
<template>
<LayoutAuthenticated :showAsideMenu="false">
<Head title="Dashboard" />
<!-- <section class="p-6" v-bind:class="containerMaxW"> -->
<SectionMain>
<SectionTitleLineWithButton v-bind:icon="mdiChartTimelineVariant" title="Overview" main>
<BaseButton
@ -97,16 +89,13 @@ const datasets = computed(() => mainService.datasets);
:number="datasets.length"
label="Publications"
/>
<!-- <CardBoxWidget trend="193" trend-type="info" color="text-blue-500" :icon="mdiCartOutline" :number="datasets.length"
prefix="$" label="Publications" /> -->
<CardBoxWidget
trend="Overflow"
trend-type="alert"
color="text-red-500"
trend="+25%"
trend-type="up"
color="text-purple-500"
:icon="mdiChartTimelineVariant"
:number="256"
suffix="%"
label="Performance"
:number="52"
label="Citations"
/>
</div>
@ -118,25 +107,19 @@ const datasets = computed(() => mainService.datasets);
:name="client.name"
:email="client.email"
:date="client.created_at"
:text="client.datasetCount"
:text="client.identifier_orcid"
:count="client.dataset_count"
/>
</div>
<div class="flex flex-col justify-between">
<CardBoxTransaction
v-for="(transaction, index) in transactionBarItems"
<CardBoxDataset
v-for="(dataset, index) in datasetBarItems"
:key="index"
:amount="transaction.amount"
:date="transaction.date"
:business="transaction.business"
:type="transaction.type"
:name="transaction.name"
:account="transaction.account"
:dataset="dataset"
/>
</div>
</div>
<UserCard />
<SectionBannerStarOnGitHub />
<SectionTitleLineWithButton :icon="mdiChartPie" title="Trends overview: Publications per month" />
@ -146,33 +129,13 @@ const datasets = computed(() => mainService.datasets);
</div>
</CardBox>
<SectionTitleLineWithButton :icon="mdiAccountMultiple" title="Submitters (to do)" />
<SectionTitleLineWithButton :icon="mdiAccountMultiple" title="Submitters" />
<NotificationBar color="info" :icon="mdiMonitorCellphone"> <b>Responsive table.</b> Collapses on mobile </NotificationBar>
<!-- <NotificationBar color="info" :icon="mdiMonitorCellphone"> <b>Responsive table.</b> Collapses on mobile </NotificationBar> -->
<CardBox :icon="mdiMonitorCellphone" title="Responsive table" has-table>
<TableSampleClients />
</CardBox>
<!-- <CardBox>
<p class="mb-3 text-gray-500 dark:text-gray-400">
Discover the power of Tethys, the cutting-edge web backend solution that revolutionizes the way you handle research
data. At the heart of Tethys lies our meticulously developed research data repository, which leverages state-of-the-art
CI/CD techniques to deliver a seamless and efficient experience.
</p>
<p class="mb-3 text-gray-500 dark:text-gray-400">
CI/CD, or Continuous Integration and Continuous Deployment, is a modern software development approach that ensures your
code undergoes automated testing, continuous integration, and frequent deployment. By embracing CI/CD techniques, we
ensure that every code change in our research data repository is thoroughly validated, enhancing reliability and
accelerating development cycles.
</p>
<p class="mb-3 text-gray-500 dark:text-gray-400">
With Tethys, you can say goodbye to the complexities of manual deployments and embrace a streamlined process that
eliminates errors and minimizes downtime. Our CI/CD pipeline automatically verifies each code commit, runs comprehensive
tests, and deploys the repository seamlessly, ensuring that your research data is always up-to-date and accessible.
</p>
</CardBox> -->
</SectionMain>
<!-- </section> -->
</LayoutAuthenticated>
</template>