automationListTable.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import styled from '@emotion/styled';
  2. import {Flex} from 'sentry/components/container/flex';
  3. import Panel from 'sentry/components/panels/panel';
  4. import PanelBody from 'sentry/components/panels/panelBody';
  5. import PanelHeader from 'sentry/components/panels/panelHeader';
  6. import {
  7. BulkActions,
  8. useBulkActions,
  9. } from 'sentry/components/workflowEngine/useBulkActions';
  10. import {t} from 'sentry/locale';
  11. import {space} from 'sentry/styles/space';
  12. import {
  13. type Automation,
  14. AutomationListRow,
  15. } from 'sentry/views/automations/components/automationListRow';
  16. type AutomationListTableProps = {
  17. automations: Automation[];
  18. };
  19. function AutomationListTable({automations}: AutomationListTableProps) {
  20. const {
  21. selectedRows,
  22. handleSelect,
  23. isSelectAllChecked,
  24. toggleSelectAll,
  25. bulkActionsVisible,
  26. canDelete,
  27. } = useBulkActions(automations);
  28. return (
  29. <Panel>
  30. <StyledPanelHeader>
  31. <BulkActions
  32. bulkActionsVisible={bulkActionsVisible}
  33. canDelete={canDelete}
  34. isSelectAllChecked={isSelectAllChecked}
  35. toggleSelectAll={toggleSelectAll}
  36. />
  37. <Flex className="last-triggered">
  38. <HeaderDivider />
  39. <Heading>{t('Last Triggered')}</Heading>
  40. </Flex>
  41. <Flex className="action">
  42. <HeaderDivider />
  43. <Heading>{t('Action')}</Heading>
  44. </Flex>
  45. <Flex className="connected-monitors">
  46. <HeaderDivider />
  47. <Heading>{t('Connected Monitors')}</Heading>
  48. </Flex>
  49. </StyledPanelHeader>
  50. <PanelBody>
  51. {automations.map(automation => (
  52. <AutomationListRow
  53. key={automation.id}
  54. actions={automation.actions}
  55. id={automation.id}
  56. lastTriggered={automation.lastTriggered}
  57. link={automation.link}
  58. monitors={automation.monitors}
  59. name={automation.name}
  60. project={automation.project}
  61. details={automation.details}
  62. handleSelect={handleSelect}
  63. selected={selectedRows.includes(automation.id)}
  64. disabled={automation.disabled}
  65. />
  66. ))}
  67. </PanelBody>
  68. </Panel>
  69. );
  70. }
  71. const HeaderDivider = styled('div')`
  72. background-color: ${p => p.theme.gray200};
  73. width: 1px;
  74. border-radius: ${p => p.theme.borderRadius};
  75. `;
  76. const Heading = styled('div')`
  77. display: flex;
  78. padding: 0 ${space(2)};
  79. color: ${p => p.theme.subText};
  80. align-items: center;
  81. `;
  82. const StyledPanelHeader = styled(PanelHeader)`
  83. justify-content: left;
  84. padding: ${space(0.75)} ${space(2)};
  85. min-height: 40px;
  86. align-items: center;
  87. display: grid;
  88. .last-triggered,
  89. .action,
  90. .connected-monitors {
  91. display: none;
  92. }
  93. @media (min-width: ${p => p.theme.breakpoints.xsmall}) {
  94. grid-template-columns: 2.5fr 1fr;
  95. .action {
  96. display: flex;
  97. }
  98. }
  99. @media (min-width: ${p => p.theme.breakpoints.small}) {
  100. grid-template-columns: 2.5fr 1fr 1fr;
  101. .last-triggered {
  102. display: flex;
  103. }
  104. }
  105. @media (min-width: ${p => p.theme.breakpoints.medium}) {
  106. grid-template-columns: 2.5fr 1fr 1fr 1fr;
  107. .connected-monitors {
  108. display: flex;
  109. }
  110. }
  111. @media (min-width: ${p => p.theme.breakpoints.large}) {
  112. grid-template-columns: 3fr 1fr 1fr 1fr;
  113. }
  114. `;
  115. export default AutomationListTable;