Skip to content

34420 unify component#36172

Merged
oidacra merged 62 commits into
mainfrom
34420-unify-component
Jun 30, 2026
Merged

34420 unify component#36172
oidacra merged 62 commits into
mainfrom
34420-unify-component

Conversation

@nicobytes

@nicobytes nicobytes commented Jun 15, 2026

Copy link
Copy Markdown
Member

This pull request introduces significant updates to the handling and testing of binary fields (file/image uploads) in the content editing experience. The main focus is on unifying the binary field implementation under the new dot-edit-content-file-field component, updating related imports and tests, and improving Playwright E2E test coverage for both the new and legacy editors. The changes also include new and refactored E2E test helpers for binary fields, and adjustments to test data and selectors.

Component and Module Refactoring:

  • The binary field implementation is unified under the dot-edit-content-file-field component, replacing the previous dot-edit-content-binary-field and its wrapper throughout the app and tests. This includes updating Angular module imports, dependency injection, and testbed configuration to use the new component and its bridge (DotBinaryFieldCeBridgeComponent). [1] [2] [3] [4] [5] [6] [7] [8]

E2E Test Enhancements:

  • Adds comprehensive Playwright E2E tests for the binary field image editor in both the new and legacy editors, including creation of content types, file import, and image editing workflows.
  • Introduces new E2E page objects for the legacy content editor and binary field, improving test structure and maintainability. [1] [2] [3]

Test Helper Improvements:

  • Refactors and extends the binary field test helper to support new selectors, actions (like image upload and editor opening), and improved assertions for button visibility and file handling. [1] [2] [3] [4] [5]

Test Data and Selector Updates:

  • Updates the default import-from-URL image to a stable 800x800 PNG for more robust image editor testing.
  • Aligns data-testid and DOM selectors in helpers with the new unified binary field implementation.

These changes collectively modernize the binary field experience, improve test coverage and reliability, and streamline the codebase for future enhancements.

This PR fixes: #34420

This PR fixes: #34420

nicobytes added 11 commits June 15, 2026 10:54
…rapper

- Added a new `DotLegacyImageEditorLauncherService` to manage the image editor dialog lifecycle.
- Introduced `DotLegacyImageEditorDialogComponent` for rendering the image editor iframe.
- Updated `DotBinaryFieldWrapperComponent` to utilize the image editor service and handle value updates.
- Enhanced the binary field HTML template to include an image editor toggle.
- Added unit tests for the new image editor dialog and launcher service.

This implementation allows users to edit images directly within the binary field, improving the content editing experience.
…message event handling

- Added `dispatchSpy.restore()` calls to ensure proper cleanup after each test case.
- Updated the origin check in the message event test to use a variable for invalid origins, improving test reliability.
- Enhanced assertions to ensure that only valid events trigger the expected behavior.

These changes improve the robustness of the unit tests for the `DotLegacyImageEditorLauncherService`.
- Introduced a new specification for the binary field image editor, verifying the visibility of the Edit button and the opening of the legacy Dojo Image Editor in both new and legacy content editors.
- Created helper classes for managing interactions with the binary field and legacy binary field within the tests.
- Updated the binary field helper to include methods for image upload and editor interaction.
- Enhanced the legacy binary field helper to support image editing in the legacy editor.

These changes improve the testing coverage for the binary field image editor functionality, ensuring a seamless user experience across different content editor versions.
…ar' of github.com:dotCMS/core into 34420-epic-image-editor-feature-parity-migrate-to-angular
…ame security handling

- Changed the default image URL for import-from-URL tests to a stable 800x800 PNG from `placehold.co`.
- Updated the `DotLegacyImageEditorDialogComponent` to use the SafeUrlPipe for iframe URL sanitization, improving security.
- Adjusted related documentation to reflect the new image URL and its dimensions.

These changes enhance the reliability and security of the binary field image editor functionality.
…file

- Deleted the `binary-field-image-editor.md` specification file as it is no longer needed.
- This cleanup helps streamline the project documentation and maintain focus on current testing strategies.

No functional changes were made to the codebase.
- Replaced the `DotEditContentBinaryFieldComponent` with `DotEditContentFileFieldComponent` to unify the handling of binary and file fields.
- Updated related tests and helper classes to reflect the new component structure.
- Removed outdated binary field HTML, SCSS, and spec files to streamline the codebase.

These changes enhance the maintainability and consistency of the binary field functionality within the content editing framework.
- Introduced `LegacyDialogImageEditorLauncher` to replace the previous Dojo-based image editor integration, allowing the legacy image editor to be opened in a PrimeNG dialog.
- Updated the `DotFileFieldComponent` to conditionally expose the image editor action only for binary fields.
- Modified related tests and components to accommodate the new image editor launcher and ensure proper functionality.
- Enhanced the styling of the file field component for better layout consistency.

These changes improve the user experience by modernizing the image editing workflow within the content editing framework.
@github-actions github-actions Bot added Area : Backend PR changes Java/Maven backend code Area : Frontend PR changes Angular/TypeScript frontend code labels Jun 15, 2026
@claude

claude Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Claude finished @erickgonzalez's task in 1m 9s —— View job


Rollback Safety Analysis

  • Read rollback-unsafe categories reference
  • Get full PR diff
  • Analyze diff against unsafe categories
  • Post findings / add label

Result: ✅ Safe to Rollback

Label added: AI: Safe To Rollback

Analysis

All changed files fall into two categories: frontend TypeScript/Angular and a Language.properties addition. Neither touches any rollback-unsafe category.

Category Finding
C-1 Structural data model change ❌ No runonce tasks, no schema changes
C-2 Elasticsearch mapping change ❌ No ESMappingAPIImpl / ESMappingConstants changes
C-3 Content JSON model version bump ❌ No ImmutableContentlet / CURRENT_MODEL_VERSION changes
C-4 DROP TABLE / DROP COLUMN ❌ No SQL drop statements
H-1 One-way data migration ❌ No data transformation tasks
H-2 RENAME TABLE / RENAME COLUMN ❌ None
H-3 PK restructuring ❌ None
H-4 New content field type (Java) ❌ No new Java Field implementations registered
H-5 Binary storage provider change ❌ No FileStorageAPIImpl / StoragePersistenceProvider changes
H-6 DROP PROCEDURE / FUNCTION ❌ None
H-7 NOT NULL column without default ❌ No schema changes
H-8 VTL viewtool contract change ❌ No viewtool classes modified
M-1 Non-broadening column type change ❌ None
M-2 Push publishing bundle format ❌ None
M-3 REST / GraphQL API contract change ❌ No REST endpoint or response shape changes
M-4 OSGi public interface change ❌ None

Summary

The PR is a pure frontend refactor: it removes the legacy dot-edit-content-binary-field Angular component and replaces it with dot-edit-content-file-field / DotBinaryFieldCeBridgeComponent. Backend changes are limited to three new i18n key additions in Language.properties (additive-only). There are no database migrations, no Elasticsearch mapping changes, no Java API contract changes, and no data transformations. Rolling back to the previous release would simply restore the old Angular components — no database or index recovery needed.

@github-actions

github-actions Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

🤖 Codex Review — openai.gpt-5.5

**[> [🟡 Medium] core-web/apps/dotcms-ui-e2e/src/tests/edit-content/fields/binary-field/binary-field.spec.ts:184 — The test now always expects the dotAI button to be disabled, but the removed isAiButtonEnabled()/test.skip(...) guard handled environments where the dotAI plugin is installed. This makes the suite fail in plugin-enabled environments even though the behavior is valid there.


Run: #27565980035 · tokens: in: 19850 · out: 3914 (reasoning: 3814) · total: 23764

- Updated the binary field image editor tests to reflect the new legacy image editor dialog behavior.
- Added tests to verify that the "Edit image" button is hidden for non-image file uploads and that the confirmation popup appears when removing a file.
- Improved the existing test for editing binary content to ensure it displays the preview without server errors.

These changes enhance the test coverage and reliability of the binary field image handling functionality within the content editing framework.
…nd image fields

- Refactored the required field tests for binary, file, and image fields to use a consistent structure with `beforeEach` and `afterEach` hooks for setup and teardown.
- Improved test readability and maintainability by encapsulating the creation and deletion of content types within dedicated hooks.
- Ensured that error handling for required fields is properly tested across all relevant field types.

These changes enhance the clarity and organization of the end-to-end tests for required fields in the content editing framework.
@github-actions

github-actions Bot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

🤖 Bedrock Review — deepseek.v3.2

[🟡 Medium] core-web/apps/dotcms-binary-field-builder/src/app/app.module.ts:1-57DotWorkflowActionsFireService added as provider but not used in the module. This adds unnecessary dependency overhead.

[🟡 Medium] core-web/apps/dotcms-ui-e2e/src/pages/legacyEditContentForm.page.ts:14-26matchingFrames.at(-1) assumes the last matching frame is the correct one; could be fragile if multiple frames match the pattern. Should include a more specific selector or validation.

[🟠 High] core-web/apps/dotcms-ui-e2e/src/tests/content-search/portlet-integrity.spec.ts:70-84 — Intercepting POST to **/api/content/_search with a mock response could mask actual API failures in the test. Should at least verify the request was made with correct parameters.

[🟡 Medium] core-web/apps/dotcms-ui-e2e/src/tests/edit-content/fields/file-upload-fields/binary-field/helpers/binary-field.ts:77-90expectAiButtonDisabledWithTooltipWhenApplicable() silently returns if button is enabled; test could pass incorrectly if AI is enabled but tooltip behavior is broken. Should log or assert the expected state.

[🟡 Medium] core-web/libs/data-access/src/lib/dot-messages/dot-messages.service.ts:67-92getAll() returns Observable<void> but also calls subscribe() internally for backward compatibility. This dual behavior could cause confusion or double subscriptions. Consider deprecating the side effect.

[🟡 Medium] core-web/libs/edit-content/src/lib/components/dot-edit-content-field/dot-edit-content-field.component.ts:103-176 — Binary, File, and Image fields all emit onBinaryFieldValueUpdated($event). Ensure the event payload is consistent across field types; otherwise, type safety could be broken.

[🟠 High] core-web/libs/edit-content/src/lib/components/dot-edit-content-field/dot-edit-content-field.component.spec.ts:183-201 — Binary field test configuration now uses DotEditContentFileFieldComponent but provides a mock DotFileFieldUploadService with an empty object {}. This may not satisfy the service's dependencies, potentially causing test failures.

[🔴 Critical] core-web/libs/edit-content/src/lib/fields/dot-edit-content-binary-field/components/dot-binary-field-editor/dot-binary-field-editor.component.html — File deleted without apparent migration path. If this component was used elsewhere, it could break functionality. Verify no other references exist.

[🟡 Medium] core-web/apps/dotcms-ui-e2e/src/tests/edit-content/fields/relationship-field/helpers/relationship-field.ts:151-195dragRowToPosition() uses hardcoded steps: 10 in mouse movement; may not be reliable across different environments or CI speeds. Consider making it configurable or using Playwright's drag-and-drop utilities.

[🟡 Medium] core-web/apps/dotcms-ui-e2e/src/utils/contentListingNavigation.ts:56-63clickAddNewContentFromList() uses expect(...).toPass() with a 20-second timeout for the entire retry loop, but each attempt has its own 2-second timeouts. Could lead to flaky tests if the menu is slow; consider increasing the inner timeouts or using a single robust wait.


Run: #28004093436 · tokens: in: 21306 · out: 771 · total: 22077

@nicobytes

Copy link
Copy Markdown
Member Author

@copilot resolve the merge conflicts in this pull request

@github-actions

github-actions Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

🤖 Bedrock Review — qwen.qwen3-next-80b-a3b

New Issues

  • 🔴 Critical: core-web/apps/dotcms-binary-field-builder/src/app/app.module.ts:49firstValueFrom(dotMessageService.init()) is called inside provideAppInitializer(), but init() returns an Observable<void> that emits only after HTTP or localStorage resolution. This blocks Angular bootstrap until the observable completes — which may never complete if the HTTP call fails, hangs, or if the app is offline. No timeout, retry, or fallback is implemented. Bootstrap hangs indefinitely on network failure or misconfigured backend.
  • 🟠 High: core-web/libs/data-access/src/lib/dot-messages/dot-messages.service.ts:67getAll() returns of(void 0) when messages are in localStorage, but the messageMap assignment is outside the observable chain. If shouldReloadMessages() is false, messageMap is set from localStorage, but the returned Observable<void> emits immediately — yet the HTTP call is never made to update messages on build change. This breaks message refresh on app updates. The observable chain is broken: of(void 0) emits before messageMap is updated from HTTP, and the HTTP path never completes the observable if it fails.
  • 🟡 Medium: core-web/apps/dotcms-binary-field-builder/src/app/app.module.ts:49provideAppInitializer() uses firstValueFrom() on a non-terminating observable. If init() emits multiple values (e.g., due to race or bug), firstValueFrom() will resolve on the first, but the observable may still be active and cause side effects later. This is not a bug yet, but violates the contract of AppInitializer — which expects synchronous or single-emitting initialization. What to verify: Does DotMessageService.init() ever emit more than once? If yes, this causes unpredictable behavior.

Existing

  • 🔴 Critical: core-web/apps/dotcms-binary-field-builder/src/app/app.module.ts:49 — inject(DotMessageService) inside provideAppInitializer() before injector is fully configured, causing runtime errors during app bootstrap — still present. The inject() call inside provideAppInitializer() runs before the injector is fully initialized, which is a known Angular bug pattern. This is not fixed by the current diff — it was already flagged and remains broken.

Resolved

  • core-web/apps/dotcms-ui-e2e/src/tests/edit-content/fields/binary-field/helpers/binary-field.ts — deleted file, replaced by file-upload-fields variant with proper inheritance and logic. No longer relevant.
  • core-web/apps/dotcms-ui-e2e/src/tests/edit-content/fields/binary-field/binary-field.spec.ts — refactored to use NewEditContentFormPage and BinaryField from new location. Test logic preserved, no regression.
  • core-web/libs/edit-content/src/index.ts — export path updated to new component location. No longer references deleted DotEditContentBinaryFieldComponent.

Run: #28260483757 · tokens: in: 20950 · out: 872 · total: 21822

@github-actions

github-actions Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

🤖 Bedrock Review — qwen.qwen3-next-80b-a3b

New Issues

  • 🔴 Critical: core-web/apps/dotcms-binary-field-builder/src/app/app.module.ts:49firstValueFrom(dotMessageService.init()) blocks Angular bootstrap indefinitely on HTTP failure or network issues with no timeout or fallback
  • 🔴 Critical: core-web/apps/dotcms-binary-field-builder/src/app/app.module.ts:49inject(DotMessageService) inside provideAppInitializer() before injector is fully configured, causing runtime errors during app bootstrap
  • 🟠 High: core-web/libs/data-access/src/lib/dot-messages/dot-messages.service.ts:67getAll() returns of(void 0) when messages are in localStorage, but messageMap is set outside the observable chain — breaks message refresh on build change

Existing

  • 🔴 Critical: core-web/apps/dotcms-binary-field-builder/src/app/app.module.ts:49 — firstValueFrom(dotMessageService.init()) blocks Angular bootstrap indefinitely on HTTP failure or network issues with no timeout or fallback
  • 🟠 High: core-web/libs/data-access/src/lib/dot-messages/dot-messages.service.ts:67 — getAll() returns of(void 0) when messages are in localStorage, but messageMap is set outside the observable chain — breaks message refresh on build change
  • 🟡 Medium: core-web/apps/dotcms-binary-field-builder/src/app/app.module.ts:49 — provideAppInitializer() uses firstValueFrom() on a non-terminating observable — may cause side effects if init() emits multiple values
  • 🔴 Critical: core-web/apps/dotcms-binary-field-builder/src/app/app.module.ts:49 — inject(DotMessageService) inside provideAppInitializer() before injector is fully configured, causing runtime errors during app bootstrap

Resolved

  • core-web/apps/dotcms-binary-field-builder/src/app/app.module.ts:49provideAppInitializer() now wraps firstValueFrom() in a function, but the underlying issues remain unaddressed (see above)
  • core-web/libs/data-access/src/lib/dot-messages/dot-messages.service.ts:67getAll() now returns an Observable<void>, but the messageMap assignment outside the observable chain persists — this was not fixed

Run: #28263776761 · tokens: in: 21200 · out: 886 · total: 22086

adrianjm-dotCMS and others added 4 commits June 26, 2026 17:01
- Enhanced `DotFileFieldComponent` to support AI-generated images by adding a new method to map AI images to the expected file format for both Binary and Image fields.
- Updated the component's dialog handling to store AI images correctly, ensuring that Binary fields use a temporary file ID while Image fields reference the contentlet directly.
- Added unit tests to verify the correct behavior of AI image storage for both field types.

These changes improve the functionality and user experience of the file handling components by integrating AI image generation capabilities.
…into DotFileFieldComponent

Resolves the merge with main (PR #36236, new @dotcms/image-editor library).
The legacy dot-edit-content-binary-field component is intentionally removed in
this unify branch, so main's IMAGE_EDITOR_LAUNCHER wiring (added to that legacy
component) is re-applied to the unified DotFileFieldComponent instead:

- Inject IMAGE_EDITOR_LAUNCHER as { optional: true }.
- onEditImage() prefers the new Angular editor when the launcher is provided
  (Angular edit-content shell) and FEATURE_FLAG_NEW_IMAGE_EDITOR is on; otherwise
  falls back to the legacy Dojo/dialog launchers.
- Extract a shared #applyEditedImage() helper for both paths.
- Add tests covering the new-editor and legacy-fallback paths.

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

github-actions Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

🤖 dotBot Review (Bedrock)

Reviewed 33 file(s); 12 candidate(s) → 8 confirmed, 2 uncertain (unverified, kept for review).

⚠️ Coverage capped: 0 file(s) + 19 lower-severity candidate(s) skipped (limits: 40 files, 12 candidates).

Confirmed findings

  • 🟠 High core-web/apps/dotcms-ui-e2e/src/tests/edit-content/fields/file-upload-fields/binary-field/binary-field.spec.ts:62 — Incorrect admin path in E2E test navigation
    The test uses /dotAdmin/#/content/... URL path but dotCMS admin paths typically use /html/ base. This would cause navigation failures in the E2E test as the correct path should be /html/....
  • 🟡 Medium core-web/apps/dotcms-ui-e2e/src/pages/newEditContentForm.page.ts:13 — Potential race condition due to removed domcontentloaded wait
    The removal of page.waitForLoadState('domcontentloaded') in newEditContentForm.page.ts without ensuring the goToEditContent utility handles page readiness could lead to race conditions. While goToEditContentlet performs Angular router navigation, Playwright E2E tests require explicit waits for client-side rendered elements. The current implementation lacks a wait for the binary field component to be interactive after navigation, risking flaky tests when elements aren't ready.
  • 🟡 Medium core-web/apps/dotcms-ui-e2e/src/pages/newEditContentForm.page.ts:20 — Potential test flakiness from removed synchronization
    The removal of Dojo-specific waits (waitForDojoToBeReady) and forceClick in newEditContentForm.page.ts eliminates synchronization points that may have been compensating for animation/rendering delays. While Playwright has auto-waiting, the test structure shown doesn't demonstrate replacement waits for the new component's render patterns, creating risk of race conditions in CI environments.
  • 🟡 Medium core-web/apps/dotcms-ui-e2e/src/tests/content-search/helpers/content-listing.ts:113 — Non-unique selector for API link in test
    The selector '.dot-api-link' in content-listing.ts line 113 uses a class that's part of the dot-api-link Angular component's template (rendered as ). While current usage appears limited to 1 instance per view, this class-based selector is fragile against component template changes. Safer to use component tag selector 'dot-api-link' or a data-testid attribute for E2E stability.
  • 🟡 Medium core-web/apps/dotcms-ui-e2e/src/tests/edit-content/fields/file-upload-fields/binary-field/binary-field.spec.ts:65 — Fixed timeout in E2E test may cause flakiness
    The test uses a fixed 15-second timeout for checking title visibility. While this might work in some environments, it introduces flakiness in slower CI/CD pipelines or under heavy load. Playwright's default timeout (30s) would be more reliable, and explicit waits should generally be avoided unless necessary for specific slow operations.
  • 🟡 Medium core-web/apps/dotcms-ui-e2e/src/tests/edit-content/fields/file-upload-fields/binary-field/binary-field.spec.ts:181 — AI button test may fail when plugin is not installed
    The test expects the AI button to be visible without verifying if the required plugin is installed. This could lead to false test failures in environments without the AI plugin. The assertion expect(aiButton).toBeVisible() will fail if the plugin isn't present, but the test doesn't include setup steps to ensure plugin availability.
  • 🟡 Medium core-web/apps/dotcms-ui-e2e/src/tests/edit-content/fields/file-upload-fields/binary-field/helpers/binary-field.ts:27 — Incomplete success check in upload response
    The test helper checks for HTTP 200 status but doesn't validate response content. The /api/v1/workflow/actions/default/fire/PUBLISH endpoint returns 200 even when content validation fails (e.g., required file missing), with errors in the response body. This could lead to false-positive test passes where publish appears successful despite upload failures.
  • 🟡 Medium core-web/apps/dotcms-ui-e2e/src/tests/edit-content/fields/file-upload-fields/binary-field/helpers/binary-field.ts:67 — Missing timeout in page.waitForResponse for /byUrl endpoint
    The page.waitForResponse call in binary-field.ts line 67 lacks a timeout parameter. While Playwright's default 30s timeout would eventually fail, explicit timeouts improve test reliability. This could lead to prolonged test execution if the endpoint hangs, particularly in CI environments where resource limits exist.

🔎 Uncertain (could not confirm or disprove — review manually)

  • 🟠 High core-web/libs/edit-content/src/lib/components/dot-edit-content-field/dot-edit-content-field.component.spec.ts:197 — Potential form control registration conflict for binary field
    The removal of 'outsideFormControl: true' in BINARY field configuration (line 197) suggests parent form now manages control, but without seeing DotEditContentFileFieldComponent's implementation, we can't confirm if this creates duplication. Requires manual verification of component's form control integration strategy.
  • 🟡 Medium core-web/apps/dotcms-ui-e2e/src/tests/edit-content/fields/file-upload-fields/binary-field/binary-field-system-options.spec.ts:19 — System options JSON keys may mismatch backend expectations
    The test uses camelCase keys (allowedContentTypes, maxFiles) which might not align with backend expectations (e.g. snake_case). Without access to backend field configuration code, it's unclear if these keys match the expected format. E2E tests may pass even if keys are incorrect if assertions don't validate the actual system behavior.

us.deepseek.r1-v1:0 · Run: #28407741326 · tokens: in: 177314 · out: 45317 · total: 222631 · calls: 55 · est. ~$0.484

@mergify

mergify Bot commented Jun 29, 2026

Copy link
Copy Markdown

Tick the box to add this pull request to the merge queue (same as @mergifyio queue).

  • Queue this pull request

@oidacra oidacra enabled auto-merge June 29, 2026 14:14
…on input type

- Modified the `showInfoButton` property in the template to display the button only when the input type is not 'Binary', enhancing user experience by providing relevant information based on the file type.
- This change improves the flexibility of the component's interface, aligning it with user needs.
Comment thread core-web/apps/dotcms-ui-e2e/src/pages/legacyEditContentForm.page.ts
…dling

- Updated `project.json` to include a new SCSS file for material symbols.
- Modified `dot-file-field.component.html` to remove the conditional display of the info button based on input type.
- Adjusted `dot-file-field.component.ts` to hide the PrimeNG header in the dialog and added full-screen toggle functionality.
- Enhanced `dot-file-field-preview.component.html` to reposition the remove action button and ensure it is always visible.
- Updated styles in `dot-file-field-preview.component.scss` to maintain consistent positioning of the remove action across different screen sizes.
- Refined `dot-form-file-editor.component.html` and `dot-form-file-editor.component.scss` to improve the layout and styling of the file editor, including a new header and footer structure.
- Added functionality to refresh language metadata based on the file extension in `form-file-editor.store.ts`.

These changes collectively enhance the user experience and maintainability of the file handling components.
Comment thread core-web/apps/dotcms-ui-e2e/src/pages/legacyEditContentForm.page.ts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AI: Safe To Rollback Area : Frontend PR changes Angular/TypeScript frontend code

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

[EPIC] Image Editor Feature Parity Migrate to Angular

6 participants