{"version":3,"file":"DataLinksInlineEditorBase.cjs","sources":["../../../../../src/components/DataLinks/DataLinksInlineEditor/DataLinksInlineEditorBase.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { DragDropContext, Droppable, DropResult } from '@hello-pangea/dnd';\nimport { cloneDeep } from 'lodash';\nimport { useEffect, useState } from 'react';\n\nimport { Action, DataFrame, DataLink, GrafanaTheme2 } from '@grafana/data';\nimport { t } from '@grafana/i18n';\n\nimport { useStyles2 } from '../../../themes/ThemeContext';\nimport { Button } from '../../Button/Button';\nimport { Modal } from '../../Modal/Modal';\n\nimport { DataLinksListItemBase } from './DataLinksListItemBase';\n\nexport interface DataLinksInlineEditorBaseProps<T extends DataLink | Action> {\n  type: 'link' | 'action';\n  items?: T[];\n  onChange: (items: T[]) => void;\n  data: DataFrame[];\n  children: (\n    item: T,\n    index: number,\n    onSave: (index: number, item: T) => void,\n    onCancel: (index: number) => void\n  ) => React.ReactNode;\n}\n\n/** @internal */\nexport function DataLinksInlineEditorBase<T extends DataLink | Action>({\n  type,\n  items,\n  onChange,\n  data,\n  children,\n}: DataLinksInlineEditorBaseProps<T>) {\n  const [editIndex, setEditIndex] = useState<number | null>(null);\n  const [isNew, setIsNew] = useState(false);\n\n  const [itemsSafe, setItemsSafe] = useState<T[]>([]);\n\n  useEffect(() => {\n    setItemsSafe(items ?? []);\n  }, [items]);\n\n  const styles = useStyles2(getDataLinksInlineEditorStyles);\n  const isEditing = editIndex !== null;\n\n  const _onChange = (index: number, item: T) => {\n    if (isNew) {\n      const title = item.title;\n      // @ts-ignore - https://github.com/microsoft/TypeScript/issues/27808\n      const url = item.url ?? item.fetch?.url ?? '';\n\n      if (title.trim() === '' && url.trim() === '') {\n        setIsNew(false);\n        setEditIndex(null);\n        return;\n      } else {\n        setEditIndex(null);\n        setIsNew(false);\n      }\n    }\n\n    if (item.oneClick === true) {\n      itemsSafe.forEach((item) => {\n        if (item.oneClick) {\n          item.oneClick = false;\n        }\n      });\n    }\n\n    const update = cloneDeep(itemsSafe);\n    update[index] = item;\n    onChange(update);\n    setEditIndex(null);\n  };\n\n  const _onCancel = (index: number) => {\n    if (isNew) {\n      setIsNew(false);\n    }\n    setEditIndex(null);\n  };\n\n  const onDataLinkAdd = () => {\n    let update = cloneDeep(itemsSafe);\n    setEditIndex(update.length);\n    setIsNew(true);\n  };\n\n  const onDataLinkRemove = (index: number) => {\n    const update = cloneDeep(itemsSafe);\n    update.splice(index, 1);\n    onChange(update);\n  };\n\n  const onDragEnd = (result: DropResult) => {\n    if (items == null || result.destination == null) {\n      return;\n    }\n\n    const update = cloneDeep(itemsSafe);\n    const link = update[result.source.index];\n\n    update.splice(result.source.index, 1);\n    update.splice(result.destination.index, 0, link);\n\n    setItemsSafe(update);\n    onChange(update);\n  };\n\n  const getItemText = (action: 'edit' | 'add') => {\n    let text = '';\n    switch (type) {\n      case 'link':\n        text =\n          action === 'edit'\n            ? t('grafana-ui.data-links-inline-editor.edit-link', 'Edit link')\n            : t('grafana-ui.data-links-inline-editor.add-link', 'Add link');\n        break;\n      case 'action':\n        text =\n          action === 'edit'\n            ? t('grafana-ui.action-editor.inline.edit-action', 'Edit action')\n            : t('grafana-ui.action-editor.inline.add-action', 'Add action');\n        break;\n    }\n\n    return text;\n  };\n\n  return (\n    <div className={styles.container}>\n      <DragDropContext onDragEnd={onDragEnd}>\n        <Droppable droppableId=\"sortable-links\" direction=\"vertical\">\n          {(provided) => (\n            <div className={styles.wrapper} ref={provided.innerRef} {...provided.droppableProps}>\n              {itemsSafe.map((item, idx) => {\n                const key = `${item.title}/${idx}`;\n                return (\n                  <DataLinksListItemBase<T>\n                    key={key}\n                    index={idx}\n                    item={item}\n                    onChange={_onChange}\n                    onEdit={() => setEditIndex(idx)}\n                    onRemove={() => onDataLinkRemove(idx)}\n                    data={data}\n                    itemKey={key}\n                  />\n                );\n              })}\n              {provided.placeholder}\n            </div>\n          )}\n        </Droppable>\n      </DragDropContext>\n\n      {isEditing && editIndex !== null && (\n        <Modal\n          title={getItemText(isNew ? 'add' : 'edit')}\n          isOpen={true}\n          closeOnBackdropClick={false}\n          onDismiss={() => {\n            _onCancel(editIndex);\n          }}\n        >\n          {children(itemsSafe[editIndex], editIndex, _onChange, _onCancel)}\n        </Modal>\n      )}\n\n      <Button size=\"sm\" icon=\"plus\" onClick={onDataLinkAdd} variant=\"secondary\" className={styles.button}>\n        {getItemText('add')}\n      </Button>\n    </div>\n  );\n}\n\nconst getDataLinksInlineEditorStyles = (theme: GrafanaTheme2) => ({\n  container: css({\n    position: 'relative',\n  }),\n  wrapper: css({\n    marginBottom: theme.spacing(2),\n    display: 'flex',\n    flexDirection: 'column',\n  }),\n  button: css({\n    marginLeft: theme.spacing(1),\n  }),\n});\n"],"names":["useState","useEffect","useStyles2","item","cloneDeep","t","jsxs","jsx","DragDropContext","Droppable","DataLinksListItemBase","Modal","Button","css"],"mappings":"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"}