Skip to content

feat: warn before saving key names with leading/trailing whitespace - #3756

Merged
dkrizan merged 16 commits into
mainfrom
dkrizan/pr-3750-whitespace
Jun 30, 2026
Merged

feat: warn before saving key names with leading/trailing whitespace#3756
dkrizan merged 16 commits into
mainfrom
dkrizan/pr-3750-whitespace

Conversation

@dkrizan

@dkrizan dkrizan commented Jun 16, 2026

Copy link
Copy Markdown
Member

Builds on and supersedes #3750, completing the UI safeguards from #3359.

What this adds

Key names — visualize and warn (the missing half of #3359)

  • Leading/trailing whitespace in the key-name editor is highlighted (carried over from fix: Leading/Trailing spaces for Project Name/Keys when saving/updating the same #3750), now using the theme label.lightBlue token so the highlight is clearly visible in both light and dark mode (the original hardcoded colour washed out in light mode).
  • An inline warning appears under the key-name field whenever the name has outer whitespace, with a Trim action to remove it in one click. This fires on both create and edit, for newly typed and pre-existing whitespace — consistent with the editor highlight, which is also unconditional. The Trim action doubles as a quick fix for cleaning up legacy/imported keys.
  • Nothing is auto-trimmed; the user clicks Trim explicitly (respects the issue's No-Goes).
  • The warning and the editor highlight share one whitespace definition (leading/trailing spaces and tabs), so what is flagged matches what is highlighted.

Project name

Tests

  • webapp/src/fixtures/__tests__/keyName.test.ts — unit tests for hasOuterWhitespace covering clean names plus leading/trailing spaces and tabs.
  • e2e/cypress/e2e/translations/keyNameWhitespace.cy.ts — covers: create warns + Trim, edit warns when whitespace is newly added + Trim, clean rename does not warn, and editing a key whose whitespace was already present does warn.

Translations

  • Keys key_whitespace_warning_message / key_whitespace_warning_trim created in Tolgee (tagged draft: pr-3750-whitespace).

Resolves #3359. Original key-name visualization work by @uvais724 in #3750.

Co-authored-by: Uvais uvais724@gmail.com.

Summary by CodeRabbit

  • New Features

    • Added a visible warning when project translation key names include leading or trailing whitespace, with a one-click trim action.
    • Highlighted whitespace directly in the translation key editor to make it easier to spot before saving.
  • Bug Fixes

    • Project names are now trimmed automatically when creating or updating projects, preventing accidental extra spaces from being saved.
  • Tests

    • Added end-to-end coverage for whitespace warning behavior in translation key create/edit flows.

uvais724 and others added 7 commits June 15, 2026 17:00
Show a confirmation dialog when saving a key whose name has outer whitespace. On create it triggers whenever the name has leading/trailing spaces; on edit only when such whitespace is newly introduced, so keys that already had it are not flagged.
The highlight used a single hardcoded light-blue that washed out on the light theme. Use the theme's label.lightBlue token so it adapts to both modes.
Mirror the project settings behaviour so a new project's name has leading/trailing whitespace stripped before saving, and validation runs against the trimmed value.
@coderabbitai

coderabbitai Bot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds UI-level detection and visualization of leading/trailing whitespace in translation key names. A new hasOuterWhitespace helper and KeyNameWhitespaceWarning component are introduced, wired into both the key creation and key edit forms. A CodeMirror plugin highlights outer spaces visually. Project name fields also receive .trim() hardening. Four E2E scenarios are added.

Changes

Key Name Whitespace Warning

Layer / File(s) Summary
Whitespace helper and warning component
webapp/src/fixtures/keyName.ts, webapp/src/views/projects/translations/KeyNameWhitespaceWarning.tsx, webapp/src/fixtures/__tests__/keyName.test.ts
hasOuterWhitespace detects leading/trailing whitespace; KeyNameWhitespaceWarning renders a localized warning and a trim action Link button when the key name has outer whitespace, with data-cy attributes. The helper is covered by unit tests.
CodeMirror visible whitespace plugin and Editor integration
webapp/src/component/editor/utils/codemirrorVisibleWhitespace.ts, webapp/src/component/editor/Editor.tsx
New visibleKeyNameSpacesPlugin StateField marks leading/trailing spaces with cm-keyname-space-indicator; Editor.tsx wires it into keyName mode and styles the indicator with a light-blue background.
Key create and edit form integration
webapp/src/views/projects/translations/KeyCreateForm/FormBody.tsx, webapp/src/views/projects/translations/KeyEdit/KeyGeneral.tsx
Both forms replace unconditional FieldError with a conditional: show FieldError on validation error, otherwise show KeyNameWhitespaceWarning with an onTrim handler that writes the trimmed name back to Formik.
Project name trimming
webapp/src/constants/GlobalValidationSchema.tsx, webapp/src/views/projects/project/ProjectCreateView.tsx, webapp/src/views/projects/project/ProjectSettingsGeneral.tsx
Submit handlers trim values.name before API calls; Yup schemas for PROJECT_CREATION and PROJECT_SETTINGS add .trim() to the name validation chain.
E2E test coverage
e2e/cypress/support/dataCyType.d.ts, e2e/cypress/e2e/translations/keyNameWhitespace.cy.ts
Adds data-cy type declarations for warning and trim selectors; four Cypress scenarios cover create-with-whitespace, edit-with-whitespace, create-without-whitespace, and reopening a persisted whitespace key.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • tolgee/tolgee-platform#3694: Both PRs modify translation key-name editor behavior in webapp/src/component/editor/Editor.tsx under the shared keyName mode.

Suggested reviewers

  • Anty0
  • bdshadow
  • JanCizmar

Poem

🐇 A trailing space hid in the key by the light,
But now it glows blue so the bunny canाइट?
Trim click!—poof!—the whiskers are neat,
And clean little keys hop to a safer beat.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning Project name trimming on create/settings is unrelated to #3359’s key-name whitespace warning scope. Move project-name trimming to a separate PR or linked issue, or document it as an intentional secondary change.
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and accurately summarizes the main change: warning users about leading/trailing whitespace in key names.
Linked Issues check ✅ Passed The PR implements the requested UI warning and visualization for key-name outer whitespace on create/edit flows, with explicit trim action and tests.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dkrizan/pr-3750-whitespace

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
webapp/src/views/projects/translations/KeyCreateForm/FormBody.tsx (1)

311-319: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Prevent native submit from bypassing the whitespace guard.

LoadingButton is still type="submit" while the check lives in onClick. When outer whitespace is detected, submitWithWhitespaceCheck() returns early, but the form submit can still fire and persist immediately. Make this button type="button" (or prevent default) and route submission only through submitWithWhitespaceCheck().

Suggested fix
           <LoadingButton
             data-cy="global-form-save-button"
             loading={form.isSubmitting}
             color="primary"
             variant="contained"
             disabled={!form.isValid || isBaseOverCharLimit}
-            type="submit"
-            onClick={() => submitWithWhitespaceCheck()}
+            type="button"
+            onClick={submitWithWhitespaceCheck}
           >
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@webapp/src/views/projects/translations/KeyCreateForm/FormBody.tsx` around
lines 311 - 319, The LoadingButton component has type="submit" which triggers
native form submission independent of the onClick handler, allowing the form to
persist even when submitWithWhitespaceCheck() returns early. Change the button
type from "submit" to "button" so that form submission is routed exclusively
through the onClick handler that invokes submitWithWhitespaceCheck(), ensuring
the whitespace guard cannot be bypassed.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@e2e/cypress/e2e/translations/keyNameWhitespace.cy.ts`:
- Around line 18-20: Replace the `translationSingleTestData.generate()` call
with the standardized `generateStandard()` API. Update the test data generation
pattern to follow the shared test-data object pattern as required for E2E tests
in the e2e/cypress directory. This means replacing the outdated generate()
method with the generateStandard() method to align with current coding
guidelines.
- Line 67: The assertion at line 67 uses `cy.contains('A key edited')` which is
a brittle text-based selector that violates the data-cy selector guidelines.
Replace this assertion with a stable selector using a `data-cy` attribute and
the `gcy()` or `cy.gcy()` helper function. First ensure the element being tested
has an appropriate `data-cy` attribute (e.g., `data-cy="key-edited"` or
similar), then replace the `cy.contains('A key edited')` call with
`cy.gcy('appropriate-data-cy-value').should('be.visible')` to follow the
required coding guidelines for E2E selectors.

In `@webapp/src/views/projects/translations/KeyEdit/KeyEditModal.tsx`:
- Around line 288-290: The onConfirm callback in the whitespace confirmation
dialog calls submitForm() but does not close the warning dialog first. This
causes the dialog to remain open if the form submission fails. Modify the
onConfirm callback to call setWhitespaceWarningOpen(false) before invoking
submitForm() to ensure the dialog is properly closed before attempting to
resubmit the form.

---

Outside diff comments:
In `@webapp/src/views/projects/translations/KeyCreateForm/FormBody.tsx`:
- Around line 311-319: The LoadingButton component has type="submit" which
triggers native form submission independent of the onClick handler, allowing the
form to persist even when submitWithWhitespaceCheck() returns early. Change the
button type from "submit" to "button" so that form submission is routed
exclusively through the onClick handler that invokes
submitWithWhitespaceCheck(), ensuring the whitespace guard cannot be bypassed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 47c50cc5-6db3-43fe-9059-179f9b84cac3

📥 Commits

Reviewing files that changed from the base of the PR and between b965b1b and fece96d.

📒 Files selected for processing (9)
  • e2e/cypress/e2e/translations/keyNameWhitespace.cy.ts
  • webapp/src/component/editor/Editor.tsx
  • webapp/src/component/editor/utils/codemirrorVisibleWhitespace.ts
  • webapp/src/constants/GlobalValidationSchema.tsx
  • webapp/src/fixtures/keyName.ts
  • webapp/src/views/projects/project/ProjectCreateView.tsx
  • webapp/src/views/projects/project/ProjectSettingsGeneral.tsx
  • webapp/src/views/projects/translations/KeyCreateForm/FormBody.tsx
  • webapp/src/views/projects/translations/KeyEdit/KeyEditModal.tsx

Comment thread e2e/cypress/e2e/translations/keyNameWhitespace.cy.ts
Comment thread e2e/cypress/e2e/translations/keyNameWhitespace.cy.ts Outdated
Comment thread webapp/src/views/projects/translations/KeyEdit/KeyEditModal.tsx Outdated
@dkrizan
dkrizan marked this pull request as draft June 17, 2026 10:12
dkrizan added 4 commits June 17, 2026 12:31
Instead of a save-time confirmation dialog, the key create and edit dialogs now show a non-blocking inline warning under the name field whenever it has leading/trailing spaces, with a Trim action that removes them. Nothing is auto-trimmed without the user's action.
Show the inline warning in the same reserved message slot as the field error (no layout shift when it appears), and use the MUI Link component for the Trim action so it follows the design system.
@dkrizan
dkrizan marked this pull request as ready for review June 17, 2026 13:39
@dkrizan
dkrizan requested a review from bdshadow June 17, 2026 13:39

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@webapp/src/views/projects/translations/KeyCreateForm/FormBody.tsx`:
- Around line 316-318: The button element with type="submit" is triggering form
submission twice: once automatically through the submit button type, and again
through the explicit onClick handler calling form.handleSubmit(). Remove the
onClick handler from the button since the type="submit" attribute on the button
will automatically invoke form submission without needing the explicit
handleSubmit call.

In `@webapp/src/views/projects/translations/KeyEdit/KeyGeneral.tsx`:
- Around line 79-86: The KeyNameWhitespaceWarning component currently displays
whenever errors.name is falsy and values.name contains outer whitespace, but it
doesn't distinguish between pre-existing whitespace and newly introduced
whitespace. To fix this, modify the condition that determines when to show
KeyNameWhitespaceWarning to also compare the current values.name against its
initial or original value. Only display the warning when outer whitespace is
newly added (i.e., when the current values.name has whitespace but the original
value did not), not when the whitespace was already present before editing. This
requires accessing the original name value from the form state and incorporating
that into the conditional logic alongside the existing errors.name check.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 030c5078-3653-4c9e-adf9-5de7b7d0dcd7

📥 Commits

Reviewing files that changed from the base of the PR and between f5af3ab and 1bfca18.

📒 Files selected for processing (6)
  • e2e/cypress/e2e/translations/keyNameWhitespace.cy.ts
  • e2e/cypress/support/dataCyType.d.ts
  • webapp/src/fixtures/keyName.ts
  • webapp/src/views/projects/translations/KeyCreateForm/FormBody.tsx
  • webapp/src/views/projects/translations/KeyEdit/KeyGeneral.tsx
  • webapp/src/views/projects/translations/KeyNameWhitespaceWarning.tsx
💤 Files with no reviewable changes (1)
  • webapp/src/fixtures/keyName.ts
✅ Files skipped from review due to trivial changes (2)
  • webapp/src/views/projects/translations/KeyNameWhitespaceWarning.tsx
  • e2e/cypress/support/dataCyType.d.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • e2e/cypress/e2e/translations/keyNameWhitespace.cy.ts

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@webapp/src/views/projects/translations/KeyCreateForm/FormBody.tsx`:
- Around line 316-318: The button element with type="submit" is triggering form
submission twice: once automatically through the submit button type, and again
through the explicit onClick handler calling form.handleSubmit(). Remove the
onClick handler from the button since the type="submit" attribute on the button
will automatically invoke form submission without needing the explicit
handleSubmit call.

In `@webapp/src/views/projects/translations/KeyEdit/KeyGeneral.tsx`:
- Around line 79-86: The KeyNameWhitespaceWarning component currently displays
whenever errors.name is falsy and values.name contains outer whitespace, but it
doesn't distinguish between pre-existing whitespace and newly introduced
whitespace. To fix this, modify the condition that determines when to show
KeyNameWhitespaceWarning to also compare the current values.name against its
initial or original value. Only display the warning when outer whitespace is
newly added (i.e., when the current values.name has whitespace but the original
value did not), not when the whitespace was already present before editing. This
requires accessing the original name value from the form state and incorporating
that into the conditional logic alongside the existing errors.name check.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 030c5078-3653-4c9e-adf9-5de7b7d0dcd7

📥 Commits

Reviewing files that changed from the base of the PR and between f5af3ab and 1bfca18.

📒 Files selected for processing (6)
  • e2e/cypress/e2e/translations/keyNameWhitespace.cy.ts
  • e2e/cypress/support/dataCyType.d.ts
  • webapp/src/fixtures/keyName.ts
  • webapp/src/views/projects/translations/KeyCreateForm/FormBody.tsx
  • webapp/src/views/projects/translations/KeyEdit/KeyGeneral.tsx
  • webapp/src/views/projects/translations/KeyNameWhitespaceWarning.tsx
💤 Files with no reviewable changes (1)
  • webapp/src/fixtures/keyName.ts
✅ Files skipped from review due to trivial changes (2)
  • webapp/src/views/projects/translations/KeyNameWhitespaceWarning.tsx
  • e2e/cypress/support/dataCyType.d.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • e2e/cypress/e2e/translations/keyNameWhitespace.cy.ts
🛑 Comments failed to post (2)
webapp/src/views/projects/translations/KeyCreateForm/FormBody.tsx (1)

316-318: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Avoid double submit invocation on save action.

Line 316 already submits via type="submit", and Line 317 calls form.handleSubmit() again. In a form context this can fire submit twice and duplicate create requests.

Suggested fix
           <LoadingButton
             data-cy="global-form-save-button"
             loading={form.isSubmitting}
             color="primary"
             variant="contained"
             disabled={!form.isValid || isBaseOverCharLimit}
             type="submit"
-            onClick={() => form.handleSubmit()}
           >
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

            type="submit"
          >
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@webapp/src/views/projects/translations/KeyCreateForm/FormBody.tsx` around
lines 316 - 318, The button element with type="submit" is triggering form
submission twice: once automatically through the submit button type, and again
through the explicit onClick handler calling form.handleSubmit(). Remove the
onClick handler from the button since the type="submit" attribute on the button
will automatically invoke form submission without needing the explicit
handleSubmit call.
webapp/src/views/projects/translations/KeyEdit/KeyGeneral.tsx (1)

79-86: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Edit warning currently triggers for pre-existing whitespace keys.

This branch shows KeyNameWhitespaceWarning whenever errors.name is empty and values.name has outer whitespace. Because it doesn’t compare against the original name, existing keys that already contained outer whitespace will be warned immediately, which conflicts with the “warn only when newly introduced” edit-flow behavior in the PR objective.

Suggested fix
-  const { values, setFieldValue, submitForm, errors } =
+  const { values, initialValues, setFieldValue, submitForm, errors } =
     useFormikContext<KeyFormType>();
+  const hadOuterWhitespaceInitially = /^\s|\s$/.test(initialValues.name || '');
+  const hasOuterWhitespaceNow = /^\s|\s$/.test(values.name || '');
+  const showWhitespaceWarning =
+    !errors.name && hasOuterWhitespaceNow && !hadOuterWhitespaceInitially;
...
-          {errors.name ? (
+          {errors.name ? (
             <FieldError error={errors.name} />
-          ) : (
+          ) : showWhitespaceWarning ? (
             <KeyNameWhitespaceWarning
               value={values.name}
               onTrim={() => setFieldValue('name', values.name.trim())}
             />
-          )}
+          ) : null}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@webapp/src/views/projects/translations/KeyEdit/KeyGeneral.tsx` around lines
79 - 86, The KeyNameWhitespaceWarning component currently displays whenever
errors.name is falsy and values.name contains outer whitespace, but it doesn't
distinguish between pre-existing whitespace and newly introduced whitespace. To
fix this, modify the condition that determines when to show
KeyNameWhitespaceWarning to also compare the current values.name against its
initial or original value. Only display the warning when outer whitespace is
newly added (i.e., when the current values.name has whitespace but the original
value did not), not when the whitespace was already present before editing. This
requires accessing the original name value from the form state and incorporating
that into the conditional logic alongside the existing errors.name check.

@bdshadow bdshadow left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

in the pr description, there is:

  1. mention of a dialogue, which is currently not in the implementation - is it an intentional change?
  2. "Edit: warns only when such whitespace is newly introduced, so keys that already had it are not flagged" - but i see the warning even when i open an existing key with a whitespace

Comment thread webapp/src/fixtures/keyName.ts Outdated
@dkrizan dkrizan linked an issue Jun 30, 2026 that may be closed by this pull request
The warning used trim() while the editor highlight matched spaces only,
so tab-prefixed/suffixed key names were detected by one and ignored by
the other. Share a single leading/trailing whitespace definition between
hasOuterWhitespace and the codemirror decorator so both cover spaces and
tabs.
@dkrizan
dkrizan enabled auto-merge (squash) June 30, 2026 10:29
bdshadow
bdshadow previously approved these changes Jun 30, 2026
The new edit test looked up the key by exact text, which never matched
because the persisted name carries a trailing space. Find the cell via a
whitespace-normalized substring match instead.
@dkrizan
dkrizan merged commit 0e1c2cf into main Jun 30, 2026
105 of 110 checks passed
@dkrizan
dkrizan deleted the dkrizan/pr-3750-whitespace branch June 30, 2026 13:52
TolgeeMachine added a commit that referenced this pull request Jun 30, 2026
# [3.207.0](v3.206.0...v3.207.0) (2026-06-30)

### Features

* warn before saving key names with leading/trailing whitespace ([#3756](#3756)) ([0e1c2cf](0e1c2cf)), closes [#3750](#3750) [#3359](#3359) [#3359](#3359) [#3750](#3750) [#3750](#3750) [#3359](#3359) [#3750](#3750)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Project Name/Keys saved with leading and trailing spaces Warn on / visualize leading/trailing whitespaces in key names [UI]

3 participants