mirror of
https://github.com/modrinth/code.git
synced 2026-08-30 11:36:05 +00:00
feat: hook up excludes modpack
This commit is contained in:
@@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user