From daca907ab688dd7bf8fa217a747f16ca94f487e8 Mon Sep 17 00:00:00 2001 From: NorthRealm <155140859+NorthRealm@users.noreply.github.com> Date: Fri, 2 May 2025 23:33:35 +0800 Subject: [PATCH 01/10] update --- options/locale/locale_en-US.ini | 3 +++ routers/web/shared/secrets/secrets.go | 9 +++++++-- templates/shared/secrets/add_list.tmpl | 11 +++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index a8fabc9ca1014..f030a62334a39 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -3733,6 +3733,9 @@ deletion = Remove secret deletion.description = Removing a secret is permanent and cannot be undone. Continue? deletion.success = The secret has been removed. deletion.failed = Failed to remove secret. +edit = Edit secret +edit.success = The secret has been updated. +edit.failed = Failed to update secret. management = Secrets Management [actions] diff --git a/routers/web/shared/secrets/secrets.go b/routers/web/shared/secrets/secrets.go index c8b80ebb2638c..c23114c9ac931 100644 --- a/routers/web/shared/secrets/secrets.go +++ b/routers/web/shared/secrets/secrets.go @@ -29,14 +29,19 @@ func SetSecretsContext(ctx *context.Context, ownerID, repoID int64) { func PerformSecretsPost(ctx *context.Context, ownerID, repoID int64, redirectURL string) { form := web.GetForm(ctx).(*forms.AddSecretForm) - s, _, err := secret_service.CreateOrUpdateSecret(ctx, ownerID, repoID, form.Name, util.ReserveLineBreakForTextarea(form.Data), form.Description) + s, created, err := secret_service.CreateOrUpdateSecret(ctx, ownerID, repoID, form.Name, util.ReserveLineBreakForTextarea(form.Data), form.Description) if err != nil { log.Error("CreateOrUpdateSecret failed: %v", err) + // TODO: secrets.creation.failed and secrets.edit.failed? ctx.JSONError(ctx.Tr("secrets.creation.failed")) return } - ctx.Flash.Success(ctx.Tr("secrets.creation.success", s.Name)) + if created { + ctx.Flash.Success(ctx.Tr("secrets.creation.success", s.Name)) + } else { + ctx.Flash.Success(ctx.Tr("secrets.edit.success", s.Name)) + } ctx.JSONRedirect(redirectURL) } diff --git a/templates/shared/secrets/add_list.tmpl b/templates/shared/secrets/add_list.tmpl index 977f308b71ea3..96c5fbae72a5d 100644 --- a/templates/shared/secrets/add_list.tmpl +++ b/templates/shared/secrets/add_list.tmpl @@ -33,6 +33,17 @@ {{ctx.Locale.Tr "settings.added_on" (DateUtils.AbsoluteShort .CreatedUnix)}} + + {{svg "octicon-pencil"}} + Date: Sat, 3 May 2025 01:21:43 +0800 Subject: [PATCH 02/10] fix --- templates/shared/secrets/add_list.tmpl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/templates/shared/secrets/add_list.tmpl b/templates/shared/secrets/add_list.tmpl index 96c5fbae72a5d..ed3f41e39a505 100644 --- a/templates/shared/secrets/add_list.tmpl +++ b/templates/shared/secrets/add_list.tmpl @@ -5,6 +5,9 @@ data-modal="#add-secret-modal" data-modal-form.action="{{.Link}}" data-modal-header="{{ctx.Locale.Tr "secrets.creation"}}" + data-modal-secret-name.value="" + data-modal-secret-name.disabled="" + data-modal-secret-description="" > {{ctx.Locale.Tr "secrets.creation"}} From 913235061f9d01df253b6d0c88759f6d450c509c Mon Sep 17 00:00:00 2001 From: NorthRealm <155140859+NorthRealm@users.noreply.github.com> Date: Sat, 3 May 2025 01:21:43 +0800 Subject: [PATCH 03/10] fix --- templates/shared/secrets/add_list.tmpl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/templates/shared/secrets/add_list.tmpl b/templates/shared/secrets/add_list.tmpl index ed3f41e39a505..665344178d3ed 100644 --- a/templates/shared/secrets/add_list.tmpl +++ b/templates/shared/secrets/add_list.tmpl @@ -7,6 +7,7 @@ data-modal-header="{{ctx.Locale.Tr "secrets.creation"}}" data-modal-secret-name.value="" data-modal-secret-name.disabled="" + data-modal-secret-data="" data-modal-secret-description="" > {{ctx.Locale.Tr "secrets.creation"}} @@ -43,6 +44,7 @@ data-tooltip-content="{{ctx.Locale.Tr "secrets.edit"}}" data-modal-secret-name.value="{{.Name}}" data-modal-secret-name.disabled="true" + data-modal-secret-data="" data-modal-secret-description="{{if .Description}}{{.Description}}{{end}}" > {{svg "octicon-pencil"}} From d27757b9aa7617eea30ed8fe8513eabb01db2f29 Mon Sep 17 00:00:00 2001 From: NorthRealm <155140859+NorthRealm@users.noreply.github.com> Date: Sat, 3 May 2025 02:16:09 +0800 Subject: [PATCH 04/10] revert --- options/locale/locale_en-US.ini | 2 -- routers/web/shared/secrets/secrets.go | 9 ++------- templates/shared/secrets/add_list.tmpl | 4 +--- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index f030a62334a39..66e36e9b7c00b 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -3734,8 +3734,6 @@ deletion.description = Removing a secret is permanent and cannot be undone. Cont deletion.success = The secret has been removed. deletion.failed = Failed to remove secret. edit = Edit secret -edit.success = The secret has been updated. -edit.failed = Failed to update secret. management = Secrets Management [actions] diff --git a/routers/web/shared/secrets/secrets.go b/routers/web/shared/secrets/secrets.go index c23114c9ac931..c8b80ebb2638c 100644 --- a/routers/web/shared/secrets/secrets.go +++ b/routers/web/shared/secrets/secrets.go @@ -29,19 +29,14 @@ func SetSecretsContext(ctx *context.Context, ownerID, repoID int64) { func PerformSecretsPost(ctx *context.Context, ownerID, repoID int64, redirectURL string) { form := web.GetForm(ctx).(*forms.AddSecretForm) - s, created, err := secret_service.CreateOrUpdateSecret(ctx, ownerID, repoID, form.Name, util.ReserveLineBreakForTextarea(form.Data), form.Description) + s, _, err := secret_service.CreateOrUpdateSecret(ctx, ownerID, repoID, form.Name, util.ReserveLineBreakForTextarea(form.Data), form.Description) if err != nil { log.Error("CreateOrUpdateSecret failed: %v", err) - // TODO: secrets.creation.failed and secrets.edit.failed? ctx.JSONError(ctx.Tr("secrets.creation.failed")) return } - if created { - ctx.Flash.Success(ctx.Tr("secrets.creation.success", s.Name)) - } else { - ctx.Flash.Success(ctx.Tr("secrets.edit.success", s.Name)) - } + ctx.Flash.Success(ctx.Tr("secrets.creation.success", s.Name)) ctx.JSONRedirect(redirectURL) } diff --git a/templates/shared/secrets/add_list.tmpl b/templates/shared/secrets/add_list.tmpl index 665344178d3ed..c58cbfcd38582 100644 --- a/templates/shared/secrets/add_list.tmpl +++ b/templates/shared/secrets/add_list.tmpl @@ -6,7 +6,6 @@ data-modal-form.action="{{.Link}}" data-modal-header="{{ctx.Locale.Tr "secrets.creation"}}" data-modal-secret-name.value="" - data-modal-secret-name.disabled="" data-modal-secret-data="" data-modal-secret-description="" > @@ -40,10 +39,9 @@ From a8816a7afdcd0b877fa0579872aaa63a59684fac Mon Sep 17 00:00:00 2001 From: NorthRealm <155140859+NorthRealm@users.noreply.github.com> Date: Sat, 3 May 2025 14:51:36 +0800 Subject: [PATCH 05/10] update --- templates/shared/secrets/add_list.tmpl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/templates/shared/secrets/add_list.tmpl b/templates/shared/secrets/add_list.tmpl index c58cbfcd38582..352f44658179f 100644 --- a/templates/shared/secrets/add_list.tmpl +++ b/templates/shared/secrets/add_list.tmpl @@ -6,6 +6,7 @@ data-modal-form.action="{{.Link}}" data-modal-header="{{ctx.Locale.Tr "secrets.creation"}}" data-modal-secret-name.value="" + data-modal-secret-name.readonly="" data-modal-secret-data="" data-modal-secret-description="" > @@ -42,6 +43,7 @@ data-modal-header="{{ctx.Locale.Tr "secrets.creation"}}" data-tooltip-content="{{ctx.Locale.Tr "secrets.edit"}}" data-modal-secret-name.value="{{.Name}}" + data-modal-secret-name.readonly="true" data-modal-secret-data="" data-modal-secret-description="{{if .Description}}{{.Description}}{{end}}" > From fe61c16ec0ba8c983858b7bdb564196b369e9905 Mon Sep 17 00:00:00 2001 From: NorthRealm <155140859+NorthRealm@users.noreply.github.com> Date: Sat, 3 May 2025 15:58:42 +0800 Subject: [PATCH 06/10] CAMELIZE --- templates/shared/secrets/add_list.tmpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/shared/secrets/add_list.tmpl b/templates/shared/secrets/add_list.tmpl index 352f44658179f..44328c08b347c 100644 --- a/templates/shared/secrets/add_list.tmpl +++ b/templates/shared/secrets/add_list.tmpl @@ -6,7 +6,7 @@ data-modal-form.action="{{.Link}}" data-modal-header="{{ctx.Locale.Tr "secrets.creation"}}" data-modal-secret-name.value="" - data-modal-secret-name.readonly="" + data-modal-secret-name.read-only="" data-modal-secret-data="" data-modal-secret-description="" > @@ -43,7 +43,7 @@ data-modal-header="{{ctx.Locale.Tr "secrets.creation"}}" data-tooltip-content="{{ctx.Locale.Tr "secrets.edit"}}" data-modal-secret-name.value="{{.Name}}" - data-modal-secret-name.readonly="true" + data-modal-secret-name.read-only="true" data-modal-secret-data="" data-modal-secret-description="{{if .Description}}{{.Description}}{{end}}" > From 5165b7af40a62c5f293bb899af972ce212b60fcf Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Thu, 8 May 2025 13:48:25 +0800 Subject: [PATCH 07/10] fix --- options/locale/locale_en-US.ini | 12 ++++++++---- routers/web/shared/secrets/secrets.go | 4 ++-- templates/shared/secrets/add_list.tmpl | 10 +++++----- web_src/js/features/common-button.ts | 23 +++++++++++++++++++---- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 326cbb2c63a23..af3b948a88846 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -3722,18 +3722,22 @@ owner.settings.chef.keypair.description = A key pair is necessary to authenticat secrets = Secrets description = Secrets will be passed to certain actions and cannot be read otherwise. none = There are no secrets yet. -creation = Add Secret + +; These keys are also for "edit secret", the keys are kept as-is to avoid unnecessary re-translation creation.description = Description creation.name_placeholder = case-insensitive, alphanumeric characters or underscores only, cannot start with GITEA_ or GITHUB_ creation.value_placeholder = Input any content. Whitespace at the start and end will be omitted. creation.description_placeholder = Enter short description (optional). -creation.success = The secret "%s" has been added. -creation.failed = Failed to add secret. + +save_success = The secret "%s" has been saved. +save_failed = Failed to save secret. + +add_secret = Add secret +edit_secret = Edit secret deletion = Remove secret deletion.description = Removing a secret is permanent and cannot be undone. Continue? deletion.success = The secret has been removed. deletion.failed = Failed to remove secret. -edit = Edit secret management = Secrets Management [actions] diff --git a/routers/web/shared/secrets/secrets.go b/routers/web/shared/secrets/secrets.go index c8b80ebb2638c..29f4e9520dc27 100644 --- a/routers/web/shared/secrets/secrets.go +++ b/routers/web/shared/secrets/secrets.go @@ -32,11 +32,11 @@ func PerformSecretsPost(ctx *context.Context, ownerID, repoID int64, redirectURL s, _, err := secret_service.CreateOrUpdateSecret(ctx, ownerID, repoID, form.Name, util.ReserveLineBreakForTextarea(form.Data), form.Description) if err != nil { log.Error("CreateOrUpdateSecret failed: %v", err) - ctx.JSONError(ctx.Tr("secrets.creation.failed")) + ctx.JSONError(ctx.Tr("secrets.save_failed")) return } - ctx.Flash.Success(ctx.Tr("secrets.creation.success", s.Name)) + ctx.Flash.Success(ctx.Tr("secrets.save_success", s.Name)) ctx.JSONRedirect(redirectURL) } diff --git a/templates/shared/secrets/add_list.tmpl b/templates/shared/secrets/add_list.tmpl index 44328c08b347c..985fe9c0c4439 100644 --- a/templates/shared/secrets/add_list.tmpl +++ b/templates/shared/secrets/add_list.tmpl @@ -4,13 +4,13 @@ - {{ctx.Locale.Tr "secrets.creation"}} + {{ctx.Locale.Tr "secrets.add_secret"}} @@ -40,8 +40,8 @@ "[name=target]" -> ".target" -> " tag" const attrTarget = elModal.querySelector(`#${attrTargetName}`) || elModal.querySelector(`[name=${attrTargetName}]`) || @@ -133,8 +148,8 @@ function onShowModalClick(el: HTMLElement, e: MouseEvent) { continue; } - if (attrTargetAttr) { - (attrTarget as any)[camelize(attrTargetAttr)] = attrib.value; + if (attrTargetProp) { + assignElementProperty(attrTarget, attrTargetProp, attrib.value); } else if (attrTarget.matches('input, textarea')) { (attrTarget as HTMLInputElement | HTMLTextAreaElement).value = attrib.value; // FIXME: add more supports like checkbox } else { From ba092dc71661794d365d1cbe3a976522e269991a Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Thu, 8 May 2025 13:53:42 +0800 Subject: [PATCH 08/10] add tests --- web_src/js/features/common-button.test.ts | 14 ++++++++++++++ web_src/js/features/common-button.ts | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 web_src/js/features/common-button.test.ts diff --git a/web_src/js/features/common-button.test.ts b/web_src/js/features/common-button.test.ts new file mode 100644 index 0000000000000..f41bafbc7911c --- /dev/null +++ b/web_src/js/features/common-button.test.ts @@ -0,0 +1,14 @@ +import {assignElementProperty} from './common-button.ts'; + +test('assignElementProperty', () => { + const elForm = document.createElement('form'); + assignElementProperty(elForm, 'action', '/test-link'); + expect(elForm.action).contains('/test-link'); // the DOM always returns absolute URL + assignElementProperty(elForm, 'text-content', 'dummy'); + expect(elForm.textContent).toBe('dummy'); + + const elInput = document.createElement('input'); + expect(elInput.readOnly).toBe(false); + assignElementProperty(elInput, 'read-only', 'true'); + expect(elInput.readOnly).toBe(true); +}); diff --git a/web_src/js/features/common-button.ts b/web_src/js/features/common-button.ts index e53f5a7156173..2df50cd2d4164 100644 --- a/web_src/js/features/common-button.ts +++ b/web_src/js/features/common-button.ts @@ -102,7 +102,7 @@ function onHidePanelClick(el: HTMLElement, e: MouseEvent) { throw new Error('no panel to hide'); // should never happen, otherwise there is a bug in code } -function assignElementProperty(el: any, name: string, val: string) { +export function assignElementProperty(el: any, name: string, val: string) { name = camelize(name); const old = el[name]; if (typeof old === 'boolean') { From f18da6089ac1da8c1d1a1a3ff85163269f7345f7 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Thu, 8 May 2025 13:55:50 +0800 Subject: [PATCH 09/10] fix tmpl --- templates/shared/secrets/add_list.tmpl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/templates/shared/secrets/add_list.tmpl b/templates/shared/secrets/add_list.tmpl index 985fe9c0c4439..a4ef2e5384303 100644 --- a/templates/shared/secrets/add_list.tmpl +++ b/templates/shared/secrets/add_list.tmpl @@ -67,9 +67,7 @@ {{/* Add secret dialog */}} - - - + {{.CsrfTokenHtml}} From f75df1627aa520369adcfa757d99590e57005e56 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Thu, 8 May 2025 13:58:51 +0800 Subject: [PATCH 10/10] improve comment --- web_src/js/features/common-button.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web_src/js/features/common-button.ts b/web_src/js/features/common-button.ts index 2df50cd2d4164..b8c801ebe9463 100644 --- a/web_src/js/features/common-button.ts +++ b/web_src/js/features/common-button.ts @@ -124,7 +124,7 @@ function onShowModalClick(el: HTMLElement, e: MouseEvent) { // * Then, try to query '[name=target]' // * Then, try to query '.target' // * Then, try to query 'target' as HTML tag - // If there is a ".{attr}" part like "data-modal-form.action", then the form's "action" property will be set. + // If there is a ".{prop-name}" part like "data-modal-form.action", the "form" element's "action" property will be set, the "prop-name" will be camel-cased to "propName". e.preventDefault(); const modalSelector = el.getAttribute('data-modal'); const elModal = document.querySelector(modalSelector);