74 lines
2.2 KiB
TypeScript
74 lines
2.2 KiB
TypeScript
const MIN_TABLE_PAGE_SIZE = 5
|
|
const MAX_TABLE_PAGE_SIZE = 1000
|
|
|
|
export const DEFAULT_TABLE_PAGE_SIZE = 20
|
|
export const DEFAULT_TABLE_PAGE_SIZE_OPTIONS = [10, 20, 50, 100]
|
|
|
|
const sanitizePageSize = (value: unknown): number | null => {
|
|
const size = Number(value)
|
|
if (!Number.isInteger(size)) return null
|
|
if (size < MIN_TABLE_PAGE_SIZE || size > MAX_TABLE_PAGE_SIZE) return null
|
|
return size
|
|
}
|
|
|
|
const parsePageSizeForSelection = (value: unknown): number | null => {
|
|
const size = Number(value)
|
|
if (!Number.isInteger(size)) return null
|
|
if (size < MIN_TABLE_PAGE_SIZE) return null
|
|
return size
|
|
}
|
|
|
|
const getInjectedAppConfig = () => {
|
|
if (typeof window === 'undefined') return null
|
|
return window.__APP_CONFIG__ ?? null
|
|
}
|
|
|
|
const getSanitizedConfiguredOptions = (): number[] => {
|
|
const configured = getInjectedAppConfig()?.table_page_size_options
|
|
if (!Array.isArray(configured)) return []
|
|
|
|
return Array.from(
|
|
new Set(
|
|
configured
|
|
.map((value) => sanitizePageSize(value))
|
|
.filter((value): value is number => value !== null)
|
|
)
|
|
).sort((a, b) => a - b)
|
|
}
|
|
|
|
const normalizePageSizeToOptions = (value: number, options: number[]): number => {
|
|
for (const option of options) {
|
|
if (option >= value) {
|
|
return option
|
|
}
|
|
}
|
|
return options[options.length - 1]
|
|
}
|
|
|
|
export const getConfiguredTableDefaultPageSize = (): number => {
|
|
const configured = sanitizePageSize(getInjectedAppConfig()?.table_default_page_size)
|
|
if (configured === null) {
|
|
return DEFAULT_TABLE_PAGE_SIZE
|
|
}
|
|
return configured
|
|
}
|
|
|
|
export const getConfiguredTablePageSizeOptions = (): number[] => {
|
|
const unique = getSanitizedConfiguredOptions()
|
|
if (unique.length === 0) {
|
|
return [...DEFAULT_TABLE_PAGE_SIZE_OPTIONS]
|
|
}
|
|
|
|
return unique.length > 0 ? unique : [...DEFAULT_TABLE_PAGE_SIZE_OPTIONS]
|
|
}
|
|
|
|
export const normalizeTablePageSize = (value: unknown): number => {
|
|
const normalized = parsePageSizeForSelection(value)
|
|
const defaultSize = getConfiguredTableDefaultPageSize()
|
|
const options = getConfiguredTablePageSizeOptions()
|
|
if (normalized !== null) {
|
|
return normalizePageSizeToOptions(normalized, options)
|
|
}
|
|
return normalizePageSizeToOptions(defaultSize, options)
|
|
}
|