@cxpinsight/react-native 0.2.0
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/LICENSE +21 -0
- package/README.md +131 -0
- package/babel.js +101 -0
- package/instrumented/Pressable.d.ts +2 -0
- package/instrumented/Pressable.js +2 -0
- package/instrumented/ScrollView.d.ts +2 -0
- package/instrumented/ScrollView.js +2 -0
- package/instrumented/TextInput.d.ts +2 -0
- package/instrumented/TextInput.js +2 -0
- package/instrumented/TouchableOpacity.d.ts +2 -0
- package/instrumented/TouchableOpacity.js +2 -0
- package/lib/CXPinsight.d.ts +113 -0
- package/lib/CXPinsight.d.ts.map +1 -0
- package/lib/CXPinsight.js +831 -0
- package/lib/CXPinsight.js.map +1 -0
- package/lib/CXPinsightProvider.d.ts +19 -0
- package/lib/CXPinsightProvider.d.ts.map +1 -0
- package/lib/CXPinsightProvider.js +382 -0
- package/lib/CXPinsightProvider.js.map +1 -0
- package/lib/core/autoScreenTracker.d.ts +20 -0
- package/lib/core/autoScreenTracker.d.ts.map +1 -0
- package/lib/core/autoScreenTracker.js +66 -0
- package/lib/core/autoScreenTracker.js.map +1 -0
- package/lib/core/deepLinkTracker.d.ts +17 -0
- package/lib/core/deepLinkTracker.d.ts.map +1 -0
- package/lib/core/deepLinkTracker.js +81 -0
- package/lib/core/deepLinkTracker.js.map +1 -0
- package/lib/core/deviceInfo.d.ts +14 -0
- package/lib/core/deviceInfo.d.ts.map +1 -0
- package/lib/core/deviceInfo.js +166 -0
- package/lib/core/deviceInfo.js.map +1 -0
- package/lib/core/eventQueue.d.ts +23 -0
- package/lib/core/eventQueue.d.ts.map +1 -0
- package/lib/core/eventQueue.js +240 -0
- package/lib/core/eventQueue.js.map +1 -0
- package/lib/core/lifecycle.d.ts +18 -0
- package/lib/core/lifecycle.d.ts.map +1 -0
- package/lib/core/lifecycle.js +127 -0
- package/lib/core/lifecycle.js.map +1 -0
- package/lib/core/mobileRecorder.d.ts +15 -0
- package/lib/core/mobileRecorder.d.ts.map +1 -0
- package/lib/core/mobileRecorder.js +231 -0
- package/lib/core/mobileRecorder.js.map +1 -0
- package/lib/core/network.d.ts +10 -0
- package/lib/core/network.d.ts.map +1 -0
- package/lib/core/network.js +74 -0
- package/lib/core/network.js.map +1 -0
- package/lib/core/networkCapture.d.ts +22 -0
- package/lib/core/networkCapture.d.ts.map +1 -0
- package/lib/core/networkCapture.js +100 -0
- package/lib/core/networkCapture.js.map +1 -0
- package/lib/core/scrollCapture.d.ts +48 -0
- package/lib/core/scrollCapture.d.ts.map +1 -0
- package/lib/core/scrollCapture.js +221 -0
- package/lib/core/scrollCapture.js.map +1 -0
- package/lib/core/session.d.ts +15 -0
- package/lib/core/session.d.ts.map +1 -0
- package/lib/core/session.js +157 -0
- package/lib/core/session.js.map +1 -0
- package/lib/core/storage.d.ts +11 -0
- package/lib/core/storage.d.ts.map +1 -0
- package/lib/core/storage.js +59 -0
- package/lib/core/storage.js.map +1 -0
- package/lib/core/triggerEngine.d.ts +56 -0
- package/lib/core/triggerEngine.d.ts.map +1 -0
- package/lib/core/triggerEngine.js +432 -0
- package/lib/core/triggerEngine.js.map +1 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +11 -0
- package/lib/index.js.map +1 -0
- package/lib/instrumented/Pressable.d.ts +9 -0
- package/lib/instrumented/Pressable.d.ts.map +1 -0
- package/lib/instrumented/Pressable.js +96 -0
- package/lib/instrumented/Pressable.js.map +1 -0
- package/lib/instrumented/ScrollView.d.ts +6 -0
- package/lib/instrumented/ScrollView.d.ts.map +1 -0
- package/lib/instrumented/ScrollView.js +101 -0
- package/lib/instrumented/ScrollView.js.map +1 -0
- package/lib/instrumented/TextInput.d.ts +9 -0
- package/lib/instrumented/TextInput.d.ts.map +1 -0
- package/lib/instrumented/TextInput.js +75 -0
- package/lib/instrumented/TextInput.js.map +1 -0
- package/lib/instrumented/TouchableOpacity.d.ts +11 -0
- package/lib/instrumented/TouchableOpacity.d.ts.map +1 -0
- package/lib/instrumented/TouchableOpacity.js +96 -0
- package/lib/instrumented/TouchableOpacity.js.map +1 -0
- package/lib/instrumented/index.d.ts +19 -0
- package/lib/instrumented/index.d.ts.map +1 -0
- package/lib/instrumented/index.js +28 -0
- package/lib/instrumented/index.js.map +1 -0
- package/lib/instrumented/interactionObserver.d.ts +29 -0
- package/lib/instrumented/interactionObserver.d.ts.map +1 -0
- package/lib/instrumented/interactionObserver.js +38 -0
- package/lib/instrumented/interactionObserver.js.map +1 -0
- package/lib/setup/AccessibilityScanner.d.ts +32 -0
- package/lib/setup/AccessibilityScanner.d.ts.map +1 -0
- package/lib/setup/AccessibilityScanner.js +127 -0
- package/lib/setup/AccessibilityScanner.js.map +1 -0
- package/lib/setup/ElementIdentifier.d.ts +65 -0
- package/lib/setup/ElementIdentifier.d.ts.map +1 -0
- package/lib/setup/ElementIdentifier.js +114 -0
- package/lib/setup/ElementIdentifier.js.map +1 -0
- package/lib/setup/ElementRegistry.d.ts +22 -0
- package/lib/setup/ElementRegistry.d.ts.map +1 -0
- package/lib/setup/ElementRegistry.js +47 -0
- package/lib/setup/ElementRegistry.js.map +1 -0
- package/lib/setup/SetupCodeEntry.d.ts +15 -0
- package/lib/setup/SetupCodeEntry.d.ts.map +1 -0
- package/lib/setup/SetupCodeEntry.js +198 -0
- package/lib/setup/SetupCodeEntry.js.map +1 -0
- package/lib/setup/SetupController.d.ts +29 -0
- package/lib/setup/SetupController.d.ts.map +1 -0
- package/lib/setup/SetupController.js +189 -0
- package/lib/setup/SetupController.js.map +1 -0
- package/lib/setup/SetupOverlay.d.ts +10 -0
- package/lib/setup/SetupOverlay.d.ts.map +1 -0
- package/lib/setup/SetupOverlay.js +408 -0
- package/lib/setup/SetupOverlay.js.map +1 -0
- package/lib/setup/TapInterceptor.d.ts +19 -0
- package/lib/setup/TapInterceptor.d.ts.map +1 -0
- package/lib/setup/TapInterceptor.js +98 -0
- package/lib/setup/TapInterceptor.js.map +1 -0
- package/lib/setup/TouchObserver.d.ts +25 -0
- package/lib/setup/TouchObserver.d.ts.map +1 -0
- package/lib/setup/TouchObserver.js +88 -0
- package/lib/setup/TouchObserver.js.map +1 -0
- package/lib/setup/TouchPatcher.d.ts +27 -0
- package/lib/setup/TouchPatcher.d.ts.map +1 -0
- package/lib/setup/TouchPatcher.js +182 -0
- package/lib/setup/TouchPatcher.js.map +1 -0
- package/lib/setup/index.d.ts +13 -0
- package/lib/setup/index.d.ts.map +1 -0
- package/lib/setup/index.js +45 -0
- package/lib/setup/index.js.map +1 -0
- package/lib/setup/useCXPElement.d.ts +25 -0
- package/lib/setup/useCXPElement.d.ts.map +1 -0
- package/lib/setup/useCXPElement.js +33 -0
- package/lib/setup/useCXPElement.js.map +1 -0
- package/lib/survey/SurveyModal.d.ts +10 -0
- package/lib/survey/SurveyModal.d.ts.map +1 -0
- package/lib/survey/SurveyModal.js +1650 -0
- package/lib/survey/SurveyModal.js.map +1 -0
- package/lib/survey/expressionEval.d.ts +10 -0
- package/lib/survey/expressionEval.d.ts.map +1 -0
- package/lib/survey/expressionEval.js +287 -0
- package/lib/survey/expressionEval.js.map +1 -0
- package/lib/survey/frequencyCap.d.ts +15 -0
- package/lib/survey/frequencyCap.d.ts.map +1 -0
- package/lib/survey/frequencyCap.js +116 -0
- package/lib/survey/frequencyCap.js.map +1 -0
- package/lib/survey/handsFreeVoice.d.ts +30 -0
- package/lib/survey/handsFreeVoice.d.ts.map +1 -0
- package/lib/survey/handsFreeVoice.js +312 -0
- package/lib/survey/handsFreeVoice.js.map +1 -0
- package/lib/survey/interpolate.d.ts +6 -0
- package/lib/survey/interpolate.d.ts.map +1 -0
- package/lib/survey/interpolate.js +61 -0
- package/lib/survey/interpolate.js.map +1 -0
- package/lib/survey/pagesFromV1.d.ts +6 -0
- package/lib/survey/pagesFromV1.d.ts.map +1 -0
- package/lib/survey/pagesFromV1.js +83 -0
- package/lib/survey/pagesFromV1.js.map +1 -0
- package/lib/survey/questions/CSATQuestion.d.ts +16 -0
- package/lib/survey/questions/CSATQuestion.d.ts.map +1 -0
- package/lib/survey/questions/CSATQuestion.js +37 -0
- package/lib/survey/questions/CSATQuestion.js.map +1 -0
- package/lib/survey/questions/DateQuestion.d.ts +20 -0
- package/lib/survey/questions/DateQuestion.d.ts.map +1 -0
- package/lib/survey/questions/DateQuestion.js +103 -0
- package/lib/survey/questions/DateQuestion.js.map +1 -0
- package/lib/survey/questions/ImagePickerQuestion.d.ts +33 -0
- package/lib/survey/questions/ImagePickerQuestion.d.ts.map +1 -0
- package/lib/survey/questions/ImagePickerQuestion.js +68 -0
- package/lib/survey/questions/ImagePickerQuestion.js.map +1 -0
- package/lib/survey/questions/ImageQuestion.d.ts +26 -0
- package/lib/survey/questions/ImageQuestion.d.ts.map +1 -0
- package/lib/survey/questions/ImageQuestion.js +24 -0
- package/lib/survey/questions/ImageQuestion.js.map +1 -0
- package/lib/survey/questions/MatrixCell.d.ts +45 -0
- package/lib/survey/questions/MatrixCell.d.ts.map +1 -0
- package/lib/survey/questions/MatrixCell.js +54 -0
- package/lib/survey/questions/MatrixCell.js.map +1 -0
- package/lib/survey/questions/MatrixDropdownQuestion.d.ts +29 -0
- package/lib/survey/questions/MatrixDropdownQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MatrixDropdownQuestion.js +42 -0
- package/lib/survey/questions/MatrixDropdownQuestion.js.map +1 -0
- package/lib/survey/questions/MatrixDynamicQuestion.d.ts +26 -0
- package/lib/survey/questions/MatrixDynamicQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MatrixDynamicQuestion.js +52 -0
- package/lib/survey/questions/MatrixDynamicQuestion.js.map +1 -0
- package/lib/survey/questions/MatrixQuestion.d.ts +38 -0
- package/lib/survey/questions/MatrixQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MatrixQuestion.js +64 -0
- package/lib/survey/questions/MatrixQuestion.js.map +1 -0
- package/lib/survey/questions/MultiTextQuestion.d.ts +19 -0
- package/lib/survey/questions/MultiTextQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MultiTextQuestion.js +64 -0
- package/lib/survey/questions/MultiTextQuestion.js.map +1 -0
- package/lib/survey/questions/MultipleChoiceQuestion.d.ts +25 -0
- package/lib/survey/questions/MultipleChoiceQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MultipleChoiceQuestion.js +111 -0
- package/lib/survey/questions/MultipleChoiceQuestion.js.map +1 -0
- package/lib/survey/questions/NPSQuestion.d.ts +18 -0
- package/lib/survey/questions/NPSQuestion.d.ts.map +1 -0
- package/lib/survey/questions/NPSQuestion.js +62 -0
- package/lib/survey/questions/NPSQuestion.js.map +1 -0
- package/lib/survey/questions/PanelDynamicQuestion.d.ts +50 -0
- package/lib/survey/questions/PanelDynamicQuestion.d.ts.map +1 -0
- package/lib/survey/questions/PanelDynamicQuestion.js +62 -0
- package/lib/survey/questions/PanelDynamicQuestion.js.map +1 -0
- package/lib/survey/questions/RankingQuestion.d.ts +34 -0
- package/lib/survey/questions/RankingQuestion.d.ts.map +1 -0
- package/lib/survey/questions/RankingQuestion.js +85 -0
- package/lib/survey/questions/RankingQuestion.js.map +1 -0
- package/lib/survey/questions/RatingQuestion.d.ts +20 -0
- package/lib/survey/questions/RatingQuestion.d.ts.map +1 -0
- package/lib/survey/questions/RatingQuestion.js +53 -0
- package/lib/survey/questions/RatingQuestion.js.map +1 -0
- package/lib/survey/questions/TextQuestion.d.ts +17 -0
- package/lib/survey/questions/TextQuestion.d.ts.map +1 -0
- package/lib/survey/questions/TextQuestion.js +46 -0
- package/lib/survey/questions/TextQuestion.js.map +1 -0
- package/lib/survey/styleContract.d.ts +230 -0
- package/lib/survey/styleContract.d.ts.map +1 -0
- package/lib/survey/styleContract.js +365 -0
- package/lib/survey/styleContract.js.map +1 -0
- package/lib/survey/themePalette.d.ts +56 -0
- package/lib/survey/themePalette.d.ts.map +1 -0
- package/lib/survey/themePalette.js +63 -0
- package/lib/survey/themePalette.js.map +1 -0
- package/lib/survey/translationLookup.d.ts +4 -0
- package/lib/survey/translationLookup.d.ts.map +1 -0
- package/lib/survey/translationLookup.js +62 -0
- package/lib/survey/translationLookup.js.map +1 -0
- package/lib/survey/validate.d.ts +3 -0
- package/lib/survey/validate.d.ts.map +1 -0
- package/lib/survey/validate.js +159 -0
- package/lib/survey/validate.js.map +1 -0
- package/lib/survey/variablesResolver.d.ts +10 -0
- package/lib/survey/variablesResolver.d.ts.map +1 -0
- package/lib/survey/variablesResolver.js +107 -0
- package/lib/survey/variablesResolver.js.map +1 -0
- package/lib/survey/voiceParsers.d.ts +47 -0
- package/lib/survey/voiceParsers.d.ts.map +1 -0
- package/lib/survey/voiceParsers.js +310 -0
- package/lib/survey/voiceParsers.js.map +1 -0
- package/lib/types.d.ts +349 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +20 -0
- package/lib/types.js.map +1 -0
- package/metro.js +55 -0
- package/package.json +78 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isNativeDatePickerAvailable = isNativeDatePickerAvailable;
|
|
4
|
+
exports.DateQuestion = DateQuestion;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const react_native_1 = require("react-native");
|
|
8
|
+
const styleContract_1 = require("../styleContract");
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
let DateTimePicker = null;
|
|
11
|
+
try {
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
13
|
+
const mod = require('@react-native-community/datetimepicker');
|
|
14
|
+
DateTimePicker = (mod?.default ?? mod);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
DateTimePicker = null;
|
|
18
|
+
}
|
|
19
|
+
function isNativeDatePickerAvailable() {
|
|
20
|
+
return DateTimePicker !== null;
|
|
21
|
+
}
|
|
22
|
+
// Format Date → YYYY-MM-DD (locale-independent). ISO-8601 date is what
|
|
23
|
+
// the response layer expects and what the web renderer emits.
|
|
24
|
+
function toIsoDate(d) {
|
|
25
|
+
const y = d.getFullYear();
|
|
26
|
+
const m = String(d.getMonth() + 1).padStart(2, '0');
|
|
27
|
+
const day = String(d.getDate()).padStart(2, '0');
|
|
28
|
+
return `${y}-${m}-${day}`;
|
|
29
|
+
}
|
|
30
|
+
// Parse YYYY-MM-DD → Date. Falls back to today when the string is
|
|
31
|
+
// blank/malformed so the picker opens on a sensible default.
|
|
32
|
+
function fromIsoDate(s) {
|
|
33
|
+
if (!s)
|
|
34
|
+
return new Date();
|
|
35
|
+
const m = /^(\d{4})-(\d{2})-(\d{2})/.exec(s);
|
|
36
|
+
if (!m)
|
|
37
|
+
return new Date();
|
|
38
|
+
return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]));
|
|
39
|
+
}
|
|
40
|
+
function DateQuestion({ value, onChange, min, max, primaryColor, palette, contract, isRtl, placeholder, }) {
|
|
41
|
+
const [showing, setShowing] = (0, react_1.useState)(false);
|
|
42
|
+
const displayLabel = value || placeholder || 'Select a date';
|
|
43
|
+
// contract ▸ legacy palette/primaryColor ▸ dark defaults. DARK_CONTRACT's
|
|
44
|
+
// input values are the literals this file used to hardcode.
|
|
45
|
+
const c = contract ?? styleContract_1.DARK_CONTRACT;
|
|
46
|
+
const bg = palette?.input ?? c.input;
|
|
47
|
+
const border = palette?.inputBorder ?? c.inputBorder;
|
|
48
|
+
const filledText = palette?.textPrimary ?? c.inputText;
|
|
49
|
+
const emptyText = palette?.placeholder ?? c.placeholder;
|
|
50
|
+
const iconColor = primaryColor ?? c.accent;
|
|
51
|
+
if (!DateTimePicker) {
|
|
52
|
+
// Peer dep not installed — render a hint so the author knows
|
|
53
|
+
// why the date input is degraded. Caller (SurveyModal) can
|
|
54
|
+
// fallback to TextQuestion here; we render nothing so the
|
|
55
|
+
// caller's fallback shows instead. This branch is unreachable
|
|
56
|
+
// from the caller because SurveyModal checks
|
|
57
|
+
// isNativeDatePickerAvailable() before dispatching to us.
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.container, children: [(0, jsx_runtime_1.jsxs)(react_native_1.TouchableOpacity, { style: [
|
|
61
|
+
styles.trigger,
|
|
62
|
+
{ backgroundColor: bg, borderColor: border, borderRadius: c.inputRadius },
|
|
63
|
+
isRtl && styles.rtlRow,
|
|
64
|
+
], onPress: () => setShowing(true), activeOpacity: 0.7, accessibilityRole: "button", accessibilityLabel: value ? `Selected date: ${value}. Tap to change.` : 'Tap to pick a date.', children: [(0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [
|
|
65
|
+
styles.triggerText,
|
|
66
|
+
{ color: value ? filledText : emptyText, fontSize: c.fontSizeInput, fontFamily: c.fontFamily },
|
|
67
|
+
isRtl && styles.rtlText,
|
|
68
|
+
], children: displayLabel }), (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [styles.icon, { color: iconColor }], children: "\uD83D\uDCC5" })] }), showing && ((0, jsx_runtime_1.jsx)(DateTimePicker, { value: fromIsoDate(value), mode: "date", display: react_native_1.Platform.OS === 'ios' ? 'spinner' : 'default', minimumDate: min ? fromIsoDate(min) : undefined, maximumDate: max ? fromIsoDate(max) : undefined, onChange: (_event, picked) => {
|
|
69
|
+
// Android auto-dismisses; iOS keeps the picker open. Match
|
|
70
|
+
// native affordance either way — close on any change, and
|
|
71
|
+
// only emit onChange when the user actually picked a value.
|
|
72
|
+
setShowing(false);
|
|
73
|
+
if (picked)
|
|
74
|
+
onChange(toIsoDate(picked));
|
|
75
|
+
} }))] }));
|
|
76
|
+
}
|
|
77
|
+
const styles = react_native_1.StyleSheet.create({
|
|
78
|
+
container: {
|
|
79
|
+
marginVertical: 8,
|
|
80
|
+
},
|
|
81
|
+
trigger: {
|
|
82
|
+
flexDirection: 'row',
|
|
83
|
+
alignItems: 'center',
|
|
84
|
+
justifyContent: 'space-between',
|
|
85
|
+
borderWidth: 1,
|
|
86
|
+
padding: 14,
|
|
87
|
+
minHeight: 48,
|
|
88
|
+
},
|
|
89
|
+
rtlRow: {
|
|
90
|
+
flexDirection: 'row-reverse',
|
|
91
|
+
},
|
|
92
|
+
triggerText: {
|
|
93
|
+
flex: 1,
|
|
94
|
+
},
|
|
95
|
+
rtlText: {
|
|
96
|
+
textAlign: 'right',
|
|
97
|
+
},
|
|
98
|
+
icon: {
|
|
99
|
+
fontSize: 18,
|
|
100
|
+
marginLeft: 8,
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=DateQuestion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateQuestion.js","sourceRoot":"","sources":["../../../src/survey/questions/DateQuestion.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type SurveyStyleContract } from '../styleContract';
|
|
2
|
+
/**
|
|
3
|
+
* ImagePickerQuestion — mobile parity for the web ImagePickerRenderer.
|
|
4
|
+
*
|
|
5
|
+
* Answer shape is IDENTICAL to web (`richRenderers.tsx` ImagePickerRenderer):
|
|
6
|
+
* - multiSelect → `string[]` of picked values
|
|
7
|
+
* - single → the value, or `null` when the respondent taps it again
|
|
8
|
+
*
|
|
9
|
+
* That deselect-to-null on re-tap is easy to miss and is deliberate on web, so
|
|
10
|
+
* it is reproduced exactly — otherwise a respondent could not clear an optional
|
|
11
|
+
* single-select answer on mobile but could on web.
|
|
12
|
+
*
|
|
13
|
+
* Uses React Native's own Image + TouchableOpacity: no new peer dependency, and
|
|
14
|
+
* the install guide stays sufficient.
|
|
15
|
+
*/
|
|
16
|
+
interface ImagePickerOption {
|
|
17
|
+
value: unknown;
|
|
18
|
+
label?: string;
|
|
19
|
+
imageUrl?: string;
|
|
20
|
+
alt?: string;
|
|
21
|
+
}
|
|
22
|
+
interface Props {
|
|
23
|
+
options: ImagePickerOption[];
|
|
24
|
+
multiSelect?: boolean;
|
|
25
|
+
/** string[] when multiSelect, else the single value (or null). */
|
|
26
|
+
value: unknown;
|
|
27
|
+
onChange: (value: string[] | string | null) => void;
|
|
28
|
+
contract?: SurveyStyleContract;
|
|
29
|
+
isRtl?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export declare function ImagePickerQuestion({ options, multiSelect, value, onChange, contract, isRtl, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
export default ImagePickerQuestion;
|
|
33
|
+
//# sourceMappingURL=ImagePickerQuestion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImagePickerQuestion.d.ts","sourceRoot":"","sources":["../../../src/survey/questions/ImagePickerQuestion.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE3E;;;;;;;;;;;;;GAaG;AAEH,UAAU,iBAAiB;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,UAAU,KAAK;IACb,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kEAAkE;IAClE,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,GACvD,EAAE,KAAK,2CA2EP;eAwBc,mBAAmB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ImagePickerQuestion = ImagePickerQuestion;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_native_1 = require("react-native");
|
|
6
|
+
const styleContract_1 = require("../styleContract");
|
|
7
|
+
function ImagePickerQuestion({ options, multiSelect, value, onChange, contract, isRtl, }) {
|
|
8
|
+
const c = contract ?? styleContract_1.DARK_CONTRACT;
|
|
9
|
+
const opts = Array.isArray(options) ? options : [];
|
|
10
|
+
const multi = multiSelect === true;
|
|
11
|
+
// Same normalisation web performs before comparing.
|
|
12
|
+
const picked = multi
|
|
13
|
+
? (Array.isArray(value) ? value.map(String) : [])
|
|
14
|
+
: (value != null ? [String(value)] : []);
|
|
15
|
+
const toggle = (v) => {
|
|
16
|
+
if (multi) {
|
|
17
|
+
onChange(picked.includes(v) ? picked.filter((x) => x !== v) : [...picked, v]);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
// Re-tapping the current choice clears it — matches web.
|
|
21
|
+
onChange(picked[0] === v ? null : v);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
return ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: [styles.grid, isRtl && styles.rtlGrid], children: opts.map((opt, i) => {
|
|
25
|
+
const val = opt.value != null ? String(opt.value) : '';
|
|
26
|
+
const selected = picked.includes(val);
|
|
27
|
+
const caption = opt.label || opt.alt || val;
|
|
28
|
+
return ((0, jsx_runtime_1.jsxs)(react_native_1.TouchableOpacity, { onPress: () => toggle(val), activeOpacity: 0.8, accessibilityRole: multi ? 'checkbox' : 'radio', accessibilityState: { checked: selected }, accessibilityLabel: caption, style: [
|
|
29
|
+
styles.tile,
|
|
30
|
+
{
|
|
31
|
+
backgroundColor: selected ? c.optionSelectedBg : c.optionBg,
|
|
32
|
+
borderColor: selected ? c.optionSelectedBorder : c.optionBorder,
|
|
33
|
+
borderRadius: c.optionRadius,
|
|
34
|
+
},
|
|
35
|
+
], children: [opt.imageUrl ? ((0, jsx_runtime_1.jsx)(react_native_1.Image, { source: { uri: opt.imageUrl }, accessibilityLabel: opt.alt || undefined, resizeMode: "cover", style: [styles.thumb, { borderRadius: Math.max(0, c.optionRadius - 4) }] })) : ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: [styles.thumb, styles.thumbEmpty, { backgroundColor: c.input }] })), (0, jsx_runtime_1.jsx)(react_native_1.Text, { numberOfLines: 2, style: [
|
|
36
|
+
styles.caption,
|
|
37
|
+
{
|
|
38
|
+
color: selected ? c.textPrimary : c.textSecondary,
|
|
39
|
+
fontSize: c.fontSizeSmall,
|
|
40
|
+
fontFamily: c.fontFamily,
|
|
41
|
+
},
|
|
42
|
+
isRtl && styles.rtlText,
|
|
43
|
+
], children: caption })] }, i));
|
|
44
|
+
}) }));
|
|
45
|
+
}
|
|
46
|
+
/* Layout only — colours and radii come from the contract. */
|
|
47
|
+
const styles = react_native_1.StyleSheet.create({
|
|
48
|
+
grid: {
|
|
49
|
+
marginVertical: 8,
|
|
50
|
+
flexDirection: 'row',
|
|
51
|
+
flexWrap: 'wrap',
|
|
52
|
+
gap: 10,
|
|
53
|
+
},
|
|
54
|
+
rtlGrid: { flexDirection: 'row-reverse' },
|
|
55
|
+
tile: {
|
|
56
|
+
// Two per row with the 10px gap, on any phone width.
|
|
57
|
+
width: '47%',
|
|
58
|
+
borderWidth: 1,
|
|
59
|
+
padding: 8,
|
|
60
|
+
gap: 8,
|
|
61
|
+
},
|
|
62
|
+
thumb: { width: '100%', aspectRatio: 4 / 3 },
|
|
63
|
+
thumbEmpty: { opacity: 0.5 },
|
|
64
|
+
caption: { fontWeight: '500', textAlign: 'center' },
|
|
65
|
+
rtlText: { writingDirection: 'rtl' },
|
|
66
|
+
});
|
|
67
|
+
exports.default = ImagePickerQuestion;
|
|
68
|
+
//# sourceMappingURL=ImagePickerQuestion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImagePickerQuestion.js","sourceRoot":"","sources":["../../../src/survey/questions/ImagePickerQuestion.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type SurveyStyleContract } from '../styleContract';
|
|
2
|
+
/**
|
|
3
|
+
* ImageQuestion — mobile parity for the web ImageRenderer.
|
|
4
|
+
*
|
|
5
|
+
* Display-only: it collects no answer, it shows an image inside the survey
|
|
6
|
+
* (a logo, a product shot, a diagram the next question asks about). Web has had
|
|
7
|
+
* it since Phase 3b; on mobile it fell through to "please complete on desktop",
|
|
8
|
+
* which was actively misleading — the respondent was told the survey was
|
|
9
|
+
* unusable because of a decorative image.
|
|
10
|
+
*
|
|
11
|
+
* Uses React Native's own Image, so no new peer dependency.
|
|
12
|
+
*
|
|
13
|
+
* Sizing mirrors web's `maxWidth: 100%; height: auto`: authored width/height are
|
|
14
|
+
* treated as an aspect ratio and the image scales to the container width, so a
|
|
15
|
+
* 1200px-wide asset doesn't overflow a phone.
|
|
16
|
+
*/
|
|
17
|
+
interface Props {
|
|
18
|
+
imageUrl?: string;
|
|
19
|
+
alt?: string;
|
|
20
|
+
width?: number;
|
|
21
|
+
height?: number;
|
|
22
|
+
contract?: SurveyStyleContract;
|
|
23
|
+
}
|
|
24
|
+
export declare function ImageQuestion({ imageUrl, alt, width, height, contract }: Props): import("react/jsx-runtime").JSX.Element | null;
|
|
25
|
+
export default ImageQuestion;
|
|
26
|
+
//# sourceMappingURL=ImageQuestion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageQuestion.d.ts","sourceRoot":"","sources":["../../../src/survey/questions/ImageQuestion.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE3E;;;;;;;;;;;;;;GAcG;AAEH,UAAU,KAAK;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAChC;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,kDAsB9E;eAQc,aAAa"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ImageQuestion = ImageQuestion;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_native_1 = require("react-native");
|
|
6
|
+
const styleContract_1 = require("../styleContract");
|
|
7
|
+
function ImageQuestion({ imageUrl, alt, width, height, contract }) {
|
|
8
|
+
const c = contract ?? styleContract_1.DARK_CONTRACT;
|
|
9
|
+
// Web returns null when there's no src — match that rather than rendering an
|
|
10
|
+
// empty box.
|
|
11
|
+
if (!imageUrl)
|
|
12
|
+
return null;
|
|
13
|
+
// Authored dimensions become an aspect ratio; without them fall back to 16:9
|
|
14
|
+
// so the image still reserves sensible space while loading.
|
|
15
|
+
const aspectRatio = width && height ? width / height : 16 / 9;
|
|
16
|
+
return ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.container, children: (0, jsx_runtime_1.jsx)(react_native_1.Image, { source: { uri: imageUrl }, accessibilityLabel: alt || undefined, accessible: Boolean(alt), resizeMode: "contain", style: [styles.image, { aspectRatio, borderRadius: c.inputRadius }] }) }));
|
|
17
|
+
}
|
|
18
|
+
/* Layout only. */
|
|
19
|
+
const styles = react_native_1.StyleSheet.create({
|
|
20
|
+
container: { marginVertical: 8 },
|
|
21
|
+
image: { width: '100%', height: undefined },
|
|
22
|
+
});
|
|
23
|
+
exports.default = ImageQuestion;
|
|
24
|
+
//# sourceMappingURL=ImageQuestion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageQuestion.js","sourceRoot":"","sources":["../../../src/survey/questions/ImageQuestion.tsx"],"names":[],"mappings":";;;;AACA,+CAAuD;AACvD,oDAA2E;AA0B3E,uBAA8B,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAS;IAC7E,MAAM,CAAC,GAAG,QAAQ,IAAI,6BAAa,CAAC;IAEpC,6EAA6E;IAC7E,aAAa;IACb,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,6EAA6E;IAC7E,4DAA4D;IAC5D,MAAM,WAAW,GAAG,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAE9D,OAAO,CACL,uBAAC,mBAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,YAC3B,uBAAC,oBAAK,IACJ,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EACzB,kBAAkB,EAAE,GAAG,IAAI,SAAS,EACpC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,EACxB,UAAU,EAAC,SAAS,EACpB,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,GACnE,GACG,CACR,CAAC;AACJ,CAAC;AAED,kBAAkB;AAClB,MAAM,MAAM,GAAG,yBAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE;IAChC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE;CAC5C,CAAC,CAAC;kBAEY,aAAa"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type SurveyStyleContract } from '../styleContract';
|
|
2
|
+
/**
|
|
3
|
+
* MatrixCell — renders one cell of a matrix/panel by its `cellType`.
|
|
4
|
+
*
|
|
5
|
+
* Web does exactly this: `registry[c.cellType || 'text']` looks the cell's
|
|
6
|
+
* renderer up in the same registry the top-level questions use. Mirroring that
|
|
7
|
+
* here means a `dropdown` cell behaves identically to a standalone `dropdown`
|
|
8
|
+
* question on both platforms, rather than being a second implementation that
|
|
9
|
+
* drifts.
|
|
10
|
+
*
|
|
11
|
+
* Shared by MatrixDropdown, MatrixDynamic and PanelDynamic — the three types
|
|
12
|
+
* differ only in how cells are grouped, not in how a cell renders.
|
|
13
|
+
*/
|
|
14
|
+
export interface CellColumn {
|
|
15
|
+
id?: string;
|
|
16
|
+
name?: string;
|
|
17
|
+
title?: string;
|
|
18
|
+
text?: string;
|
|
19
|
+
cellType?: string;
|
|
20
|
+
options?: Array<{
|
|
21
|
+
value: unknown;
|
|
22
|
+
label?: string;
|
|
23
|
+
text?: string;
|
|
24
|
+
}>;
|
|
25
|
+
choices?: Array<{
|
|
26
|
+
value: unknown;
|
|
27
|
+
label?: string;
|
|
28
|
+
text?: string;
|
|
29
|
+
}>;
|
|
30
|
+
placeholder?: string;
|
|
31
|
+
defaultValue?: unknown;
|
|
32
|
+
}
|
|
33
|
+
/** Same derivation web uses, so answer keys match exactly. */
|
|
34
|
+
export declare const columnKey: (c: CellColumn, index: number) => string;
|
|
35
|
+
export declare const columnLabel: (c: CellColumn, index: number) => string;
|
|
36
|
+
interface Props {
|
|
37
|
+
column: CellColumn;
|
|
38
|
+
value: unknown;
|
|
39
|
+
onChange: (v: unknown) => void;
|
|
40
|
+
contract?: SurveyStyleContract;
|
|
41
|
+
isRtl?: boolean;
|
|
42
|
+
}
|
|
43
|
+
export declare function MatrixCell({ column, value, onChange, contract, isRtl }: Props): import("react/jsx-runtime").JSX.Element;
|
|
44
|
+
export default MatrixCell;
|
|
45
|
+
//# sourceMappingURL=MatrixCell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MatrixCell.d.ts","sourceRoot":"","sources":["../../../src/survey/questions/MatrixCell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAO3E;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,8DAA8D;AAC9D,eAAO,MAAM,SAAS,MAAO,UAAU,SAAS,MAAM,KAAG,MACxB,CAAC;AAElC,eAAO,MAAM,WAAW,MAAO,UAAU,SAAS,MAAM,KAAG,MACG,CAAC;AAE/D,UAAU,KAAK;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,KAAK,2CAkG7E;eAMc,UAAU"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.columnLabel = exports.columnKey = void 0;
|
|
4
|
+
exports.MatrixCell = MatrixCell;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const react_native_1 = require("react-native");
|
|
7
|
+
const styleContract_1 = require("../styleContract");
|
|
8
|
+
const TextQuestion_1 = require("./TextQuestion");
|
|
9
|
+
const MultipleChoiceQuestion_1 = require("./MultipleChoiceQuestion");
|
|
10
|
+
const RatingQuestion_1 = require("./RatingQuestion");
|
|
11
|
+
const NPSQuestion_1 = require("./NPSQuestion");
|
|
12
|
+
const DateQuestion_1 = require("./DateQuestion");
|
|
13
|
+
/** Same derivation web uses, so answer keys match exactly. */
|
|
14
|
+
const columnKey = (c, index) => c.id || c.name || String(index);
|
|
15
|
+
exports.columnKey = columnKey;
|
|
16
|
+
const columnLabel = (c, index) => c.title || c.text || c.name || c.id || `Column ${index + 1}`;
|
|
17
|
+
exports.columnLabel = columnLabel;
|
|
18
|
+
function MatrixCell({ column, value, onChange, contract, isRtl }) {
|
|
19
|
+
const c = contract ?? styleContract_1.DARK_CONTRACT;
|
|
20
|
+
const type = column.cellType || 'text';
|
|
21
|
+
const opts = column.options || column.choices || [];
|
|
22
|
+
switch (type) {
|
|
23
|
+
case 'dropdown':
|
|
24
|
+
case 'radio':
|
|
25
|
+
case 'radiogroup':
|
|
26
|
+
return ((0, jsx_runtime_1.jsx)(MultipleChoiceQuestion_1.MultipleChoiceQuestion, { choices: opts.map((o) => ({ value: String(o.value), text: String(o.label ?? o.text ?? o.value) })), value: value ?? '', onChange: (v) => onChange(v), mode: "radiogroup", contract: c, isRtl: isRtl }));
|
|
27
|
+
case 'checkbox':
|
|
28
|
+
return ((0, jsx_runtime_1.jsx)(MultipleChoiceQuestion_1.MultipleChoiceQuestion, { choices: opts.map((o) => ({ value: String(o.value), text: String(o.label ?? o.text ?? o.value) })), value: value ?? [], onChange: (v) => onChange(v), mode: "checkbox", contract: c, isRtl: isRtl }));
|
|
29
|
+
case 'rating':
|
|
30
|
+
return ((0, jsx_runtime_1.jsx)(RatingQuestion_1.RatingQuestion, { value: value ?? null, onChange: (v) => onChange(v), contract: c }));
|
|
31
|
+
case 'nps':
|
|
32
|
+
return ((0, jsx_runtime_1.jsx)(NPSQuestion_1.NPSQuestion, { value: value ?? null, onChange: (v) => onChange(v), contract: c }));
|
|
33
|
+
case 'date':
|
|
34
|
+
// Falls back to a text input when the optional picker peer dep isn't
|
|
35
|
+
// installed — same as a standalone date question, and no new requirement
|
|
36
|
+
// on the host app.
|
|
37
|
+
return (0, DateQuestion_1.isNativeDatePickerAvailable)() ? ((0, jsx_runtime_1.jsx)(DateQuestion_1.DateQuestion, { value: value ?? '', onChange: (v) => onChange(v), contract: c, isRtl: isRtl, placeholder: column.placeholder })) : ((0, jsx_runtime_1.jsx)(TextQuestion_1.TextQuestion, { value: value ?? '', onChange: (v) => onChange(v), placeholder: column.placeholder || 'YYYY-MM-DD', multiline: false, contract: c, isRtl: isRtl }));
|
|
38
|
+
case 'text':
|
|
39
|
+
case 'comment':
|
|
40
|
+
case 'email':
|
|
41
|
+
case 'number':
|
|
42
|
+
return ((0, jsx_runtime_1.jsx)(TextQuestion_1.TextQuestion, { value: value ?? '', onChange: (v) => onChange(v), placeholder: column.placeholder, multiline: type === 'comment', contract: c, isRtl: isRtl }));
|
|
43
|
+
default:
|
|
44
|
+
// Web renders an em-dash for a cellType with no registry entry. Match
|
|
45
|
+
// that rather than silently substituting a text box, which would invite
|
|
46
|
+
// junk data into a cell the author never meant to be free-form.
|
|
47
|
+
return ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.unsupported, children: (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: { color: c.textMuted, fontSize: c.fontSizeSmall }, children: "\u2014" }) }));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const styles = react_native_1.StyleSheet.create({
|
|
51
|
+
unsupported: { paddingVertical: 8 },
|
|
52
|
+
});
|
|
53
|
+
exports.default = MatrixCell;
|
|
54
|
+
//# sourceMappingURL=MatrixCell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MatrixCell.js","sourceRoot":"","sources":["../../../src/survey/questions/MatrixCell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type SurveyStyleContract } from '../styleContract';
|
|
2
|
+
import { type CellColumn } from './MatrixCell';
|
|
3
|
+
/**
|
|
4
|
+
* MatrixDropdownQuestion — mobile parity for the web MatrixDropdownRenderer.
|
|
5
|
+
*
|
|
6
|
+
* Answer shape is IDENTICAL to web (`matrixRenderers.tsx`):
|
|
7
|
+
* Record<rowId, Record<columnKey, cellValue>>
|
|
8
|
+
* with `columnKey` derived the same way (`c.id || c.name || String(index)`), so
|
|
9
|
+
* a mobile response is indistinguishable from a web one downstream.
|
|
10
|
+
*
|
|
11
|
+
* Web lays this out as a table with a 140px minimum per column. That genuinely
|
|
12
|
+
* doesn't fit a phone, so rows become stacked blocks and each cell is labelled
|
|
13
|
+
* with its column name. No horizontal scrolling.
|
|
14
|
+
*/
|
|
15
|
+
interface MatrixRow {
|
|
16
|
+
id: string;
|
|
17
|
+
text?: string;
|
|
18
|
+
}
|
|
19
|
+
interface Props {
|
|
20
|
+
rows: MatrixRow[];
|
|
21
|
+
columns: CellColumn[];
|
|
22
|
+
value: Record<string, Record<string, unknown>> | null;
|
|
23
|
+
onChange: (value: Record<string, Record<string, unknown>>) => void;
|
|
24
|
+
contract?: SurveyStyleContract;
|
|
25
|
+
isRtl?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare function MatrixDropdownQuestion({ rows, columns, value, onChange, contract, isRtl, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
export default MatrixDropdownQuestion;
|
|
29
|
+
//# sourceMappingURL=MatrixDropdownQuestion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MatrixDropdownQuestion.d.ts","sourceRoot":"","sources":["../../../src/survey/questions/MatrixDropdownQuestion.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAsC,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnF;;;;;;;;;;;GAWG;AAEH,UAAU,SAAS;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AAEjD,UAAU,KAAK;IACb,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IACtD,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;IACnE,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,sBAAsB,CAAC,EACrC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,GAChD,EAAE,KAAK,2CA4DP;eAWc,sBAAsB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MatrixDropdownQuestion = MatrixDropdownQuestion;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_native_1 = require("react-native");
|
|
6
|
+
const styleContract_1 = require("../styleContract");
|
|
7
|
+
const MatrixCell_1 = require("./MatrixCell");
|
|
8
|
+
function MatrixDropdownQuestion({ rows, columns, value, onChange, contract, isRtl, }) {
|
|
9
|
+
const c = contract ?? styleContract_1.DARK_CONTRACT;
|
|
10
|
+
const safeRows = Array.isArray(rows) ? rows : [];
|
|
11
|
+
const safeCols = Array.isArray(columns) ? columns : [];
|
|
12
|
+
const answers = value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
13
|
+
const setCell = (rowId, colKey, cellValue) => {
|
|
14
|
+
const rowState = answers[rowId] || {};
|
|
15
|
+
onChange({ ...answers, [rowId]: { ...rowState, [colKey]: cellValue } });
|
|
16
|
+
};
|
|
17
|
+
return ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.container, children: safeRows.map((r) => ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: [
|
|
18
|
+
styles.rowBlock,
|
|
19
|
+
{ backgroundColor: c.optionBg, borderColor: c.optionBorder, borderRadius: c.optionRadius },
|
|
20
|
+
], children: [(0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [
|
|
21
|
+
styles.rowLabel,
|
|
22
|
+
{ color: c.textPrimary, fontSize: c.fontSizeLabel, fontFamily: c.fontFamily },
|
|
23
|
+
isRtl && styles.rtlText,
|
|
24
|
+
], children: r.text || r.id }), safeCols.map((col, i) => {
|
|
25
|
+
const key = (0, MatrixCell_1.columnKey)(col, i);
|
|
26
|
+
return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.cell, children: [(0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [
|
|
27
|
+
styles.cellLabel,
|
|
28
|
+
{ color: c.textMuted, fontSize: c.fontSizeSmall, fontFamily: c.fontFamily },
|
|
29
|
+
isRtl && styles.rtlText,
|
|
30
|
+
], children: (0, MatrixCell_1.columnLabel)(col, i) }), (0, jsx_runtime_1.jsx)(MatrixCell_1.MatrixCell, { column: col, value: answers[r.id]?.[key], onChange: (v) => setCell(r.id, key, v), contract: c, isRtl: isRtl })] }, key));
|
|
31
|
+
})] }, r.id))) }));
|
|
32
|
+
}
|
|
33
|
+
const styles = react_native_1.StyleSheet.create({
|
|
34
|
+
container: { marginVertical: 8, gap: 10 },
|
|
35
|
+
rowBlock: { padding: 12, borderWidth: 1, gap: 8 },
|
|
36
|
+
rowLabel: { fontWeight: '600', marginBottom: 2 },
|
|
37
|
+
cell: { gap: 2 },
|
|
38
|
+
cellLabel: { fontWeight: '500' },
|
|
39
|
+
rtlText: { textAlign: 'right', writingDirection: 'rtl' },
|
|
40
|
+
});
|
|
41
|
+
exports.default = MatrixDropdownQuestion;
|
|
42
|
+
//# sourceMappingURL=MatrixDropdownQuestion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MatrixDropdownQuestion.js","sourceRoot":"","sources":["../../../src/survey/questions/MatrixDropdownQuestion.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type SurveyStyleContract } from '../styleContract';
|
|
2
|
+
import { type CellColumn } from './MatrixCell';
|
|
3
|
+
/**
|
|
4
|
+
* MatrixDynamicQuestion — mobile parity for the web MatrixDynamicRenderer.
|
|
5
|
+
*
|
|
6
|
+
* Repeating rows the respondent adds and removes ("list every product you
|
|
7
|
+
* bought"), each row sharing the same column definitions.
|
|
8
|
+
*
|
|
9
|
+
* Answer shape is IDENTICAL to web (`matrixRenderers.tsx`): an ARRAY of row
|
|
10
|
+
* objects, `Record<columnKey, cellValue>[]`, seeded to `minRowCount` empty rows
|
|
11
|
+
* so a survey requiring two rows shows two to fill in from the start.
|
|
12
|
+
*/
|
|
13
|
+
interface Props {
|
|
14
|
+
columns: CellColumn[];
|
|
15
|
+
value: Record<string, unknown>[] | null;
|
|
16
|
+
onChange: (value: Record<string, unknown>[]) => void;
|
|
17
|
+
minRowCount?: number;
|
|
18
|
+
maxRowCount?: number;
|
|
19
|
+
addRowLabel?: string;
|
|
20
|
+
removeRowLabel?: string;
|
|
21
|
+
contract?: SurveyStyleContract;
|
|
22
|
+
isRtl?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare function MatrixDynamicQuestion({ columns, value, onChange, minRowCount, maxRowCount, addRowLabel, removeRowLabel, contract, isRtl, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
export default MatrixDynamicQuestion;
|
|
26
|
+
//# sourceMappingURL=MatrixDynamicQuestion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MatrixDynamicQuestion.d.ts","sourceRoot":"","sources":["../../../src/survey/questions/MatrixDynamicQuestion.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAsC,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnF;;;;;;;;;GASG;AAEH,UAAU,KAAK;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC;IACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,qBAAqB,CAAC,EACpC,OAAO,EAAE,KAAK,EAAE,QAAQ,EACxB,WAAe,EAAE,WAAW,EAAE,WAAuB,EAAE,cAAyB,EAChF,QAAQ,EAAE,KAAK,GAChB,EAAE,KAAK,2CA0FP;eAiBc,qBAAqB"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MatrixDynamicQuestion = MatrixDynamicQuestion;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_native_1 = require("react-native");
|
|
6
|
+
const styleContract_1 = require("../styleContract");
|
|
7
|
+
const MatrixCell_1 = require("./MatrixCell");
|
|
8
|
+
function MatrixDynamicQuestion({ columns, value, onChange, minRowCount = 0, maxRowCount, addRowLabel = 'Add row', removeRowLabel = 'Remove', contract, isRtl, }) {
|
|
9
|
+
const c = contract ?? styleContract_1.DARK_CONTRACT;
|
|
10
|
+
const safeCols = Array.isArray(columns) ? columns : [];
|
|
11
|
+
const stored = Array.isArray(value) ? value : [];
|
|
12
|
+
// Seed to the minimum for display without writing it back until the
|
|
13
|
+
// respondent actually types — same as web.
|
|
14
|
+
const rows = stored.length < minRowCount
|
|
15
|
+
? [...stored, ...Array.from({ length: minRowCount - stored.length }, () => ({}))]
|
|
16
|
+
: stored;
|
|
17
|
+
const canAdd = maxRowCount === undefined || rows.length < maxRowCount;
|
|
18
|
+
const canRemove = rows.length > minRowCount;
|
|
19
|
+
const setCell = (rowIndex, colKey, cellValue) => {
|
|
20
|
+
const next = rows.map((r, i) => (i === rowIndex ? { ...r, [colKey]: cellValue } : r));
|
|
21
|
+
onChange(next);
|
|
22
|
+
};
|
|
23
|
+
const addRow = () => onChange([...rows, {}]);
|
|
24
|
+
const removeRow = (i) => onChange(rows.filter((_, j) => j !== i));
|
|
25
|
+
return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.container, children: [rows.map((row, ri) => ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: [
|
|
26
|
+
styles.rowBlock,
|
|
27
|
+
{ backgroundColor: c.optionBg, borderColor: c.optionBorder, borderRadius: c.optionRadius },
|
|
28
|
+
], children: [(0, jsx_runtime_1.jsxs)(react_native_1.View, { style: [styles.rowHead, isRtl && styles.rtlRow], children: [(0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [styles.rowIndex, { color: c.textMuted, fontSize: c.fontSizeSmall }], children: ri + 1 }), canRemove && ((0, jsx_runtime_1.jsx)(react_native_1.TouchableOpacity, { onPress: () => removeRow(ri), accessibilityRole: "button", accessibilityLabel: `${removeRowLabel} ${ri + 1}`, style: [styles.removeBtn, { borderColor: c.inputErrorBorder }], children: (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [styles.removeText, { color: c.errorText, fontSize: c.fontSizeSmall }], children: removeRowLabel }) }))] }), safeCols.map((col, i) => {
|
|
29
|
+
const key = (0, MatrixCell_1.columnKey)(col, i);
|
|
30
|
+
return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.cell, children: [(0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [
|
|
31
|
+
styles.cellLabel,
|
|
32
|
+
{ color: c.textMuted, fontSize: c.fontSizeSmall, fontFamily: c.fontFamily },
|
|
33
|
+
isRtl && styles.rtlText,
|
|
34
|
+
], children: (0, MatrixCell_1.columnLabel)(col, i) }), (0, jsx_runtime_1.jsx)(MatrixCell_1.MatrixCell, { column: col, value: row[key], onChange: (v) => setCell(ri, key, v), contract: c, isRtl: isRtl })] }, key));
|
|
35
|
+
})] }, ri))), canAdd && ((0, jsx_runtime_1.jsx)(react_native_1.TouchableOpacity, { onPress: addRow, accessibilityRole: "button", accessibilityLabel: addRowLabel, style: [styles.addBtn, { borderColor: c.accent, borderRadius: c.buttonRadius }], children: (0, jsx_runtime_1.jsxs)(react_native_1.Text, { style: [styles.addText, { color: c.accent, fontSize: c.fontSizeLabel }], children: ["+ ", addRowLabel] }) }))] }));
|
|
36
|
+
}
|
|
37
|
+
const styles = react_native_1.StyleSheet.create({
|
|
38
|
+
container: { marginVertical: 8, gap: 10 },
|
|
39
|
+
rowBlock: { padding: 12, borderWidth: 1, gap: 8 },
|
|
40
|
+
rowHead: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' },
|
|
41
|
+
rtlRow: { flexDirection: 'row-reverse' },
|
|
42
|
+
rowIndex: { fontWeight: '700' },
|
|
43
|
+
removeBtn: { paddingVertical: 4, paddingHorizontal: 10, borderWidth: 1, borderRadius: 6 },
|
|
44
|
+
removeText: { fontWeight: '600' },
|
|
45
|
+
cell: { gap: 2 },
|
|
46
|
+
cellLabel: { fontWeight: '500' },
|
|
47
|
+
rtlText: { textAlign: 'right', writingDirection: 'rtl' },
|
|
48
|
+
addBtn: { paddingVertical: 10, borderWidth: 1, borderStyle: 'dashed', alignItems: 'center' },
|
|
49
|
+
addText: { fontWeight: '600' },
|
|
50
|
+
});
|
|
51
|
+
exports.default = MatrixDynamicQuestion;
|
|
52
|
+
//# sourceMappingURL=MatrixDynamicQuestion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MatrixDynamicQuestion.js","sourceRoot":"","sources":["../../../src/survey/questions/MatrixDynamicQuestion.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type SurveyStyleContract } from '../styleContract';
|
|
2
|
+
/**
|
|
3
|
+
* MatrixQuestion — mobile parity for the web MatrixRenderer.
|
|
4
|
+
*
|
|
5
|
+
* Previously fell through to "please complete on desktop". The stated reason was
|
|
6
|
+
* that a multi-column grid doesn't fit a phone — which is true of the GRID, not
|
|
7
|
+
* of the question. So this renders the same data as a stacked list: one block
|
|
8
|
+
* per row, its columns as choice chips underneath. No horizontal scrolling, no
|
|
9
|
+
* 40px touch targets.
|
|
10
|
+
*
|
|
11
|
+
* Answer shape is IDENTICAL to web (`matrixRenderers.tsx` MatrixRenderer):
|
|
12
|
+
* `Record<rowId, columnValue>`. A mobile response is therefore indistinguishable
|
|
13
|
+
* from a web one downstream — which is the whole point of closing this gap.
|
|
14
|
+
*
|
|
15
|
+
* Uses only React Native primitives, so no new peer dependency and the install
|
|
16
|
+
* guide stays sufficient.
|
|
17
|
+
*/
|
|
18
|
+
interface MatrixRow {
|
|
19
|
+
id: string;
|
|
20
|
+
text?: string;
|
|
21
|
+
}
|
|
22
|
+
interface MatrixCol {
|
|
23
|
+
value: unknown;
|
|
24
|
+
label?: string;
|
|
25
|
+
text?: string;
|
|
26
|
+
}
|
|
27
|
+
interface Props {
|
|
28
|
+
rows: MatrixRow[];
|
|
29
|
+
columns: MatrixCol[];
|
|
30
|
+
/** Record<rowId, columnValue> — same as web. */
|
|
31
|
+
value: Record<string, unknown> | null;
|
|
32
|
+
onChange: (value: Record<string, unknown>) => void;
|
|
33
|
+
contract?: SurveyStyleContract;
|
|
34
|
+
isRtl?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare function MatrixQuestion({ rows, columns, value, onChange, contract, isRtl }: Props): import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
export default MatrixQuestion;
|
|
38
|
+
//# sourceMappingURL=MatrixQuestion.d.ts.map
|