refactor: Webhooks (#12487)

Closes #12303

### What’s Changed
- Replace auto‐save with explicit Save / Cancel
Webhook forms now use manual “Save” and “Cancel” buttons instead of the
old debounced auto‐save/update.

- Separate “New” and “Detail” routes
Two dedicated paths `/settings/webhooks/new` for creation and
/`settings/webhooks/:webhookId` for editing, making the UX clearer.

- URL hint & normalization
If a user omits the http(s):// scheme, we display a “Will be saved as
https://…” hint and automatically default to HTTPS.

- Centralized validation with Zod
Introduced a `webhookFormSchema` for client‐side URL, operations, and
secret validation.

- Storybook coverage
Added stories for both “New Webhook” and “Webhook Detail”

- Unit tests
Added tests for the new `useWebhookForm` hook
This commit is contained in:
nitin
2025-06-13 11:07:25 +05:30
committed by GitHub
parent b160871227
commit 3d57c90e04
89 changed files with 3465 additions and 1679 deletions

View File

@ -454,8 +454,8 @@ msgstr "전체 ({relationRecordsCount})"
#. js-lingui-id: 9ljU00
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
msgid "All Actions"
msgstr "모든 작업"
#~ msgid "All Actions"
#~ msgstr "모든 작업"
#. js-lingui-id: 7EZqN0
#: src/modules/settings/accounts/components/SettingsAccountsRowDropdownMenu.tsx
@ -469,8 +469,8 @@ msgstr "모든 줄"
#. js-lingui-id: aFE/OW
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
msgid "All Objects"
msgstr "모든 개체"
#~ msgid "All Objects"
#~ msgstr "모든 개체"
#. js-lingui-id: Hm90t3
#: src/modules/settings/roles/components/SettingsRolesList.tsx
@ -513,7 +513,7 @@ msgid "An error occurred while updating password"
msgstr "비밀번호 업데이트 중 오류가 발생했습니다"
#. js-lingui-id: mJ6m4C
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "An optional description"
msgstr "선택적 설명"
@ -922,8 +922,8 @@ msgstr "중국어 - 번체"
#. js-lingui-id: JEFFOR
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
msgid "Choose an object"
msgstr "개체 선택"
#~ msgid "Choose an object"
#~ msgstr "개체 선택"
#. js-lingui-id: Qz73jD
#: src/modules/settings/security/components/SSO/SettingsSSOIdentitiesProvidersForm.tsx
@ -1315,8 +1315,8 @@ msgstr "워크스페이스 만들기"
#. js-lingui-id: d+F6q9
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
msgid "Created"
msgstr "생성됨"
#~ msgid "Created"
#~ msgstr "생성됨"
#. js-lingui-id: R3PLzn
#: src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownCurrencySelect.tsx
@ -1385,11 +1385,11 @@ msgid "Czech"
msgstr "체코어"
#. js-lingui-id: Zz6Cxn
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/modules/settings/profile/components/DeleteWorkspace.tsx
#: src/modules/settings/profile/components/DeleteAccount.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Danger zone"
msgstr "위험 구역"
@ -1526,12 +1526,13 @@ msgid "Define what will be visible to other users in your workspace"
msgstr "워크스페이스에서 다른 사용자에게 표시될 내용을 정의합니다"
#. js-lingui-id: cnGeoo
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/modules/views/view-picker/components/ViewPickerOptionDropdown.tsx
#: src/modules/views/view-picker/components/ViewPickerCreateButton.tsx
#: src/modules/settings/security/components/SSO/SettingsSecuritySSORowDropdownMenu.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/action-menu/mock/action-menu-actions.mock.tsx
#: src/modules/action-menu/mock/action-menu-actions.mock.tsx
@ -1585,19 +1586,22 @@ msgid "Delete Records on All Objects"
msgstr ""
#. js-lingui-id: T6S2Ns
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
msgid "Delete this integration"
msgstr "이 통합 삭제"
#. js-lingui-id: KSOhjo
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "Delete this webhook"
msgstr ""
#. js-lingui-id: aRG49z
#: src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownMenuContent.tsx
msgid "Delete view"
msgstr "보기 삭제"
#. js-lingui-id: snMaH4
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "Delete webhook"
msgstr "Webhook 삭제"
@ -1624,8 +1628,8 @@ msgstr "전체 워크스페이스 삭제"
#. js-lingui-id: vGjmyl
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
msgid "Deleted"
msgstr "삭제됨"
#~ msgid "Deleted"
#~ msgstr "삭제됨"
#. js-lingui-id: kcGoDz
#: src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownMenuContent.tsx
@ -1659,10 +1663,10 @@ msgid "Descending"
msgstr "내림차순"
#. js-lingui-id: Nu4oKW
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/pages/settings/data-model/SettingsObjectFieldEdit.tsx
#: src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldConfigure.tsx
#: src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsTableHeader.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "Description"
msgstr "설명"
@ -1950,7 +1954,7 @@ msgid "Empty Object"
msgstr "빈 객체"
#. js-lingui-id: T3juzf
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "Endpoint URL"
msgstr "엔드포인트 URL"
@ -2329,7 +2333,7 @@ msgid "Filter"
msgstr "필터"
#. js-lingui-id: cSev+j
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "Filters"
msgstr "필터"
@ -2613,6 +2617,11 @@ msgstr "앱에서 사용자를 식별하는 방법입니다."
msgid "How your system is doing"
msgstr "시스템 상태"
#. js-lingui-id: 0yRnXS
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "https://example.com/webhook"
msgstr ""
#. js-lingui-id: mkWad2
#: src/pages/settings/profile/appearance/components/LocalePicker.tsx
msgid "Hungarian"
@ -3361,6 +3370,7 @@ msgstr "이전 워크플로로 이동"
#. js-lingui-id: isRobC
#: src/pages/settings/data-model/SettingsNewObject.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "New"
msgstr "새로운"
@ -3745,10 +3755,15 @@ msgstr "열림"
msgid "Opportunities"
msgstr ""
#. js-lingui-id: hY8F2i
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "Optional secret used to compute the HMAC signature for webhook payloads"
msgstr ""
#. js-lingui-id: qNELak
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
msgid "Optional: Define a secret string that we will include in every webhook. Use this to authenticate and verify the webhook upon receipt."
msgstr "선택 사항: 모든 Webhook에 포함시킬 비밀 문자열을 정의하십시오. 이를 사용하여 Webhook 수신 시 인증하고 검증하십시오."
#~ msgid "Optional: Define a secret string that we will include in every webhook. Use this to authenticate and verify the webhook upon receipt."
#~ msgstr "선택 사항: 모든 Webhook에 포함시킬 비밀 문자열을 정의하십시오. 이를 사용하여 Webhook 수신 시 인증하고 검증하십시오."
#. js-lingui-id: 0zpgxV
#: src/modules/settings/roles/components/SettingsRolesDefaultRole.tsx
@ -3912,8 +3927,8 @@ msgstr "플레이그라운드"
#. js-lingui-id: jEw0Mr
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
msgid "Please enter a valid URL"
msgstr "유효한 URL을 입력하세요"
#~ msgid "Please enter a valid URL"
#~ msgstr "유효한 URL을 입력하세요"
#. js-lingui-id: X5x85V
#: src/modules/settings/admin-panel/components/SettingsAdminWorkspaceContent.tsx
@ -3925,10 +3940,15 @@ msgstr "먼저 사용자를 검색하세요"
msgid "Please type \"{confirmationValue}\" to confirm you want to delete this API Key. Be aware that any script using this key will stop working."
msgstr "\"{confirmationValue}\"을 입력하여 이 API 키를 삭제할 것인지 확인하세요. 이 키를 사용하는 모든 스크립트는 작동이 중지됩니다."
#. js-lingui-id: GbtYRD
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "Please type \"yes\" to confirm you want to delete this webhook."
msgstr ""
#. js-lingui-id: mFZTXr
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
msgid "Please type {confirmationText} to confirm you want to delete this webhook."
msgstr "{confirmationText}을 입력하여 이 Webhook을 삭제할 것인지 확인하세요."
#~ msgid "Please type {confirmationText} to confirm you want to delete this webhook."
#~ msgstr "{confirmationText}을 입력하여 이 Webhook을 삭제할 것인지 확인하세요."
#. js-lingui-id: aRWD63
#: src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldConfigure.tsx
@ -4364,10 +4384,15 @@ msgid "Seats"
msgstr ""
#. js-lingui-id: 8VEDbV
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "Secret"
msgstr "비밀"
#. js-lingui-id: e1v+J3
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "Secret (optional)"
msgstr ""
#. js-lingui-id: a3LDKx
#: src/pages/settings/security/SettingsSecuritySSOIdentifyProvider.tsx
#: src/pages/settings/security/SettingsSecurityApprovedAccessDomain.tsx
@ -4502,7 +4527,7 @@ msgid "Select the default value for this boolean field"
msgstr "이 boolean 필드의 기본값 선택"
#. js-lingui-id: xraglu
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "Select the events you wish to send to this endpoint"
msgstr "이 엔드포인트로 보내려는 이벤트를 선택하세요"
@ -5266,8 +5291,8 @@ msgstr ""
#. js-lingui-id: +b7T3G
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
msgid "Updated"
msgstr "업데이트됨"
#~ msgid "Updated"
#~ msgstr "업데이트됨"
#. js-lingui-id: ONWvwQ
#: src/modules/ui/input/components/ImageInput.tsx
@ -5296,8 +5321,8 @@ msgstr "연결 정보가 포함된 XML 파일을 업로드하세요"
#. js-lingui-id: IagCbF
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
msgid "URL"
msgstr "URL"
#~ msgid "URL"
#~ msgstr "URL"
#. js-lingui-id: 6dMpmz
#: src/modules/action-menu/actions/record-actions/constants/WorkflowVersionsActionsConfig.tsx
@ -5508,7 +5533,7 @@ msgid "We support your square PNGs, JPEGs and GIFs under 10MB"
msgstr "10MB 미만의 정사각형 PNG, JPEG 및 GIF를 지원합니다"
#. js-lingui-id: ZS7vYp
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "We will send POST requests to this endpoint for every new event"
msgstr "모든 새로운 이벤트에 대해 이 엔드포인트로 POST 요청을 보냅니다"
@ -5526,8 +5551,8 @@ msgstr "도메인 소유권을 확인하기 위해 링크를 보내드립니다"
#: src/pages/settings/developers/webhooks/components/SettingsWebhooks.tsx
#: src/pages/settings/developers/webhooks/components/SettingsWebhooks.tsx
#: src/pages/settings/developers/webhooks/components/SettingsWebhooks.tsx
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "Webhooks"
msgstr "Webhooks"
@ -5551,6 +5576,11 @@ msgstr "API 키 만료일."
msgid "When the key will be disabled"
msgstr "키 비활성화 시기"
#. js-lingui-id: RfrIUU
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#~ msgid "Will be saved as:"
#~ msgstr ""
#. js-lingui-id: wvyffT
#: src/modules/workflow/components/RecordShowPageWorkflowHeader.tsx
#~ msgid "Workflow cannot be tested"
@ -5576,7 +5606,6 @@ msgstr "키 비활성화 시기"
#: src/pages/settings/security/SettingsSecurity.tsx
#: src/pages/settings/integrations/SettingsIntegrations.tsx
#: src/pages/settings/developers/webhooks/components/SettingsWebhooks.tsx
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/pages/settings/developers/playground/SettingsRestPlayground.tsx
#: src/pages/settings/developers/playground/SettingsGraphQLPlayground.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx
@ -5592,6 +5621,7 @@ msgstr "키 비활성화 시기"
#: src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsSection.tsx
#: src/modules/settings/roles/components/SettingsRolesContainer.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/favorites/components/WorkspaceFavorites.tsx
msgid "Workspace"
msgstr "워크스페이스"
@ -5632,8 +5662,8 @@ msgid "Wrap on record pages"
msgstr "레코드 페이지에 래핑"
#. js-lingui-id: Q9pNST
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/modules/settings/roles/role-settings/components/SettingsRoleSettings.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectAboutForm.tsx
#: src/modules/settings/data-model/fields/forms/components/SettingsDataModelFieldDescriptionForm.tsx
msgid "Write a description"
@ -5641,8 +5671,8 @@ msgstr "설명을 작성하세요"
#. js-lingui-id: L80fMJ
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
msgid "Write a secret"
msgstr "비밀 작성"
#~ msgid "Write a secret"
#~ msgstr "비밀 작성"
#. js-lingui-id: zkWmBh
#: src/modules/billing/components/SettingsBillingSubscriptionInfo.tsx
@ -5650,8 +5680,9 @@ msgid "Yearly"
msgstr ""
#. js-lingui-id: 3d1wCB
#: src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
msgid "yes"
msgstr "예"