feat: update API controllers, validations, and Vue components
All checks were successful
CI / container-job (push) Successful in 49s

- 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

@ -1,4 +1,4 @@
<script setup>
<script lang="ts" setup>
import { computed } from 'vue';
const props = defineProps({
@ -22,55 +22,55 @@ const avatar = computed(() => {
const username = computed(() => props.username);
const darkenColor = (color) => {
const r = parseInt(color.slice(0, 2), 16);
const g = parseInt(color.slice(2, 4), 16);
const b = parseInt(color.slice(4, 6), 16);
// const darkenColor = (color: string) => {
// const r = parseInt(color.slice(0, 2), 16);
// const g = parseInt(color.slice(2, 4), 16);
// const b = parseInt(color.slice(4, 6), 16);
const darkerR = Math.round(r * 0.6);
const darkerG = Math.round(g * 0.6);
const darkerB = Math.round(b * 0.6);
// const darkerR = Math.round(r * 0.6);
// const darkerG = Math.round(g * 0.6);
// const darkerB = Math.round(b * 0.6);
const darkerColor = ((darkerR << 16) + (darkerG << 8) + darkerB).toString(16);
// const darkerColor = ((darkerR << 16) + (darkerG << 8) + darkerB).toString(16);
return darkerColor.padStart(6, '0');
};
// return darkerColor.padStart(6, '0');
// };
const getColorFromName = (name) => {
let hash = 0;
for (let i = 0; i < name.length; i++) {
hash = name.charCodeAt(i) + ((hash << 5) - hash);
}
let color = '#';
for (let i = 0; i < 3; i++) {
const value = (hash >> (i * 8)) & 0xff;
color += ('00' + value.toString(16)).substr(-2);
}
return color.replace('#', '');
};
// const getColorFromName = (name: string): string => {
// let hash = 0;
// for (let i = 0; i < name.length; i++) {
// hash = name.charCodeAt(i) + ((hash << 5) - hash);
// }
// let color = '#';
// for (let i = 0; i < 3; i++) {
// const value = (hash >> (i * 8)) & 0xff;
// color += ('00' + value.toString(16)).substr(-2);
// }
// return color.replace('#', '');
// };
const lightenColor = (hexColor, percent) => {
let r = parseInt(hexColor.substring(0, 2), 16);
let g = parseInt(hexColor.substring(2, 4), 16);
let b = parseInt(hexColor.substring(4, 6), 16);
// const lightenColor = (hexColor: string, percent: number): string => {
// let r = parseInt(hexColor.substring(0, 2), 16);
// let g = parseInt(hexColor.substring(2, 4), 16);
// let b = parseInt(hexColor.substring(4, 6), 16);
r = Math.floor(r * (100 + percent) / 100);
g = Math.floor(g * (100 + percent) / 100);
b = Math.floor(b * (100 + percent) / 100);
// r = Math.floor(r * (100 + percent) / 100);
// g = Math.floor(g * (100 + percent) / 100);
// b = Math.floor(b * (100 + percent) / 100);
r = (r < 255) ? r : 255;
g = (g < 255) ? g : 255;
b = (b < 255) ? b : 255;
// r = (r < 255) ? r : 255;
// g = (g < 255) ? g : 255;
// b = (b < 255) ? b : 255;
const lighterHex = ((r << 16) | (g << 8) | b).toString(16);
// const lighterHex = ((r << 16) | (g << 8) | b).toString(16);
return lighterHex.padStart(6, '0');
};
// return lighterHex.padStart(6, '0');
// };
const generateAvatarUrl = (name) => {
const originalColor = getColorFromName(name);
const backgroundColor = lightenColor(originalColor, 60);
const textColor = darkenColor(originalColor);
const generateAvatarUrl = (name: string): string => {
// const originalColor = getColorFromName(name);
// const backgroundColor = lightenColor(originalColor, 60);
// const textColor = darkenColor(originalColor);
const avatarUrl = `/api/avatar?name=${name}&size=50`;
return avatarUrl;