feat: hook up excludes modpack

This commit is contained in:
tdgao
2026-08-14 12:55:45 -06:00
parent ee74727e36
commit 3ce9c6d7de
3 changed files with 64 additions and 25 deletions
@@ -186,14 +186,14 @@ const dependencyProjectIds = computed(() => [
), ),
]) ])
const pendingProjectId = ref<string>() const pendingProjectId = ref<string>()
const excludedProjectIds = ref(new Set<string>()) const excludedProjectIds = computed(
() =>
watch(dependencyProjectIds, (projectIds) => { new Set(
const selectedProjectIds = new Set(projectIds) selectedFilters.value
excludedProjectIds.value = new Set( .filter((filter) => filter.type === FILTER_TYPE_ID && filter.negative)
[...excludedProjectIds.value].filter((projectId) => selectedProjectIds.has(projectId)), .map((filter) => parseDependencyProjectFilterOption(filter.option).projectId),
) ),
}) )
const { data: dependentProjects } = useQuery({ const { data: dependentProjects } = useQuery({
queryKey: computed(() => [ queryKey: computed(() => [
@@ -226,7 +226,9 @@ const selectedProjectId = computed(() =>
? parseDependencyProjectFilterOption(selectedDependencyFilter.value.option).projectId ? parseDependencyProjectFilterOption(selectedDependencyFilter.value.option).projectId
: undefined, : undefined,
) )
const showSelectedProject = computed(() => Boolean(selectedProjectId.value && selectedProject.value)) const showSelectedProject = computed(() =>
Boolean(selectedProjectId.value && selectedProject.value),
)
const dependencyTypes = computed<DependencyType[]>(() => const dependencyTypes = computed<DependencyType[]>(() =>
selectedDependencyFilter.value selectedDependencyFilter.value
@@ -294,19 +296,15 @@ function removeIncludedProject(projectId: string) {
filter.type !== FILTER_TYPE_ID || filter.type !== FILTER_TYPE_ID ||
parseDependencyProjectFilterOption(filter.option).projectId !== projectId, parseDependencyProjectFilterOption(filter.option).projectId !== projectId,
) )
const nextExcludedProjectIds = new Set(excludedProjectIds.value)
nextExcludedProjectIds.delete(projectId)
excludedProjectIds.value = nextExcludedProjectIds
} }
function toggleProjectExcluded(projectId: string) { function toggleProjectExcluded(projectId: string) {
const nextExcludedProjectIds = new Set(excludedProjectIds.value) selectedFilters.value = selectedFilters.value.map((filter) =>
if (nextExcludedProjectIds.has(projectId)) { filter.type === FILTER_TYPE_ID &&
nextExcludedProjectIds.delete(projectId) parseDependencyProjectFilterOption(filter.option).projectId === projectId
} else { ? { ...filter, negative: !filter.negative }
nextExcludedProjectIds.add(projectId) : filter,
} )
excludedProjectIds.value = nextExcludedProjectIds
} }
function resetDraftDependencyTypes() { function resetDraftDependencyTypes() {
@@ -12,9 +12,16 @@
<XIcon /> <XIcon />
{{ {{
formatMessage(includedProjectsMessage, { formatMessage(includedProjectsMessage, {
projects: selectedIncludedProjectItems projects: formatProjectNames(selectedIncludedProjectItems),
.map((item) => dependentProjectNames.get(item.option) ?? item.option) })
.join(', '), }}
</TagItem>
<TagItem v-if="selectedExcludedProjectItems.length > 0" :action="removeExcludedProjectFilters">
<XIcon />
<BanIcon class="text-brand-red" />
{{
formatMessage(excludedProjectsMessage, {
projects: formatProjectNames(selectedExcludedProjectItems),
}) })
}} }}
</TagItem> </TagItem>
@@ -86,6 +93,10 @@ const includedProjectsMessage = defineMessage({
id: 'search.filter.included_projects', id: 'search.filter.included_projects',
defaultMessage: 'Includes: {projects}', defaultMessage: 'Includes: {projects}',
}) })
const excludedProjectsMessage = defineMessage({
id: 'search.filter.excluded_projects',
defaultMessage: 'Excludes: {projects}',
})
type Item = { type Item = {
type: string type: string
@@ -172,7 +183,16 @@ const items: ComputedRef<Item[]> = computed(() => {
const selectedItems = computed(() => items.value.filter((x) => !x.provided)) const selectedItems = computed(() => items.value.filter((x) => !x.provided))
const selectedIncludedProjectItems = computed(() => const selectedIncludedProjectItems = computed(() =>
props.projectType === 'modpack' props.projectType === 'modpack'
? selectedItems.value.filter((item) => item.type === 'compatible_dependency_project_ids') ? selectedItems.value.filter(
(item) => item.type === 'compatible_dependency_project_ids' && !item.negative,
)
: [],
)
const selectedExcludedProjectItems = computed(() =>
props.projectType === 'modpack'
? selectedItems.value.filter(
(item) => item.type === 'compatible_dependency_project_ids' && item.negative,
)
: [], : [],
) )
const otherSelectedItems = computed(() => const otherSelectedItems = computed(() =>
@@ -181,9 +201,21 @@ const otherSelectedItems = computed(() =>
: selectedItems.value, : selectedItems.value,
) )
const selectedTagCount = computed( const selectedTagCount = computed(
() => otherSelectedItems.value.length + (selectedIncludedProjectItems.value.length > 0 ? 1 : 0), () =>
otherSelectedItems.value.length +
(selectedIncludedProjectItems.value.length > 0 ? 1 : 0) +
(selectedExcludedProjectItems.value.length > 0 ? 1 : 0),
) )
function formatProjectNames(items: Item[]) {
return items
.map((item) => {
const projectId = parseDependencyProjectFilterOption(item.option).projectId
return dependentProjectNames.value.get(projectId) ?? projectId
})
.join(', ')
}
function removeFilter(filter: Item) { function removeFilter(filter: Item) {
selectedFilters.value = selectedFilters.value.filter( selectedFilters.value = selectedFilters.value.filter(
(x) => x.type !== filter.type || x.option !== filter.option, (x) => x.type !== filter.type || x.option !== filter.option,
@@ -192,7 +224,13 @@ function removeFilter(filter: Item) {
function removeIncludedProjectFilters() { function removeIncludedProjectFilters() {
selectedFilters.value = selectedFilters.value.filter( selectedFilters.value = selectedFilters.value.filter(
(filter) => filter.type !== 'compatible_dependency_project_ids', (filter) => filter.type !== 'compatible_dependency_project_ids' || filter.negative,
)
}
function removeExcludedProjectFilters() {
selectedFilters.value = selectedFilters.value.filter(
(filter) => filter.type !== 'compatible_dependency_project_ids' || !filter.negative,
) )
} }
+3
View File
@@ -4049,6 +4049,9 @@
"search.filter.dependent_project.search_placeholder": { "search.filter.dependent_project.search_placeholder": {
"defaultMessage": "Search for a project..." "defaultMessage": "Search for a project..."
}, },
"search.filter.excluded_projects": {
"defaultMessage": "Excludes: {projects}"
},
"search.filter.included_content.exclude": { "search.filter.included_content.exclude": {
"defaultMessage": "Exclude" "defaultMessage": "Exclude"
}, },