Conversation
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
…tDev/crowd.dev into feat/integrations-ui-improvement
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
|
Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability. Example:
Projects:
Please add a Jira issue key to your PR title. |
3 similar comments
|
Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability. Example:
Projects:
Please add a Jira issue key to your PR title. |
|
Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability. Example:
Projects:
Please add a Jira issue key to your PR title. |
|
Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability. Example:
Projects:
Please add a Jira issue key to your PR title. |
|
Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability. Example:
Projects:
Please add a Jira issue key to your PR title. |
frontend/src/config/integrations/gerrit/components/gerrit-settings-drawer.vue
Show resolved
Hide resolved
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
|
Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability. Example:
Projects:
Please add a Jira issue key to your PR title. |
frontend/src/modules/admin/modules/integration/components/drawer-footer-buttons.vue
Outdated
Show resolved
Hide resolved
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
|
Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability. Example:
Projects:
Please add a Jira issue key to your PR title. |
There was a problem hiding this comment.
Missing optional chaining causes potential runtime error
Medium Severity
The is-edit-mode prop uses integration?.settings.urls which applies optional chaining on integration but not on settings. If integration exists but settings is undefined or null, accessing .urls will throw a runtime error. This should use integration?.settings?.urls with consistent optional chaining.
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
|
Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability. Example:
Projects:
Please add a Jira issue key to your PR title. |
| --lf-switch-tiny-width: #{rem(30)}; | ||
| --lf-switch-tiny-font-size: #{rem(12)}; | ||
| --lf-switch-tiny-line-height: #{rem(15)}; | ||
| --lf-switch-disabled-checked-background: var(--lf-color-primary-500); |
There was a problem hiding this comment.
Removed CSS variables break tiny switch size
Medium Severity
The --lf-switch-tiny-* CSS custom properties (height, width, font-size, line-height) were removed from the variables definition. However, ui-kit/switch/switch.scss still references these variables in the &--tiny selector. Components using size="tiny" (like discourse-settings-drawer.vue) will now have broken styling because the variables they depend on are undefined.
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
|
Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability. Example:
Projects:
Please add a Jira issue key to your PR title. |
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
|
Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability. Example:
Projects:
Please add a Jira issue key to your PR title. |
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
There was a problem hiding this comment.
Missing optional chain causes crash on empty settings
Medium Severity
The expression integration?.settings.urls is missing optional chaining after settings. When integration is an object but settings is undefined (e.g., connecting for the first time with an empty integration object), accessing .urls on undefined causes a runtime crash. The correct expression would be integration?.settings?.urls.
|
Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability. Example:
Projects:
Please add a Jira issue key to your PR title. |
|
Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability. Example:
Projects:
Please add a Jira issue key to your PR title. |
frontend/src/config/integrations/hackernews/components/hackernews-settings-drawer.vue
Outdated
Show resolved
Hide resolved
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
|
Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability. Example:
Projects:
Please add a Jira issue key to your PR title. |
| formSnapshot(); | ||
| } | ||
| }; | ||
|
|
There was a problem hiding this comment.
DEV.to drawer never calls formSnapshot after mount
Medium Severity
The formChangeDetector is initialized but formSnapshot() is never called after the initial data load. The syncData function (lines 292-310) loads data but doesn't call formSnapshot(), and onMounted only calls syncData(). Since formChangeDetector initializes with an empty string baseline, hasFormChanged will always return true because it compares JSON.stringify({apiKey: ''}) against ''. Other integration drawers like discourse and confluence correctly call formSnapshot() after loading data.
| return new Promise((resolve) => { | ||
| resolvePromise = resolve; | ||
| }); | ||
| }; |
There was a problem hiding this comment.
Confirmation modal promise never resolves if closed externally
Medium Severity
The open() method returns a Promise that only resolves when keepEditing or discardChanges is called. However, the parent lf-modal allows closing by clicking outside (via clickOutsideClose) or pressing Escape, which sets isModalOpen to false without calling either method. When this happens, resolvePromise is never invoked, the promise hangs indefinitely, and done() is never called in the canClose handlers across all integration drawers. This leaves the drawer in a stuck state where the close operation never completes.
|
Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability. Example:
Projects:
Please add a Jira issue key to your PR title. |
| revertChanges() { | ||
| this.syncData(); | ||
| this.keywords = this.integration?.settings.keywords; | ||
| }, |
There was a problem hiding this comment.
Hacker News revertChanges assigns array by reference
Medium Severity
In revertChanges, this.keywords is assigned this.integration?.settings.keywords directly — a reference to the integration settings array. Any subsequent edits by the user to the keywords list (via v-model) will mutate the original integration settings in-place. This corrupts the source data, causing hasFormChanged to always report false and making it impossible to detect further changes or revert again.
frontend/src/config/integrations/git/components/git-settings-drawer.vue
Outdated
Show resolved
Hide resolved
frontend/src/config/integrations/confluence/components/confluence-settings-drawer.vue
Show resolved
Hide resolved
Signed-off-by: Efren Lim <elim@linuxfoundation.org>
|
Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability. Example:
Projects:
Please add a Jira issue key to your PR title. |
| revertChanges() { | ||
| this.syncData(); | ||
| this.keywords = this.integration?.settings.keywords; | ||
| }, |
There was a problem hiding this comment.
Hackernews revertChanges assigns keywords by reference
Medium Severity
In revertChanges, this.keywords is assigned directly from this.integration?.settings.keywords without copying the array. Since keywords is bound via v-model to app-keywords-input, subsequent edits will mutate the original integration settings data in-place, corrupting the source of truth and breaking future change detection or revert operations.
| formSnapshot(); | ||
| } | ||
| }; | ||
|
|
There was a problem hiding this comment.
Devto missing formSnapshot call after mount
Medium Severity
The newly added formChangeDetector is never initialized with a snapshot after the initial syncData on mount. formSnapshot starts with an empty string baseline, so hasFormChanged will always be true after mount, since JSON.stringify(form) won't equal ''. This breaks the unsaved-changes detection and the close-confirmation modal, which will always prompt even with no changes.
| } catch (error) { | ||
| // If URL parsing fails, return the original string | ||
| return url.replace(/^(https?:\/\/|git@)/, '').replace(/\.git$/, ''); | ||
| } |
There was a problem hiding this comment.
Duplicated removeProtocolAndDomain utility function in git components
Low Severity
The removeProtocolAndDomain function is identically duplicated in both git-params.vue and git-settings-drawer.vue. This duplicated logic increases maintenance burden and risks inconsistent future fixes. It could be extracted to a shared utility used by both components.
Additional Locations (1)
| resolvePromise(true); | ||
| resolvePromise = null; | ||
| } | ||
| }; |
There was a problem hiding this comment.
Confirmation modal dismiss leaves drawer stuck open
High Severity
When the ChangesConfirmationModal is dismissed by clicking outside or pressing Escape, LfModal sets isModalOpen to false via v-model, bypassing keepEditing and discardChanges. The resolvePromise is never called, so the promise returned by open() never resolves. This means the done callback in every drawer's canClose handler never fires, leaving the Element Plus before-close lifecycle stuck. The user can no longer close the drawer at all after dismissing the confirmation modal. This affects all integration drawers that use this modal.


In this PR
Ticket
CM-892
Note
Medium Risk
Broad UI refactor across many integrations plus new close/disconnect confirmation flows increases risk of regressions in connect/update/disconnect UX. Backend response shape change (
project->projects) requires coordinated frontend updates to avoid runtime mismatches.Overview
Improves the integrations UI by standardizing most integration connect/settings drawers to a new layout (600px drawers, outline connect buttons, consistent description + docs links, and shared footer actions for connect/update/disconnect/revert).
Adds unsaved-changes protection via a new
ChangesConfirmationModal, plus a typed DISCONNECT confirmation modal for edit-mode drawers. Updates Git/Gerrit UX to support empty states, pill/rounded inputs, improved remote URL management, and clearer handling of Git-mirrored repositories.GitHub connect is reworked to open a dropdown to choose v1 vs v2 flows, with shared mapping-display components and backend support for returning all mapped projects (
projectsarray) instead of a singleprojectfor “repos mapped elsewhere” messaging.Written by Cursor Bugbot for commit 99a38b2. This will update automatically on new commits. Configure here.