diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/Events/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/Events/index.js
new file mode 100644
index 0000000000..ac8ab76af2
--- /dev/null
+++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/Events/index.js
@@ -0,0 +1,266 @@
+import * as React from 'react';
+import PropTypes from 'prop-types';
+
+import { useFormikContext } from 'formik';
+import { useIntl } from 'react-intl';
+import styled from 'styled-components';
+import upperFirst from 'lodash/upperFirst';
+import { FieldLabel, Flex, Typography, BaseCheckbox, Checkbox } from '@strapi/design-system';
+
+import { useModels } from '../../../../../../../hooks';
+
+export const formatValue = (value) =>
+ value.reduce((acc, curr) => {
+ const key = curr.split('.')[0];
+
+ if (!acc[key]) {
+ acc[key] = [];
+ }
+ acc[key].push(curr);
+
+ return acc;
+ }, {});
+
+const StyledTable = styled.table`
+ td {
+ height: ${52 / 16}rem;
+ width: 10%;
+ vertical-align: middle;
+ text-align: center;
+ }
+
+ tbody tr:nth-child(odd) {
+ background: ${({ theme }) => theme.colors.neutral100};
+ }
+
+ tbody tr td:first-child {
+ padding-left: ${({ theme }) => theme.spaces[7]};
+ }
+`;
+
+const getHeaders = (isDraftAndPublish) => {
+ if (isDraftAndPublish) {
+ return [
+ { id: 'Settings.webhooks.events.create', defaultMessage: 'Create' },
+ { id: 'Settings.webhooks.events.update', defaultMessage: 'Update' },
+ { id: 'app.utils.delete', defaultMessage: 'Delete' },
+ { id: 'app.utils.publish', defaultMessage: 'Publish' },
+ { id: 'app.utils.unpublish', defaultMessage: 'Unpublish' },
+ ];
+ }
+
+ return [
+ { id: 'Settings.webhooks.events.create', defaultMessage: 'Create' },
+ { id: 'Settings.webhooks.events.update', defaultMessage: 'Update' },
+ { id: 'app.utils.delete', defaultMessage: 'Delete' },
+ ];
+};
+
+const getEvents = (isDraftAndPublish) => {
+ if (isDraftAndPublish) {
+ return {
+ entry: ['entry.create', 'entry.update', 'entry.delete', 'entry.publish', 'entry.unpublish'],
+ media: ['media.create', 'media.update', 'media.delete'],
+ };
+ }
+
+ return {
+ entry: ['entry.create', 'entry.update', 'entry.delete'],
+ media: ['media.create', 'media.update', 'media.delete'],
+ };
+};
+
+const Root = (props) => {
+ const { formatMessage } = useIntl();
+ const { collectionTypes } = useModels();
+
+ const isDraftAndPublish = React.useMemo(
+ () => collectionTypes.some((ct) => ct.options.draftAndPublish === true),
+ [collectionTypes]
+ );
+
+ return (
+
+
+
+ );
+};
+
+Headers.propTypes = {
+ isDraftAndPublish: PropTypes.bool.isRequired,
+};
+
+const Body = ({ isDraftAndPublish }) => {
+ const events = getEvents(isDraftAndPublish);
+ const { values, handleChange: onChange } = useFormikContext();
+
+ const inputName = 'events';
+ const inputValue = values.events;
+ const disabledEvents = [];
+
+ const formattedValue = formatValue(inputValue);
+
+ const handleChange = ({ target: { name, value } }) => {
+ let set = new Set(inputValue);
+
+ if (value) {
+ set.add(name);
+ } else {
+ set.delete(name);
+ }
+ onChange({ target: { name: inputName, value: Array.from(set) } });
+ };
+
+ const handleChangeAll = ({ target: { name, value } }) => {
+ let set = new Set(inputValue);
+
+ if (value) {
+ events[name].forEach((event) => {
+ if (!disabledEvents.includes(event)) {
+ set.add(event);
+ }
+ });
+ } else {
+ events[name].forEach((event) => set.delete(event));
+ }
+ onChange({ target: { name: inputName, value: Array.from(set) } });
+ };
+
+ return (
+
+ {headers.map((header) => {
+ if (header.id === 'app.utils.publish' || header.id === 'app.utils.unpublish') {
+ return (
+
+
+ );
+ }
+
+ return (
+
+
+ );
+ })}
+