Skip to content

feat: integrations UI improvement#3775

Merged
emlimlf merged 48 commits intomainfrom
feat/integrations-ui-improvement
Feb 6, 2026
Merged

feat: integrations UI improvement#3775
emlimlf merged 48 commits intomainfrom
feat/integrations-ui-improvement

Conversation

@emlimlf
Copy link
Collaborator

@emlimlf emlimlf commented Jan 23, 2026

In this PR

  • Removed the github toggle on the project integrations list page
  • Clicking on the connect button for github will now open up a dropdown to choose the v1 and v2
  • Changed the integrations sorting
  • Made various UI changes to update the design

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 (projects array) instead of a single project for “repos mapped elsewhere” messaging.

Written by Cursor Bugbot for commit 99a38b2. This will update automatically on new commits. Configure here.

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>
@emlimlf emlimlf requested a review from gaspergrom January 23, 2026 07:04
Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

Conventional Commits FTW!

@github-actions
Copy link
Contributor

⚠️ Jira Issue Key Missing

Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability.

Example:

  • feat: add user authentication (CM-123)
  • feat: add user authentication (IN-123)

Projects:

  • CM: Community Data Platform
  • IN: Insights

Please add a Jira issue key to your PR title.

3 similar comments
@github-actions
Copy link
Contributor

⚠️ Jira Issue Key Missing

Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability.

Example:

  • feat: add user authentication (CM-123)
  • feat: add user authentication (IN-123)

Projects:

  • CM: Community Data Platform
  • IN: Insights

Please add a Jira issue key to your PR title.

@github-actions
Copy link
Contributor

⚠️ Jira Issue Key Missing

Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability.

Example:

  • feat: add user authentication (CM-123)
  • feat: add user authentication (IN-123)

Projects:

  • CM: Community Data Platform
  • IN: Insights

Please add a Jira issue key to your PR title.

@github-actions
Copy link
Contributor

⚠️ Jira Issue Key Missing

Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability.

Example:

  • feat: add user authentication (CM-123)
  • feat: add user authentication (IN-123)

Projects:

  • CM: Community Data Platform
  • IN: Insights

Please add a Jira issue key to your PR title.

@emlimlf emlimlf changed the title Feat/integrations UI improvement feat: integrations UI improvement Jan 23, 2026
@github-actions
Copy link
Contributor

⚠️ Jira Issue Key Missing

Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability.

Example:

  • feat: add user authentication (CM-123)
  • feat: add user authentication (IN-123)

Projects:

  • CM: Community Data Platform
  • IN: Insights

Please add a Jira issue key to your PR title.

gaspergrom

This comment was marked as resolved.

Signed-off-by: Efren Lim <elim@linuxfoundation.org>
@github-actions
Copy link
Contributor

github-actions bot commented Feb 4, 2026

⚠️ Jira Issue Key Missing

Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability.

Example:

  • feat: add user authentication (CM-123)
  • feat: add user authentication (IN-123)

Projects:

  • CM: Community Data Platform
  • IN: Insights

Please add a Jira issue key to your PR title.

Signed-off-by: Efren Lim <elim@linuxfoundation.org>
@github-actions
Copy link
Contributor

github-actions bot commented Feb 4, 2026

⚠️ Jira Issue Key Missing

Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability.

Example:

  • feat: add user authentication (CM-123)
  • feat: add user authentication (IN-123)

Projects:

  • CM: Community Data Platform
  • IN: Insights

Please add a Jira issue key to your PR title.

Copy link

Choose a reason for hiding this comment

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

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.

Fix in Cursor Fix in Web

Signed-off-by: Efren Lim <elim@linuxfoundation.org>
@github-actions
Copy link
Contributor

github-actions bot commented Feb 4, 2026

⚠️ Jira Issue Key Missing

Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability.

Example:

  • feat: add user authentication (CM-123)
  • feat: add user authentication (IN-123)

Projects:

  • CM: Community Data Platform
  • IN: Insights

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);
Copy link

Choose a reason for hiding this comment

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

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.

Fix in Cursor Fix in Web

Signed-off-by: Efren Lim <elim@linuxfoundation.org>
@github-actions
Copy link
Contributor

github-actions bot commented Feb 4, 2026

⚠️ Jira Issue Key Missing

Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability.

Example:

  • feat: add user authentication (CM-123)
  • feat: add user authentication (IN-123)

Projects:

  • CM: Community Data Platform
  • IN: Insights

Please add a Jira issue key to your PR title.

Signed-off-by: Efren Lim <elim@linuxfoundation.org>
@github-actions
Copy link
Contributor

github-actions bot commented Feb 4, 2026

⚠️ Jira Issue Key Missing

Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability.

Example:

  • feat: add user authentication (CM-123)
  • feat: add user authentication (IN-123)

Projects:

  • CM: Community Data Platform
  • IN: Insights

Please add a Jira issue key to your PR title.

Signed-off-by: Efren Lim <elim@linuxfoundation.org>
Copy link

Choose a reason for hiding this comment

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

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.

Fix in Cursor Fix in Web

@github-actions
Copy link
Contributor

github-actions bot commented Feb 4, 2026

⚠️ Jira Issue Key Missing

Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability.

Example:

  • feat: add user authentication (CM-123)
  • feat: add user authentication (IN-123)

Projects:

  • CM: Community Data Platform
  • IN: Insights

Please add a Jira issue key to your PR title.

@github-actions
Copy link
Contributor

github-actions bot commented Feb 5, 2026

⚠️ Jira Issue Key Missing

Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability.

Example:

  • feat: add user authentication (CM-123)
  • feat: add user authentication (IN-123)

Projects:

  • CM: Community Data Platform
  • IN: Insights

Please add a Jira issue key to your PR title.

Signed-off-by: Efren Lim <elim@linuxfoundation.org>
@github-actions
Copy link
Contributor

github-actions bot commented Feb 5, 2026

⚠️ Jira Issue Key Missing

Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability.

Example:

  • feat: add user authentication (CM-123)
  • feat: add user authentication (IN-123)

Projects:

  • CM: Community Data Platform
  • IN: Insights

Please add a Jira issue key to your PR title.

formSnapshot();
}
};

Copy link

Choose a reason for hiding this comment

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

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.

Fix in Cursor Fix in Web

return new Promise((resolve) => {
resolvePromise = resolve;
});
};
Copy link

Choose a reason for hiding this comment

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

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.

Fix in Cursor Fix in Web

@github-actions
Copy link
Contributor

github-actions bot commented Feb 6, 2026

⚠️ Jira Issue Key Missing

Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability.

Example:

  • feat: add user authentication (CM-123)
  • feat: add user authentication (IN-123)

Projects:

  • CM: Community Data Platform
  • IN: Insights

Please add a Jira issue key to your PR title.

revertChanges() {
this.syncData();
this.keywords = this.integration?.settings.keywords;
},
Copy link

Choose a reason for hiding this comment

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

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.

Fix in Cursor Fix in Web

Signed-off-by: Efren Lim <elim@linuxfoundation.org>
@github-actions
Copy link
Contributor

github-actions bot commented Feb 6, 2026

⚠️ Jira Issue Key Missing

Your PR title doesn't contain a Jira issue key. Consider adding it for better traceability.

Example:

  • feat: add user authentication (CM-123)
  • feat: add user authentication (IN-123)

Projects:

  • CM: Community Data Platform
  • IN: Insights

Please add a Jira issue key to your PR title.

@emlimlf emlimlf merged commit 882fdbe into main Feb 6, 2026
17 checks passed
@emlimlf emlimlf deleted the feat/integrations-ui-improvement branch February 6, 2026 05:08
Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 4 potential issues.

revertChanges() {
this.syncData();
this.keywords = this.integration?.settings.keywords;
},
Copy link

Choose a reason for hiding this comment

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

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.

Fix in Cursor Fix in Web

formSnapshot();
}
};

Copy link

Choose a reason for hiding this comment

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

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.

Fix in Cursor Fix in Web

} catch (error) {
// If URL parsing fails, return the original string
return url.replace(/^(https?:\/\/|git@)/, '').replace(/\.git$/, '');
}
Copy link

Choose a reason for hiding this comment

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

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)

Fix in Cursor Fix in Web

resolvePromise(true);
resolvePromise = null;
}
};
Copy link

Choose a reason for hiding this comment

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

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.

Fix in Cursor Fix in Web

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.

2 participants

Comments