mirror of
https://github.com/zammad/zammad
synced 2026-05-24 09:48:36 +00:00
62 lines
1.9 KiB
TypeScript
62 lines
1.9 KiB
TypeScript
// Copyright (C) 2012-2026 Zammad Foundation, https://zammad-foundation.org/
|
|
|
|
import type {
|
|
ObjectSelectValue,
|
|
OptionValueLookup,
|
|
SelectValueWithoutBoolean,
|
|
} from '#shared/entities/object-attributes/form/resolver/fields/select.ts'
|
|
|
|
import type { FormKitFrameworkContext, FormKitNode } from '@formkit/core'
|
|
|
|
const removeValuesForNonExistingOrDisabledOptions = (node: FormKitNode) => {
|
|
const handleNewInputValue = (
|
|
payload: SelectValueWithoutBoolean | SelectValueWithoutBoolean[],
|
|
context: FormKitFrameworkContext,
|
|
) => {
|
|
const optionValueLookup = context.optionValueLookup as OptionValueLookup
|
|
|
|
if (Array.isArray(payload)) {
|
|
// TODO: Workaround for empty string, because currently the "nulloption" exists also for multiselect fields (#4513).
|
|
const availableValues = payload.filter(
|
|
(selectValue: string | number) =>
|
|
(typeof optionValueLookup[selectValue] !== 'undefined' &&
|
|
!optionValueLookup[selectValue].disabled) ||
|
|
selectValue === '',
|
|
)
|
|
|
|
return availableValues
|
|
}
|
|
|
|
if (typeof optionValueLookup[payload] === 'undefined' || optionValueLookup[payload].disabled) {
|
|
if (typeof optionValueLookup[node.props._init] === 'undefined') {
|
|
const getPreselectValue = context.getPreselectValue as () => ObjectSelectValue
|
|
|
|
return context.clearable || getPreselectValue === undefined
|
|
? undefined
|
|
: getPreselectValue()
|
|
}
|
|
|
|
return node.props._init
|
|
}
|
|
|
|
return payload
|
|
}
|
|
|
|
node.on('created', () => {
|
|
const { context } = node
|
|
|
|
if (!context) return
|
|
|
|
const rootNode = node.at('$root')!
|
|
|
|
rootNode.settled.then(() => {
|
|
node.hook.input((payload, next) => {
|
|
if (!context.fns.hasValue(payload) || !context.optionValueLookup) return next(payload)
|
|
|
|
return next(handleNewInputValue(payload, context))
|
|
})
|
|
})
|
|
})
|
|
}
|
|
|
|
export default removeValuesForNonExistingOrDisabledOptions
|