Skip to content

Conversation

@jdotcms
Copy link
Contributor

@jdotcms jdotcms commented Nov 5, 2025

Adding the rag embedding implementation

This PR fixes: #32639

hmoreras and others added 29 commits November 10, 2025 14:38
…from Modules to Standalone (#33602)

### Proposed Changes
* Mass migration from NgModules to the Angular Standalone Architecture.
* Total Progress: 87.9% of the full migration is now complete (160 out
of 182 modules).
* Apps & Core Features: We have reached 93.5% completion on application
modules, successfully modernizing almost all major user-facing features.


This PR fixes: #33573

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: erickgonzalez <erick.gonzalez@dotcms.com>
### Proposed Changes
This pull request implements a significant refactor of the breadcrumb
(crumbtrail) system, centralizing breadcrumb state management into a new
`GlobalStore` and updating related components and services to use this
unified approach. Additionally, breadcrumbs are now dynamically updated
in various route resolvers, and some UI and styling improvements have
been made for better integration and display.

Key changes include:

**Breadcrumb State Management Refactor:**

- Replaced the old `DotCrumbtrailService` with a new centralized
`GlobalStore` for managing breadcrumbs, removing the service and
updating all references in `dot-crumbtrail.component.ts` and its module.
Breadcrumbs are now accessed and updated through the `GlobalStore`.
[[1]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L2-R4)
[[2]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L13-R17)
[[3]](diffhunk://#diff-caf8b78dadac7b1cd37a71efbdfedb5baa667266e91436367ba360ee5d7c84c2L7-R11)
[[4]](diffhunk://#diff-d47e844021f103caff73f8be39c8139d22fba892163ecf08831fa654b9d834dcL1-L202)

- Updated the `dot-crumbtrail` component to use signals/selectors from
`GlobalStore` for both the breadcrumb list and the last breadcrumb
label, simplifying the logic and improving performance.
[[1]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L13-R17)
[[2]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L36-R36)

**Dynamic Breadcrumb Updates in Route Resolvers:**

- Enhanced the `DotAppsConfigurationResolver`,
`DotContentTypeEditResolver`, and `DotEditPageResolver` to dynamically
add or update breadcrumbs in the `GlobalStore` based on the resolved
data (e.g., app name, content type, or page title) using the
`addNewBreadcrumb` method.
[[1]](diffhunk://#diff-2798a62b348f79fb4dbf623885b5ed07436459eac679c5727ea19847b6bf087dR23-R37)
[[2]](diffhunk://#diff-332361eb6b93a343258fde0f5f97e2b17752d559ee7d04cdc576caab098e0792R34-R60)
[[3]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8L43-R51)

- Added necessary imports and injected the `GlobalStore` into these
resolvers to support the new breadcrumb management.
[[1]](diffhunk://#diff-2798a62b348f79fb4dbf623885b5ed07436459eac679c5727ea19847b6bf087dL6-R9)
[[2]](diffhunk://#diff-332361eb6b93a343258fde0f5f97e2b17752d559ee7d04cdc576caab098e0792R18)
[[3]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8R16)
[[4]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8L30-R31)

**Navigation Menu Integration:**

- Modified the `DotNavigationService` to update the `GlobalStore` with
menu items when the navigation menu is loaded, ensuring breadcrumbs have
access to menu context.
[[1]](diffhunk://#diff-7c936a15ecd10a75d9a6f8b17057087b6fe980882503ad5276e9de5cf029c8c9R17)
[[2]](diffhunk://#diff-7c936a15ecd10a75d9a6f8b17057087b6fe980882503ad5276e9de5cf029c8c9R172)
[[3]](diffhunk://#diff-7c936a15ecd10a75d9a6f8b17057087b6fe980882503ad5276e9de5cf029c8c9R185)

**UI and Styling Improvements:**

- Improved the breadcrumb display by adding a `truncate-text` class to
the last breadcrumb label, ensuring long labels are truncated for better
UI.

- Adjusted the toolbar and crumbtrail component styles and layout for
better responsiveness and alignment.
[[1]](diffhunk://#diff-007c0789086dcf79d0215837b4f44a84cabec3ab41c790dc040cb829b0cb4b9bL3-R3)
[[2]](diffhunk://#diff-49e35a338c5a1694d5ff515e4eb2de19a2d92e1426efbdfbcc3750617a026d2cR24-R27)

**Other Technical Updates:**

- Updated RxJS and Angular imports to include `tap` where side effects
(breadcrumb updates) are now performed in resolvers.
[[1]](diffhunk://#diff-2798a62b348f79fb4dbf623885b5ed07436459eac679c5727ea19847b6bf087dL6-R9)
[[2]](diffhunk://#diff-332361eb6b93a343258fde0f5f97e2b17752d559ee7d04cdc576caab098e0792L7-R7)
[[3]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8L7-R7)

- Removed the now-obsolete `DotCrumbtrailService` implementation file.

These changes collectively modernize and centralize breadcrumb
management, improve maintainability, and enhance the user experience
with more accurate and dynamic breadcrumb trails.

---

**Breadcrumb State Refactor:**
- Replaced `DotCrumbtrailService` with a centralized `GlobalStore` for
handling breadcrumbs, updating all component and module references and
removing the old service.
[[1]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L2-R4)
[[2]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L13-R17)
[[3]](diffhunk://#diff-caf8b78dadac7b1cd37a71efbdfedb5baa667266e91436367ba360ee5d7c84c2L7-R11)
[[4]](diffhunk://#diff-d47e844021f103caff73f8be39c8139d22fba892163ecf08831fa654b9d834dcL1-L202)
- Simplified the `dot-crumbtrail` component to use signals/selectors
from `GlobalStore` for breadcrumbs and the last breadcrumb label.
[[1]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L13-R17)
[[2]](diffhunk://#diff-078583b0e58182b3dd9fbcbcf0db6c939d7c6a6326c48fa595f7aa8cf9b94c14L36-R36)

**Dynamic Breadcrumb Updates:**
- Updated route resolvers (`DotAppsConfigurationResolver`,
`DotContentTypeEditResolver`, `DotEditPageResolver`) to add breadcrumbs
dynamically to the `GlobalStore` based on resolved data.
[[1]](diffhunk://#diff-2798a62b348f79fb4dbf623885b5ed07436459eac679c5727ea19847b6bf087dR23-R37)
[[2]](diffhunk://#diff-332361eb6b93a343258fde0f5f97e2b17752d559ee7d04cdc576caab098e0792R34-R60)
[[3]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8L43-R51)
- Injected `GlobalStore` and added necessary imports in resolvers for
breadcrumb management.
[[1]](diffhunk://#diff-2798a62b348f79fb4dbf623885b5ed07436459eac679c5727ea19847b6bf087dL6-R9)
[[2]](diffhunk://#diff-332361eb6b93a343258fde0f5f97e2b17752d559ee7d04cdc576caab098e0792R18)
[[3]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8R16)
[[4]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8L30-R31)

**Navigation Menu Integration:**
- Updated `DotNavigationService` to push menu items into the
`GlobalStore` for context-aware breadcrumbs.
[[1]](diffhunk://#diff-7c936a15ecd10a75d9a6f8b17057087b6fe980882503ad5276e9de5cf029c8c9R17)
[[2]](diffhunk://#diff-7c936a15ecd10a75d9a6f8b17057087b6fe980882503ad5276e9de5cf029c8c9R172)
[[3]](diffhunk://#diff-7c936a15ecd10a75d9a6f8b17057087b6fe980882503ad5276e9de5cf029c8c9R185)

**UI/Styling Improvements:**
- Added a `truncate-text` class to the last breadcrumb for better
display of long labels.
- Improved toolbar and crumbtrail styling for layout and responsiveness.
[[1]](diffhunk://#diff-007c0789086dcf79d0215837b4f44a84cabec3ab41c790dc040cb829b0cb4b9bL3-R3)
[[2]](diffhunk://#diff-49e35a338c5a1694d5ff515e4eb2de19a2d92e1426efbdfbcc3750617a026d2cR24-R27)

**Technical Updates:**
- Updated RxJS/Angular imports to support new side effects in resolvers.
[[1]](diffhunk://#diff-2798a62b348f79fb4dbf623885b5ed07436459eac679c5727ea19847b6bf087dL6-R9)
[[2]](diffhunk://#diff-332361eb6b93a343258fde0f5f97e2b17752d559ee7d04cdc576caab098e0792L7-R7)
[[3]](diffhunk://#diff-11655e8e89a6ae1ab9a3b767f124c405b3ca914e8e523123544d4563d85c41d8L7-R7)
- Removed the obsolete `DotCrumbtrailService` file.



This PR fixes: #33565

---------

Co-authored-by: erickgonzalez <erick.gonzalez@dotcms.com>
Co-authored-by: Adrian Molina <adrian.molina@dotcms.com>
Co-authored-by: Dario Daza <dario.daza@dotcms.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…#33750)

## Description

Comprehensive fix for flaky integration tests caused by timing issues,
date precision, and critical background thread request context problems.

## Changes
- Fixed background thread request context issues causing
NullPointerException in bundle publishing
- Improved PublisherQueueJob to use
JobExecutionContext.getPreviousFireTime() when available
- Enhanced PublishDateUpdater with better edge case handling and
parameter validation
- Fixed ContentTypeHandler to use bundle owner from PublisherConfig
instead of hardcoded system user
- Added null checks in FieldAPIImpl for HTTP request access in
background threads
- Replaced Thread.sleep with Awaitility framework for proper async
operation waiting
- Improved date extraction and sorting validation in
ContentTypeCommandIT tests
- Added detailed error messages and better assertion handling
- **Fixed AppsResourceTest flaky cache timing issues** (see below)

## Root Cause Analysis

### Primary Issue
Code accessing HTTP request context in background threads (bundle
publishing runs in Quartz jobs where HTTP request is recycled). This
caused cascade failures across multiple tests that appeared unrelated.

### AppsResourceTest Cache Timing Issue
The CI run revealed an **existing flaky test** unrelated to our changes:
`AppsResourceTest.Test_Pagination_And_Sort_Then_Request_Filter_Expect_Empty_Results`

**Symptoms**:
- Expected 26 hosts but got 11 (wrong count)
- Expected SYSTEM_HOST first but got random host IDs (wrong ordering)

**Root Cause**: The test creates hosts rapidly and immediately queries
them via `hostAPI.findAllFromCache()`, but the cache hasn't been updated
yet with the newly created hosts. Classic race condition.

**Solution**: Added explicit cache warming after host creation in three
methods:
1. `Test_Pagination_And_Sort_Then_Request_Filter_Expect_Empty_Results`
2.
`Test_Create_app_descriptor_Then_Create_App_Integration_Then_Delete_The_Whole_App`
3.
`Test_Create_App_descriptor_Then_Create_App_Integration_Then_Delete_One_Single_Secret`

```java
// Ensure the host cache is properly warmed with all newly created hosts
// This prevents race conditions where the cache might not have all hosts yet
CacheLocator.getHostCache().clearCache();
APILocator.getHostAPI().findAllFromDB(APILocator.systemUser(), 
    com.dotmarketing.portlets.contentlet.business.HostAPI.SearchType.INCLUDE_SYSTEM_HOST);
```

## Testing
- All affected integration tests now pass consistently
- Verified PublisherTest timing scenarios with proper synchronization
- Tested ContentTypeCommandIT modDate sorting with second-level
precision
- Validated background thread safety and user context propagation
- **Verified AppsResourceTest now passes consistently with cache warming
fix**

Closes #33746
) (#33761)

## Description

Refactored cicd-diagnostics skill from bash to Python for improved
compatibility, maintainability, and Claude Code skill standards
compliance.

## Motivation for Python Migration

The original bash implementation had several critical issues that
necessitated the migration to Python:

### 1. Non-standard for Claude Code Skills
- Python is the **recommended and standard language** for Claude Code
skills
- Better integration with Claude Code's error handling and output
formatting
- Structured output and parameter parsing that Claude can reliably
interpret

### 2. Shell Compatibility Problems
- **Bash-specific features** don't work across all shell environments
(bash vs zsh vs sh)
- Array handling differs between shells, causing failures on different
systems
- String manipulation and advanced features have varying support
- Portability issues across macOS (zsh default), Linux (bash), and CI
environments

### 3. Limited Error Handling
- Bash error handling is primitive (set -e, exit codes)
- Difficult to provide meaningful error messages to Claude
- Hard to implement graceful failure recovery
- Debugging bash scripts is significantly more difficult

### 4. Parameter Validation Complexity
- Validating complex parameters in bash is verbose and error-prone
- Type checking is difficult (everything is a string)
- Parsing structured data (JSON, arrays) requires external tools (jq,
etc.)

### 5. External Service Detection Requirements
- Need robust HTTP libraries for GitHub API status checks
- JSON parsing for dependency health checks
- Better error handling for network failures

## Benefits of Python Implementation

- **Standard library richness**: Built-in JSON, HTTP, regex, data
structures
- **Superior error handling**: Try/except with meaningful exceptions
- **Type hints**: Clear parameter types and validation
- **Maintainability**: More readable, easier to extend
- **Cross-platform**: Consistent behavior across environments
- **Testing**: Better unit testing capabilities

## Changes

- Converted all bash diagnostic scripts to Python modules
- Added parameter validation with clear error messages
- Implemented external issue detection (GitHub API status, dependency
checks)
- Enhanced investigation workflow with decision-tree approach
- Improved documentation with Python examples
- Added comprehensive error handling and logging

## Testing

- Tested investigation workflows with various failure types
- Validated parameter parsing and error handling
- Verified external issue detection capabilities
- Confirmed compatibility across different environments

Closes #33760
This PR introduces minor tweaks to padding and font-weight to improve
the overall layout and readability.

### Changes include:

* Adjusted padding on `dot-sub-nav.component.scss` to improve spacing.
* Updated font-weight for the group header to enhance visual hierarchy
and readability.


### Screenshots
<img width="643" height="555" alt="image"
src="https://github.com/user-attachments/assets/05fba5d3-90f5-46b2-9022-2605417eb089"
/>

### Related issue

This PR fixes #32296

---------

Co-authored-by: Nicolas Molina Monroy <hi@nicobytes.com>
Closes #33795

Adds CONTRIBUTING.md with guidelines for creating new tools and an
example tool template.

**Changes:**
- Added CONTRIBUTING.md with CONTEXT framework principles
- Created example tool template in src/tools/_example-tool/
- Includes best practices for tool development
## Description

This PR resolves issue #33802 by migrating from the deprecated
`macos-13` runner to the new `macos-15-intel` runner for macOS Intel
builds.

## Changes

- ✅ Replaced deprecated `macos-13` runner with `macos-15-intel`
(available until August 2027)
- ✅ Implemented variable-based runner version configuration similar to
Ubuntu pattern
- ✅ Added support for `MACOS_INTEL_RUNNER_VERSION` and
`MACOS_SILICON_RUNNER_VERSION` repository variables
- ✅ Set default values: `macos-15-intel` for Intel, `macos-14` for
Silicon

## Solution Approach

Following the same pattern used for Ubuntu runners
(`UBUNTU_RUNNER_VERSION`), this change:
- Provides flexibility to configure macOS runner versions via repository
variables
- Uses safe default values that align with GitHub's recommendations
- Maintains consistency with existing workflow patterns

## Testing

The workflow should now successfully build native images for macOS Intel
using the supported `macos-15-intel` runner.

## Related Issue

Resolves #33802
…ail Silently on Main Branch (#33807)

## Fix: DotAlertConfirmService dialogs not displaying

After the Angular standalone migration, confirmation dialogs were not
showing because `dot-alert-confirm` wasn't available in all component
hierarchies.

**Solution:** Moved `dot-alert-confirm` to the root `AppComponent` level
for global availability.

**Changes:**
- Removed redundant instances from individual components

**Affected:** Content Types and Apps Configuration delete dialogs now
work correctly.
### Proposed Changes
* Adding a target folder fileMask Validation for dotAsset
* Adding an integration test
…esign (#33824)

Remove old palette reference from codebase
### Proposed Changes
* This PR introduces the Feature Flag to turn on/off the Style Editor
under development.



https://github.com/user-attachments/assets/3acd0eb9-b1b5-4833-b1ce-041ed8e18b05


This PR fixes: #33808

Co-authored-by: Kevin <kfariid@gmail.com>
## Summary

This PR adds comprehensive AI-powered semantic search capabilities to
the `@dotcms/client` SDK, enabling developers to perform intelligent
content searches using natural language queries. The implementation
introduces a new `client.ai.search()` API with full TypeScript support,
extensive test coverage, and seamless integration with existing SDK
patterns.

## Key Features

### 🤖 AI Search API
- **Natural Language Queries**: Search content using conversational
prompts like "blogs about machine learning"
- **Configurable Parameters**: Control search behavior with threshold,
model selection, and distance functions
- **Type-Safe Interface**: Full TypeScript support with generic type
parameters
- **Promise-Based API**: Modern async/await and `.then()` patterns

### 🏗️ Architecture Improvements
- **Base API Client**: New abstract `BaseApiClient` class for consistent
API structure
- **Code Reusability**: Refactored existing APIs (Page, Content,
Navigation) to extend base class
- **HTTP Client Enhancement**: Added generic `request<T>()` method for
type-safe requests

## Code Examples

### Basic AI Search
```typescript
const results = await client.ai.search('blogs about machine learning', 'content_index', {
  query: {
    limit: 20,
    contentType: 'BlogPost'
  },
  config: {
    threshold: 0.7
  }
});
```

### Advanced Configuration
```typescript
const results = await client.ai.search('technical documentation', 'docs_index', {
  query: {
    contentType: 'Documentation',
    languageId: 1,
    limit: 50,
    offset: 0
  },
  config: {
    threshold: 0.8,
    distanceFunction: DISTANCE_FUNCTIONS.cosine
  }
});
```

### Promise Pattern
```typescript
client.ai
  .search('product reviews', 'products_index')
  .then((results) => {
    console.log(`Found ${results.contentlets.length} results`);
  })
  .catch((error) => {
    console.error('Search failed:', error.message);
  });
```

## Testing Coverage

- ✅ **734 lines of tests** covering all scenarios
- ✅ Promise API with async/await
- ✅ Promise API with `.then()` callback
- ✅ Error handling and custom error types
- ✅ Parameter mapping (SDK → backend)
- ✅ Default values and configuration merging
- ✅ Type safety with generics
- ✅ Edge cases and validation

## Documentation

- 📚 **469 lines added to README.md** with:
  - "How to Use AI-Powered Search" guide
  - API reference for `ai.search()` method
  - Multiple usage examples
  - Configuration options
  - Best practices
  
- 📖 **Base API documentation** explaining architecture pattern
- 📝 **TypeScript types documentation** for all AI interfaces

## Breaking Changes

None. This is a purely additive feature that:
- Maintains backward compatibility with all existing APIs
- Refactors internal structure without changing public interfaces
- Adds new functionality without modifying existing behavior

## Migration Impact

### Existing APIs Refactored
The following APIs now extend `BaseApiClient` (internal change only):
- `PageAPI` 
- `ContentAPI`
- `NavigationAPI`

**Public API remains unchanged** - no migration needed for existing
code.

## Performance Considerations

- Efficient parameter building with URLSearchParams
- Type-safe generics eliminate runtime type checks
- Reusable base class reduces code duplication
- Lazy instantiation of AISearch instances

## Changelog Entry

### v1.3.0
- **feat**: Add AI-powered semantic search with `client.ai.search()`
method
- **feat**: New `BaseApiClient` abstract class for API consistency
- **docs**: Comprehensive AI search documentation and examples
- **types**: New TypeScript interfaces for AI search configuration

## Related Issues

Related to dotCMS AI/ML capabilities and content discovery features.

---

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
…efs: #33785 (#33821)

### Proposed Changes
* Handle more cases, allowing files with .. in the file name, but also
preventing attacks

This PR fixes: #33785
### Proposed Changes
feat: Add high-performance content-drive search endpoint with hybrid
DB/ES strategy

  Summary

Implements a new high-performance search endpoint designed for
content-drive functionality that combines database reliability with
Elasticsearch text search capabilities. The implementation uses a hybrid
approach with two configurable
  search strategies and extensive parallel processing optimizations.

  Key Features

  🔍 Hybrid Search Architecture

- Primary data source: Database as source of truth for content metadata
and structure
- Text search optimization: Elasticsearch integration for advanced text
filtering capabilities
- Configurable strategies: Two distinct heuristic approaches for
different use cases

  ⚡ Performance Optimizations

- Parallel contentlet hydration: Chunks contentlets for concurrent
processing using CompletableFuture
- Parallel ES processing: Processes search chunks concurrently with
configurable batch sizes
- Dynamic chunk sizing: Calculates optimal chunk sizes based on 30%
heuristic with configurable parameters
- ES clause limit handling: Automatically splits large inode sets to
respect Elasticsearch's 1024 boolean clause limit

  🎯 Search Strategies

  1. Hybrid Single Chunked Query ES (HYBRID_SINGLE_CHUNKED_QUERY_ES)
    - Single DB query to fetch all candidate inodes
    - Parallel ES processing in optimized chunks
    - Ideal for scenarios with moderate result sets
  2. Pure ES (PURE_ES)
    - Direct Elasticsearch queries bypassing DB filtering
    - Comprehensive ES query building with all filter criteria
    - Optimal for text-heavy search scenarios

  📊 Performance Monitoring & Debugging

- Detailed timing analytics: High-precision nanosecond timing for each
hydration step
- Performance bottleneck detection: Automatic logging of slow operations
(>100ms)
- Comprehensive logging: Step-by-step performance breakdowns (mapping,
permissions, workflow)
  - Heuristic execution tracking: Strategy-specific performance metrics

  Configuration Parameters

- BROWSE_API_HEURISTIC_TYPE: Strategy selection
(HYBRID_SINGLE_CHUNKED_QUERY_ES | PURE_ES)
- BROWSE_API_SINGLE_QUERY_ES_CHUNK_PERCENTAGE: Chunk size calculation
percentage (default: 30.0%)
- BROWSE_API_SINGLE_QUERY_ES_CHUNK_MIN_SIZE: Minimum chunk size for ES
processing (default: 100)

  Technical Implementation

  Enhanced BrowserAPI Methods

- doElasticSearchTextFiltering(): Strategy dispatcher with performance
tracking
  - doHybridSingleChunkedQueryES(): Single DB query + parallel ES chunks
  - doPureESQuery(): Pure Elasticsearch implementation
- hydrateContentletsInParallel(): Parallel contentlet hydration with
chunking
  - findContentletsInParallel(): Optimized parallel contentlet loading

  Performance Features

  - Safe slicing: Boundary-safe pagination with startRow and maxRows
- Error resilience: Comprehensive exception handling with timeout
management
- Memory optimization: Chunked processing to prevent memory issues with
large datasets
- Concurrent safety: Thread-safe collections and proper future handling

  API Enhancements

- Pagination support: Efficient offset/limit handling at both DB and
application levels
- Text filtering flexibility: Support for both filter and fileName
search criteria
  - Multi-language support: Language-aware content filtering
- Permission integration: Role-based access control maintained
throughout parallel processing

  Testing & Validation

- Postman test collections: Comprehensive test suite covering pagination
and filtering scenarios
- Performance benchmarks: Timing validations for different dataset sizes
- Strategy comparison tests: Validation of both hybrid and pure ES
approaches

  Breaking Changes

None - All changes are backward compatible with existing BrowserAPI
implementations.

  Configuration Migration

No migration required. New configuration parameters use sensible
defaults:
- Existing systems continue using database-only filtering unless
explicitly configured
- ES text filtering activation requires
browserQuery.useElasticsearchFiltering = true

  ---
🚀 This implementation provides a scalable foundation for content-drive
functionality with significant performance improvements for text-based
content searches while maintaining full backward compatibility.

This PR fixes: #33416
## Summary

This PR fixes issue #33720 by addressing a casing inconsistency in the
AI vision tagging system and adding comprehensive integration tests.

## Changes Made

### 🔧 **Bug Fix: Constant Casing Correction**
- **File**:
`dotCMS/src/main/java/com/dotcms/ai/api/OpenAIVisionAPIImpl.java:43`
- **Change**: Fixed the casing of the `TAGGED_BY_DOTAI` constant from
`TAGGED_BY_DOT_AI` to `TAGGED_BY_DOTAI`
- **Impact**: Ensures consistent tag naming for AI-processed content,
preventing potential issues with tag detection and duplicate processing

### ✅ **Test Coverage: Comprehensive Integration Tests**
- **File**:
`dotcms-integration/src/test/java/com/dotcms/ai/api/OpenAIVisionAPIImplTest.java`
(NEW)
- **Lines Added**: 502 lines of comprehensive test coverage
- **Coverage**: Tests all scenarios for the `shouldProcessTags` method
including:
  - ❌ Content types without TagField
  - ❌ Already AI-tagged content (prevents reprocessing) 
  - ❌ Missing or invalid files (no file, too small, non-images)
  - ❌ Missing AI configuration secrets
  - ✅ Valid scenarios (JPG, PNG images with proper setup)
  - ✅ Content with manual tags but no AI marker

### 🧪 **Test Suite Integration**
- **File**:
`dotcms-integration/src/test/java/com/dotcms/MainSuite3a.java:48`
- **Change**: Added `OpenAIVisionAPIImplTest.class` to the MainSuite3a
test suite
- **Purpose**: Ensures the new tests run as part of the integration test
suite

## Technical Details

The core issue was a casing mismatch in the `TAGGED_BY_DOTAI` constant
that could lead to:
1. Inconsistent tag identification
2. Potential reprocessing of already-tagged content
3. Tag detection failures in the AI vision pipeline

The comprehensive test suite validates all edge cases and boundary
conditions for the AI vision tag processing logic, ensuring robust
behavior across different content types, file conditions, and
configuration states.

## Test Results

The new test class includes 8 comprehensive integration tests:
- `test_shouldProcessTags_noTagField_returnsFalse()` 
- `test_shouldProcessTags_alreadyTagged_returnsFalse()`
- `test_shouldProcessTags_noFile_returnsFalse()`
- `test_shouldProcessTags_fileTooSmall_returnsFalse()`
- `test_shouldProcessTags_notAnImage_returnsFalse()`
- `test_shouldProcessTags_noSecrets_returnsFalse()`
- `test_shouldProcessTags_allConditionsMet_returnsTrue()`
- `test_shouldProcessTags_pngImage_returnsTrue()`
- `test_shouldProcessTags_hasOtherTagsButNotAITag_returnsTrue()`

All tests validate the business logic for determining when content
should be processed by the AI Vision API.
…#33830)

Added the languageId parameter to the redirect URL to ensure the
frontend loads the correct language and avoids invalid fallbacks.

This PR fixes: #33096
#Closes #30138

### Proposed Changes
* Implemented .dotcliignore file support to exclude files and
directories from push operations, similar to how .gitignore works for
Git.

The `.dotcliignore` file supports the following glob patterns:

- `*` - Matches any sequence of characters within a single directory
level
- `**` - Matches any sequence of characters across multiple directory
levels
- `?` - Matches any single character
- `[]` - Matches a character class (e.g., `[abc]` or `[0-9]`)
- `!` - Negates a pattern to re-include files that were previously
excluded

### Checklist
- [x] Tests
…ls (#33839)

## Summary

This PR refactors form field error handling across the edit-content
library to use Angular signals for better reactivity and consistency.
Additionally, it adds documentation for the SDK Analytics Installer
skill.

## Changes Made


https://github.com/user-attachments/assets/6e2070f2-02ce-472b-8bcd-031f7463a08d

### Frontend

#### Error Handling Refactor
- **Unified error state management** across 20+ form field components
([base-wrapper-field.ts:20-46](core-web/libs/edit-content/src/lib/fields/shared/base-wrapper-field.ts#L20-L46))
- Replaced `hasError` getter with `$hasError` signal for reactive error
state tracking
- Added automatic error state synchronization via `merge()` of
`valueChanges`, `statusChanges`, and `events` streams
- Introduced `afterNextRender()` lifecycle hook to ensure control
initialization before subscribing
- **Template standardization** - Updated all field component templates
to use `fieldHasError` local variable:
  - Binary field, Block editor, Calendar, Category, Checkbox
  - Custom field, File field, Host/Folder, JSON, Key-Value
  - Multi-select, Radio, Relationship, Select, Tag
  - Text area, Text field, WYSIWYG

#### Pattern Changes
```typescript
// Before: Getter-based approach
get hasError(): boolean {
    return !!(this.formControl?.invalid && this.formControl?.touched);
}

// After: Signal-based reactive approach
$hasError = signal(false);
// Auto-updates via merged control streams in constructor
```
#### Breaking Changes
None - This is an internal refactor that maintains the same external API
and behavior.

#### Testing
- [ ] Manual testing performed on all affected field components

#### Related Issues
Closes #33654
## Summary

This PR implements automatic content impression tracking for the dotCMS
Analytics SDK, allowing applications to track when contentlets become
visible in the user's viewport. The feature uses the
IntersectionObserver API for high-performance, battery-efficient
visibility detection with configurable thresholds for visibility
percentage and dwell time.

## Changes Made

### Analytics SDK Core (`core-web/libs/sdk/analytics/`)

#### Impression Tracking System
- **New impression tracker class**
[`dot-content-analytics.impression-tracker.ts`](core-web/libs/sdk/analytics/src/lib/core/shared/dot-content-analytics.impression-tracker.ts)
  - Implements IntersectionObserver-based content visibility detection
  - Tracks dwell time (minimum time visible before firing event)
  - Deduplicates impressions per session
  - Respects page visibility (pauses when tab inactive)
  - Handles dynamic content with MutationObserver
  - Automatically disabled in dotCMS editor mode (UVE)
- Performance-optimized with configurable limits (default: 1000 max
elements)

- **New impression plugin**
[`dot-analytics.impression.plugin.ts`](core-web/libs/sdk/analytics/src/lib/core/plugin/impression/dot-analytics.impression.plugin.ts)
  - Lifecycle management for impression tracking
  - Initializes tracker when enabled via config
  - Cleanup handlers for page unload events

- **Impression utility functions**
[`dot-analytics.impression.utils.ts`](core-web/libs/sdk/analytics/src/lib/core/plugin/impression/dot-analytics.impression.utils.ts)
  - Pure functions for visibility calculations
  - Viewport metrics extraction (offset percentage, visibility ratio)
  - Contentlet data extraction from DOM attributes
  - Debounce and throttle utilities

#### Plugin Architecture Refactoring
- **Main plugin**
[`dot-analytics.plugin.ts`](core-web/libs/sdk/analytics/src/lib/core/plugin/dot-analytics.plugin.ts:69-168)
  - Refactored to handle both predefined and custom events
  - Added type guards to distinguish event types
- Structures events based on type (pageview, content_impression, custom)
  - Simplified event sending logic with `sendEvent()` helper

- **Enricher plugin**
[`dot-analytics.enricher.plugin.ts`](core-web/libs/sdk/analytics/src/lib/core/plugin/enricher/dot-analytics.enricher.plugin.ts)
  - Updated to handle content impression events
  - Adds minimal page data (title, url) to impression events
  - Simplified event enrichment logic
  - Better type safety with discriminated unions

#### Type System Enhancements
- **Data models**
[`data.model.ts`](core-web/libs/sdk/analytics/src/lib/core/shared/models/data.model.ts:113-152)
  - New `DotCMSContentImpressionPageData` type (minimal page data)
  - New `DotCMSImpressionEventData` interface
  - Added viewport metrics and timing information structures

- **Event models**
[`event.model.ts`](core-web/libs/sdk/analytics/src/lib/core/shared/models/event.model.ts:72-111)
  - New `DotCMSContentImpressionPayload` type (producer plugin data)
  - New `DotCMSContentImpressionEventData` type (enriched data)
  - New `DotCMSContentImpressionEvent` type
  - Updated `DotCMSEvent` union to include impression events

- **Library models**
[`library.model.ts`](core-web/libs/sdk/analytics/src/lib/core/shared/models/library.model.ts:21-54)
  - New `ImpressionConfig` interface with configurable thresholds
  - New `ContentletData` interface for contentlet metadata
  - New `ViewportMetrics` interface for viewport calculations
  - Added `impressions` property to `DotCMSAnalyticsConfig`

- **Request models**
[`request.model.ts`](core-web/libs/sdk/analytics/src/lib/core/shared/models/request.model.ts:10-30)
  - Simplified request body types
  - Better documentation of event structure flexibility

#### Constants and Utilities
- **Constants**
[`dot-content-analytics.constants.ts`](core-web/libs/sdk/analytics/src/lib/core/shared/constants/dot-content-analytics.constants.ts)
  - Added `CONTENT_IMPRESSION` predefined event type
  - Default configuration values for impression tracking
  - DOM class/attribute constants for contentlet identification

- **Utilities**
[`dot-content-analytics.utils.ts`](core-web/libs/sdk/analytics/src/lib/core/shared/dot-content-analytics.utils.ts)
  - New `isPredefinedEventType()` type guard function
  - Helper functions for event type discrimination

### Documentation
- **README updates**
[`README.md`](core-web/libs/sdk/analytics/README.md:118-227)
  - Comprehensive impression tracking configuration guide
  - Usage examples with default and custom configurations
  - How it works section explaining the feature
  - Configuration option reference table

## Technical Details

### Impression Tracking Architecture

The impression tracking system follows a producer-consumer pattern
within the Analytics.js plugin pipeline:

1. **Impression Plugin** (Producer)
- Monitors DOM for contentlets with `dotcms-analytics-contentlet` class
- Fires `instance.track('content-impression', data)` when
visibility/dwell thresholds met
   - Runs independently in the Analytics.js lifecycle

2. **Enricher Plugin** (Middleware)
   - Intercepts impression events via `track:dot-analytics` hook
   - Adds minimal page data (title, url only)
   - Passes enriched data to main plugin

3. **Main Plugin** (Consumer)
   - Receives enriched impression data
   - Structures into proper `DotCMSContentImpressionEvent`
   - Sends to queue or server

### Performance Optimizations

- **IntersectionObserver API**: Native browser API for efficient
visibility detection
- **Throttling**: Configurable throttle for intersection callbacks
(default: 100ms)
- **Idle Callback**: Optional `requestIdleCallback()` for low-priority
processing
- **Node Limits**: Configurable maximum elements to track (default:
1000)
- **Session Deduplication**: Each contentlet tracked once per session
- **Visibility-aware**: Pauses tracking when tab is inactive

### Configuration Defaults

```typescript
{
  visibilityThreshold: 0.5,    // 50% visible
  dwellMs: 750,                 // 750ms dwell time
  maxNodes: 1000,               // Max 1000 elements
  throttleMs: 100,              // 100ms throttle
  useIdleCallback: false        // Direct processing
}
```

### Breaking Changes
None - this is a new feature that is disabled by default.

### Testing
 Unit tests added for impression utilities
 Manual testing performed with example application
 Integration tests for full tracking pipeline (follow-up)
 E2E tests in real-world scenarios (follow-up)

### Related Issues
Closes #33613
…abels (#33743)

## Description
Updates the MCP server content type creation tool to enforce Title Case
formatting for field labels, ensuring human-readable and properly
formatted field names.

## What Changed
- Added IMPORTANT note in the content type creation description
requiring field names to be in Title Case format
- Provides clear examples: "Page Title" not "pageTitle", "First Name"
not "firstName"

## Why
When the MCP server creates content types, field labels should be
human-readable and follow consistent formatting conventions. Title Case
formatting improves readability and maintains professional standards
across content type definitions.

## Related Issue
Closes #33742
…locity code rendered (#33849)

### Proposed Changes
This feature enhancement adds the ability to render Velocity code in
Custom Fields when retrieving Content Types through the REST API.

### Key Changes

#### 1. New REST Endpoint (ContentTypeResource.java)

- Added /v1/contenttype/render/id/{idOrVar} endpoint that returns
Content Types with their Custom Fields' Velocity code parsed and
rendered
- The original /v1/contenttype/id/{idOrVar} endpoint remains unchanged
for backward compatibility
- Both endpoints share the same core logic but differ in whether they
render Custom Fields

#### 2. Enhanced Content Type Transformation (ContentTypeHelper.java)

- Modified contentTypeToMap() method to accept a new renderCustomFields
parameter (defaults to false)
  - Added includeRenderedCustomFields() method that:
    - Inspects all fields in a Content Type
    - Identifies Custom Fields (those with class ImmutableCustomField)
    - Parses their Velocity code using VelocityUtil.parseVelocity()
- Adds a new rendered attribute containing the generated HTML/JavaScript
output
- Uses VelocityWebUtil.getVelocityContext() to get the proper Velocity
context from the current HTTP request/response
- Includes error handling that logs parsing failures without breaking
the response

 ####  3. OpenAPI Specification Update (openapi.yaml)

- Added documentation for the new /v1/contenttype/render/id/{idOrVar}
endpoint
  - Updated descriptions to be more precise about Content Type retrieval
  - Maintained consistency with existing endpoint documentation patterns

  #### 4. Comprehensive Test Coverage (ContentTypeResourceTests.json)

- Significantly expanded Postman test collection (1090 lines, up from
previous version)
  - Added tests for the new rendering endpoint
  - Includes tests verifying:
- Custom Fields have the rendered attribute when using the render
endpoint
    - Original endpoint doesn't include the rendered attribute
    - Error handling for invalid Velocity code
    - Pagination and filtering with the new endpoint

  #### Technical Implementation Details

- Backward Compatible: Existing endpoints and functionality remain
unchanged
- Opt-in Feature: Velocity rendering only occurs when explicitly using
the /render/id/{idOrVar} endpoint
- Secure: Uses existing Velocity parsing infrastructure with proper
context initialization
- Error Resilient: Parsing errors are logged but don't break the entire
response
- RESTful Design: Follows dotCMS REST API conventions with proper HTTP
methods and response structures

 #### Use Case
This feature is particularly useful for the Edit Content UI and other
frontend applications that need to display Custom Fields with their
Velocity code already executed, eliminating the need for client-side
rendering or additional API calls.

This PR fixes: #33618
…ement (#33851)

## Summary

This PR implements the `useAISearch` React hook for managing AI search
state in React applications and improves the AI search API response
structure for better developer experience.

### Key Changes

#### 1. New `useAISearch` React Hook
(`libs/sdk/react/src/lib/next/hooks/useAISearch.ts`)
- **State Management**: Manages AI search lifecycle with `idle`,
`loading`, `success`, and `error` states
- **Type-Safe**: Full TypeScript support with generic content type
parameter
- **API Integration**: Seamlessly integrates with the dotCMS client AI
search API
- **Exposed Methods**:
- `search(prompt: string)` - Executes AI search with the provided prompt
  - `reset()` - Resets search state to idle
- **Return Values**:
  - `response` - Full AI search response with metadata
  - `results` - Direct access to content results array
  - `status` - Current operation status with error details

#### 2. API Response Refactoring
- **Breaking Change**: Renamed `dotCMSResults` → `results` in
`DotCMSAISearchResponse`
- **Rationale**: More intuitive naming convention aligned with modern
API design
- **Internal Transformation**: Client SDK now transforms raw API
response to user-facing format
- **New Internal Type**: `DotCMSAISearchRawResponse` for backend
compatibility
- **Updated**: All documentation and examples in README.md

#### 3. Content Drive Improvements (Merged from #33764)
- **Enhanced Error Handling**: Upload failures now show specific error
messages from API response
- **UI Fix**: Toolbar grid layout adjusted to properly accommodate
search input (2 columns + flexible space)
- **Code Cleanup**: Removed unnecessary path state updates and unused
test cases in sidebar store

#### 4. Type System Enhancements
- **New Generic Status Type**: `DotCMSEntityStatus` for consistent state
management patterns
- **Internal Types Export**: Added `internal.ts` exports for AI types to
support SDK implementation
- **Enhanced Type Safety**: Better type inference for AI search
responses

### Files Changed

**Core Implementation:**
- `libs/sdk/react/src/lib/next/hooks/useAISearch.ts` - New React hook
- `libs/sdk/react/src/lib/next/shared/types.ts` - Type definitions
- `libs/sdk/react/src/index.ts` - Public API exports

**API Layer:**
- `libs/sdk/client/src/lib/client/ai/search/search.ts` - Response
transformation
- `libs/sdk/types/src/lib/ai/public.ts` - Public API types
- `libs/sdk/types/src/lib/ai/internal.ts` - Internal types
- `libs/sdk/types/src/lib/components/generic/public.ts` - Shared status
type

**Documentation:**
- `libs/sdk/client/README.md` - Comprehensive examples and usage

**Content Drive:**
-
`libs/portlets/dot-content-drive/portlet/src/lib/dot-content-drive-shell/dot-content-drive-shell.component.ts`
-
`libs/portlets/dot-content-drive/portlet/src/lib/components/dot-content-drive-toolbar/dot-content-drive-toolbar.component.scss`
-
`libs/portlets/dot-content-drive/portlet/src/lib/store/features/sidebar/withSidebar.ts`

## Test Plan

- [ ] Verify `useAISearch` hook properly manages state transitions (idle
→ loading → success/error)
- [ ] Test AI search with various prompts and configuration options
- [ ] Confirm `results` property contains expected content data
- [ ] Validate error handling when search fails
- [ ] Test `reset()` functionality returns to idle state
- [ ] Verify TypeScript types are correctly inferred for custom content
types
- [ ] Check Content Drive upload error messages display correctly
- [ ] Validate toolbar layout renders properly across different screen
sizes
- [ ] Run existing AI search tests to ensure backward compatibility in
SDK client
- [ ] Verify documentation examples work as expected

## Breaking Changes

⚠️ **API Response Property Renamed**:
`DotCMSAISearchResponse.dotCMSResults` →
`DotCMSAISearchResponse.results`

**Migration Guide:**
```typescript
// Before
const response = await client.ai.search('query', 'index');
response.dotCMSResults.forEach(item => console.log(item));

// After
const response = await client.ai.search('query', 'index');
response.results.forEach(item => console.log(item));
```

This PR fixes: #33850
version "19.2.9"
resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.9.tgz#0af6a48fc0db9f981e1d662a1c9cf299d3ac92d9"
integrity sha512-K6wtAsJhQeD2OjoupV03gWHBqnqhEP9llzFzlnQoXAAZzM1eIT/KAtQEdNY75NO+BESKxaXvQBAU16Tg/1I6uw==
"@angular/compiler@20.3.9":

Choose a reason for hiding this comment

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

High severity vulnerability may affect your project—review required:
Line 557 lists a dependency (@angular/compiler) with a known High severity vulnerability.

ℹ️ Why this matters

Affected versions of @angular/compiler are vulnerable to Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting'). A stored XSS vulnerability in the Angular Template Compiler arises because its internal security schema doesn't classify certain URL‐ holding attributes (e.g. xlink:href, math|href, annotation|href) or the attributeName binding on SVG animation elements (<animate>, <set>, etc.) as requiring strict URL sanitization. An attacker who can supply untrusted input to template bindings like [attr.xlink:href] or <animate [attributeName]="'href'" [values]="maliciousURL"> can inject a javascript: URL payload. When the element is activated (e.g. clicked) or the animation runs, the malicious script executes in the application's origin, enabling session hijacking, data exfiltration, or unauthorized actions.

References: GHSA, CVE

To resolve this comment:
Check if you allow SVG/MathML attributes (e.g., xlink:href, href) or to the attributeName field of SVG animation tags (, , etc.) in HTML templates.

  • If you're affected, upgrade this dependency to at least version 20.3.15 at core-web/yarn.lock.
  • If you're not affected, comment /fp we don't use this [condition]
💬 Ignore this finding

To ignore this, reply with:

  • /fp <comment> for false positive
  • /ar <comment> for acceptable risk
  • /other <comment> for all other reasons

If this is a critical or high severity finding, please also link this issue in the #security channel in Slack.

You can view more details on this finding in the Semgrep AppSec Platform here.

@semgrep-code-dotcms-test
Copy link

Semgrep found 322 ssc-1401e86e-5347-4e09-9335-667e8dfa5deb findings:

  • core-web/libs/ui/src/lib/modules/dot-dialog/dot-dialog.component.ts
  • core-web/libs/ui/src/lib/dot-spinner/dot-spinner.component.ts
  • core-web/libs/ui/src/lib/dot-icon/dot-icon.component.ts
  • core-web/libs/ui/src/lib/dot-container-options/dot-container-options.directive.spec.ts
  • core-web/libs/ui/src/lib/components/dot-workflow-actions/dot-workflow-actions.component.ts
  • core-web/libs/ui/src/lib/components/dot-sidebar-accordion/components/dot-sidebar-accordion-tab/dot-sidebar-accordion-tab.component.ts
  • core-web/libs/ui/src/lib/components/dot-pages-favorite-page-empty-skeleton/dot-pages-favorite-page-empty-skeleton.component.ts
  • core-web/libs/ui/src/lib/components/dot-language-variable-selector/dot-language-variable-selector.component.ts
  • core-web/libs/ui/src/lib/components/dot-asset-search/dot-asset-search.component.ts
  • core-web/libs/ui/src/lib/components/dot-asset-search/components/dot-asset-card-list/dot-asset-card-list.component.ts
  • core-web/libs/ui/src/lib/components/add-to-bundle/dot-add-to-bundle.component.ts
  • core-web/libs/template-builder/src/lib/components/template-builder/template-builder.component.ts
  • core-web/libs/template-builder/src/lib/components/template-builder/components/template-builder-actions/template-builder-actions.component.ts
  • core-web/libs/template-builder/src/lib/components/template-builder/components/dot-layout-properties/dot-layout-property-sidebar/dot-layout-property-sidebar.component.ts
  • core-web/libs/template-builder/src/lib/components/template-builder/components/dot-layout-properties/dot-layout-properties.component.ts
  • core-web/libs/template-builder/src/lib/components/template-builder/components/dot-layout-properties/dot-layout-properties-item/dot-layout-properties-item.component.ts
  • core-web/libs/template-builder/src/lib/components/template-builder/components/add-widget/add-widget.component.ts
  • core-web/libs/sdk/angular/src/lib/components/dotcms-block-editor-renderer/item/dotcms-block-editor-item.spec.ts
  • core-web/libs/sdk/angular/src/lib/components/dotcms-block-editor-renderer/blocks/video.component.ts
  • core-web/libs/sdk/angular/src/lib/components/dotcms-block-editor-renderer/blocks/unknown.component.ts
  • core-web/libs/sdk/angular/src/lib/components/dotcms-block-editor-renderer/blocks/text.component.ts
  • core-web/libs/sdk/angular/src/lib/components/dotcms-block-editor-renderer/blocks/list.component.ts
  • core-web/libs/sdk/angular/src/lib/components/dotcms-block-editor-renderer/blocks/image.component.ts
  • core-web/libs/sdk/angular/src/lib/components/dotcms-block-editor-renderer/blocks/dot-contentlet.component.ts
  • core-web/libs/sdk/angular/src/lib/components/dotcms-block-editor-renderer/blocks/code.component.ts
  • core-web/libs/portlets/edit-ema/ui/src/lib/dot-seo-image-preview/dot-seo-image-preview.component.ts
  • core-web/libs/portlets/edit-ema/ui/src/lib/dot-select-seo-tool/dot-select-seo-tool.component.ts
  • core-web/libs/portlets/edit-ema/ui/src/lib/dot-results-seo-tool/dot-results-seo-tool.component.ts
  • core-web/libs/portlets/edit-ema/ui/src/lib/dot-page-tools-seo/dot-page-tools-seo.component.ts
  • core-web/libs/portlets/edit-ema/ui/src/lib/dot-content-compare/dot-content-compare.component.ts
  • core-web/libs/portlets/edit-ema/ui/src/lib/dot-content-compare/components/fields/dot-content-compare-preview-field/dot-content-compare-preview-field.component.ts
  • core-web/libs/portlets/edit-ema/ui/src/lib/dot-content-compare/components/dot-content-compare-table/dot-content-compare-table.component.ts
  • core-web/libs/portlets/edit-ema/ui/src/lib/dot-content-compare/components/dot-content-compare-dialog/dot-content-compare-dialog.component.ts
  • core-web/libs/portlets/edit-ema/ui/src/lib/dot-content-compare/components/dot-content-compare-block-editor/dot-content-compare-block-editor.component.ts
  • core-web/libs/portlets/edit-ema/ui/src/lib/dot-content-compare/components/dot-content-compare-block-editor/block-editor-mock/block-editor-mock.component.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-layout/edit-ema-layout.component.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-editor/edit-ema-editor.component.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-editor/components/dot-uve-toolbar/dot-uve-toolbar.component.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-editor/components/dot-uve-toolbar/components/dot-toggle-lock-button/dot-toggle-lock-button.component.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-editor/components/dot-uve-palette/dot-uve-palette.component.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-editor/components/dot-uve-palette/dot-uve-palette.component.spec.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-editor/components/dot-uve-palette/components/dot-uve-palette-list/dot-uve-palette-list.component.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-editor/components/dot-uve-palette/components/dot-uve-palette-contenttype/dot-uve-palette-contenttype.component.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-editor/components/dot-uve-palette/components/dot-uve-palette-contenttype/dot-uve-palette-contenttype.component.spec.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-editor/components/dot-uve-palette/components/dot-uve-palette-contentlet/dot-uve-palette-contentlet.component.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-editor/components/dot-uve-palette/components/dot-uve-palette-contentlet/dot-uve-palette-contentlet.component.spec.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-editor/components/dot-uve-palette/components/dot-favorite-selector/dot-favorite-selector.component.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-editor/components/dot-uve-lock-overlay/dot-uve-lock-overlay.component.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/dot-ema-shell/dot-ema-shell.component.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/components/dot-ema-dialog/dot-ema-dialog.component.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/components/dot-block-editor-sidebar/dot-block-editor-sidebar.component.ts
  • core-web/libs/portlets/dot-usage/src/lib/dot-usage-shell/dot-usage-shell.component.ts
  • core-web/libs/portlets/dot-locales/portlet/src/lib/share/ui/DotLocaleConfirmationDialog/DotLocaleConfirmationDialog.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/shared/ui/dot-experiments-inline-edit-text/dot-experiments-inline-edit-text.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/shared/ui/dot-experiments-header/dot-experiments-ui-header.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/shared/ui/dot-experiments-goals-coming-soon/dot-experiments-goals-coming-soon.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/shared/ui/dot-experiments-goal-configuration-url-parameter-component/dot-experiments-goal-configuration-url-parameter-component.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/shared/ui/dot-experiments-goal-configuration-reach-page/dot-experiments-goal-configuration-reach-page.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/shared/ui/dot-experiments-details-table/dot-experiments-details-table.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/shared/ui/dot-experiment-options/components/dot-experiments-option-content-base-component/dot-experiments-option-content-base.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/dot-experiments-reports/dot-experiments-reports.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/dot-experiments-reports/components/dot-experiments-reports-chart/dot-experiments-reports-chart.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/dot-experiments-reports/components/dot-experiments-report-daily-details/dot-experiments-report-daily-details.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/dot-experiments-list/dot-experiments-list.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/dot-experiments-list/components/dot-experiments-list-table/dot-experiments-list-table.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/dot-experiments-configuration/dot-experiments-configuration.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/dot-experiments-configuration/dot-experiments-configuration.component.spec.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/dot-experiments-configuration/components/dot-experiments-configuration-variants/dot-experiments-configuration-variants.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/dot-experiments-configuration/components/dot-experiments-configuration-traffic/dot-experiments-configuration-traffic.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/dot-experiments-configuration/components/dot-experiments-configuration-targeting/dot-experiments-configuration-targeting.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/dot-experiments-configuration/components/dot-experiments-configuration-scheduling/dot-experiments-configuration-scheduling.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/dot-experiments-configuration/components/dot-experiments-configuration-items-count/dot-experiments-configuration-items-count.component.ts
  • core-web/libs/portlets/dot-experiments/portlet/src/lib/dot-experiments-configuration/components/dot-experiments-configuration-goals/dot-experiments-configuration-goals.component.ts
  • core-web/libs/portlets/dot-content-drive/ui/src/lib/dot-folder-list-view/dot-folder-list-view.component.ts
  • core-web/libs/portlets/dot-content-drive/portlet/src/lib/components/dot-folder-list-context-menu/dot-folder-list-context-menu.component.ts
  • core-web/libs/portlets/dot-content-drive/portlet/src/lib/components/dot-content-drive-toolbar/dot-content-drive-toolbar.component.ts
  • core-web/libs/portlets/dot-content-drive/portlet/src/lib/components/dot-content-drive-toolbar/components/dot-content-drive-workflow-actions/dot-content-drive-workflow-actions.component.ts
  • core-web/libs/portlets/dot-content-drive/portlet/src/lib/components/dot-content-drive-toolbar/components/dot-content-drive-base-type-selector/dot-content-drive-base-type-selector.component.ts
  • core-web/libs/portlets/dot-analytics/portlet/src/lib/dot-analytics-search/dot-analytics-search.component.ts
  • core-web/libs/portlets/dot-analytics/portlet/src/lib/dot-analytics-dashboard/dot-analytics-dashboard.component.ts
  • core-web/libs/portlets/dot-analytics/portlet/src/lib/dot-analytics-dashboard/components/dot-analytics-state-message/dot-analytics-state-message.component.ts
  • core-web/libs/portlets/dot-analytics/portlet/src/lib/dot-analytics-dashboard/components/dot-analytics-dashboard-filters/dot-analytics-dashboard-filters.component.ts
  • core-web/libs/edit-content/src/lib/fields/dot-edit-content-relationship-field/components/dot-select-existing-content/components/search/search.component.spec.ts
  • core-web/libs/edit-content/src/lib/fields/dot-edit-content-file-field/components/dot-file-field/dot-file-field.component.ts
  • core-web/libs/edit-content/src/lib/fields/dot-edit-content-custom-field/dot-edit-content-custom-field.component.ts
  • core-web/libs/edit-content/src/lib/fields/dot-edit-content-binary-field/dot-edit-content-binary-field.component.ts
  • core-web/libs/edit-content/src/lib/fields/dot-edit-content-binary-field/components/dot-binary-field-preview/dot-binary-field-preview.component.ts
  • core-web/libs/edit-content/src/lib/components/dot-edit-content-sidebar/components/dot-edit-content-sidebar-history/dot-edit-content-sidebar-history.component.ts
  • core-web/libs/edit-content/src/lib/components/dot-edit-content-sidebar/components/dot-edit-content-sidebar-history/components/dot-pushpublish-timeline-item/dot-pushpublish-timeline-item.component.ts
  • core-web/libs/edit-content/src/lib/components/dot-edit-content-layout/dot-edit-content.layout.component.ts
  • core-web/libs/edit-content/src/lib/components/dot-edit-content-compare/dot-edit-content-compare.component.ts
  • core-web/libs/dot-rules/src/lib/rule-engine.ts
  • core-web/libs/dot-rules/src/lib/rule-condition-group-component.ts
  • core-web/libs/dot-rules/src/lib/rule-condition-component.ts
  • core-web/libs/dot-rules/src/lib/rule-component.ts
  • core-web/libs/dot-rules/src/lib/rule-action-component.ts
  • core-web/libs/dot-rules/src/lib/push-publish/add-to-bundle-dialog-component.ts
  • core-web/libs/dot-rules/src/lib/modal-dialog/dialog-component.ts
  • core-web/libs/dot-rules/src/lib/google-map/area-picker-dialog.component.ts
  • core-web/libs/dot-rules/src/lib/custom-types/visitors-location/visitors-location.component.ts
  • core-web/libs/dot-rules/src/lib/condition-types/serverside-condition/serverside-condition.ts
  • core-web/libs/dot-rules/src/lib/components/dropdown/dropdown.ts
  • core-web/libs/dot-rules/src/lib/app.component.ts
  • core-web/libs/block-editor/src/lib/extensions/asset-uploader/components/upload-placeholder/upload-placeholder.component.ts
  • core-web/libs/block-editor/src/lib/elements/dot-context-menu/dot-context-menu.component.ts
  • core-web/libs/block-editor/src/lib/elements/dot-bubble-menu/dot-bubble-menu.component.ts
  • core-web/libs/block-editor/src/lib/components/dot-block-editor/dot-block-editor.component.spec.ts
  • core-web/apps/dotcms-ui/src/stories/primeng/overlay/ConfirmDialog.component.ts
  • core-web/apps/dotcms-ui/src/stories/primeng/misc/Defer.component.ts
  • core-web/apps/dotcms-ui/src/stories/primeng/messages/Toast.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/main-legacy/main-legacy.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/login/reset-password-component/reset-password.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/login/main/dot-login-page.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/login/forgot-password-component/forgot-password.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/login/dot-login-component/dot-login.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-workflow-task-detail/dot-workflow-task-detail.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-toolbar/dot-toolbar.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-toolbar/dot-toolbar.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-toolbar/components/dot-toolbar-notifications/dot-toolbar-notifications.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-toolbar/components/dot-toolbar-notifications/components/dot-notification-item/dot-notification-item.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-theme-selector-dropdown/dot-theme-selector-dropdown.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-secondary-toolbar/dot-secondary-toolbar.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-secondary-toolbar/dot-secondary-toolbar.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-relationship-tree/dot-relationship-tree.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-portlet-base/dot-portlet-base.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-portlet-base/dot-portlet-base.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-portlet-base/components/dot-portlet-toolbar/dot-portlet-toolbar.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-portlet-base/components/dot-portlet-box/dot-portlet-box.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-persona-selector/dot-persona-selector.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-persona-selector-option/dot-persona-selector-option.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-persona-selected-item/dot-persona-selected-item.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-navigation/dot-navigation.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-navigation/components/dot-sub-nav/dot-sub-nav.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-navigation/components/dot-nav-item/dot-nav-item.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-navigation/components/dot-nav-icon/dot-nav-icon.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-navigation/components/dot-nav-header/dot-nav-header.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-message-display/dot-message-display.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-listing-data-table/dot-listing-data-table.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-listing-data-table/action-header/action-header.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-large-message-display/dot-large-message-display.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-language-selector/dot-language-selector.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-iframe-dialog/dot-iframe-dialog.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-field-helper/dot-field-helper.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-device-selector/dot-device-selector.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-crumbtrail/dot-crumbtrail.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-copy-link/dot-copy-link.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-contentlet-editor/components/dot-reorder-menu/dot-reorder-menu.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-contentlet-editor/components/dot-edit-contentlet/dot-edit-contentlet.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-contentlet-editor/components/dot-create-contentlet/dot-create-contentlet.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-contentlet-editor/components/dot-create-contentlet/dot-create-contentlet.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-contentlet-editor/components/dot-contentlet-wrapper/dot-contentlet-wrapper.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-contentlet-editor/components/dot-add-contentlet/dot-add-contentlet.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-content-type-selector/dot-content-type-selector.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-container-selector/dot-container-selector.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-base-type-selector/dot-base-type-selector.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-add-persona-dialog/dot-create-persona-form/dot-create-persona-form.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-add-persona-dialog/dot-add-persona-dialog.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/searchable-dropdown/component/searchable-dropdown.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/iframe/iframe-porlet-legacy/iframe-porlet-legacy.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/iframe/iframe-component/iframe.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/iframe/dot-loading-indicator/dot-loading-indicator.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/forms/dot-push-publish-form/dot-push-publish-form.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/forms/dot-comment-and-assign-form/dot-comment-and-assign-form.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-workflows-selector-field/dot-workflows-selector-field.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-workflows-actions-selector-field/dot-workflows-actions-selector-field.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-wizard/dot-wizard.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-textarea-content/dot-textarea-content.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-textarea-content/dot-textarea-content.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-site-selector/dot-site-selector.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-site-selector-field/dot-site-selector-field.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-push-publish-env-selector/dot-push-publish-env-selector.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-push-publish-dialog/dot-push-publish-dialog.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-push-publish-dialog/dot-push-publish-dialog.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-page-selector/dot-page-selector.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-overlay-mask/dot-overlay-mask.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-md-icon-selector/dot-md-icon-selector.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-inline-edit/dot-inline-edit.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-global-message/dot-global-message.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-generate-secure-password/dot-generate-secure-password.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-empty-state/dot-empty-state.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-download-bundle-dialog/dot-download-bundle-dialog.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-custom-time.component/dot-custom-time.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-bulk-information/dot-bulk-information.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-autocomplete-tags/dot-autocomplete-tags.component.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-alert-confirm/dot-alert-confirm.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-action-button/dot-action-button.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/dot-content-types.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/dot-content-types.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/components/dot-content-type-copy-dialog/dot-content-type-copy-dialog.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/components/dot-add-to-menu/dot-add-to-menu.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/dot-content-types-edit.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/layout/content-types-layout.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/layout/content-types-layout.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/form/content-types-form.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/dot-content-type-fields-variables/dot-content-type-fields-variables.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-types-fields-list/content-types-fields-list.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/new-render-mode-proptery/new-render-mode-property.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-relationships-property.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-new-relationships/dot-new-relationships.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-edit-relationship/dot-edit-relationships.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-edit-relationship/dot-edit-relationships.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-properties-form/field-properties/dot-relationships-property/dot-cardinality-selector/dot-cardinality-selector.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-drop-zone/content-type-fields-drop-zone.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/fields/content-type-fields-add-row/content-type-fields-add-row.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-templates/dot-template-list/dot-template-list.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-templates/dot-template-create-edit/dot-template-props/dot-template-thumbnail-field/dot-template-thumbnail-field.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-templates/dot-template-create-edit/dot-template-props/dot-template-props.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-templates/dot-template-create-edit/dot-template-props/dot-template-props.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-templates/dot-template-create-edit/dot-template-new/dot-template-new.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-templates/dot-template-create-edit/dot-template-create-edit.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-templates/dot-template-create-edit/dot-template-create-edit.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-templates/dot-template-create-edit/dot-template-builder/dot-template-builder.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-templates/dot-template-create-edit/dot-template-advanced/dot-template-advanced.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-porlet-detail/dot-workflow-task/dot-workflow-task.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-porlet-detail/dot-portlet-detail.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-porlet-detail/dot-contentlets/dot-contentlets.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-pages/guards/dot-pages.guard.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-pages/dot-pages.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-pages/dot-pages.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-pages/dot-pages-listing-panel/dot-pages-listing-panel.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-pages/dot-pages-favorite-panel/dot-pages-favorite-panel.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-pages/dot-pages-favorite-panel/dot-pages-card/dot-pages-card.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-pages/dot-pages-create-page-dialog/dot-pages-create-page-dialog.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-form-builder/dot-form-builder.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/seo/components/dot-edit-page-view-as-controller-seo/dot-edit-page-view-as-controller-seo.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/seo/components/dot-edit-page-toolbar-seo/dot-edit-page-toolbar-seo.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/main/dot-edit-page-nav/dot-edit-page-nav.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/main/dot-edit-page-nav/dot-edit-page-nav.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/main/dot-edit-page-main/dot-edit-page-main.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/layout/dot-edit-layout/dot-edit-layout.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/layout/components/dot-template-additional-actions/dot-legacy-template-additional-actions-iframe/dot-legacy-template-additional-actions-iframe.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/content/dot-edit-content.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/content/dot-edit-content.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/content/components/dot-whats-changed/dot-whats-changed.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/content/components/dot-form-selector/dot-form-selector.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/content/components/dot-edit-page-workflows-actions/dot-edit-page-workflows-actions.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/content/components/dot-edit-page-view-as-controller/dot-edit-page-view-as-controller.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/content/components/dot-edit-page-toolbar/dot-edit-page-toolbar.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/content/components/dot-edit-page-state-controller/dot-edit-page-state-controller.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/content/components/dot-edit-page-state-controller/components/dot-edit-page-lock-info/dot-edit-page-lock-info.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/components/dot-palette/dot-palette.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/components/dot-palette/dot-palette-input-filter/dot-palette-input-filter.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/components/dot-palette/dot-palette-contentlets/dot-palette-contentlets.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/components/dot-palette/dot-palette-content-type/dot-palette-content-type.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/components/dot-edit-page-info/dot-edit-page-info.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/components/dot-block-editor-sidebar/dot-block-editor-sidebar.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/components/dot-block-editor-sidebar/dot-block-editor-sidebar.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-containers/dot-container-create/dot-loop-editor/dot-loop-editor.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-containers/dot-container-create/dot-container-properties/dot-container-properties.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-containers/dot-container-create/dot-container-properties/dot-container-properties.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-containers/dot-container-create/dot-container-permissions/dot-container-permissions.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-containers/dot-container-create/dot-container-permissions/dot-container-permissions.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-containers/dot-container-create/dot-container-history/dot-container-history.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-containers/dot-container-create/dot-container-history/dot-container-history.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-containers/dot-container-create/dot-container-create.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-containers/dot-container-create/dot-container-code/dot-container-code.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-containers/dot-container-create/dot-container-code/dot-container-code.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-containers/dot-container-create/dot-container-code/dot-add-variable/dot-add-variable.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-containers/container-list/container-list.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-containers/container-list/container-list.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-categories/dot-categories-permissions/dot-categories-permissions.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-categories/dot-categories-permissions/dot-categories-permissions.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-categories/dot-categories-list/dot-categories-list.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-categories/dot-categories-create-edit/dot-categories-create-edit.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-apps/dot-apps-list/dot-apps-list.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-apps/dot-apps-list/dot-apps-list.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-apps/dot-apps-list/dot-apps-card/dot-apps-card.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-apps/dot-apps-list/dot-apps-card/dot-apps-card.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-apps/dot-apps-import-export-dialog/dot-apps-import-export-dialog.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-apps/dot-apps-configuration/dot-apps-configuration.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-apps/dot-apps-configuration/dot-apps-configuration-list/dot-apps-configuration-list.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-apps/dot-apps-configuration/dot-apps-configuration-list/dot-apps-configuration-item/dot-apps-configuration-item.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-apps/dot-apps-configuration-header/dot-apps-configuration-header.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-apps/dot-apps-configuration-header/dot-apps-configuration-header.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-apps/dot-apps-configuration-detail/dot-apps-configuration-detail.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-apps/dot-apps-configuration-detail/dot-apps-configuration-detail.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-apps/dot-apps-configuration-detail/dot-apps-configuration-detail-generated-string-field/dot-apps-configuration-detail-generated-string-field.component.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-apps/dot-apps-configuration-detail/dot-apps-configuration-detail-form/dot-apps-configuration-detail-form.component.ts
  • core-web/apps/dotcms-ui/src/app/app.component.ts

Risk: Affected versions of @angular/compiler are vulnerable to Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting'). A stored XSS vulnerability in the Angular Template Compiler arises because its internal security schema doesn't classify certain URL‐ holding attributes (e.g. xlink:href, math|href, annotation|href) or the attributeName binding on SVG animation elements (<animate>, <set>, etc.) as requiring strict URL sanitization. An attacker who can supply untrusted input to template bindings like [attr.xlink:href] or <animate [attributeName]="'href'" [values]="maliciousURL"> can inject a javascript: URL payload. When the element is activated (e.g. clicked) or the animation runs, the malicious script executes in the application's origin, enabling session hijacking, data exfiltration, or unauthorized actions.

Manual Review Advice: A vulnerability from this advisory is reachable if you allow SVG/MathML attributes (e.g., xlink:href, href) or to the attributeName field of SVG animation tags (, , etc.) in HTML templates

Fix: Upgrade this library to at least version 20.3.15 at core/core-web/yarn.lock:557.

Reference(s): GHSA-v4hv-rgfq-gp49, CVE-2025-66412

If this is a critical or high severity finding, please also link this issue in the #security channel in Slack.

Semgrep found 56 ssc-7ddcc10e-5a2c-4829-a735-554dbcd822d1 findings:

  • core-web/libs/template-builder/src/lib/components/template-builder/template-builder.component.stories.ts
  • core-web/libs/template-builder/src/lib/components/template-builder/template-builder.component.spec.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-layout/edit-ema-layout.component.spec.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-editor/components/dot-uve-palette/components/dot-uve-palette-list/dot-uve-palette-list.component.spec.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/edit-ema-editor/components/dot-uve-palette/components/dot-favorite-selector/dot-favorite-selector.component.spec.ts
  • core-web/libs/portlets/edit-ema/portlet/src/lib/dot-ema-shell/dot-ema-shell.component.spec.ts
  • core-web/libs/portlets/dot-usage/src/lib/services/dot-usage.service.spec.ts
  • core-web/libs/portlets/dot-usage/src/lib/dot-usage-shell/dot-usage-shell.component.spec.ts
  • core-web/libs/portlets/dot-locales/portlet/src/lib/dot-locales-list/dot-locales-list.component.spec.ts
  • core-web/libs/portlets/dot-content-drive/portlet/src/lib/components/dot-folder-list-context-menu/dot-folder-list-context-menu.component.spec.ts
  • core-web/libs/portlets/dot-content-drive/portlet/src/lib/components/dot-content-drive-toolbar/components/dot-content-drive-workflow-actions/dot-content-drive-workflow-actions.component.spec.ts
  • core-web/libs/edit-content/src/lib/store/features/workflow/workflow.feature.spec.ts
  • core-web/libs/edit-content/src/lib/store/features/content/content.feature.spec.ts
  • core-web/libs/edit-content/src/lib/store/edit-content.store.spec.ts
  • core-web/libs/edit-content/src/lib/components/dot-edit-content-sidebar/dot-edit-content-sidebar.component.spec.ts
  • core-web/libs/edit-content/src/lib/components/dot-edit-content-form/dot-edit-content-form.component.spec.ts
  • core-web/libs/edit-content/src/lib/components/dot-create-content-dialog/dot-create-content-dialog.component.spec.ts
  • core-web/libs/data-access/src/lib/dot-page-contenttype/dot-page-contenttype.service.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/main-legacy/main-legacy.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-workflow-task-detail/dot-workflow-task-detail.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-toolbar/components/dot-toolbar-user/store/dot-toolbar-user.store.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-toolbar/components/dot-toolbar-user/dot-toolbar-user.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-theme-selector-dropdown/dot-theme-selector-dropdown.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-persona-selector/dot-persona-selector.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-navigation/services/dot-navigation.service.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-navigation/dot-navigation.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-navigation/components/dot-sub-nav/dot-sub-nav.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-navigation/components/dot-nav-item/dot-nav-item.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-iframe-dialog/dot-iframe-dialog.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/dot-contentlet-editor/components/dot-create-contentlet/dot-create-contentlet.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-push-publish-dialog/dot-push-publish-dialog.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-inline-edit/dot-inline-edit.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/view/components/_common/dot-alert-confirm/dot-alert-confirm.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/dot-content-types.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-listing/components/dot-add-to-menu/dot-add-to-menu.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/shared/dot-content-types-edit/components/form/content-types-form.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-templates/dot-template-create-edit/dot-template-builder/dot-template-builder.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-templates/dot-template-create-edit/dot-template-advanced/dot-template-advanced.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-porlet-detail/dot-workflow-task/dot-workflow-task.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-porlet-detail/dot-portlet-detail.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-porlet-detail/dot-contentlets/dot-contentlets.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-form-builder/dot-form-builder.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/seo/components/dot-edit-page-toolbar-seo/dot-edit-page-toolbar-seo.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/main/dot-edit-page-nav/dot-edit-page-nav.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/layout/dot-edit-layout/dot-edit-layout.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/layout/components/dot-template-additional-actions/dot-legacy-template-additional-actions-iframe/dot-legacy-template-additional-actions-iframe.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/content/components/dot-edit-page-toolbar/dot-edit-page-toolbar.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/components/dot-palette/dot-palette.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-edit-page/components/dot-palette/dot-palette-input-filter/dot-palette-input-filter.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-containers/dot-container-create/resolvers/dot-container-edit.resolver.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-containers/dot-container-create/dot-container-create.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-categories/dot-categories-create-edit/dot-categories-create-edit.component.spec.ts
  • core-web/apps/dotcms-ui/src/app/portlets/dot-apps/dot-apps-configuration/dot-apps-configuration-resolver.service.spec.ts
  • core-web/apps/dotcms-ui/src/app/app.component.spec.ts

Risk: Affected versions of @angular/common are vulnerable to Exposure of Private Personal Information to an Unauthorized Actor / Insertion of Sensitive Information Into Sent Data. HttpClient incorrectly treats protocol-relative URLs as same-origin and attaches the X-XSRF-TOKEN header, allowing an attacker-triggered request to leak the victim’s XSRF token to an attacker-controlled domain.

Fix: Upgrade this library to at least version 20.3.14 at core/core-web/yarn.lock:536.

Reference(s): GHSA-58c5-g7wp-6w37, CVE-2025-66035

If this is a critical or high severity finding, please also link this issue in the #security channel in Slack.

rjvelazco and others added 26 commits December 10, 2025 13:13
We need to support bath in dotCMs to send the event to jitsu, for this
we need to use a different key and a different endpoint, the endpoint is
going to be set in the App, for now this batch is really simple it just
take the batch of events send by the FE and send it as a batch to jitsu.

### Proposed Changes

* Use the m2 key instead of the jskey

https://github.com/dotCMS/core/pull/34059/files#diff-29cacbde2fe6ea160809f524ffd80ffc8526f8d2f60cff0339996965c0e36b90R90

* Not send a request for each event in the payload, now we are going to
send just one Request for all the events


https://github.com/dotCMS/core/pull/34059/files#diff-c6b552720dcdd032d58c9b299fd4c5aba7a5f3b233c6ae1d7a1528e94bfe51c7R102-R131
### Proposed Changes
* This fixes pagination when using text filters

This PR fixes: #34009
…sions` metric (#34069)

### Proposed Changes
* This metric provides a visual representation of the metric exposed
here:
  * #33870
* The CubeJS query that exposes the data for a specified time range is:
```json
{
    "measures": [
        "EventSummary.uniqueVisitors",
        "EventSummary.uniqueConvertingVisitors"
    ],
    "timeDimensions": [
        {
            "dimension": "EventSummary.day",
            "dateRange": [
                "2025-12-01",
                "2025-12-08"
            ],
            "granularity": "day"
        }
    ]
}
```
)

## Summary

This PR implements comprehensive folder support in the Content Drive
table view, enabling users to browse, navigate, and manage folders
alongside content items with full drag-and-drop functionality.

### Key Features
- **Folder Display**: Show folders in table view with proper icons,
metadata, and visual indicators
- **Navigation**: Click folder rows to navigate into them with
breadcrumb path tracking
- **Drag & Drop**: Move both files and folders between locations using
drag-and-drop
- **Folder Management**: Create and edit folders with full metadata
(title, sort order, show on menu, file masks)
- **Context Menus**: Folder-specific workflow actions and operations
- **Search Integration**: Text search that intelligently filters folders
when searching content
- **System Host Protection**: Prevents folder loading on system host

### Technical Implementation

**New Services:**
- `DotContentDriveService` - Unified search API using
`/api/v1/drive/search` endpoint
- Enhanced `DotFolderService` with `createFolder()` and `saveFolder()`
methods

**Type System:**
- Extended `DotContentDriveItem` to support both `DotCMSContentlet` and
`DotContentDriveFolder`
- New `DotContentDriveSearchRequest` interface with comprehensive
filtering options
- New `DotContentDriveSearchResponse` with folder/content counts

**State Management:**
- Folder-aware store with navigation state
- Enhanced drag-and-drop with folder destination support
- Sidebar integration for folder operations

**UI Components:**
- Updated `dot-contentlet-icon` web component with consistent gray-700
styling
- Enhanced folder list view with navigation indicators
- Improved dialog for folder creation/editing

### Changes Summary
- **43 files changed** with 3,639 additions, 514 deletions
- Comprehensive unit test coverage for all new services
- Integration tests for drag-and-drop functionality
- Component tests using Spectator with modern Angular testing patterns

Related to #33991

🤖 Generated with [Claude Code](https://claude.com/claude-code)
#34004)

### Proposed Changes
* Exposes a new method in the existing `structures` ViewTool that allow
developers to check whether the Content Type that the ViewTool is called
in has the new Edit mode enabled or not.
* This mechanism is going to be used by the Angular layer to determine
how existing Custom Fields are going to be rendered in the new Content
Edit Mode. That is, the mode that uses Angular instead of the legacy
JSP/Dojo UI.

This PR fixes: #33988
### Proposed Changes
This pull request introduces improvements to how the default value for
the `newRenderMode` field property is determined and managed, making it
more dynamic and responsive to feature flag configuration. It also
refactors related code for clarity and maintainability, and adds a new
feature flag for the default render mode. The main changes are grouped
below by theme.

**Dynamic Default Value for `newRenderMode`:**

* The `FieldPropertyService` now retrieves the default value for
`newRenderMode` from a feature flag
(`FEATURE_FLAG_CONTENT_EDITOR2_RENDER_MODE_DEFAULT`) using the
`DotPropertiesService`, falling back to `DotRenderModes.IFRAME` if the
flag is not found. This makes the default configurable without code
changes.
[[1]](diffhunk://#diff-bde383871412422b64c2a096eeda7acad8858088182afe147943fae6d6113629R30-R39)
[[2]](diffhunk://#diff-bde383871412422b64c2a096eeda7acad8858088182afe147943fae6d6113629L86-R106)
[[3]](diffhunk://#diff-3f0ed89ee1cbcb925153f86b2a576abd34e5a4e0639c55669b3a1f5d205ac5afR29)
* The `DotPropertiesService.getKey()` method is refactored to return
`FEATURE_FLAG_NOT_FOUND` when the requested key does not exist,
improving error handling and clarity.

**Component Lifecycle and Efficiency Improvements:**

* The `DynamicFieldPropertyDirective` now implements `OnDestroy` and
manages component creation, updating, and destruction more efficiently,
only recreating components when necessary and cleaning up properly. It
also uses deep equality checks for field changes.

**Minor Adjustments and Refactoring:**

* The default value for `newRenderMode` in `PROPERTY_INFO` is changed
from `'false'` to an empty string, reflecting that the value should be
dynamically determined.
* Various imports and type usages are updated to support the above
changes and improve code clarity.
[[1]](diffhunk://#diff-bde383871412422b64c2a096eeda7acad8858088182afe147943fae6d6113629R2-R15)
[[2]](diffhunk://#diff-b404d83cba1d88245c1bd41631e510a204262f092431af1339ff90d5f87ffa7cL8-R8)

These changes collectively make the handling of the `newRenderMode`
property more robust and configurable, and improve the lifecycle
management of dynamic field property components.

### Checklist
- [ ] Tests
- [ ] Translations
- [ ] Security Implications Contemplated (add notes if applicable)
…e on dotcms/uve (#34038)

https://github.com/user-attachments/assets/67c0f657-49e9-4e5f-9071-2bc830cbea2a



### Usage


```
  // First define the form with the API.
    const blogForm = defineStyleEditorSchema({
        contentType: 'Content',
        sections: [
            {
                title: 'Typography',
                fields: [
                    styleEditorField.checkboxGroup({
                        label: 'New CheckboxGroup',
                        options: [
                            {
                                label: 'Option 1',
                                value: 'option1'
                            },
                            {
                                label: 'Option 2',
                                value: 'option2'
                            }
                        ],
                        defaultValue: {
                            option1: false,
                            option2: false
                        },
                    }),
                    styleEditorField.radio({
                        label: 'Layout',
                        columns: 2,
                        options: [
                            {
                                label: 'Option 1',
                                value: 'option1',
                                imageURL: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSphn5CRr3MrQUjWWH7ByHWW-lROnVQl4XxYQ&s',
                                width: 119
                            },
                            {
                                label: 'Option 2',
                                value: 'option2',
                                imageURL: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSphn5CRr3MrQUjWWH7ByHWW-lROnVQl4XxYQ&s'
                            },
                            {
                                label: 'New Option',
                                value: ''
                            },
                            {
                                label: 'New Option',
                                value: 'new-option'
                            }
                        ],
                    })
                ]
            }
        ]
    })
    
    // Then use the helper hook.

    useStyleEditorSchemas([blogForm])
    // This hook internally use a exposed function called registerStyleEditorSchemas()
    // In Angular, we can use this function directly. We can create a service for this too, but maybe is a lot of code only for that, but we can recheck this later 
```

---------

Co-authored-by: Kevin <kfariid@gmail.com>
…ll Cubes (#34083)

### Proposed Changes
* Just some missing changes from the original PR:
#34080

This PR fixes: #34079
Before

<img width="1712" height="923" alt="Screenshot 2025-12-08 at 3 38 33 PM"
src="https://github.com/user-attachments/assets/0338e164-b05d-4a60-abe7-47ad6e43a913"
/>


After

<img width="1706" height="883" alt="Screenshot 2025-12-08 at 3 38 09 PM"
src="https://github.com/user-attachments/assets/590faa0a-0f38-4a3e-a7cb-08cbfea9fb51"
/>

This PR fixes: #33978
Before 


<img width="1722" height="748" alt="Screenshot 2025-12-08 at 2 53 58 PM"
src="https://github.com/user-attachments/assets/ef26b32b-37cb-4f21-9b3c-835d58f3375b"
/>



After

<img width="1422" height="606" alt="Screenshot 2025-12-08 at 2 53 38 PM"
src="https://github.com/user-attachments/assets/ed2e03c4-4f49-40d5-8874-9e16a9e7ebd6"
/>


This PR fixes: #34033
…ments (#34081)

## Summary

### Major Changes
- **Field Reorganization**: Reorganized folder dialog to prioritize key
fields in the basic tab:
- **Name (URL)** - Primary field, URL-friendly slug (first field,
autofocused)
- **Navigation Title** - Display name for menus (auto-generated from
name)
  - **Path** - Read-only path preview
- Advanced fields moved to Advanced tab (sort order, file extensions,
default file type)
- **Auto-generation Logic Reversal**: Changed from title→name to
name→title
  - Previously: User enters title, name (URL) auto-generated as slug
- Now: User enters name (URL), navigation title auto-capitalizes with
proper formatting
- Navigation title only auto-generates when not manually edited
(respects dirty state)
  - Conversion: `my-folder-name` → `My Folder Name`

### Bug Fixes
- **Dialog Context Fix**: Fixed folder dialog not opening in correct
folder by adding null safety to slug generation
- **Path Preview**: Added null/empty/whitespace handling for path
generation, shows hostname when name is empty

### Accessibility
- **Context Menu Focus**: Changed from `:focus` to `:focus-visible` for
better keyboard navigation
  - Prevents unwanted focus ring on mouse clicks
  - Shows focus ring only during keyboard navigation

### Performance & Caching
- **Memoization Fix**: Fixed context menu caching to use correct keys
  - Folders: Use `identifier` as cache key
  - Contentlets: Use `inode` as cache key  
- Prevents incorrect menu display when switching between folders and
files

### UI/UX Improvements
- **Dialog Height**: Reduced max-height from 30rem to 24rem to better
fit reorganized content
- **Field Labels**: Updated "Title" to "Navigation Title" for better
clarity
- **Table Header**: Changed column header from "title" to "name" for
consistency

🤖 Generated with [Claude Code](https://claude.com/claude-code)
…eb components (#34078)

### Proposed Changes
This pull request introduces a new, unified API for interacting with
form fields across both Angular and Dojo form bridges, and adds support
for a rendered value in content type fields. It also enhances the custom
field UI with modal and inline iframe display options, and updates the
models and services to support these features.

### Form Bridge API Enhancements

* Added the `FormFieldAPI` interface to provide a consistent set of
methods (`getValue`, `setValue`, `onChange`, `enable`, `disable`,
`show`, `hide`) for interacting with individual form fields. Both
`AngularFormBridge` and `DojoFormBridge` now implement the new
`getField(fieldId)` method, making field manipulation easier and more
standardized.
[[1]](diffhunk://#diff-ce753b47e2efc0c67e1d72f1710d3e4bba7014ff5c9f758c3bf588857dc3256bR3-R45)
[[2]](diffhunk://#diff-ce753b47e2efc0c67e1d72f1710d3e4bba7014ff5c9f758c3bf588857dc3256bR74-R81)
[[3]](diffhunk://#diff-08b7f2dbb6ec1f4033d7a5801c7f63b080a8f9565b11c3f9b7c40ea512578e6fR178-R237)
[[4]](diffhunk://#diff-fe3a388c08be205717a8a85cc52f63bf2b3aacac655960871dc86e0276987e09R197-R273)
* Updated imports and usage to include the new `FormFieldAPI` type in
the bridge implementations.
[[1]](diffhunk://#diff-08b7f2dbb6ec1f4033d7a5801c7f63b080a8f9565b11c3f9b7c40ea512578e6fR8)
[[2]](diffhunk://#diff-fe3a388c08be205717a8a85cc52f63bf2b3aacac655960871dc86e0276987e09L1-R1)

### Content Type Field Model and Service Updates

* Added a new `rendered` property to both `ContentTypeCustomField` and
`DotCMSContentTypeField` interfaces to support storing rendered field
values.
[[1]](diffhunk://#diff-f992fe94678442e33dc4933224e4efd6fcd0dfb04e02a18bc57eebe90da91ff0R318)
[[2]](diffhunk://#diff-f992fe94678442e33dc4933224e4efd6fcd0dfb04e02a18bc57eebe90da91ff0R568)
* Added a new service method `getContentTypeWithRender(idOrVar)` in
`DotContentTypeService` to fetch content types with rendered values via
a new API endpoint.

### UI Improvements for Custom Fields

* Implemented a new UI for legacy custom fields, supporting both inline
iframe and modal dialog display modes based on field configuration. This
improves usability for fields requiring external or embedded content.
* Added corresponding SCSS styles for the new custom field UI, including
modal, fullscreen, and disabled input states.

### Miscellaneous Fixes

* Updated field merging logic in the drop zone component to use spread
syntax, ensuring a safer and more predictable merge of field properties.
* Improved handling of field variables in the properties form component
to preserve existing variable data when updating the new render mode.

### Checklist
- [x] Tests
- [x] Translations
- [x] Security Implications Contemplated (add notes if applicable)

### Additional Info
** any additional useful context or info **
### Proposed Changes
Below are the classes modified that allow the PageAPI to **save
Content** with styleProperties within a container in a page.

* `PageContainerForm.java`
    - [ ] Added `stylePropertiesMap` field to `ContainerEntry`
    - [ ] Updated constructors to support `stylePropertiesMap`
    - [ ] Added getter/setter methods
- [ ] Enhanced JSON deserializer to parse `styleProperties` with
multi-type support (string, number, boolean)
* `PageResourceHelper.java`
- [ ] Modified `saveContent()` method to extract `stylePropertiesMap`
from containerEntry.
* `PageResource.java`
- [ ] Fixed `reduce()` method to preserve `stylePropertiesMap` during
container entry consolidation, if the key is repeated the styles are
overwrite with the last entry evaluated.
- [ ] Created `ContainerData` helper class to hold both `contentIds` and
`stylePropertiesMap`.
* `PageResourceTest.java`
- [ ] Added comprehensive integration test
`test_addContent_with_styleProperties()`
    - [ ] Added deserialized test when passing a string.
* `PageResourceTest.json`
    - [ ] Include test when style properties are send.
* `resources/PageResourceTest.json`
- [ ] Delete repeated postman tests already present in
`PageResourceTest.json`

This PR fixes: #33695
### Proposed Changes
This pull request introduces several improvements and refactors across
multiple Angular applications in the monorepo, focusing on standardizing
configuration, improving error handling patterns, and minor
dependency/configuration cleanups. The most notable changes are grouped
as follows:

**1. Standardization of RxJS Error Handling:**
- Refactored all usages of the `tapResponse` operator to use the
object-based signature (`{ next, error }`) instead of positional
arguments, improving code readability and aligning with best practices.
This was done in files such as `dotcdn.component.store.ts`,
`dot-pages.store.ts`, and `dot-template.store.ts`.
[[1]](diffhunk://#diff-b202dfd3e850f6f8d29a81e0f698f305309a1d524fcb089138c0eed4f0b0e2d0L95-R117)
[[2]](diffhunk://#diff-1145b6e61f8f24833b827ae5f3fe939586964551b15aab913ba530cd44808f0eL364-R365)
[[3]](diffhunk://#diff-1145b6e61f8f24833b827ae5f3fe939586964551b15aab913ba530cd44808f0eL377-R380)
[[4]](diffhunk://#diff-1145b6e61f8f24833b827ae5f3fe939586964551b15aab913ba530cd44808f0eL789-R804)
[[5]](diffhunk://#diff-1145b6e61f8f24833b827ae5f3fe939586964551b15aab913ba530cd44808f0eL838-R843)
[[6]](diffhunk://#diff-1145b6e61f8f24833b827ae5f3fe939586964551b15aab913ba530cd44808f0eL861-R867)
[[7]](diffhunk://#diff-1145b6e61f8f24833b827ae5f3fe939586964551b15aab913ba530cd44808f0eL892-R893)
[[8]](diffhunk://#diff-1145b6e61f8f24833b827ae5f3fe939586964551b15aab913ba530cd44808f0eL905-R907)
[[9]](diffhunk://#diff-7cdbc60fb309458c9c97919670ee9f2700e6f97077360d7b2c60be5d8915f1eaL164-R178)

**2. Project Configuration Updates:**
- Added or updated `"tags"` fields (often to empty arrays or with
specific tags like `["skip:test", "skip:lint"]`) in multiple
`project.json` files for better project categorization and tooling
compatibility.
[[1]](diffhunk://#diff-b9f5cc7169c5770b5a2f040c8662568055bb427d78d3de5863f18368983602b3R7)
[[2]](diffhunk://#diff-7bb84e18c1e3ac80aed41afaa0693a7c4224324e222c2ed95f1cec1525903f35R7)
[[3]](diffhunk://#diff-5ee971cb1c993c2ebd054104878f6077f83bdc3191e9297c79086deda2f909e0R7)
[[4]](diffhunk://#diff-a5a7709ae811f21c30177ca89ea61196bd970f2695ce9a24aee461b0e792dfa8R7-R8)
- Added `"continuous": true` to several `serve` targets, likely to
enable continuous build/watch mode for development servers.
[[1]](diffhunk://#diff-b9f5cc7169c5770b5a2f040c8662568055bb427d78d3de5863f18368983602b3L76-R78)
[[2]](diffhunk://#diff-7bb84e18c1e3ac80aed41afaa0693a7c4224324e222c2ed95f1cec1525903f35L87-R89)
[[3]](diffhunk://#diff-5ee971cb1c993c2ebd054104878f6077f83bdc3191e9297c79086deda2f909e0L101-R103)
[[4]](diffhunk://#diff-a5a7709ae811f21c30177ca89ea61196bd970f2695ce9a24aee461b0e792dfa8L129-R132)
- Set `"tsConfig"` options for test targets to explicitly point to the
correct TypeScript configuration files, improving test setup
reliability.
[[1]](diffhunk://#diff-b9f5cc7169c5770b5a2f040c8662568055bb427d78d3de5863f18368983602b3L104-L108)
[[2]](diffhunk://#diff-7bb84e18c1e3ac80aed41afaa0693a7c4224324e222c2ed95f1cec1525903f35L103-L107)
[[3]](diffhunk://#diff-a5a7709ae811f21c30177ca89ea61196bd970f2695ce9a24aee461b0e792dfa8L146-R150)

**3. TypeScript Compiler Configuration Improvements:**
- Added `"moduleResolution": "bundler"` to various `tsconfig.app.json`
and `tsconfig.spec.json` files, aligning module resolution with modern
build tools and improving compatibility.
[[1]](diffhunk://#diff-f471e0ae31ecc282b2a482daebb1c09198820853e891ab8f914631c22d498b71L7-R8)
[[2]](diffhunk://#diff-d90cd0ce74ab8203ec196742db3429152e143bec6bd4db856a092509e2e72d83L5-R6)
[[3]](diffhunk://#diff-28e86d8c2042724ba496375177c06ec7b815d0e70cdebdd469312e2f959d4d3cL7-R8)
[[4]](diffhunk://#diff-92c379b3c88f28b0ae55d4b1ad62ee3936e66e2bd02867ec58d1087989de4410L7-R8)

**4. Dependency and Import Cleanups:**
- Removed unused imports (e.g., `DynamicDialogRef` in
`dot-template-create-edit.component.ts`) and simplified type usage for
dialog references.
[[1]](diffhunk://#diff-65fc5701762b720a1b4fd8afbbf0b8a0ee54827d1b9fe386f5ffc314058ce099L14)
[[2]](diffhunk://#diff-65fc5701762b720a1b4fd8afbbf0b8a0ee54827d1b9fe386f5ffc314058ce099L184-R183)

**5. Minor Project Metadata Adjustments:**
- Updated or added `implicitDependencies` fields and cleaned up
redundant or misplaced `tags` arrays in project configuration files.
[[1]](diffhunk://#diff-a5a7709ae811f21c30177ca89ea61196bd970f2695ce9a24aee461b0e792dfa8R7-R8)
[[2]](diffhunk://#diff-a5a7709ae811f21c30177ca89ea61196bd970f2695ce9a24aee461b0e792dfa8L178-R182)
[[3]](diffhunk://#diff-5ee971cb1c993c2ebd054104878f6077f83bdc3191e9297c79086deda2f909e0L125-R127)

These changes collectively improve code maintainability, developer
experience, and build/test reliability across the workspace.

### Checklist
- [x] Tests
- [x] Translations
- [x] Security Implications Contemplated (add notes if applicable)



This PR fixes: #34087

---------

Co-authored-by: Freddy Montes <751424+fmontes@users.noreply.github.com>
### Proposed Changes
* Add `rel="noreferrer noopener"` when we open a blank page via the
frontend editor, for now it only affects the **copy URL** functionality
of the "Page Edit Mode".


This PR fixes: #33898
…rectly (#34086)

### Proposed Changes
Update SDK examples (Next.js, Angular, Astro) adding styles and retrieve
the contentlet information by using.
```ts
props.node.attrs?.data
```

### Changes made
- [ ] Added styles to the custom render Activities, Products.
- [ ] Create a custom render for Destinations
- [ ] update `props.attrs?.data` data to `props.node.attrs?.data` where
need it.

This PR fixes: #34061
…es (#34095)

## Summary

- Fixed pagination offset synchronization issues when navigating folders
and applying filters
- Resolved UI layout jumps caused by inconsistent table column widths
and loading states
- Improved search input state management to properly sync with global
filters
- Fixed PrimeNG Table pagination state management to prevent offset loss
during sorting

## Changes

### Pagination & State Management
- **DotContentDriveStore**: Enhanced `setPath()`, `removeFilter()`, and
`setGlobalSearch()` methods to properly reset pagination offset to 0
when navigating or filtering
- **Shell Component**: Added computed `$offset` signal and improved
query params handling with merge strategy to maintain URL state
correctly
- **Folder List View**: Removed local `currentPageFirstRowIndex` state
in favor of store-managed offset for single source of truth

### UI Layout Fixes
- **Table Layout**: Applied `table-layout: fixed` to prevent column
width recalculation causing UI jumps
- **Column Widths**: Adjusted header column widths (32% for title, 18%
for modified date) for better layout stability
- **Loading Skeletons**: Fixed skeleton placeholder widths to match
actual column dimensions and prevent layout shifts during loading states
- **Title Column**: Implemented CSS grid layout (4.5rem thumbnail +
flexible text + min-content actions) for consistent alignment

### Search & Filter Synchronization
- **Search Input Component**: Added `cleanTextEffect` to sync form
control value with store filter changes without triggering unnecessary
events
- **Query Params**: Implemented proper `queryParamsHandling: 'merge'`
strategy to preserve URL state during navigation

### PrimeNG Table Workaround
- **FirstChange Handler**: Added `onFirstChange()` method to manually
sync table's `first` property with offset from store, addressing PrimeNG
issue #11898 where table loses pagination reference during sorting
operations

## Test Coverage

- ✅ Added tests for `setGlobalSearch()` pagination reset behavior
- ✅ Added tests for `removeFilter()` pagination reset behavior  
- ✅ Added tests for `setPath()` pagination reset behavior
- ✅ Updated shell component tests for new query params merge strategy
- ✅ Added tests for offset input and firstChange synchronization

## Test Plan

- [ ] Navigate through multiple folders and verify pagination stays at
page 1
- [ ] Apply filters and verify pagination resets to first page
- [ ] Use global search and verify pagination and path reset correctly
- [ ] Remove filters and verify pagination resets
- [ ] Sort columns and verify pagination offset is maintained correctly
- [ ] Verify no UI layout jumps during loading states or data updates
- [ ] Test with various amounts of content (empty, partial page,
multiple pages)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

This PR fixes: #33991
…33987) (#34084)

## Description

Implements MINIMAL profile system with hybrid approach (@ProfileCapable
annotation + configuration selection) and 10-15 core metrics for Usage
Dashboard.

## Changes
- Created ProfileType enum (MINIMAL, STANDARD, FULL)
- Implemented @ProfileCapable annotation for metric filtering
- Added ProfileFilter utility for profile-aware metric selection
- Created MetricCacheConfig for runtime profile configuration
- Annotated 100+ existing metrics with appropriate profiles
- Updated MetricStatsCollector with profile filtering logic
- Enhanced UsageResource REST API with profile support
- Integrated profile system in Angular Usage Dashboard UI
- Added telemetry implementation and verification documentation

## Testing
- Profile filtering correctly limits MINIMAL to 10-15 core metrics
- Configuration-driven profile selection via
dotmarketing-config.properties
- Backward compatible (unannotated metrics included in all profiles)
- Type-safe enum prevents configuration errors
- REST API returns profile-filtered metrics
- Angular UI displays profile-aware dashboard

Closes #33987

## Changes

- [ ] [List the main changes made]

## Testing

- [ ] [Describe testing approach]

Closes #33987

**Issue:** Implement MINIMAL Profile with Core Metrics for Us
…33980) (#34100)

## Description

Implements configuration-driven caching and profile-based metric
filtering for the telemetry system.

## Changes

### Caching System
- ✅ **MetricCacheManager**: CDI service providing transparent caching
with DynamicTTLCache (Caffeine)
- ✅ **MetricCacheConfig**: Configuration reader supporting global and
per-metric cache settings
- ✅ **Configuration-Driven**: All caching controlled via properties (no
annotations)
- ✅ **Per-Metric TTL**: Different cache durations per metric via
properties
- ✅ **Future-Proof**: Works by metric name, supports future config-based
metrics

### Profile System
- ✅ **ProfileType**: MINIMAL/STANDARD/FULL profiles for performance
control
- ✅ **@MetricsProfile**: Annotation declaring which profiles a metric
supports
- ✅ **ProfileFilter**: Filters metrics by active profile (handles CDI
proxies)
- ✅ **Dual Configuration**: Separate profiles for dashboard (MINIMAL)
and cron (FULL)
- ✅ **Fast Dashboard**: MINIMAL profile targets <5s load time with 10-15
core metrics

### Integration
- ✅ **MetricStatsCollector**: Updated to use cache manager and profile
filtering
- ✅ **UsageResource**: Uses MINIMAL profile for fast dashboard loading
- ✅ **Documentation**: Comprehensive guide in
`TELEMETRY_IMPLEMENTATION.md`

### Configuration
```properties
# Profile selection
telemetry.default.profile=MINIMAL  # Dashboard/API
telemetry.cron.profile=FULL        # Background collection

# Global cache control
telemetry.cache.enabled=true
telemetry.cache.default.ttl.seconds=300
telemetry.cache.max.size=1000

# Per-metric overrides
telemetry.cache.metric.COUNT_OF_SITES.ttl.seconds=600
telemetry.cache.metric.REAL_TIME_METRIC.enabled=false
```

## Testing
- ✅ **26 tests** for MetricCacheConfig (profile and cache configuration)
- ✅ **16 tests** for MetricCacheManager (cache behavior, concurrency,
invalidation)
- ✅ **8 tests** for ProfileFilter (profile matching, CDI proxy handling)
- ✅ **49 total tests** - all passing

### Test Coverage
- Cache hit/miss behavior
- Per-metric enable/disable
- TTL configuration and overrides
- Profile filtering (MINIMAL/STANDARD/FULL)
- Concurrent access scenarios
- Cache invalidation (single + all)
- CDI proxy unwrapping

## Performance
- **Cache Hits**: < 100ms (vs 500-1500ms for slow queries)
- **Dashboard Target**: < 5 seconds with MINIMAL profile
- **Configuration-Driven**: Change behavior without code changes
- **Environment-Specific**: Different settings per environment

## Design Decisions

### Configuration Over Annotations
**Why configuration-driven caching?**
- ✅ Works for future config-based metrics (by metric name)
- ✅ Runtime-configurable (no code changes needed)
- ✅ Environment-specific (dev/staging/prod)
- ✅ Separation of concerns (metrics compute, cache manager caches)

### Caffeine Over DotCache
**Why DynamicTTLCache?**
- ✅ Simpler setup (no enum registration)
- ✅ Per-key TTL (different expiration per metric)
- ✅ High performance (optimized for in-memory)
- ✅ Sufficient (metrics are database-sourced)

### Dual Profile System
**Why separate default and cron profiles?**
- Dashboard needs speed (MINIMAL): <5s with 10-15 core metrics
- Background collection needs completeness (FULL): All 128+ metrics
- Different trade-offs: UI responsiveness vs. data completeness

## Extensibility

The design supports future requirements:
- ✅ **Config-based metrics**: Works by metric name (already supported)
- ✅ **Distributed caching**: Easy to swap DynamicTTLCache → Redis
- ✅ **User-specific profiles**: Can add profile override methods
- ✅ **Custom cache strategies**: Per-metric configuration enables any
strategy

## Documentation
- **TELEMETRY_IMPLEMENTATION.md**: Comprehensive implementation guide
  - Architecture overview
  - Profile system usage
  - Caching system configuration
  - Creating new metrics
  - Best practices
  - Troubleshooting

Closes #33980

## Changes

- [ ] [List the main changes made]

## Testing

- [ ] [Describe testing approach]

Closes #33980

**Issue:** Design and implement flexible caching and metric s
…pplication builder (#34099)

### Proposed Changes
This pull request updates the build configuration and proxy setup for
the `dotcms-ui` Angular application, improving compatibility with the
Angular CLI, enhancing development server behavior, and refining
TypeScript settings. The most significant changes are grouped below.

**Build and Angular CLI migration:**

* Switched the build executor in `project.json` from
`@nx/angular:browser-esbuild` to
`@angular-devkit/build-angular:application` for better Angular CLI
compatibility and future-proofing. Updated related build options,
including the use of `browser` and `polyfills` arrays, and added
`inlineStyleLanguage: "scss"`.
* Adjusted build and development configurations: set `baseHref` to
`/dotAdmin/` for development, added `externalDependencies`, and refined
output and optimization options.
* Moved `tags` and `implicitDependencies` to the end of `project.json`
to align with Nx conventions.

**Development server and proxy improvements:**

* Enhanced the proxy configuration in `proxy-dev.conf.mjs` by adding a
dedicated WebSocket proxy for `/api/ws` requests, explicitly disabling
WebSocket proxying for the main API proxy to avoid EPIPE errors, and
adding `/image` to the proxied contexts.
[[1]](diffhunk://#diff-f162544d3441baeebb73cbea3b36673232b11068a7307feb36347b6f2c7ad842R4-R16)
[[2]](diffhunk://#diff-f162544d3441baeebb73cbea3b36673232b11068a7307feb36347b6f2c7ad842L23-R42)
* Enabled Hot Module Replacement (`hmr`), continuous watch, and disabled
live reload in the `serve` target for a better development experience.

**TypeScript and Nx configuration:**

* Updated TypeScript config (`tsconfig.app.json` and `tsconfig.json`) to
explicitly set `module` to `es2022`, enable `esModuleInterop`, use
`incremental` builds, and resolve package exports for improved build
performance and compatibility.
[[1]](diffhunk://#diff-10e2a4ce011f740d1d211c3845ecc65a428036585d46ae744ea8fec2edd3e6e1L8-R12)
[[2]](diffhunk://#diff-129f6f7bf741121f3d4f4b9e5ccb290ad5966d456816b9f651b6016d86ee3647L21-R22)
* Increased Nx task runner parallelism from 1 to 3 for faster builds,
and added a `serve` section in `nx.json` with an empty `dependsOn`
array.
[[1]](diffhunk://#diff-2ea855fcca3f4e2b7f59d5be97e226f9c2b47cbe08579e5e7ccf2320a4ebc807L7-R7)
[[2]](diffhunk://#diff-2ea855fcca3f4e2b7f59d5be97e226f9c2b47cbe08579e5e7ccf2320a4ebc807R237-R239)

## 📊 Performance Comparison

| Metric | 🐢 Before (Webpack) | ⚡️ After (Esbuild) | Improvement |
| :--- | :--- | :--- | :--- |
| **Initial Bundle** | 16.37 MB | 2.14 MB | **⬇ 87% Smaller** |
| **Dead Code** | 13.73 MB (Vendor.js) | 0 MB | **Eliminated** |
| **Cold Start** | ~25s | ~15s | **40% Faster** |
| **Rebuild (HMR)** | ~5.6s | < 1s | **Instant** |
| **Console Logs** | Thousands of warnings | Clean | **Fixed** |



### Screenshots
Original             |  Updated
:-------------------------:|:-------------------------:
** original screenshot **  |  ** updated screenshot **

This PR fixes: #34098
### Proposed Changes
* Avoid that the payload get change after called the tranforms method

This PR fixes: #34104
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.