Skip to content

refactor(ui): import table types from Table.interface, not AntD - #31955

Merged
harsh-vador merged 4 commits into
mainfrom
feat/tablev2-type-detachment
Aug 25, 2026
Merged

refactor(ui): import table types from Table.interface, not AntD#31955
harsh-vador merged 4 commits into
mainfrom
feat/tablev2-type-detachment

Conversation

@harsh-vador

@harsh-vador harsh-vador commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Fixes 6029
Independent of #31953 / #31954 — reviewable and mergeable on its own.

Every call site reached directly into antd/lib/table or antd/es/table for ColumnsType and friends, so the table implementation could not be changed without touching all of them. Table.interface.ts now re-exports the eleven types in use and is the only file that imports AntD's table typings.

Swapping the underlying table becomes a change to the right-hand side of those re-exports instead of ~100 files.

Mechanical and type-only — no runtime behaviour changes. 76 files.

Two fixes to the shared codemod were needed

  1. --toPathmove-named-imports could only write one literal specifier via --to, but this destination is a file in the repo and openmetadata-ui has no src resolve root, so the relative depth differs per call site. --toPath computes the specifier per file, skips the destination module itself, and leaves a default import behind when its named sibling moves.
  2. A crash that predates this change — when every specifier of a declaration moved into an existing target, the declaration was removed, and the second pass of the kind loop re-filtered a stale collection whose paths resolved to whatever shifted into the slot (path.node.specifiers is not iterable). It now re-queries the AST per pass. This silently skipped two files during the bulk run rather than failing loudly — caught only by grepping for what should have been gone.

Both have regression tests; the codemod package is 87/87. Its dependencies were not installed, so all three of its suites were failing before this change — worth a look if CI ever reports that tooling as green.

Notes

  • Key is deliberately not re-exported — AntD's Key is React's, so TopicSchema imports it from react directly.
  • The census found 103 files and 11 types, not the 96/4 in the original issue.

Verification

  • git grep "antd/es/table\|antd/lib/table" in src/ → only Table.interface.ts itself
  • tsc --noEmit: 573 errors, identical to main — zero delta
  • eslint on all 76 changed files: 0 errors

🤖 Generated with Claude Code

Greptile Summary

This PR centralizes Ant Design table typings behind Table.interface.ts and updates UI consumers to use that shared type boundary.

  • Re-exports the table types currently used throughout the UI.
  • Adds --toPath support and stale-AST regression handling to the import-migration codemod.
  • Adds regression coverage for relative destinations, default imports, type-only imports, and declaration removal.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains.

Important Files Changed

Filename Overview
openmetadata-ui/src/main/resources/ui/src/components/common/Table/Table.interface.ts Adds the shared type-only Ant Design table export boundary consumed by the migrated UI files.
tooling/antd-codemods/transforms/move-named-imports.js Adds per-file relative destination support, Windows-safe module separators, and fresh AST queries after mutations.
tooling/antd-codemods/tests/move-named-imports.test.js Covers relative destination generation, destination exclusion, mixed imports, type-only imports, and the stale-collection regression.
openmetadata-ui/src/main/resources/ui/src/components/Topic/TopicSchema/TopicSchema.tsx Moves table typings to the shared interface and imports the underlying key type directly from React.

Reviews (3): Last reviewed commit: "fix(ui): stop tw-guard matching a commen..." | Re-trigger Greptile

harsh-vador and others added 2 commits August 24, 2026 16:06
Every call site reached directly into `antd/lib/table` or `antd/es/table` for
`ColumnsType` and friends, so the table implementation could not be changed
without touching all of them. `Table.interface.ts` now re-exports the eleven
types in use and is the single file that imports AntD's table typings; call
sites import from there, and swapping the underlying table becomes a change to
the right-hand side of those re-exports.

Mechanical, type-only: no runtime behaviour changes.

Two fixes to the shared codemod were needed to do it:

- `move-named-imports` could only write one literal specifier via `--to`, but
  this destination is a file in the repo and openmetadata-ui has no `src`
  resolve root, so the relative depth differs per call site. Adds `--toPath`,
  which computes the specifier per file, skips the destination module itself,
  and leaves a default import behind when its named sibling moves.
- Fixes a crash that predates this change: when every specifier of a
  declaration moved into an existing target, the declaration was removed, and
  the second pass of the kind loop then re-filtered a stale collection whose
  paths resolved to whatever shifted into the slot — `path.node.specifiers is
  not iterable`. It now re-queries the AST per pass. This silently skipped two
  files during the bulk run rather than failing loudly.

`Key` was left out of the re-exports: AntD's is React's, so TopicSchema imports
it from react directly.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

❌ PR checklist incomplete

This PR cannot be merged until the following are addressed on its linked issue:

  • No GitHub issue is linked. Link an issue in the Development section of the PR (or add Fixes #12345 to the description). For a same-org cross-repo issue, add Fixes open-metadata/<repo>#123 to the description.

The fields live on the linked issue in the Shipping project (open the issue → right sidebar → Projects). After you set them, re-run this check (or push a commit) — issue/project changes do not re-trigger it automatically.

Maintainers can bypass this check by adding the skip-pr-checks label.

@github-actions github-actions Bot added the UI UI specific issues label Aug 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Hi there 👋 Thanks for your contribution!

The OpenMetadata team will review the PR shortly! Once it has been labeled as safe to test, the CI workflows
will start executing and we'll be able to make sure everything is working as expected.

Let us know if you need any help!

@github-actions

github-actions Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

✅ Playwright Results — workflow succeeded

Validated commit 34ff88f72f1e318a381cead103b57dc051dbdb57 in Playwright run 32729125033, attempt 1.

✅ 1206 passed · ❌ 0 failed · 🟡 3 flaky · ⏭️ 1 skipped · 🧰 0 lifecycle flaky

Performance

Blocking targets: ✅ met · Optimization targets: 🟡 in progress

Shard-job maxima below are not the full workflow wall time; the linked run includes build, fixture, planning, and reporting.

🕒 Full workflow signal wall (to summary) 58m 57s

⏱️ Max setup 5m 37s · max shard execution 18m 57s · max shard-job elapsed before upload 22m 22s · reporting 7s

🌐 218.60 requests/attempt · 2.37 app boots/UI scenario · 33.16% common-shard skew

Optimization targets still in progress:

  • Common shard skew was 33.16% (convergence target: at most 15%).
  • Browser traffic was 218.6 requests per attempt (convergence target: fewer than 200).
  • Application boot ratio was 2.37 per UI scenario (3082 boots / 1298 scenarios; convergence target: at most 1).
Shard Passed Failed Flaky Skipped Lifecycle failed Lifecycle flaky
✅ Shard chromium-01 176 0 0 0 0 0
✅ Shard chromium-02 169 0 0 0 0 0
🟡 Shard chromium-03 172 0 3 1 0 0
✅ Shard chromium-04 136 0 0 0 0 0
✅ Shard chromium-05 146 0 0 0 0 0
✅ Shard chromium-06 172 0 0 0 0 0
✅ Shard data-asset-rules-01 61 0 0 0 0 0
✅ Shard domain-isolation-01 16 0 0 0 0 0
✅ Shard global-state-01 34 0 0 0 0 0
✅ Shard import-export-01 9 0 0 0 0 0
✅ Shard ingestion-01 39 0 0 0 0 0
✅ Shard ingestion-02 34 0 0 0 0 0
✅ Shard reindex-01 2 0 0 0 0 0
✅ Shard search-01 11 0 0 0 0 0
✅ Shard search-rbac-01 29 0 0 0 0 0
🟡 3 flaky test(s) (passed on retry)
  • Features/Glossary/GlossaryAdvancedOperations.spec.tsshould create glossary with multiple owners (users + teams) (shard chromium-03, 1 retry)
  • Features/Glossary/GlossaryHierarchy.spec.tsshould cancel move operation (shard chromium-03, 1 retry)
  • Pages/Glossary.spec.tsApprove and reject glossary term from Glossary Listing (shard chromium-03, 1 retry)

📦 Download artifacts

How to debug locally
# Download playwright-test-results-<shard> artifact and unzip
npx playwright show-trace path/to/trace.zip    # view trace

Comment thread tooling/antd-codemods/transforms/move-named-imports.js
@harsh-vador harsh-vador self-assigned this Aug 24, 2026
@harsh-vador harsh-vador added the safe to test Add this label to run secure Github workflows on PRs label Aug 24, 2026
path.relative uses the platform separator, so a contributor running the
transform on Windows would get specifiers like ..\components\common\Table\
Table.interface written into every touched file — invalid, and silent.

The 'climbs out of nested directories' test already asserts the exact
specifier, so it guards this on a Windows runner; on posix path.sep is
already '/' and the normalization is a no-op.
@github-actions

github-actions Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

⚠️ UI Checkstyle passed — lint findings in changed files

🔍 ESLint findings in this PR's files — 0 error(s), 299 warning(s)

Errors block the build. Warnings do not yet — they are rules whose backlog is still
being worked down, listed so this PR does not add to it. See docs/ui-code-quality-gate.md.

0 error(s), 299 warning(s) across 65 changed file(s).

Count Rule
215 react-hooks/exhaustive-deps
14 sonarjs/cyclomatic-complexity
14 sonarjs/no-duplicate-string
10 sonarjs/expression-complexity
8 openmetadata-imports/no-lower-layer-page-imports
8 sonarjs/no-nested-functions
6 sonarjs/no-nested-conditional
3 i18next/no-literal-string
3 sonarjs/cognitive-complexity
3 react/no-unstable-nested-components
All findings
Location Rule Message
🟡 src/components/APIEndpoint/APIEndpointSchema/APIEndpointSchema.tsx:471:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/Classifications/ClassificationDetails/ClassificationDetails.tsx:109:5 sonarjs/cyclomatic-complexity {"message":"Function has a complexity of 15 which is greater than 10 authorized.","cost":5,"secondaryLocations":[{"line":109,"column":4,"endLine":109,"endColumn
🟡 src/components/Classifications/ClassificationDetails/ClassificationDetails.tsx:203:8 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'isVersionView' and 'navigate'. Either include them or remove the dependency array.
🟡 src/components/Classifications/ClassificationDetails/ClassificationDetails.tsx:212:20 sonarjs/cyclomatic-complexity {"message":"Function has a complexity of 11 which is greater than 10 authorized.","cost":1,"secondaryLocations":[{"line":212,"column":19,"endLine":212,"endColum
🟡 src/components/Classifications/ClassificationDetails/ClassificationDetails.tsx:308:8 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/Classifications/ClassificationDetails/ClassificationDetails.tsx:389:8 react-hooks/exhaustive-deps React Hook useEffect has missing dependencies: 'fetchClassificationChildren', 'handlePageChange', and 'isAddingTag'. Either include them or remove the dependenc
🟡 src/components/Container/ContainerDataModel/ContainerDataModel.tsx:308:5 react-hooks/exhaustive-deps React Hook useMemo has missing dependencies: 't', 'tagFilter.Classification', and 'tagFilter.Glossary'. Either include them or remove the dependency array. Oute
🟡 src/components/Dashboard/DashboardChartTable/DashboardChartTable.tsx:103:6 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'getEntityPermission'. Either include it or remove the dependency array.
🟡 src/components/Dashboard/DashboardChartTable/DashboardChartTable.tsx:128:5 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'fetchChartPermissions' and 't'. Either include them or remove the dependency array.
🟡 src/components/Dashboard/DashboardChartTable/DashboardChartTable.tsx:135:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'getAllChartsPermissions'. Either include it or remove the dependency array.
🟡 src/components/Dashboard/DashboardChartTable/DashboardChartTable.tsx:152:6 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/Dashboard/DashboardChartTable/DashboardChartTable.tsx:287:5 react-hooks/exhaustive-deps React Hook useCallback has an unnecessary dependency: 'chartFilters'. Either exclude it or remove the dependency array.
🟡 src/components/Dashboard/DashboardChartTable/DashboardChartTable.tsx:403:5 react-hooks/exhaustive-deps React Hook useMemo has missing dependencies: 'dashboardDetails?.fullyQualifiedName', 'hasEditGlossaryTermAccess', 't', 'tagFilter.Classification', and 'tagFilte
🟡 src/components/Dashboard/DashboardVersion/DashboardVersion.component.tsx:143:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/Dashboard/DashboardVersion/DashboardVersion.component.tsx:247:5 react-hooks/exhaustive-deps React Hook useMemo has missing dependencies: 'dataProducts', 'domains', 't', and 'tags'. Either include them or remove the dependency array.
🟡 src/components/Dashboard/DataModel/DataModels/DataModelsTable.tsx:40:1 openmetadata-imports/no-lower-layer-page-imports Pages are route-level composition modules. Move the shared implementation/type to a lower layer instead of importing a page from here.
🟡 src/components/Dashboard/DataModel/DataModels/DataModelsTable.tsx:128:5 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'pageSize'. Either include it or remove the dependency array.
🟡 src/components/Dashboard/DataModel/DataModels/DataModelsTable.tsx:195:5 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'handlePagingChange'. Either include it or remove the dependency array.
🟡 src/components/Dashboard/DataModel/DataModels/DataModelsTable.tsx:239:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'searchDataModels'. Either include it or remove the dependency array.
🟡 src/components/Dashboard/DataModel/DataModels/DataModelsTable.tsx:252:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'fetchDashboardsDataModel'. Either include it or remove the dependency array.
🟡 src/components/Dashboard/DataModel/DataModels/ModelTab/ModelTab.component.tsx:167:5 react-hooks/exhaustive-deps React Hook useCallback has an unnecessary dependency: 'paging'. Either exclude it or remove the dependency array.
🟡 src/components/Dashboard/DataModel/DataModels/ModelTab/ModelTab.component.tsx:191:6 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 'deleted'. Either include it or remove the dependency array.
🟡 src/components/Dashboard/DataModel/DataModels/ModelTab/ModelTab.component.tsx:213:9 react-hooks/exhaustive-deps The 'updateColumnDetails' function makes the dependencies of useCallback Hook (at line 242) change on every render. To fix this, wrap the definition of 'updateC
🟡 src/components/Dashboard/DataModel/DataModels/ModelTab/ModelTab.component.tsx:213:9 react-hooks/exhaustive-deps The 'updateColumnDetails' function makes the dependencies of useCallback Hook (at line 259) change on every render. To fix this, wrap the definition of 'updateC
🟡 src/components/Dashboard/DataModel/DataModels/ModelTab/ModelTab.component.tsx:443:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/DataContract/ContractQualityFormTab/ContractQualityFormTab.tsx:93:9 react-hooks/exhaustive-deps The 'fetchAllTests' function makes the dependencies of useCallback Hook (at line 127) change on every render. To fix this, wrap the definition of 'fetchAllTests
🟡 src/components/DataContract/ContractQualityFormTab/ContractQualityFormTab.tsx:93:9 react-hooks/exhaustive-deps The 'fetchAllTests' function makes the dependencies of useCallback Hook (at line 141) change on every render. To fix this, wrap the definition of 'fetchAllTests
🟡 src/components/DataContract/ContractQualityFormTab/ContractQualityFormTab.tsx:166:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/DataContract/ContractQualityFormTab/ContractQualityFormTab.tsx:210:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'fetchAllTests'. Either include it or remove the dependency array.
🟡 src/components/DataContract/ContractSchemaFormTab/ContractScehmaFormTab.tsx:160:6 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 'entityType'. Either include it or remove the dependency array.
🟡 src/components/DataContract/ContractSchemaFormTab/ContractScehmaFormTab.tsx:201:5 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'handlePagingChange'. Either include it or remove the dependency array.
🟡 src/components/DataContract/ContractSchemaFormTab/ContractScehmaFormTab.tsx:243:5 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'oldRemovedColumns' and 'selectedSchema'. Either include them or remove the dependency array. If 'setAllColumns
🟡 src/components/DataContract/ContractSchemaFormTab/ContractScehmaFormTab.tsx:271:6 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'oldRemovedColumns' and 'selectedSchema'. Either include them or remove the dependency array. If 'setAllColumns
🟡 src/components/DataContract/ContractSchemaFormTab/ContractScehmaFormTab.tsx:273:9 react-hooks/exhaustive-deps The 'fetchApiEndPointColumns' function makes the dependencies of useCallback Hook (at line 329) change on every render. Move it inside the useCallback callback.
🟡 src/components/DataContract/ContractSchemaFormTab/ContractScehmaFormTab.tsx:491:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/DataContract/ContractSchemaFormTab/ContractScehmaFormTab.tsx:531:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'fetchColumnsBasedOnEntity'. Either include it or remove the dependency array.
🟡 src/components/DataContract/ContractSchemaTable/ContractSchemaTable.component.tsx:122:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/DataInsight/TopActiveUsers.tsx:67:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'fetchMostActiveUsers'. Either include it or remove the dependency array.
🟡 src/components/DataInsight/TopActiveUsers.tsx:117:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/DataInsight/TopViewEntities.tsx:66:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'fetchMostViewedEntities'. Either include it or remove the dependency array.
🟡 src/components/DataInsight/TopViewEntities.tsx:115:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/Database/DatabaseSchema/DatabaseSchemaTable/DatabaseSchemaTable.tsx:163:5 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'handlePagingChange'. Either include it or remove the dependency array.
🟡 src/components/Database/DatabaseSchema/DatabaseSchemaTable/DatabaseSchemaTable.tsx:193:5 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'pageSize'. Either include it or remove the dependency array.
🟡 src/components/Database/DatabaseSchema/DatabaseSchemaTable/DatabaseSchemaTable.tsx:202:6 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'handlePageChange' and 'setFilters'. Either include them or remove the dependency array.
🟡 src/components/Database/DatabaseSchema/DatabaseSchemaTable/DatabaseSchemaTable.tsx:305:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 'searchValue'. Either include it or remove the dependency array.
🟡 src/components/Database/DatabaseSchema/DatabaseSchemaTable/DatabaseSchemaTable.tsx:341:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'fetchDatabaseSchema'. Either include it or remove the dependency array.
🟡 src/components/Database/SchemaTable/SchemaTable.component.tsx:359:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'fetchTestCaseSummary'. Either include it or remove the dependency array.
🟡 src/components/Database/SchemaTable/SchemaTable.component.tsx:461:5 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'tableFqn'. Either include it or remove the dependency array.
🟡 src/components/Database/SchemaTable/SchemaTable.component.tsx:670:38 i18next/no-literal-string disallow literal string: {t('label.alphabetical')} (A → Z)
🟡 src/components/Database/SchemaTable/SchemaTable.component.tsx:674:62 i18next/no-literal-string disallow literal string:

… and 249 more. Run make ui-checkstyle-changed locally for the full list.


Fix locally (fast - only checks files changed in this branch):

make ui-checkstyle-changed

@github-actions

github-actions Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Jest test Coverage

UI tests summary

Lines Statements Branches Functions
Coverage: 67%
67.06% (80442/119952) 51.47% (49251/95678) 52.46% (14707/28032)

tw-guard's regex is import\s+([^'";]*?)\s+from\s+['"](antd…) with the /s
flag, so the clause can span newlines. The word 'import' in the comment above
the re-exports, with no quote or semicolon between it and the 'antd/lib/table/
interface' specifier, made an export statement look like a new antd import.

The guard never matches 'export … from', so the re-export itself was fine —
only the wording above it needed to change.
@gitar-bot

gitar-bot Bot commented Aug 24, 2026

Copy link
Copy Markdown
Code Review ✅ Approved 1 resolved / 1 findings

Centralizes UI Ant Design table typings behind Table.interface.ts and updates consumers to import from the shared boundary, accompanied by codemod improvements for relative path handling and stale AST collection fixes. No issues found.

✅ 1 resolved
Quality: relativeSpecifier emits backslashes on Windows

📄 tooling/antd-codemods/transforms/move-named-imports.js:16-23
relativeSpecifier returns the raw result of path.relative, which uses \ separators on Windows, producing invalid import specifiers like ..\components\common\Table\Table.interface. This is harmless when the codemod is run on Linux/macOS (as here), but will silently corrupt imports if a contributor runs it on Windows. Normalize the path to forward slashes, e.g. return (rel.startsWith('.') ? rel : './' + rel).split(path.sep).join('/'); or build with path.posix.

Options

Display: compact → Showing less information.

Comment with these commands to change the behavior for this request:

Compact
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Powered by Gitar — free for open source

@sonarqubecloud

Copy link
Copy Markdown

@harsh-vador
harsh-vador added this pull request to the merge queue Aug 25, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Aug 25, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🚦 Removed from the merge queue — failed_checks (2026-08-25T12:19:00Z)

Blocked the queue: playwright-summary

@harsh-vador
harsh-vador added this pull request to the merge queue Aug 25, 2026
Merged via the queue into main with commit 63f27ad Aug 25, 2026
104 of 106 checks passed
@harsh-vador
harsh-vador deleted the feat/tablev2-type-detachment branch August 25, 2026 14:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

safe to test Add this label to run secure Github workflows on PRs UI UI specific issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants