feat: warning filter + remove client only filter as it's useless (#5690)
* feat: warning filter * fix: remove client_only filter
This commit is contained in:
@@ -2,7 +2,6 @@
|
|||||||
import { injectModrinthServerContext, ServersManageContentPage } from '@modrinth/ui'
|
import { injectModrinthServerContext, ServersManageContentPage } from '@modrinth/ui'
|
||||||
|
|
||||||
const { server } = injectModrinthServerContext()
|
const { server } = injectModrinthServerContext()
|
||||||
const flags = useFeatureFlags()
|
|
||||||
|
|
||||||
useHead({
|
useHead({
|
||||||
title: `Content - ${server.value?.name ?? 'Server'} - Modrinth`,
|
title: `Content - ${server.value?.name ?? 'Server'} - Modrinth`,
|
||||||
@@ -10,5 +9,5 @@ useHead({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<ServersManageContentPage :show-client-only-filter="flags.developerMode" />
|
<ServersManageContentPage />
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -150,6 +150,10 @@ const filterOptions = computed(() => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if (items.value.some((item) => getClientWarningType(item) !== null)) {
|
||||||
|
options.push({ id: 'warnings', label: 'Warnings' })
|
||||||
|
}
|
||||||
|
|
||||||
if (items.value.some((item) => !item.enabled)) {
|
if (items.value.some((item) => !item.enabled)) {
|
||||||
options.push({ id: 'disabled', label: 'Disabled' })
|
options.push({ id: 'disabled', label: 'Disabled' })
|
||||||
}
|
}
|
||||||
@@ -175,16 +179,18 @@ function toggleFilter(filterId: string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const attributeFilterIds = new Set(['disabled'])
|
const attributeFilterIds = new Set(['disabled', 'warnings'])
|
||||||
|
|
||||||
const typeFilteredCount = computed(() => {
|
const typeFilteredCount = computed(() => {
|
||||||
if (selectedFilters.value.length === 0) return items.value.length
|
if (selectedFilters.value.length === 0) return items.value.length
|
||||||
const typeFilters = selectedFilters.value.filter((f) => !attributeFilterIds.has(f))
|
const typeFilters = selectedFilters.value.filter((f) => !attributeFilterIds.has(f))
|
||||||
const hasDisabledFilter = selectedFilters.value.includes('disabled')
|
const hasDisabledFilter = selectedFilters.value.includes('disabled')
|
||||||
|
const hasWarningsFilter = selectedFilters.value.includes('warnings')
|
||||||
return items.value.filter((item) => {
|
return items.value.filter((item) => {
|
||||||
if (typeFilters.length > 0 && !typeFilters.includes(normalizeProjectType(item.project_type)))
|
if (typeFilters.length > 0 && !typeFilters.includes(normalizeProjectType(item.project_type)))
|
||||||
return false
|
return false
|
||||||
if (hasDisabledFilter && item.enabled) return false
|
if (hasDisabledFilter && item.enabled) return false
|
||||||
|
if (hasWarningsFilter && getClientWarningType(item) === null) return false
|
||||||
return true
|
return true
|
||||||
}).length
|
}).length
|
||||||
})
|
})
|
||||||
@@ -206,10 +212,12 @@ const filteredItems = computed(() => {
|
|||||||
if (selectedFilters.value.length > 0) {
|
if (selectedFilters.value.length > 0) {
|
||||||
const typeFilters = selectedFilters.value.filter((f) => !attributeFilterIds.has(f))
|
const typeFilters = selectedFilters.value.filter((f) => !attributeFilterIds.has(f))
|
||||||
const hasDisabledFilter = selectedFilters.value.includes('disabled')
|
const hasDisabledFilter = selectedFilters.value.includes('disabled')
|
||||||
|
const hasWarningsFilter = selectedFilters.value.includes('warnings')
|
||||||
result = result.filter((item) => {
|
result = result.filter((item) => {
|
||||||
if (typeFilters.length > 0 && !typeFilters.includes(normalizeProjectType(item.project_type)))
|
if (typeFilters.length > 0 && !typeFilters.includes(normalizeProjectType(item.project_type)))
|
||||||
return false
|
return false
|
||||||
if (hasDisabledFilter && item.enabled) return false
|
if (hasDisabledFilter && item.enabled) return false
|
||||||
|
if (hasWarningsFilter && getClientWarningType(item) === null) return false
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ export interface ContentFilterOption {
|
|||||||
export interface ContentFilterConfig {
|
export interface ContentFilterConfig {
|
||||||
showTypeFilters?: boolean
|
showTypeFilters?: boolean
|
||||||
showUpdateFilter?: boolean
|
showUpdateFilter?: boolean
|
||||||
showClientOnlyFilter?: boolean
|
showWarningsFilter?: boolean
|
||||||
isPackLocked?: Ref<boolean>
|
isPackLocked?: Ref<boolean>
|
||||||
persistKey?: string
|
persistKey?: string
|
||||||
}
|
}
|
||||||
@@ -62,8 +62,8 @@ export function useContentFilters(items: Ref<ContentItem[]>, config?: ContentFil
|
|||||||
options.push({ id: 'updates', label: 'Updates' })
|
options.push({ id: 'updates', label: 'Updates' })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config?.showClientOnlyFilter && items.value.some((m) => getClientWarningType(m) !== null)) {
|
if (config?.showWarningsFilter && items.value.some((m) => getClientWarningType(m) !== null)) {
|
||||||
options.push({ id: 'client-only', label: 'Client-only' })
|
options.push({ id: 'warnings', label: 'Warnings' })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (items.value.some((m) => !m.enabled)) {
|
if (items.value.some((m) => !m.enabled)) {
|
||||||
@@ -91,7 +91,7 @@ export function useContentFilters(items: Ref<ContentItem[]>, config?: ContentFil
|
|||||||
function applyFilters(source: ContentItem[]): ContentItem[] {
|
function applyFilters(source: ContentItem[]): ContentItem[] {
|
||||||
if (selectedFilters.value.length === 0) return source
|
if (selectedFilters.value.length === 0) return source
|
||||||
|
|
||||||
const attributeFilters = new Set(['updates', 'disabled', 'client-only'])
|
const attributeFilters = new Set(['updates', 'disabled', 'warnings'])
|
||||||
const typeFilters = selectedFilters.value.filter((f) => !attributeFilters.has(f))
|
const typeFilters = selectedFilters.value.filter((f) => !attributeFilters.has(f))
|
||||||
const activeAttributes = selectedFilters.value.filter((f) => attributeFilters.has(f))
|
const activeAttributes = selectedFilters.value.filter((f) => attributeFilters.has(f))
|
||||||
|
|
||||||
@@ -106,7 +106,7 @@ export function useContentFilters(items: Ref<ContentItem[]>, config?: ContentFil
|
|||||||
for (const filter of activeAttributes) {
|
for (const filter of activeAttributes) {
|
||||||
if (filter === 'updates' && !item.has_update) return false
|
if (filter === 'updates' && !item.has_update) return false
|
||||||
if (filter === 'disabled' && item.enabled) return false
|
if (filter === 'disabled' && item.enabled) return false
|
||||||
if (filter === 'client-only' && getClientWarningType(item) === null) return false
|
if (filter === 'warnings' && getClientWarningType(item) === null) return false
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
|||||||
@@ -229,7 +229,7 @@ const { selectedFilters, filterOptions, toggleFilter, applyFilters } = useConten
|
|||||||
{
|
{
|
||||||
showTypeFilters: true,
|
showTypeFilters: true,
|
||||||
showUpdateFilter: ctx.hasUpdateSupport,
|
showUpdateFilter: ctx.hasUpdateSupport,
|
||||||
showClientOnlyFilter: ctx.showClientOnlyFilter ?? false,
|
showWarningsFilter: true,
|
||||||
isPackLocked: ctx.isPackLocked,
|
isPackLocked: ctx.isPackLocked,
|
||||||
persistKey: ctx.filterPersistKey,
|
persistKey: ctx.filterPersistKey,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -82,9 +82,6 @@ export interface ContentManagerContext {
|
|||||||
// Upload progress (optional)
|
// Upload progress (optional)
|
||||||
uploadState?: Ref<UploadState> | ComputedRef<UploadState>
|
uploadState?: Ref<UploadState> | ComputedRef<UploadState>
|
||||||
|
|
||||||
// Show client-only environment filter pill
|
|
||||||
showClientOnlyFilter?: boolean
|
|
||||||
|
|
||||||
// Bulk operation guard — set by layout, checked by providers to suppress refreshes
|
// Bulk operation guard — set by layout, checked by providers to suppress refreshes
|
||||||
isBulkOperating?: Ref<boolean>
|
isBulkOperating?: Ref<boolean>
|
||||||
|
|
||||||
|
|||||||
@@ -92,15 +92,6 @@ const leaveMessages = defineMessages({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const props = withDefaults(
|
|
||||||
defineProps<{
|
|
||||||
showClientOnlyFilter?: boolean
|
|
||||||
}>(),
|
|
||||||
{
|
|
||||||
showClientOnlyFilter: false,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
const client = injectModrinthClient()
|
const client = injectModrinthClient()
|
||||||
const { server, worldId, busyReasons, isSyncingContent } = injectModrinthServerContext()
|
const { server, worldId, busyReasons, isSyncingContent } = injectModrinthServerContext()
|
||||||
const { addNotification } = injectNotificationManager()
|
const { addNotification } = injectNotificationManager()
|
||||||
@@ -896,7 +887,6 @@ provideContentManager({
|
|||||||
browse: handleBrowseContent,
|
browse: handleBrowseContent,
|
||||||
uploadFiles: handleUploadFiles,
|
uploadFiles: handleUploadFiles,
|
||||||
uploadState,
|
uploadState,
|
||||||
showClientOnlyFilter: props.showClientOnlyFilter,
|
|
||||||
deletionContext: 'server',
|
deletionContext: 'server',
|
||||||
hasUpdateSupport: true,
|
hasUpdateSupport: true,
|
||||||
updateItem: handleUpdateItem,
|
updateItem: handleUpdateItem,
|
||||||
|
|||||||
Reference in New Issue
Block a user