123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- import {forwardRef} from 'react';
- import styled from '@emotion/styled';
- import Button from 'sentry/components/button';
- import ConfirmDelete from 'sentry/components/confirmDelete';
- import TextOverflow from 'sentry/components/textOverflow';
- import {IconDelete, IconEdit} from 'sentry/icons';
- import {t} from 'sentry/locale';
- import space from 'sentry/styles/space';
- import {Rule} from './types';
- import {getRuleDescription} from './utils';
- type Props = {
- rules: Array<Rule>;
- disabled?: boolean;
- onDeleteRule?: (id: Rule['id']) => void;
- onEditRule?: (id: Rule['id']) => void;
- };
- const Rules = forwardRef(function RulesList(
- {rules, onEditRule, onDeleteRule, disabled}: Props,
- ref: React.Ref<HTMLUListElement>
- ) {
- return (
- <List ref={ref} isDisabled={disabled} data-test-id="advanced-data-scrubbing-rules">
- {rules.map(rule => {
- const {id} = rule;
- const ruleDescription = getRuleDescription(rule);
- return (
- <ListItem key={id}>
- <TextOverflow>{ruleDescription}</TextOverflow>
- {onEditRule && (
- <Button
- aria-label={t('Edit Rule')}
- size="sm"
- onClick={() => onEditRule(id)}
- icon={<IconEdit />}
- disabled={disabled}
- title={
- disabled ? t('You do not have permission to edit rules') : undefined
- }
- />
- )}
- {onDeleteRule && (
- <ConfirmDelete
- message={t('Are you sure you wish to delete this rule?')}
- priority="danger"
- onConfirm={() => onDeleteRule(id)}
- confirmInput={ruleDescription}
- disabled={disabled}
- stopPropagation
- >
- <Button
- aria-label={t('Delete Rule')}
- size="sm"
- icon={<IconDelete />}
- disabled={disabled}
- title={
- disabled ? t('You do not have permission to delete rules') : undefined
- }
- />
- </ConfirmDelete>
- )}
- </ListItem>
- );
- })}
- </List>
- );
- });
- export default Rules;
- const List = styled('ul')<{
- isDisabled?: boolean;
- }>`
- list-style: none;
- margin: 0;
- padding: 0;
- margin-bottom: 0 !important;
- ${p =>
- p.isDisabled &&
- `
- color: ${p.theme.gray200};
- background: ${p.theme.backgroundSecondary};
- `}
- `;
- const ListItem = styled('li')`
- display: grid;
- grid-template-columns: auto max-content max-content;
- grid-column-gap: ${space(1)};
- align-items: center;
- padding: ${space(1)} ${space(2)};
- border-bottom: 1px solid ${p => p.theme.border};
- &:hover {
- background-color: ${p => p.theme.backgroundSecondary};
- }
- &:last-child {
- border-bottom: 0;
- }
- `;
|