diff x/static/js/3614.af493134.chunk.js.map @ 125:49f3d3878413 draft

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse2 commit 5ea1f9c1eef1de76232e69aa6d34cda77d90d566
author fubar
date Sat, 05 Oct 2024 23:58:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/x/static/js/3614.af493134.chunk.js.map	Sat Oct 05 23:58:05 2024 +0000
@@ -0,0 +1,1 @@
+{"version":3,"file":"static/js/3614.af493134.chunk.js","mappings":"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","sources":["../../../plugins/config/src/ConfigurationEditorWidget/components/StringArrayEditor.tsx","../../../plugins/config/src/ConfigurationEditorWidget/components/CallbackEditor.tsx","../../../plugins/config/src/ConfigurationEditorWidget/components/ColorEditor.tsx","../../../plugins/config/src/ConfigurationEditorWidget/components/StringArrayMapEditor.tsx","../../../plugins/config/src/ConfigurationEditorWidget/components/ConfigurationTextField.tsx","../../../plugins/config/src/ConfigurationEditorWidget/components/NumberEditor.tsx","../../../plugins/config/src/ConfigurationEditorWidget/components/NumberMapEditor.tsx","../../../plugins/config/src/ConfigurationEditorWidget/components/BooleanEditor.tsx","../../../plugins/config/src/ConfigurationEditorWidget/components/useSlotEditorStyles.ts","../../../plugins/config/src/ConfigurationEditorWidget/components/SlotEditor.tsx","../../../plugins/config/src/ConfigurationEditorWidget/components/TypeSelector.tsx","../../../plugins/config/src/ConfigurationEditorWidget/components/ConfigurationEditor.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport { observer } from 'mobx-react'\n\nimport {\n  Button,\n  FormHelperText,\n  IconButton,\n  InputAdornment,\n  InputLabel,\n  List,\n  ListItem,\n  TextField,\n} from '@mui/material'\n\n// icons\nimport DeleteIcon from '@mui/icons-material/Delete'\n\nconst StringArrayEditor = observer(function ({\n  slot,\n}: {\n  slot: {\n    name: string\n    value: string[]\n    setAtIndex: (arg: number, arg2: string) => void\n    removeAtIndex: (arg: number) => void\n    add: (arg: string) => void\n    description: string\n  }\n}) {\n  const [value, setValue] = useState('')\n  const [addNew, setAddNew] = useState(false)\n  return (\n    <>\n      {slot.name ? <InputLabel>{slot.name}</InputLabel> : null}\n      <List disablePadding>\n        {slot.value.map((val, idx) => (\n          <ListItem key={`${JSON.stringify(val)}-${idx}`} disableGutters>\n            <TextField\n              value={val}\n              onChange={evt => {\n                slot.setAtIndex(idx, evt.target.value)\n              }}\n              InputProps={{\n                endAdornment: (\n                  <InputAdornment position=\"end\">\n                    <IconButton\n                      onClick={() => {\n                        slot.removeAtIndex(idx)\n                      }}\n                    >\n                      <DeleteIcon />\n                    </IconButton>\n                  </InputAdornment>\n                ),\n              }}\n            />\n          </ListItem>\n        ))}\n\n        {addNew ? (\n          <ListItem disableGutters>\n            <TextField\n              value={value}\n              placeholder=\"add new\"\n              onChange={event => {\n                setValue(event.target.value)\n              }}\n              InputProps={{\n                endAdornment: (\n                  <InputAdornment position=\"end\">\n                    <>\n                      <Button\n                        color=\"primary\"\n                        variant=\"contained\"\n                        style={{ margin: 2 }}\n                        data-testid={`stringArrayAdd-${slot.name}`}\n                        onClick={() => {\n                          setAddNew(false)\n                          slot.add(value)\n                          setValue('')\n                        }}\n                      >\n                        OK\n                      </Button>\n                      <Button\n                        color=\"primary\"\n                        variant=\"contained\"\n                        style={{ margin: 2 }}\n                        onClick={() => {\n                          setAddNew(false)\n                          setValue('')\n                        }}\n                      >\n                        Cancel\n                      </Button>\n                    </>\n                  </InputAdornment>\n                ),\n              }}\n            />\n          </ListItem>\n        ) : null}\n        <Button\n          color=\"primary\"\n          variant=\"contained\"\n          style={{ margin: 4 }}\n          disabled={addNew}\n          onClick={() => {\n            setAddNew(true)\n          }}\n        >\n          Add item\n        </Button>\n      </List>\n      <FormHelperText>{slot.description}</FormHelperText>\n    </>\n  )\n})\n\nexport default StringArrayEditor\n","import React, { useEffect, useState } from 'react'\nimport { Tooltip, IconButton, TextField } from '@mui/material'\nimport { useDebounce } from '@jbrowse/core/util'\nimport { stringToJexlExpression } from '@jbrowse/core/util/jexlStrings'\nimport { getEnv } from 'mobx-state-tree'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\n\n// icons\nimport HelpIcon from '@mui/icons-material/Help'\n\n// Optimize by using system default fonts:\n// https://css-tricks.com/snippets/css/font-stacks/\nconst fontFamily =\n  'Consolas, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", Monaco, \"Courier New\", Courier, monospace'\n\nconst useStyles = makeStyles()(theme => ({\n  callbackEditor: {\n    marginTop: '16px',\n    borderBottom: `1px solid ${theme.palette.divider}`,\n    width: '100%',\n    fontFamily,\n  },\n  textAreaFont: {\n    fontFamily,\n  },\n  callbackContainer: {\n    width: '100%',\n    overflowX: 'auto',\n  },\n\n  error: {\n    color: 'red',\n    fontSize: '0.8em',\n  },\n}))\n\nconst CallbackEditor = observer(function ({\n  slot,\n}: {\n  slot: {\n    set: (arg: string) => void\n    description: string\n    name: string\n    value: string\n    contextVariable: string\n  }\n}) {\n  const { classes } = useStyles()\n\n  const [code, setCode] = useState(slot.value)\n  const [error, setCodeError] = useState<unknown>()\n  const debouncedCode = useDebounce(code, 400)\n\n  useEffect(() => {\n    try {\n      const jexlDebouncedCode = debouncedCode.startsWith('jexl:')\n        ? debouncedCode\n        : `jexl:${debouncedCode}`\n\n      if (jexlDebouncedCode === 'jexl:') {\n        throw new Error('Empty jexl expression is not valid')\n      }\n      stringToJexlExpression(\n        jexlDebouncedCode,\n        getEnv(slot).pluginManager?.jexl,\n      )\n      slot.set(jexlDebouncedCode)\n      setCodeError(undefined)\n    } catch (e) {\n      console.error({ e })\n      setCodeError(e)\n    }\n  }, [debouncedCode, slot])\n\n  // if default value is a callback, will have to remove jexl:\n  // do this last\n  return (\n    <>\n      {error ? <p className={classes.error}>{`${error}`}</p> : null}\n      <div className={classes.callbackContainer}>\n        <TextField\n          multiline\n          className={classes.callbackEditor}\n          value={code.startsWith('jexl:') ? code.split('jexl:')[1] : code}\n          onChange={event => {\n            setCode(event.target.value)\n          }}\n          style={{ background: error ? '#fdd' : undefined }}\n          InputProps={{\n            classes: {\n              input: classes.textAreaFont,\n            },\n          }}\n        />\n\n        <p>{slot.description}</p>\n        <Tooltip\n          title={\n            <div>\n              Callbacks are written in Jexl format. Click to learn more.\n              <br /> Names of available context items: {slot.contextVariable}\n            </div>\n          }\n          arrow\n        >\n          <IconButton\n            color=\"primary\"\n            onClick={() => {\n              const newWindow = window.open(\n                'https://github.com/TomFrost/Jexl',\n                '_blank',\n                'noopener,noreferrer',\n              )\n              if (newWindow) {\n                newWindow.opener = null\n              }\n            }}\n          >\n            <HelpIcon />\n          </IconButton>\n        </Tooltip>\n      </div>\n    </>\n  )\n})\n\nexport default CallbackEditor\n","import React, { useState } from 'react'\nimport { observer } from 'mobx-react'\nimport { TextField } from '@mui/material'\nimport ColorPicker from '@jbrowse/core/ui/ColorPicker'\n\nexport const ColorSlot = (props: {\n  value: string\n  label?: string\n  TextFieldProps?: {\n    helperText: string\n    fullWidth: boolean\n  }\n  onChange: (arg: string) => void\n}) => {\n  const { value = '#000', label = '', TextFieldProps = {}, onChange } = props\n  const [displayed, setDisplayed] = useState(false)\n\n  return (\n    <div style={{ display: 'flex' }}>\n      <TextField\n        value={value}\n        label={label}\n        onClick={() => {\n          setDisplayed(!displayed)\n        }}\n        onChange={event => {\n          onChange(event.target.value)\n        }}\n        {...TextFieldProps}\n      />\n      <div style={{ marginTop: 10 }}>\n        <React.Suspense fallback={null}>\n          <ColorPicker\n            color={value}\n            onChange={event => {\n              onChange(event)\n            }}\n          />\n        </React.Suspense>\n      </div>\n    </div>\n  )\n}\n\nconst ColorEditor = observer(function (props: {\n  slot: {\n    name: string\n    value: string\n    description: string\n    set: (arg: string) => void\n  }\n}) {\n  const { slot } = props\n  return (\n    <ColorSlot\n      label={slot.name}\n      value={slot.value}\n      onChange={color => {\n        slot.set(color)\n      }}\n      TextFieldProps={{\n        helperText: slot.description,\n        fullWidth: true,\n      }}\n    />\n  )\n})\n\nexport default ColorEditor\n","import React, { useState } from 'react'\nimport { observer } from 'mobx-react'\n\nimport {\n  Card,\n  CardContent,\n  CardHeader,\n  FormHelperText,\n  IconButton,\n  InputAdornment,\n  InputLabel,\n  TextField,\n} from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\n\n// icons\nimport DeleteIcon from '@mui/icons-material/Delete'\nimport AddIcon from '@mui/icons-material/Add'\n\n// locals\nimport StringArrayEditor from './StringArrayEditor'\n\nconst useStyles = makeStyles()(theme => ({\n  card: {\n    marginTop: theme.spacing(1),\n  },\n}))\n\nconst StringArrayMapEditor = observer(function ({\n  slot,\n}: {\n  slot: {\n    name: string\n    value: Map<string, string[]>\n    remove: (key: string) => void\n    add: (key: string, val: string[]) => void\n    description: string\n    setAtKeyIndex: (key: string, idx: number, val: string) => void\n    removeAtKeyIndex: (key: string, idx: number) => void\n    addToKey: (key: string, val: string) => void\n  }\n}) {\n  const { classes } = useStyles()\n  const [value, setValue] = useState('')\n  return (\n    <>\n      <InputLabel>{slot.name}</InputLabel>\n      {[...slot.value].map(([key, val]) => (\n        <Card raised key={key} className={classes.card}>\n          <CardHeader\n            title={key}\n            action={\n              <IconButton\n                onClick={() => {\n                  slot.remove(key)\n                }}\n              >\n                <DeleteIcon />\n              </IconButton>\n            }\n          />\n          <CardContent>\n            <StringArrayEditor\n              slot={{\n                name: slot.name,\n                value: val,\n                description: `Values associated with entry ${key}`,\n                setAtIndex: (idx: number, val: string) => {\n                  slot.setAtKeyIndex(key, idx, val)\n                },\n                removeAtIndex: (idx: number) => {\n                  slot.removeAtKeyIndex(key, idx)\n                },\n                add: (val: string) => {\n                  slot.addToKey(key, val)\n                },\n              }}\n            />\n          </CardContent>\n        </Card>\n      ))}\n      <Card raised className={classes.card}>\n        <CardHeader\n          disableTypography\n          title={\n            <TextField\n              fullWidth\n              value={value}\n              placeholder=\"add new\"\n              onChange={event => {\n                setValue(event.target.value)\n              }}\n              InputProps={{\n                endAdornment: (\n                  <InputAdornment position=\"end\">\n                    <IconButton\n                      disabled={value === ''}\n                      onClick={() => {\n                        slot.add(value, [])\n                        setValue('')\n                      }}\n                    >\n                      <AddIcon />\n                    </IconButton>\n                  </InputAdornment>\n                ),\n              }}\n            />\n          }\n        />\n      </Card>\n      <FormHelperText>{slot.description}</FormHelperText>\n    </>\n  )\n})\n\nexport default StringArrayMapEditor\n","import React from 'react'\nimport { TextField, TextFieldProps } from '@mui/material'\nimport { SanitizedHTML } from '@jbrowse/core/ui'\n\n// adds ability to have html in helperText. note that FormHelperTextProps is\n// div because the default is p which does not like div children\nexport default function ConfigurationTextField(\n  props: { helperText?: string } & TextFieldProps,\n) {\n  const { helperText } = props\n  return (\n    <TextField\n      {...props}\n      helperText={<SanitizedHTML html={helperText || ''} />}\n      FormHelperTextProps={{\n        component: 'div',\n      }}\n      fullWidth\n    />\n  )\n}\n","import React, { useEffect, useState } from 'react'\nimport { observer } from 'mobx-react'\nimport ConfigurationTextField from './ConfigurationTextField'\n\nconst NumberEditor = observer(function ({\n  slot,\n}: {\n  slot: {\n    name?: string\n    value: string\n    description?: string\n    set: (val: number) => void\n    reset?: () => void\n  }\n}) {\n  const [val, setVal] = useState(slot.value)\n  useEffect(() => {\n    const num = Number.parseFloat(val)\n    if (Number.isNaN(num)) {\n      slot.reset?.()\n    } else {\n      slot.set(num)\n    }\n  }, [slot, val])\n  return (\n    <ConfigurationTextField\n      label={slot.name}\n      helperText={slot.description}\n      value={val}\n      type=\"number\"\n      onChange={evt => {\n        setVal(evt.target.value)\n      }}\n    />\n  )\n})\n\nexport default NumberEditor\n","import React, { useState } from 'react'\nimport { observer } from 'mobx-react'\n\nimport {\n  Card,\n  CardContent,\n  CardHeader,\n  FormHelperText,\n  IconButton,\n  InputAdornment,\n  InputLabel,\n  TextField,\n} from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\n\n// icons\nimport DeleteIcon from '@mui/icons-material/Delete'\nimport AddIcon from '@mui/icons-material/Add'\nimport NumberEditor from './NumberEditor'\n\nconst useStyles = makeStyles()(theme => ({\n  card: {\n    marginTop: theme.spacing(1),\n  },\n}))\n\nconst NumberMapEditor = observer(function ({\n  slot,\n}: {\n  slot: {\n    name: string\n    value: Map<string, string>\n    remove: (key: string) => void\n    add: (key: string, val: number) => void\n    description: string\n  }\n}) {\n  const { classes } = useStyles()\n  const [value, setValue] = useState('')\n  return (\n    <>\n      <InputLabel>{slot.name}</InputLabel>\n      {[...slot.value].map(([key, val]) => (\n        <Card raised key={key} className={classes.card}>\n          <CardHeader\n            title={key}\n            action={\n              <IconButton\n                onClick={() => {\n                  slot.remove(key)\n                }}\n              >\n                <DeleteIcon />\n              </IconButton>\n            }\n          />\n          <CardContent>\n            <NumberEditor\n              slot={{\n                value: val,\n                set: (val: number) => {\n                  slot.add(key, val)\n                },\n              }}\n            />\n          </CardContent>\n        </Card>\n      ))}\n      <Card raised className={classes.card}>\n        <CardHeader\n          disableTypography\n          title={\n            <TextField\n              fullWidth\n              value={value}\n              placeholder=\"add new\"\n              onChange={event => {\n                setValue(event.target.value)\n              }}\n              InputProps={{\n                endAdornment: (\n                  <InputAdornment position=\"end\">\n                    <IconButton\n                      disabled={value === ''}\n                      onClick={() => {\n                        slot.add(value, 0)\n                        setValue('')\n                      }}\n                    >\n                      <AddIcon />\n                    </IconButton>\n                  </InputAdornment>\n                ),\n              }}\n            />\n          }\n        />\n      </Card>\n      <FormHelperText>{slot.description}</FormHelperText>\n    </>\n  )\n})\n\nexport default NumberMapEditor\n","import React from 'react'\nimport { observer } from 'mobx-react'\n\nimport {\n  Checkbox,\n  FormControl,\n  FormControlLabel,\n  FormHelperText,\n} from '@mui/material'\n\nconst BooleanEditor = observer(function ({\n  slot,\n}: {\n  slot: {\n    name: string\n    value: boolean\n    set: (arg: boolean) => void\n    description: string\n  }\n}) {\n  return (\n    <FormControl>\n      <FormControlLabel\n        label={slot.name}\n        control={\n          <Checkbox\n            checked={slot.value}\n            onChange={evt => {\n              slot.set(evt.target.checked)\n            }}\n          />\n        }\n      />\n      <FormHelperText>{slot.description}</FormHelperText>\n    </FormControl>\n  )\n})\n\nexport default BooleanEditor\n","import { makeStyles } from 'tss-react/mui'\n\nexport const useSlotEditorStyles = makeStyles()(theme => ({\n  paper: {\n    display: 'flex',\n    marginBottom: theme.spacing(2),\n    position: 'relative',\n  },\n  paperContent: {\n    width: '100%',\n  },\n  slotModeSwitch: {\n    width: 24,\n    background: theme.palette.secondary.light,\n    display: 'flex',\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n}))\n","import React, { useEffect, useState } from 'react'\nimport { observer } from 'mobx-react'\nimport { getPropertyMembers, IAnyType } from 'mobx-state-tree'\nimport { getEnv, FileLocation } from '@jbrowse/core/util'\nimport { FileSelector } from '@jbrowse/core/ui'\nimport {\n  getSubType,\n  getUnionSubTypes,\n  ILiteralType,\n} from '@jbrowse/core/util/mst-reflection'\nimport { IconButton, MenuItem, Paper, SvgIcon, TextField } from '@mui/material'\n\n// icons\nimport RadioButtonUncheckedIcon from '@mui/icons-material/RadioButtonUnchecked'\n\n// locals\nimport StringArrayEditor from './StringArrayEditor'\nimport CallbackEditor from './CallbackEditor'\nimport ColorEditor from './ColorEditor'\nimport JsonEditor from './JsonEditor'\nimport StringArrayMapEditor from './StringArrayMapEditor'\nimport ConfigurationTextField from './ConfigurationTextField'\nimport NumberMapEditor from './NumberMapEditor'\nimport NumberEditor from './NumberEditor'\nimport BooleanEditor from './BooleanEditor'\nimport {\n  AnyConfigurationSlot,\n  AnyConfigurationSlotType,\n} from '@jbrowse/core/configuration'\nimport { useSlotEditorStyles } from './useSlotEditorStyles'\n\nconst StringEditor = observer(function ({\n  slot,\n}: {\n  slot: {\n    name: string\n    description: string\n    value: string\n    set: (arg: string) => void\n  }\n}) {\n  return (\n    <ConfigurationTextField\n      label={slot.name}\n      helperText={slot.description}\n      value={slot.value}\n      onChange={evt => {\n        slot.set(evt.target.value)\n      }}\n    />\n  )\n})\n\nconst TextEditor = observer(function ({\n  slot,\n}: {\n  slot: {\n    name: string\n    description: string\n    value: string\n    set: (arg: string) => void\n  }\n}) {\n  return (\n    <TextField\n      label={slot.name}\n      helperText={slot.description}\n      multiline\n      value={slot.value}\n      onChange={evt => {\n        slot.set(evt.target.value)\n      }}\n    />\n  )\n})\n\n// checked checkbox, looks like a styled (x)\nconst SvgCheckbox = () => (\n  <SvgIcon>\n    <path d=\"M20.41,3C21.8,5.71 22.35,8.84 22,12C21.8,15.16 20.7,18.29 18.83,21L17.3,20C18.91,17.57 19.85,14.8 20,12C20.34,9.2 19.89,6.43 18.7,4L20.41,3M5.17,3L6.7,4C5.09,6.43 4.15,9.2 4,12C3.66,14.8 4.12,17.57 5.3,20L3.61,21C2.21,18.29 1.65,15.17 2,12C2.2,8.84 3.3,5.71 5.17,3M12.08,10.68L14.4,7.45H16.93L13.15,12.45L15.35,17.37H13.09L11.71,14L9.28,17.33H6.76L10.66,12.21L8.53,7.45H10.8L12.08,10.68Z\" />\n  </SvgIcon>\n)\n\nconst IntegerEditor = observer(function ({\n  slot,\n}: {\n  slot: {\n    name: string\n    value: string\n    description: string\n    set: (num: number) => void\n  }\n}) {\n  const [val, setVal] = useState(slot.value)\n  useEffect(() => {\n    const num = Number.parseInt(val, 10)\n    if (!Number.isNaN(num)) {\n      slot.set(num)\n    }\n  }, [slot, val])\n  return (\n    <ConfigurationTextField\n      label={slot.name}\n      helperText={slot.description}\n      value={val}\n      type=\"number\"\n      onChange={evt => {\n        setVal(evt.target.value)\n      }}\n    />\n  )\n})\n\nconst StringEnumEditor = observer(function ({\n  slot,\n  slotSchema,\n}: {\n  slot: AnyConfigurationSlot\n  slotSchema: AnyConfigurationSlotType\n}) {\n  const p = getPropertyMembers(getSubType(slotSchema))\n  const choices = getUnionSubTypes(\n    getUnionSubTypes(getSubType(p.properties.value!))[1]!,\n  ).map(t => (t as ILiteralType<string>).value)\n\n  return (\n    <ConfigurationTextField\n      value={slot.value}\n      label={slot.name}\n      select\n      helperText={slot.description}\n      onChange={evt => {\n        slot.set(evt.target.value)\n      }}\n    >\n      {choices.map(str => (\n        <MenuItem key={str} value={str}>\n          {str}\n        </MenuItem>\n      ))}\n    </ConfigurationTextField>\n  )\n})\n\nconst FileSelectorWrapper = observer(function ({\n  slot,\n}: {\n  slot: {\n    name: string\n    value: FileLocation\n    set: (arg: FileLocation) => void\n    description: string\n  }\n}) {\n  return (\n    <FileSelector\n      location={slot.value}\n      setLocation={location => {\n        slot.set(location)\n      }}\n      name={slot.name}\n      description={slot.description}\n      // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n      rootModel={getEnv(slot).pluginManager?.rootModel}\n    />\n  )\n})\n\nconst valueComponents = {\n  string: StringEditor,\n  text: TextEditor,\n  fileLocation: FileSelectorWrapper,\n  stringArray: StringArrayEditor,\n  stringArrayMap: StringArrayMapEditor,\n  numberMap: NumberMapEditor,\n  number: NumberEditor,\n  integer: IntegerEditor,\n  color: ColorEditor,\n  stringEnum: StringEnumEditor,\n  boolean: BooleanEditor,\n  frozen: JsonEditor,\n  configRelationships: JsonEditor,\n}\n\nconst SlotEditor = observer(function ({\n  slot,\n  slotSchema,\n}: {\n  slot: any\n  slotSchema: IAnyType\n}) {\n  const { classes } = useSlotEditorStyles()\n  const { type } = slot\n  let ValueComponent = slot.isCallback\n    ? CallbackEditor\n    : // @ts-expect-error\n      valueComponents[type]\n  if (!ValueComponent) {\n    console.warn(`no slot editor defined for ${type}, editing as string`)\n    ValueComponent = StringEditor\n  }\n  if (!(type in valueComponents)) {\n    console.warn(`SlotEditor needs to implement ${type}`)\n  }\n  return (\n    <Paper className={classes.paper}>\n      <div className={classes.paperContent}>\n        <ValueComponent slot={slot} slotSchema={slotSchema} />\n      </div>\n      <div className={classes.slotModeSwitch}>\n        {slot.contextVariable.length ? (\n          <IconButton\n            onClick={() =>\n              slot.isCallback ? slot.convertToValue() : slot.convertToCallback()\n            }\n            title={`convert to ${\n              slot.isCallback ? 'regular value' : 'callback'\n            }`}\n          >\n            {slot.isCallback ? <SvgCheckbox /> : <RadioButtonUncheckedIcon />}\n          </IconButton>\n        ) : null}\n      </div>\n    </Paper>\n  )\n})\n\nexport default SlotEditor\n","import React from 'react'\nimport { MenuItem, Paper, TextField } from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { AnyConfigurationModel } from '@jbrowse/core/configuration'\nimport { useSlotEditorStyles } from './useSlotEditorStyles'\n\nconst TypeSelector = observer(function ({\n  typeNameChoices,\n  slot,\n  slotName,\n  onChange,\n}: {\n  typeNameChoices: string[]\n  slot: AnyConfigurationModel\n  slotName: string\n  onChange: (event: React.ChangeEvent<HTMLInputElement>) => void\n}) {\n  const { classes } = useSlotEditorStyles()\n  return (\n    <Paper className={classes.paper}>\n      <div className={classes.paperContent}>\n        <TextField\n          value={slot.type}\n          label=\"Type\"\n          select\n          helperText={`Type of ${slotName} to use`}\n          fullWidth\n          onChange={onChange}\n        >\n          {typeNameChoices.map(str => (\n            <MenuItem key={str} value={str}>\n              {str}\n            </MenuItem>\n          ))}\n        </TextField>\n      </div>\n    </Paper>\n  )\n})\n\nexport default TypeSelector\n","import React from 'react'\n\nimport {\n  FormGroup,\n  Accordion,\n  AccordionDetails,\n  AccordionSummary,\n  Typography,\n} from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\nimport { getMembers, IAnyType } from 'mobx-state-tree'\nimport { singular } from 'pluralize'\n\n// jbrowse\nimport { AbstractSessionModel } from '@jbrowse/core/util'\nimport SanitizedHTML from '@jbrowse/core/ui/SanitizedHTML'\nimport {\n  readConfObject,\n  getTypeNamesFromExplicitlyTypedUnion,\n  isConfigurationSchemaType,\n  isConfigurationSlotType,\n  AnyConfigurationModel,\n} from '@jbrowse/core/configuration'\n\n// icons\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore'\n\n// locals\nimport SlotEditor from './SlotEditor'\nimport TypeSelector from './TypeSelector'\n\nconst useStyles = makeStyles()(theme => ({\n  icon: {\n    color: theme.palette.tertiary.contrastText || '#fff',\n  },\n  expansionPanelDetails: {\n    display: 'block',\n    padding: theme.spacing(1),\n  },\n  accordion: {\n    border: `1px solid ${theme.palette.text.primary}`,\n  },\n  noOverflow: {\n    width: '100%',\n    overflowX: 'auto',\n  },\n}))\n\nconst Member = observer(function (props: {\n  slotName: string\n  slotSchema: IAnyType\n  schema: AnyConfigurationModel\n  slot?: AnyConfigurationModel | AnyConfigurationModel[]\n  path?: string[]\n}) {\n  const { classes } = useStyles()\n  const {\n    slotName,\n    slotSchema,\n    schema,\n    slot = schema[slotName],\n    path = [],\n  } = props\n  if (isConfigurationSchemaType(slotSchema)) {\n    if (slot.length) {\n      return slot.map((subslot: AnyConfigurationModel, slotIndex: number) => {\n        const key = subslot.type\n          ? `${singular(slotName)} ${subslot.type}`\n          : `${singular(slotName)} ${slotIndex + 1}`\n        return <Member key={key} {...props} slot={subslot} slotName={key} />\n      })\n    }\n    // if this is an explicitly typed schema, make a type-selecting dropdown\n    // that can be used to change its type\n    const typeNameChoices = getTypeNamesFromExplicitlyTypedUnion(slotSchema)\n    return (\n      <Accordion defaultExpanded className={classes.accordion}>\n        <AccordionSummary\n          expandIcon={<ExpandMoreIcon className={classes.icon} />}\n        >\n          <Typography>{[...path, slotName].join('➔')}</Typography>\n        </AccordionSummary>\n        <AccordionDetails className={classes.expansionPanelDetails}>\n          {typeNameChoices.length ? (\n            <TypeSelector\n              typeNameChoices={typeNameChoices}\n              slotName={slotName}\n              slot={slot}\n              onChange={evt => {\n                if (evt.target.value !== slot.type) {\n                  schema.setSubschema(slotName, { type: evt.target.value })\n                }\n              }}\n            />\n          ) : null}\n          <FormGroup className={classes.noOverflow}>\n            <Schema schema={slot} path={[...path, slotName]} />\n          </FormGroup>\n        </AccordionDetails>\n      </Accordion>\n    )\n  } else if (isConfigurationSlotType(slotSchema)) {\n    return <SlotEditor key={slotName} slot={slot} slotSchema={slotSchema} />\n  } else {\n    return null\n  }\n})\n\nconst Schema = observer(function ({\n  schema,\n  path = [],\n}: {\n  schema: AnyConfigurationModel\n  path?: string[]\n}) {\n  const properties = getMembers(schema).properties\n  return (\n    <>\n      {Object.entries(properties).map(([slotName, slotSchema]) => (\n        <Member\n          key={slotName}\n          slotName={slotName}\n          slotSchema={slotSchema}\n          path={path}\n          schema={schema}\n        />\n      ))}\n    </>\n  )\n})\n\nconst ConfigurationEditor = observer(function ({\n  model,\n}: {\n  model: { target: AnyConfigurationModel }\n  session?: AbstractSessionModel\n}) {\n  const { classes } = useStyles()\n  // key forces a re-render, otherwise the same field can end up being used for\n  // different tracks since only the backing model changes for example see pr\n  // #804\n  const { target } = model\n  const key = readConfObject(target, 'trackId')\n  const name = readConfObject(target, 'name')\n  return (\n    <Accordion key={key} defaultExpanded className={classes.accordion}>\n      <AccordionSummary\n        expandIcon={<ExpandMoreIcon className={classes.icon} />}\n      >\n        <Typography>\n          <SanitizedHTML html={name ?? 'Configuration'} />\n        </Typography>\n      </AccordionSummary>\n      <AccordionDetails\n        className={classes.expansionPanelDetails}\n        data-testid=\"configEditor\"\n      >\n        <Schema schema={target} />\n      </AccordionDetails>\n    </Accordion>\n  )\n})\n\nexport default ConfigurationEditor\n"],"names":["observer","slot","value","setValue","useState","addNew","setAddNew","React","name","InputLabel","List","disablePadding","map","val","idx","ListItem","key","JSON","stringify","disableGutters","TextField","onChange","evt","setAtIndex","target","InputProps","endAdornment","InputAdornment","position","IconButton","onClick","removeAtIndex","DeleteIcon","placeholder","event","Button","color","variant","style","margin","add","disabled","FormHelperText","description","fontFamily","useStyles","makeStyles","theme","callbackEditor","marginTop","borderBottom","palette","divider","width","textAreaFont","callbackContainer","overflowX","error","fontSize","classes","code","setCode","setCodeError","debouncedCode","useDebounce","useEffect","jexlDebouncedCode","startsWith","Error","stringToJexlExpression","getEnv","pluginManager","jexl","set","undefined","e","console","className","multiline","split","background","input","Tooltip","title","contextVariable","arrow","newWindow","window","open","opener","HelpIcon","ColorSlot","props","label","TextFieldProps","displayed","setDisplayed","display","_extends","fallback","ColorPicker","helperText","fullWidth","card","spacing","Card","raised","CardHeader","action","remove","CardContent","StringArrayEditor","setAtKeyIndex","removeAtKeyIndex","addToKey","disableTypography","AddIcon","ConfigurationTextField","SanitizedHTML","html","FormHelperTextProps","component","setVal","num","Number","parseFloat","isNaN","reset","type","NumberEditor","FormControl","FormControlLabel","control","Checkbox","checked","useSlotEditorStyles","paper","marginBottom","paperContent","slotModeSwitch","secondary","light","justifyContent","alignItems","StringEditor","TextEditor","SvgCheckbox","SvgIcon","d","IntegerEditor","parseInt","StringEnumEditor","slotSchema","p","getPropertyMembers","getSubType","choices","getUnionSubTypes","properties","t","select","str","MenuItem","FileSelectorWrapper","FileSelector","location","setLocation","rootModel","valueComponents","string","text","fileLocation","stringArray","stringArrayMap","StringArrayMapEditor","numberMap","NumberMapEditor","number","integer","ColorEditor","stringEnum","boolean","BooleanEditor","frozen","JsonEditor","configRelationships","ValueComponent","isCallback","CallbackEditor","warn","Paper","length","convertToValue","convertToCallback","RadioButtonUncheckedIcon","typeNameChoices","slotName","icon","tertiary","contrastText","expansionPanelDetails","padding","accordion","border","primary","noOverflow","Member","schema","path","isConfigurationSchemaType","subslot","slotIndex","singular","getTypeNamesFromExplicitlyTypedUnion","Accordion","defaultExpanded","AccordionSummary","expandIcon","ExpandMoreIcon","Typography","join","AccordionDetails","TypeSelector","setSubschema","FormGroup","Schema","isConfigurationSlotType","SlotEditor","getMembers","Object","entries","model","readConfObject"],"sourceRoot":""}
\ No newline at end of file