From 5bd97b655481a323d7dfbcc7f7cd71f807fbae76 Mon Sep 17 00:00:00 2001 From: tdgao Date: Thu, 22 Oct 2026 12:28:14 -0600 Subject: [PATCH 1/2] feat: add field error message for invalid custom license name --- .../[type]/[project]/settings/license.vue | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/apps/frontend/src/pages/[type]/[project]/settings/license.vue b/apps/frontend/src/pages/[type]/[project]/settings/license.vue index cfd9defa90b..05fbd0005cd 100644 --- a/apps/frontend/src/pages/[type]/[project]/settings/license.vue +++ b/apps/frontend/src/pages/[type]/[project]/settings/license.vue @@ -303,6 +303,11 @@ const messages = defineMessages({ id: 'project.settings.license.custom-name-required', defaultMessage: 'Enter a name for your custom license.', }, + invalidName: { + id: 'project.settings.license.custom-name-invalid', + defaultMessage: + 'Custom license names can only contain letters, numbers, periods, and hyphens.', + }, missingUrl: { id: 'project.settings.license.missing-url', defaultMessage: 'Enter a URL to the full text of your custom license.', @@ -467,13 +472,20 @@ const saveValidation = useProjectSaveValidation(() => current.value) const missingCustomName = computed( () => current.value.license.friendly === 'Custom' && !current.value.license.short.trim(), ) +const invalidCustomName = computed( + () => + current.value.license.friendly === 'Custom' && + /[^a-zA-Z0-9.-]/.test(current.value.license.short.replaceAll(' ', '-')), +) const missingCustomUrl = computed( () => current.value.license.friendly === 'Custom' && !current.value.licenseUrl.trim(), ) const customNameMessage = computed(() => - project.value.status === 'processing' && missingCustomName.value - ? { severity: 'error' as const, message: messages.missingName } - : null, + invalidCustomName.value + ? { severity: 'error' as const, message: messages.invalidName } + : project.value.status === 'processing' && missingCustomName.value + ? { severity: 'error' as const, message: messages.missingName } + : null, ) const customUrlMessage = computed(() => project.value.status === 'processing' && missingCustomUrl.value @@ -484,6 +496,7 @@ const canSave = computed( () => hasPermission.value && !missingCustomName.value && + !invalidCustomName.value && !missingCustomUrl.value && !saveValidation.messages.value.some((message) => message.severity === 'error'), ) From 85d16d710ba059946828b09150fe34042ea7e592 Mon Sep 17 00:00:00 2001 From: tdgao Date: Thu, 22 Oct 2026 12:30:22 -0600 Subject: [PATCH 2/2] pnpm prepr --- apps/frontend/src/locales/en-US/index.json | 3 +++ apps/frontend/src/pages/[type]/[project]/settings/license.vue | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/locales/en-US/index.json b/apps/frontend/src/locales/en-US/index.json index b5861c4f591..d9704a2bf21 100644 --- a/apps/frontend/src/locales/en-US/index.json +++ b/apps/frontend/src/locales/en-US/index.json @@ -4490,6 +4490,9 @@ "project.settings.license.custom": { "message": "Custom" }, + "project.settings.license.custom-name-invalid": { + "message": "Custom license names can only contain letters, numbers, periods, and hyphens." + }, "project.settings.license.custom-name-required": { "message": "Enter a name for your custom license." }, diff --git a/apps/frontend/src/pages/[type]/[project]/settings/license.vue b/apps/frontend/src/pages/[type]/[project]/settings/license.vue index 05fbd0005cd..16e220fdb4c 100644 --- a/apps/frontend/src/pages/[type]/[project]/settings/license.vue +++ b/apps/frontend/src/pages/[type]/[project]/settings/license.vue @@ -305,8 +305,7 @@ const messages = defineMessages({ }, invalidName: { id: 'project.settings.license.custom-name-invalid', - defaultMessage: - 'Custom license names can only contain letters, numbers, periods, and hyphens.', + defaultMessage: 'Custom license names can only contain letters, numbers, periods, and hyphens.', }, missingUrl: { id: 'project.settings.license.missing-url',