Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
16904cc
feat: add folder alias and mapping features to settings
zurdi15 Dec 26, 2025
8727d31
feat: enhance exclusion management UI with improved dialog and descri…
zurdi15 Dec 26, 2025
151e78c
feat: update CreateExclusion dialog UI and enhance Excluded component…
zurdi15 Dec 26, 2025
e1c4b0a
feat: enhance exclusion management UI with localized descriptions and…
zurdi15 Dec 26, 2025
0ecc5f5
feat: add 'type' key to localization files for multiple languages
zurdi15 Dec 27, 2025
8651c02
Merge remote-tracking branch 'origin/master' into romm-2097
zurdi15 Dec 27, 2025
ce6529c
Update frontend/src/locales/hu_HU/settings.json
zurdi15 Dec 27, 2025
1bdadf6
Update frontend/src/locales/ko_KR/settings.json
zurdi15 Dec 27, 2025
646605a
Update frontend/src/locales/zh_TW/settings.json
zurdi15 Dec 27, 2025
d86e457
Update frontend/src/components/Settings/LibraryManagement/Config/Dial…
zurdi15 Dec 27, 2025
fa0d0c7
Refactor folder mapping logic and improve localization for Hungarian …
zurdi15 Dec 27, 2025
860fe7a
Enhance folder mapping logic with validation to prevent duplicate fsS…
zurdi15 Dec 27, 2025
931031a
Update frontend/src/locales/en_US/settings.json
zurdi15 Dec 27, 2025
e2eb90a
Update Polish localization for password placeholder text
zurdi15 Dec 27, 2025
b81e6d5
Remove unused styles from Excluded.vue component
zurdi15 Dec 27, 2025
710bef2
Refactor CreateFolderMapping.vue to improve styling and layout consis…
zurdi15 Dec 27, 2025
c8d75c9
Enhance validation in allMappings to prevent duplicate fsSlug entries…
zurdi15 Dec 27, 2025
8e20f21
Enhance FolderMappings component to fetch and display supported platf…
zurdi15 Dec 28, 2025
9b583ad
Added missing localizations
zurdi15 Dec 28, 2025
fec37a4
Refactor FolderMappings.vue to streamline template structure and impr…
zurdi15 Dec 28, 2025
66726eb
Fix fsSlug binding in DeleteFolderMapping dialog and adjust max-heigh…
zurdi15 Dec 28, 2025
d021053
Refactor Excluded and FolderMappings components to improve UI layout,…
zurdi15 Dec 28, 2025
6a2707c
Refactor Excluded and FolderMappings components to enhance search fun…
zurdi15 Dec 29, 2025
4f60361
feat: Refactor Library Management settings and add Missing Games comp…
zurdi15 Dec 29, 2025
cb9e602
fix: Improve auto-detection logic for platform slugs in FolderMappings
zurdi15 Dec 29, 2025
12e6619
fix: Clean up tab initialization and component usage in LibraryManage…
zurdi15 Dec 29, 2025
999f33a
refactor: Enhance UI layout and improve action button grouping in Exc…
zurdi15 Dec 29, 2025
c23d250
fix: Add scroll-content attribute to dialogs in MultiNoteManager for …
zurdi15 Dec 29, 2025
091d2e1
refactor: Simplify exclusion dialog handling and remove unused compon…
zurdi15 Dec 29, 2025
c0c8b97
fix: Disable value input when exclusion type is not selected
zurdi15 Dec 29, 2025
03feb3f
refactor: Enhance platform mapping functionality and improve display …
zurdi15 Dec 30, 2025
6661b71
Merge branch 'master' into romm-2097
zurdi15 Dec 30, 2025
6b0e2af
refactor: Simplify platform mapping logic and enhance error handling …
zurdi15 Dec 30, 2025
65645e2
refactor: Remove unused variables and functions in LibraryManagement …
zurdi15 Dec 30, 2025
402eff7
i18n: Add platform mapping messages to localization files
zurdi15 Dec 30, 2025
120493f
refactor: Rename variables for clarity and improve loading state mana…
zurdi15 Dec 30, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions frontend/src/components/Details/MultiNoteManager.vue
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,7 @@ watch(
v-model="showAddNoteDialog"
icon="mdi-note-plus"
width="800"
scroll-content
@close="closeAddNote"
>
<template #header>
Expand Down Expand Up @@ -535,6 +536,7 @@ watch(
v-model="showDeleteDialog"
icon="mdi-delete"
width="400"
scroll-content
@close="showDeleteDialog = false"
>
<template #header>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<script setup lang="ts">
import type { Emitter } from "mitt";
import { inject, ref } from "vue";
import { inject, ref, computed } from "vue";
import { useI18n } from "vue-i18n";
import { useDisplay } from "vuetify";
import RDialog from "@/components/common/RDialog.vue";
Expand All @@ -9,72 +9,176 @@ import storeConfig from "@/stores/config";
import type { Events } from "@/types/emitter";

const { t } = useI18n();
const { mdAndUp, smAndDown } = useDisplay();
const { mdAndUp } = useDisplay();
const show = ref(false);
const emitter = inject<Emitter<Events>>("emitter");
const configStore = storeConfig();
const exclusionValue = ref();
const exclusionType = ref();
const exclusionIcon = ref();
const exclusionTitle = ref();
emitter?.on("showCreateExclusionDialog", ({ type, icon, title }) => {

const exclusionTypes = computed(() => [
{
type: "EXCLUDED_PLATFORMS",
title: t("common.platform"),
icon: "mdi-gamepad-variant-outline",
description: t("settings.exclusions-platforms-desc"),
},
{
type: "EXCLUDED_SINGLE_FILES",
title: t("settings.excluded-single-rom-files"),
icon: "mdi-file-remove-outline",
description: t("settings.exclusions-single-files-desc"),
},
{
type: "EXCLUDED_SINGLE_EXT",
title: t("settings.excluded-single-rom-extensions"),
icon: "mdi-file-code-outline",
description: t("settings.exclusions-single-ext-desc"),
},
{
type: "EXCLUDED_MULTI_FILES",
title: t("settings.excluded-multi-rom-files"),
icon: "mdi-file-multiple-outline",
description: t("settings.exclusions-multi-files-desc"),
},
{
type: "EXCLUDED_MULTI_PARTS_FILES",
title: t("settings.excluded-multi-rom-parts-files"),
icon: "mdi-folder-multiple-outline",
description: t("settings.exclusions-multi-parts-files-desc"),
},
{
type: "EXCLUDED_MULTI_PARTS_EXT",
title: t("settings.excluded-multi-rom-parts-extensions"),
icon: "mdi-file-cog-outline",
description: t("settings.exclusions-multi-parts-ext-desc"),
},
]);

emitter?.on("showCreateExclusionDialog", () => {
exclusionType.value = null;
exclusionIcon.value = null;
exclusionTitle.value = null;
exclusionValue.value = "";
show.value = true;
});

function selectExclusionType(type: string, icon: string, title: string) {
exclusionType.value = type;
exclusionIcon.value = icon;
exclusionTitle.value = title;
show.value = true;
});
}

function addExclusion() {
if (configStore.isExclusionType(exclusionType.value)) {
configApi.addExclusion({
exclusionValue: exclusionValue.value,
exclusionType: exclusionType.value,
});
configStore.addExclusion(exclusionType.value, exclusionValue.value);
closeDialog();
} else {
console.error(`Invalid exclusion type '${exclusionType.value}'`);
}
configApi.addExclusion({
exclusionValue: exclusionValue.value,
exclusionType: exclusionType.value,
});
configStore.addExclusion(exclusionType.value, exclusionValue.value);
closeDialog();
}

function closeDialog() {
show.value = false;
exclusionValue.value = "";
exclusionType.value = null;
exclusionIcon.value = null;
exclusionTitle.value = null;
}
</script>
<template>
<RDialog
v-model="show"
icon="mdi-cancel"
:width="mdAndUp ? '45vw' : '95vw'"
scroll-content
@close="closeDialog"
>
<template #content>
<v-row v-if="smAndDown" no-gutters>
<v-col class="mt-2 py-2 text-center">
<v-icon :icon="exclusionIcon" />
<span class="ml-2">{{ exclusionTitle }}</span>
</v-col>
</v-row>
<v-row class="align-center py-2 px-4" no-gutters>
<v-col v-if="mdAndUp" class="text-center" cols="2">
<div>
<v-icon :icon="exclusionIcon" />
</div>
<div class="mt-2">
<span class="ml-2">{{ exclusionTitle }}</span>
</div>
</v-col>
<v-col>
<v-text-field
v-model="exclusionValue"
class="py-2"
:class="{ 'ml-4': mdAndUp }"
variant="outlined"
required
hide-details
@keyup.enter="addExclusion"
/>
<v-row class="align-center" no-gutters>
<v-col cols="12">
<v-card-text class="pa-4">
<!-- Type Selection -->
<p class="text-center text-sm text-romm-gray mb-6">
{{ t("settings.select-exclusion-type") }}
</p>
<v-row no-gutters class="mb-6">
<v-col
v-for="item in exclusionTypes"
:key="item.type"
class="pa-1"
cols="12"
sm="6"
>
<v-card
:variant="
exclusionType === item.type ? 'elevated' : 'outlined'
"
:class="[
'cursor-pointer pa-4 text-center h-100 transition',
exclusionType === item.type
? 'bg-primary'
: 'hover:bg-surface',
]"
@click="selectExclusionType(item.type, item.icon, item.title)"
>
<v-icon
:icon="item.icon"
size="32"
:class="[
'mb-2',
exclusionType === item.type
? 'text-white'
: 'text-primary',
]"
/>
<div
:class="[
'text-sm font-weight-medium',
exclusionType === item.type ? 'text-white' : '',
]"
>
{{ item.title }}
</div>
<div
:class="[
'text-xs mt-1',
exclusionType === item.type
? 'text-white opacity-90'
: 'text-romm-gray',
]"
>
{{ item.description }}
</div>
</v-card>
</v-col>
</v-row>

<!-- Value Input -->
<div class="text-center">
<p class="text-sm text-romm-gray mb-4">
<v-icon :icon="exclusionIcon" class="mr-1 text-primary" />
{{ t("settings.add-exclusion-for") }} {{ exclusionTitle }}
</p>
<v-text-field
:disabled="!exclusionType"
v-model="exclusionValue"
:label="t('settings.exclusion-value')"
:placeholder="t('settings.exclusion-placeholder')"
variant="outlined"
required
hide-details
autofocus
@keyup.enter="addExclusion"
>
<template #prepend-inner>
<v-icon :icon="exclusionIcon" class="mr-2" />
</template>
</v-text-field>
</div>
</v-card-text>
</v-col>
</v-row>
</template>
Expand All @@ -86,8 +190,10 @@ function closeDialog() {
</v-btn>
<v-btn
class="bg-toplayer text-romm-green"
:disabled="exclusionValue == ''"
:variant="exclusionValue == '' ? 'plain' : 'flat'"
:disabled="!exclusionType || exclusionValue === ''"
:variant="
!exclusionType || exclusionValue === '' ? 'plain' : 'flat'
"
@click="addExclusion"
>
{{ t("common.confirm") }}
Expand Down
Loading
Loading