import { Link, router } from '@inertiajs/react'; import { useState } from 'react'; import { Frame, card, input, button } from '@/pages/investment/shared'; import { profileJson, ProfileValidationError } from '@/lib/profile-json'; import { createOperationKey } from '@/lib/operation-key'; import { experimentDifferences, mergeExperimentValues, type ExperimentView, } from '@/lib/product-experiments'; import { usageValue } from '@/lib/product-usage'; export default function ExperimentPage(props: ExperimentView) { return ( ); } function Editor(props: ExperimentView) { const [values, setValues] = useState(props.values); const [base, setBase] = useState(props.values); const [editedKeys, setEditedKeys] = useState([]); const [referenceDocument, setReferenceDocument] = useState(props.document); const [catalogue, setCatalogue] = useState(props.catalogue); const [version, setVersion] = useState( props.document?.version ?? props.currentVersion, ); const [operation, setOperation] = useState(createOperationKey); const [reason, setReason] = useState(''); const [busy, setBusy] = useState(false); const [message, setMessage] = useState(''); const [errors, setErrors] = useState>({}); const [current, setCurrent] = useState(null); const [resolved, setResolved] = useState([]); const [confirmPlan, setConfirmPlan] = useState(false); const [confirmObservation, setConfirmObservation] = useState(false); const [refreshIndicator, setRefreshIndicator] = useState(false); const [attachReport, setAttachReport] = useState(false); const [removeReport, setRemoveReport] = useState(false); const readonly = props.historical || !props.installed; const document = referenceDocument; const differences = current ? experimentDifferences( base, values, current.values, editedKeys, ).filter((k) => !resolved.includes(k)) : []; const planComplete = !['draft', 'cancelled'].includes(values.state); const showObservation = ['observing', 'reviewed'].includes(values.state) || [ 'observed_from', 'observed_to', 'control_result', 'variant_result', 'result', 'decision', ].some((k) => values[k]); const frozenIndicator = document?.indicator?.id === values.indicator_id && !refreshIndicator ? document.indicator : null; const selectedIndicator = frozenIndicator ?? catalogue.items.find((m) => m.id === values.indicator_id); function change(key: string, value: string) { setEditedKeys((keys) => (keys.includes(key) ? keys : [...keys, key])); setValues((v) => ({ ...v, [key]: value })); } function field(key: string, required = false, type = 'textarea') { const error = errors['values.' + key]; return (