@lmb-it/kitsconcerto-native 0.1.260 → 0.1.261
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/mobile/src/Core/Dropdown/index.cjs +9 -1
- package/apps/mobile/src/Core/Dropdown/index.cjs.map +1 -1
- package/apps/mobile/src/Core/Dropdown/index.js +10 -2
- package/apps/mobile/src/Core/Dropdown/index.js.map +1 -1
- package/form-renderer/hooks/useFieldLogic.cjs +1 -1
- package/form-renderer/hooks/useFieldLogic.cjs.map +1 -1
- package/form-renderer/hooks/useFieldLogic.js +1 -1
- package/form-renderer/hooks/useFieldLogic.js.map +1 -1
- package/package.json +1 -1
|
@@ -98,6 +98,10 @@ const getValue = (item, optionValue) => {
|
|
|
98
98
|
return item[optionValue];
|
|
99
99
|
};
|
|
100
100
|
const t = style.resolveThemeTokenForNative;
|
|
101
|
+
const optionFontSize = () => {
|
|
102
|
+
const resolved = style.toNativeValue(style.resolveThemeTokenForNative("$fontSizes.md"));
|
|
103
|
+
return typeof resolved === "number" ? resolved : 16;
|
|
104
|
+
};
|
|
101
105
|
const TEXT_STYLE_KEYS = /* @__PURE__ */ new Set([
|
|
102
106
|
"fontSize",
|
|
103
107
|
"fontFamily",
|
|
@@ -238,7 +242,11 @@ function Dropdown({
|
|
|
238
242
|
const rendered = itemTemplate(item);
|
|
239
243
|
content = React.isValidElement(rendered) ? rendered : /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { children: String(rendered ?? "") });
|
|
240
244
|
} else {
|
|
241
|
-
content = /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: [
|
|
245
|
+
content = /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: [
|
|
246
|
+
{ color: colors.text, fontSize: optionFontSize() },
|
|
247
|
+
// A consumer-supplied size still wins over the scale.
|
|
248
|
+
externalTextStyle && externalTextStyle.fontSize ? { fontSize: externalTextStyle.fontSize } : null
|
|
249
|
+
], children: getLabel(item, optionLabel) });
|
|
242
250
|
}
|
|
243
251
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
244
252
|
reactNative.Pressable,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../../../../../../apps/mobile/src/Core/Dropdown/index.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useRef, useState, type ChangeEvent } from \"react\";\nimport {\n Dimensions,\n FlatList,\n Keyboard,\n Modal,\n Pressable,\n ScrollView,\n TouchableOpacity,\n View,\n StyleSheet, Text, TextInput\n} from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { Input, InputField, type VirtualScrollerOptions } from \"../../\";\nimport { resolveThemeTokenForNative } from '../../Factory/helpers/style';\nimport { useKeyboardHeight } from '../../Factory/helpers/useKeyboardHeight';\nimport { computePanelGeometry } from './panelGeometry';\n\n/* ---------------------------------------------\n Types (PrimeReact-compatible)\n---------------------------------------------- */\n\nexport interface DropdownChangeEvent<T = any> {\n originalEvent?: any;\n value: T | null;\n}\n\n\nexport interface DropdownProps<T = any> {\n value?: T | null;\n options?: T[];\n\n onChange?: (e: ChangeEvent<T>, item:any) => void;\n\n optionLabel?: string;\n optionValue?: string;\n\n placeholder?: string;\n disabled?: boolean;\n editable?: boolean;\n loading?: boolean;\n showClear?: boolean;\n isModal?: boolean;\n\n checkmark?: boolean;\n highlightOnSelect?: boolean;\n\n filter?: boolean;\n filterBy?: string;\n emptyFilterMessage?: string;\n /**\n * Placeholder for the panel's filter field.\n *\n * ⛔ THIS COMPONENT CANNOT TRANSLATE. It lives in `apps/mobile`, which\n * `packages/ui` imports — the reverse import would be a cycle between the two\n * workspaces. So the sentence is resolved by the KitsConcerto wrapper, which\n * has `useLanguage()`, and arrives here already written, exactly as\n * `emptyFilterMessage` does.\n */\n filterPlaceholder?: string;\n /**\n * Open the options in a popup that owns the screen instead of a panel\n * anchored to the trigger.\n *\n * ⛔ THE ANCHOR IS THE PROBLEM THIS ESCAPES. An anchored panel can never be\n * taller than the gap between the trigger and the keyboard, and a field in\n * the middle of a form has ~190pt of gap on a 874pt phone — a search box and\n * four rows. Sizing that gap correctly does not make it big. The popup takes\n * a fixed share of the window instead, so where the field sits stops\n * mattering.\n *\n * Default false: every existing consumer keeps the anchored panel.\n */\n popup?: boolean;\n /**\n * Supplies the popup's container. Injected by the KitsConcerto wrapper\n * because the container is this library's `KitsDialogControlled`, which\n * lives in `packages/ui` — and `packages/ui` imports THIS file, so importing\n * it back would be a cycle between the two workspaces.\n *\n * Without it `popup` falls back to the anchored panel rather than rendering\n * nothing.\n */\n renderPopup?: (args: {\n visible: boolean;\n onClose: () => void;\n title?: React.ReactNode;\n children: React.ReactNode;\n }) => React.ReactNode;\n /** Title for the popup header. The wrapper passes the field's label. */\n popupTitle?: React.ReactNode;\n /**\n * Which way the reader reads, from the wrapper's `useLanguage().isRTL`.\n *\n * ⛔ NOT `I18nManager.isRTL`. That is the PROCESS layout direction, which a\n * consumer can force at boot and which does not change when the reader\n * switches language. The filter field follows the interface language, like\n * every other input in this library.\n */\n isRTL?: boolean;\n\n itemTemplate?: (item: T) => React.ReactNode;\n valueTemplate?: (value: T | null) => React.ReactNode;\n panelFooterTemplate?: () => React.ReactNode;\n\n optionGroupLabel?: string;\n optionGroupChildren?: string;\n optionGroupTemplate?: (group: any) => React.ReactNode;\n\n virtualScrollerOptions?: VirtualScrollerOptions;\n\n invalid?: boolean;\n testID?: string;\n style?: import('react-native').ViewStyle;\n}\n\n/* ---------------------------------------------\n Helpers\n---------------------------------------------- */\n\nconst getLabel = (item: any, optionLabel?: string) => {\n if (!item) return \"\";\n if (!optionLabel) return String(item);\n return String(item[optionLabel]);\n};\n\nconst getValue = (item: any, optionValue?: string) => {\n if (!item) return null;\n if (!optionValue) return item;\n return item[optionValue];\n};\n\nconst t = resolveThemeTokenForNative;\n\nconst TEXT_STYLE_KEYS = new Set([\n 'fontSize', 'fontFamily', 'fontWeight', 'fontStyle',\n 'color', 'letterSpacing', 'lineHeight', 'textAlign',\n 'textDecorationLine', 'textTransform',\n]);\n\nfunction splitStyle(combined?: any): { viewStyle?: any; textStyle?: any } {\n if (!combined) return {};\n const view: Record<string, any> = {};\n const text: Record<string, any> = {};\n for (const [k, v] of Object.entries(combined)) {\n if (TEXT_STYLE_KEYS.has(k)) text[k] = v;\n else view[k] = v;\n }\n return {\n viewStyle: Object.keys(view).length ? view : undefined,\n textStyle: Object.keys(text).length ? text : undefined,\n };\n}\n\n/* ---------------------------------------------\n Component\n---------------------------------------------- */\n\nexport default function Dropdown<T = any>({\n value,\n options = [],\n onChange,\n\n optionLabel,\n optionValue,\n\n placeholder,\n disabled,\n editable,\n isModal = false,\n\n checkmark,\n highlightOnSelect = true,\n\n filter,\n filterBy,\n // ⚠️ THESE TWO ENGLISH LITERALS ARE A LAST RESORT, NOT A\n // TRANSLATION. The KitsConcerto wrapper always passes the\n // reader's own sentence; these only apply when this component\n // is used directly from `apps/mobile`, and they exist so a\n // panel can never render a blank search box or an empty\n // \"no results\" line. Recorded as English fallbacks.\n emptyFilterMessage = 'No results found',\n filterPlaceholder = 'Search...',\n isRTL = false,\n popup = false,\n renderPopup,\n popupTitle,\n\n itemTemplate,\n valueTemplate,\n panelFooterTemplate,\n\n optionGroupLabel,\n optionGroupChildren,\n optionGroupTemplate,\n\n virtualScrollerOptions,\n\n invalid,\n testID,\n style: externalStyle,\n }: DropdownProps<T>) {\n const inputRef = useRef<any>(null);\n const triggerRef = useRef<View>(null);\n const [open, setOpen] = useState(false);\n const [inputText, setInputText] = useState(\"\");\n const [filterQuery, setFilterQuery] = useState(\"\");\n const [triggerLayout, setTriggerLayout] = useState<{\n x: number; y: number; width: number; height: number;\n } | null>(null);\n const insets = useSafeAreaInsets();\n const keyboardHeight = useKeyboardHeight();\n\n const { viewStyle: externalViewStyle, textStyle: externalTextStyle } = splitStyle(externalStyle);\n\n const colors = {\n border: t('border') || t('gray.300'),\n borderInvalid: t('danger') || t('red.500'),\n bg: t('surface-card') || '#fff',\n text: t('text') || t('gray.800'),\n placeholder: t('text-secondary') || t('gray.400'),\n optionSelected: t('highlight-bg') || t('gray.100'),\n groupBg: t('surface-ground') || t('gray.50'),\n filterBorder: t('border') || t('gray.200'),\n filterBg: t('surface-ground') || t('gray.50'),\n filterText: t('text') || t('gray.800'),\n emptyText: t('text-secondary') || t('gray.400'),\n primary: t('primary'),\n };\n\n /* ---------------------------------------------\n Derived\n ---------------------------------------------- */\n\n const selectedItem = useMemo(() => {\n if (value == null) return null;\n // Search through group children when grouped\n if (optionGroupChildren) {\n for (const group of options as any[]) {\n const children = group[optionGroupChildren];\n if (Array.isArray(children)) {\n const found = children.find((c: any) => getValue(c, optionValue) === value);\n if (found) return found;\n }\n }\n return null;\n }\n return options.find(\n (o) => getValue(o, optionValue) === value\n ) ?? null;\n }, [value, options, optionValue, optionGroupChildren]);\n\n /* ---------------------------------------------\n Open / Close\n ---------------------------------------------- */\n\n const toggle = () => {\n if (disabled) return;\n Keyboard.dismiss();\n if (open) {\n setOpen(false);\n return;\n }\n setFilterQuery(\"\");\n // Measure trigger position in window so the popover can be rendered\n // inside a Modal (escaping any parent ScrollView) at the correct anchor.\n triggerRef.current?.measureInWindow((x, y, width, height) => {\n setTriggerLayout({ x, y, width, height });\n setOpen(true);\n });\n };\n\n const close = () => setOpen(false);\n\n /* ---------------------------------------------\n Selection\n ---------------------------------------------- */\n\n const selectItem = (item: T) => {\n const newValue = getValue(item, optionValue);\n\n if (!onChange) return;\n\n const syntheticEvent = {\n target: {\n value: newValue,\n },\n } as React.ChangeEvent<any>;\n\n onChange(syntheticEvent, item);\n\n setOpen(false);\n };\n\n /* ---------------------------------------------\n Render item\n ---------------------------------------------- */\n\n const renderItem = useCallback(\n (item: any, index: number) => {\n if (!item) {\n return null;\n }\n\n // Group header\n if (item.__group) {\n return (\n <Text key={`group-${index}`} style={[styles.groupLabel, { backgroundColor: colors.groupBg }]}>\n {optionGroupLabel ? item.group?.[optionGroupLabel] : \"\"}\n </Text>\n );\n }\n\n const selected =\n value != null &&\n getValue(item, optionValue) === value;\n\n let content: React.ReactElement;\n\n if (itemTemplate) {\n const rendered = itemTemplate(item);\n\n content = React.isValidElement(rendered) ? (\n rendered\n ) : (\n <Text>{String(rendered ?? \"\")}</Text>\n );\n } else {\n content = (\n <Text style={[{ color: colors.text }, externalTextStyle && { fontSize: externalTextStyle.fontSize }]}>\n {getLabel(item, optionLabel)}\n </Text>\n );\n }\n\n return (\n <Pressable\n key={`item-${index}`}\n onPress={() => selectItem(item)}\n style={[\n styles.option,\n selected && highlightOnSelect && { backgroundColor: colors.optionSelected },\n ]}\n >\n {content}\n {checkmark && selected && <Text>✓</Text>}\n </Pressable>\n );\n },\n [\n value,\n optionValue,\n optionLabel,\n itemTemplate,\n optionGroupLabel,\n checkmark,\n highlightOnSelect,\n ]\n );\n\n\n /* ---------------------------------------------\n Group flattening\n ---------------------------------------------- */\n\n const flatData = useMemo(() => {\n if (!optionGroupLabel || !optionGroupChildren) {\n return options;\n }\n\n const out: any[] = [];\n options.forEach((g: any) => {\n out.push({ __group: true, group: g });\n g[optionGroupChildren]?.forEach((c: any) => out.push(c));\n });\n return out;\n }, [options]);\n\n /* ---------------------------------------------\n Filter\n ---------------------------------------------- */\n\n const filteredData = useMemo(() => {\n if (!filter || !filterQuery) return flatData;\n const q = filterQuery.toLowerCase();\n const key = filterBy || optionLabel;\n\n return flatData.filter((entry: any) => {\n // Keep group headers\n if (entry.__group) return true;\n const label = getLabel(entry, key);\n return label.toLowerCase().includes(q);\n });\n }, [flatData, filter, filterQuery, filterBy, optionLabel]);\n\n /* ---------------------------------------------\n Display value\n ---------------------------------------------- */\n\n const displayValue = valueTemplate\n ? valueTemplate(selectedItem)\n : selectedItem\n ? getLabel(selectedItem, optionLabel)\n : \"\";\n\n /* ---------------------------------------------\n Panel body — the search field and the list\n ---------------------------------------------- */\n\n /*\n * ⛔ ONE BODY, THREE CONTAINERS. The anchored panel and the centred modal\n * each carried their own copy of this markup, which is why the hardcoded\n * \"Search...\" had to be found and fixed twice. The popup would have made it\n * three. The containers differ; what is inside them does not.\n *\n * `fill` is the one real difference. In the anchored panel the container has\n * a `maxHeight` and no height, so the list must shrink-wrap its content up\n * to that ceiling (`flexShrink`). In the popup and the centred modal the\n * container has a real height, so the list takes what is left (`flex: 1`).\n */\n const panelBody = (fill: boolean, autoFocusFilter: boolean) => (\n <>\n {filter && (\n <View style={[styles.filterContainer, { borderBottomColor: colors.filterBorder }]}>\n <TextInput\n value={filterQuery}\n onChangeText={setFilterQuery}\n placeholder={filterPlaceholder}\n placeholderTextColor={colors.placeholder}\n style={[styles.filterInput, {\n borderColor: colors.filterBorder,\n backgroundColor: colors.filterBg,\n color: colors.filterText,\n },\n // Every other input in this library names its own edge and\n // direction from the reader's language. Leaving these unset let the\n // platform decide, so the field followed the process layout\n // direction instead of the person reading it.\n isRTL ? styles.filterRtl : styles.filterLtr]}\n /* ⛔ THE ANCHORED PANEL KEEPS ITS AUTOFOCUS — changing it would\n change behaviour for every consumer that has not opted in. In\n the popup the list is already the whole point and is fully\n visible, so the keyboard waits to be asked for: one tap on the\n field raises it, and until then the list has the whole sheet. */\n autoFocus={autoFocusFilter}\n />\n </View>\n )}\n <FlatList\n style={fill ? styles.listFill : styles.listShrink}\n contentContainerStyle={styles.listContent}\n data={filteredData}\n keyExtractor={(item: any, i: number) =>\n item?.__group ? `group-${i}` : `item-${i}`\n }\n renderItem={({ item, index }) => renderItem(item, index)}\n keyboardShouldPersistTaps=\"handled\"\n showsHorizontalScrollIndicator={false}\n ListEmptyComponent={\n filterQuery ? (\n <View style={styles.emptyContainer}>\n <Text style={[styles.emptyText, { color: colors.emptyText }]}>{emptyFilterMessage}</Text>\n </View>\n ) : null\n }\n />\n {panelFooterTemplate?.()}\n </>\n );\n\n /* ---------------------------------------------\n Render\n ---------------------------------------------- */\n\n const usePopup = popup && typeof renderPopup === 'function';\n\n return (\n <View style={styles.container} testID={testID}>\n <Pressable\n ref={triggerRef as any}\n style={[\n styles.control,\n { borderColor: colors.border, backgroundColor: colors.bg },\n invalid && { borderColor: colors.borderInvalid },\n disabled && styles.disabled,\n externalViewStyle,\n ]}\n onPress={toggle}\n >\n {editable ? (\n <Input style={styles.input}>\n <InputField\n ref={inputRef}\n value={inputText}\n onChangeText={setInputText}\n placeholder={placeholder}\n editable={!disabled}\n />\n </Input>\n ) : (\n <Text\n numberOfLines={1}\n style={[\n // Fill the trigger row and left-align the value/placeholder so it\n // doesn't read as centred (the row is justify=space-between, so the\n // arrow stays pinned right).\n { flex: 1, textAlign: \"left\" as const },\n displayValue ? { color: colors.text } : { color: colors.placeholder },\n externalTextStyle,\n !displayValue && { color: colors.placeholder },\n ]}>\n {displayValue || placeholder}\n </Text>\n )}\n\n <Text style={[{ color: colors.text }, externalTextStyle]}>▾</Text>\n </Pressable>\n\n {!usePopup && !isModal && (\n <Modal\n visible={open && !!triggerLayout}\n transparent\n animationType=\"none\"\n onRequestClose={close}\n >\n <Pressable style={styles.popoverOverlay} onPress={close}>\n {triggerLayout && (() => {\n const screen = Dimensions.get('window');\n const { top, maxHeight } = computePanelGeometry({\n screenHeight: screen.height,\n insetTop: insets.top,\n insetBottom: insets.bottom,\n keyboardHeight,\n triggerY: triggerLayout.y,\n triggerHeight: triggerLayout.height,\n });\n\n return (\n <View\n style={[\n styles.popoverPanel,\n {\n top,\n left: triggerLayout.x,\n width: triggerLayout.width,\n maxHeight,\n borderColor: colors.border,\n backgroundColor: colors.bg,\n },\n ]}\n onStartShouldSetResponder={() => true}\n >\n {panelBody(false, true)}\n </View>\n );\n })()}\n </Pressable>\n </Modal>\n )}\n\n {!usePopup && isModal && (\n <Modal visible={open} transparent animationType=\"fade\">\n <Pressable style={styles.modalOverlay} onPress={close}>\n <View\n style={[styles.modalPanel, { backgroundColor: colors.bg }]}\n onStartShouldSetResponder={() => true}\n >\n {panelBody(true, true)}\n </View>\n </Pressable>\n </Modal>\n )}\n\n {/* Popup — the container comes from the wrapper (this library's own\n Dialog in sheet position); everything inside it is the same body the\n other two containers render. */}\n {usePopup && renderPopup!({\n visible: open,\n onClose: close,\n title: popupTitle,\n children: panelBody(true, false),\n })}\n\n </View>\n );\n}\n\n/* ---------------------------------------------\n Styles (layout only — colors applied inline via theme tokens)\n---------------------------------------------- */\n\nconst styles = StyleSheet.create({\n container: {\n width: \"100%\",\n position: \"relative\" as const,\n },\n control: {\n flexDirection: \"row\" as const,\n alignItems: \"center\" as const,\n justifyContent: \"space-between\" as const,\n borderWidth: 1,\n borderRadius: 6,\n paddingHorizontal: 10,\n paddingVertical: 10,\n },\n disabled: {\n opacity: 0.5,\n },\n option: {\n paddingHorizontal: 12,\n paddingVertical: 10,\n flexDirection: \"row\" as const,\n justifyContent: \"space-between\" as const,\n alignItems: \"center\" as const,\n },\n groupLabel: {\n paddingHorizontal: 12,\n paddingVertical: 8,\n fontWeight: \"600\" as const,\n },\n input: {\n flex: 1,\n },\n panel: {\n position: \"absolute\" as const,\n top: \"100%\",\n left: 0,\n right: 0,\n marginTop: 4,\n borderWidth: 1,\n borderRadius: 6,\n maxHeight: 260,\n overflow: \"hidden\" as const,\n zIndex: 9999,\n },\n filterContainer: {\n paddingHorizontal: 8,\n paddingVertical: 6,\n borderBottomWidth: 1,\n },\n listFill: {\n flex: 1,\n },\n // The anchored panel is sized by `maxHeight` with no height, so the list has\n // to grow with its content up to that ceiling and then scroll inside it.\n // `flex: 1` sets flexBasis 0, which contributes nothing to a shrink-wrapping\n // parent.\n listShrink: {\n flexGrow: 0,\n flexShrink: 1,\n },\n listContent: {\n paddingBottom: 12,\n },\n filterInput: {\n fontSize: 14,\n paddingHorizontal: 8,\n paddingVertical: 6,\n borderWidth: 1,\n borderRadius: 4,\n },\n filterLtr: {\n textAlign: 'left' as const,\n writingDirection: 'ltr' as const,\n },\n filterRtl: {\n textAlign: 'right' as const,\n writingDirection: 'rtl' as const,\n },\n emptyContainer: {\n padding: 16,\n alignItems: 'center' as const,\n },\n emptyText: {\n fontSize: 14,\n },\n popoverOverlay: {\n flex: 1,\n backgroundColor: 'transparent',\n },\n popoverPanel: {\n position: 'absolute' as const,\n borderWidth: 1,\n borderRadius: 6,\n overflow: 'hidden' as const,\n elevation: 8,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.15,\n shadowRadius: 8,\n },\n modalOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.4)',\n justifyContent: 'center' as const,\n },\n modalPanel: {\n margin: 24,\n maxHeight: '70%',\n borderRadius: 12,\n overflow: 'hidden' as const,\n },\n});\n"],"names":["resolveThemeTokenForNative","useRef","useState","useSafeAreaInsets","useKeyboardHeight","useMemo","Keyboard","useCallback","jsx","Text","jsxs","Pressable","Fragment","View","TextInput","FlatList","Input","InputField","Modal","Dimensions","computePanelGeometry","StyleSheet"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../../../../../../apps/mobile/src/Core/Dropdown/index.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useRef, useState, type ChangeEvent } from \"react\";\nimport {\n Dimensions,\n FlatList,\n Keyboard,\n Modal,\n Pressable,\n ScrollView,\n TouchableOpacity,\n View,\n StyleSheet, Text, TextInput\n} from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { Input, InputField, type VirtualScrollerOptions } from \"../../\";\nimport { resolveThemeTokenForNative, toNativeValue } from '../../Factory/helpers/style';\nimport { useKeyboardHeight } from '../../Factory/helpers/useKeyboardHeight';\nimport { computePanelGeometry } from './panelGeometry';\n\n/* ---------------------------------------------\n Types (PrimeReact-compatible)\n---------------------------------------------- */\n\nexport interface DropdownChangeEvent<T = any> {\n originalEvent?: any;\n value: T | null;\n}\n\n\nexport interface DropdownProps<T = any> {\n value?: T | null;\n options?: T[];\n\n onChange?: (e: ChangeEvent<T>, item:any) => void;\n\n optionLabel?: string;\n optionValue?: string;\n\n placeholder?: string;\n disabled?: boolean;\n editable?: boolean;\n loading?: boolean;\n showClear?: boolean;\n isModal?: boolean;\n\n checkmark?: boolean;\n highlightOnSelect?: boolean;\n\n filter?: boolean;\n filterBy?: string;\n emptyFilterMessage?: string;\n /**\n * Placeholder for the panel's filter field.\n *\n * ⛔ THIS COMPONENT CANNOT TRANSLATE. It lives in `apps/mobile`, which\n * `packages/ui` imports — the reverse import would be a cycle between the two\n * workspaces. So the sentence is resolved by the KitsConcerto wrapper, which\n * has `useLanguage()`, and arrives here already written, exactly as\n * `emptyFilterMessage` does.\n */\n filterPlaceholder?: string;\n /**\n * Open the options in a popup that owns the screen instead of a panel\n * anchored to the trigger.\n *\n * ⛔ THE ANCHOR IS THE PROBLEM THIS ESCAPES. An anchored panel can never be\n * taller than the gap between the trigger and the keyboard, and a field in\n * the middle of a form has ~190pt of gap on a 874pt phone — a search box and\n * four rows. Sizing that gap correctly does not make it big. The popup takes\n * a fixed share of the window instead, so where the field sits stops\n * mattering.\n *\n * Default false: every existing consumer keeps the anchored panel.\n */\n popup?: boolean;\n /**\n * Supplies the popup's container. Injected by the KitsConcerto wrapper\n * because the container is this library's `KitsDialogControlled`, which\n * lives in `packages/ui` — and `packages/ui` imports THIS file, so importing\n * it back would be a cycle between the two workspaces.\n *\n * Without it `popup` falls back to the anchored panel rather than rendering\n * nothing.\n */\n renderPopup?: (args: {\n visible: boolean;\n onClose: () => void;\n title?: React.ReactNode;\n children: React.ReactNode;\n }) => React.ReactNode;\n /** Title for the popup header. The wrapper passes the field's label. */\n popupTitle?: React.ReactNode;\n /**\n * Which way the reader reads, from the wrapper's `useLanguage().isRTL`.\n *\n * ⛔ NOT `I18nManager.isRTL`. That is the PROCESS layout direction, which a\n * consumer can force at boot and which does not change when the reader\n * switches language. The filter field follows the interface language, like\n * every other input in this library.\n */\n isRTL?: boolean;\n\n itemTemplate?: (item: T) => React.ReactNode;\n valueTemplate?: (value: T | null) => React.ReactNode;\n panelFooterTemplate?: () => React.ReactNode;\n\n optionGroupLabel?: string;\n optionGroupChildren?: string;\n optionGroupTemplate?: (group: any) => React.ReactNode;\n\n virtualScrollerOptions?: VirtualScrollerOptions;\n\n invalid?: boolean;\n testID?: string;\n style?: import('react-native').ViewStyle;\n}\n\n/* ---------------------------------------------\n Helpers\n---------------------------------------------- */\n\nconst getLabel = (item: any, optionLabel?: string) => {\n if (!item) return \"\";\n if (!optionLabel) return String(item);\n return String(item[optionLabel]);\n};\n\nconst getValue = (item: any, optionValue?: string) => {\n if (!item) return null;\n if (!optionValue) return item;\n return item[optionValue];\n};\n\nconst t = resolveThemeTokenForNative;\n\n/**\n * Option-row text size, taken from the theme's own scale rather than picked.\n *\n * The rows used to set no `fontSize` at all, so they fell through to React\n * Native's default of 14 — which happens to equal the scale's `sm` step, by\n * coincidence rather than intent. `md` is the scale's body size and one step\n * up. `$fontSizes.md` resolves to '1rem' and `toNativeValue` turns that into\n * 16; the `?? 16` is the same number spelled out, for the case where a\n * consumer's theme does not declare the step.\n */\nconst optionFontSize = (): number => {\n const resolved = toNativeValue(resolveThemeTokenForNative('$fontSizes.md'));\n return typeof resolved === 'number' ? resolved : 16;\n};\n\nconst TEXT_STYLE_KEYS = new Set([\n 'fontSize', 'fontFamily', 'fontWeight', 'fontStyle',\n 'color', 'letterSpacing', 'lineHeight', 'textAlign',\n 'textDecorationLine', 'textTransform',\n]);\n\nfunction splitStyle(combined?: any): { viewStyle?: any; textStyle?: any } {\n if (!combined) return {};\n const view: Record<string, any> = {};\n const text: Record<string, any> = {};\n for (const [k, v] of Object.entries(combined)) {\n if (TEXT_STYLE_KEYS.has(k)) text[k] = v;\n else view[k] = v;\n }\n return {\n viewStyle: Object.keys(view).length ? view : undefined,\n textStyle: Object.keys(text).length ? text : undefined,\n };\n}\n\n/* ---------------------------------------------\n Component\n---------------------------------------------- */\n\nexport default function Dropdown<T = any>({\n value,\n options = [],\n onChange,\n\n optionLabel,\n optionValue,\n\n placeholder,\n disabled,\n editable,\n isModal = false,\n\n checkmark,\n highlightOnSelect = true,\n\n filter,\n filterBy,\n // ⚠️ THESE TWO ENGLISH LITERALS ARE A LAST RESORT, NOT A\n // TRANSLATION. The KitsConcerto wrapper always passes the\n // reader's own sentence; these only apply when this component\n // is used directly from `apps/mobile`, and they exist so a\n // panel can never render a blank search box or an empty\n // \"no results\" line. Recorded as English fallbacks.\n emptyFilterMessage = 'No results found',\n filterPlaceholder = 'Search...',\n isRTL = false,\n popup = false,\n renderPopup,\n popupTitle,\n\n itemTemplate,\n valueTemplate,\n panelFooterTemplate,\n\n optionGroupLabel,\n optionGroupChildren,\n optionGroupTemplate,\n\n virtualScrollerOptions,\n\n invalid,\n testID,\n style: externalStyle,\n }: DropdownProps<T>) {\n const inputRef = useRef<any>(null);\n const triggerRef = useRef<View>(null);\n const [open, setOpen] = useState(false);\n const [inputText, setInputText] = useState(\"\");\n const [filterQuery, setFilterQuery] = useState(\"\");\n const [triggerLayout, setTriggerLayout] = useState<{\n x: number; y: number; width: number; height: number;\n } | null>(null);\n const insets = useSafeAreaInsets();\n const keyboardHeight = useKeyboardHeight();\n\n const { viewStyle: externalViewStyle, textStyle: externalTextStyle } = splitStyle(externalStyle);\n\n const colors = {\n border: t('border') || t('gray.300'),\n borderInvalid: t('danger') || t('red.500'),\n bg: t('surface-card') || '#fff',\n text: t('text') || t('gray.800'),\n placeholder: t('text-secondary') || t('gray.400'),\n optionSelected: t('highlight-bg') || t('gray.100'),\n groupBg: t('surface-ground') || t('gray.50'),\n filterBorder: t('border') || t('gray.200'),\n filterBg: t('surface-ground') || t('gray.50'),\n filterText: t('text') || t('gray.800'),\n emptyText: t('text-secondary') || t('gray.400'),\n primary: t('primary'),\n };\n\n /* ---------------------------------------------\n Derived\n ---------------------------------------------- */\n\n const selectedItem = useMemo(() => {\n if (value == null) return null;\n // Search through group children when grouped\n if (optionGroupChildren) {\n for (const group of options as any[]) {\n const children = group[optionGroupChildren];\n if (Array.isArray(children)) {\n const found = children.find((c: any) => getValue(c, optionValue) === value);\n if (found) return found;\n }\n }\n return null;\n }\n return options.find(\n (o) => getValue(o, optionValue) === value\n ) ?? null;\n }, [value, options, optionValue, optionGroupChildren]);\n\n /* ---------------------------------------------\n Open / Close\n ---------------------------------------------- */\n\n const toggle = () => {\n if (disabled) return;\n Keyboard.dismiss();\n if (open) {\n setOpen(false);\n return;\n }\n setFilterQuery(\"\");\n // Measure trigger position in window so the popover can be rendered\n // inside a Modal (escaping any parent ScrollView) at the correct anchor.\n triggerRef.current?.measureInWindow((x, y, width, height) => {\n setTriggerLayout({ x, y, width, height });\n setOpen(true);\n });\n };\n\n const close = () => setOpen(false);\n\n /* ---------------------------------------------\n Selection\n ---------------------------------------------- */\n\n const selectItem = (item: T) => {\n const newValue = getValue(item, optionValue);\n\n if (!onChange) return;\n\n const syntheticEvent = {\n target: {\n value: newValue,\n },\n } as React.ChangeEvent<any>;\n\n onChange(syntheticEvent, item);\n\n setOpen(false);\n };\n\n /* ---------------------------------------------\n Render item\n ---------------------------------------------- */\n\n const renderItem = useCallback(\n (item: any, index: number) => {\n if (!item) {\n return null;\n }\n\n // Group header\n if (item.__group) {\n return (\n <Text key={`group-${index}`} style={[styles.groupLabel, { backgroundColor: colors.groupBg }]}>\n {optionGroupLabel ? item.group?.[optionGroupLabel] : \"\"}\n </Text>\n );\n }\n\n const selected =\n value != null &&\n getValue(item, optionValue) === value;\n\n let content: React.ReactElement;\n\n if (itemTemplate) {\n const rendered = itemTemplate(item);\n\n content = React.isValidElement(rendered) ? (\n rendered\n ) : (\n <Text>{String(rendered ?? \"\")}</Text>\n );\n } else {\n content = (\n <Text style={[\n { color: colors.text, fontSize: optionFontSize() },\n // A consumer-supplied size still wins over the scale.\n externalTextStyle && externalTextStyle.fontSize ? { fontSize: externalTextStyle.fontSize } : null,\n ]}>\n {getLabel(item, optionLabel)}\n </Text>\n );\n }\n\n return (\n <Pressable\n key={`item-${index}`}\n onPress={() => selectItem(item)}\n style={[\n styles.option,\n selected && highlightOnSelect && { backgroundColor: colors.optionSelected },\n ]}\n >\n {content}\n {checkmark && selected && <Text>✓</Text>}\n </Pressable>\n );\n },\n [\n value,\n optionValue,\n optionLabel,\n itemTemplate,\n optionGroupLabel,\n checkmark,\n highlightOnSelect,\n ]\n );\n\n\n /* ---------------------------------------------\n Group flattening\n ---------------------------------------------- */\n\n const flatData = useMemo(() => {\n if (!optionGroupLabel || !optionGroupChildren) {\n return options;\n }\n\n const out: any[] = [];\n options.forEach((g: any) => {\n out.push({ __group: true, group: g });\n g[optionGroupChildren]?.forEach((c: any) => out.push(c));\n });\n return out;\n }, [options]);\n\n /* ---------------------------------------------\n Filter\n ---------------------------------------------- */\n\n const filteredData = useMemo(() => {\n if (!filter || !filterQuery) return flatData;\n const q = filterQuery.toLowerCase();\n const key = filterBy || optionLabel;\n\n return flatData.filter((entry: any) => {\n // Keep group headers\n if (entry.__group) return true;\n const label = getLabel(entry, key);\n return label.toLowerCase().includes(q);\n });\n }, [flatData, filter, filterQuery, filterBy, optionLabel]);\n\n /* ---------------------------------------------\n Display value\n ---------------------------------------------- */\n\n const displayValue = valueTemplate\n ? valueTemplate(selectedItem)\n : selectedItem\n ? getLabel(selectedItem, optionLabel)\n : \"\";\n\n /* ---------------------------------------------\n Panel body — the search field and the list\n ---------------------------------------------- */\n\n /*\n * ⛔ ONE BODY, THREE CONTAINERS. The anchored panel and the centred modal\n * each carried their own copy of this markup, which is why the hardcoded\n * \"Search...\" had to be found and fixed twice. The popup would have made it\n * three. The containers differ; what is inside them does not.\n *\n * `fill` is the one real difference. In the anchored panel the container has\n * a `maxHeight` and no height, so the list must shrink-wrap its content up\n * to that ceiling (`flexShrink`). In the popup and the centred modal the\n * container has a real height, so the list takes what is left (`flex: 1`).\n */\n const panelBody = (fill: boolean, autoFocusFilter: boolean) => (\n <>\n {filter && (\n <View style={[styles.filterContainer, { borderBottomColor: colors.filterBorder }]}>\n <TextInput\n value={filterQuery}\n onChangeText={setFilterQuery}\n placeholder={filterPlaceholder}\n placeholderTextColor={colors.placeholder}\n style={[styles.filterInput, {\n borderColor: colors.filterBorder,\n backgroundColor: colors.filterBg,\n color: colors.filterText,\n },\n // Every other input in this library names its own edge and\n // direction from the reader's language. Leaving these unset let the\n // platform decide, so the field followed the process layout\n // direction instead of the person reading it.\n isRTL ? styles.filterRtl : styles.filterLtr]}\n /* ⛔ THE ANCHORED PANEL KEEPS ITS AUTOFOCUS — changing it would\n change behaviour for every consumer that has not opted in. In\n the popup the list is already the whole point and is fully\n visible, so the keyboard waits to be asked for: one tap on the\n field raises it, and until then the list has the whole sheet. */\n autoFocus={autoFocusFilter}\n />\n </View>\n )}\n <FlatList\n style={fill ? styles.listFill : styles.listShrink}\n contentContainerStyle={styles.listContent}\n data={filteredData}\n keyExtractor={(item: any, i: number) =>\n item?.__group ? `group-${i}` : `item-${i}`\n }\n renderItem={({ item, index }) => renderItem(item, index)}\n keyboardShouldPersistTaps=\"handled\"\n showsHorizontalScrollIndicator={false}\n ListEmptyComponent={\n filterQuery ? (\n <View style={styles.emptyContainer}>\n <Text style={[styles.emptyText, { color: colors.emptyText }]}>{emptyFilterMessage}</Text>\n </View>\n ) : null\n }\n />\n {panelFooterTemplate?.()}\n </>\n );\n\n /* ---------------------------------------------\n Render\n ---------------------------------------------- */\n\n const usePopup = popup && typeof renderPopup === 'function';\n\n return (\n <View style={styles.container} testID={testID}>\n <Pressable\n ref={triggerRef as any}\n style={[\n styles.control,\n { borderColor: colors.border, backgroundColor: colors.bg },\n invalid && { borderColor: colors.borderInvalid },\n disabled && styles.disabled,\n externalViewStyle,\n ]}\n onPress={toggle}\n >\n {editable ? (\n <Input style={styles.input}>\n <InputField\n ref={inputRef}\n value={inputText}\n onChangeText={setInputText}\n placeholder={placeholder}\n editable={!disabled}\n />\n </Input>\n ) : (\n <Text\n numberOfLines={1}\n style={[\n // Fill the trigger row and left-align the value/placeholder so it\n // doesn't read as centred (the row is justify=space-between, so the\n // arrow stays pinned right).\n { flex: 1, textAlign: \"left\" as const },\n displayValue ? { color: colors.text } : { color: colors.placeholder },\n externalTextStyle,\n !displayValue && { color: colors.placeholder },\n ]}>\n {displayValue || placeholder}\n </Text>\n )}\n\n <Text style={[{ color: colors.text }, externalTextStyle]}>▾</Text>\n </Pressable>\n\n {!usePopup && !isModal && (\n <Modal\n visible={open && !!triggerLayout}\n transparent\n animationType=\"none\"\n onRequestClose={close}\n >\n <Pressable style={styles.popoverOverlay} onPress={close}>\n {triggerLayout && (() => {\n const screen = Dimensions.get('window');\n const { top, maxHeight } = computePanelGeometry({\n screenHeight: screen.height,\n insetTop: insets.top,\n insetBottom: insets.bottom,\n keyboardHeight,\n triggerY: triggerLayout.y,\n triggerHeight: triggerLayout.height,\n });\n\n return (\n <View\n style={[\n styles.popoverPanel,\n {\n top,\n left: triggerLayout.x,\n width: triggerLayout.width,\n maxHeight,\n borderColor: colors.border,\n backgroundColor: colors.bg,\n },\n ]}\n onStartShouldSetResponder={() => true}\n >\n {panelBody(false, true)}\n </View>\n );\n })()}\n </Pressable>\n </Modal>\n )}\n\n {!usePopup && isModal && (\n <Modal visible={open} transparent animationType=\"fade\">\n <Pressable style={styles.modalOverlay} onPress={close}>\n <View\n style={[styles.modalPanel, { backgroundColor: colors.bg }]}\n onStartShouldSetResponder={() => true}\n >\n {panelBody(true, true)}\n </View>\n </Pressable>\n </Modal>\n )}\n\n {/* Popup — the container comes from the wrapper (this library's own\n Dialog in sheet position); everything inside it is the same body the\n other two containers render. */}\n {usePopup && renderPopup!({\n visible: open,\n onClose: close,\n title: popupTitle,\n children: panelBody(true, false),\n })}\n\n </View>\n );\n}\n\n/* ---------------------------------------------\n Styles (layout only — colors applied inline via theme tokens)\n---------------------------------------------- */\n\nconst styles = StyleSheet.create({\n container: {\n width: \"100%\",\n position: \"relative\" as const,\n },\n control: {\n flexDirection: \"row\" as const,\n alignItems: \"center\" as const,\n justifyContent: \"space-between\" as const,\n borderWidth: 1,\n borderRadius: 6,\n paddingHorizontal: 10,\n paddingVertical: 10,\n },\n disabled: {\n opacity: 0.5,\n },\n option: {\n paddingHorizontal: 12,\n paddingVertical: 10,\n flexDirection: \"row\" as const,\n justifyContent: \"space-between\" as const,\n alignItems: \"center\" as const,\n },\n groupLabel: {\n paddingHorizontal: 12,\n paddingVertical: 8,\n fontWeight: \"600\" as const,\n },\n input: {\n flex: 1,\n },\n panel: {\n position: \"absolute\" as const,\n top: \"100%\",\n left: 0,\n right: 0,\n marginTop: 4,\n borderWidth: 1,\n borderRadius: 6,\n maxHeight: 260,\n overflow: \"hidden\" as const,\n zIndex: 9999,\n },\n filterContainer: {\n paddingHorizontal: 8,\n paddingVertical: 6,\n borderBottomWidth: 1,\n },\n listFill: {\n flex: 1,\n },\n // The anchored panel is sized by `maxHeight` with no height, so the list has\n // to grow with its content up to that ceiling and then scroll inside it.\n // `flex: 1` sets flexBasis 0, which contributes nothing to a shrink-wrapping\n // parent.\n listShrink: {\n flexGrow: 0,\n flexShrink: 1,\n },\n listContent: {\n paddingBottom: 12,\n },\n filterInput: {\n fontSize: 14,\n paddingHorizontal: 8,\n paddingVertical: 6,\n borderWidth: 1,\n borderRadius: 4,\n },\n filterLtr: {\n textAlign: 'left' as const,\n writingDirection: 'ltr' as const,\n },\n filterRtl: {\n textAlign: 'right' as const,\n writingDirection: 'rtl' as const,\n },\n emptyContainer: {\n padding: 16,\n alignItems: 'center' as const,\n },\n emptyText: {\n fontSize: 14,\n },\n popoverOverlay: {\n flex: 1,\n backgroundColor: 'transparent',\n },\n popoverPanel: {\n position: 'absolute' as const,\n borderWidth: 1,\n borderRadius: 6,\n overflow: 'hidden' as const,\n elevation: 8,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.15,\n shadowRadius: 8,\n },\n modalOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.4)',\n justifyContent: 'center' as const,\n },\n modalPanel: {\n margin: 24,\n maxHeight: '70%',\n borderRadius: 12,\n overflow: 'hidden' as const,\n },\n});\n"],"names":["resolveThemeTokenForNative","toNativeValue","useRef","useState","useSafeAreaInsets","useKeyboardHeight","useMemo","Keyboard","useCallback","jsx","Text","jsxs","Pressable","Fragment","View","TextInput","FlatList","Input","InputField","Modal","Dimensions","computePanelGeometry","StyleSheet"],"mappings":"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"}
|
|
@@ -49,7 +49,7 @@ import '../../ui/toast/index.js';
|
|
|
49
49
|
import '../../ui/tooltip/index.js';
|
|
50
50
|
import '../../ui/vstack/index.js';
|
|
51
51
|
import 'react-native-reanimated';
|
|
52
|
-
import { resolveThemeTokenForNative } from '../../Factory/helpers/style.js';
|
|
52
|
+
import { resolveThemeTokenForNative, toNativeValue } from '../../Factory/helpers/style.js';
|
|
53
53
|
import '../../Factory/DimensionsContext.js';
|
|
54
54
|
import 'react-icons/fa';
|
|
55
55
|
import 'react-icons/ai';
|
|
@@ -94,6 +94,10 @@ const getValue = (item, optionValue) => {
|
|
|
94
94
|
return item[optionValue];
|
|
95
95
|
};
|
|
96
96
|
const t = resolveThemeTokenForNative;
|
|
97
|
+
const optionFontSize = () => {
|
|
98
|
+
const resolved = toNativeValue(resolveThemeTokenForNative("$fontSizes.md"));
|
|
99
|
+
return typeof resolved === "number" ? resolved : 16;
|
|
100
|
+
};
|
|
97
101
|
const TEXT_STYLE_KEYS = /* @__PURE__ */ new Set([
|
|
98
102
|
"fontSize",
|
|
99
103
|
"fontFamily",
|
|
@@ -234,7 +238,11 @@ function Dropdown({
|
|
|
234
238
|
const rendered = itemTemplate(item);
|
|
235
239
|
content = React.isValidElement(rendered) ? rendered : /* @__PURE__ */ jsx(Text, { children: String(rendered ?? "") });
|
|
236
240
|
} else {
|
|
237
|
-
content = /* @__PURE__ */ jsx(Text, { style: [
|
|
241
|
+
content = /* @__PURE__ */ jsx(Text, { style: [
|
|
242
|
+
{ color: colors.text, fontSize: optionFontSize() },
|
|
243
|
+
// A consumer-supplied size still wins over the scale.
|
|
244
|
+
externalTextStyle && externalTextStyle.fontSize ? { fontSize: externalTextStyle.fontSize } : null
|
|
245
|
+
], children: getLabel(item, optionLabel) });
|
|
238
246
|
}
|
|
239
247
|
return /* @__PURE__ */ jsxs(
|
|
240
248
|
Pressable,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../../../../../apps/mobile/src/Core/Dropdown/index.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useRef, useState, type ChangeEvent } from \"react\";\nimport {\n Dimensions,\n FlatList,\n Keyboard,\n Modal,\n Pressable,\n ScrollView,\n TouchableOpacity,\n View,\n StyleSheet, Text, TextInput\n} from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { Input, InputField, type VirtualScrollerOptions } from \"../../\";\nimport { resolveThemeTokenForNative } from '../../Factory/helpers/style';\nimport { useKeyboardHeight } from '../../Factory/helpers/useKeyboardHeight';\nimport { computePanelGeometry } from './panelGeometry';\n\n/* ---------------------------------------------\n Types (PrimeReact-compatible)\n---------------------------------------------- */\n\nexport interface DropdownChangeEvent<T = any> {\n originalEvent?: any;\n value: T | null;\n}\n\n\nexport interface DropdownProps<T = any> {\n value?: T | null;\n options?: T[];\n\n onChange?: (e: ChangeEvent<T>, item:any) => void;\n\n optionLabel?: string;\n optionValue?: string;\n\n placeholder?: string;\n disabled?: boolean;\n editable?: boolean;\n loading?: boolean;\n showClear?: boolean;\n isModal?: boolean;\n\n checkmark?: boolean;\n highlightOnSelect?: boolean;\n\n filter?: boolean;\n filterBy?: string;\n emptyFilterMessage?: string;\n /**\n * Placeholder for the panel's filter field.\n *\n * ⛔ THIS COMPONENT CANNOT TRANSLATE. It lives in `apps/mobile`, which\n * `packages/ui` imports — the reverse import would be a cycle between the two\n * workspaces. So the sentence is resolved by the KitsConcerto wrapper, which\n * has `useLanguage()`, and arrives here already written, exactly as\n * `emptyFilterMessage` does.\n */\n filterPlaceholder?: string;\n /**\n * Open the options in a popup that owns the screen instead of a panel\n * anchored to the trigger.\n *\n * ⛔ THE ANCHOR IS THE PROBLEM THIS ESCAPES. An anchored panel can never be\n * taller than the gap between the trigger and the keyboard, and a field in\n * the middle of a form has ~190pt of gap on a 874pt phone — a search box and\n * four rows. Sizing that gap correctly does not make it big. The popup takes\n * a fixed share of the window instead, so where the field sits stops\n * mattering.\n *\n * Default false: every existing consumer keeps the anchored panel.\n */\n popup?: boolean;\n /**\n * Supplies the popup's container. Injected by the KitsConcerto wrapper\n * because the container is this library's `KitsDialogControlled`, which\n * lives in `packages/ui` — and `packages/ui` imports THIS file, so importing\n * it back would be a cycle between the two workspaces.\n *\n * Without it `popup` falls back to the anchored panel rather than rendering\n * nothing.\n */\n renderPopup?: (args: {\n visible: boolean;\n onClose: () => void;\n title?: React.ReactNode;\n children: React.ReactNode;\n }) => React.ReactNode;\n /** Title for the popup header. The wrapper passes the field's label. */\n popupTitle?: React.ReactNode;\n /**\n * Which way the reader reads, from the wrapper's `useLanguage().isRTL`.\n *\n * ⛔ NOT `I18nManager.isRTL`. That is the PROCESS layout direction, which a\n * consumer can force at boot and which does not change when the reader\n * switches language. The filter field follows the interface language, like\n * every other input in this library.\n */\n isRTL?: boolean;\n\n itemTemplate?: (item: T) => React.ReactNode;\n valueTemplate?: (value: T | null) => React.ReactNode;\n panelFooterTemplate?: () => React.ReactNode;\n\n optionGroupLabel?: string;\n optionGroupChildren?: string;\n optionGroupTemplate?: (group: any) => React.ReactNode;\n\n virtualScrollerOptions?: VirtualScrollerOptions;\n\n invalid?: boolean;\n testID?: string;\n style?: import('react-native').ViewStyle;\n}\n\n/* ---------------------------------------------\n Helpers\n---------------------------------------------- */\n\nconst getLabel = (item: any, optionLabel?: string) => {\n if (!item) return \"\";\n if (!optionLabel) return String(item);\n return String(item[optionLabel]);\n};\n\nconst getValue = (item: any, optionValue?: string) => {\n if (!item) return null;\n if (!optionValue) return item;\n return item[optionValue];\n};\n\nconst t = resolveThemeTokenForNative;\n\nconst TEXT_STYLE_KEYS = new Set([\n 'fontSize', 'fontFamily', 'fontWeight', 'fontStyle',\n 'color', 'letterSpacing', 'lineHeight', 'textAlign',\n 'textDecorationLine', 'textTransform',\n]);\n\nfunction splitStyle(combined?: any): { viewStyle?: any; textStyle?: any } {\n if (!combined) return {};\n const view: Record<string, any> = {};\n const text: Record<string, any> = {};\n for (const [k, v] of Object.entries(combined)) {\n if (TEXT_STYLE_KEYS.has(k)) text[k] = v;\n else view[k] = v;\n }\n return {\n viewStyle: Object.keys(view).length ? view : undefined,\n textStyle: Object.keys(text).length ? text : undefined,\n };\n}\n\n/* ---------------------------------------------\n Component\n---------------------------------------------- */\n\nexport default function Dropdown<T = any>({\n value,\n options = [],\n onChange,\n\n optionLabel,\n optionValue,\n\n placeholder,\n disabled,\n editable,\n isModal = false,\n\n checkmark,\n highlightOnSelect = true,\n\n filter,\n filterBy,\n // ⚠️ THESE TWO ENGLISH LITERALS ARE A LAST RESORT, NOT A\n // TRANSLATION. The KitsConcerto wrapper always passes the\n // reader's own sentence; these only apply when this component\n // is used directly from `apps/mobile`, and they exist so a\n // panel can never render a blank search box or an empty\n // \"no results\" line. Recorded as English fallbacks.\n emptyFilterMessage = 'No results found',\n filterPlaceholder = 'Search...',\n isRTL = false,\n popup = false,\n renderPopup,\n popupTitle,\n\n itemTemplate,\n valueTemplate,\n panelFooterTemplate,\n\n optionGroupLabel,\n optionGroupChildren,\n optionGroupTemplate,\n\n virtualScrollerOptions,\n\n invalid,\n testID,\n style: externalStyle,\n }: DropdownProps<T>) {\n const inputRef = useRef<any>(null);\n const triggerRef = useRef<View>(null);\n const [open, setOpen] = useState(false);\n const [inputText, setInputText] = useState(\"\");\n const [filterQuery, setFilterQuery] = useState(\"\");\n const [triggerLayout, setTriggerLayout] = useState<{\n x: number; y: number; width: number; height: number;\n } | null>(null);\n const insets = useSafeAreaInsets();\n const keyboardHeight = useKeyboardHeight();\n\n const { viewStyle: externalViewStyle, textStyle: externalTextStyle } = splitStyle(externalStyle);\n\n const colors = {\n border: t('border') || t('gray.300'),\n borderInvalid: t('danger') || t('red.500'),\n bg: t('surface-card') || '#fff',\n text: t('text') || t('gray.800'),\n placeholder: t('text-secondary') || t('gray.400'),\n optionSelected: t('highlight-bg') || t('gray.100'),\n groupBg: t('surface-ground') || t('gray.50'),\n filterBorder: t('border') || t('gray.200'),\n filterBg: t('surface-ground') || t('gray.50'),\n filterText: t('text') || t('gray.800'),\n emptyText: t('text-secondary') || t('gray.400'),\n primary: t('primary'),\n };\n\n /* ---------------------------------------------\n Derived\n ---------------------------------------------- */\n\n const selectedItem = useMemo(() => {\n if (value == null) return null;\n // Search through group children when grouped\n if (optionGroupChildren) {\n for (const group of options as any[]) {\n const children = group[optionGroupChildren];\n if (Array.isArray(children)) {\n const found = children.find((c: any) => getValue(c, optionValue) === value);\n if (found) return found;\n }\n }\n return null;\n }\n return options.find(\n (o) => getValue(o, optionValue) === value\n ) ?? null;\n }, [value, options, optionValue, optionGroupChildren]);\n\n /* ---------------------------------------------\n Open / Close\n ---------------------------------------------- */\n\n const toggle = () => {\n if (disabled) return;\n Keyboard.dismiss();\n if (open) {\n setOpen(false);\n return;\n }\n setFilterQuery(\"\");\n // Measure trigger position in window so the popover can be rendered\n // inside a Modal (escaping any parent ScrollView) at the correct anchor.\n triggerRef.current?.measureInWindow((x, y, width, height) => {\n setTriggerLayout({ x, y, width, height });\n setOpen(true);\n });\n };\n\n const close = () => setOpen(false);\n\n /* ---------------------------------------------\n Selection\n ---------------------------------------------- */\n\n const selectItem = (item: T) => {\n const newValue = getValue(item, optionValue);\n\n if (!onChange) return;\n\n const syntheticEvent = {\n target: {\n value: newValue,\n },\n } as React.ChangeEvent<any>;\n\n onChange(syntheticEvent, item);\n\n setOpen(false);\n };\n\n /* ---------------------------------------------\n Render item\n ---------------------------------------------- */\n\n const renderItem = useCallback(\n (item: any, index: number) => {\n if (!item) {\n return null;\n }\n\n // Group header\n if (item.__group) {\n return (\n <Text key={`group-${index}`} style={[styles.groupLabel, { backgroundColor: colors.groupBg }]}>\n {optionGroupLabel ? item.group?.[optionGroupLabel] : \"\"}\n </Text>\n );\n }\n\n const selected =\n value != null &&\n getValue(item, optionValue) === value;\n\n let content: React.ReactElement;\n\n if (itemTemplate) {\n const rendered = itemTemplate(item);\n\n content = React.isValidElement(rendered) ? (\n rendered\n ) : (\n <Text>{String(rendered ?? \"\")}</Text>\n );\n } else {\n content = (\n <Text style={[{ color: colors.text }, externalTextStyle && { fontSize: externalTextStyle.fontSize }]}>\n {getLabel(item, optionLabel)}\n </Text>\n );\n }\n\n return (\n <Pressable\n key={`item-${index}`}\n onPress={() => selectItem(item)}\n style={[\n styles.option,\n selected && highlightOnSelect && { backgroundColor: colors.optionSelected },\n ]}\n >\n {content}\n {checkmark && selected && <Text>✓</Text>}\n </Pressable>\n );\n },\n [\n value,\n optionValue,\n optionLabel,\n itemTemplate,\n optionGroupLabel,\n checkmark,\n highlightOnSelect,\n ]\n );\n\n\n /* ---------------------------------------------\n Group flattening\n ---------------------------------------------- */\n\n const flatData = useMemo(() => {\n if (!optionGroupLabel || !optionGroupChildren) {\n return options;\n }\n\n const out: any[] = [];\n options.forEach((g: any) => {\n out.push({ __group: true, group: g });\n g[optionGroupChildren]?.forEach((c: any) => out.push(c));\n });\n return out;\n }, [options]);\n\n /* ---------------------------------------------\n Filter\n ---------------------------------------------- */\n\n const filteredData = useMemo(() => {\n if (!filter || !filterQuery) return flatData;\n const q = filterQuery.toLowerCase();\n const key = filterBy || optionLabel;\n\n return flatData.filter((entry: any) => {\n // Keep group headers\n if (entry.__group) return true;\n const label = getLabel(entry, key);\n return label.toLowerCase().includes(q);\n });\n }, [flatData, filter, filterQuery, filterBy, optionLabel]);\n\n /* ---------------------------------------------\n Display value\n ---------------------------------------------- */\n\n const displayValue = valueTemplate\n ? valueTemplate(selectedItem)\n : selectedItem\n ? getLabel(selectedItem, optionLabel)\n : \"\";\n\n /* ---------------------------------------------\n Panel body — the search field and the list\n ---------------------------------------------- */\n\n /*\n * ⛔ ONE BODY, THREE CONTAINERS. The anchored panel and the centred modal\n * each carried their own copy of this markup, which is why the hardcoded\n * \"Search...\" had to be found and fixed twice. The popup would have made it\n * three. The containers differ; what is inside them does not.\n *\n * `fill` is the one real difference. In the anchored panel the container has\n * a `maxHeight` and no height, so the list must shrink-wrap its content up\n * to that ceiling (`flexShrink`). In the popup and the centred modal the\n * container has a real height, so the list takes what is left (`flex: 1`).\n */\n const panelBody = (fill: boolean, autoFocusFilter: boolean) => (\n <>\n {filter && (\n <View style={[styles.filterContainer, { borderBottomColor: colors.filterBorder }]}>\n <TextInput\n value={filterQuery}\n onChangeText={setFilterQuery}\n placeholder={filterPlaceholder}\n placeholderTextColor={colors.placeholder}\n style={[styles.filterInput, {\n borderColor: colors.filterBorder,\n backgroundColor: colors.filterBg,\n color: colors.filterText,\n },\n // Every other input in this library names its own edge and\n // direction from the reader's language. Leaving these unset let the\n // platform decide, so the field followed the process layout\n // direction instead of the person reading it.\n isRTL ? styles.filterRtl : styles.filterLtr]}\n /* ⛔ THE ANCHORED PANEL KEEPS ITS AUTOFOCUS — changing it would\n change behaviour for every consumer that has not opted in. In\n the popup the list is already the whole point and is fully\n visible, so the keyboard waits to be asked for: one tap on the\n field raises it, and until then the list has the whole sheet. */\n autoFocus={autoFocusFilter}\n />\n </View>\n )}\n <FlatList\n style={fill ? styles.listFill : styles.listShrink}\n contentContainerStyle={styles.listContent}\n data={filteredData}\n keyExtractor={(item: any, i: number) =>\n item?.__group ? `group-${i}` : `item-${i}`\n }\n renderItem={({ item, index }) => renderItem(item, index)}\n keyboardShouldPersistTaps=\"handled\"\n showsHorizontalScrollIndicator={false}\n ListEmptyComponent={\n filterQuery ? (\n <View style={styles.emptyContainer}>\n <Text style={[styles.emptyText, { color: colors.emptyText }]}>{emptyFilterMessage}</Text>\n </View>\n ) : null\n }\n />\n {panelFooterTemplate?.()}\n </>\n );\n\n /* ---------------------------------------------\n Render\n ---------------------------------------------- */\n\n const usePopup = popup && typeof renderPopup === 'function';\n\n return (\n <View style={styles.container} testID={testID}>\n <Pressable\n ref={triggerRef as any}\n style={[\n styles.control,\n { borderColor: colors.border, backgroundColor: colors.bg },\n invalid && { borderColor: colors.borderInvalid },\n disabled && styles.disabled,\n externalViewStyle,\n ]}\n onPress={toggle}\n >\n {editable ? (\n <Input style={styles.input}>\n <InputField\n ref={inputRef}\n value={inputText}\n onChangeText={setInputText}\n placeholder={placeholder}\n editable={!disabled}\n />\n </Input>\n ) : (\n <Text\n numberOfLines={1}\n style={[\n // Fill the trigger row and left-align the value/placeholder so it\n // doesn't read as centred (the row is justify=space-between, so the\n // arrow stays pinned right).\n { flex: 1, textAlign: \"left\" as const },\n displayValue ? { color: colors.text } : { color: colors.placeholder },\n externalTextStyle,\n !displayValue && { color: colors.placeholder },\n ]}>\n {displayValue || placeholder}\n </Text>\n )}\n\n <Text style={[{ color: colors.text }, externalTextStyle]}>▾</Text>\n </Pressable>\n\n {!usePopup && !isModal && (\n <Modal\n visible={open && !!triggerLayout}\n transparent\n animationType=\"none\"\n onRequestClose={close}\n >\n <Pressable style={styles.popoverOverlay} onPress={close}>\n {triggerLayout && (() => {\n const screen = Dimensions.get('window');\n const { top, maxHeight } = computePanelGeometry({\n screenHeight: screen.height,\n insetTop: insets.top,\n insetBottom: insets.bottom,\n keyboardHeight,\n triggerY: triggerLayout.y,\n triggerHeight: triggerLayout.height,\n });\n\n return (\n <View\n style={[\n styles.popoverPanel,\n {\n top,\n left: triggerLayout.x,\n width: triggerLayout.width,\n maxHeight,\n borderColor: colors.border,\n backgroundColor: colors.bg,\n },\n ]}\n onStartShouldSetResponder={() => true}\n >\n {panelBody(false, true)}\n </View>\n );\n })()}\n </Pressable>\n </Modal>\n )}\n\n {!usePopup && isModal && (\n <Modal visible={open} transparent animationType=\"fade\">\n <Pressable style={styles.modalOverlay} onPress={close}>\n <View\n style={[styles.modalPanel, { backgroundColor: colors.bg }]}\n onStartShouldSetResponder={() => true}\n >\n {panelBody(true, true)}\n </View>\n </Pressable>\n </Modal>\n )}\n\n {/* Popup — the container comes from the wrapper (this library's own\n Dialog in sheet position); everything inside it is the same body the\n other two containers render. */}\n {usePopup && renderPopup!({\n visible: open,\n onClose: close,\n title: popupTitle,\n children: panelBody(true, false),\n })}\n\n </View>\n );\n}\n\n/* ---------------------------------------------\n Styles (layout only — colors applied inline via theme tokens)\n---------------------------------------------- */\n\nconst styles = StyleSheet.create({\n container: {\n width: \"100%\",\n position: \"relative\" as const,\n },\n control: {\n flexDirection: \"row\" as const,\n alignItems: \"center\" as const,\n justifyContent: \"space-between\" as const,\n borderWidth: 1,\n borderRadius: 6,\n paddingHorizontal: 10,\n paddingVertical: 10,\n },\n disabled: {\n opacity: 0.5,\n },\n option: {\n paddingHorizontal: 12,\n paddingVertical: 10,\n flexDirection: \"row\" as const,\n justifyContent: \"space-between\" as const,\n alignItems: \"center\" as const,\n },\n groupLabel: {\n paddingHorizontal: 12,\n paddingVertical: 8,\n fontWeight: \"600\" as const,\n },\n input: {\n flex: 1,\n },\n panel: {\n position: \"absolute\" as const,\n top: \"100%\",\n left: 0,\n right: 0,\n marginTop: 4,\n borderWidth: 1,\n borderRadius: 6,\n maxHeight: 260,\n overflow: \"hidden\" as const,\n zIndex: 9999,\n },\n filterContainer: {\n paddingHorizontal: 8,\n paddingVertical: 6,\n borderBottomWidth: 1,\n },\n listFill: {\n flex: 1,\n },\n // The anchored panel is sized by `maxHeight` with no height, so the list has\n // to grow with its content up to that ceiling and then scroll inside it.\n // `flex: 1` sets flexBasis 0, which contributes nothing to a shrink-wrapping\n // parent.\n listShrink: {\n flexGrow: 0,\n flexShrink: 1,\n },\n listContent: {\n paddingBottom: 12,\n },\n filterInput: {\n fontSize: 14,\n paddingHorizontal: 8,\n paddingVertical: 6,\n borderWidth: 1,\n borderRadius: 4,\n },\n filterLtr: {\n textAlign: 'left' as const,\n writingDirection: 'ltr' as const,\n },\n filterRtl: {\n textAlign: 'right' as const,\n writingDirection: 'rtl' as const,\n },\n emptyContainer: {\n padding: 16,\n alignItems: 'center' as const,\n },\n emptyText: {\n fontSize: 14,\n },\n popoverOverlay: {\n flex: 1,\n backgroundColor: 'transparent',\n },\n popoverPanel: {\n position: 'absolute' as const,\n borderWidth: 1,\n borderRadius: 6,\n overflow: 'hidden' as const,\n elevation: 8,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.15,\n shadowRadius: 8,\n },\n modalOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.4)',\n justifyContent: 'center' as const,\n },\n modalPanel: {\n margin: 24,\n maxHeight: '70%',\n borderRadius: 12,\n overflow: 'hidden' as const,\n },\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../../../../apps/mobile/src/Core/Dropdown/index.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useRef, useState, type ChangeEvent } from \"react\";\nimport {\n Dimensions,\n FlatList,\n Keyboard,\n Modal,\n Pressable,\n ScrollView,\n TouchableOpacity,\n View,\n StyleSheet, Text, TextInput\n} from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { Input, InputField, type VirtualScrollerOptions } from \"../../\";\nimport { resolveThemeTokenForNative, toNativeValue } from '../../Factory/helpers/style';\nimport { useKeyboardHeight } from '../../Factory/helpers/useKeyboardHeight';\nimport { computePanelGeometry } from './panelGeometry';\n\n/* ---------------------------------------------\n Types (PrimeReact-compatible)\n---------------------------------------------- */\n\nexport interface DropdownChangeEvent<T = any> {\n originalEvent?: any;\n value: T | null;\n}\n\n\nexport interface DropdownProps<T = any> {\n value?: T | null;\n options?: T[];\n\n onChange?: (e: ChangeEvent<T>, item:any) => void;\n\n optionLabel?: string;\n optionValue?: string;\n\n placeholder?: string;\n disabled?: boolean;\n editable?: boolean;\n loading?: boolean;\n showClear?: boolean;\n isModal?: boolean;\n\n checkmark?: boolean;\n highlightOnSelect?: boolean;\n\n filter?: boolean;\n filterBy?: string;\n emptyFilterMessage?: string;\n /**\n * Placeholder for the panel's filter field.\n *\n * ⛔ THIS COMPONENT CANNOT TRANSLATE. It lives in `apps/mobile`, which\n * `packages/ui` imports — the reverse import would be a cycle between the two\n * workspaces. So the sentence is resolved by the KitsConcerto wrapper, which\n * has `useLanguage()`, and arrives here already written, exactly as\n * `emptyFilterMessage` does.\n */\n filterPlaceholder?: string;\n /**\n * Open the options in a popup that owns the screen instead of a panel\n * anchored to the trigger.\n *\n * ⛔ THE ANCHOR IS THE PROBLEM THIS ESCAPES. An anchored panel can never be\n * taller than the gap between the trigger and the keyboard, and a field in\n * the middle of a form has ~190pt of gap on a 874pt phone — a search box and\n * four rows. Sizing that gap correctly does not make it big. The popup takes\n * a fixed share of the window instead, so where the field sits stops\n * mattering.\n *\n * Default false: every existing consumer keeps the anchored panel.\n */\n popup?: boolean;\n /**\n * Supplies the popup's container. Injected by the KitsConcerto wrapper\n * because the container is this library's `KitsDialogControlled`, which\n * lives in `packages/ui` — and `packages/ui` imports THIS file, so importing\n * it back would be a cycle between the two workspaces.\n *\n * Without it `popup` falls back to the anchored panel rather than rendering\n * nothing.\n */\n renderPopup?: (args: {\n visible: boolean;\n onClose: () => void;\n title?: React.ReactNode;\n children: React.ReactNode;\n }) => React.ReactNode;\n /** Title for the popup header. The wrapper passes the field's label. */\n popupTitle?: React.ReactNode;\n /**\n * Which way the reader reads, from the wrapper's `useLanguage().isRTL`.\n *\n * ⛔ NOT `I18nManager.isRTL`. That is the PROCESS layout direction, which a\n * consumer can force at boot and which does not change when the reader\n * switches language. The filter field follows the interface language, like\n * every other input in this library.\n */\n isRTL?: boolean;\n\n itemTemplate?: (item: T) => React.ReactNode;\n valueTemplate?: (value: T | null) => React.ReactNode;\n panelFooterTemplate?: () => React.ReactNode;\n\n optionGroupLabel?: string;\n optionGroupChildren?: string;\n optionGroupTemplate?: (group: any) => React.ReactNode;\n\n virtualScrollerOptions?: VirtualScrollerOptions;\n\n invalid?: boolean;\n testID?: string;\n style?: import('react-native').ViewStyle;\n}\n\n/* ---------------------------------------------\n Helpers\n---------------------------------------------- */\n\nconst getLabel = (item: any, optionLabel?: string) => {\n if (!item) return \"\";\n if (!optionLabel) return String(item);\n return String(item[optionLabel]);\n};\n\nconst getValue = (item: any, optionValue?: string) => {\n if (!item) return null;\n if (!optionValue) return item;\n return item[optionValue];\n};\n\nconst t = resolveThemeTokenForNative;\n\n/**\n * Option-row text size, taken from the theme's own scale rather than picked.\n *\n * The rows used to set no `fontSize` at all, so they fell through to React\n * Native's default of 14 — which happens to equal the scale's `sm` step, by\n * coincidence rather than intent. `md` is the scale's body size and one step\n * up. `$fontSizes.md` resolves to '1rem' and `toNativeValue` turns that into\n * 16; the `?? 16` is the same number spelled out, for the case where a\n * consumer's theme does not declare the step.\n */\nconst optionFontSize = (): number => {\n const resolved = toNativeValue(resolveThemeTokenForNative('$fontSizes.md'));\n return typeof resolved === 'number' ? resolved : 16;\n};\n\nconst TEXT_STYLE_KEYS = new Set([\n 'fontSize', 'fontFamily', 'fontWeight', 'fontStyle',\n 'color', 'letterSpacing', 'lineHeight', 'textAlign',\n 'textDecorationLine', 'textTransform',\n]);\n\nfunction splitStyle(combined?: any): { viewStyle?: any; textStyle?: any } {\n if (!combined) return {};\n const view: Record<string, any> = {};\n const text: Record<string, any> = {};\n for (const [k, v] of Object.entries(combined)) {\n if (TEXT_STYLE_KEYS.has(k)) text[k] = v;\n else view[k] = v;\n }\n return {\n viewStyle: Object.keys(view).length ? view : undefined,\n textStyle: Object.keys(text).length ? text : undefined,\n };\n}\n\n/* ---------------------------------------------\n Component\n---------------------------------------------- */\n\nexport default function Dropdown<T = any>({\n value,\n options = [],\n onChange,\n\n optionLabel,\n optionValue,\n\n placeholder,\n disabled,\n editable,\n isModal = false,\n\n checkmark,\n highlightOnSelect = true,\n\n filter,\n filterBy,\n // ⚠️ THESE TWO ENGLISH LITERALS ARE A LAST RESORT, NOT A\n // TRANSLATION. The KitsConcerto wrapper always passes the\n // reader's own sentence; these only apply when this component\n // is used directly from `apps/mobile`, and they exist so a\n // panel can never render a blank search box or an empty\n // \"no results\" line. Recorded as English fallbacks.\n emptyFilterMessage = 'No results found',\n filterPlaceholder = 'Search...',\n isRTL = false,\n popup = false,\n renderPopup,\n popupTitle,\n\n itemTemplate,\n valueTemplate,\n panelFooterTemplate,\n\n optionGroupLabel,\n optionGroupChildren,\n optionGroupTemplate,\n\n virtualScrollerOptions,\n\n invalid,\n testID,\n style: externalStyle,\n }: DropdownProps<T>) {\n const inputRef = useRef<any>(null);\n const triggerRef = useRef<View>(null);\n const [open, setOpen] = useState(false);\n const [inputText, setInputText] = useState(\"\");\n const [filterQuery, setFilterQuery] = useState(\"\");\n const [triggerLayout, setTriggerLayout] = useState<{\n x: number; y: number; width: number; height: number;\n } | null>(null);\n const insets = useSafeAreaInsets();\n const keyboardHeight = useKeyboardHeight();\n\n const { viewStyle: externalViewStyle, textStyle: externalTextStyle } = splitStyle(externalStyle);\n\n const colors = {\n border: t('border') || t('gray.300'),\n borderInvalid: t('danger') || t('red.500'),\n bg: t('surface-card') || '#fff',\n text: t('text') || t('gray.800'),\n placeholder: t('text-secondary') || t('gray.400'),\n optionSelected: t('highlight-bg') || t('gray.100'),\n groupBg: t('surface-ground') || t('gray.50'),\n filterBorder: t('border') || t('gray.200'),\n filterBg: t('surface-ground') || t('gray.50'),\n filterText: t('text') || t('gray.800'),\n emptyText: t('text-secondary') || t('gray.400'),\n primary: t('primary'),\n };\n\n /* ---------------------------------------------\n Derived\n ---------------------------------------------- */\n\n const selectedItem = useMemo(() => {\n if (value == null) return null;\n // Search through group children when grouped\n if (optionGroupChildren) {\n for (const group of options as any[]) {\n const children = group[optionGroupChildren];\n if (Array.isArray(children)) {\n const found = children.find((c: any) => getValue(c, optionValue) === value);\n if (found) return found;\n }\n }\n return null;\n }\n return options.find(\n (o) => getValue(o, optionValue) === value\n ) ?? null;\n }, [value, options, optionValue, optionGroupChildren]);\n\n /* ---------------------------------------------\n Open / Close\n ---------------------------------------------- */\n\n const toggle = () => {\n if (disabled) return;\n Keyboard.dismiss();\n if (open) {\n setOpen(false);\n return;\n }\n setFilterQuery(\"\");\n // Measure trigger position in window so the popover can be rendered\n // inside a Modal (escaping any parent ScrollView) at the correct anchor.\n triggerRef.current?.measureInWindow((x, y, width, height) => {\n setTriggerLayout({ x, y, width, height });\n setOpen(true);\n });\n };\n\n const close = () => setOpen(false);\n\n /* ---------------------------------------------\n Selection\n ---------------------------------------------- */\n\n const selectItem = (item: T) => {\n const newValue = getValue(item, optionValue);\n\n if (!onChange) return;\n\n const syntheticEvent = {\n target: {\n value: newValue,\n },\n } as React.ChangeEvent<any>;\n\n onChange(syntheticEvent, item);\n\n setOpen(false);\n };\n\n /* ---------------------------------------------\n Render item\n ---------------------------------------------- */\n\n const renderItem = useCallback(\n (item: any, index: number) => {\n if (!item) {\n return null;\n }\n\n // Group header\n if (item.__group) {\n return (\n <Text key={`group-${index}`} style={[styles.groupLabel, { backgroundColor: colors.groupBg }]}>\n {optionGroupLabel ? item.group?.[optionGroupLabel] : \"\"}\n </Text>\n );\n }\n\n const selected =\n value != null &&\n getValue(item, optionValue) === value;\n\n let content: React.ReactElement;\n\n if (itemTemplate) {\n const rendered = itemTemplate(item);\n\n content = React.isValidElement(rendered) ? (\n rendered\n ) : (\n <Text>{String(rendered ?? \"\")}</Text>\n );\n } else {\n content = (\n <Text style={[\n { color: colors.text, fontSize: optionFontSize() },\n // A consumer-supplied size still wins over the scale.\n externalTextStyle && externalTextStyle.fontSize ? { fontSize: externalTextStyle.fontSize } : null,\n ]}>\n {getLabel(item, optionLabel)}\n </Text>\n );\n }\n\n return (\n <Pressable\n key={`item-${index}`}\n onPress={() => selectItem(item)}\n style={[\n styles.option,\n selected && highlightOnSelect && { backgroundColor: colors.optionSelected },\n ]}\n >\n {content}\n {checkmark && selected && <Text>✓</Text>}\n </Pressable>\n );\n },\n [\n value,\n optionValue,\n optionLabel,\n itemTemplate,\n optionGroupLabel,\n checkmark,\n highlightOnSelect,\n ]\n );\n\n\n /* ---------------------------------------------\n Group flattening\n ---------------------------------------------- */\n\n const flatData = useMemo(() => {\n if (!optionGroupLabel || !optionGroupChildren) {\n return options;\n }\n\n const out: any[] = [];\n options.forEach((g: any) => {\n out.push({ __group: true, group: g });\n g[optionGroupChildren]?.forEach((c: any) => out.push(c));\n });\n return out;\n }, [options]);\n\n /* ---------------------------------------------\n Filter\n ---------------------------------------------- */\n\n const filteredData = useMemo(() => {\n if (!filter || !filterQuery) return flatData;\n const q = filterQuery.toLowerCase();\n const key = filterBy || optionLabel;\n\n return flatData.filter((entry: any) => {\n // Keep group headers\n if (entry.__group) return true;\n const label = getLabel(entry, key);\n return label.toLowerCase().includes(q);\n });\n }, [flatData, filter, filterQuery, filterBy, optionLabel]);\n\n /* ---------------------------------------------\n Display value\n ---------------------------------------------- */\n\n const displayValue = valueTemplate\n ? valueTemplate(selectedItem)\n : selectedItem\n ? getLabel(selectedItem, optionLabel)\n : \"\";\n\n /* ---------------------------------------------\n Panel body — the search field and the list\n ---------------------------------------------- */\n\n /*\n * ⛔ ONE BODY, THREE CONTAINERS. The anchored panel and the centred modal\n * each carried their own copy of this markup, which is why the hardcoded\n * \"Search...\" had to be found and fixed twice. The popup would have made it\n * three. The containers differ; what is inside them does not.\n *\n * `fill` is the one real difference. In the anchored panel the container has\n * a `maxHeight` and no height, so the list must shrink-wrap its content up\n * to that ceiling (`flexShrink`). In the popup and the centred modal the\n * container has a real height, so the list takes what is left (`flex: 1`).\n */\n const panelBody = (fill: boolean, autoFocusFilter: boolean) => (\n <>\n {filter && (\n <View style={[styles.filterContainer, { borderBottomColor: colors.filterBorder }]}>\n <TextInput\n value={filterQuery}\n onChangeText={setFilterQuery}\n placeholder={filterPlaceholder}\n placeholderTextColor={colors.placeholder}\n style={[styles.filterInput, {\n borderColor: colors.filterBorder,\n backgroundColor: colors.filterBg,\n color: colors.filterText,\n },\n // Every other input in this library names its own edge and\n // direction from the reader's language. Leaving these unset let the\n // platform decide, so the field followed the process layout\n // direction instead of the person reading it.\n isRTL ? styles.filterRtl : styles.filterLtr]}\n /* ⛔ THE ANCHORED PANEL KEEPS ITS AUTOFOCUS — changing it would\n change behaviour for every consumer that has not opted in. In\n the popup the list is already the whole point and is fully\n visible, so the keyboard waits to be asked for: one tap on the\n field raises it, and until then the list has the whole sheet. */\n autoFocus={autoFocusFilter}\n />\n </View>\n )}\n <FlatList\n style={fill ? styles.listFill : styles.listShrink}\n contentContainerStyle={styles.listContent}\n data={filteredData}\n keyExtractor={(item: any, i: number) =>\n item?.__group ? `group-${i}` : `item-${i}`\n }\n renderItem={({ item, index }) => renderItem(item, index)}\n keyboardShouldPersistTaps=\"handled\"\n showsHorizontalScrollIndicator={false}\n ListEmptyComponent={\n filterQuery ? (\n <View style={styles.emptyContainer}>\n <Text style={[styles.emptyText, { color: colors.emptyText }]}>{emptyFilterMessage}</Text>\n </View>\n ) : null\n }\n />\n {panelFooterTemplate?.()}\n </>\n );\n\n /* ---------------------------------------------\n Render\n ---------------------------------------------- */\n\n const usePopup = popup && typeof renderPopup === 'function';\n\n return (\n <View style={styles.container} testID={testID}>\n <Pressable\n ref={triggerRef as any}\n style={[\n styles.control,\n { borderColor: colors.border, backgroundColor: colors.bg },\n invalid && { borderColor: colors.borderInvalid },\n disabled && styles.disabled,\n externalViewStyle,\n ]}\n onPress={toggle}\n >\n {editable ? (\n <Input style={styles.input}>\n <InputField\n ref={inputRef}\n value={inputText}\n onChangeText={setInputText}\n placeholder={placeholder}\n editable={!disabled}\n />\n </Input>\n ) : (\n <Text\n numberOfLines={1}\n style={[\n // Fill the trigger row and left-align the value/placeholder so it\n // doesn't read as centred (the row is justify=space-between, so the\n // arrow stays pinned right).\n { flex: 1, textAlign: \"left\" as const },\n displayValue ? { color: colors.text } : { color: colors.placeholder },\n externalTextStyle,\n !displayValue && { color: colors.placeholder },\n ]}>\n {displayValue || placeholder}\n </Text>\n )}\n\n <Text style={[{ color: colors.text }, externalTextStyle]}>▾</Text>\n </Pressable>\n\n {!usePopup && !isModal && (\n <Modal\n visible={open && !!triggerLayout}\n transparent\n animationType=\"none\"\n onRequestClose={close}\n >\n <Pressable style={styles.popoverOverlay} onPress={close}>\n {triggerLayout && (() => {\n const screen = Dimensions.get('window');\n const { top, maxHeight } = computePanelGeometry({\n screenHeight: screen.height,\n insetTop: insets.top,\n insetBottom: insets.bottom,\n keyboardHeight,\n triggerY: triggerLayout.y,\n triggerHeight: triggerLayout.height,\n });\n\n return (\n <View\n style={[\n styles.popoverPanel,\n {\n top,\n left: triggerLayout.x,\n width: triggerLayout.width,\n maxHeight,\n borderColor: colors.border,\n backgroundColor: colors.bg,\n },\n ]}\n onStartShouldSetResponder={() => true}\n >\n {panelBody(false, true)}\n </View>\n );\n })()}\n </Pressable>\n </Modal>\n )}\n\n {!usePopup && isModal && (\n <Modal visible={open} transparent animationType=\"fade\">\n <Pressable style={styles.modalOverlay} onPress={close}>\n <View\n style={[styles.modalPanel, { backgroundColor: colors.bg }]}\n onStartShouldSetResponder={() => true}\n >\n {panelBody(true, true)}\n </View>\n </Pressable>\n </Modal>\n )}\n\n {/* Popup — the container comes from the wrapper (this library's own\n Dialog in sheet position); everything inside it is the same body the\n other two containers render. */}\n {usePopup && renderPopup!({\n visible: open,\n onClose: close,\n title: popupTitle,\n children: panelBody(true, false),\n })}\n\n </View>\n );\n}\n\n/* ---------------------------------------------\n Styles (layout only — colors applied inline via theme tokens)\n---------------------------------------------- */\n\nconst styles = StyleSheet.create({\n container: {\n width: \"100%\",\n position: \"relative\" as const,\n },\n control: {\n flexDirection: \"row\" as const,\n alignItems: \"center\" as const,\n justifyContent: \"space-between\" as const,\n borderWidth: 1,\n borderRadius: 6,\n paddingHorizontal: 10,\n paddingVertical: 10,\n },\n disabled: {\n opacity: 0.5,\n },\n option: {\n paddingHorizontal: 12,\n paddingVertical: 10,\n flexDirection: \"row\" as const,\n justifyContent: \"space-between\" as const,\n alignItems: \"center\" as const,\n },\n groupLabel: {\n paddingHorizontal: 12,\n paddingVertical: 8,\n fontWeight: \"600\" as const,\n },\n input: {\n flex: 1,\n },\n panel: {\n position: \"absolute\" as const,\n top: \"100%\",\n left: 0,\n right: 0,\n marginTop: 4,\n borderWidth: 1,\n borderRadius: 6,\n maxHeight: 260,\n overflow: \"hidden\" as const,\n zIndex: 9999,\n },\n filterContainer: {\n paddingHorizontal: 8,\n paddingVertical: 6,\n borderBottomWidth: 1,\n },\n listFill: {\n flex: 1,\n },\n // The anchored panel is sized by `maxHeight` with no height, so the list has\n // to grow with its content up to that ceiling and then scroll inside it.\n // `flex: 1` sets flexBasis 0, which contributes nothing to a shrink-wrapping\n // parent.\n listShrink: {\n flexGrow: 0,\n flexShrink: 1,\n },\n listContent: {\n paddingBottom: 12,\n },\n filterInput: {\n fontSize: 14,\n paddingHorizontal: 8,\n paddingVertical: 6,\n borderWidth: 1,\n borderRadius: 4,\n },\n filterLtr: {\n textAlign: 'left' as const,\n writingDirection: 'ltr' as const,\n },\n filterRtl: {\n textAlign: 'right' as const,\n writingDirection: 'rtl' as const,\n },\n emptyContainer: {\n padding: 16,\n alignItems: 'center' as const,\n },\n emptyText: {\n fontSize: 14,\n },\n popoverOverlay: {\n flex: 1,\n backgroundColor: 'transparent',\n },\n popoverPanel: {\n position: 'absolute' as const,\n borderWidth: 1,\n borderRadius: 6,\n overflow: 'hidden' as const,\n elevation: 8,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.15,\n shadowRadius: 8,\n },\n modalOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.4)',\n justifyContent: 'center' as const,\n },\n modalPanel: {\n margin: 24,\n maxHeight: '70%',\n borderRadius: 12,\n overflow: 'hidden' as const,\n },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFieldLogic.cjs","sources":["../../../../src/form-renderer/hooks/useFieldLogic.ts"],"sourcesContent":["import {useCallback, useEffect, useMemo, useRef} from 'react';\nimport {type FieldValues, useController, useFormContext, type UseFormReturn} from 'react-hook-form';\nimport {Schema} from 'yup';\n\n// Assuming your types are consolidated in a central file.\nimport type {\n IElementStyle,\n IFormElement,\n ILabelElement,\n ITextFieldProps,\n LogicFunction,\n UseFieldLogicProps,\n UseFieldLogicReturn\n} from '@lmb-it/kitsconcerto-types';\nimport {dynamicList} from \"../utils\";\nimport _ from \"lodash\";\n\n// --- Hook Return Value ---\n\n/**\n * The core logic engine for an individual form field.\n * This hook replaces LogicContext and FormFieldContext. It watches dependencies,\n * calculates all dynamic properties (visibility, disabled state, required status, etc.),\n * and provides the necessary props from react-hook-form.\n *\n * @param {UseFieldLogicProps<T>} props - The element definition and form control.\n * @returns {UseFieldLogicReturn<T>} An object containing all necessary props and states for rendering the field.\n */\nexport const useFieldLogic = <T extends FieldValues>({\n element: {onDepsChange, ...element},\n control,\n getValues,\n isFocused,\n groupField,\n watchedValues\n }: UseFieldLogicProps<T>): UseFieldLogicReturn<T> => {\n\n\n const formContext = useFormContext<T>()\n\n const prevDepsRef = useRef<string>(\"\");\n\n const watchedSig = useMemo(() => JSON.stringify(watchedValues), [watchedValues]);\n\n const allFormValues = useMemo(() => getValues(), [getValues, watchedSig]);\n\n /*const watchedObject = useMemo(() => {\n return dependencies.reduce((acc, dep, index) => {\n acc[dep] = watchedValues[index];\n return acc;\n }, {} as any)\n }, [watchedValues, dependencies])*/\n\n const childElements = useMemo(() => {\n if (!('elements' in element)) {\n return [];\n }\n const elements = element.elements;\n if (typeof elements === 'function') {\n return (elements as LogicFunction<T>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return elements;\n }, [watchedValues])\n\n const resolvedProps = useMemo(() => {\n const getDynamicProp = (propName: keyof IFormElement<T> | string) => {\n const propValue: LogicFunction<T> = (element as any)[propName];\n if (typeof propValue === 'function') {\n return propValue(watchedValues, allFormValues, formContext, groupField);\n }\n return propValue;\n };\n\n return {\n helperText: getDynamicProp('helperText'),\n leftAddon: getDynamicProp('leftAddon'),\n rightAddon: getDynamicProp('rightAddon'),\n keyFilter: getDynamicProp('keyFilter') as ITextFieldProps<T>['keyFilter'],\n withMask: getDynamicProp('withMask'),\n // ... resolve other dynamic props here\n };\n }, [watchedValues, allFormValues, element, control, getValues]);\n\n const lastListRef = useRef<T[] | undefined>(undefined);\n const lastElementRef = useRef<any>(null);\n const lastWatchedRef = useRef<any>(null);\n\n const list = useMemo(() => {\n if (!(\"list\" in element)) return undefined;\n\n const elementChanged = !_.isEqual(lastElementRef.current, element);\n const watchedChanged = !_.isEqual(lastWatchedRef.current, watchedValues);\n\n // ✅ nothing meaningful changed → reuse\n if (!elementChanged && !watchedChanged) {\n return lastListRef.current;\n }\n\n // 🔁 rebuild\n const nextList = dynamicList<T>(\n element,\n watchedValues,\n allFormValues,\n groupField,\n formContext\n );\n\n lastElementRef.current = element;\n lastWatchedRef.current = watchedValues;\n lastListRef.current = nextList;\n\n return nextList;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n // 4. Centralize dynamic property calculations using memoization.\n const isShown = useMemo(() => {\n // console.log({watchedObject, allFormValues})\n const showLogic = element.show || element.logic?.show;\n if (typeof showLogic === 'function') {\n return (showLogic as LogicFunction<T>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return true;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const isDisabled = useMemo(() => {\n const disableLogic = element.isDisabled || element.logic?.disable;\n if (typeof disableLogic === 'function') {\n return (disableLogic as LogicFunction<T, boolean>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return !!disableLogic;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const isRequired = useMemo(() => {\n if (!('schema' in element) || !element.schema) return false;\n\n const schema = element.schema as Schema<any>;\n\n const checkRequired = (schema: Schema<any>, parentValues: any): boolean => {\n try {\n const type = (schema as any)._type;\n\n const testValue = (() => {\n switch (type) {\n case 'array':\n return [];\n case 'object':\n return {};\n case 'boolean':\n return undefined;\n case 'number':\n return undefined;\n case 'date':\n return undefined;\n default:\n return ''; // string or unknown\n }\n })();\n // Try validating an empty string\n schema.validateSync(\n testValue, // simulating the field is empty\n {\n context: parentValues,\n // @ts-ignore\n parent: parentValues,\n abortEarly: false,\n }\n );\n\n return false; // Passed even when empty => not required\n } catch (err: any) {\n // if (element.id === 'count/ries') {\n // console.log(err.inner || err);\n // }\n\n if (err?.inner?.length) {\n return err.inner.some(\n (e: any) =>\n e.type === 'required' ||\n e.message?.toLowerCase().includes('required')\n );\n }\n\n return (\n err?.type === 'required' ||\n err?.message?.toLowerCase().includes('required')\n );\n }\n };\n\n // Get the parent object (either group or full form)\n const parent = groupField && groupField.index !== undefined\n ? getValues?.()?.[groupField.name]?.[groupField.index]\n : getValues?.();\n\n return checkRequired(schema, parent);\n }, [element, watchedValues, allFormValues]);\n\n const label = useMemo(() => {\n if (typeof element.label === 'function') {\n return (element.label as LogicFunction<T, ILabelElement>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return element.label;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const placeholder = useMemo(() => {\n if ('placeholder' in element && typeof element.placeholder === 'function') {\n return (element.placeholder as LogicFunction<T, string>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return ('placeholder' in element ? element.placeholder : undefined) as string | undefined;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const resolvedStyle = useMemo(() => {\n const s = 'style' in element ? element.style : undefined;\n\n if (s && typeof s === 'function') {\n return s(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return s;\n }, [watchedValues, allFormValues, control, getValues, element])\n\n // ─────────────────────────────────────────────────────────────\n // Dev-mode deprecation warning for the legacy `style` prop.\n // Fires ONCE per field-instance mount (guarded by hasWarnedRef +\n // empty deps) so it does not re-fire on keystrokes / re-renders /\n // theme changes / etc. The bridge below remains functional —\n // this is a soft deprecation only; runtime removal is deferred\n // to the next major version.\n // ─────────────────────────────────────────────────────────────\n const hasWarnedDeprecatedStyleRef = useRef(false);\n useEffect(() => {\n // `process` is undeclared on native (no @types/node) but the\n // bundler statically replaces it on both platforms in production\n // builds. Reading it via globalThis sidesteps the TS lookup\n // without changing the runtime behaviour.\n const nodeEnv = (globalThis as any)?.process?.env?.NODE_ENV;\n if (nodeEnv === 'production') return;\n if (hasWarnedDeprecatedStyleRef.current) return;\n if (!('style' in element) || (element as any).style === undefined) return;\n\n hasWarnedDeprecatedStyleRef.current = true;\n // eslint-disable-next-line no-console\n console.warn(\n `[KitsConcerto] Field \"${(element as any).id}\": the \"style\" prop is deprecated. ` +\n `Use \"slots\" instead. Migration: ` +\n `style.input → slots.root.style, ` +\n `style.container → slots.container.style, ` +\n `style.label → slots.label.style, ` +\n `style.helperText → slots.helperText.style, ` +\n `style.errorMessage → slots.error.style. ` +\n `This prop will be removed in the next major version.`\n );\n // Empty deps: warn once on mount only — element identity may\n // change every render (form re-constructs configs), so we\n // cannot key on it without re-firing the warning.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n /**\n * Merge explicit `slots` with `style` sub-keys.\n * IElementStyle sub-keys are bridged into the slot system so they\n * flow through useComponentDefaults → elementStyles → KitsContainer.\n * Priority: style sub-keys (lowest) < explicit slots (highest).\n */\n const slots = useMemo(() => {\n // 1. Resolve explicit slots (DynamicValue)\n const rawSlots = 'slots' in element ? element.slots : undefined;\n let explicitSlots: Record<string, { props?: any; style?: any }> | undefined;\n if (rawSlots && typeof rawSlots === 'function') {\n explicitSlots = (rawSlots as any)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n } else {\n explicitSlots = rawSlots as any;\n }\n\n // 2. Bridge IElementStyle sub-keys into slot format\n if (!resolvedStyle && !explicitSlots) return undefined;\n if (!resolvedStyle) return explicitSlots;\n\n const STYLE_TO_SLOT: Record<string, string> = {\n input: 'root',\n container: 'container',\n label: 'label',\n helperText: 'helperText',\n errorMessage: 'error',\n };\n\n const result: Record<string, { props?: any; style?: any }> = {};\n\n // First layer: style sub-keys (lower priority)\n for (const [styleKey, slotKey] of Object.entries(STYLE_TO_SLOT)) {\n const val = (resolvedStyle as any)[styleKey];\n if (val) {\n result[slotKey] = { style: val };\n }\n }\n\n // Second layer: explicit slots override\n if (explicitSlots) {\n for (const [key, slot] of Object.entries(explicitSlots)) {\n if (!result[key]) {\n result[key] = slot;\n } else {\n result[key] = {\n ...slot,\n style: { ...result[key].style, ...(slot.style || {}) },\n };\n }\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n }, [watchedValues, allFormValues, control, getValues, element, resolvedStyle])\n\n // 6. Calculate layout properties.\n const layout = useMemo(() => {\n const getDynamicProp = (prop: any) => typeof prop === 'function'\n ? prop(watchedValues, allFormValues, {control, getValues})\n : prop;\n\n return {\n colSpan: getDynamicProp(element.logic?.colSpan ?? element.colSpan) ?? 12,\n rowSpan: getDynamicProp(element.rowSpan),\n columnGap: getDynamicProp(element.columnGap),\n rowGap: getDynamicProp(element.rowGap),\n colOffset: getDynamicProp(element.colOffset),\n area: getDynamicProp(element.area),\n };\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n\n const onWatchedValuesChange = useCallback(() => {\n if (onDepsChange) {\n onDepsChange(watchedValues, allFormValues, formContext as UseFormReturn<T>, groupField)\n }\n }, [watchedValues])\n\n // 7. Get the field's state and methods from react-hook-form.\n // For Object elements, default to {} so react-hook-form treats the field\n // as a nested object — children register with dot-notation paths\n // (e.g. contactPhone.phoneNumber) and build the nested structure.\n const isObjectElement = element.type === 'Object';\n const {field, fieldState} = useController({\n name: element.id as any,\n control,\n shouldUnregister: !isShown,\n ...(isObjectElement ? {defaultValue: {} as any} : {}),\n });\n\n useEffect(() => {\n if (!onDepsChange) return;\n\n // Create a stable signature for watched values\n // (stringify is fine here because deps lists are small)\n const sig = JSON.stringify(watchedValues);\n\n if (sig === prevDepsRef.current) return; // ✅ no real change\n\n prevDepsRef.current = sig;\n\n onDepsChange(watchedValues, allFormValues, formContext as UseFormReturn<T>, groupField);\n }, [onDepsChange, watchedValues, allFormValues, formContext, groupField]);\n\n // 8. Return a single, clean object for the UI component.\n return {\n field: {\n ...field,\n onChange: (event) => {\n if ('onChangeValue' in element && element?.onChangeValue) {\n const value = event != null && typeof event === 'object' && 'target' in event\n ? event.target.value\n : event;\n element.onChangeValue(\n value,\n {...fieldState, isFocused: !!isFocused},\n formContext\n )\n }\n field.onChange(event)\n }\n },\n fieldState,\n watchedValues,\n onWatchedValuesChange,\n elements: childElements,\n isShown,\n isDisabled,\n isRequired,\n hideError: element.hideError,\n label,\n placeholder,\n formContext,\n layout,\n list,\n style: resolvedStyle as IElementStyle,\n slots,\n ...resolvedProps,\n localProps: 'localProps' in element ? element?.localProps : undefined,\n attached: element.attached,\n animation: element.animation,\n };\n }\n;\n"],"names":["useFormContext","useRef","useMemo","dynamicList","schema","useEffect","useCallback","useController"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useFieldLogic.cjs","sources":["../../../../src/form-renderer/hooks/useFieldLogic.ts"],"sourcesContent":["import {useCallback, useEffect, useMemo, useRef} from 'react';\nimport {type FieldValues, useController, useFormContext, type UseFormReturn} from 'react-hook-form';\nimport {Schema} from 'yup';\n\n// Assuming your types are consolidated in a central file.\nimport type {\n IElementStyle,\n IFormElement,\n ILabelElement,\n ITextFieldProps,\n LogicFunction,\n UseFieldLogicProps,\n UseFieldLogicReturn\n} from '@lmb-it/kitsconcerto-types';\nimport {dynamicList} from \"../utils\";\nimport _ from \"lodash\";\n\n// --- Hook Return Value ---\n\n/**\n * The core logic engine for an individual form field.\n * This hook replaces LogicContext and FormFieldContext. It watches dependencies,\n * calculates all dynamic properties (visibility, disabled state, required status, etc.),\n * and provides the necessary props from react-hook-form.\n *\n * @param {UseFieldLogicProps<T>} props - The element definition and form control.\n * @returns {UseFieldLogicReturn<T>} An object containing all necessary props and states for rendering the field.\n */\nexport const useFieldLogic = <T extends FieldValues>({\n element: {onDepsChange, ...element},\n control,\n getValues,\n isFocused,\n groupField,\n watchedValues\n }: UseFieldLogicProps<T>): UseFieldLogicReturn<T> => {\n\n\n const formContext = useFormContext<T>()\n\n const prevDepsRef = useRef<string>(\"\");\n\n const watchedSig = useMemo(() => JSON.stringify(watchedValues), [watchedValues]);\n\n const allFormValues = useMemo(() => getValues(), [getValues, watchedSig]);\n\n /*const watchedObject = useMemo(() => {\n return dependencies.reduce((acc, dep, index) => {\n acc[dep] = watchedValues[index];\n return acc;\n }, {} as any)\n }, [watchedValues, dependencies])*/\n\n const childElements = useMemo(() => {\n if (!('elements' in element)) {\n return [];\n }\n const elements = element.elements;\n if (typeof elements === 'function') {\n return (elements as LogicFunction<T>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return elements;\n /*\n * ⛔ `element` BELONGS HERE BECAUSE THE BODY READS IT. Without it this\n * memo returns the children captured on the FIRST render and never\n * looks at `element` again — so a container (Object, Group) freezes\n * its whole subtree at mount.\n *\n * What that cost: AlphaMatch's profile screen mounts with\n * `list: []` and is handed 250 nationalities about a second later.\n * The parent rebuilds its element array, the new array reaches the\n * container, and this memo hands the children the OLD one. The\n * device log says `items=250` and the picker draws nothing —\n * because the picker was still holding the empty list.\n *\n * ⚠️ A top-level Select never showed this. It is not a container, so\n * it does not come through here at all; its props are resolved per\n * render. Only a field nested in an Object or a Group was affected,\n * which is why a harness that put the Select at the top level\n * reported the case clear.\n */\n }, [element, watchedValues])\n\n const resolvedProps = useMemo(() => {\n const getDynamicProp = (propName: keyof IFormElement<T> | string) => {\n const propValue: LogicFunction<T> = (element as any)[propName];\n if (typeof propValue === 'function') {\n return propValue(watchedValues, allFormValues, formContext, groupField);\n }\n return propValue;\n };\n\n return {\n helperText: getDynamicProp('helperText'),\n leftAddon: getDynamicProp('leftAddon'),\n rightAddon: getDynamicProp('rightAddon'),\n keyFilter: getDynamicProp('keyFilter') as ITextFieldProps<T>['keyFilter'],\n withMask: getDynamicProp('withMask'),\n // ... resolve other dynamic props here\n };\n }, [watchedValues, allFormValues, element, control, getValues]);\n\n const lastListRef = useRef<T[] | undefined>(undefined);\n const lastElementRef = useRef<any>(null);\n const lastWatchedRef = useRef<any>(null);\n\n const list = useMemo(() => {\n if (!(\"list\" in element)) return undefined;\n\n const elementChanged = !_.isEqual(lastElementRef.current, element);\n const watchedChanged = !_.isEqual(lastWatchedRef.current, watchedValues);\n\n // ✅ nothing meaningful changed → reuse\n if (!elementChanged && !watchedChanged) {\n return lastListRef.current;\n }\n\n // 🔁 rebuild\n const nextList = dynamicList<T>(\n element,\n watchedValues,\n allFormValues,\n groupField,\n formContext\n );\n\n lastElementRef.current = element;\n lastWatchedRef.current = watchedValues;\n lastListRef.current = nextList;\n\n return nextList;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n // 4. Centralize dynamic property calculations using memoization.\n const isShown = useMemo(() => {\n // console.log({watchedObject, allFormValues})\n const showLogic = element.show || element.logic?.show;\n if (typeof showLogic === 'function') {\n return (showLogic as LogicFunction<T>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return true;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const isDisabled = useMemo(() => {\n const disableLogic = element.isDisabled || element.logic?.disable;\n if (typeof disableLogic === 'function') {\n return (disableLogic as LogicFunction<T, boolean>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return !!disableLogic;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const isRequired = useMemo(() => {\n if (!('schema' in element) || !element.schema) return false;\n\n const schema = element.schema as Schema<any>;\n\n const checkRequired = (schema: Schema<any>, parentValues: any): boolean => {\n try {\n const type = (schema as any)._type;\n\n const testValue = (() => {\n switch (type) {\n case 'array':\n return [];\n case 'object':\n return {};\n case 'boolean':\n return undefined;\n case 'number':\n return undefined;\n case 'date':\n return undefined;\n default:\n return ''; // string or unknown\n }\n })();\n // Try validating an empty string\n schema.validateSync(\n testValue, // simulating the field is empty\n {\n context: parentValues,\n // @ts-ignore\n parent: parentValues,\n abortEarly: false,\n }\n );\n\n return false; // Passed even when empty => not required\n } catch (err: any) {\n // if (element.id === 'count/ries') {\n // console.log(err.inner || err);\n // }\n\n if (err?.inner?.length) {\n return err.inner.some(\n (e: any) =>\n e.type === 'required' ||\n e.message?.toLowerCase().includes('required')\n );\n }\n\n return (\n err?.type === 'required' ||\n err?.message?.toLowerCase().includes('required')\n );\n }\n };\n\n // Get the parent object (either group or full form)\n const parent = groupField && groupField.index !== undefined\n ? getValues?.()?.[groupField.name]?.[groupField.index]\n : getValues?.();\n\n return checkRequired(schema, parent);\n }, [element, watchedValues, allFormValues]);\n\n const label = useMemo(() => {\n if (typeof element.label === 'function') {\n return (element.label as LogicFunction<T, ILabelElement>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return element.label;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const placeholder = useMemo(() => {\n if ('placeholder' in element && typeof element.placeholder === 'function') {\n return (element.placeholder as LogicFunction<T, string>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return ('placeholder' in element ? element.placeholder : undefined) as string | undefined;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const resolvedStyle = useMemo(() => {\n const s = 'style' in element ? element.style : undefined;\n\n if (s && typeof s === 'function') {\n return s(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return s;\n }, [watchedValues, allFormValues, control, getValues, element])\n\n // ─────────────────────────────────────────────────────────────\n // Dev-mode deprecation warning for the legacy `style` prop.\n // Fires ONCE per field-instance mount (guarded by hasWarnedRef +\n // empty deps) so it does not re-fire on keystrokes / re-renders /\n // theme changes / etc. The bridge below remains functional —\n // this is a soft deprecation only; runtime removal is deferred\n // to the next major version.\n // ─────────────────────────────────────────────────────────────\n const hasWarnedDeprecatedStyleRef = useRef(false);\n useEffect(() => {\n // `process` is undeclared on native (no @types/node) but the\n // bundler statically replaces it on both platforms in production\n // builds. Reading it via globalThis sidesteps the TS lookup\n // without changing the runtime behaviour.\n const nodeEnv = (globalThis as any)?.process?.env?.NODE_ENV;\n if (nodeEnv === 'production') return;\n if (hasWarnedDeprecatedStyleRef.current) return;\n if (!('style' in element) || (element as any).style === undefined) return;\n\n hasWarnedDeprecatedStyleRef.current = true;\n // eslint-disable-next-line no-console\n console.warn(\n `[KitsConcerto] Field \"${(element as any).id}\": the \"style\" prop is deprecated. ` +\n `Use \"slots\" instead. Migration: ` +\n `style.input → slots.root.style, ` +\n `style.container → slots.container.style, ` +\n `style.label → slots.label.style, ` +\n `style.helperText → slots.helperText.style, ` +\n `style.errorMessage → slots.error.style. ` +\n `This prop will be removed in the next major version.`\n );\n // Empty deps: warn once on mount only — element identity may\n // change every render (form re-constructs configs), so we\n // cannot key on it without re-firing the warning.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n /**\n * Merge explicit `slots` with `style` sub-keys.\n * IElementStyle sub-keys are bridged into the slot system so they\n * flow through useComponentDefaults → elementStyles → KitsContainer.\n * Priority: style sub-keys (lowest) < explicit slots (highest).\n */\n const slots = useMemo(() => {\n // 1. Resolve explicit slots (DynamicValue)\n const rawSlots = 'slots' in element ? element.slots : undefined;\n let explicitSlots: Record<string, { props?: any; style?: any }> | undefined;\n if (rawSlots && typeof rawSlots === 'function') {\n explicitSlots = (rawSlots as any)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n } else {\n explicitSlots = rawSlots as any;\n }\n\n // 2. Bridge IElementStyle sub-keys into slot format\n if (!resolvedStyle && !explicitSlots) return undefined;\n if (!resolvedStyle) return explicitSlots;\n\n const STYLE_TO_SLOT: Record<string, string> = {\n input: 'root',\n container: 'container',\n label: 'label',\n helperText: 'helperText',\n errorMessage: 'error',\n };\n\n const result: Record<string, { props?: any; style?: any }> = {};\n\n // First layer: style sub-keys (lower priority)\n for (const [styleKey, slotKey] of Object.entries(STYLE_TO_SLOT)) {\n const val = (resolvedStyle as any)[styleKey];\n if (val) {\n result[slotKey] = { style: val };\n }\n }\n\n // Second layer: explicit slots override\n if (explicitSlots) {\n for (const [key, slot] of Object.entries(explicitSlots)) {\n if (!result[key]) {\n result[key] = slot;\n } else {\n result[key] = {\n ...slot,\n style: { ...result[key].style, ...(slot.style || {}) },\n };\n }\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n }, [watchedValues, allFormValues, control, getValues, element, resolvedStyle])\n\n // 6. Calculate layout properties.\n const layout = useMemo(() => {\n const getDynamicProp = (prop: any) => typeof prop === 'function'\n ? prop(watchedValues, allFormValues, {control, getValues})\n : prop;\n\n return {\n colSpan: getDynamicProp(element.logic?.colSpan ?? element.colSpan) ?? 12,\n rowSpan: getDynamicProp(element.rowSpan),\n columnGap: getDynamicProp(element.columnGap),\n rowGap: getDynamicProp(element.rowGap),\n colOffset: getDynamicProp(element.colOffset),\n area: getDynamicProp(element.area),\n };\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n\n const onWatchedValuesChange = useCallback(() => {\n if (onDepsChange) {\n onDepsChange(watchedValues, allFormValues, formContext as UseFormReturn<T>, groupField)\n }\n }, [watchedValues])\n\n // 7. Get the field's state and methods from react-hook-form.\n // For Object elements, default to {} so react-hook-form treats the field\n // as a nested object — children register with dot-notation paths\n // (e.g. contactPhone.phoneNumber) and build the nested structure.\n const isObjectElement = element.type === 'Object';\n const {field, fieldState} = useController({\n name: element.id as any,\n control,\n shouldUnregister: !isShown,\n ...(isObjectElement ? {defaultValue: {} as any} : {}),\n });\n\n useEffect(() => {\n if (!onDepsChange) return;\n\n // Create a stable signature for watched values\n // (stringify is fine here because deps lists are small)\n const sig = JSON.stringify(watchedValues);\n\n if (sig === prevDepsRef.current) return; // ✅ no real change\n\n prevDepsRef.current = sig;\n\n onDepsChange(watchedValues, allFormValues, formContext as UseFormReturn<T>, groupField);\n }, [onDepsChange, watchedValues, allFormValues, formContext, groupField]);\n\n // 8. Return a single, clean object for the UI component.\n return {\n field: {\n ...field,\n onChange: (event) => {\n if ('onChangeValue' in element && element?.onChangeValue) {\n const value = event != null && typeof event === 'object' && 'target' in event\n ? event.target.value\n : event;\n element.onChangeValue(\n value,\n {...fieldState, isFocused: !!isFocused},\n formContext\n )\n }\n field.onChange(event)\n }\n },\n fieldState,\n watchedValues,\n onWatchedValuesChange,\n elements: childElements,\n isShown,\n isDisabled,\n isRequired,\n hideError: element.hideError,\n label,\n placeholder,\n formContext,\n layout,\n list,\n style: resolvedStyle as IElementStyle,\n slots,\n ...resolvedProps,\n localProps: 'localProps' in element ? element?.localProps : undefined,\n attached: element.attached,\n animation: element.animation,\n };\n }\n;\n"],"names":["useFormContext","useRef","useMemo","dynamicList","schema","useEffect","useCallback","useController"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFieldLogic.js","sources":["../../../../src/form-renderer/hooks/useFieldLogic.ts"],"sourcesContent":["import {useCallback, useEffect, useMemo, useRef} from 'react';\nimport {type FieldValues, useController, useFormContext, type UseFormReturn} from 'react-hook-form';\nimport {Schema} from 'yup';\n\n// Assuming your types are consolidated in a central file.\nimport type {\n IElementStyle,\n IFormElement,\n ILabelElement,\n ITextFieldProps,\n LogicFunction,\n UseFieldLogicProps,\n UseFieldLogicReturn\n} from '@lmb-it/kitsconcerto-types';\nimport {dynamicList} from \"../utils\";\nimport _ from \"lodash\";\n\n// --- Hook Return Value ---\n\n/**\n * The core logic engine for an individual form field.\n * This hook replaces LogicContext and FormFieldContext. It watches dependencies,\n * calculates all dynamic properties (visibility, disabled state, required status, etc.),\n * and provides the necessary props from react-hook-form.\n *\n * @param {UseFieldLogicProps<T>} props - The element definition and form control.\n * @returns {UseFieldLogicReturn<T>} An object containing all necessary props and states for rendering the field.\n */\nexport const useFieldLogic = <T extends FieldValues>({\n element: {onDepsChange, ...element},\n control,\n getValues,\n isFocused,\n groupField,\n watchedValues\n }: UseFieldLogicProps<T>): UseFieldLogicReturn<T> => {\n\n\n const formContext = useFormContext<T>()\n\n const prevDepsRef = useRef<string>(\"\");\n\n const watchedSig = useMemo(() => JSON.stringify(watchedValues), [watchedValues]);\n\n const allFormValues = useMemo(() => getValues(), [getValues, watchedSig]);\n\n /*const watchedObject = useMemo(() => {\n return dependencies.reduce((acc, dep, index) => {\n acc[dep] = watchedValues[index];\n return acc;\n }, {} as any)\n }, [watchedValues, dependencies])*/\n\n const childElements = useMemo(() => {\n if (!('elements' in element)) {\n return [];\n }\n const elements = element.elements;\n if (typeof elements === 'function') {\n return (elements as LogicFunction<T>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return elements;\n }, [watchedValues])\n\n const resolvedProps = useMemo(() => {\n const getDynamicProp = (propName: keyof IFormElement<T> | string) => {\n const propValue: LogicFunction<T> = (element as any)[propName];\n if (typeof propValue === 'function') {\n return propValue(watchedValues, allFormValues, formContext, groupField);\n }\n return propValue;\n };\n\n return {\n helperText: getDynamicProp('helperText'),\n leftAddon: getDynamicProp('leftAddon'),\n rightAddon: getDynamicProp('rightAddon'),\n keyFilter: getDynamicProp('keyFilter') as ITextFieldProps<T>['keyFilter'],\n withMask: getDynamicProp('withMask'),\n // ... resolve other dynamic props here\n };\n }, [watchedValues, allFormValues, element, control, getValues]);\n\n const lastListRef = useRef<T[] | undefined>(undefined);\n const lastElementRef = useRef<any>(null);\n const lastWatchedRef = useRef<any>(null);\n\n const list = useMemo(() => {\n if (!(\"list\" in element)) return undefined;\n\n const elementChanged = !_.isEqual(lastElementRef.current, element);\n const watchedChanged = !_.isEqual(lastWatchedRef.current, watchedValues);\n\n // ✅ nothing meaningful changed → reuse\n if (!elementChanged && !watchedChanged) {\n return lastListRef.current;\n }\n\n // 🔁 rebuild\n const nextList = dynamicList<T>(\n element,\n watchedValues,\n allFormValues,\n groupField,\n formContext\n );\n\n lastElementRef.current = element;\n lastWatchedRef.current = watchedValues;\n lastListRef.current = nextList;\n\n return nextList;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n // 4. Centralize dynamic property calculations using memoization.\n const isShown = useMemo(() => {\n // console.log({watchedObject, allFormValues})\n const showLogic = element.show || element.logic?.show;\n if (typeof showLogic === 'function') {\n return (showLogic as LogicFunction<T>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return true;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const isDisabled = useMemo(() => {\n const disableLogic = element.isDisabled || element.logic?.disable;\n if (typeof disableLogic === 'function') {\n return (disableLogic as LogicFunction<T, boolean>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return !!disableLogic;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const isRequired = useMemo(() => {\n if (!('schema' in element) || !element.schema) return false;\n\n const schema = element.schema as Schema<any>;\n\n const checkRequired = (schema: Schema<any>, parentValues: any): boolean => {\n try {\n const type = (schema as any)._type;\n\n const testValue = (() => {\n switch (type) {\n case 'array':\n return [];\n case 'object':\n return {};\n case 'boolean':\n return undefined;\n case 'number':\n return undefined;\n case 'date':\n return undefined;\n default:\n return ''; // string or unknown\n }\n })();\n // Try validating an empty string\n schema.validateSync(\n testValue, // simulating the field is empty\n {\n context: parentValues,\n // @ts-ignore\n parent: parentValues,\n abortEarly: false,\n }\n );\n\n return false; // Passed even when empty => not required\n } catch (err: any) {\n // if (element.id === 'count/ries') {\n // console.log(err.inner || err);\n // }\n\n if (err?.inner?.length) {\n return err.inner.some(\n (e: any) =>\n e.type === 'required' ||\n e.message?.toLowerCase().includes('required')\n );\n }\n\n return (\n err?.type === 'required' ||\n err?.message?.toLowerCase().includes('required')\n );\n }\n };\n\n // Get the parent object (either group or full form)\n const parent = groupField && groupField.index !== undefined\n ? getValues?.()?.[groupField.name]?.[groupField.index]\n : getValues?.();\n\n return checkRequired(schema, parent);\n }, [element, watchedValues, allFormValues]);\n\n const label = useMemo(() => {\n if (typeof element.label === 'function') {\n return (element.label as LogicFunction<T, ILabelElement>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return element.label;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const placeholder = useMemo(() => {\n if ('placeholder' in element && typeof element.placeholder === 'function') {\n return (element.placeholder as LogicFunction<T, string>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return ('placeholder' in element ? element.placeholder : undefined) as string | undefined;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const resolvedStyle = useMemo(() => {\n const s = 'style' in element ? element.style : undefined;\n\n if (s && typeof s === 'function') {\n return s(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return s;\n }, [watchedValues, allFormValues, control, getValues, element])\n\n // ─────────────────────────────────────────────────────────────\n // Dev-mode deprecation warning for the legacy `style` prop.\n // Fires ONCE per field-instance mount (guarded by hasWarnedRef +\n // empty deps) so it does not re-fire on keystrokes / re-renders /\n // theme changes / etc. The bridge below remains functional —\n // this is a soft deprecation only; runtime removal is deferred\n // to the next major version.\n // ─────────────────────────────────────────────────────────────\n const hasWarnedDeprecatedStyleRef = useRef(false);\n useEffect(() => {\n // `process` is undeclared on native (no @types/node) but the\n // bundler statically replaces it on both platforms in production\n // builds. Reading it via globalThis sidesteps the TS lookup\n // without changing the runtime behaviour.\n const nodeEnv = (globalThis as any)?.process?.env?.NODE_ENV;\n if (nodeEnv === 'production') return;\n if (hasWarnedDeprecatedStyleRef.current) return;\n if (!('style' in element) || (element as any).style === undefined) return;\n\n hasWarnedDeprecatedStyleRef.current = true;\n // eslint-disable-next-line no-console\n console.warn(\n `[KitsConcerto] Field \"${(element as any).id}\": the \"style\" prop is deprecated. ` +\n `Use \"slots\" instead. Migration: ` +\n `style.input → slots.root.style, ` +\n `style.container → slots.container.style, ` +\n `style.label → slots.label.style, ` +\n `style.helperText → slots.helperText.style, ` +\n `style.errorMessage → slots.error.style. ` +\n `This prop will be removed in the next major version.`\n );\n // Empty deps: warn once on mount only — element identity may\n // change every render (form re-constructs configs), so we\n // cannot key on it without re-firing the warning.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n /**\n * Merge explicit `slots` with `style` sub-keys.\n * IElementStyle sub-keys are bridged into the slot system so they\n * flow through useComponentDefaults → elementStyles → KitsContainer.\n * Priority: style sub-keys (lowest) < explicit slots (highest).\n */\n const slots = useMemo(() => {\n // 1. Resolve explicit slots (DynamicValue)\n const rawSlots = 'slots' in element ? element.slots : undefined;\n let explicitSlots: Record<string, { props?: any; style?: any }> | undefined;\n if (rawSlots && typeof rawSlots === 'function') {\n explicitSlots = (rawSlots as any)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n } else {\n explicitSlots = rawSlots as any;\n }\n\n // 2. Bridge IElementStyle sub-keys into slot format\n if (!resolvedStyle && !explicitSlots) return undefined;\n if (!resolvedStyle) return explicitSlots;\n\n const STYLE_TO_SLOT: Record<string, string> = {\n input: 'root',\n container: 'container',\n label: 'label',\n helperText: 'helperText',\n errorMessage: 'error',\n };\n\n const result: Record<string, { props?: any; style?: any }> = {};\n\n // First layer: style sub-keys (lower priority)\n for (const [styleKey, slotKey] of Object.entries(STYLE_TO_SLOT)) {\n const val = (resolvedStyle as any)[styleKey];\n if (val) {\n result[slotKey] = { style: val };\n }\n }\n\n // Second layer: explicit slots override\n if (explicitSlots) {\n for (const [key, slot] of Object.entries(explicitSlots)) {\n if (!result[key]) {\n result[key] = slot;\n } else {\n result[key] = {\n ...slot,\n style: { ...result[key].style, ...(slot.style || {}) },\n };\n }\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n }, [watchedValues, allFormValues, control, getValues, element, resolvedStyle])\n\n // 6. Calculate layout properties.\n const layout = useMemo(() => {\n const getDynamicProp = (prop: any) => typeof prop === 'function'\n ? prop(watchedValues, allFormValues, {control, getValues})\n : prop;\n\n return {\n colSpan: getDynamicProp(element.logic?.colSpan ?? element.colSpan) ?? 12,\n rowSpan: getDynamicProp(element.rowSpan),\n columnGap: getDynamicProp(element.columnGap),\n rowGap: getDynamicProp(element.rowGap),\n colOffset: getDynamicProp(element.colOffset),\n area: getDynamicProp(element.area),\n };\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n\n const onWatchedValuesChange = useCallback(() => {\n if (onDepsChange) {\n onDepsChange(watchedValues, allFormValues, formContext as UseFormReturn<T>, groupField)\n }\n }, [watchedValues])\n\n // 7. Get the field's state and methods from react-hook-form.\n // For Object elements, default to {} so react-hook-form treats the field\n // as a nested object — children register with dot-notation paths\n // (e.g. contactPhone.phoneNumber) and build the nested structure.\n const isObjectElement = element.type === 'Object';\n const {field, fieldState} = useController({\n name: element.id as any,\n control,\n shouldUnregister: !isShown,\n ...(isObjectElement ? {defaultValue: {} as any} : {}),\n });\n\n useEffect(() => {\n if (!onDepsChange) return;\n\n // Create a stable signature for watched values\n // (stringify is fine here because deps lists are small)\n const sig = JSON.stringify(watchedValues);\n\n if (sig === prevDepsRef.current) return; // ✅ no real change\n\n prevDepsRef.current = sig;\n\n onDepsChange(watchedValues, allFormValues, formContext as UseFormReturn<T>, groupField);\n }, [onDepsChange, watchedValues, allFormValues, formContext, groupField]);\n\n // 8. Return a single, clean object for the UI component.\n return {\n field: {\n ...field,\n onChange: (event) => {\n if ('onChangeValue' in element && element?.onChangeValue) {\n const value = event != null && typeof event === 'object' && 'target' in event\n ? event.target.value\n : event;\n element.onChangeValue(\n value,\n {...fieldState, isFocused: !!isFocused},\n formContext\n )\n }\n field.onChange(event)\n }\n },\n fieldState,\n watchedValues,\n onWatchedValuesChange,\n elements: childElements,\n isShown,\n isDisabled,\n isRequired,\n hideError: element.hideError,\n label,\n placeholder,\n formContext,\n layout,\n list,\n style: resolvedStyle as IElementStyle,\n slots,\n ...resolvedProps,\n localProps: 'localProps' in element ? element?.localProps : undefined,\n attached: element.attached,\n animation: element.animation,\n };\n }\n;\n"],"names":["schema"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useFieldLogic.js","sources":["../../../../src/form-renderer/hooks/useFieldLogic.ts"],"sourcesContent":["import {useCallback, useEffect, useMemo, useRef} from 'react';\nimport {type FieldValues, useController, useFormContext, type UseFormReturn} from 'react-hook-form';\nimport {Schema} from 'yup';\n\n// Assuming your types are consolidated in a central file.\nimport type {\n IElementStyle,\n IFormElement,\n ILabelElement,\n ITextFieldProps,\n LogicFunction,\n UseFieldLogicProps,\n UseFieldLogicReturn\n} from '@lmb-it/kitsconcerto-types';\nimport {dynamicList} from \"../utils\";\nimport _ from \"lodash\";\n\n// --- Hook Return Value ---\n\n/**\n * The core logic engine for an individual form field.\n * This hook replaces LogicContext and FormFieldContext. It watches dependencies,\n * calculates all dynamic properties (visibility, disabled state, required status, etc.),\n * and provides the necessary props from react-hook-form.\n *\n * @param {UseFieldLogicProps<T>} props - The element definition and form control.\n * @returns {UseFieldLogicReturn<T>} An object containing all necessary props and states for rendering the field.\n */\nexport const useFieldLogic = <T extends FieldValues>({\n element: {onDepsChange, ...element},\n control,\n getValues,\n isFocused,\n groupField,\n watchedValues\n }: UseFieldLogicProps<T>): UseFieldLogicReturn<T> => {\n\n\n const formContext = useFormContext<T>()\n\n const prevDepsRef = useRef<string>(\"\");\n\n const watchedSig = useMemo(() => JSON.stringify(watchedValues), [watchedValues]);\n\n const allFormValues = useMemo(() => getValues(), [getValues, watchedSig]);\n\n /*const watchedObject = useMemo(() => {\n return dependencies.reduce((acc, dep, index) => {\n acc[dep] = watchedValues[index];\n return acc;\n }, {} as any)\n }, [watchedValues, dependencies])*/\n\n const childElements = useMemo(() => {\n if (!('elements' in element)) {\n return [];\n }\n const elements = element.elements;\n if (typeof elements === 'function') {\n return (elements as LogicFunction<T>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return elements;\n /*\n * ⛔ `element` BELONGS HERE BECAUSE THE BODY READS IT. Without it this\n * memo returns the children captured on the FIRST render and never\n * looks at `element` again — so a container (Object, Group) freezes\n * its whole subtree at mount.\n *\n * What that cost: AlphaMatch's profile screen mounts with\n * `list: []` and is handed 250 nationalities about a second later.\n * The parent rebuilds its element array, the new array reaches the\n * container, and this memo hands the children the OLD one. The\n * device log says `items=250` and the picker draws nothing —\n * because the picker was still holding the empty list.\n *\n * ⚠️ A top-level Select never showed this. It is not a container, so\n * it does not come through here at all; its props are resolved per\n * render. Only a field nested in an Object or a Group was affected,\n * which is why a harness that put the Select at the top level\n * reported the case clear.\n */\n }, [element, watchedValues])\n\n const resolvedProps = useMemo(() => {\n const getDynamicProp = (propName: keyof IFormElement<T> | string) => {\n const propValue: LogicFunction<T> = (element as any)[propName];\n if (typeof propValue === 'function') {\n return propValue(watchedValues, allFormValues, formContext, groupField);\n }\n return propValue;\n };\n\n return {\n helperText: getDynamicProp('helperText'),\n leftAddon: getDynamicProp('leftAddon'),\n rightAddon: getDynamicProp('rightAddon'),\n keyFilter: getDynamicProp('keyFilter') as ITextFieldProps<T>['keyFilter'],\n withMask: getDynamicProp('withMask'),\n // ... resolve other dynamic props here\n };\n }, [watchedValues, allFormValues, element, control, getValues]);\n\n const lastListRef = useRef<T[] | undefined>(undefined);\n const lastElementRef = useRef<any>(null);\n const lastWatchedRef = useRef<any>(null);\n\n const list = useMemo(() => {\n if (!(\"list\" in element)) return undefined;\n\n const elementChanged = !_.isEqual(lastElementRef.current, element);\n const watchedChanged = !_.isEqual(lastWatchedRef.current, watchedValues);\n\n // ✅ nothing meaningful changed → reuse\n if (!elementChanged && !watchedChanged) {\n return lastListRef.current;\n }\n\n // 🔁 rebuild\n const nextList = dynamicList<T>(\n element,\n watchedValues,\n allFormValues,\n groupField,\n formContext\n );\n\n lastElementRef.current = element;\n lastWatchedRef.current = watchedValues;\n lastListRef.current = nextList;\n\n return nextList;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n // 4. Centralize dynamic property calculations using memoization.\n const isShown = useMemo(() => {\n // console.log({watchedObject, allFormValues})\n const showLogic = element.show || element.logic?.show;\n if (typeof showLogic === 'function') {\n return (showLogic as LogicFunction<T>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return true;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const isDisabled = useMemo(() => {\n const disableLogic = element.isDisabled || element.logic?.disable;\n if (typeof disableLogic === 'function') {\n return (disableLogic as LogicFunction<T, boolean>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return !!disableLogic;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const isRequired = useMemo(() => {\n if (!('schema' in element) || !element.schema) return false;\n\n const schema = element.schema as Schema<any>;\n\n const checkRequired = (schema: Schema<any>, parentValues: any): boolean => {\n try {\n const type = (schema as any)._type;\n\n const testValue = (() => {\n switch (type) {\n case 'array':\n return [];\n case 'object':\n return {};\n case 'boolean':\n return undefined;\n case 'number':\n return undefined;\n case 'date':\n return undefined;\n default:\n return ''; // string or unknown\n }\n })();\n // Try validating an empty string\n schema.validateSync(\n testValue, // simulating the field is empty\n {\n context: parentValues,\n // @ts-ignore\n parent: parentValues,\n abortEarly: false,\n }\n );\n\n return false; // Passed even when empty => not required\n } catch (err: any) {\n // if (element.id === 'count/ries') {\n // console.log(err.inner || err);\n // }\n\n if (err?.inner?.length) {\n return err.inner.some(\n (e: any) =>\n e.type === 'required' ||\n e.message?.toLowerCase().includes('required')\n );\n }\n\n return (\n err?.type === 'required' ||\n err?.message?.toLowerCase().includes('required')\n );\n }\n };\n\n // Get the parent object (either group or full form)\n const parent = groupField && groupField.index !== undefined\n ? getValues?.()?.[groupField.name]?.[groupField.index]\n : getValues?.();\n\n return checkRequired(schema, parent);\n }, [element, watchedValues, allFormValues]);\n\n const label = useMemo(() => {\n if (typeof element.label === 'function') {\n return (element.label as LogicFunction<T, ILabelElement>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return element.label;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const placeholder = useMemo(() => {\n if ('placeholder' in element && typeof element.placeholder === 'function') {\n return (element.placeholder as LogicFunction<T, string>)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return ('placeholder' in element ? element.placeholder : undefined) as string | undefined;\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n const resolvedStyle = useMemo(() => {\n const s = 'style' in element ? element.style : undefined;\n\n if (s && typeof s === 'function') {\n return s(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n }\n return s;\n }, [watchedValues, allFormValues, control, getValues, element])\n\n // ─────────────────────────────────────────────────────────────\n // Dev-mode deprecation warning for the legacy `style` prop.\n // Fires ONCE per field-instance mount (guarded by hasWarnedRef +\n // empty deps) so it does not re-fire on keystrokes / re-renders /\n // theme changes / etc. The bridge below remains functional —\n // this is a soft deprecation only; runtime removal is deferred\n // to the next major version.\n // ─────────────────────────────────────────────────────────────\n const hasWarnedDeprecatedStyleRef = useRef(false);\n useEffect(() => {\n // `process` is undeclared on native (no @types/node) but the\n // bundler statically replaces it on both platforms in production\n // builds. Reading it via globalThis sidesteps the TS lookup\n // without changing the runtime behaviour.\n const nodeEnv = (globalThis as any)?.process?.env?.NODE_ENV;\n if (nodeEnv === 'production') return;\n if (hasWarnedDeprecatedStyleRef.current) return;\n if (!('style' in element) || (element as any).style === undefined) return;\n\n hasWarnedDeprecatedStyleRef.current = true;\n // eslint-disable-next-line no-console\n console.warn(\n `[KitsConcerto] Field \"${(element as any).id}\": the \"style\" prop is deprecated. ` +\n `Use \"slots\" instead. Migration: ` +\n `style.input → slots.root.style, ` +\n `style.container → slots.container.style, ` +\n `style.label → slots.label.style, ` +\n `style.helperText → slots.helperText.style, ` +\n `style.errorMessage → slots.error.style. ` +\n `This prop will be removed in the next major version.`\n );\n // Empty deps: warn once on mount only — element identity may\n // change every render (form re-constructs configs), so we\n // cannot key on it without re-firing the warning.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n /**\n * Merge explicit `slots` with `style` sub-keys.\n * IElementStyle sub-keys are bridged into the slot system so they\n * flow through useComponentDefaults → elementStyles → KitsContainer.\n * Priority: style sub-keys (lowest) < explicit slots (highest).\n */\n const slots = useMemo(() => {\n // 1. Resolve explicit slots (DynamicValue)\n const rawSlots = 'slots' in element ? element.slots : undefined;\n let explicitSlots: Record<string, { props?: any; style?: any }> | undefined;\n if (rawSlots && typeof rawSlots === 'function') {\n explicitSlots = (rawSlots as any)(watchedValues, allFormValues, {\n control,\n getValues,\n setValue: formContext.setValue\n } as any, groupField);\n } else {\n explicitSlots = rawSlots as any;\n }\n\n // 2. Bridge IElementStyle sub-keys into slot format\n if (!resolvedStyle && !explicitSlots) return undefined;\n if (!resolvedStyle) return explicitSlots;\n\n const STYLE_TO_SLOT: Record<string, string> = {\n input: 'root',\n container: 'container',\n label: 'label',\n helperText: 'helperText',\n errorMessage: 'error',\n };\n\n const result: Record<string, { props?: any; style?: any }> = {};\n\n // First layer: style sub-keys (lower priority)\n for (const [styleKey, slotKey] of Object.entries(STYLE_TO_SLOT)) {\n const val = (resolvedStyle as any)[styleKey];\n if (val) {\n result[slotKey] = { style: val };\n }\n }\n\n // Second layer: explicit slots override\n if (explicitSlots) {\n for (const [key, slot] of Object.entries(explicitSlots)) {\n if (!result[key]) {\n result[key] = slot;\n } else {\n result[key] = {\n ...slot,\n style: { ...result[key].style, ...(slot.style || {}) },\n };\n }\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n }, [watchedValues, allFormValues, control, getValues, element, resolvedStyle])\n\n // 6. Calculate layout properties.\n const layout = useMemo(() => {\n const getDynamicProp = (prop: any) => typeof prop === 'function'\n ? prop(watchedValues, allFormValues, {control, getValues})\n : prop;\n\n return {\n colSpan: getDynamicProp(element.logic?.colSpan ?? element.colSpan) ?? 12,\n rowSpan: getDynamicProp(element.rowSpan),\n columnGap: getDynamicProp(element.columnGap),\n rowGap: getDynamicProp(element.rowGap),\n colOffset: getDynamicProp(element.colOffset),\n area: getDynamicProp(element.area),\n };\n }, [watchedValues, allFormValues, control, getValues, element]);\n\n\n const onWatchedValuesChange = useCallback(() => {\n if (onDepsChange) {\n onDepsChange(watchedValues, allFormValues, formContext as UseFormReturn<T>, groupField)\n }\n }, [watchedValues])\n\n // 7. Get the field's state and methods from react-hook-form.\n // For Object elements, default to {} so react-hook-form treats the field\n // as a nested object — children register with dot-notation paths\n // (e.g. contactPhone.phoneNumber) and build the nested structure.\n const isObjectElement = element.type === 'Object';\n const {field, fieldState} = useController({\n name: element.id as any,\n control,\n shouldUnregister: !isShown,\n ...(isObjectElement ? {defaultValue: {} as any} : {}),\n });\n\n useEffect(() => {\n if (!onDepsChange) return;\n\n // Create a stable signature for watched values\n // (stringify is fine here because deps lists are small)\n const sig = JSON.stringify(watchedValues);\n\n if (sig === prevDepsRef.current) return; // ✅ no real change\n\n prevDepsRef.current = sig;\n\n onDepsChange(watchedValues, allFormValues, formContext as UseFormReturn<T>, groupField);\n }, [onDepsChange, watchedValues, allFormValues, formContext, groupField]);\n\n // 8. Return a single, clean object for the UI component.\n return {\n field: {\n ...field,\n onChange: (event) => {\n if ('onChangeValue' in element && element?.onChangeValue) {\n const value = event != null && typeof event === 'object' && 'target' in event\n ? event.target.value\n : event;\n element.onChangeValue(\n value,\n {...fieldState, isFocused: !!isFocused},\n formContext\n )\n }\n field.onChange(event)\n }\n },\n fieldState,\n watchedValues,\n onWatchedValuesChange,\n elements: childElements,\n isShown,\n isDisabled,\n isRequired,\n hideError: element.hideError,\n label,\n placeholder,\n formContext,\n layout,\n list,\n style: resolvedStyle as IElementStyle,\n slots,\n ...resolvedProps,\n localProps: 'localProps' in element ? element?.localProps : undefined,\n attached: element.attached,\n animation: element.animation,\n };\n }\n;\n"],"names":["schema"],"mappings":"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"}
|