diff --git a/ENTITY-SELECTOR.md b/ENTITY-SELECTOR.md new file mode 100644 index 0000000..0795603 --- /dev/null +++ b/ENTITY-SELECTOR.md @@ -0,0 +1,761 @@ +# PrestaShop Entity Selector — Architecture & Developer Guide + +## Overview + +The Entity Selector is a Composer package (`myprestarocks/prestashop-entity-selector`) providing a universal entity targeting widget for PrestaShop admin controllers. It supports group-based selection with include/exclude logic, live preview, and 18 entity types with 130+ selection methods. + +**Package:** `vendor/myprestarocks/prestashop-entity-selector/` +**Namespace:** `MyPrestaRocks\EntitySelector` + +--- + +## Architecture + +### File Structure + +``` +src/ +├── EntitySelector.php # Main trait (orchestrator, AJAX routing, asset loading) +├── ScheduleConditions.php # Scheduling trait (datetime, weekly, holidays) +├── HolidayProviderInterface.php # Holiday provider contract +└── EntitySelector/ + ├── EntitySelectorRenderer.php # HTML rendering, layouts, block/group UI + ├── EntitySearchEngine.php # AJAX search, count, getByIds per entity type + ├── ProductConditionResolver.php # Product ID resolution for all 40+ methods + ├── EntityQueryHandler.php # Non-product entity ID resolution + └── EntityPreviewHandler.php # Preview data generation for all types + +assets/ +├── css/admin/ +│ ├── entity-selector.css # Compiled from SCSS +│ └── mpr-modal.css +└── js/admin/ + ├── entity-selector.js # Main JS (chips, search, serialization, UI) + ├── entity-selector.min.js + ├── entity-list-preview.js + └── schedule-conditions.js + +sources/ +├── scss/ # SCSS source files +└── js/admin/entity-selector/ # JS source (compiled via gulp) + ├── _core.js + ├── _events.js + ├── _dropdown.js + ├── _search.js + ├── _groups.js + ├── _chips.js + ├── _methods.js + ├── _preview.js + ├── _filters.js + └── _utils.js +``` + +### Component Roles + +| Component | Role | +|-----------|------| +| **EntitySelector** (trait) | Orchestrator. Mixes into admin controllers. Routes AJAX, initializes assets, lazy-loads helpers. | +| **EntitySelectorRenderer** | Generates all HTML. Handles 3 layout modes, block tabs, group UI, value pickers. | +| **EntitySearchEngine** | Handles `searchTargetEntities` AJAX. Dispatches to `searchTarget{EntityType}()` methods. Returns `{id, name, reference, subtitle, active, image}`. | +| **ProductConditionResolver** | Resolves product selection methods to product IDs. 40+ methods from `by_category` to `by_isbn_pattern`. Also handles combination attribute resolution. | +| **EntityQueryHandler** | Resolves selection methods for non-product entities (categories, manufacturers, customers, etc.). | +| **EntityPreviewHandler** | Generates rich preview data (name, image, reference, attributes) for displaying matched items. | +| **entity-selector.js** | Client-side: chips, search dropdowns, serialization, value pickers, keyboard shortcuts, pagination. | + +### Data Flow + +``` +Controller (uses EntitySelector trait) + │ + ├── setMedia() → initEntitySelector() → loads CSS + JS + │ + ├── renderForm() → renderEntitySelectorHtml($config, $savedData) + │ └── EntitySelectorRenderer → HTML with blocks, groups, pickers + │ + ├── ajaxProcess*() → handleEntitySelectorAjax() + │ ├── searchTargetEntities → EntitySearchEngine::search() + │ ├── getTargetEntitiesByIds → EntitySearchEngine::getByIds() + │ ├── countConditionMatches → ProductConditionResolver::getIdsByMethod() + │ ├── previewConditionItems → EntityPreviewHandler::getProductPreviewData() + │ ├── previewGroupItems → resolve + apply modifiers + preview + │ └── ... (20+ AJAX actions) + │ + └── postProcess() → parse JSON from hidden input → resolve IDs → save +``` + +--- + +## Usage + +### Basic Integration + +```php +use MyPrestaRocks\EntitySelector\EntitySelector; + +class AdminMyController extends ModuleAdminController +{ + use EntitySelector; + + public function setMedia($isNewTheme = false) + { + parent::setMedia($isNewTheme); + $this->initEntitySelector(); // loads CSS + JS + } + + // AJAX handler — route entity selector requests + public function ajaxProcessEntitySelector() + { + $this->handleEntitySelectorAjax(); + } + + // Render the widget + public function renderForm() + { + $html = $this->getEntitySelectorRenderer()->renderEntitySelectorHtml( + $config, // widget configuration + $savedData // previously saved selection data + ); + // embed $html in your form + } + + // Required: translate strings for the widget + protected function transEntitySelector($string) + { + return $this->module->l($string, 'EntitySelector'); + } +} +``` + +### Configuration Options + +```php +$config = [ + // Identity + 'id' => 'my-selector', // unique DOM ID + 'name' => 'entity_selector', // form field name + 'name_prefix' => 'target_', // prefix for generated field names + + // Labels + 'title' => 'Target Selection', + 'subtitle' => 'Define which items to target', + + // Which built-in entity blocks to show + 'show_products' => true, + 'show_categories' => true, + 'show_manufacturers' => true, + 'show_suppliers' => true, + 'show_cms' => true, + 'show_cms_categories' => true, + + // Mode + 'mode' => 'multi', // 'multi' = multiple groups, 'single' = one group only + 'combination_mode' => 'products', // 'products', 'combinations', or 'toggle' (for by_combination method) + 'empty_means_all' => false, // if true, empty selection = all items + 'required' => false, // validation: must have at least one selection + 'required_message' => '', // custom validation message + + // UI + 'show_modifiers' => true, // show limit/sort per group + 'show_all_toggle' => false, // show "select all" toggle + + // Layout: 'standalone' (full widget), 'form-group' (PS form-group), 'form-content' (content only) + 'layout' => 'standalone', + + // Custom entity blocks (see Custom Entity Types section) + 'customBlocks' => [], + + // Override default block definitions + 'blocks' => [], +]; +``` + +### Saved Data Format + +```json +{ + "products": { + "groups": [ + { + "name": "Group 1", + "include": { + "method": "by_category", + "values": [3, 5, 8] + }, + "excludes": [ + { + "method": "specific", + "values": [42, 99] + } + ], + "modifiers": { + "limit": 10, + "sort_by": "sales", + "sort_dir": "DESC" + } + } + ] + }, + "categories": { + "groups": [ + { + "include": { "method": "all", "values": [] }, + "excludes": [] + } + ] + } +} +``` + +### Group Logic + +- **Within a group:** Include MINUS Exclude (set difference) +- **Between groups:** OR (union) +- **Between blocks:** AND (intersection) + +### Resolving IDs from Saved Data + +```php +// Get product IDs from saved selection +$data = json_decode(Tools::getValue('entity_selector'), true); +$groups = $data['products']['groups'] ?? []; + +$resolver = $this->getProductConditionResolver(); +$productIds = []; + +foreach ($groups as $group) { + // Resolve include + $includeIds = $resolver->getIdsByMethod($group['include']['method'], $group['include']['values']); + + // Resolve excludes + foreach ($group['excludes'] ?? [] as $exclude) { + $excludeIds = $resolver->getIdsByMethod($exclude['method'], $exclude['values']); + $includeIds = array_diff($includeIds, $excludeIds); + } + + // Apply modifiers + if (!empty($group['modifiers'])) { + $includeIds = $resolver->applyModifiers($includeIds, $group['modifiers']); + } + + $productIds = array_merge($productIds, $includeIds); +} + +$productIds = array_unique($productIds); +``` + +--- + +## Entity Types & Selection Methods + +### Products (40+ methods) + +**By Entity:** +| Method | Value Type | Returns | +|--------|-----------|---------| +| `all` | none | All active products | +| `specific` | entity_search (products) | Selected product IDs | +| `by_category` | entity_search (categories) | Products in categories | +| `by_manufacturer` | entity_search (manufacturers) | Products by manufacturer | +| `by_supplier` | entity_search (suppliers) | Products by supplier | +| `by_tag` | entity_search (tags) | Products by tag | +| `by_attribute` | entity_search (attributes) | Products with attribute(s) | +| `by_feature` | entity_search (features) | Products with feature(s) | +| `by_combination` | combination_attributes | Products/combinations by attribute groups | + +**By Property:** +| Method | Value Type | Options | +|--------|-----------|---------| +| `by_condition` | multi_select_tiles | new, used, refurbished | +| `by_visibility` | multi_select_tiles | both, catalog, search, none | +| `by_active_status` | multi_select_tiles | active, inactive | +| `by_stock_status` | multi_select_tiles | in_stock, out_of_stock, low_stock | +| `by_on_sale` | boolean | Has on-sale flag | +| `by_has_specific_price` | boolean | Has active specific price | +| `by_is_virtual` | boolean | Is virtual product | +| `by_is_pack` | boolean | Is pack product | +| `by_has_combinations` | boolean | Has combinations/variants | +| `by_available_for_order` | boolean | Available for order | +| `by_online_only` | boolean | Online only | +| `by_has_related` | boolean | Has accessories/related | +| `by_has_customization` | boolean | Has customization fields | +| `by_has_attachments` | boolean | Has attachments | +| `by_has_additional_shipping` | boolean | Has additional shipping cost | +| `by_out_of_stock_behavior` | multi_select_tiles | deny, allow, default | +| `by_delivery_time` | multi_select_tiles | none, default, specific | +| `by_carrier_restriction` | multi_select_tiles | restricted, all | + +**By Text Pattern:** +| Method | Value Type | +|--------|-----------| +| `by_name_pattern` | pattern | +| `by_reference_pattern` | pattern | +| `by_description_pattern` | pattern | +| `by_long_description_pattern` | pattern | +| `by_ean13_pattern` | pattern | +| `by_upc_pattern` | pattern | +| `by_isbn_pattern` | pattern | +| `by_mpn_pattern` | pattern | +| `by_meta_title_pattern` | pattern | +| `by_meta_description_pattern` | pattern | + +**By Range:** +| Method | Value Type | +|--------|-----------| +| `by_id_range` | numeric_range | +| `by_price_range` | numeric_range | +| `by_weight_range` | numeric_range | +| `by_quantity_range` | numeric_range | +| `by_position_range` | numeric_range | +| `by_date_added` | date_range | +| `by_date_updated` | date_range | + +### Other Entities (summary) + +| Entity | Key Methods | +|--------|-------------| +| Categories | all, specific, by_name_pattern, by_product_count, by_depth_level, by_active_status | +| Manufacturers | all, specific, by_name_pattern, by_product_count, by_active_status | +| Suppliers | all, specific, by_name_pattern, by_product_count, by_active_status | +| CMS Pages | all, specific, by_cms_category, by_name_pattern, by_active_status, by_indexable | +| CMS Categories | all, specific, by_name_pattern, by_active_status, by_page_count | +| Employees | all, specific, by_profile, by_name_pattern, by_active_status | +| Customers | all, specific, by_group, by_name_pattern, by_email_pattern, by_company, by_order_count, by_turnover, by_active_status, by_newsletter, by_guest | +| Customer Groups | all, specific, by_name_pattern, by_price_display | +| Carriers | all, specific, by_name_pattern, by_active_status, by_shipping_handling, by_free_shipping, by_zone, by_customer_group, by_price_range, by_weight_range | +| Zones | all, specific, by_name_pattern, by_active_status | +| Countries | all, specific, by_zone, by_name_pattern, by_active_status, by_contains_states, by_need_zip_code, by_zip_format, by_need_identification | +| Currencies | all, specific, by_name_pattern, by_active_status | +| Languages | all, specific, by_name_pattern, by_active_status, by_rtl | +| Shops | all, specific, by_name_pattern, by_active_status | +| Profiles | all, specific, by_name_pattern | +| Order States | all, specific, by_name_pattern, by_paid, by_shipped, by_delivery | +| Taxes | all, specific, by_name_pattern, by_rate_range, by_active_status | + +--- + +## Value Types + +| Type | UI Component | Input Format | Example | +|------|-------------|-------------|---------| +| `none` | No input | `[]` | "All products" | +| `entity_search` | Search dropdown + chips | `[id1, id2, ...]` | Specific products, By category | +| `pattern` | Text input + case toggle | `[{"pattern": "blue*", "caseSensitive": false}]` | Name pattern | +| `multi_select_tiles` | Toggle tile buttons | `["new", "used"]` | Condition | +| `select` | Single dropdown | `"value"` | Active status | +| `numeric_range` | Min/Max inputs | `{"min": 10, "max": 50}` | Price range | +| `multi_numeric_range` | Multiple ranges | `[{"min": 0, "max": 10}, ...]` | Price bands | +| `date_range` | Date pickers | `{"from": "2024-01-01", "to": "2024-12-31"}` | Date added | +| `boolean` | Flag (no input) | `[true]` | Has combinations | +| `combination_attributes` | Attribute group picker | `{"mode": "products", "attributes": {"1": [3,4]}}` | By combination | + +--- + +## Combination Attributes (by_combination) + +The `by_combination` selection method allows targeting products by their attribute combinations. This is a **selection method** within the products block, not a separate entity type. + +### How It Works + +1. User selects "Combination" from the method dropdown +2. UI loads all attribute groups via AJAX (`getAttributeGroups`) +3. User clicks a group → lazy-loads values via AJAX (`getAttributeValues`) +4. User selects attribute values (tile-based UI with select-all/clear/search) +5. Logic: **OR within a group** (Red OR Blue), **AND between groups** (Color AND Size) + +### Combination Modes (`combination_mode` config) + +| Mode | Behavior | Returns | +|------|----------|---------| +| `'products'` (default) | Attribute selection filters products. Returns product IDs. | `id_product[]` | +| `'combinations'` | Returns exact combination IDs (product_attribute). | `id_product_attribute[]` | +| `'toggle'` | Shows radio toggle letting user choose per-selection. | Either type | + +### Data Format + +```json +{ + "method": "by_combination", + "values": { + "mode": "products", + "attributes": { + "1": [3, 4], + "2": [7, 8, 9] + } + } +} +``` + +Where `"1"` is `id_attribute_group` and `[3, 4]` are `id_attribute` values within that group. + +### Backend Resolution (ProductConditionResolver) + +```php +// ProductConditionResolver::getProductIdsByCombinationAttributes($values) +// mode = 'products': SELECT DISTINCT pa.id_product FROM ... +// mode = 'combinations': SELECT DISTINCT pa.id_product_attribute FROM ... +// Uses correlated subqueries for AND-logic between groups, OR within groups +``` + +--- + +## Custom Entity Blocks + +Custom entity blocks allow modules to add their own entity types (e.g., materials, suppliers, warehouses) to the entity selector widget. + +### Registration via `customBlocks` config + +```php +$config['customBlocks'] = [ + 'mpr_materials' => [ + 'label' => 'Materials', + 'entity_label' => 'material', + 'entity_label_plural' => 'materials', + 'icon' => 'icon-cubes', + 'search_entity' => 'mpr_materials', // entity type key for search routing + 'selection_methods' => [ + 'all' => [ + 'label' => 'All materials', + 'icon' => 'icon-asterisk', + 'value_type' => 'none', + 'group' => '', + ], + 'specific' => [ + 'label' => 'Specific materials', + 'icon' => 'icon-cube', + 'value_type' => 'entity_search', + 'search_entity' => 'mpr_materials', + 'group' => 'by_entity', + ], + ], + ], +]; +``` + +### Search Handler Implementation + +The `EntitySearchEngine` routes searches via `searchTarget{CamelCase}()`. For custom entities, you need to either: + +**Option A:** Subclass EntitySearchEngine and add your search methods, then override the getter in your controller. + +**Option B:** Override `ajaxSearchTargetEntities()` in your controller to intercept custom entity types before delegating to the engine: + +```php +protected function ajaxSearchTargetEntities() +{ + $entityType = Tools::getValue('entity_type', ''); + + // Handle custom entity types + if ($entityType === 'mpr_materials') { + $query = trim(Tools::getValue('q', '')); + $limit = (int) Tools::getValue('limit', 20); + $offset = (int) Tools::getValue('offset', 0); + + // Your search logic + $results = $this->searchMaterials($query, $limit, $offset); + $total = $this->countMaterials($query); + + $this->ajaxDie(json_encode([ + 'success' => true, + 'results' => $results, // [{id, name, subtitle?, active?, image?}, ...] + 'total' => $total, + 'offset' => $offset, + 'limit' => $limit, + ])); + return; + } + + // Fall back to built-in handler + parent::ajaxSearchTargetEntities(); +} +``` + +Similarly override `ajaxGetTargetEntitiesByIds()` and `ajaxGetTargetEntitiesByIdsBulk()` for chip restoration on form load. + +### Search Result Format + +```php +[ + 'id' => (int) 42, + 'name' => 'Display Name', // required + 'subtitle' => 'Reference or info', // optional, shown below name + 'active' => true, // optional, dim if false + 'image' => 'https://...', // optional, thumbnail URL + 'reference' => 'REF-001', // optional, shown as badge +] +``` + +--- + +## Layout Modes + +### `standalone` (default) +Full widget with header, collapse toggle, tabs, groups. Best for dedicated pages or modals. + +### `form-group` +Wraps widget in PrestaShop's standard `form-group` structure (`col-lg-3` label + `col-lg-9` content). Best for embedding in existing forms. + +### `form-content` +Just the content area (no wrapper). For when you have an existing `form-group` and need only the inner widget. Collapsed by default. + +```php +// Standalone +$config['layout'] = 'standalone'; + +// Inside a form +$config['layout'] = 'form-group'; + +// Content only (collapsed by default) +$config['layout'] = 'form-content'; +$config['collapsed'] = false; // override default collapse +``` + +--- + +## AJAX Actions + +All AJAX actions route through `handleEntitySelectorAjax()` with `trait=EntitySelector`. + +| Action | Purpose | Key Params | +|--------|---------|-----------| +| `searchTargetEntities` | Search entities by type | entity_type, q, limit, offset, filters | +| `getTargetEntitiesByIds` | Get entity by ID (chip restore) | entity_type, ids | +| `getTargetEntitiesByIdsBulk` | Bulk get entities by IDs | entities (JSON object) | +| `countConditionMatches` | Count matching items for a method | block_type, method, values | +| `countConditionMatchesBulk` | Bulk count multiple conditions | conditions (JSON) | +| `previewConditionItems` | Preview items for a condition | block_type, method, values, limit | +| `previewGroupItems` | Preview group with modifiers | block_type, group_data, limit | +| `countGroupItems` | Count items in a group | block_type, group_data | +| `previewEntitySelector` | Preview full entity selection | conditions, block_type, limit | +| `previewEntitySelectorBulk` | Bulk preview all entity types | conditions (JSON) | +| `getAttributeGroups` | List attribute groups | — | +| `getAttributeValues` | Get values for an attribute group | group_id | +| `getFeatureGroups` | List feature groups | — | +| `getCategoryTree` | Category tree hierarchy | — | +| `countPatternMatches` | Count pattern matches | pattern, field, entity_type | +| `previewPatternMatches` | Preview pattern matches | pattern, entity_type, limit | + +--- + +## Group Modifiers + +Available per group to limit and sort results: + +```php +'modifiers' => [ + 'limit' => 5, // max items from this group + 'sort_by' => 'sales', // sort field + 'sort_dir' => 'DESC', // sort direction +] +``` + +**Sort fields for products:** name, price, date_add, position, quantity, reference, id, sales + +--- + +## JavaScript API + +### Configuration Object + +The JS receives config from PHP via data attributes: + +```javascript +// Config keys available in JS +this.config = { + id: 'selector-id', + ajaxUrl: '...', + trans: { /* all translation strings */ }, + methodHelp: { /* help content per method */ }, + combinationMode: 'products', // 'products', 'combinations', 'toggle' + emptyMeansAll: false, +}; +``` + +### Events + +```javascript +// Selection changed +$(document).on('entitySelector:change', function(e, data) { }); + +// Block tab switched +$(document).on('entitySelector:tabChange', function(e, blockType) { }); + +// Group added/removed +$(document).on('entitySelector:groupAdd', function(e, groupData) { }); +$(document).on('entitySelector:groupRemove', function(e, groupIndex) { }); +``` + +### Keyboard Shortcuts + +| Key | Action | +|-----|--------| +| Ctrl+A | Select all in dropdown | +| Ctrl+D | Deselect all | +| Esc | Close dropdown | +| Enter | Confirm selection | + +--- + +## Schedule Conditions (separate trait) + +```php +use MyPrestaRocks\EntitySelector\ScheduleConditions; + +class AdminMyController extends ModuleAdminController +{ + use EntitySelector; + use ScheduleConditions; + + public function setMedia($isNewTheme = false) + { + parent::setMedia($isNewTheme); + $this->initEntitySelector(); + $this->initScheduleConditions(); + } +} +``` + +Configuration: datetime range, weekly schedule (per-day hour ranges), holiday exclusions by country. + +--- + +## Building from Source + +```bash +npm install +npm run build # compile SCSS → CSS, concatenate JS +npm run watch # watch mode +``` + +--- + +## Planned Feature: Product Selection Level + +> **Status: Planned — Not Yet Implemented** + +### Problem + +Currently, the entity selector's product search always returns **base products**. When a user searches for "Hummingbird sweater", they get one result regardless of how many combinations (Size: S/M/L/XL × Color: White/Black) the product has. + +For many use cases, users need to target **specific combinations** rather than entire products: +- **Stock management:** Set stock per combination (Size S, Color White) +- **Discounts:** Apply discount to specific variants +- **Product links:** Link specific combinations to materials + +### Solution: `product_selection_level` Config + +A new config option that changes how the products block fundamentally works — not just the `by_combination` selection method, but how **all** product-related operations (search, display, selection, preview) behave. + +```php +$config['product_selection_level'] = 'product'; // default — current behavior +$config['product_selection_level'] = 'combination'; // combination mode +$config['product_selection_level'] = 'both'; // combined mode +``` + +### Three Modes + +#### Mode 1: `product` (Default — Current Behavior) + +Search results show base products. Returns `id_product`. The product "Hummingbird sweater" appears as one item regardless of combinations. + +**Use case:** Product links, category assignments, anywhere you target an entire product. + +**Search result:** +``` +[x] Hummingbird sweater REF-001 +``` + +**Returns:** `id_product = 1` + +#### Mode 2: `combination` + +For products **with combinations**, each combination appears as a separate selectable item. The base product itself is NOT shown. Products without combinations (simple products) still appear as-is. + +**Use case:** Stock management, per-variant pricing, anything that targets individual variants. + +**Search result for "Hummingbird sweater" (4 combinations):** +``` +[x] Hummingbird sweater — Size: S, Color: White REF-001 +[x] Hummingbird sweater — Size: S, Color: Black REF-001 +[x] Hummingbird sweater — Size: M, Color: White REF-001 +[x] Hummingbird sweater — Size: M, Color: Black REF-001 +``` + +**Search result for "Brown bear notebook" (simple product, no combinations):** +``` +[x] Brown bear notebook REF-002 +``` + +**Returns:** `id_product_attribute` for combination products, `id_product` for simple products (needs encoding, e.g., negative ID or composite key). + +#### Mode 3: `both` (Combined) + +Both the full product AND each individual combination appear as selectable items. Users choose what they need — the entire product or specific variants. + +**Use case:** Discounts (apply to whole product OR specific combinations), flexible targeting. + +**Search result for "Hummingbird sweater":** +``` +[x] Hummingbird sweater REF-001 [entire product] + [x] — Size: S, Color: White + [x] — Size: S, Color: Black + [x] — Size: M, Color: White + [x] — Size: M, Color: Black +``` + +**Returns:** Mix of `id_product` (for whole-product selections) and `id_product_attribute` (for specific combinations). + +### Implementation Areas + +This feature requires changes across the full stack: + +#### 1. EntitySearchEngine — `searchTargetProducts()` +- When `product_selection_level = 'combination'`: query `ps_product_attribute` joined with `ps_product_attribute_combination` + attribute names +- Return combination-level results: `{id: pa.id_product_attribute, name: "Product — Attr1: Val1, Attr2: Val2", ...}` +- Simple products (no combinations) still returned with `id_product` + +#### 2. EntitySelectorRenderer — Config Propagation +- Pass `product_selection_level` to JS config +- Adapt chip display for combination items (show attribute string) + +#### 3. EntityPreviewHandler — Combination Previews +- `getCombinationPreviewData()` already exists — extend for search-based previews +- Show attribute values, per-combination stock/price if relevant + +#### 4. entity-selector.js — UI Adaptation +- Chip display: show attribute string for combination items +- Search result rendering: indent combinations under base product (mode 3) +- Data serialization: encode combination IDs distinctly from product IDs + +#### 5. ProductConditionResolver — All Selection Methods +- `getIdsByMethod()` must respect `product_selection_level` to return the right ID type +- For `by_category` in combination mode: return all `id_product_attribute` for products in that category +- For `specific` in combination mode: directly store `id_product_attribute` values + +#### 6. ID Encoding Strategy +Need a way to distinguish product IDs from combination IDs in the same value space: +- **Option A:** Encode as strings: `"p:1"` (product), `"c:42"` (combination) +- **Option B:** Encode as negative/positive: positive = `id_product_attribute`, negative = `-id_product` for simple products +- **Option C:** Always store tuples: `{id_product, id_product_attribute}` — 0 means "entire product" + +### Relationship to `by_combination` / `combination_mode` + +`by_combination` is a **selection method** (one of 40+ ways to filter products). It uses attribute group tiles to filter products by their combination attributes, controlled by `combination_mode`. + +`product_selection_level` is a **block-level config** that changes how the entire products block works — how search results appear, what IDs are stored in chips, what previews show. It affects ALL selection methods, not just `by_combination`. + +They are complementary: +- `product_selection_level = 'product'` + `by_combination` = "Find products that have Red + XL combination" → returns `id_product` +- `product_selection_level = 'combination'` + `specific` = "Search and pick individual combinations" → returns `id_product_attribute` +- `product_selection_level = 'combination'` + `by_category` = "All combinations of products in Hoodies category" → returns `id_product_attribute[]` + +--- + +## Requirements + +- PrestaShop 1.7.x, 8.x, or 9.x +- PHP 7.1+ +- Node.js 16+ (for building from source) + +## License + +Proprietary — MyPrestaRocks diff --git a/assets/css/admin/entity-selector.css b/assets/css/admin/entity-selector.css index 28d9c72..5be1f6b 100644 --- a/assets/css/admin/entity-selector.css +++ b/assets/css/admin/entity-selector.css @@ -799,6 +799,10 @@ .entity-selector-trait.single-mode .target-block-container { display: block; } +.target-conditions-trait.single-mode .entity-selector-tabs-row .target-block-tabs, +.entity-selector-trait.single-mode .entity-selector-tabs-row .target-block-tabs { + display: flex; +} .target-conditions-trait .header-actions, .entity-selector-trait .header-actions { @@ -1749,6 +1753,19 @@ align-items: center; gap: 0.5rem; } +.target-conditions-trait .dropdown-item.is-combination, +.entity-selector-trait .dropdown-item.is-combination { + padding-left: 28px; +} +.target-conditions-trait .dropdown-item.is-combination .result-name, +.entity-selector-trait .dropdown-item.is-combination .result-name { + font-size: 0.9em; +} +.target-conditions-trait .dropdown-item.is-parent-product, +.entity-selector-trait .dropdown-item.is-parent-product { + background: #f8fafc; + font-weight: 500; +} .target-conditions-trait .no-results, .entity-selector-trait .no-results { display: flex; @@ -3041,46 +3058,9 @@ body > .target-search-dropdown .filter-group-toggle .toggle-name, } body > .target-search-dropdown .filter-group-toggle .toggle-count, .target-search-dropdown .filter-group-toggle .toggle-count { - display: inline-flex; - align-items: center; - gap: 0.125rem; color: #6c757d; font-size: 0.65rem; } -body > .target-search-dropdown .filter-group-toggle .toggle-count i, -.target-search-dropdown .filter-group-toggle .toggle-count i { - font-size: 10px; - color: #25b9d7; -} -body > .target-search-dropdown .filter-group-toggle .toggle-count.clickable, -.target-search-dropdown .filter-group-toggle .toggle-count.clickable { - cursor: pointer; - padding: 0.125rem 0.25rem; - border-radius: 0.2rem; - transition: all 0.15s ease-in-out; -} -body > .target-search-dropdown .filter-group-toggle .toggle-count.clickable:hover, -.target-search-dropdown .filter-group-toggle .toggle-count.clickable:hover { - background: rgba(37, 185, 215, 0.1); - color: #25b9d7; -} -body > .target-search-dropdown .filter-group-toggle .toggle-count.clickable:hover i, -.target-search-dropdown .filter-group-toggle .toggle-count.clickable:hover i { - color: #25b9d7; -} -body > .target-search-dropdown .filter-group-toggle .toggle-count.clickable.popover-open, -.target-search-dropdown .filter-group-toggle .toggle-count.clickable.popover-open { - background: #25b9d7; - color: #ffffff; -} -body > .target-search-dropdown .filter-group-toggle .toggle-count.clickable.popover-open i, -.target-search-dropdown .filter-group-toggle .toggle-count.clickable.popover-open i { - color: #ffffff; -} -body > .target-search-dropdown .filter-group-toggle .toggle-count.clickable.loading i, -.target-search-dropdown .filter-group-toggle .toggle-count.clickable.loading i { - animation: spin 0.6s linear infinite; -} body > .target-search-dropdown .filter-chip, body > .target-search-dropdown .filter-attr-chip, body > .target-search-dropdown .filter-feat-chip, .target-search-dropdown .filter-chip, @@ -3201,6 +3181,81 @@ body > .target-search-dropdown .filter-chip.active .chip-count, .target-search-dropdown .active.filter-feat-chip .chip-count { color: rgba(255, 255, 255, 0.8); } +body > .target-search-dropdown .filter-chip-wrapper, +.target-search-dropdown .filter-chip-wrapper { + display: inline-flex; + align-items: stretch; + border-radius: 0.2rem; + overflow: hidden; +} +body > .target-search-dropdown .filter-chip-wrapper .filter-chip, +body > .target-search-dropdown .filter-chip-wrapper .filter-group-toggle, +.target-search-dropdown .filter-chip-wrapper .filter-chip, +.target-search-dropdown .filter-chip-wrapper .filter-attr-chip, +.target-search-dropdown .filter-chip-wrapper .filter-feat-chip, +.target-search-dropdown .filter-chip-wrapper .filter-group-toggle { + border-radius: 0.2rem 0 0 0.2rem; +} +body > .target-search-dropdown .filter-chip-wrapper .chip-preview-btn, +.target-search-dropdown .filter-chip-wrapper .chip-preview-btn { + padding: 0; + margin: 0; + background: none; + border: none; + cursor: pointer; + font: inherit; + color: inherit; +} +body > .target-search-dropdown .filter-chip-wrapper .chip-preview-btn:focus, +.target-search-dropdown .filter-chip-wrapper .chip-preview-btn:focus { + outline: none; +} +body > .target-search-dropdown .filter-chip-wrapper .chip-preview-btn, +.target-search-dropdown .filter-chip-wrapper .chip-preview-btn { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0 0.375rem; + font-size: 10px; + color: #6c757d; + background: #f1f5f9; + border-left: 1px solid #dee2e6; + border-radius: 0 0.2rem 0.2rem 0; + cursor: pointer; + transition: all 0.15s ease-in-out; +} +body > .target-search-dropdown .filter-chip-wrapper .chip-preview-btn:hover, +.target-search-dropdown .filter-chip-wrapper .chip-preview-btn:hover { + background: rgba(37, 185, 215, 0.1); + color: #25b9d7; +} +body > .target-search-dropdown .filter-chip-wrapper .chip-preview-btn.popover-open, +.target-search-dropdown .filter-chip-wrapper .chip-preview-btn.popover-open { + background: #25b9d7; + color: #ffffff; +} +body > .target-search-dropdown .filter-chip-wrapper .chip-preview-btn.loading i, +.target-search-dropdown .filter-chip-wrapper .chip-preview-btn.loading i { + animation: spin 0.6s linear infinite; +} +body > .target-search-dropdown .filter-chip-wrapper .filter-chip:last-child, +body > .target-search-dropdown .filter-chip-wrapper .filter-group-toggle:last-child, +.target-search-dropdown .filter-chip-wrapper .filter-chip:last-child, +.target-search-dropdown .filter-chip-wrapper .filter-attr-chip:last-child, +.target-search-dropdown .filter-chip-wrapper .filter-feat-chip:last-child, +.target-search-dropdown .filter-chip-wrapper .filter-group-toggle:last-child { + border-radius: 0.2rem; +} +body > .target-search-dropdown .filter-chip-wrapper .filter-group-toggle.active + .chip-preview-btn, +.target-search-dropdown .filter-chip-wrapper .filter-group-toggle.active + .chip-preview-btn { + border-left-color: #25b9d7; + background: rgba(37, 185, 215, 0.05); +} +body > .target-search-dropdown .filter-chip-wrapper .filter-group-toggle.has-selection + .chip-preview-btn, +.target-search-dropdown .filter-chip-wrapper .filter-group-toggle.has-selection + .chip-preview-btn { + border-left-color: #28a745; + background: rgba(40, 167, 69, 0.03); +} body > .target-search-dropdown .dropdown-content, .target-search-dropdown .dropdown-content { max-height: 400px; @@ -4982,6 +5037,16 @@ body > .target-search-dropdown .dropdown-item:not(:last-child) { .entity-selector-trait .chip-name { word-break: break-word; } +.target-conditions-trait .chip-attrs, +.entity-selector-trait .chip-attrs { + font-size: 0.85em; + opacity: 0.7; + margin-left: 2px; +} +.target-conditions-trait .chip-attrs::before, +.entity-selector-trait .chip-attrs::before { + content: "— "; +} .target-conditions-trait .chip-remove, .entity-selector-trait .chip-remove { padding: 0; @@ -7070,6 +7135,42 @@ body > .target-search-dropdown .dropdown-item:not(:last-child) { background-repeat: no-repeat; background-size: 1.25em 1.25em; } +.target-conditions-trait[data-mode=single] .groups-container, +.target-conditions-trait .mode-single .groups-container, +.entity-selector-trait[data-mode=single] .groups-container, +.entity-selector-trait .mode-single .groups-container { + padding: 0; +} +.target-conditions-trait[data-mode=single] .group-body, +.target-conditions-trait .mode-single .group-body, +.entity-selector-trait[data-mode=single] .group-body, +.entity-selector-trait .mode-single .group-body { + padding: 0; +} +.target-conditions-trait[data-mode=single] .group-include, +.target-conditions-trait .mode-single .group-include, +.entity-selector-trait[data-mode=single] .group-include, +.entity-selector-trait .mode-single .group-include { + padding: 0.5rem; + margin-bottom: 0; + background: transparent; + border: none; + border-radius: 0; +} +.target-conditions-trait[data-mode=single] .selection-group, +.target-conditions-trait .mode-single .selection-group, +.entity-selector-trait[data-mode=single] .selection-group, +.entity-selector-trait .mode-single .selection-group { + background: transparent; + border: none; + margin-bottom: 0; +} +.target-conditions-trait[data-mode=single] .group-header, +.target-conditions-trait .mode-single .group-header, +.entity-selector-trait[data-mode=single] .group-header, +.entity-selector-trait .mode-single .group-header { + display: none; +} .target-conditions-trait .condition-match-count, .entity-selector-trait .condition-match-count { display: inline-flex; @@ -8182,6 +8283,20 @@ body > .target-search-dropdown .dropdown-item:not(:last-child) { right: 20px; transform: none; } +.target-preview-popover.position-above::before, +.target-list-preview-popover.position-above::before { + top: auto; + bottom: -8px; + border-top: 8px solid #dee2e6; + border-bottom: 0; +} +.target-preview-popover.position-above::after, +.target-list-preview-popover.position-above::after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} .preview-header { display: flex; diff --git a/assets/css/admin/entity-selector.css.map b/assets/css/admin/entity-selector.css.map index 3243e7e..ae44e65 100644 --- a/assets/css/admin/entity-selector.css.map +++ b/assets/css/admin/entity-selector.css.map @@ -1 +1 @@ -{"version":3,"sources":["main.scss","_variables.scss","../../../prestashop-admin/assets/scss/_variables.scss","_mixins.scss","layouts/_form-integration.scss","layouts/_responsive.scss","components/_entity-selector.scss","components/_entity-item.scss","components/_dropdown.scss","components/_chips.scss","components/_groups.scss","components/_value-picker.scss","components/_modal.scss","components/_list-preview.scss","components/_schedule.scss","components/_tips.scss","components/_condition-trait.scss","components/_combinations.scss","components/_method-dropdown.scss","components/_tooltip.scss","components/_tree.scss","components/_validation.scss"],"names":[],"mappings":"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;EACA,OJjJC;;AIqJL;AAAA;EACI;EACA,YL5JG;EK6JH;;AAIJ;AAAA;EACI;EACA;EACA;EACA;EACA,YL/HO;EKgIP;;AAGJ;AAAA;EACI;EACA;EACA;EACA,KL9FQ;EK+FR;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OJnLI;EIoLJ,WLvDU;EKwDV,aLnDgB;EKoDhB;EACA;;AAEA;AAAA;EACI,YLrJG;EKsJH,OLjJG;;AKoJP;AAAA;EACI,YLlMD;EKmMC,qBL9IE;EK+IF,OJlMF;;AIqMF;AAAA;EACI,WLxEM;;AK2EV;AAAA;EACI;;AAGJ;AAAA;EH5CJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YDxKM;ECyKN,OF3KO;EE4KP,WF7Cc;EE8Cd,aFvCsB;EEwCtB,eFjFa;EEkFb;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;;AAEA;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA;;AAKR;AAAA;AAAA;EAEI,YFtKO;EEuKP;;AAEA;AAAA;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;EACA;;AAGJ;AAAA;EACI;;AAGJ;AAAA;EACI,aFpGc;;AK4Ed;AAAA;EHhDJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YFhIW;EEiIX,OF3KO;EE4KP,WF7Cc;EE8Cd,aFvCsB;EEwCtB,eFjFa;EEkFb;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;;AAEA;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA;;AAKR;AAAA;AAAA;EAEI,YFtKO;EEuKP;;AAEA;AAAA;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;EACA;;AAGJ;AAAA;EACI;;AAGJ;AAAA;EACI,aFpGc;;AKkFlB;AAAA;EACI;EACA;EACA,YLrLO;EKsLP;EACA;;AAEA;AAAA;EACI;EACA;EACA;;AAKR;AAAA;EACI;EACA;EACA;EACA;EACA,YLtMO;EKuMP;EACA,OL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EACI;EACA;;AAKR;AAAA;EACI;EACA;EACA;EACA;EACA,KPhSQ;EOiSR,SP9RQ;EO+RR;EACA,ONhXI;;AMkXJ;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA,WP5PM;;AOiQd;AAAA;EACI;EACA;EACA;EACA,SPlTQ;EOmTR,ONnYI;;AMqYJ;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;EACA;EACA,KN5ZC;EM6ZD;EACA,YP/WM;EOgXN;EACA;;AAIJ;AAAA;EACI;EACA;EACA,KP/UQ;EOgVR,WPhSU;EOiSV,ON7ZI;;AM+ZJ;AAAA;EACI,ONhaA;;AMmaJ;AAAA;AAAA;AAAA;EAEI;EACA;EACA;EACA,eNlZO;EMmZP;EACA;EACA,WP/SM;EOgTN,OP9YE;EO+YF;EACA;;AAEA;AAAA;AAAA;AAAA;EACI,cNlbN;;AMqbE;AAAA;AAAA;AAAA;EACI;EACA,cNvbN;;AM2bF;AAAA;EACI,ON3bA;;AM6bA;AAAA;EACI,OPhaF;EOiaE,aP5TU;;AOgUlB;AAAA;ELvaJ;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AK8ZA;AAAA;EAEI;EACA,WP1UM;EO2UN,ONxcF;EMycE;EACA,eNnbO;EMobP;;AAEA;AAAA;EACI,YP1cG;;AOgdf;AAAA;EACI;EACA;EACA,KPzYQ;;AO4YZ;AAAA;EL7bA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AKobJ;AAAA;EAEI;EACA;EACA;EACA;EACA,WPnWU;EOoWV,aP9VgB;EO+VhB,eN3cW;EM4cX;;AAEA;AAAA;EACI;EACA;EACA;EACA;EACA,aPxWY;;AO2WhB;AAAA;EACI,OP/cE;EOgdF,YPjfD;EOkfC;;AAEA;AAAA;EACI,YP9cD;EO+cC,cPxdF;;AO4dN;AAAA;AAAA;EAEI,OP5fD;EO6fC,YN3fF;EM4fE;;AAEA;AAAA;AAAA;EACI,YP5fG;EO6fH,cP7fG;;AOggBP;AAAA;AAAA;EACI;;AAMZ;AAAA;EACI;;AAGJ;AAAA;EACI;;AAIJ;AAAA;EACI,SN/hBC;EMgiBD,YPjfM;EOkfN;;AAGJ;AAAA;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xBR,SNl3BC;EMm3BD,YNl2BA;EMm2BA;EACA;EACA;;AAGJ;AAAA;EACI,WPjvBU;EOkvBV,aP5uBkB;EO6uBlB,OPh1BM;EOi1BN;;AAGJ;AAAA;EACI;EACA;EACA,KP3yBQ;EO4yBR;EACA;EACA;;AAGJ;AAAA;AAAA;AAAA;ELj2BA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;EACI;;AKw1BJ;AAAA;AAAA;AAAA;EAGI;EACA;EACA;EACA;EACA,WPxwBU;EOywBV,OPv2BM;EOw2BN,YPz4BG;EO04BH;EACA,eNl3BW;EMm3BX;EACA;;AAEA;AAAA;AAAA;AAAA;EACI,YPp3BE;EOq3BF,cPx2BG;;AO22BP;AAAA;AAAA;AAAA;EACI;EACA;EACA,YPh3BG;EOi3BH;EACA,ONt5BA;;AM05BR;AAAA;EACI;EACA;;AAIJ;AAAA;ELj0BA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;AOo4BV;AAAA;EAEI;EACA,WPvyBU;EOwyBV;EACA;EACA;EACA;;AAGJ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ONp7BI;EMq7BJ,YPx7BG;EOy7BH;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AAGJ;AAAA;EACI,YPv6BE;EOw6BF,OPj6BE;;AOo6BN;AAAA;EACI,YPl8BO;EOm8BP,cNv8BF;EMw8BE,ONx8BF;;AM48BN;AAAA;EL52BA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;AO+6BV;AAAA;EAEI;EACA,WPl1BU;EOm1BV;EACA;;AAGJ;AAAA;AAAA;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ON99BI;EM+9BJ,YPl+BG;EOm+BH;EACA,eN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EACI,WP/tCM;EOguCN,aPztCc;EO0tCd,OP/zCE;EOg0CF;;AAGJ;AAAA;ELr0CJ;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AK4zCA;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA,ONz2CA;EM02CA,eNp1CO;;AMs1CP;AAAA;EACI,YPx0CD;EOy0CC,OP90CF;;AOo1CV;AAAA;EACI,aPnvCgB;;AOsvCpB;AAAA;EACI;EACA,ON13CI;EM23CJ;;AAGJ;AAAA;AAAA;AAAA;EACI;;AAIJ;AAAA;EACI;EACA;;AL7wCJ;AAAA;EACI;EACA;;AAGJ;AAAA;EACI,YDzHA;EC0HA;;AAGJ;AAAA;EACI,YD/GO;ECgHP;;AAEA;AAAA;EACI,YF5GE;;AO82CV;AAAA;EACI;EACA;EACA,KPh0CQ;EOi0CR,SPh0CQ;;AOm0CZ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI,YN15CF;EM25CE,cN35CF;;AM+5CN;AAAA;EACI;EACA;EACA;EACA;EACA,eN74CW;EM84CX,YPh4CO;;AOm4CX;AAAA;EACI;EACA;;AAGJ;AAAA;EACI,WPhzCU;EOizCV,aP5yCgB;EO6yChB,OP/4CM;EEfV;EACA;EACA;;AKg6CA;AAAA;EACI,WPxzCU;EOyzCV,ONr7CI;ECiBR;EACA;EACA;;AKu6CA;AAAA;EACI;EACA;EACA;EACA,KN18CC;EM28CD;EACA,YP75CM;EO85CN;EACA;;AAGJ;AAAA;EACI;EACA;EACA,KP53CQ;EO63CR,WP70CU;EO80CV,ON18CI;;AM48CJ;AAAA;EACI,ON78CA;;AMg9CJ;AAAA;AAAA;AAAA;EAEI;EACA;EACA;EACA,eN/7CO;EMg8CP;EACA;EACA,WP51CM;EO61CN,OP37CE;EO47CF;EACA;;AAEA;AAAA;AAAA;AAAA;EACI,cN/9CN;;AMk+CE;AAAA;AAAA;AAAA;EACI;EACA,cNp+CN;;AMw+CF;AAAA;EACI,ONx+CA;;AM0+CA;AAAA;EACI,OP78CF;EO88CE,aPz2CU;;AO82CtB;AAAA;EACI;EACA;EACA,KPv6CQ;;AO06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;EACA,YR3vBO;EQ4vBP,ePluBe;EOmuBf,YRvpBW;EQwpBX;;AAEA;EACI;EACA;EACA;EACA,KRprBQ;EQqrBR;EACA,YP9vBA;EO+vBA;;AAGJ;EACI;EACA;EACA,KR7rBQ;EQ8rBR,WR9oBU;EQ+oBV,aRzoBkB;EQ0oBlB,OR7uBM;;AQgvBV;EACI;EACA;;AAGJ;ENzvBA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AMgvBJ;EAEI;EACA;EACA;EACA;EACA;EACA,OP5xBI;EO6xBJ,ePxwBQ;EOywBR;;AAEA;EACI,YR5vBG;EQ6vBH,ORpwBE;;AQuwBN;EACI;;AAIR;EACI;EACA;EACA,SRhuBQ;;AE2CZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;AQuxBV;EACI;EACA;EACA;EACA,KRzuBQ;EQ0uBR;EACA,OPxzBI;EOyzBJ,WR5rBU;;AQ8rBV;EACI;;AAGJ;EACI;;AAKR;EACI;EACA;EACA,OPx0BI;;AO00BJ;EACI;EACA;EACA,eRhwBI;EQiwBJ;;AAGJ;EACI;EACA,WRttBM;;AQ2tBd;EACI;EACA;EACA,KR/wBQ;;AQkxBZ;EACI;EACA;EACA,KP72BC;EO82BD;EACA,YRh0BM;EQi0BN,eP/0BQ;EOg1BR;;AAEA;EAEI,mBPr2BL;;AOw2BC;EACI,mBP12BF;;AO62BF;EAEI;;AAIR;EACI;EACA;;AAEA;EACI;EACA,WR/vBM;EQgwBN,aR1vBc;EQ2vBd,OR91BE;;AQi2BN;EACI;EACA,WRvwBM;EQwwBN,OPp4BA;;AOw4BR;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA,WRzxBU;EQ0xBV,ORv3BM;EQw3BN;;AAGJ;EACI;EACA,aRh1BQ;EQi1BR;EACA;EACA,aR9xBgB;EQ+xBhB;EACA,YR73BO;EQ83BP,ORr4BM;EQs4BN,eP94BW;EO+4BX;;AAGJ;EACI,YPr7BC;EOs7BD,WR9yBU;EQ+yBV,OP36BI;EO46BJ;;AAIJ;EACI;EACA;EACA,KRv2BQ;EQw2BR;EACA;EACA,YRn5BM;;AQq5BN;EACI;EACA,OP17BA;;AO67BJ;EACI;EACA;EACA;EACA,WRp0BM;EQq0BN,ORl6BE;EQm6BF;EACA;;AAEA;EACI,OPv8BJ;;;AO88BZ;EACI;IACI;;EAEJ;IACI;;;AAcI;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ePt9BG;EOu9BH;EACA;EACA,OR/8BF;EQg9BE;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;EACI,OPp/BR;EOq/BQ;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA,cP3/BV;EO4/BU;;AAKR;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA;EACA;EACA;EACA,eP/+BG;EOg/BH;EACA;EACA;EACA;EACA,OR5+BF;EQ6+BE;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;EACI,cPlhCV;;AOqhCM;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA,cPvhCV;EOwhCU;;;ATziCpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AUAA;AAAA;AAAA;AAAA;AAYI;AAAA;EACI,YTEG;ESDH;EACA,eR0BW;EQzBX;;AAIJ;AAAA;EACI;EACA;EACA;EACA,KRlBC;EQmBD;EACA,YRHA;EQIA;;AAGJ;AAAA;EACI;EACA;EACA,KT8DQ;ES7DR,WT6GU;ES5GV,aTkHkB;ESjHlB,OTcM;;ASZN;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA,YR5BF;EQ6BE,OT/BD;ESgCC,WT+FM;ES9FN,aTsGU;ESrGV,eT2DK;;ASvDb;AAAA;EACI;EACA;EACA,KTsCQ;;ASnCZ;AAAA;EPbA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOIJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,ORhDI;EQiDJ,eR3BW;EQ4BX;;AAEA;AAAA;EACI,YThBG;ESiBH,OTxBE;;AS2BN;AAAA;EACI,YT/CM;ESgDN,ORzDH;;AQ8DL;AAAA;AAAA;AAAA;EAEI,SR9EC;;AQkFL;AAAA;EACI,eRnFC;;AQsFL;AAAA;EACI;EACA;EACA,KTDQ;ESER,eTDQ;ESER,WT6CU;ES5CV,aTmDkB;ESlDlB;EACA;;AAEA;AAAA;EACI,OT7EM;;AS+EN;AAAA;EACI,ORvFN;;AQ2FF;AAAA;EACI,OR3FH;;AQ6FG;AAAA;EACI,OR9FP;;AQoGL;AAAA;EACI;EACA;EACA,KT5BQ;ES6BR,eT7BQ;;ASgCZ;AAAA;EACI;EACA;;AAGJ;AAAA;EPnBA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;ASsFV;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;AAAA;EPjGA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOwFJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,ORpII;EQqIJ,eT3CS;ES4CT;;AAEA;AAAA;EACI,YTrGG;ESsGH,OR3IF;;AQgJN;AAAA;EACI;;AAGJ;AAAA;EPvHA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AO8GJ;AAAA;EAEI;EACA;EACA,KT1EQ;ES2ER;EACA;EACA,YT7JG;ES8JH;EACA,eRvIQ;EQwIR,OR7JI;EQ8JJ,WTjCU;ESkCV;EACA;;AAEA;AAAA;EACI,cT7HG;;ASgIP;AAAA;EACI,cRxKF;EC4CN;EACA;;AO+HI;AAAA;EACI,OThJE;;ASqJV;AAAA;EACI;;AAGJ;AAAA;EPtFA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;ASyJV;AAAA;EAEI;;AAGJ;AAAA;EP9JA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOqJJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ORtME;EQuMF,eRhLW;EQiLX;;AAEA;AAAA;EACI,YTvMO;;AS4Mf;AAAA;EACI;EACA;EACA,KTrIQ;;ASwIZ;AAAA;EACI;EACA;EACA,KT3IQ;;AS8IZ;AAAA;EP5HA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;AS+LV;AAAA;EAEI;EACA;;AAGJ;AAAA;EACI,ORlOI;EQmOJ,WTtGU;;ASyGd;AAAA;EP1MA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOiMJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,OR7OI;EQ8OJ,eRxNW;EQyNX;;AAEA;AAAA;EACI,YTvOM;ESwON,ORjPH;;AQqPL;AAAA;EP3NA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOkNJ;AAAA;EAEI;EACA;EACA;EACA;EACA,OR9PE;EQ+PF,WTlIU;ESmIV,aT7HgB;ES8HhB,eR1OW;EQ2OX;;AAEA;AAAA;EACI,YTjQO;;ASsQf;AAAA;EACI;EACA;EACA,KThMQ;;ASmMZ;AAAA;EPnPA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AO0OJ;AAAA;EAEI;EACA;EACA;EACA;EACA,YTjPO;ESkPP,OTxPM;ESyPN,WT3JU;ES4JV,aTtJgB;ESuJhB;EACA,eThMS;ESiMT;;AAEA;AAAA;EACI,YTzPG;;AS4PP;AAAA;EACI,YT/RO;ESgSP,ORpSF;EQqSE,cRrSF;;AQ0SN;AAAA;EACI,YRtTC;EQuTD,aRvTC;EQwTD;;AAIJ;AAAA;EACI;EACA;EACA,KTtOQ;;ASyOZ;AAAA;EACI;;AAGJ;AAAA;EP9RA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOqRJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,ORjUI;EQkUJ,eR5SW;EQ6SX;EACA;;AAEA;AAAA;EACI,YT5TM;ES6TN,ORtUH;;AQ0UL;AAAA;EPhTA;EACA;EACA;EACA;E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CI;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAKR;AAAA;ERlGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YDxKM;ECyKN,OF3KO;EE4KP,WF7Cc;EE8Cd,aFvCsB;EEwCtB,eFjFa;EEkFb;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;;AAEA;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA;;AAKR;AAAA;AAAA;EAEI,YFtKO;EEuKP;;AAEA;AAAA;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;EACA;;AAGJ;AAAA;EACI;;AAGJ;AAAA;EACI,aFpGc;;AU8HlB;AAAA;EAEI,aVvLQ;;;AD/FhB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AYAA;AAAA;AAAA;AAAA;AAUA;EACI;EACA;EACA;EACA;EACA;EACA;EACA,SXmHS;EWlHT;EACA;;AAEA;EACI;;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YXrBO;EWsBP,eXsEW;EWrEX,YX+EW;EW9EX;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;;;AAKR;EACI;EACA;EACA;EACA,KVrEK;EUsEL;EACA,YVtDI;EUuDJ;EACA;;;AAGJ;EACI,WX6DgB;EW5DhB,aXiEsB;EWhEtB,OXnCU;EWoCV;;;AAGJ;ET3CI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;ASkCR;EAEI;EACA;EACA;EACA;EACA;EACA,OV9EQ;EU+ER,eV1DY;EU2DZ;;AAEA;EACI,YX9CO;EW+CP,OXtDM;;AWyDV;EACI,WXuCU;;;AWlClB;EACI;EACA;EACA,SXjBY;;AEyCZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;;AW0Ed;EACI;EACA;EACA;EACA,KX5BY;EW6BZ;EACA,YVtGI;EUuGJ;EACA;;;AAGJ;ETpFI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AS2ER;EAEI;EACA;EACA;EACA,KXzCY;EW0CZ;EACA,WXMc;EWLd,aXUoB;EWTpB,eVpGY;EUqGZ;;AAEA;EACI,OX/FM;EWgGN,YX1FO;;AW4FP;EACI,YX5FG;;AWgGX;EACI,OXzIG;EW0IH,YVxIE;;AU0IF;EACI,YXxIO;;AW4If;EACI,OXlJG;EWmJH,YV9IC;;AUgJD;EACI;;AAIR;EACI;EACA;;;AAMR;EACI;EACA;EACA;EACA,KXtFY;EWuFZ;EACA,YVhKI;EUiKJ;EACA;;;AAGJ;EACI,WX9Cc;EW+Cd,aXzCsB;EW0CtB,OX7IU;;;AWgJd;ETpJI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AS2IR;EAEI;EACA;EACA;EACA;EACA;EACA,OVvLQ;EUwLR,eVlKe;EUmKf;;AAEA;EACI,YXvJO;EWwJP,OX/JM;;;AWmKd;EACI;EACA;EACA,SXvHY;;AE2CZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;;AW6Kd;EACI;EACA;EACA;EACA,KX/HY;EWgIZ;EACA,YVzMI;EU0MJ;EACA;;;AAGJ;EACI,WXxFc;EWyFd,OVrNQ;;;AUwNZ;ET5LI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;ASmLR;EAEI;EACA;EACA;EACA;EACA,WXlGc;EWmGd,aX7FoB;EW8FpB,OVjOM;EUkON,eV3Me;EU4Mf;;AAEA;EACI,YXlOW;;;AWuOnB;EACI;EACA;EACA;EACA,YXjPO;EWkPP;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAQR;EACI;EACA;EACA;EACA;EACA;EACA;EACA,SX5JS;;AW8JT;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,YXxSG;EWySH,eV/QW;EUgRX,YXpMO;EWqMP;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA,KV7TC;EU8TD;EACA,YV9SA;EU+SA;EACA;;AAGJ;EACI;EACA;EACA,KX9OQ;EW+OR,WX9LY;EW+LZ,aX1LkB;EW2LlB,OX9RM;EW+RN;;AAEA;EACI;EACA,OVpUF;;AUwUN;ET3SA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;ASkSJ;EAEI;EACA;EACA;EACA;EACA;EACA,OV9UI;EU+UJ,eV1TQ;EU2TR;;AAEA;EACI,YX9SG;EW+SH,OXtTE;;AWyTN;EACI;;AAIR;EACI;EACA;EACA,SXhRQ;;AEyCZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;AWyUV;EACI;EACA;EACA;EACA,KX3RQ;EW4RR;EACA,OV1WI;EU2WJ,WX9OU;;AWgPV;EACI,WX/OM;;AWoPd;EACI;EACA;EACA,OVtXI;;AUwXJ;EACI;EACA;EACA,eVvYH;;AU0YD;EACI;;AAGJ;EACI,WXvQM;EWwQN,OVpYA;;AUyYR;EACI;EACA;EACA,KX/TQ;;AWkUZ;EACI;EACA;EACA,KV9ZC;EU+ZD;EACA,YXjXM;EWkXN,eVhYQ;EUiYR;;AAEA;EACI,mBVrZL;;AUwZC;EACI,mBV1ZF;;AU6ZF;EACI;;AAIR;EACI;EACA;;AAEA;EACI;EACA,WX9SM;EW+SN,aXzSc;EW0Sd,OX7YE;;AWgZN;EACI;EACA,WXtTM;EWuTN,OVnbA;;AUubR;EACI;EACA;;AAGJ;EACI;EACA,WXjUU;EWkUV,OX/ZM;EWgaN;;AAGJ;EACI;EACA,YXzXQ;EW0XR;EACA;EACA,aXtUgB;EWuUhB;EACA,YXraO;EWsaP,OX7aM;EW8aN,eVtbW;;AUybf;EACI,YV5dC;EU6dD,WXrVU;EWsVV,OVldI;EUmdJ;;;AZreR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AaAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;AAAA;EAEI;EACA;EACA;EACA;EACA,YZNO;EYOP;EACA,eXkBe;EWjBf,YZ4FW;EY3FX;;AAGA;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKA;AAAA;AAAA;EAEI;EACA;;AAMJ;AAAA;AAAA;EAEI;EACA;EACA;;;AASZ;EACI;EACA;EACA;EACA;EACA,YXxDI;EWyDJ;;AAEA;EACI,WZ4DU;EY3DV,aZiEkB;EYhElB,OZnCM;;AYsCV;EV1CA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AUiCJ;EAEI;EACA;EACA;EACA;EACA;EACA,OX7EI;EW8EJ,eXxDW;EWyDX;;AAEA;EACI,YZ7CG;EY8CH,OZnDE;;;AY4Dd;EACI;EACA;EACA;EACA;EACA,YZ9DU;EY+DV;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OX9GQ;EW+GR,WZac;EYZd,aZkBoB;EYjBpB;EACA;EACA;;AAEA;EACI,YZlFO;EYmFP,OZzFM;;AY4FV;EACI,YZ9HG;EY+HH,qBX7HE;EW8HF,OX9HE;;AWiIN;EACI;;;AAQR;EACI;EACA;EACA,KZ/DY;EYgEZ;EACA,YZjJO;EYkJP;;AAEA;EACI,OXlJI;EWmJJ;;AAGJ;EACI;EACA;EACA;EACA,WZ9BU;EY+BV,OZ3HM;EY4HN;;AAEA;EACI,OX/JA;;;AWwKZ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;AVxDA;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;AYwJV;EACI;;;AAQR;EACI;EACA;EACA;;;AAQJ;EACI;EACA;EACA,KZ7HY;EY8HZ,SZ9HY;EY+HZ,YZ/MO;EYgNP,eXvLe;EWwLf;;AAEA;EACI,YZxLM;;AY4LV;EACI;;;AAKR;EACI;EACA;EACA;EACA;EACA,eX1Me;EW2Mf,YZ7LW;;;AYiMf;EACI;EACA;EACA;EACA;EACA;EACA;EACA,YZxMW;EYyMX,OX7OQ;EW8OR,eXxNe;EWyNf,WZlHc;;;AYsHlB;EACI;EACA;EACA;EACA;EACA;;;AAIJ;EACI,WZhIc;EYiId,aZ5HoB;EY6HpB,OZ/NU;EEfV;EACA;EACA;;;AUiPJ;AAAA;EAEI,WZ1Ic;EY2Id,OXvQQ;ECiBR;EACA;EACA;;;AUyPJ;EACI;EACA;EACA,WZnJc;EYoJd,aZ7IsB;EY8ItB,OXlRM;EWmRN,YZ/Qe;EYgRf,eX7Pe;;;AWoQnB;EACI;EACA,YZzPU;EY0PV;;;AAGJ;EACI;EACA;EACA;EACA,KZvNY;EYwNZ,WZzKc;EY0Kd,OXtSQ;;AWwSR;EACI;;AAGJ;EACI;EACA;EACA;EACA,eX1RW;EW2RX;EACA;EACA,WZvLU;EYwLV,aZlLgB;EYmLhB,OXtTE;EWuTF;EACA;EACA;EACA;EACA;;AAEA;EACI,cX9TF;EW+TE,kBZ3TO;;AY8TX;EACI;EACA,cXpUF;EWqUE;;AAIR;EACI;;AAGJ;EACI,aZ1MkB;EY2MlB,OZhTM;;AYmTV;EACI;EACA;EACA;EACA,SZzQQ;EY0QR;EACA;EACA,OXzVE;EW0VF,YZtVW;EYuVX,eXpUW;EWqUX;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAEA;EACI;;;AAUhB;EACI;EACA;EACA;EACA;EACA,KZ7SY;EY8SZ,SZ3SY;EY4SZ;EACA,OX7XQ;;AW+XR;EACI;EACA;;AAGJ;EACI;EACA,WZzQU;;;AY6QlB;EACI;EACA;EACA;EACA,SZ9TY;EY+TZ,OX/YQ;;AWiZR;EACI;EACA,OXpZE;EWqZF;;;AAQR;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA,KXhbC;EWibD;EACA,YXjaA;EWkaA;;AAEA;EACI,aZvSc;EYwSd,OZ3YE;EY4YF,WZ/SM;;AYkTV;EACI;EACA,WZrTM;EYsTN,aZhTY;EYiTZ,OXnbA;EWobA,YZ/YG;EYgZH;EACA,eXhaO;;AWoaf;EACI;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA,KZ1XQ;EY2XR;EACA;EACA;;AAEA;EACI,YZ1aE;;AY6aN;EACI;EACA;EACA,OXndA;EWodA;;AAGJ;EACI;EACA,WZ5VM;EY6VN,OZ1bE;;AY6bN;EACI,WZjWM;EYkWN,aZ5Vc;EY6Vd,OXjeF;EWkeE;EACA;EACA,eX7cO;;;AWmdnB;EACI;EACA;;AAEA;EACI;;AAGJ;EACI;;;AASR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YZvgBO;EYwgBP;EACA,eX/ee;EWgff,YZraW;EYsaX;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAIJ;AAAA;EAEI;EACA;EACA;EACA;EACA;;;AAIR;EACI;;;AAIJ;EACI;;;AAGJ;EACI;;AAEA;EACI;EACA;;;AAIR;EACI;;;AAGJ;EACI,OXpkBM;EWqkBN;EACA;;;AAIJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;;;AAIR;EACI,YXtmBM;EWumBN,OZzmBO;;;AY4mBX;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI,YZ/kBW;EYglBX,OXrnBQ;;;AFlBZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AcAA;AAAA;AAAA;AAAA;AASA;EACI,YbKO;EaJP;EACA,eZ6Be;;;AYzBnB;EACI;EACA;EACA;EACA,KZdK;EYeL;EACA,YZCI;EYAJ;EACA;EACA;EACA;EACA;;AAEA;EACI,YbaM;;;AaTd;EACI;EACA;EACA;EACA,WbyGc;EaxGd,ab8GsB;Ea7GtB,ObUU;;AaRV;EACI,OZzBI;;;AY8BZ;EACI,SZ3CK;;;AY+CT;EACI,eb2CY;;AazCZ;EACI;;;AAIR;EACI;EACA;EACA,Kb+BY;Ea9BZ,eb8BY;Ea7BZ,Wb6Ec;Ea5Ed,abkFsB;EajFtB,OblBU;;AaoBV;EACI,OZrDI;;;AYyDZ;EACI,eZtEK;EYuEL,WbiEc;EahEd,OZ5DQ;;;AYgEZ;EACI;EACA;EACA,KZ/EK;;;AYkFT;EACI;EACA;;;AAGJ;EACI;EACA;EACA,Wb8Cc;Ea7Cd,abmDoB;EalDpB,OblDU;;;AaqDd;EXYI;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;EACI,cD3GE;EC4CN;EACA;;AAkEA;EACI,OFnFM;;;Aa4Dd;EACI;EACA;EACA,KbdY;;;AaiBhB;EACI;EACA;EACA,KZ7GK;EY8GL,SbrBY;EasBZ,YbhEU;EaiEV,eZ/EY;;AYiFZ;EACI;;;AAIR;EACI;EACA;EACA,KbjCY;EakCZ;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,WbIc;EaHd,abQoB;EaPpB,Ob3FU;;;Aa+Fd;EACI;EACA;EACA;EACA,Yb9FW;Ea+FX,eb1Ca;Ea2Cb;;;AAGJ;EACI;EACA;EACA;EACA,YZ7IM;EY8IN,ebnDa;EaoDb;;;AAGJ;EACI;EACA;EACA;EACA;EACA,YbzJO;Ea0JP;EACA;EACA;EACA;EACA,Yb3DW;Ea4DX;;AAEA;EACI,Yb9DO;;AaiEX;EACI;;AAGJ;EACI;;AAGJ;EACI;;;AAKR;EACI;EACA;EACA,KbvGY;EawGZ;EACA,WbzDc;Ea0Dd;EACA,ObzJU;;;Aa4Jd;EACI,OZ3LQ;;;AY+LZ;EACI,SZ5MK;EY6ML,Yb9JU;Ea+JV,eZ7KY;;;AYgLhB;EACI;EACA;EACA,Kb3HY;Ea4HZ,eZrNK;;;AYwNT;EACI;EACA;EACA;;;AAGJ;EACI,WbtFc;EauFd,ablFoB;EamFpB,ObrLU;;;AawLd;EACI;EACA;EACA,Kb/IY;;;AakJhB;EXoBI;EACA;EACA,KFxKY;EEyKZ;EACA,WF1Hc;EE2Hd,aFrHoB;EEsHpB,YF/NU;EEgOV,OF3NU;EE4NV,eFhKa;;AEkKb;EAhOA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAuNJ;EAjQA;EACA;EACA;EAkQI;EACA;EACA;EACA,ODlQI;ECmQJ;;AAEA;EACI;EACA,ODrQH;;AY4NT;EAEI;;AAEA;EACI,YbhOW;EaiOX,OZrOE;;;AY0OV;EACI;EACA;EACA,Kb/JY;EagKZ;EACA,Yb5NY;Ea6NZ,eZ1NY;EY2NZ,WbpHc;EaqHd,OZ7OG;;AY+OH;EACI,WbvHU;;Aa0Hd;EACI;EACA,abtHkB;;;Aa2H1B;EACI;EACA;EACA,KbrLY;EasLZ,SZ9QK;EY+QL,YbhOU;EaiOV,eZ/OY;EYgPZ,WbxIc;EayId,ObxOU;;Aa0OV;EACI;EACA;EACA,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hB,Of7EI;;AegFR;AAAA;EACI;EACA,OhB3CO;;AgB+CX;AAAA;Ed1DA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AciDJ;AAAA;EAEI;EACA;EACA;EACA;EACA,WhBgCU;EgB/BV,Of9FE;Ee+FF;EACA;EACA,ef1EW;Ee2EX;;AAEA;AAAA;EACI,YhBjGO;;AgBqGf;AAAA;Ed5EA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AcmEJ;AAAA;EAEI;EACA;EACA;EACA;EACA,WhBcU;EgBbV,Of7GC;Ee8GD;;AAEA;AAAA;EACI;;AAQR;AAAA;EACI;EACA;EACA;EACA,YhBlIG;EgBmIH;EACA,ef3GW;Ee4GX;;AAEA;AAAA;EACI,cftIF;;Ae0IN;AAAA;EACI;EACA;EACA;EACA;EACA,YhB1GO;EgB2GP;EACA,ahBbkB;EgBclB,WhBrBU;EgBsBV,OhBvGO;;AgByGP;AAAA;EACI,YhBtGC;EgBuGD,qBhBrGE;;AgByGV;AAAA;EACI;EACA;EACA;EACA;;AAGJ;AAAA;EACI;EACA;EACA;EACA;EACA,YflJO;EemJP,ehB7ES;EgB8ET;EACA,ahBtCkB;EgBuClB;EACA;EACA,Of5KI;;Ae8KJ;AAAA;EACI,YfhLF;EeiLE,OhBnLD;;AgBwLP;AAAA;EACI;EACA;EACA;EACA;EACA,YhBvJM;EgBwJN;;AAGJ;AAAA;EdlKA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AcyJJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA,YhBzMG;EgB0MH;EACA,eflLW;EemLX,OfzMI;Ee0MJ;EACA,WhB/EU;EgBgFV;;AAEA;AAAA;EACI,YhB3KG;EgB4KH,chBzKG;EgB0KH,OhBtKG;;AgB0KX;AAAA;EACI;EACA;EACA;EACA;EACA,efpMW;EeqMX;EACA;;AAEA;AAAA;EACI,cfhOF;;AemOF;AAAA;EACI,OhB5LG;;AgBiMX;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;;AdtHJ;AAAA;EACI;EACA;;AAGJ;AAAA;EACI,YDzHA;E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","file":"entity-selector.css","sourcesContent":["/**\n * Entity Selector Styles\n * @package prestashop-entity-selector\n * @version 2.0.0\n *\n * Compiles to: assets/css/admin/entity-selector.css\n */\n\n// Foundation\n@use 'variables' as *;\n@use 'mixins' as *;\n\n// Layouts\n@use 'layouts/form-integration';\n@use 'layouts/responsive';\n\n// Components\n@use 'components/entity-selector';\n@use 'components/entity-item'; // Shared base for chips and list items\n@use 'components/dropdown';\n@use 'components/chips';\n@use 'components/groups';\n@use 'components/value-picker';\n@use 'components/modal';\n@use 'components/list-preview';\n@use 'components/schedule';\n@use 'components/tips';\n@use 'components/condition-trait';\n@use 'components/combinations';\n@use 'components/method-dropdown';\n@use 'components/tooltip';\n@use 'components/tree';\n@use 'components/validation';\n","/**\n * Entity Selector Variables\n * Bootstrap 4 compatible values for PrestaShop admin theme\n *\n * Imports shared variables from prestashop-admin package\n * and maps them to $es-* prefixed aliases for this package\n */\n\n// Import shared variables from prestashop-admin\n@use '../../../prestashop-admin/assets/scss/variables' as admin;\n\n// =============================================================================\n// Base Colors\n// =============================================================================\n\n$es-white: #ffffff !default;\n$es-black: #000000 !default;\n\n// Primary (from prestashop-admin)\n$es-primary: admin.$primary !default;\n$es-primary-hover: #1a9ab7 !default;\n$es-primary-light: rgba(37, 185, 215, 0.1) !default;\n\n// Semantic colors (from prestashop-admin)\n$es-success: admin.$success !default;\n$es-success-light: #d4edda !default;\n$es-success-dark: #1e7e34 !default;\n\n$es-danger: admin.$danger !default;\n$es-danger-light: #f8d7da !default;\n$es-danger-dark: #bd2130 !default;\n\n$es-warning: admin.$warning !default;\n$es-warning-light: #fff3cd !default;\n\n$es-info: admin.$info !default;\n$es-info-light: #d1ecf1 !default;\n\n// =============================================================================\n// Gray Scale (Bootstrap 4)\n// =============================================================================\n\n$es-gray-100: admin.$light !default;\n$es-gray-200: #e9ecef !default;\n$es-gray-300: admin.$border-color !default;\n$es-gray-400: #ced4da !default;\n$es-gray-500: #adb5bd !default;\n$es-gray-600: admin.$secondary !default;\n$es-gray-700: #495057 !default;\n$es-gray-800: admin.$dark !default;\n$es-gray-900: #212529 !default;\n\n// Slate (subtle variations)\n$es-slate-50: #f8fafc !default;\n$es-slate-100: #f1f5f9 !default;\n$es-slate-200: #e2e8f0 !default;\n$es-slate-300: #cbd5e1 !default;\n$es-slate-400: #94a3b8 !default;\n$es-slate-500: #64748b !default;\n$es-slate-600: #475569 !default;\n$es-slate-700: #334155 !default;\n$es-slate-800: #1e293b !default;\n$es-slate-900: #0f172a !default;\n\n// Cyan\n$es-cyan-50: #ecfeff !default;\n$es-cyan-100: #cffafe !default;\n$es-cyan-200: #a5f3fc !default;\n$es-cyan-500: #06b6d4 !default;\n$es-cyan-600: #0891b2 !default;\n$es-cyan-700: #0e7490 !default;\n\n// =============================================================================\n// Semantic Aliases\n// =============================================================================\n\n$es-bg-header: $es-gray-100 !default;\n$es-bg-hover: $es-gray-200 !default;\n$es-bg-active: $es-gray-200 !default;\n$es-bg-body: $es-white !default;\n\n$es-border-color: admin.$border-color !default;\n$es-border-light: $es-gray-200 !default;\n$es-border-dark: $es-gray-400 !default;\n\n$es-text-primary: $es-gray-900 !default;\n$es-text-secondary: $es-gray-700 !default;\n$es-text-muted: $es-gray-600 !default;\n$es-text-light: $es-gray-500 !default;\n\n// =============================================================================\n// Spacing (Bootstrap 4 compatible, derived from admin.$spacer)\n// =============================================================================\n\n$es-spacing-xs: admin.$spacer * 0.25 !default; // 4px\n$es-spacing-sm: admin.$spacer * 0.5 !default; // 8px\n$es-spacing-md: admin.$spacer !default; // 16px\n$es-spacing-lg: admin.$spacer * 1.5 !default; // 24px\n$es-spacing-xl: admin.$spacer * 2 !default; // 32px\n\n// =============================================================================\n// Border Radius (from prestashop-admin)\n// =============================================================================\n\n$es-radius-sm: admin.$border-radius-sm !default;\n$es-radius-md: admin.$border-radius !default;\n$es-radius-lg: admin.$border-radius-lg !default;\n$es-radius-xl: 0.5rem !default;\n$es-radius-full: 50rem !default;\n\n// =============================================================================\n// Box Shadows (Bootstrap 4 compatible)\n// =============================================================================\n\n$es-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !default;\n$es-shadow-md: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !default;\n$es-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175) !default;\n$es-shadow-xl: 0 1.5rem 4rem rgba(0, 0, 0, 0.2) !default;\n\n// =============================================================================\n// Transitions\n// =============================================================================\n\n$es-transition-fast: 0.15s ease-in-out !default;\n$es-transition-normal: 0.2s ease-in-out !default;\n$es-transition-slow: 0.3s ease-in-out !default;\n\n// =============================================================================\n// Z-Index (below Bootstrap modal)\n// =============================================================================\n\n$es-z-dropdown: 1000 !default;\n$es-z-modal: 1050 !default;\n$es-z-popover: 1060 !default;\n$es-z-tooltip: 1070 !default;\n\n// =============================================================================\n// Typography\n// =============================================================================\n\n$es-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif !default;\n\n$es-font-size-xs: 0.75rem !default; // 12px\n$es-font-size-sm: 0.875rem !default; // 14px\n$es-font-size-base: 1rem !default; // 16px\n$es-font-size-lg: 1.125rem !default; // 18px\n\n$es-font-weight-normal: 400 !default;\n$es-font-weight-medium: 500 !default;\n$es-font-weight-semibold: 600 !default;\n$es-font-weight-bold: 700 !default;\n\n$es-line-height-tight: 1.25 !default;\n$es-line-height-normal: 1.5 !default;\n","/**\n * MPR Admin Variables\n * @package prestashop-admin\n */\n\n// Spacing scale (Bootstrap 4 compatible)\n$spacer: 1rem;\n$spacers: (\n 0: 0,\n 1: $spacer * 0.25,\n 2: $spacer * 0.5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3\n);\n\n// Colors - PrestaShop Admin Theme\n$primary: #25b9d7;\n$secondary: #6c757d;\n$success: #28a745;\n$danger: #dc3545;\n$warning: #ffc107;\n$info: #17a2b8;\n$light: #f8f9fa;\n$dark: #343a40;\n\n$colors: (\n primary: $primary,\n secondary: $secondary,\n success: $success,\n danger: $danger,\n warning: $warning,\n info: $info,\n light: $light,\n dark: $dark\n);\n\n// Border\n$border-color: #dee2e6;\n$border-radius: 0.25rem;\n$border-radius-sm: 0.2rem;\n$border-radius-lg: 0.3rem;\n\n// Breakpoints\n$breakpoint-sm: 576px;\n$breakpoint-md: 768px;\n$breakpoint-lg: 991px;\n$breakpoint-xl: 1200px;\n","/**\n * Entity Selector Mixins\n * Reusable patterns - prefer Bootstrap utilities in HTML where possible\n */\n\n@use \"sass:color\";\n@use 'variables' as *;\n\n// =============================================================================\n// Layout\n// =============================================================================\n\n@mixin flex-center {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n@mixin flex-between {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n@mixin grid-columns($cols) {\n display: grid;\n grid-template-columns: repeat($cols, 1fr);\n gap: $es-spacing-sm;\n}\n\n// =============================================================================\n// Text\n// =============================================================================\n\n@mixin text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n// =============================================================================\n// Interactive Elements\n// =============================================================================\n\n// Reset button styles\n@mixin button-reset {\n padding: 0;\n margin: 0;\n background: none;\n border: none;\n cursor: pointer;\n font: inherit;\n color: inherit;\n\n &:focus {\n outline: none;\n }\n}\n\n// Focus ring (Bootstrap 4 style)\n@mixin focus-ring($color: $es-primary) {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba($color, 0.25);\n}\n\n// Interactive hover state\n@mixin interactive-item {\n cursor: pointer;\n transition: background-color $es-transition-fast, color $es-transition-fast;\n\n &:hover {\n background-color: $es-bg-hover;\n }\n}\n\n// =============================================================================\n// Cards & Containers\n// =============================================================================\n\n@mixin card {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n}\n\n@mixin dropdown-container {\n position: absolute;\n z-index: $es-z-dropdown;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-lg;\n}\n\n// =============================================================================\n// Form Elements\n// =============================================================================\n\n// Reset input styles (for inputs in custom wrappers)\n@mixin input-reset {\n padding: 0;\n margin: 0;\n background: none;\n border: none;\n font: inherit;\n color: inherit;\n\n &:focus {\n outline: none;\n }\n}\n\n@mixin input-base {\n width: 100%;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n line-height: $es-line-height-normal;\n color: $es-text-primary;\n background-color: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n transition: border-color $es-transition-fast, box-shadow $es-transition-fast;\n\n &:focus {\n border-color: $es-primary;\n @include focus-ring($es-primary);\n }\n\n &::placeholder {\n color: $es-text-light;\n }\n}\n\n// =============================================================================\n// Scrollbar\n// =============================================================================\n\n@mixin custom-scrollbar {\n &::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n\n &::-webkit-scrollbar-track {\n background: $es-gray-100;\n border-radius: 3px;\n }\n\n &::-webkit-scrollbar-thumb {\n background: $es-gray-300;\n border-radius: 3px;\n\n &:hover {\n background: $es-gray-400;\n }\n }\n}\n\n// =============================================================================\n// Badges & Chips\n// =============================================================================\n\n@mixin badge($bg: $es-gray-200, $color: $es-gray-700) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.125rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n line-height: 1;\n background-color: $bg;\n color: $color;\n border-radius: $es-radius-full;\n}\n\n// Count badge with preview icon (used for tab badges, match counts, totals)\n// Note: Eye icon is provided in HTML via \n@mixin count-badge($bg: $es-primary) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.25rem;\n min-width: 20px;\n height: 20px;\n padding: 0 0.5rem;\n background: $bg;\n color: $es-white;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-full;\n cursor: pointer;\n transition: all $es-transition-fast;\n flex-shrink: 0;\n\n &:hover {\n transform: scale(1.05);\n box-shadow: 0 2px 8px rgba($bg, 0.4);\n }\n\n // Focus state - maintain styled appearance\n &:focus {\n outline: none;\n box-shadow: 0 0 0 2px rgba($bg, 0.3), 0 2px 8px rgba($bg, 0.4);\n }\n\n // Loading state - spinner icon replaces eye\n &.loading {\n cursor: wait;\n\n i {\n font-size: 10px;\n animation: spin 0.6s linear infinite;\n }\n\n &:hover {\n transform: none;\n box-shadow: none;\n }\n }\n\n // Inactive/empty state\n &.inactive,\n &.no-matches {\n background: $es-slate-400;\n cursor: default;\n\n &:hover {\n transform: none;\n box-shadow: none;\n }\n }\n\n // Popover open state\n &.popover-open {\n background: color.adjust($bg, $lightness: -10%);\n box-shadow: 0 2px 8px rgba($bg, 0.4);\n }\n\n // Icon inside badge (eye, spinner, etc.)\n i {\n font-size: 10px;\n line-height: 1;\n opacity: 0.8;\n }\n\n &:hover i {\n opacity: 1;\n }\n\n .preview-count {\n font-weight: $es-font-weight-bold;\n }\n}\n\n@keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n@mixin chip {\n display: inline-flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n background: $es-gray-200;\n color: $es-gray-700;\n border-radius: $es-radius-full;\n\n .chip-remove {\n @include button-reset;\n @include flex-center;\n width: 14px;\n height: 14px;\n font-size: 10px;\n color: $es-text-muted;\n border-radius: 50%;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n }\n}\n\n// =============================================================================\n// Toggle Switch\n// =============================================================================\n\n@mixin toggle-switch($width: 36px, $height: 20px) {\n position: relative;\n width: $width;\n height: $height;\n border-radius: $height;\n background: $es-gray-400;\n transition: background-color $es-transition-normal;\n cursor: pointer;\n\n &::after {\n content: '';\n position: absolute;\n top: 2px;\n left: 2px;\n width: $height - 4px;\n height: $height - 4px;\n background: $es-white;\n border-radius: 50%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n transition: transform $es-transition-normal;\n }\n\n &.active {\n background: $es-success;\n\n &::after {\n transform: translateX($width - $height);\n }\n }\n}\n\n// =============================================================================\n// Screen Reader Only\n// =============================================================================\n\n@mixin sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n","/**\n * Form Integration Styles\n * Handles PrestaShop admin form layout overrides\n */\n\n@use '../variables' as *;\n\n// Base border reset for all entity-selector elements\n.target-conditions-trait,\n.target-conditions-trait *,\n.entity-selector-trait,\n.entity-selector-trait *,\n.method-dropdown-menu,\n.method-dropdown-menu *,\n.target-preview-popover,\n.target-preview-popover * {\n border-style: solid;\n border-width: 0;\n border-color: $es-border-color;\n}\n\n// Full-width form group override using :has()\n// Excludes .layout-form-group which uses standard PrestaShop form layout\n.form-group:has(.entity-selector-trait:not(.layout-form-group)),\n.form-group:has(.target-conditions-trait:not(.layout-form-group)),\n.form-group:has(.condition-trait:not(.layout-form-group)) {\n display: block;\n\n > .control-label {\n display: none;\n }\n\n > .col-lg-8 {\n width: 100%;\n max-width: 100%;\n padding-left: $es-spacing-md;\n padding-right: $es-spacing-md;\n flex: 0 0 100% !important;\n }\n}\n\n// Fallback class for browsers without :has() support\n.form-group.condition-trait-fullwidth {\n display: block;\n\n > .control-label {\n display: none;\n }\n\n > .col-lg-8 {\n width: 100%;\n max-width: 100%;\n padding-left: $es-spacing-md;\n padding-right: $es-spacing-md;\n flex: 0 0 100% !important;\n }\n}\n\n// SAFEGUARD: Force label visibility for form-group layout widgets\n// This overrides any conflicting rules (including fallback class rules)\n// when the widget has layout-form-group class indicating standard form integration\n.form-group:has(.layout-form-group) > .control-label {\n display: flex !important;\n}\n\n// Dropdown overflow fix\n// When dropdown is open, parent containers must allow overflow\n.panel:has(.target-search-dropdown.show),\n.card:has(.target-search-dropdown.show),\n.form-wrapper:has(.target-search-dropdown.show),\n.panel-body:has(.target-search-dropdown.show),\n.card-body:has(.target-search-dropdown.show),\n.form-group:has(.target-search-dropdown.show),\n.col-lg-8:has(.target-search-dropdown.show),\n.col-lg-12:has(.target-search-dropdown.show) {\n overflow: visible !important;\n}\n\n// Target conditions wrapper hierarchy overflow fix\n.target-conditions-trait:has(.target-search-dropdown.show),\n.entity-selector-trait:has(.target-search-dropdown.show),\n.condition-trait-body:has(.target-search-dropdown.show),\n.target-block-content:has(.target-search-dropdown.show),\n.target-block-groups:has(.target-search-dropdown.show),\n.target-group:has(.target-search-dropdown.show),\n.target-group-body:has(.target-search-dropdown.show),\n.target-search-wrapper:has(.target-search-dropdown.show) {\n overflow: visible !important;\n}\n\n// =============================================================================\n// Embedded Layout\n// =============================================================================\n// Use .layout-embedded for entity selectors nested inside other components\n// Removes outer wrapper styling to avoid redundant borders/backgrounds\n\n.target-conditions-trait.layout-embedded,\n.entity-selector-trait.layout-embedded {\n background: transparent;\n border: none;\n border-radius: 0;\n\n // Remove padding from groups container when embedded\n .groups-container {\n padding: 0;\n }\n\n // Remove block body padding\n .block-body {\n padding: 0;\n }\n\n // Remove block footer border when embedded\n .block-footer {\n border-top: none;\n padding: $es-spacing-sm 0 0;\n }\n\n // Simplify selection group when embedded - single thin border only\n .selection-group {\n background: $es-white;\n border: 1px solid $es-slate-200;\n border-radius: $es-radius-md;\n\n // Lighter group header in embedded mode\n .group-header {\n background: $es-slate-50;\n border-bottom-color: $es-slate-200;\n padding: $es-spacing-xs $es-spacing-sm;\n border-radius: $es-radius-md $es-radius-md 0 0;\n }\n\n // Reduce group body padding (slightly more than $es-spacing-sm for readability)\n .group-body {\n padding: 0.75rem;\n }\n\n // Reduce group-include section padding\n .group-include {\n padding: $es-spacing-xs;\n margin-bottom: $es-spacing-sm;\n }\n\n // Smaller modifiers section\n .group-modifiers {\n padding: $es-spacing-xs $es-spacing-sm;\n margin: $es-spacing-sm (-$es-spacing-sm) (-$es-spacing-sm);\n }\n }\n\n // Empty state - smaller padding\n .groups-empty-state {\n padding: $es-spacing-md;\n }\n\n // Smaller add group button\n .btn-add-group {\n padding: 0.375rem 0.625rem;\n font-size: $es-font-size-xs;\n }\n}\n","/**\n * Responsive Styles\n * Media query adjustments for different screen sizes\n */\n\n@use '../variables' as *;\n\n// Tablet and below\n@media (max-width: 991px) {\n .target-conditions-trait,\n .entity-selector-trait {\n .condition-trait-header {\n flex-direction: column;\n align-items: flex-start;\n gap: $es-spacing-sm;\n }\n\n .trait-header-right {\n width: 100%;\n justify-content: flex-end;\n }\n\n .target-block-tabs {\n flex-wrap: wrap;\n }\n }\n}\n\n// Mobile\n@media (max-width: 767px) {\n .target-conditions-trait,\n .entity-selector-trait {\n .target-block-tab {\n padding: $es-spacing-sm;\n font-size: $es-font-size-xs;\n }\n\n .target-group-header {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .target-search-dropdown {\n width: 100% !important;\n left: 0 !important;\n right: 0 !important;\n }\n\n .dropdown-results-grid {\n grid-template-columns: 1fr !important;\n }\n }\n}\n\n// High-resolution displays\n@media (min-width: 1600px) {\n .target-conditions-trait,\n .entity-selector-trait {\n .dropdown-results-grid.view-grid-3 {\n grid-template-columns: repeat(4, 1fr);\n }\n }\n}\n","/**\n * Entity Selector - Main Component Styles\n * Wrapper, header, body, tabs, blocks\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Main wrapper (supports both .target-conditions-trait and .entity-selector-trait)\n.target-conditions-trait,\n.entity-selector-trait {\n position: relative;\n overflow: visible;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n\n // Trait Header (collapsible)\n .condition-trait-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n padding: 0.875rem $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n }\n\n .trait-header-left {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n min-width: 0;\n flex: 1;\n }\n\n .trait-icon {\n font-size: $es-font-size-lg;\n color: $es-text-muted;\n flex-shrink: 0;\n }\n\n .trait-title-group {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n }\n\n .trait-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n white-space: nowrap;\n }\n\n .trait-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n // Total count badge in header\n .trait-total-count {\n @include count-badge($es-primary);\n margin-left: $es-spacing-sm;\n }\n\n // Show all toggle switch\n .trait-show-all-toggle {\n display: inline-flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-right: 0.75rem;\n padding: 0.25rem $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .toggle-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n }\n\n .show-all-checkbox {\n display: none;\n }\n\n .toggle-slider {\n position: relative;\n width: 36px;\n height: 20px;\n background: $es-slate-300;\n border-radius: $es-radius-full;\n transition: background-color $es-transition-normal;\n\n &::after {\n content: '';\n position: absolute;\n top: 2px;\n left: 2px;\n width: 16px;\n height: 16px;\n background: $es-white;\n border-radius: 50%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n transition: transform $es-transition-normal;\n }\n }\n\n .show-all-checkbox:checked + .toggle-slider {\n background: $es-success;\n\n &::after {\n transform: translateX(16px);\n }\n }\n }\n\n // Validation error states\n &.has-validation-error {\n border-color: $es-danger;\n box-shadow: 0 0 0 3px rgba($es-danger, 0.1);\n\n .condition-trait-header {\n border-bottom-color: $es-danger;\n }\n }\n\n .trait-validation-error {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: 0.625rem $es-spacing-md;\n background: $es-danger-light;\n color: #b91c1c;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n border-bottom: 1px solid #fecaca;\n\n i {\n color: $es-danger;\n }\n }\n\n // Required indicator\n &.trait-required .trait-title::after {\n content: ' *';\n color: $es-danger;\n }\n\n // Body\n .condition-trait-body {\n padding: 0;\n background: $es-white;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n // Block type tabs\n .target-block-tabs {\n display: flex;\n flex-wrap: wrap;\n gap: 0;\n padding: 0;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n }\n\n .target-block-tab {\n position: relative;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex: none;\n min-width: 0;\n padding: 0.625rem $es-spacing-md;\n margin-bottom: -1px;\n background: transparent;\n border: 0;\n border-bottom: 2px solid transparent;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-slate-700;\n }\n\n &.active {\n background: $es-white;\n border-bottom-color: $es-cyan-500;\n color: $es-primary;\n }\n\n i {\n font-size: $es-font-size-sm;\n }\n\n .tab-label {\n white-space: nowrap;\n }\n\n .tab-badge {\n @include count-badge($es-primary);\n }\n\n &.has-data:not(.active) .tab-badge {\n @include count-badge($es-slate-400);\n }\n }\n\n // Tabs row with actions (form-content layout)\n .entity-selector-tabs-row {\n display: flex;\n align-items: stretch;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n\n .target-block-tabs {\n flex: 1;\n border-bottom: 0;\n border-radius: $es-radius-lg 0 0 0;\n }\n }\n\n // Expand/collapse toggle area (entire section is clickable)\n .entity-selector-actions.btn-toggle-blocks {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 $es-spacing-md;\n background: $es-slate-100;\n border-left: 1px solid $es-border-color;\n color: $es-slate-400;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-primary;\n }\n\n .material-icons {\n font-size: 20px !important;\n }\n }\n\n // When expanded - highlight the toggle area\n .entity-selector-trait:not(.blocks-collapsed) .entity-selector-actions.btn-toggle-blocks {\n background: $es-primary-light;\n border-left-color: $es-primary;\n color: $es-primary;\n }\n\n // Blocks content wrapper (for form-content layout collapse)\n .entity-selector-blocks-content {\n // Inherits styles from condition-trait-body context\n }\n\n // Block container\n .target-block-container {\n display: none;\n\n &.active {\n display: block;\n }\n }\n\n .target-block-content {\n padding: $es-spacing-md;\n }\n\n .target-block-groups {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-md;\n }\n\n // Block header (for standalone blocks)\n .target-block-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n }\n\n // Empty state\n .target-block-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n }\n\n // Collapse toggle\n .trait-collapse-toggle,\n .collapse-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n cursor: pointer;\n transition: transform $es-transition-normal;\n\n &.collapsed {\n transform: rotate(-90deg);\n }\n }\n\n // Header actions\n .trait-header-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n // Collapsed state\n &.collapsed {\n .condition-trait-body {\n display: none;\n }\n\n .condition-trait-header {\n border-radius: $es-radius-lg;\n }\n }\n}\n\n// Single mode specific styles\n.target-conditions-trait.single-mode,\n.entity-selector-trait.single-mode {\n .target-block-tabs {\n display: none;\n }\n\n .target-block-container {\n display: block;\n }\n}\n\n// Header action buttons\n.target-conditions-trait,\n.entity-selector-trait {\n .header-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .header-action-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n background: transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n","/**\n * Entity Item - Shared Base Component\n * Unified styling for entity items in chips, lists, and previews\n *\n * Variants:\n * - .entity-item (base) - default list-row style\n * - .entity-item.chip-style - pill/chip style (compact)\n * - .entity-item.card-style - card/grid style\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// =============================================================================\n// Entity Item Sizing\n// =============================================================================\n\n$entity-item-image-sm: 20px;\n$entity-item-image-md: 32px;\n$entity-item-image-lg: 48px;\n\n// =============================================================================\n// Base Entity Item (list-row layout)\n// =============================================================================\n\n.entity-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-white;\n border-radius: $es-radius-sm;\n transition: background $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n // Clickable variant\n &.clickable {\n cursor: pointer;\n }\n\n // Selected state\n &.selected {\n background: $es-primary-light;\n }\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Image\n// -----------------------------------------------------------------------------\n\n.entity-item-image {\n flex-shrink: 0;\n width: $entity-item-image-md;\n height: $entity-item-image-md;\n object-fit: cover;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n}\n\n// Size variants\n.entity-item-image--sm {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n border-radius: 50%;\n}\n\n.entity-item-image--lg {\n width: $entity-item-image-lg;\n height: $entity-item-image-lg;\n}\n\n// No-image placeholder\n.entity-item-no-image {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: $entity-item-image-md;\n height: $entity-item-image-md;\n background: $es-slate-100;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n font-size: $es-font-size-sm;\n\n &--sm {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n font-size: 10px;\n border-radius: 50%;\n }\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Info (name + meta)\n// -----------------------------------------------------------------------------\n\n.entity-item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n}\n\n.entity-item-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n}\n\n.entity-item-meta {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n @include text-truncate;\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Badge/Price (right side)\n// -----------------------------------------------------------------------------\n\n.entity-item-badge {\n flex-shrink: 0;\n padding: 0.125rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n background: $es-slate-100;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n}\n\n.entity-item-price {\n flex-shrink: 0;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Actions (remove button, etc.)\n// -----------------------------------------------------------------------------\n\n.entity-item-action {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: 50%;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n}\n\n// =============================================================================\n// Chip Style Variant (compact pill)\n// =============================================================================\n\n.entity-item.chip-style {\n display: inline-flex;\n gap: 0.375rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-100;\n border-radius: $es-radius-full;\n\n &:hover {\n background: $es-slate-200;\n }\n\n .entity-item-image {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n border-radius: 50%;\n }\n\n .entity-item-no-image {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n font-size: 10px;\n border-radius: 50%;\n }\n\n .entity-item-info {\n flex-direction: row;\n align-items: center;\n gap: 0.25rem;\n }\n\n .entity-item-name {\n font-size: $es-font-size-xs;\n }\n\n .entity-item-meta {\n display: none;\n }\n\n .entity-item-action {\n width: 16px;\n height: 16px;\n margin-left: 0.125rem;\n }\n}\n\n// =============================================================================\n// List Style Variant (bordered rows)\n// =============================================================================\n\n.entity-item.list-style {\n padding: $es-spacing-sm 0;\n background: transparent;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n}\n\n// =============================================================================\n// Entity Item Container (wrapper for multiple items)\n// =============================================================================\n\n.entity-items-container {\n display: flex;\n flex-direction: column;\n background: $es-slate-50;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n overflow: hidden;\n}\n\n// Toolbar (filter, sort, count, clear)\n.entity-items-toolbar {\n display: none;\n align-items: center;\n flex-wrap: nowrap;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n padding-bottom: 0;\n background: transparent;\n\n &.has-items {\n display: flex;\n }\n}\n\n// Filter input\n.entity-items-filter {\n all: unset;\n display: block;\n flex: 1 1 auto;\n min-width: 80px;\n width: auto;\n height: auto;\n padding: 0.2rem 0.5rem 0.2rem 1.5rem;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E\") no-repeat 0.375rem center;\n background-size: 10px;\n border: 1px solid $es-slate-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n line-height: 1.4;\n color: $es-text-primary;\n box-sizing: border-box;\n transition: all $es-transition-fast;\n\n &::placeholder {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n}\n\n// Sort dropdown\n.entity-items-sort {\n all: unset;\n flex: 0 0 auto;\n padding: 0.2rem 1.25rem 0.2rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.375rem center;\n background-size: 8px;\n font-size: 10px;\n line-height: 1.4;\n color: $es-text-secondary;\n cursor: pointer;\n box-sizing: border-box;\n white-space: nowrap;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n}\n\n// Count badge\n.entity-items-count {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n gap: 0.125rem;\n padding: 0.2rem 0.5rem;\n background: $es-slate-200;\n color: $es-text-secondary;\n font-size: 10px;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-sm;\n white-space: nowrap;\n line-height: 1.4;\n\n &.has-filter {\n background: $es-cyan-100;\n color: $es-cyan-700;\n }\n}\n\n// Clear button\n.entity-items-clear {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n gap: 0.25rem;\n padding: 0.2rem 0.5rem;\n color: $es-danger;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n background: rgba($es-danger, 0.1);\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n white-space: nowrap;\n line-height: 1.4;\n\n &:hover {\n background: $es-danger;\n color: $es-white;\n }\n\n i {\n font-size: 9px;\n flex-shrink: 0;\n }\n}\n\n// Items list area\n.entity-items-list {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md $es-spacing-md;\n min-height: 40px;\n max-height: 300px;\n overflow-y: auto;\n @include custom-scrollbar;\n\n &:empty {\n display: none;\n }\n\n // List layout (vertical)\n &.list-layout {\n flex-direction: column;\n flex-wrap: nowrap;\n gap: 0;\n padding: $es-spacing-sm;\n }\n}\n\n// Load more section\n.entity-items-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: transparent;\n border-top: 1px dashed $es-border-color;\n\n .load-more-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .load-more-select {\n appearance: none;\n padding: 0.25rem 1.75rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.5rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n cursor: pointer;\n transition: all $es-transition-fast;\n height: auto;\n min-height: 0;\n line-height: 1.3;\n\n &:hover {\n border-color: $es-primary;\n background-color: $es-primary-light;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n .load-more-remaining {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .remaining-count {\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n }\n\n .btn-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xs;\n margin: 0;\n border: none;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n font: inherit;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n\n &.loading {\n cursor: wait;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n }\n}\n\n// =============================================================================\n// Empty & Loading States\n// =============================================================================\n\n.entity-items-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n}\n\n.entity-items-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n\n i {\n font-size: 20px;\n animation: spin 0.6s linear infinite;\n }\n}\n","/**\n * Search Dropdown Component\n * Includes search input, filter panel, results grid\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Search wrapper\n .target-search-wrapper {\n position: relative;\n }\n\n // Search dropdown\n .target-search-dropdown {\n @include dropdown-container;\n display: none;\n width: 600px;\n max-width: calc(100vw - 40px);\n\n &.show {\n display: block;\n }\n }\n\n // Dropdown header\n .dropdown-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n }\n\n .dropdown-search-input {\n @include input-base;\n flex: 1;\n padding: $es-spacing-sm $es-spacing-md;\n }\n\n .dropdown-close-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n }\n\n // Dropdown controls bar\n .dropdown-controls {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border-bottom: 1px solid $es-border-color;\n }\n\n .dropdown-controls-left,\n .dropdown-controls-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n // View mode buttons\n .view-mode-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n background: transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-secondary;\n }\n\n &.active {\n background: $es-primary;\n color: $es-white;\n }\n }\n\n // Results count\n .dropdown-results-count {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n // Dropdown body\n .dropdown-body {\n max-height: 400px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n // Results container\n .dropdown-results {\n padding: 0 $es-spacing-sm;\n }\n\n // Results count text\n .results-count {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n padding: $es-spacing-xs $es-spacing-sm;\n }\n\n // Results header (for list view columns)\n .results-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-md;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n\n // Grid view\n .dropdown-results-grid {\n display: grid;\n gap: $es-spacing-sm;\n\n &.view-list {\n grid-template-columns: 1fr;\n }\n\n &.view-grid-2 {\n grid-template-columns: repeat(2, 1fr);\n }\n\n &.view-grid-3 {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n // Result item (both class names for compatibility)\n // Note: Main dropdown-item styling is in the global .target-search-dropdown section below\n .dropdown-result-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm 0;\n background: $es-white;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n cursor: pointer;\n transition: background $es-transition-fast;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n }\n\n &.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n\n &:hover {\n background: $es-white;\n }\n }\n }\n\n .result-item-image,\n .result-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n overflow: hidden;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n &.result-flag {\n width: 32px;\n height: 24px;\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n background: transparent;\n\n img {\n object-fit: contain;\n }\n\n .flag-fallback {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: linear-gradient(135deg, #e8eaed 0%, #dadce0 100%);\n font-size: 14px;\n color: #5f6368;\n }\n }\n }\n\n .result-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n background: $es-slate-100;\n border-radius: $es-radius-sm;\n color: $es-text-muted;\n\n i {\n font-size: 16px;\n }\n }\n\n .result-item-info,\n .result-info {\n flex: 1;\n min-width: 0;\n }\n\n .result-item-name,\n .result-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .result-item-meta,\n .result-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .subtitle-line {\n @include text-truncate;\n }\n\n .subtitle-line-primary {\n color: $es-text-secondary;\n }\n\n .subtitle-line-secondary {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n // Result columns (for product list view)\n .result-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n font-size: $es-font-size-xs;\n }\n\n .result-col-price {\n color: $es-text-secondary;\n }\n\n .result-col-sale {\n color: $es-danger;\n font-weight: $es-font-weight-semibold;\n }\n\n .result-col-stock {\n .col-value {\n &.stock-ok {\n color: $es-success;\n }\n\n &.stock-low {\n color: $es-warning;\n }\n\n &.stock-out {\n color: $es-danger;\n }\n }\n }\n\n .result-col-sales {\n color: $es-text-muted;\n }\n\n .col-value {\n display: block;\n }\n\n .result-item-checkbox,\n .result-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n border: 2px solid $es-border-dark;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n i {\n display: none;\n font-size: 10px;\n color: $es-white;\n }\n\n .dropdown-result-item.selected &,\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n\n // Product-specific result item\n .result-item-product {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n // No results state\n .no-results {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: 1.25rem;\n opacity: 0.5;\n }\n }\n\n // Empty state\n .dropdown-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n }\n\n // Loading state\n .dropdown-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n\n i {\n font-size: 1.5rem;\n animation: spin 1s linear infinite;\n }\n }\n\n // Unified dropdown footer - combines load more and actions\n .dropdown-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n // Left side: load more controls\n .dropdown-footer-left {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-label {\n color: $es-text-muted;\n }\n\n .load-more-select,\n select.load-more-select {\n appearance: none;\n padding: 0.25rem 1.5rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.4rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n cursor: pointer;\n min-width: 55px;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n }\n }\n\n .remaining-text {\n color: $es-text-muted;\n\n strong {\n color: $es-text-secondary;\n font-weight: $es-font-weight-semibold;\n }\n }\n\n .btn-load-all {\n @include button-reset;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-primary;\n background: transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n }\n\n // Right side: action buttons\n .dropdown-footer-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .dropdown-action-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n .btn-shortcut {\n font-size: 10px;\n padding: 0.125rem 0.25rem;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 3px;\n font-weight: $es-font-weight-normal;\n }\n\n &.btn-cancel {\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-border-dark;\n }\n }\n\n &.btn-apply,\n &.btn-save {\n color: $es-white;\n background: $es-primary;\n border: 1px solid $es-primary;\n\n &:hover {\n background: $es-primary-hover;\n border-color: $es-primary-hover;\n }\n\n .btn-shortcut {\n background: rgba(255, 255, 255, 0.2);\n }\n }\n }\n\n // Legacy support - hide old load more section when new footer exists\n .dropdown-load-more {\n display: none;\n }\n\n .load-more-controls {\n display: none;\n }\n\n // Filter panel\n .dropdown-filter-panel {\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n }\n\n .filter-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: $es-spacing-sm;\n }\n\n .filter-panel-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .filter-panel-toggle {\n @include button-reset;\n font-size: $es-font-size-xs;\n color: $es-primary;\n\n &:hover {\n text-decoration: underline;\n }\n }\n\n .filter-panel-content {\n display: grid;\n gap: $es-spacing-sm;\n grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n }\n\n .filter-group {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .filter-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n }\n\n .filter-select,\n .filter-input {\n @include input-base;\n padding: 0.375rem $es-spacing-sm;\n font-size: $es-font-size-xs;\n }\n}\n\n// Category tree view\n.target-conditions-trait,\n.entity-selector-trait {\n .category-tree {\n padding: $es-spacing-sm;\n }\n\n .tree-container {\n // Contains tree items\n }\n\n .tree-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n // Tree item (used by JavaScript)\n .tree-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: 0.375rem $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .tree-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n\n &.has-children {\n // Parent node styling\n }\n }\n\n // tree-toggle, btn-select-children, tree-checkbox, tree-icon styles in _tree.scss\n\n .tree-info {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n flex: 1;\n min-width: 0;\n }\n\n .tree-name {\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .tree-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n // Legacy category tree classes (for compatibility)\n .category-tree-item {\n padding: 0.25rem 0;\n }\n\n .category-tree-node {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n }\n }\n\n .category-tree-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n color: $es-text-muted;\n transition: transform $es-transition-fast;\n\n &.expanded {\n transform: rotate(90deg);\n }\n\n &.empty {\n visibility: hidden;\n }\n }\n\n .category-tree-checkbox {\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n &.checked {\n background: $es-primary;\n border-color: $es-primary;\n\n &::after {\n content: '\\2713';\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n color: $es-white;\n font-size: 10px;\n }\n }\n\n &.indeterminate {\n background: $es-primary;\n border-color: $es-primary;\n\n &::after {\n content: '\\2212';\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n color: $es-white;\n font-size: 10px;\n }\n }\n }\n\n .category-tree-name {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .category-tree-count {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .category-tree-children {\n margin-left: 24px;\n }\n\n // Search history\n .search-history-list {\n padding: $es-spacing-sm;\n }\n\n .history-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n > i {\n color: $es-text-muted;\n font-size: 14px;\n }\n }\n\n .history-query {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n }\n\n .btn-delete-history {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n opacity: 0;\n transition: all $es-transition-fast;\n\n .history-item:hover & {\n opacity: 1;\n }\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Filter panel\n .filter-panel {\n display: none;\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n\n &.show {\n display: block;\n }\n }\n\n .filter-row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-sm;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // View mode select\n .view-mode-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 80px;\n }\n}\n\n// =============================================================================\n// Global dropdown styles (when appended to body instead of inside wrapper)\n// Duplicates key styles for when dropdown is outside .entity-selector-trait\n// =============================================================================\nbody > .target-search-dropdown,\n.target-search-dropdown {\n @include dropdown-container;\n display: none;\n width: 600px;\n max-width: calc(100vw - 40px);\n\n &.show {\n display: block;\n }\n\n // Dropdown header\n .dropdown-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n flex-wrap: wrap;\n }\n\n .results-count {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n white-space: nowrap;\n }\n\n .dropdown-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n flex-wrap: wrap;\n flex: 1;\n justify-content: flex-end;\n }\n\n .btn-select-all,\n .btn-clear-selection {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n border-color: $es-slate-300;\n }\n\n kbd {\n font-size: 0.65rem;\n padding: 0.125rem 0.25rem;\n background: $es-slate-100;\n border-radius: 2px;\n color: $es-text-muted;\n }\n }\n\n .sort-controls {\n display: flex;\n align-items: center;\n // No gap - elements are connected\n }\n\n .sort-field-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 80px;\n height: 28px; // Match btn-sort-dir height\n border-radius: $es-radius-sm 0 0 $es-radius-sm;\n border-right: none;\n }\n\n .btn-sort-dir {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 38px;\n min-width: 38px;\n flex-shrink: 0;\n height: 28px;\n padding: 0;\n margin: 0;\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n\n &.active {\n background: $es-primary-light;\n border-color: $es-primary;\n color: $es-primary;\n }\n }\n\n .view-mode-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 80px;\n margin-left: 0.25rem;\n }\n\n .btn-toggle-filters,\n .btn-show-history {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n min-width: 32px;\n flex-shrink: 0;\n height: 28px;\n padding: 0;\n margin: 0;\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n\n &.active {\n background: $es-primary-light;\n border-color: $es-primary;\n color: $es-primary;\n }\n }\n\n .refine-compact {\n display: flex;\n align-items: center;\n // No gap - elements are connected\n\n // Connected to refine-input\n .btn-refine-negate {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n min-width: 32px;\n flex-shrink: 0;\n height: 28px;\n padding: 0;\n margin: 0;\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-right: none;\n border-radius: $es-radius-sm 0 0 $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n\n &.active {\n background: $es-danger-light;\n color: $es-danger;\n border-color: $es-danger;\n }\n }\n\n .refine-input {\n @include input-base;\n width: 100px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n }\n\n .btn-clear-refine {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n margin: 0;\n margin-left: -1px; // Overlap input border when visible\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n }\n }\n\n // Filter panel\n .filter-panel {\n display: none;\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n\n &.show {\n display: block;\n }\n }\n\n .filter-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex-wrap: wrap;\n margin-bottom: $es-spacing-sm;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .filter-label {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n cursor: pointer;\n\n input[type=\"checkbox\"] {\n margin: 0;\n }\n }\n\n .filter-price-range {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n\n .filter-price-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .filter-price-min,\n .filter-price-max {\n @include input-base;\n width: 70px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n }\n\n .filter-price-sep {\n color: $es-text-muted;\n }\n }\n\n .btn-clear-filters {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n cursor: pointer;\n margin-left: auto;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n }\n\n // Multi-row filters\n .filter-row-multi {\n flex-direction: column;\n align-items: stretch;\n gap: $es-spacing-sm;\n }\n\n .filter-subrow {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex-wrap: wrap;\n }\n\n .filter-range-group,\n .filter-date-group,\n .filter-select-group {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n\n .filter-range-label,\n .filter-date-label,\n .filter-select-label,\n .filter-row-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n white-space: nowrap;\n\n i {\n margin-right: 0.25rem;\n }\n }\n\n .filter-range-sep {\n color: $es-text-muted;\n }\n\n .filter-product-count-min,\n .filter-product-count-max,\n .filter-sales-min,\n .filter-sales-max,\n .filter-turnover-min,\n .filter-turnover-max,\n .filter-date-add-from,\n .filter-date-add-to,\n .filter-last-product-from,\n .filter-last-product-to {\n @include input-base;\n width: 70px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n }\n\n .filter-depth-select,\n .filter-attribute-group-select,\n .filter-feature-group-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 100px;\n }\n\n .filter-attributes-container,\n .filter-features-container,\n .filter-values-container {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n }\n\n // Filter group toggle buttons (attribute/feature groups)\n .filter-group-toggle {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n border-color: $es-slate-300;\n }\n\n &.active {\n background: $es-primary-light;\n border-color: $es-primary;\n color: $es-primary;\n\n .toggle-count {\n color: $es-primary;\n }\n }\n\n &.has-selection {\n border-color: $es-success;\n background: rgba($es-success, 0.05);\n\n .toggle-count {\n color: $es-success;\n font-weight: $es-font-weight-semibold;\n }\n }\n\n .toggle-name {\n font-weight: $es-font-weight-medium;\n }\n\n // Count with eye icon (like group-count-badge)\n .toggle-count {\n display: inline-flex;\n align-items: center;\n gap: 0.125rem;\n color: $es-text-muted;\n font-size: 0.65rem;\n\n i {\n font-size: 10px;\n color: $es-primary;\n }\n\n // Clickable preview badge\n &.clickable {\n cursor: pointer;\n padding: 0.125rem 0.25rem;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.1);\n color: $es-primary;\n\n i {\n color: $es-primary;\n }\n }\n\n &.popover-open {\n background: $es-primary;\n color: $es-white;\n\n i {\n color: $es-white;\n }\n }\n\n &.loading {\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n }\n }\n }\n\n // Filter value chips\n .filter-chip {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n background: $es-slate-100;\n border: 1px solid transparent;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n &.active {\n background: $es-primary;\n color: $es-white;\n }\n }\n\n // Filter attribute chip (specific)\n .filter-attr-chip,\n .filter-feat-chip {\n @extend .filter-chip;\n }\n\n // Filter row for values (expandable)\n .filter-row-values {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n\n .filter-values-container {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.25rem;\n flex: 1;\n }\n\n .filter-values-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n white-space: nowrap;\n }\n\n .btn-close-values {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n }\n }\n\n // Filter chip name and count\n .chip-name {\n font-weight: $es-font-weight-medium;\n }\n\n .chip-count {\n font-size: 0.6rem;\n color: $es-text-muted;\n margin-left: 0.125rem;\n }\n\n .filter-chip.active .chip-count {\n color: rgba(255, 255, 255, 0.8);\n }\n\n // Dropdown content\n .dropdown-content {\n max-height: 400px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n .dropdown-items {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm;\n }\n\n .item-checkbox {\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n }\n }\n\n .item-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n object-fit: cover;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n }\n\n .item-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .item-meta {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n @include text-truncate;\n }\n\n // Dropdown footer - unified structure\n .dropdown-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n .dropdown-footer-left {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-label {\n color: $es-text-muted;\n }\n\n .load-more-select,\n select.load-more-select {\n appearance: none;\n padding: 0.25rem 1.5rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.4rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n cursor: pointer;\n min-width: 55px;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n }\n }\n\n .remaining-text {\n color: $es-text-muted;\n\n strong {\n color: $es-text-secondary;\n font-weight: $es-font-weight-semibold;\n }\n }\n }\n\n .dropdown-footer-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .dropdown-action-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n white-space: nowrap;\n\n .btn-shortcut {\n font-size: 10px;\n padding: 0.125rem 0.25rem;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 3px;\n font-weight: $es-font-weight-normal;\n }\n\n &.btn-cancel {\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-border-dark;\n }\n }\n\n &.btn-apply,\n &.btn-save {\n color: $es-white;\n background: $es-primary;\n border: 1px solid $es-primary;\n\n &:hover {\n background: $es-primary-hover;\n border-color: $es-primary-hover;\n }\n\n .btn-shortcut {\n background: rgba(255, 255, 255, 0.2);\n }\n }\n }\n\n .dropdown-footer-info {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n // Legacy button support\n .btn-cancel-dropdown {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-sm;\n color: $es-white;\n background: $es-primary;\n border: 1px solid $es-primary;\n border-radius: $es-radius-sm;\n cursor: pointer;\n\n &:hover {\n background: $es-primary-hover;\n border-color: $es-primary-hover;\n }\n\n i {\n font-size: 10px;\n }\n\n kbd {\n font-size: 0.65rem;\n padding: 0.125rem 0.25rem;\n background: rgba(255, 255, 255, 0.2);\n border-radius: 2px;\n color: rgba(255, 255, 255, 0.8);\n }\n }\n\n // Filter chips in dropdown\n .filter-chips-row {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-md;\n border-bottom: 1px solid $es-border-color;\n }\n\n .filter-chip {\n @include chip;\n }\n\n // Empty and loading states\n .dropdown-empty,\n .dropdown-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n margin-bottom: $es-spacing-sm;\n }\n }\n\n // Search history panel\n .search-history-panel {\n display: none;\n padding: $es-spacing-sm;\n background: $es-white;\n border-bottom: 1px solid $es-border-color;\n\n &.show {\n display: block;\n }\n }\n\n .history-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n i {\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n }\n\n span {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n }\n\n .btn-remove-history,\n .btn-delete-history {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-danger;\n }\n }\n }\n\n // Search history list container\n .search-history-list {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n }\n\n // Results header (for list view columns)\n .results-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-md;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n\n .header-spacer {\n width: 58px; // checkbox + image width\n flex-shrink: 0;\n }\n\n .header-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n }\n\n .header-col-name {\n flex: 1;\n text-align: left;\n }\n }\n\n // Results container\n .dropdown-results {\n padding: 0 $es-spacing-sm;\n background: $es-white;\n min-height: 200px;\n }\n\n // Dropdown item (search result)\n .dropdown-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm 0;\n background: $es-white;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n cursor: pointer;\n transition: background $es-transition-fast;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .result-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n color: $es-white;\n\n i {\n display: block;\n }\n }\n }\n\n &.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n }\n\n // Checkbox indicator\n .result-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n background: $es-white;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n i {\n display: none;\n font-size: 10px;\n }\n }\n\n // View mode classes (applied to dropdown container) - no gap/padding for shared borders\n &.view-cols-2 .dropdown-results { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-3 .dropdown-results { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-4 .dropdown-results { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-5 .dropdown-results { display: grid; grid-template-columns: repeat(5, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-6 .dropdown-results { display: grid; grid-template-columns: repeat(6, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-7 .dropdown-results { display: grid; grid-template-columns: repeat(7, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-8 .dropdown-results { display: grid; grid-template-columns: repeat(8, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n\n // Grid view item styling (compact cards with shared borders)\n &.view-cols-2,\n &.view-cols-3,\n &.view-cols-4,\n &.view-cols-5,\n &.view-cols-6,\n &.view-cols-7,\n &.view-cols-8 {\n .dropdown-item {\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding: $es-spacing-sm;\n border: none;\n border-right: 1px solid $es-border-color;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n\n .result-checkbox {\n position: absolute;\n top: $es-spacing-xs;\n left: $es-spacing-xs;\n }\n\n .result-image,\n .result-icon {\n width: 48px;\n height: 48px;\n margin-bottom: $es-spacing-xs;\n }\n\n .result-info {\n width: 100%;\n }\n\n .result-name {\n font-size: $es-font-size-xs;\n line-height: 1.3;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .result-subtitle {\n display: none;\n }\n\n // Show compact product info in grid\n .result-col {\n display: none;\n }\n\n .result-grid-info {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 0.25rem;\n margin-top: $es-spacing-xs;\n font-size: 0.65rem;\n\n .grid-price {\n color: $es-text-primary;\n font-weight: $es-font-weight-semibold;\n }\n\n .grid-stock {\n color: $es-text-muted;\n\n &.stock-out { color: $es-danger; }\n &.stock-low { color: $es-warning; }\n }\n\n .grid-discount {\n color: $es-success;\n font-weight: $es-font-weight-medium;\n }\n }\n }\n\n // Hide results header in grid views\n .results-header {\n display: none;\n }\n }\n\n // Remove right border from last item in each row (per column count)\n &.view-cols-2 .dropdown-results .dropdown-item:nth-child(2n) { border-right: none; }\n &.view-cols-3 .dropdown-results .dropdown-item:nth-child(3n) { border-right: none; }\n &.view-cols-4 .dropdown-results .dropdown-item:nth-child(4n) { border-right: none; }\n &.view-cols-5 .dropdown-results .dropdown-item:nth-child(5n) { border-right: none; }\n &.view-cols-6 .dropdown-results .dropdown-item:nth-child(6n) { border-right: none; }\n &.view-cols-7 .dropdown-results .dropdown-item:nth-child(7n) { border-right: none; }\n &.view-cols-8 .dropdown-results .dropdown-item:nth-child(8n) { border-right: none; }\n\n // Smaller items for higher column counts\n &.view-cols-5,\n &.view-cols-6,\n &.view-cols-7,\n &.view-cols-8 {\n .dropdown-item {\n .result-image,\n .result-icon {\n width: 40px;\n height: 40px;\n }\n\n .result-name {\n font-size: 0.65rem;\n }\n }\n }\n\n // Product-specific result item\n .result-item-product {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex: 1;\n min-width: 0;\n }\n\n .result-item-image,\n .result-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n overflow: hidden;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n }\n\n .result-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n background: $es-slate-100;\n border-radius: $es-radius-sm;\n color: $es-text-muted;\n\n i {\n font-size: 16px;\n }\n }\n\n .result-item-info,\n .result-info {\n flex: 1;\n min-width: 0;\n }\n\n .result-item-name,\n .result-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .result-item-meta,\n .result-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .subtitle-line {\n @include text-truncate;\n }\n\n .subtitle-line-primary {\n color: $es-text-secondary;\n }\n\n .subtitle-line-secondary {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n // Result columns (for product list view)\n .result-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n font-size: $es-font-size-xs;\n }\n\n .result-col-price {\n color: $es-text-secondary;\n }\n\n .result-col-sale {\n color: $es-danger;\n font-weight: $es-font-weight-semibold;\n }\n\n .result-col-stock {\n .col-value {\n &.stock-ok {\n color: $es-success;\n }\n\n &.stock-low {\n color: $es-warning;\n }\n\n &.stock-out {\n color: $es-danger;\n }\n }\n }\n\n .result-col-sales {\n color: $es-text-muted;\n }\n\n .col-value {\n display: block;\n }\n\n // Result checkbox\n .result-item-checkbox,\n .result-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n border: 2px solid $es-border-dark;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n i {\n display: none;\n font-size: 10px;\n color: $es-white;\n }\n\n .dropdown-result-item.selected &,\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n\n // No results state\n .no-results {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: 1.25rem;\n opacity: 0.5;\n }\n }\n\n // Load more controls\n .load-more-controls {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-more-label,\n .load-more-of {\n white-space: nowrap;\n }\n\n .remaining-count {\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n\n .load-more-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 60px;\n }\n\n .btn-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xs;\n margin: 0;\n border: none;\n color: $es-primary;\n background: $es-primary-light !important;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n font: inherit;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: rgba($es-primary, 0.2) !important;\n }\n }\n }\n\n // Load more button\n .dropdown-load-more {\n display: flex;\n justify-content: center;\n padding: $es-spacing-md;\n border-top: 1px solid $es-border-color;\n\n .load-more-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n\n &.loading {\n opacity: 0.7;\n cursor: wait;\n }\n }\n }\n\n // Dropdown body\n .dropdown-body {\n max-height: 400px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n // Tree view styles (for categories)\n .tree-container {\n padding: $es-spacing-sm;\n }\n\n .tree-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n .tree-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: 0.375rem $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .tree-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n }\n\n // tree-toggle, btn-select-children, tree-checkbox, tree-icon styles in _tree.scss\n\n .tree-info {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n flex: 1;\n min-width: 0;\n }\n\n .tree-name {\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .tree-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n}\n\n// ============================================================================\n// Standalone dropdown styles (for when dropdown is appended to body)\n// These selectors work because .target-search-dropdown is on the dropdown itself\n// ============================================================================\n\n.target-search-dropdown {\n // Results container - scrollable\n .dropdown-results {\n max-height: 400px;\n overflow-y: auto;\n padding: 0 $es-spacing-sm;\n @include custom-scrollbar;\n }\n\n // Results header (for list view columns)\n .results-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-md;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n\n .header-spacer {\n width: 58px; // checkbox + image width\n flex-shrink: 0;\n }\n\n .header-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n }\n\n .header-col-name {\n flex: 1;\n text-align: left;\n }\n }\n\n // Hide results-header by default, show only for products in list view\n &:not(.view-list) .results-header,\n &.view-tree .results-header {\n display: none;\n }\n\n // Result item for products\n .result-item-product {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex: 1;\n min-width: 0;\n }\n\n // Result columns for product data\n .result-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n font-size: $es-font-size-xs;\n }\n\n .result-col-price {\n color: $es-text-secondary;\n }\n\n .result-col-sale {\n color: $es-danger;\n font-weight: $es-font-weight-semibold;\n }\n\n .result-col-stock {\n .col-value {\n &.stock-ok { color: $es-success; }\n &.stock-low { color: $es-warning; }\n &.stock-out { color: $es-danger; }\n }\n }\n\n .result-col-sales {\n color: $es-text-muted;\n }\n\n // Dropdown item styling\n .dropdown-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: 0;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n }\n }\n\n // Result checkbox styling\n .result-checkbox {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n i {\n font-size: 10px;\n color: transparent;\n }\n\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n color: $es-white;\n }\n }\n }\n\n // Result image\n .result-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n overflow: hidden;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n }\n\n // Result icon (for non-image entities)\n .result-icon {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n background: $es-slate-100;\n border-radius: $es-radius-sm;\n\n i {\n font-size: 16px;\n color: $es-text-muted;\n }\n }\n\n // Result info container\n .result-info {\n flex: 1;\n min-width: 0;\n }\n\n .result-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .result-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .subtitle-line {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .subtitle-line-primary {\n color: $es-text-secondary;\n }\n\n .subtitle-line-secondary {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n // Hide columns in grid/tree views\n &[class*=\"view-cols-\"] .result-col,\n &.view-tree .result-col {\n display: none;\n }\n\n // Entity search box - full width\n .entity-search-box {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n width: 100%;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n\n .entity-search-icon {\n color: $es-text-muted;\n flex-shrink: 0;\n margin-left: $es-spacing-xs;\n }\n\n // Override Bootstrap/parent form input styles\n input.entity-search-input,\n input.entity-search-input[type=\"text\"] {\n flex: 1;\n min-width: 0;\n width: auto !important;\n max-width: none !important;\n height: auto;\n padding: 0;\n margin: 0;\n border: none !important;\n outline: none;\n background: transparent !important;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n box-shadow: none !important;\n\n &::placeholder {\n color: $es-text-muted;\n }\n\n &:focus {\n border: none !important;\n box-shadow: none !important;\n outline: none;\n }\n }\n\n .search-loading {\n color: $es-text-muted;\n }\n }\n}\n\n// Body-level dropdown (when appended to body for z-index)\nbody > .target-search-dropdown {\n // Override dropdown-item border when inside body-appended dropdown\n .dropdown-item {\n border: none;\n border-radius: 0;\n\n &:not(:last-child) {\n border-bottom: 1px solid $es-border-color;\n }\n }\n}\n\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n","/**\n * Chips Component\n * Entity chips, selection pills, tags\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Chips container wrapper with toolbar\n .chips-wrapper {\n display: flex;\n flex-direction: column;\n margin-top: $es-spacing-sm;\n background: $es-slate-50;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n overflow: hidden;\n }\n\n // Chips toolbar - integrated filter bar inside chips area\n .chips-toolbar {\n display: none;\n align-items: center;\n flex-wrap: nowrap;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n padding-bottom: 0;\n background: transparent;\n\n &.has-chips {\n display: flex;\n }\n\n // Filter input - takes available space, icon embedded as background\n // Using [type=\"text\"] for specificity over .bootstrap input[type=\"text\"]\n input[type=\"text\"].chips-search-input {\n all: unset;\n display: block;\n flex: 1 1 auto;\n min-width: 80px;\n width: auto;\n height: auto;\n padding: 0.2rem 0.5rem 0.2rem 1.5rem;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E\") no-repeat 0.375rem center;\n background-size: 10px;\n border: 1px solid $es-slate-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n line-height: 1.4;\n color: $es-text-primary;\n box-sizing: border-box;\n transition: all $es-transition-fast;\n\n &::placeholder {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n // Sort dropdown - compact, auto width\n select.chips-sort-select {\n all: unset;\n flex: 0 0 auto;\n padding: 0.2rem 1.25rem 0.2rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.375rem center;\n background-size: 8px;\n font-size: 10px;\n line-height: 1.4;\n color: $es-text-secondary;\n cursor: pointer;\n box-sizing: border-box;\n white-space: nowrap;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n }\n\n // Count badge - smaller, pill style\n .chips-count {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0; // Don't shrink\n gap: 0.125rem;\n padding: 0.2rem 0.5rem;\n background: $es-slate-200;\n color: $es-text-secondary;\n font-size: 10px;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-sm;\n white-space: nowrap;\n line-height: 1.4;\n\n &.has-filter {\n background: $es-cyan-100;\n color: $es-cyan-700;\n }\n\n .count-filtered {\n font-weight: $es-font-weight-bold;\n }\n\n .count-separator {\n opacity: 0.6;\n margin: 0 0.125rem;\n }\n }\n\n .chips-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n margin-left: auto;\n }\n\n // Clear button - subtle, chip-like\n .btn-chips-clear {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n flex-shrink: 0; // Don't shrink\n gap: 0.25rem;\n padding: 0.2rem 0.5rem;\n color: $es-danger;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n background: rgba($es-danger, 0.1);\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n white-space: nowrap; // Prevent text wrapping\n line-height: 1.4;\n\n &:hover {\n background: $es-danger;\n color: $es-white;\n }\n\n i {\n font-size: 9px;\n flex-shrink: 0;\n }\n\n .clear-text {\n // Hide text on small screens, keep icon\n @media (max-width: 480px) {\n display: none;\n }\n }\n }\n\n // Chips container - flows naturally from toolbar\n .entity-chips {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md $es-spacing-md;\n min-height: 40px;\n max-height: 300px;\n overflow-y: auto;\n\n &:empty {\n display: none;\n }\n }\n\n // Load more section with select dropdown\n .chips-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: transparent;\n border-top: 1px dashed $es-border-color;\n\n .load-more-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .load-more-select,\n select.load-more-select {\n appearance: none;\n padding: 0.25rem 1.75rem 0.25rem 0.5rem !important;\n border: 1px solid $es-border-color !important;\n border-radius: $es-radius-sm !important;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.5rem center !important;\n background-size: 8px !important;\n font-size: $es-font-size-xs !important;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n cursor: pointer;\n transition: all $es-transition-fast;\n height: auto !important;\n min-height: 0 !important;\n line-height: 1.3 !important;\n\n &:hover {\n border-color: $es-primary !important;\n background-color: $es-primary-light !important;\n }\n\n &:focus {\n outline: none !important;\n border-color: $es-primary !important;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1) !important;\n }\n }\n\n .load-more-remaining {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n // Individual chip\n .entity-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-100;\n color: $es-text-secondary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n // Chip with image\n &.has-image {\n padding-left: 0.25rem;\n }\n\n // Hidden by search filter or pagination\n &.chip-filtered-out,\n &.chip-paginated-out {\n display: none;\n }\n }\n\n .chip-image {\n width: 20px;\n height: 20px;\n object-fit: cover;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .chip-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n color: $es-text-muted;\n flex-shrink: 0;\n\n // Product/entity images inside chip\n img {\n width: 20px;\n height: 20px;\n object-fit: cover;\n border-radius: $es-radius-sm;\n }\n }\n\n // Country flag in chip\n .chip-flag {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n\n img {\n width: 18px;\n height: 12px;\n object-fit: cover;\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n }\n\n .flag-fallback {\n width: 18px;\n height: 12px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #e8eaed 0%, #dadce0 100%);\n border-radius: 2px;\n font-size: 10px;\n color: #5f6368;\n }\n }\n\n // Holiday preview button in country chip\n .chip-preview-holidays {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n color: $es-primary;\n border-radius: 50%;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.15);\n color: darken($es-primary, 10%);\n }\n\n i.material-icons {\n font-size: 14px;\n }\n }\n\n .chip-text,\n .chip-name {\n // Show full name, no truncation\n word-break: break-word;\n }\n\n .chip-remove {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 0.125rem;\n color: $es-text-muted;\n border-radius: 50%;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Chip variants\n .entity-chip.chip-primary {\n background: $es-primary-light;\n color: $es-primary;\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n }\n\n .entity-chip.chip-success {\n background: $es-success-light;\n color: $es-success-dark;\n\n &:hover {\n background: rgba($es-success, 0.2);\n }\n }\n\n .entity-chip.chip-danger {\n background: $es-danger-light;\n color: $es-danger;\n\n &:hover {\n background: rgba($es-danger, 0.2);\n }\n }\n\n .entity-chip.chip-warning {\n background: $es-warning-light;\n color: color.adjust($es-warning, $lightness: -20%);\n\n &:hover {\n background: rgba($es-warning, 0.3);\n }\n }\n\n // Chip loading state\n .entity-chip.loading,\n .entity-chip-loading {\n opacity: 0.7;\n\n .chip-remove {\n display: none;\n }\n\n .chip-icon i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n // Hidden chip (collapsed view)\n .entity-chip.chip-hidden {\n display: none;\n }\n\n // Chips expanded/collapsed states\n .entity-chips.chips-collapsed,\n .entity-chips.chips-expanded {\n position: relative;\n }\n\n // Show more/less toggle\n .chips-show-more-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n color: $es-primary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n cursor: pointer;\n transition: color $es-transition-fast;\n\n &:hover {\n color: $es-primary-hover;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n .chips-collapse-toggle,\n .chips-expand-toggle {\n // Specific variants inherit from .chips-show-more-toggle\n }\n\n // More chips indicator\n .chips-more {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem 0.5rem;\n background: $es-slate-200;\n color: $es-text-secondary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-full;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-300;\n }\n }\n\n // Add chip button\n .chip-add-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: transparent;\n color: $es-primary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border: 1px dashed $es-primary;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Inline chips (compact mode)\n .entity-chips.inline {\n display: inline-flex;\n padding: 0;\n min-height: auto;\n\n .entity-chip {\n padding: 0.125rem 0.375rem;\n font-size: 11px;\n }\n }\n\n // Selected chips section in include/exclude\n .selected-chips-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n }\n\n .selected-chips-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n }\n\n // Pattern chips (for name/reference patterns)\n .entity-chip.chip-pattern {\n background: #fef3c7;\n color: #92400e;\n font-family: monospace;\n\n &:hover {\n background: #fde68a;\n }\n\n .chip-icon {\n color: #d97706;\n }\n }\n\n // Range chips (price, quantity, etc.)\n .entity-chip.chip-range,\n .range-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.25rem 0.5rem;\n background: $es-cyan-50;\n color: $es-cyan-600;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-cyan-100;\n }\n }\n\n .range-chip-text {\n font-family: monospace;\n }\n\n .btn-remove-range {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n color: $es-cyan-600;\n border-radius: 50%;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Multi-range chips container\n .multi-range-chips {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n margin-bottom: $es-spacing-xs;\n\n &:empty {\n display: none;\n }\n }\n\n // Pattern chips container\n .pattern-chips {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm 0;\n min-height: 32px;\n\n &:empty::before {\n content: attr(data-placeholder);\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-style: italic;\n }\n }\n\n // Pattern tag\n .pattern-tag {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: #fef3c7;\n color: #92400e;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: #fde68a;\n }\n\n &.case-sensitive {\n .case-icon {\n color: $es-success;\n font-weight: $es-font-weight-bold;\n }\n }\n\n &.draft-tag {\n background: $es-white;\n border: 1px solid $es-border-color;\n padding: 0;\n flex: 1;\n min-width: 150px;\n\n &:hover {\n background: $es-white;\n }\n\n .pattern-input {\n flex: 1;\n min-width: 100px;\n padding: 0.375rem;\n border: 0;\n background: transparent;\n font-size: $es-font-size-sm;\n font-family: inherit;\n\n &:focus {\n outline: none;\n }\n\n &::placeholder {\n color: $es-text-muted;\n font-style: italic;\n }\n }\n }\n }\n\n .pattern-tag-text {\n font-family: monospace;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .btn-toggle-case {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n }\n }\n\n .case-icon {\n font-size: 11px;\n font-weight: $es-font-weight-semibold;\n font-family: monospace;\n }\n\n .btn-remove-pattern {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n color: #d97706;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n .btn-add-pattern {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Pattern match count (in draft tag)\n .pattern-match-count {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0 0.375rem;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n cursor: pointer;\n\n &.count-zero {\n color: $es-warning;\n }\n\n &.count-found {\n color: $es-success;\n }\n\n .count-value {\n font-weight: $es-font-weight-semibold;\n }\n }\n\n // Pattern input row\n .pattern-input-row {\n display: flex;\n align-items: stretch;\n gap: $es-spacing-xs;\n }\n}\n\n// ==========================================================================\n// Holiday Preview Popover (Country chip eye button)\n// ==========================================================================\n\n.holiday-preview-popover {\n position: absolute;\n z-index: 10001;\n width: 320px;\n max-width: 90vw;\n background: $es-white;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-xl;\n overflow: hidden;\n\n .popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n }\n\n .popover-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .popover-flag {\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n }\n\n .popover-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i.material-icons {\n font-size: 18px;\n }\n }\n\n .popover-body {\n max-height: 350px;\n overflow-y: auto;\n padding: $es-spacing-sm;\n @include custom-scrollbar;\n }\n\n // Loading state\n .holiday-preview-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i.material-icons {\n font-size: 20px;\n }\n\n .icon-spin {\n animation: spin 1s linear infinite;\n }\n }\n\n // Empty state\n .holiday-preview-empty {\n text-align: center;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n\n i.material-icons {\n font-size: 48px;\n opacity: 0.4;\n margin-bottom: $es-spacing-sm;\n display: block;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n }\n\n // Holiday list\n .holiday-list {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n }\n\n .holiday-item {\n display: flex;\n align-items: flex-start;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n border-left: 3px solid $es-success;\n\n &.holiday-type-bank,\n &.holiday-type-bank-holiday {\n border-left-color: $es-info;\n }\n\n &.holiday-type-observance {\n border-left-color: $es-warning;\n }\n\n &.holiday-type-regional,\n &.holiday-type-local-holiday {\n border-left-color: #8b5cf6;\n }\n }\n\n .holiday-date {\n flex-shrink: 0;\n min-width: 80px;\n\n .holiday-day {\n display: block;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .holiday-weekday {\n display: block;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n .holiday-info {\n flex: 1;\n min-width: 0;\n }\n\n .holiday-country-flag {\n vertical-align: middle;\n margin-right: 0.25rem;\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n }\n\n .holiday-name {\n display: inline;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n word-wrap: break-word;\n }\n\n .holiday-type-badge {\n display: inline-block;\n margin-left: $es-spacing-sm;\n padding: 0.125rem 0.375rem;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n text-transform: capitalize;\n background: $es-slate-200;\n color: $es-text-secondary;\n border-radius: $es-radius-sm;\n vertical-align: middle;\n }\n\n .holiday-preview-note {\n margin-top: $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n text-align: center;\n }\n\n // Filter input\n .popover-filter {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-md;\n border-bottom: 1px solid $es-border-color;\n background: $es-slate-50;\n\n i.material-icons {\n font-size: 18px;\n color: $es-text-muted;\n }\n\n .holiday-filter-input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n outline: none;\n padding: $es-spacing-xs 0;\n\n &::placeholder {\n color: $es-text-muted;\n }\n }\n }\n}\n\n// Spin animation for loading icons\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n// Bootstrap specificity overrides for chips toolbar form elements\n// PrestaShop admin uses #content .mpr-config-form... with high specificity\n// We need to match or exceed that specificity\n#content.bootstrap,\n#content .bootstrap,\n.bootstrap #content {\n .target-conditions-trait,\n .entity-selector-trait {\n .chips-wrapper .chips-toolbar {\n // Double class for extra specificity\n input[type=\"text\"].chips-search-input.chips-search-input {\n all: unset;\n display: block;\n flex: 1 1 auto;\n min-width: 80px;\n width: auto;\n height: auto;\n padding: 0.2rem 0.5rem 0.2rem 1.5rem;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E\") no-repeat 0.375rem center;\n background-size: 10px;\n border: 1px solid $es-slate-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n line-height: 1.4;\n color: $es-text-primary;\n box-sizing: border-box;\n transition: all $es-transition-fast;\n\n &::placeholder {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n // Double class for extra specificity\n select.chips-sort-select.chips-sort-select {\n all: unset;\n flex: 0 0 auto;\n padding: 0.2rem 1.25rem 0.2rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.375rem center;\n background-size: 8px;\n font-size: 10px;\n line-height: 1.4;\n color: $es-text-secondary;\n cursor: pointer;\n box-sizing: border-box;\n white-space: nowrap;\n height: auto;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n }\n }\n}\n","/**\n * Groups Component\n * Selection groups, include/exclude sections, method selectors\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Group container\n .target-group {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n overflow: hidden;\n }\n\n // Group header\n .target-group-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n }\n\n .target-group-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n\n .group-number {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 0.25rem;\n background: $es-primary;\n color: $es-white;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-bold;\n border-radius: $es-radius-full;\n }\n }\n\n .target-group-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .group-action-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n &.danger:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n // Group body\n .target-group-body,\n .group-body {\n padding: $es-spacing-md;\n }\n\n // Include section\n .include-section {\n margin-bottom: $es-spacing-md;\n }\n\n .section-label {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n margin-bottom: $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n\n &.label-include {\n color: $es-success-dark;\n\n i {\n color: $es-success;\n }\n }\n\n &.label-exclude {\n color: $es-danger;\n\n i {\n color: $es-danger;\n }\n }\n }\n\n // Method selector\n .method-selector {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-sm;\n }\n\n .method-selector-wrapper {\n flex: 1;\n position: relative;\n }\n\n .method-select {\n @include input-base;\n padding-right: 2rem;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E\");\n background-position: right 0.5rem center;\n background-repeat: no-repeat;\n background-size: 1.5em 1.5em;\n }\n\n .method-help-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-primary;\n }\n }\n\n // Value picker (search trigger)\n .value-picker {\n position: relative;\n }\n\n .value-picker-trigger {\n @include button-reset;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n width: 100%;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n text-align: left;\n transition: all $es-transition-fast;\n\n &:hover {\n border-color: $es-slate-300;\n }\n\n &:focus {\n border-color: $es-primary;\n @include focus-ring($es-primary);\n }\n\n i {\n color: $es-text-light;\n }\n }\n\n // Pattern input (text input for patterns)\n .pattern-input-wrapper {\n position: relative;\n }\n\n .pattern-input {\n @include input-base;\n font-family: monospace;\n }\n\n .pattern-add-btn {\n @include button-reset;\n position: absolute;\n right: 0.25rem;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n\n // Multi-range input (price ranges)\n .multi-range-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .range-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .range-input {\n @include input-base;\n width: 100px;\n text-align: center;\n }\n\n .range-separator {\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n }\n\n .range-remove-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n .range-add-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n color: $es-primary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n\n // Multi-select tiles (stock status, etc.)\n .multi-select-tiles {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n }\n\n .multi-select-tile {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n background: $es-slate-100;\n color: $es-text-secondary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border: 1px solid transparent;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n &.selected {\n background: $es-primary-light;\n color: $es-primary;\n border-color: $es-primary;\n }\n }\n\n // Exclude section\n .exclude-section {\n margin-top: $es-spacing-md;\n padding-top: $es-spacing-md;\n border-top: 1px dashed $es-border-color;\n }\n\n // Legacy exclude-rows (if used elsewhere)\n .exclude-rows {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .exclude-row-content {\n flex: 1;\n }\n\n .exclude-remove-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n .add-exclude-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n margin-top: $es-spacing-sm;\n padding: 0.25rem 0.5rem;\n color: $es-danger;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border: 1px dashed $es-danger;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n }\n }\n\n // Add group button (used in block-footer)\n .btn-add-group {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.5rem 0.875rem;\n color: $es-primary;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n background: rgba($es-primary, 0.05);\n border: 1px dashed $es-primary;\n border-radius: 0.375rem;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.1);\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Block footer\n .block-footer {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n border-top: 1px solid $es-border-color;\n }\n\n // Block body\n .block-body {\n padding: 0;\n }\n\n // Groups container\n .groups-container {\n padding: $es-spacing-md;\n }\n\n // Groups empty state\n .groups-empty-state {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n }\n\n // Selection group\n .selection-group {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n margin-bottom: $es-spacing-md;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n &.collapsed {\n .group-body {\n display: none;\n }\n\n .group-collapse-toggle i {\n transform: rotate(-90deg);\n }\n }\n }\n\n // Group header\n .group-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n\n &.group-header-single {\n padding: $es-spacing-xs $es-spacing-md;\n background: transparent;\n border-bottom: none;\n }\n }\n\n .group-collapse-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n color: $es-text-muted;\n\n i {\n transition: transform $es-transition-fast;\n }\n }\n\n .group-name-wrapper {\n flex: 1;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .group-name-input {\n flex: 1;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n background: transparent;\n border: 1px solid transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover,\n &:focus {\n background: $es-white;\n border-color: $es-border-color;\n outline: none;\n }\n\n &::placeholder {\n color: $es-text-muted;\n font-weight: $es-font-weight-medium;\n }\n }\n\n .group-count-badge {\n @include count-badge($es-primary);\n }\n\n .btn-remove-group {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n // Group include section - green accent to distinguish from exclude\n .group-include {\n margin-bottom: $es-spacing-md;\n padding: $es-spacing-sm;\n background: rgba($es-success, 0.03);\n border: 1px solid rgba($es-success, 0.2);\n border-radius: $es-radius-md;\n }\n\n .section-row {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n // Method selector wrapper (from PHP)\n .method-selector-wrapper {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .method-info-placeholder {\n display: flex;\n align-items: center;\n min-width: 20px;\n }\n\n .include-method-select,\n .exclude-method-select {\n flex: 1;\n @include input-base;\n cursor: pointer;\n }\n\n // Lock indicator for method selector (when excludes are present)\n .selector-locked {\n .include-method-select {\n opacity: 0.7;\n cursor: not-allowed;\n }\n }\n\n .lock-indicator {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-warning;\n cursor: help;\n\n i {\n font-size: 14px;\n }\n\n .mpr-tooltip {\n display: none;\n position: absolute;\n bottom: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n padding: $es-spacing-xs $es-spacing-sm;\n background: $es-slate-800;\n color: $es-white;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-normal;\n white-space: nowrap;\n border-radius: $es-radius-sm;\n z-index: 100;\n }\n\n &:hover .mpr-tooltip {\n display: block;\n }\n }\n\n // Group excludes section\n .group-excludes {\n margin-top: $es-spacing-md;\n }\n\n .except-separator {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin: 0 0 $es-spacing-sm 0;\n\n // Lines on both sides\n &::before,\n &::after {\n content: '';\n flex: 1;\n height: 1px;\n background: rgba($es-danger, 0.3);\n }\n }\n\n .except-label {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.75rem;\n background: $es-danger-light;\n color: $es-danger;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-full;\n white-space: nowrap;\n flex-shrink: 0;\n\n i {\n font-size: 10px;\n }\n }\n\n .exclude-rows-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .exclude-row {\n display: flex;\n flex-direction: column;\n padding: $es-spacing-sm;\n background: rgba($es-danger, 0.03);\n border: 1px solid rgba($es-danger, 0.15);\n border-radius: $es-radius-md;\n\n // Value picker inside exclude row - full width\n .value-picker {\n width: 100%;\n margin-top: $es-spacing-sm;\n }\n }\n\n .exclude-header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n width: 100%;\n\n .method-selector-wrapper {\n flex: 1;\n }\n\n // Delete button at the far right\n .btn-remove-exclude-row {\n flex-shrink: 0;\n margin-left: auto;\n }\n }\n\n .btn-remove-exclude-row {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n .btn-add-exclude,\n .btn-add-another-exclude {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n margin-top: $es-spacing-sm;\n padding: 0.375rem 0.625rem;\n color: $es-danger;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n background: transparent;\n border: 1px dashed rgba($es-danger, 0.5);\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n border-color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Group modifiers (inline version from PHP)\n // Uses negative margins to break out of .group-body padding\n .group-modifiers {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n margin: $es-spacing-md (-$es-spacing-md) (-$es-spacing-md);\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n .modifier-inline {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n }\n\n // Common height for all modifier controls\n $modifier-height: 26px;\n\n .group-modifier-limit {\n width: 50px;\n max-width: 50px;\n height: $modifier-height;\n padding: 0 0.375rem;\n font-size: $es-font-size-xs;\n text-align: center;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n\n &:focus {\n border-color: $es-primary;\n outline: none;\n }\n }\n\n // Sort modifier - input group style (select + button glued together)\n .modifier-sort {\n gap: 0; // Remove gap to glue select + button together\n\n .modifier-label {\n margin-right: 0.375rem; // Keep space between label and input group\n }\n\n .group-modifier-sort {\n height: $modifier-height;\n padding: 0 0.5rem;\n font-size: $es-font-size-xs;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm 0 0 $es-radius-sm;\n border-right: none;\n cursor: pointer;\n\n &:focus {\n border-color: $es-primary;\n outline: none;\n position: relative;\n z-index: 1;\n }\n }\n\n .btn-sort-dir {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: $modifier-height;\n height: $modifier-height;\n color: $es-text-muted;\n background: $es-slate-100;\n border: 1px solid $es-border-color;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: 11px;\n }\n }\n }\n\n // Fallback for elements outside .modifier-sort context\n .group-modifier-sort {\n height: $modifier-height;\n padding: 0 0.5rem;\n font-size: $es-font-size-xs;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n\n &:focus {\n border-color: $es-primary;\n outline: none;\n }\n }\n\n .btn-sort-dir {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: $modifier-height;\n height: $modifier-height;\n color: $es-text-muted;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-secondary;\n }\n }\n\n .group-preview-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-100;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &.clickable {\n cursor: pointer;\n\n &:hover {\n background: $es-primary-light;\n color: $es-primary;\n }\n }\n }\n\n // OR separator between groups\n .group-separator {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-sm 0;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n &::before,\n &::after {\n content: '';\n flex: 1;\n height: 1px;\n background: $es-border-color;\n margin: 0 $es-spacing-md;\n }\n }\n\n // Group modifiers (limit, sort)\n .group-modifiers {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n padding-top: $es-spacing-md;\n margin-top: $es-spacing-md;\n border-top: 1px solid $es-border-color;\n }\n\n .modifier-group {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .modifier-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n white-space: nowrap;\n }\n\n .modifier-input {\n @include input-base;\n width: 80px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n }\n\n .modifier-select {\n @include input-base;\n width: auto;\n padding: 0.25rem 1.5rem 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E\");\n background-position: right 0.25rem center;\n background-repeat: no-repeat;\n background-size: 1.25em 1.25em;\n }\n\n // Condition match count badge\n .condition-match-count {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.125rem 0.375rem;\n background: $es-slate-100;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n &.has-results {\n background: $es-primary-light;\n color: $es-primary;\n }\n\n // Country holidays variant - use calendar icon style\n &.country-holidays {\n background: rgba(139, 92, 246, 0.1);\n color: #8b5cf6;\n\n &:hover {\n background: rgba(139, 92, 246, 0.2);\n }\n\n &.clickable {\n background: rgba(139, 92, 246, 0.15);\n }\n }\n\n i {\n font-size: 10px;\n }\n }\n}\n","/**\n * Value Picker Component\n * Search boxes, input types, range inputs\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Value picker container\n .value-picker {\n padding: $es-spacing-sm 0;\n\n &[style*=\"display: none\"],\n &[style*=\"display:none\"] {\n padding: 0;\n }\n }\n\n .include-picker,\n .exclude-picker {\n // Section-specific picker styles\n }\n\n // Entity search box\n .entity-search-box {\n position: relative;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:focus-within {\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n // Separation between chips and search box\n .chips-wrapper + .entity-search-box {\n margin-top: $es-spacing-md;\n }\n\n .entity-search-icon {\n color: $es-text-muted;\n font-size: 14px;\n flex-shrink: 0;\n margin-left: $es-spacing-xs;\n }\n\n // Override parent form's max-width on search input\n input.entity-search-input,\n input.entity-search-input[type=\"text\"] {\n @include input-reset;\n flex: 1;\n min-width: 0;\n width: auto !important;\n max-width: none !important;\n padding: 0.375rem;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n border: none !important;\n background: transparent !important;\n box-shadow: none !important;\n\n &::placeholder {\n color: $es-text-muted;\n }\n\n &:focus {\n border: none !important;\n box-shadow: none !important;\n outline: none;\n }\n }\n\n .search-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n color: $es-primary;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n // Browse tree button (for categories)\n .btn-browse-tree {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n margin-left: auto;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary;\n color: $es-white;\n }\n\n i {\n font-size: 14px;\n }\n }\n\n // Numeric range box\n .numeric-range-box,\n .multi-range-input-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .range-min-input,\n .range-max-input {\n @include input-base;\n width: 100px;\n padding: $es-spacing-sm;\n text-align: center;\n font-size: $es-font-size-sm;\n\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n -moz-appearance: textfield;\n }\n\n .range-separator {\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n }\n\n .btn-add-range {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-white;\n background: $es-primary;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-hover;\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Multi-range container\n .multi-range-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n // Date range box\n .date-range-box {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .date-from-input,\n .date-to-input {\n @include input-base;\n width: 140px;\n padding: $es-spacing-sm;\n font-size: $es-font-size-sm;\n }\n\n // Multi-select tiles\n .multi-select-tiles {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n }\n\n .tile-option {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n color: $es-text-muted;\n background: transparent;\n border: 1px dashed $es-border-color;\n border-radius: 100px; // Pill shape\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-normal;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n color: $es-text-secondary;\n border-color: $es-slate-400;\n border-style: solid;\n }\n\n &.selected {\n color: $es-primary;\n background: $es-primary-light;\n border: 1px solid $es-primary;\n font-weight: $es-font-weight-medium;\n }\n\n i {\n font-size: 11px;\n opacity: 0.6;\n }\n\n &.selected i {\n opacity: 1;\n }\n }\n\n .tile-label {\n white-space: nowrap;\n }\n\n // Select input box\n .select-input-box {\n display: inline-block;\n }\n\n .select-value-input {\n @include input-base;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n min-width: 150px;\n }\n\n // Boolean input box\n .boolean-input-box {\n display: inline-flex;\n align-items: center;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-success-light;\n color: $es-success-dark;\n border-radius: $es-radius-md;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n }\n\n .boolean-label {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n\n &::before {\n content: '\\2713';\n font-weight: bold;\n }\n }\n\n // Condition match count badge\n .condition-match-count {\n @include count-badge($es-primary);\n margin-left: $es-spacing-sm;\n }\n}\n","/**\n * Modal Component\n * Preview modals, confirmation dialogs\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Modal backdrop\n.mpr-modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: $es-z-modal;\n opacity: 0;\n transition: opacity $es-transition-normal;\n\n &.show {\n opacity: 1;\n }\n}\n\n// Modal container\n.mpr-modal {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n z-index: $es-z-modal + 1;\n width: 90%;\n max-width: 600px;\n max-height: 90vh;\n background: $es-white;\n border-radius: $es-radius-xl;\n box-shadow: $es-shadow-xl;\n opacity: 0;\n transition: all $es-transition-normal;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n &.show {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n\n &.modal-sm {\n max-width: 400px;\n }\n\n &.modal-lg {\n max-width: 800px;\n }\n\n &.modal-xl {\n max-width: 1000px;\n }\n\n &.modal-fullscreen {\n width: 95%;\n max-width: none;\n height: 90vh;\n max-height: none;\n }\n}\n\n// Modal header\n.mpr-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-md $es-spacing-lg;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n flex-shrink: 0;\n}\n\n.mpr-modal-title {\n font-size: $es-font-size-base;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n margin: 0;\n}\n\n.mpr-modal-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: $es-font-size-lg;\n }\n}\n\n// Modal body\n.mpr-modal-body {\n flex: 1;\n overflow-y: auto;\n padding: $es-spacing-lg;\n @include custom-scrollbar;\n}\n\n// Modal footer\n.mpr-modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: $es-spacing-sm;\n padding: $es-spacing-md $es-spacing-lg;\n background: $es-bg-header;\n border-top: 1px solid $es-border-color;\n flex-shrink: 0;\n}\n\n.mpr-modal-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &.btn-secondary {\n color: $es-text-secondary;\n background: $es-slate-100;\n\n &:hover {\n background: $es-slate-200;\n }\n }\n\n &.btn-primary {\n color: $es-white;\n background: $es-primary;\n\n &:hover {\n background: $es-primary-hover;\n }\n }\n\n &.btn-danger {\n color: $es-white;\n background: $es-danger;\n\n &:hover {\n background: color.adjust($es-danger, $lightness: -10%);\n }\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n// Preview popover styles moved to _list-preview.scss\n\n.popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n}\n\n.popover-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n}\n\n.popover-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n}\n\n.popover-body {\n max-height: 300px;\n overflow-y: auto;\n padding: $es-spacing-sm;\n @include custom-scrollbar;\n}\n\n.popover-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n}\n\n.popover-info {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n}\n\n.popover-load-more {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n}\n\n// Popover arrow\n.popover-arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n background: $es-white;\n border: 1px solid $es-border-color;\n transform: rotate(45deg);\n\n &.arrow-top {\n top: -7px;\n left: 50%;\n margin-left: -6px;\n border-right: none;\n border-bottom: none;\n }\n\n &.arrow-bottom {\n bottom: -7px;\n left: 50%;\n margin-left: -6px;\n border-left: none;\n border-top: none;\n }\n}\n\n// ==========================================================================\n// Holiday Preview Modal\n// ==========================================================================\n\n#mpr-holiday-preview-modal {\n display: none;\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: $es-z-modal;\n\n &.show {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .mpr-modal-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n cursor: pointer;\n }\n\n .mpr-modal-dialog {\n position: relative;\n width: 90%;\n max-width: 480px;\n max-height: 80vh;\n background: $es-white;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-xl;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .mpr-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-md $es-spacing-lg;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n flex-shrink: 0;\n }\n\n .mpr-modal-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-base;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n margin: 0;\n\n i.material-icons {\n font-size: 20px;\n color: $es-primary;\n }\n }\n\n .mpr-modal-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: 18px;\n }\n }\n\n .mpr-modal-body {\n flex: 1;\n overflow-y: auto;\n padding: $es-spacing-lg;\n @include custom-scrollbar;\n }\n\n // Loading state\n .holiday-preview-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: $es-font-size-lg;\n }\n }\n\n // Empty state\n .holiday-preview-empty {\n text-align: center;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n\n i.material-icons {\n font-size: 48px;\n opacity: 0.5;\n margin-bottom: $es-spacing-md;\n }\n\n p {\n margin: 0 0 $es-spacing-xs;\n }\n\n .hint {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n // Holiday list\n .holiday-list {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .holiday-item {\n display: flex;\n align-items: flex-start;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n border-left: 3px solid $es-success;\n\n &.holiday-type-bank {\n border-left-color: $es-info;\n }\n\n &.holiday-type-observance {\n border-left-color: $es-warning;\n }\n\n &.holiday-type-regional {\n border-left-color: #8b5cf6;\n }\n }\n\n .holiday-date {\n flex-shrink: 0;\n min-width: 100px;\n\n .holiday-day {\n display: block;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .holiday-weekday {\n display: block;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n .holiday-info {\n flex: 1;\n min-width: 0;\n }\n\n .holiday-name {\n display: block;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n word-wrap: break-word;\n }\n\n .holiday-type-badge {\n display: inline-block;\n margin-top: $es-spacing-xs;\n padding: 0.125rem 0.375rem;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n text-transform: capitalize;\n background: $es-slate-200;\n color: $es-text-secondary;\n border-radius: $es-radius-sm;\n }\n\n .holiday-preview-note {\n margin-top: $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n text-align: center;\n }\n}\n","/**\n * List Preview Component\n * Popover and modal views for entity preview\n *\n * Uses shared entity-item base for item styling.\n * This file only contains popover/modal container styles.\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// =============================================================================\n// Preview Popover Container\n// =============================================================================\n\n.target-preview-popover,\n.target-list-preview-popover {\n position: absolute;\n z-index: 10000;\n min-width: 320px;\n max-width: 480px;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-lg;\n overflow: hidden;\n\n // Arrow pointing to badge\n &::before {\n content: '';\n position: absolute;\n top: -8px;\n left: 50%;\n transform: translateX(-50%);\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-bottom: 8px solid $es-border-color;\n }\n\n &::after {\n content: '';\n position: absolute;\n top: -6px;\n left: 50%;\n transform: translateX(-50%);\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-bottom: 6px solid $es-white;\n }\n\n // Positioned to the right - arrow on left\n &.position-right {\n &::before,\n &::after {\n left: 20px;\n transform: none;\n }\n }\n\n // Positioned to the left - arrow on right\n &.position-left {\n &::before,\n &::after {\n left: auto;\n right: 20px;\n transform: none;\n }\n }\n}\n\n// =============================================================================\n// Preview Header\n// =============================================================================\n\n.preview-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n\n .preview-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .preview-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n }\n}\n\n// =============================================================================\n// Preview Tabs (entity type switcher)\n// =============================================================================\n\n.preview-tabs {\n display: flex;\n flex-wrap: wrap;\n gap: 0;\n padding: 0;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n}\n\n.preview-tab {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.5rem 0.75rem;\n background: transparent;\n border: 0;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n cursor: pointer;\n transition: all $es-transition-fast;\n white-space: nowrap;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-secondary;\n }\n\n &.active {\n background: $es-white;\n border-bottom-color: $es-primary;\n color: $es-primary;\n }\n\n i {\n font-size: 12px;\n }\n}\n\n// =============================================================================\n// Preview Filter\n// =============================================================================\n\n.preview-filter {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border-bottom: 1px solid $es-border-color;\n\n i {\n color: $es-text-muted;\n font-size: 12px;\n }\n\n .preview-filter-input {\n all: unset;\n flex: 1;\n padding: 0.25rem 0;\n font-size: $es-font-size-xs;\n color: $es-text-primary;\n box-sizing: border-box;\n\n &::placeholder {\n color: $es-text-muted;\n }\n }\n}\n\n// =============================================================================\n// Preview Contents (tabbed content areas)\n// =============================================================================\n\n.preview-contents {\n max-height: 350px;\n overflow: hidden;\n}\n\n.preview-content {\n display: none;\n max-height: 350px;\n overflow-y: auto;\n @include custom-scrollbar;\n\n &.active {\n display: block;\n }\n}\n\n// =============================================================================\n// Preview Items Container\n// =============================================================================\n\n.preview-items {\n display: flex;\n flex-direction: column;\n padding: $es-spacing-xs $es-spacing-sm;\n}\n\n// =============================================================================\n// Preview Item - Uses entity-item patterns\n// Maps legacy classes to shared styling\n// =============================================================================\n\n.preview-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-white;\n border-radius: $es-radius-sm;\n transition: background $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n // Clickable items\n &[data-id] {\n cursor: pointer;\n }\n}\n\n// Image - matches chip image sizing for consistency\n.preview-item-image {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n object-fit: cover;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n}\n\n// No-image placeholder\n.preview-item-no-image {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n background: $es-slate-100;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n font-size: $es-font-size-sm;\n}\n\n// Info container\n.preview-item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n}\n\n// Name\n.preview-item-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n}\n\n// Meta/ref (category, email, etc.)\n.preview-item-ref,\n.preview-item-meta {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n @include text-truncate;\n}\n\n// Price badge\n.preview-item-price {\n flex-shrink: 0;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n}\n\n// =============================================================================\n// Preview Footer (load more)\n// =============================================================================\n\n.preview-footer {\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n}\n\n.load-more-controls {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-more-label {\n white-space: nowrap;\n }\n\n .load-more-select {\n appearance: none;\n padding: 0.25rem 1.75rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.5rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n cursor: pointer;\n transition: all $es-transition-fast;\n height: auto;\n min-height: 0;\n line-height: 1.3;\n\n &:hover {\n border-color: $es-primary;\n background-color: $es-primary-light;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n .load-more-of {\n white-space: nowrap;\n }\n\n .remaining-count {\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n\n .btn-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xs;\n margin: 0;\n border: none;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n font: inherit;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n\n &.loading {\n cursor: wait;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n }\n}\n\n// =============================================================================\n// Preview States\n// =============================================================================\n\n.preview-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n}\n\n.preview-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n\n i {\n font-size: 20px;\n color: $es-primary;\n animation: spin 0.6s linear infinite;\n }\n}\n\n// =============================================================================\n// Total Summary Popover (header total badge click)\n// =============================================================================\n\n.total-preview-popover {\n min-width: 240px;\n max-width: 320px;\n\n .preview-popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n\n .preview-popover-title {\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n font-size: $es-font-size-sm;\n }\n\n .preview-popover-count {\n flex-shrink: 0;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n background: $es-slate-200;\n padding: 0.125rem 0.5rem;\n border-radius: $es-radius-sm;\n }\n }\n\n .preview-popover-body {\n padding: $es-spacing-xs 0;\n }\n\n .total-summary-list {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .total-summary-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n cursor: pointer;\n transition: background-color 0.15s ease;\n\n &:hover {\n background: $es-slate-50;\n }\n\n i {\n width: 18px;\n text-align: center;\n color: $es-text-muted;\n font-size: 14px;\n }\n\n .summary-item-label {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n }\n\n .summary-item-count {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n background: rgba($es-primary, 0.1);\n padding: 2px 8px;\n border-radius: $es-radius-sm;\n }\n }\n}\n\n// Make trait-total-count clickable\n.trait-total-count {\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n opacity: 0.8;\n }\n\n &.popover-open {\n opacity: 0.9;\n }\n}\n\n// =============================================================================\n// Schedule Dropdown Preview\n// Inline dropdown for schedule details in admin list\n// =============================================================================\n\n.mpr-dropdown-preview {\n display: none;\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-top: 6px;\n z-index: 1000;\n padding: 0.625rem 0.75rem;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-lg;\n font-size: 12px;\n text-align: left;\n text-transform: none;\n font-weight: normal;\n white-space: nowrap; // Allow dropdown to grow as needed\n\n &.is-open {\n display: block;\n }\n}\n\n.mpr-dropdown-preview__item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0;\n color: #666;\n line-height: 1.4;\n\n &:not(:last-child) {\n margin-bottom: 0.25rem;\n padding-bottom: 0.5rem;\n border-bottom: 1px solid rgba($es-border-color, 0.5);\n }\n\n // Icon styles\n > .material-icons,\n > i:first-child {\n flex-shrink: 0;\n width: 16px;\n font-size: 14px;\n color: #999;\n text-align: center;\n }\n}\n\n.mpr-dropdown-preview__muted {\n color: #999;\n}\n\n// Schedule inline layout\n.mpr-dropdown-preview__schedule {\n display: inline;\n}\n\n.mpr-dropdown-preview__schedule-row {\n display: inline;\n\n &:not(:last-child)::after {\n content: ',';\n margin-right: 0.5rem;\n }\n}\n\n.mpr-dropdown-preview__day {\n color: #666;\n}\n\n.mpr-dropdown-preview__hours {\n color: $es-primary;\n font-weight: 500;\n margin-left: 0.25rem;\n}\n\n// Badge trigger for preview dropdown/popover\n.mpr-badge--preview {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.25rem;\n position: relative;\n min-width: 20px;\n height: 20px;\n padding: 0 0.5rem;\n font-size: 0.75rem;\n font-weight: 600;\n border-radius: 50rem;\n cursor: pointer;\n text-transform: none;\n\n .icon-eye {\n font-size: 10px;\n line-height: 1;\n opacity: 0.8;\n }\n\n .material-icons {\n font-size: 12px;\n line-height: 1;\n }\n}\n\n.mpr-badge--preview-primary {\n background: $es-primary;\n color: $es-white;\n}\n\n.mpr-badge--preview-success {\n background: #d4edda;\n color: #155724;\n}\n\n.mpr-badge--preview-warning {\n background: #fff3cd;\n color: #856404;\n}\n\n.mpr-badge--preview-muted {\n background: $es-slate-200;\n color: $es-text-muted;\n}\n","/**\n * Schedule Conditions Component\n * DateTime picker, weekly timeline, holidays\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Schedule conditions wrapper\n.schedule-conditions-trait {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n}\n\n// Schedule header\n.schedule-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: 0.875rem $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n}\n\n.schedule-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n\n i {\n color: $es-text-muted;\n }\n}\n\n// Schedule body\n.schedule-body {\n padding: $es-spacing-md;\n}\n\n// Schedule section\n.schedule-section {\n margin-bottom: $es-spacing-lg;\n\n &:last-child {\n margin-bottom: 0;\n }\n}\n\n.schedule-section-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-sm;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n\n i {\n color: $es-text-muted;\n }\n}\n\n.schedule-section-description {\n margin-bottom: $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n}\n\n// DateTime range picker\n.datetime-range {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n}\n\n.datetime-field {\n flex: 1;\n min-width: 200px;\n}\n\n.datetime-label {\n display: block;\n margin-bottom: 0.25rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n}\n\n.datetime-input {\n @include input-base;\n}\n\n// Weekly schedule\n.weekly-schedule {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n}\n\n.day-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-md;\n padding: $es-spacing-sm;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n\n &.disabled {\n opacity: 0.5;\n }\n}\n\n.day-toggle {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n min-width: 100px;\n}\n\n.day-checkbox {\n width: 18px;\n height: 18px;\n cursor: pointer;\n}\n\n.day-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n}\n\n// Timeline slider\n.timeline-slider {\n flex: 1;\n position: relative;\n height: 24px;\n background: $es-slate-200;\n border-radius: $es-radius-full;\n cursor: pointer;\n}\n\n.timeline-fill {\n position: absolute;\n top: 0;\n height: 100%;\n background: $es-primary;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n}\n\n.timeline-handle {\n position: absolute;\n top: 50%;\n width: 16px;\n height: 16px;\n background: $es-white;\n border: 2px solid $es-primary;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n cursor: grab;\n box-shadow: $es-shadow-sm;\n transition: box-shadow $es-transition-fast;\n\n &:hover {\n box-shadow: $es-shadow-md;\n }\n\n &:active {\n cursor: grabbing;\n }\n\n &.handle-start {\n z-index: 2;\n }\n\n &.handle-end {\n z-index: 1;\n }\n}\n\n// Time display\n.day-times {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n min-width: 120px;\n font-size: $es-font-size-xs;\n font-family: monospace;\n color: $es-text-secondary;\n}\n\n.time-separator {\n color: $es-text-muted;\n}\n\n// Holiday exclusions\n.holiday-section {\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n}\n\n.holiday-toggle {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-md;\n}\n\n.holiday-checkbox {\n width: 18px;\n height: 18px;\n cursor: pointer;\n}\n\n.holiday-label {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n}\n\n.holiday-countries {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n}\n\n.holiday-country-chip {\n @include chip;\n cursor: pointer;\n\n &.selected {\n background: $es-primary-light;\n color: $es-primary;\n }\n}\n\n// Server time display\n.server-time {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-info-light;\n border-radius: $es-radius-md;\n font-size: $es-font-size-xs;\n color: $es-info;\n\n i {\n font-size: $es-font-size-sm;\n }\n\n .time-value {\n font-family: monospace;\n font-weight: $es-font-weight-semibold;\n }\n}\n\n// Schedule summary\n.schedule-summary {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n font-size: $es-font-size-sm;\n color: $es-text-secondary;\n\n .summary-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n\n i {\n color: $es-success;\n font-size: $es-font-size-sm;\n }\n\n &.inactive i {\n color: $es-text-muted;\n }\n }\n}\n\n// Collapsed state\n.schedule-conditions-trait.collapsed {\n .schedule-body {\n display: none;\n }\n\n .schedule-header {\n border-radius: $es-radius-lg;\n }\n}\n\n// Schedule toggle row (form-content layout)\n.schedule-toggle-row {\n display: flex;\n align-items: center;\n background: $es-slate-100;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n\n .schedule-toggle-switch {\n padding: $es-spacing-sm $es-spacing-md;\n }\n\n .schedule-toggle-actions {\n padding: $es-spacing-sm $es-spacing-md;\n border-left: 1px solid $es-border-color;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n .material-icons {\n color: $es-slate-400;\n font-size: 20px;\n }\n }\n}\n\n// Schedule summary badges (read-only indicators in header)\n.schedule-summary-badges {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-left: auto;\n padding: 0 $es-spacing-sm;\n}\n\n.schedule-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-200;\n color: $es-slate-600;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n white-space: nowrap;\n\n .material-icons {\n font-size: 14px;\n opacity: 0.7;\n }\n}\n\n// Section hint after embedded entity selector - add margin\n.schedule-holidays .section-hint {\n margin-top: $es-spacing-md;\n}\n","/**\n * Tips Box Component\n * Pro tips and help information display\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Tips box container\n .target-tips-box {\n margin: $es-spacing-lg $es-spacing-md $es-spacing-md;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n overflow: hidden;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n }\n\n // Tips header (clickable to expand/collapse)\n .tips-header {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: $es-spacing-md $es-spacing-lg;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.02);\n }\n\n // Lightbulb icon\n > i:first-child {\n font-size: 1rem;\n color: $es-warning;\n }\n\n // Title text\n > span {\n flex: 1;\n font-size: 13px;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-600;\n }\n }\n\n // Toggle chevron icon\n .tips-toggle {\n font-size: $es-font-size-xs;\n color: $es-slate-400;\n transition: transform 0.2s;\n }\n\n // Expanded state\n .target-tips-box.expanded {\n .tips-toggle {\n transform: rotate(180deg);\n }\n\n .tips-content {\n display: block;\n }\n }\n\n // Tips content (hidden by default)\n .tips-content {\n display: none;\n padding: 0 $es-spacing-lg $es-spacing-lg;\n }\n\n // Tips grid layout\n .tips-grid {\n display: grid;\n gap: $es-spacing-md;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n }\n\n // Individual tip item\n .tip-item {\n display: flex;\n gap: $es-spacing-md;\n padding: $es-spacing-md;\n background: $es-white;\n border-radius: $es-radius-md;\n border: 1px solid $es-border-color;\n }\n\n // Tip icon\n .tip-icon {\n flex-shrink: 0;\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n background: $es-primary-light;\n border-radius: $es-radius-md;\n color: $es-primary;\n font-size: $es-font-size-sm;\n }\n\n // Tip text content\n .tip-text {\n flex: 1;\n min-width: 0;\n\n strong {\n display: block;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-700;\n margin-bottom: 0.25rem;\n }\n\n p {\n font-size: 11px;\n color: $es-text-muted;\n line-height: 1.625;\n margin: 0;\n }\n }\n\n // Tips footer\n .tips-footer {\n margin-top: $es-spacing-md;\n padding: 0.625rem $es-spacing-md;\n background: $es-white;\n border-radius: $es-radius-md;\n border: 1px dashed $es-gray-300;\n font-size: 11px;\n color: $es-text-muted;\n line-height: 1.625;\n\n i {\n color: $es-primary;\n margin-right: 0.25rem;\n }\n }\n}\n","/**\n * Condition Trait Base Styles\n * Shared styling for all condition trait components\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Base condition trait container\n.condition-trait {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n margin-bottom: $es-spacing-lg;\n\n &:last-child {\n margin-bottom: 0;\n }\n}\n\n// Collapsed state\n.condition-trait.collapsed {\n .condition-trait-header {\n border-bottom-color: transparent;\n border-radius: $es-radius-lg;\n }\n\n .collapse-icon {\n transform: rotate(180deg);\n }\n}\n\n// =============================================================================\n// Trait Header\n// =============================================================================\n\n.condition-trait-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-lg;\n flex-wrap: wrap;\n padding: 0.875rem $es-spacing-lg;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n }\n}\n\n.trait-header-left {\n display: flex;\n align-items: center;\n gap: $es-spacing-md;\n min-width: 0;\n flex: 1;\n}\n\n.trait-icon {\n font-size: 1.125rem;\n color: $es-text-muted;\n flex-shrink: 0;\n}\n\n.trait-title-group {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n}\n\n.trait-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-800;\n white-space: nowrap;\n}\n\n.trait-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n// Schedule summary (shows current config at a glance)\n.trait-summary {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.25rem 0.625rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n background: rgba($es-primary, 0.08);\n border-radius: $es-radius-full;\n white-space: nowrap;\n margin-left: $es-spacing-md;\n flex-shrink: 0;\n max-width: 320px;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:empty {\n display: none;\n }\n}\n\n.trait-header-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-md;\n flex-shrink: 0;\n margin-left: auto;\n}\n\n.trait-header-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n}\n\n// Collapse icon\n.collapse-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.5rem;\n height: 1.5rem;\n font-size: $es-font-size-sm;\n color: $es-text-muted;\n cursor: pointer;\n transition: all 0.2s;\n border-radius: $es-radius-sm;\n background: transparent;\n\n &:hover {\n color: $es-primary;\n background: rgba($es-primary, 0.08);\n }\n}\n\n// Show all toggle\n.trait-show-all-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n font-size: $es-font-size-xs;\n color: $es-primary;\n cursor: pointer;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n// Trait total count badge (global fallback)\n.trait-total-count {\n @include count-badge($es-primary);\n}\n\n// Required indicator\n.trait-required {\n color: $es-danger;\n font-size: $es-font-size-xs;\n}\n\n// Validation error\n.trait-validation-error {\n color: $es-danger;\n font-size: $es-font-size-xs;\n margin-top: 0.25rem;\n}\n\n// Trait toggle button\n.trait-toggle {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-50;\n border-color: $es-gray-300;\n }\n\n &.active {\n color: $es-primary;\n border-color: $es-primary;\n background: $es-primary-light;\n }\n}\n\n// =============================================================================\n// Trait Body\n// =============================================================================\n\n.condition-trait-body {\n padding: $es-spacing-lg;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n background: $es-white;\n animation: slideDown 0.2s ease-out;\n}\n\n// Condition trait collapsed - hide body\n.condition-trait.collapsed .condition-trait-body {\n display: none;\n}\n\n// =============================================================================\n// Section Styles\n// =============================================================================\n\n.schedule-section,\n.context-section {\n margin-bottom: 1.25rem;\n padding-bottom: 1.25rem;\n border-bottom: 1px solid $es-slate-100;\n\n &:last-child {\n margin-bottom: 0;\n padding-bottom: 0;\n border-bottom: 0;\n }\n}\n\n.section-label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 13px;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-600;\n margin-bottom: $es-spacing-md;\n\n i {\n font-size: $es-font-size-sm;\n color: $es-slate-400;\n margin-right: 0.25rem;\n }\n}\n\n.section-content {\n // Container for section content\n}\n\n.section-hint {\n margin-top: 0.5rem;\n font-size: 11px;\n color: $es-slate-400;\n}\n\n// =============================================================================\n// Full-width Form Group Override\n// =============================================================================\n\n.form-group.condition-trait-fullwidth {\n display: block !important;\n\n > .control-label {\n display: none !important;\n }\n\n > .col-lg-8,\n > .col-lg-8.col-lg-offset-3 {\n width: 100% !important;\n max-width: 100% !important;\n flex: 0 0 100% !important;\n padding-left: $es-spacing-lg !important;\n padding-right: $es-spacing-lg !important;\n margin: 0 !important;\n margin-left: 0 !important;\n }\n}\n\n// Condition traits group label\n.condition-traits-group-label {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-700;\n margin-bottom: $es-spacing-md;\n}\n\n.condition-traits-wrapper {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-md;\n}\n\n// =============================================================================\n// Collapse Header (form-content layout)\n// =============================================================================\n\n.entity-selector-collapse-header {\n padding: 0;\n margin-bottom: $es-spacing-sm;\n\n .btn-collapse-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0;\n background: none;\n border: none;\n color: $es-primary;\n font-size: $es-font-size-sm;\n cursor: pointer;\n transition: color $es-transition-fast;\n\n &:hover {\n color: $es-primary-hover;\n }\n\n .collapse-icon {\n font-size: 1.25rem;\n transition: transform 0.2s;\n }\n\n .collapse-label {\n font-weight: $es-font-weight-medium;\n }\n }\n}\n\n// When collapsed, rotate icon\n.condition-trait.collapsed .entity-selector-collapse-header {\n .collapse-icon {\n // Icon already shows expand_more when collapsed\n }\n}\n\n// =============================================================================\n// Animations\n// =============================================================================\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n","/**\n * Combination Attributes Picker Component\n * Product attribute combination selection styles\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Main container\n .combination-attributes-picker {\n display: flex;\n flex-direction: column;\n gap: 0.625rem;\n }\n\n // Mode toggle (Any/All)\n .combination-mode-toggle {\n display: inline-flex;\n gap: 0.25rem;\n padding: 0.125rem;\n background: $es-slate-100;\n border-radius: $es-radius-md;\n margin-bottom: 0.5rem;\n }\n\n .combination-mode-option {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n cursor: pointer;\n font-size: 11px;\n color: $es-text-muted;\n padding: 0.25rem 0.625rem;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n input[type=\"radio\"] {\n display: none;\n }\n\n .mode-label {\n user-select: none;\n }\n\n &:hover {\n color: $es-primary;\n background: rgba($es-primary, 0.1);\n }\n\n &:has(input[type=\"radio\"]:checked) {\n background: $es-primary;\n color: $es-white;\n font-weight: $es-font-weight-medium;\n }\n }\n\n // Groups container\n .combination-groups-container {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n }\n\n // Loading/Empty/Error states\n .combination-loading,\n .combination-empty,\n .combination-error {\n color: $es-text-muted;\n font-style: italic;\n padding: 0.5rem;\n }\n\n .combination-error {\n color: $es-danger;\n }\n\n // Section header\n .combinations-section {\n margin-bottom: $es-spacing-md;\n }\n\n .combinations-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: $es-spacing-sm;\n }\n\n .combinations-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n }\n\n .combinations-help {\n font-size: 11px;\n color: $es-slate-400;\n }\n\n // Toggle combinations button\n .btn-toggle-combinations {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-primary;\n background: transparent;\n border: 1px solid $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n\n .btn-remove-combinations {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-danger;\n background: transparent;\n\n &:hover {\n text-decoration: underline;\n }\n }\n\n // =============================================================================\n // Attribute Group\n // =============================================================================\n\n .comb-attr-group {\n flex: none;\n min-width: 120px;\n max-width: 200px;\n background: $es-white;\n border: 1px solid $es-gray-300;\n border-radius: $es-radius-sm;\n overflow: hidden;\n\n &.has-selections {\n border-color: $es-primary;\n }\n }\n\n .comb-attr-group-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.375rem 0.625rem;\n background: $es-slate-100;\n border-bottom: 1px solid $es-gray-300;\n font-weight: $es-font-weight-semibold;\n font-size: $es-font-size-xs;\n color: $es-slate-800;\n\n .comb-attr-group.has-selections & {\n background: $es-cyan-50;\n border-bottom-color: $es-cyan-200;\n }\n }\n\n .comb-attr-group-name {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .comb-attr-group-count {\n flex-shrink: 0;\n min-width: 18px;\n height: 18px;\n padding: 0 0.25rem;\n background: $es-gray-300;\n border-radius: $es-radius-full;\n font-size: 11px;\n font-weight: $es-font-weight-semibold;\n line-height: 18px;\n text-align: center;\n color: $es-text-muted;\n\n .comb-attr-group.has-selections & {\n background: $es-primary;\n color: $es-white;\n }\n }\n\n // Toolbar\n .comb-attr-toolbar {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.375rem;\n background: $es-slate-50;\n border-bottom: 1px solid $es-slate-100;\n }\n\n .comb-toolbar-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n padding: 0;\n background: $es-white;\n border: 1px solid $es-gray-300;\n border-radius: $es-radius-sm;\n color: $es-text-muted;\n cursor: pointer;\n font-size: $es-font-size-xs;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-slate-400;\n color: $es-slate-800;\n }\n }\n\n .comb-attr-search {\n flex: 1;\n min-width: 60px;\n padding: 0.125rem 0.375rem;\n border: 1px solid $es-gray-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n outline: none;\n\n &:focus {\n border-color: $es-primary;\n }\n\n &::placeholder {\n color: $es-slate-400;\n }\n }\n\n // Values container\n .comb-attr-values {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n padding: 0.375rem;\n max-height: 150px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n .comb-attr-loading,\n .comb-attr-empty,\n .comb-attr-error {\n width: 100%;\n text-align: center;\n color: $es-slate-400;\n font-size: 11px;\n padding: 0.25rem;\n }\n\n .comb-attr-error {\n color: $es-danger;\n }\n\n // Individual value\n .comb-attr-value {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.125rem 0.5rem;\n background: $es-white;\n border: 1px solid $es-slate-400;\n border-radius: 0.75rem;\n font-size: 11px;\n color: $es-slate-600;\n cursor: pointer;\n transition: all $es-transition-fast;\n white-space: nowrap;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-text-muted;\n }\n\n &.selected {\n background: $es-primary;\n border-color: $es-primary-hover;\n color: $es-white;\n\n &:hover {\n background: $es-primary-hover;\n border-color: color.adjust($es-primary-hover, $lightness: -5%);\n }\n }\n }\n\n .comb-attr-value-count {\n font-size: 9px;\n color: $es-slate-400;\n background: $es-slate-100;\n padding: 1px 0.25rem;\n border-radius: 0.5rem;\n min-width: 14px;\n text-align: center;\n\n .comb-attr-value.selected & {\n color: $es-white;\n background: rgba(255, 255, 255, 0.3);\n }\n }\n\n // =============================================================================\n // Combination Conditions (Row-based)\n // =============================================================================\n\n .combination-conditions-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .combination-condition-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-slate-50;\n border-radius: $es-radius-sm;\n }\n\n .combination-group-select,\n .combination-values-select {\n flex: 1;\n min-width: 120px;\n }\n\n .combination-equals {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n padding: 0 0.25rem;\n }\n\n .btn-add-combination-condition {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n background: transparent;\n border: 1px dashed $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n .btn-remove-combination-row {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-danger, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n","/**\n * Method Dropdown Component\n * Custom select dropdown with icons for method selection\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Method dropdown trigger button\n .method-dropdown-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n height: 36px;\n padding: 0 $es-spacing-md;\n border-radius: $es-radius-md;\n background: $es-white;\n color: $es-slate-800;\n font-size: $es-font-size-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n min-width: 180px;\n max-width: 320px;\n border: 1px solid $es-border-color;\n\n &:hover {\n background: $es-slate-50;\n border-color: $es-gray-300;\n }\n\n &:focus,\n &:active {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 3px rgba($es-primary, 0.1);\n }\n }\n\n .method-trigger-icon {\n font-size: $es-font-size-sm;\n color: $es-text-muted;\n flex-shrink: 0;\n width: 18px;\n text-align: center;\n }\n\n .method-trigger-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: $es-font-weight-medium;\n }\n\n .method-trigger-caret {\n font-size: $es-font-size-xs;\n color: $es-slate-400;\n flex-shrink: 0;\n margin-left: auto;\n }\n\n // Locked state\n .selector-locked .method-dropdown-trigger {\n background: $es-slate-100;\n color: $es-slate-400;\n cursor: not-allowed;\n border-color: $es-border-color;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-border-color;\n }\n }\n\n // Method selector wrapper\n .method-selector-wrapper {\n position: relative;\n }\n\n // Hidden select (for form submission)\n .method-select-hidden {\n position: absolute !important;\n opacity: 0 !important;\n pointer-events: none !important;\n width: 0 !important;\n height: 0 !important;\n overflow: hidden !important;\n }\n}\n\n// Global fallback for hidden method selects\n.method-select-hidden {\n position: absolute !important;\n opacity: 0 !important;\n pointer-events: none !important;\n width: 0 !important;\n height: 0 !important;\n overflow: hidden !important;\n}\n\n// =============================================================================\n// Method Dropdown Menu (appended to body, outside trait wrappers)\n// =============================================================================\n\n.method-dropdown-menu {\n position: absolute;\n z-index: $es-z-dropdown + 1;\n min-width: 200px;\n max-width: 360px;\n max-height: 400px;\n overflow-y: auto;\n background: $es-white;\n border-radius: $es-radius-lg;\n padding: 0.375rem 0;\n border: 1px solid $es-border-color;\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15);\n animation: methodDropdownFadeIn 0.15s ease;\n @include custom-scrollbar;\n}\n\n@keyframes methodDropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n// Method dropdown item\n.method-dropdown-item {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: 0.5rem $es-spacing-md;\n cursor: pointer;\n transition: background-color 0.1s;\n position: relative;\n\n &:hover {\n background: $es-slate-100;\n }\n\n &.selected {\n background: rgba($es-primary, 0.08);\n }\n\n .method-item-icon {\n font-size: $es-font-size-sm;\n color: $es-text-muted;\n width: 18px;\n text-align: center;\n flex-shrink: 0;\n }\n\n &.selected .method-item-icon {\n color: $es-primary;\n }\n\n .method-item-label {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-slate-700;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n &.selected .method-item-label {\n color: $es-cyan-700;\n font-weight: $es-font-weight-medium;\n }\n\n .method-item-check {\n font-size: $es-font-size-xs;\n flex-shrink: 0;\n margin-left: auto;\n color: $es-primary;\n }\n}\n\n// Method dropdown optgroup\n.method-dropdown-optgroup {\n margin-top: 0.25rem;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.method-optgroup-label {\n padding: 0.5rem $es-spacing-md;\n font-size: 11px;\n font-weight: $es-font-weight-semibold;\n color: $es-text-muted;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n background: $es-slate-50;\n border-top: 1px solid $es-slate-100;\n border-bottom: 1px solid $es-slate-100;\n\n .method-dropdown-optgroup:first-child & {\n border-top: 0;\n }\n}\n\n.method-optgroup-items {\n padding: 0.25rem 0;\n\n .method-dropdown-item {\n padding-left: $es-spacing-lg;\n }\n}\n\n// Method info placeholder\n.method-info-placeholder {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n font-style: italic;\n}\n","/**\n * Tooltip Component\n * Info tooltips for method help\n */\n\n@use '../variables' as *;\n\n// =============================================================================\n// Info Wrapper (tooltip trigger)\n// =============================================================================\n\n.mpr-info-wrapper {\n display: inline-flex;\n align-items: center;\n position: relative;\n cursor: help;\n vertical-align: middle;\n margin-left: 0.25rem;\n\n .material-icons {\n font-size: 16px;\n color: $es-text-muted;\n transition: color 0.15s ease;\n }\n\n &:hover .material-icons {\n color: $es-primary;\n }\n}\n\n// =============================================================================\n// Fixed Tooltip (appended to body on hover)\n// =============================================================================\n\n.mpr-tooltip-fixed {\n position: fixed;\n background: $es-white;\n color: $es-slate-800;\n padding: $es-spacing-md $es-spacing-lg;\n border-radius: $es-radius-md;\n font-size: 13px;\n line-height: 1.5;\n white-space: normal;\n z-index: 10500;\n max-width: 320px;\n min-width: 180px;\n text-align: left;\n box-shadow: rgba(0, 0, 0, 0.12) 0px 1px 1px 0px,\n rgba(64, 68, 82, 0.16) 0px 0px 0px 1px,\n rgba(64, 68, 82, 0.08) 0px 2px 5px 0px;\n pointer-events: none;\n\n // Pinned tooltip allows interaction\n &.pinned {\n pointer-events: auto;\n padding-right: $es-spacing-xl + 1rem;\n }\n\n strong {\n display: block;\n margin-bottom: 0.375rem;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n }\n\n p {\n margin: 0;\n color: $es-text-secondary;\n }\n\n ul {\n margin: 0.5rem 0 0;\n padding-left: 1.25rem;\n\n li {\n margin: 0.25rem 0;\n color: $es-text-secondary;\n }\n }\n}\n\n// Close button for pinned tooltips\n.mpr-tooltip-close {\n position: absolute;\n top: 0.375rem;\n right: 0.375rem;\n padding: 0.125rem;\n border: none;\n background: transparent;\n cursor: pointer;\n border-radius: $es-radius-sm;\n line-height: 1;\n transition: background-color 0.15s ease;\n\n .material-icons {\n font-size: 16px;\n color: $es-text-muted;\n }\n\n &:hover {\n background: $es-slate-100;\n\n .material-icons {\n color: $es-slate-700;\n }\n }\n}\n","/**\n * Category Tree Component\n * Hierarchical tree view for category selection inside dropdown\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Category tree container (inside dropdown)\n.category-tree {\n display: flex;\n flex-direction: column;\n}\n\n// Tree toolbar inside dropdown\n.category-tree .tree-toolbar {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-sm;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-light;\n flex-shrink: 0;\n\n .btn-expand-all,\n .btn-collapse-all {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: $es-spacing-xs $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-slate-300;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n\n// Tree items container\n.category-tree .tree-items {\n padding: 0;\n}\n\n// Tree item\n.tree-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-sm;\n cursor: pointer;\n transition: background $es-transition-fast;\n border-radius: 0;\n\n &:hover {\n background: $es-slate-100;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .tree-name {\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n }\n\n .tree-checkbox {\n color: $es-primary;\n\n i {\n opacity: 1;\n }\n }\n }\n\n &.inactive {\n opacity: 0.6;\n\n .tree-name {\n font-style: italic;\n }\n }\n\n &.filtered-out {\n display: none;\n }\n\n &.filter-match {\n background: $es-warning-light;\n\n &.selected {\n background: $es-primary-light;\n }\n }\n}\n\n// All tree element styles nested under .category-tree for specificity\n.category-tree {\n // Tree indentation\n .tree-indent {\n flex-shrink: 0;\n }\n\n // Tree toggle (expand/collapse)\n .tree-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n color: $es-text-secondary;\n flex-shrink: 0;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n cursor: pointer;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n\n &.tree-leaf {\n cursor: default;\n visibility: hidden;\n\n &:hover {\n background: transparent;\n }\n }\n\n i {\n font-size: 10px;\n transition: transform $es-transition-fast;\n }\n }\n\n .tree-item.collapsed > .tree-toggle i {\n transform: rotate(-90deg);\n }\n\n // Tree checkbox indicator - 12x12 to match PrestaShop admin standards\n .tree-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n flex-shrink: 0;\n border: 1px solid $es-border-color;\n border-radius: 2px;\n background: $es-white;\n\n i {\n font-size: 8px;\n opacity: 0;\n color: $es-white;\n transition: opacity $es-transition-fast;\n }\n }\n\n .tree-item.selected .tree-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n opacity: 1;\n }\n }\n\n // Tree icon\n .tree-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n color: $es-text-muted;\n flex-shrink: 0;\n\n i {\n font-size: 12px; // match visual weight of other icons\n }\n }\n\n .tree-item.selected .tree-icon {\n color: $es-primary;\n }\n\n // Tree name\n .tree-name {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n // Tree product/page count with preview\n .tree-count {\n @include count-badge($es-primary);\n height: 18px;\n min-width: 18px;\n padding: 0 $es-spacing-sm;\n\n i {\n font-size: 10px;\n }\n\n &.clickable {\n &.loading {\n pointer-events: none;\n\n i {\n animation: spin 1s linear infinite;\n }\n }\n\n &.popover-open {\n background: color.adjust($es-primary, $lightness: -10%);\n }\n }\n }\n\n // Select children button - positioned on the left next to toggle\n .btn-select-children {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n opacity: 0.3;\n transition: all $es-transition-fast;\n flex-shrink: 0;\n\n i {\n font-size: 14px; // larger to visually match other icons\n }\n\n &:hover {\n color: $es-primary;\n opacity: 1;\n }\n }\n\n .tree-item:hover .btn-select-children {\n opacity: 0.6;\n }\n\n // Tree badge (inactive, etc.)\n .tree-badge {\n display: inline-flex;\n align-items: center;\n padding: 0.125rem $es-spacing-xs;\n font-size: 9px;\n font-weight: $es-font-weight-semibold;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n\n &.inactive {\n color: $es-warning;\n background: $es-warning-light;\n }\n }\n\n // Tree children container\n .tree-children {\n display: block;\n\n &.filter-expanded {\n display: block !important;\n }\n }\n\n .tree-item.collapsed + .tree-children {\n display: none;\n }\n\n // Filtering - must be inside .category-tree for specificity\n .tree-item.filtered-out {\n display: none !important;\n }\n} // end .category-tree\n\n// Loading/empty/error states\n.category-tree .tree-loading,\n.category-tree .dropdown-empty,\n.category-tree .dropdown-error {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n margin-right: $es-spacing-sm;\n }\n}\n\n.category-tree .dropdown-error {\n color: $es-danger;\n}\n\n// Tree view mode in dropdown\n.target-search-dropdown.view-tree {\n .dropdown-results {\n padding: 0;\n }\n\n .category-tree {\n max-height: 100%;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n .tree-items {\n max-height: calc(100% - 40px);\n overflow-y: auto;\n @include custom-scrollbar;\n }\n}\n","/**\n * Validation Toast Component\n * Error notifications for selection conflicts\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Validation error toast\n.es-validation-toast {\n display: flex;\n align-items: flex-start;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n background: $es-white;\n border: 1px solid $es-danger;\n border-left: 4px solid $es-danger;\n border-radius: $es-radius-md;\n box-shadow: $es-shadow-lg;\n max-width: 400px;\n animation: es-toast-slide-in 0.2s ease-out;\n\n .es-toast-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-danger;\n flex-shrink: 0;\n\n i {\n font-size: 18px;\n }\n }\n\n .es-toast-content {\n flex: 1;\n min-width: 0;\n }\n\n .es-toast-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-danger;\n margin-bottom: 2px;\n }\n\n .es-toast-message {\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n line-height: 1.4;\n }\n\n .es-toast-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-primary;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n\n@keyframes es-toast-slide-in {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["main.scss","_variables.scss","../../../prestashop-admin/assets/scss/_variables.scss","_mixins.scss","layouts/_form-integration.scss","layouts/_responsive.scss","components/_entity-selector.scss","components/_entity-item.scss","components/_dropdown.scss","components/_chips.scss","components/_groups.scss","components/_value-picker.scss","components/_modal.scss","components/_list-preview.scss","components/_schedule.scss","components/_tips.scss","components/_condition-trait.scss","components/_combinations.scss","components/_method-dropdown.scss","components/_tooltip.scss","components/_tree.scss","components/_validation.scss"],"names":[],"mappings":"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;EACA,OJjJC;;AIqJL;AAAA;EACI;EACA,YL5JG;EK6JH;;AAIJ;AAAA;EACI;EACA;EACA;EACA;EACA,YL/HO;EKgIP;;AAGJ;AAAA;EACI;EACA;EACA;EACA,KL9FQ;EK+FR;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OJnLI;EIoLJ,WLvDU;EKwDV,aLnDgB;EKoDhB;EACA;;AAEA;AAAA;EACI,YLrJG;EKsJH,OLjJG;;AKoJP;AAAA;EACI,YLlMD;EKmMC,qBL9IE;EK+IF,OJlMF;;AIqMF;AAAA;EACI,WLxEM;;AK2EV;AAAA;EACI;;AAGJ;AAAA;EH5CJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YDxKM;ECyKN,OF3KO;EE4KP,WF7Cc;EE8Cd,aFvCsB;EEwCtB,eFjFa;EEkFb;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;;AAEA;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA;;AAKR;AAAA;AAAA;EAEI,YFtKO;EEuKP;;AAEA;AAAA;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;EACA;;AAGJ;AAAA;EACI;;AAGJ;AAAA;EACI,aFpGc;;AK4Ed;AAAA;EHhDJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YFhIW;EEiIX,OF3KO;EE4KP,WF7Cc;EE8Cd,aFvCsB;EEwCtB,eFjFa;EEkFb;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;;AAEA;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA;;AAKR;AAAA;AAAA;EAEI,YFtKO;EEuKP;;AAEA;AAAA;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;EACA;;AAGJ;AAAA;EACI;;AAGJ;AAAA;EACI,aFpGc;;AKkFlB;AAAA;EACI;EACA;EACA,YLrLO;EKsLP;EACA;;AAEA;AAAA;EACI;EACA;EACA;;AAKR;AAAA;EACI;EACA;EACA;EACA;EACA,YLtMO;EKuMP;EACA,OL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OoOpB;AAAA;EACI;EACA;EACA;EACA,KP7RQ;EO8RR,SP3RQ;EO4RR,ON5WI;EM6WJ,WPhPU;;AOkPV;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;EACA;EACA;EACA,KP9SQ;EO+SR,SP5SQ;EO6SR;EACA,ON9XI;;AMgYJ;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA,WP1QM;;AO+Qd;AAAA;EACI;EACA;EACA;EACA,SPhUQ;EOiUR,ONjZI;;AMmZJ;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;EACA;EACA,KN1aC;EM2aD;EACA,YP7XM;EO8XN;EACA;;AAIJ;AAAA;EACI;EACA;EACA,KP7VQ;EO8VR,WP9SU;EO+SV,ON3aI;;AM6aJ;AAAA;EACI,ON9aA;;AMibJ;AAAA;AAAA;AAAA;EAEI;EACA;EACA;EACA,eNhaO;EMiaP;EACA;EACA,WP7TM;EO8TN,OP5ZE;EO6ZF;EACA;;AAEA;AAAA;AAAA;AAAA;EACI,cNhcN;;AMmcE;AAAA;AAAA;AAAA;EACI;EACA,cNrcN;;AMycF;AAAA;EACI,ONzcA;;AM2cA;AAAA;EACI,OP9aF;EO+aE,aP1UU;;AO8UlB;AAAA;ELrbJ;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AK4aA;AAAA;EAEI;EACA,WPxVM;EOyVN,ONtdF;EMudE;EACA,eNjcO;EMkcP;;AAEA;AAAA;EACI,YPxdG;;AO8df;AAAA;EACI;EACA;EACA,KPvZQ;;AO0ZZ;AAAA;EL3cA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AKkcJ;AAAA;EAEI;EACA;EACA;EACA;EACA,WPjXU;EOkXV,aP5WgB;EO6WhB,eNzdW;EM0dX;;AAEA;AAAA;EACI;EACA;EACA;EACA;EACA,aPtXY;;AOyXhB;AAAA;EACI,OP7dE;EO8dF,YP/fD;EOggBC;;AAEA;AAAA;EACI,YP5dD;EO6dC,cPteF;;AO0eN;AAAA;AAAA;EAEI,OP1gBD;EO2gBC,YNzgBF;EM0gBE;;AAEA;AAAA;AAAA;EACI,YP1gBG;EO2gBH,cP3gBG;;AO8gBP;AAAA;AA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P;EACA,eDjDe;ECkDf,YFyBW;EOqwBX;EACA;EACA;;AAEA;AAAA;EACI;;AAIJ;AAAA;EACI;EACA;EACA,KPtyBQ;EOuyBR,SNh4BC;EMi4BD,YNh3BA;EMi3BA;EACA;EACA;;AAGJ;AAAA;EACI,WP/vBU;EOgwBV,aP1vBkB;EO2vBlB,OP91BM;EO+1BN;;AAGJ;AAAA;EACI;EACA;EACA,KPzzBQ;EO0zBR;EACA;EACA;;AAGJ;AAAA;AAAA;AAAA;EL/2BA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;EACI;;AKs2BJ;AAAA;AAAA;AAAA;EAGI;EACA;EACA;EACA;EACA,WPtxBU;EOuxBV,OPr3BM;EOs3BN,YPv5BG;EOw5BH;EACA,eNh4BW;EMi4BX;EACA;;AAEA;AAAA;AAAA;AAAA;EACI,YPl4BE;EOm4BF,cPt3BG;;AOy3BP;AAAA;AAAA;AAAA;EACI;EACA;EACA,YP93BG;EO+3BH;EACA,ONp6BA;;AMw6BR;AAAA;EACI;EACA;;AAIJ;AAAA;EL/0BA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;AOk5BV;AAAA;EAEI;EACA,WPrzBU;EOszBV;EACA;EACA;EACA;;AAGJ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ONl8BI;EMm8BJ,YPt8BG;EOu8BH;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AAGJ;AAAA;EACI,YPr7BE;EOs7BF,OP/6BE;;AOk7BN;AAAA;EACI,YPh9BO;EOi9BP,cNr9BF;EMs9BE,ONt9BF;;AM09BN;AAAA;EL13BA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;AO67BV;AAAA;EAEI;EACA,WPh2BU;EOi2BV;EACA;;AAGJ;AAAA;AAAA;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ON5+BI;EM6+BJ,YPh/BG;EOi/BH;EACA,eNz9BW;EM09BX;EACA;;AAEA;AAAA;AAAA;AAAA;EACI;;AAGJ;AAAA;AAAA;AAAA;EACI,YP/9BE;EOg+BF,OPz9BE;;AO49BN;AAAA;AAAA;AAAA;EACI,YP1/BO;EO2/BP,cN//BF;EMggCE,ONhgCF;;AMogCN;AAAA;EACI;EACA;;AAIA;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ONnhCA;EMohCA,YPvhCD;EOwhCC;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI,YPngCF;EOogCE,OP7/BF;;AOggCF;AAAA;EACI,YPthCE;EOuhCF,ONhiCP;EMiiCO,cNjiCP;;AMqiCD;AAAA;ELx8BJ;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;AO2gCN;AAAA;EAEI;EACA;EACA,WP/6BM;EOg7BN;;AAGJ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ONxjCA;EMyjCA,YP5jCD;EO6jCC;EACA;EACA;EACA;;AAEA;AAAA;EACI,YPviCF;EOwiCE,OPjiCF;;AOuiCV;AAAA;EACI;EACA,SNrlCC;EMslCD,YPviCM;EOwiCN;;AAEA;AAAA;EACI;;AAIR;AAAA;EACI;EACA;EACA,KPxgCQ;EOygCR;EACA,eP1gCQ;;AO4gCR;AAAA;EACI;;AAIR;AAAA;EACI;EACA;EACA;EACA,WPt+BU;EOu+BV,OPrkCM;EOskCN;;AAEA;AAAA;EACI;;AAIR;AAAA;EACI;EACA;EACA;;AAEA;AAAA;EACI,WPr/BM;EOs/BN,ONlnCA;;AMqnCJ;AAAA;AAAA;AAAA;ELthCJ;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;AAAA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;AAAA;AAAA;EACI,OFnFM;;AOylCN;AAAA;AAAA;AAAA;EAGI;EACA;EACA,WP9/BM;;AOigCV;AAAA;EACI,ON9nCA;;AMkoCR;AAAA;ELtmCA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AK6lCJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,ONzoCI;EM0oCJ,eNpnCW;EMqnCX;EACA;;AAEA;AAAA;EACI,YP1mCG;EO2mCH,OPhnCE;;AOqnCV;AAAA;EACI;EACA;EACA,KP3kCQ;;AO8kCZ;AAAA;EACI;EACA;EACA,KPjlCQ;EOklCR;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;EAGI;EACA;EACA;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAII,WPljCU;EOmjCV,ON/qCI;EMgrCJ;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;;AAIR;AAAA;EACI,ONxrCI;;AM2rCR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EL5lCA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACI,OFnFM;;AO+pCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWI;EACA;EACA,WP5kCU;;AO+kCd;AAAA;AAAA;AAAA;AAAA;AAAA;EL5mCA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;AAAA;AAAA;AAAA;AAAA;EACI,OFnFM;;AO+qCV;AAAA;AAAA;AAAA;AAAA;AAAA;EAII;EACA,WPplCU;EOqlCV;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;EAGI;EACA;EACA;;AAIJ;AAAA;ELjsCA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AKwrCJ;AAAA;EAEI;EACA;EACA;EACA;EACA,WPvmCU;EOwmCV,OPtsCM;EOusCN,YPxuCG;EOyuCH;EACA,eNjtCW;EMktCX;EACA;;AAEA;AAAA;EACI,YPntCE;EOotCF,cPvsCG;;AO0sCP;AAAA;EACI,YP9uCO;EO+uCP,cNnvCF;EMovCE,ONpvCF;;AMsvCE;AAAA;EACI,ONvvCN;;AM2vCF;AAAA;EACI,cN1vCF;EM2vCE;;AAEA;AAAA;EACI,ON9vCN;EM+vCM,aP7nCU;;AOioClB;AAAA;EACI,aPnoCY;;AOsoChB;AAAA;EACI,ONzwCA;EM0wCA;;AAKR;AAAA;AAAA;AAAA;AAAA;ELnvCA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;EACI;;AK0uCJ;AAAA;AAAA;AAAA;AAAA;EAEI;EACA;EACA;EACA;EACA,WPzpCU;EO0pCV,OPxvCM;EOyvCN,YPnvCO;EOovCP;EACA,eNnwCW;EMowCX;EACA;;AAEA;AAAA;AAAA;AAAA;EACI,YPzvCG;;AO4vCP;AAAA;AAAA;AAAA;EACI,YNnyCF;EMoyCE,OPtyCD;;AOizCP;AAAA;EACI;EACA;EACA,KPpuCQ;EOquCR,SPruCQ;EOsuCR,YPtzCG;EOuzCH;EACA,eN/xCW;;AMiyCX;AAAA;EACI;EACA;EACA;EACA;EACA;;AAGJ;AAAA;EACI,WPpsCM;EOqsCN,aP9rCc;EO+rCd,OPpyCE;EOqyCF;;AAGJ;AAAA;EL1yCJ;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AKiyCA;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA,ON90CA;EM+0CA,eNzzCO;;AM2zCP;AAAA;EACI,YP7yCD;EO8yCC,OPnzCF;;AOyzCV;AAAA;EACI,aPxtCgB;;AO2tCpB;AAAA;EACI;EACA,ON/1CI;EMg2CJ;;AAGJ;AAAA;AAAA;AAAA;EACI;;AAIJ;AAAA;EACI;EACA;EACA,eNr1CW;EMs1CX;;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEI;;AAIJ;AAAA;ELz1CJ;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AKg1CA;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,ON53CA;EM63CA,YPz1CG;EO01CH;EACA;EACA;EACA;;AAEA;AAAA;EACI;EACA,ONt4CN;;AMy4CE;AAAA;EACI,YN14CN;EM24CM,OP74CL;;AOg5CC;AAAA;EACI;;AAKR;AAAA;AAAA;AAAA;AAAA;AAAA;EAEI,eN/3CO;;AMm4CX;AAAA;EACI,mBN35CF;EM45CE;;AAGJ;AAAA;EACI,mBN95CF;EM+5CE;;AAKR;AAAA;EACI;EACA;;AL/yCJ;AAAA;EACI;EACA;;AAGJ;AAAA;EACI,YDzHA;EC0HA;;AAGJ;AAAA;EACI,YD/GO;ECgHP;;AAEA;AAAA;EACI,YF5GE;;AOg5CV;AAAA;EACI;EACA;EACA,KPl2CQ;EOm2CR,SPl2CQ;;AOq2CZ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI,YN57CF;EM67CE,cN77CF;;AMi8CN;AAAA;EACI;EACA;EACA;EACA;EACA,eN/6CW;EMg7CX,YPl6CO;;AOq6CX;AAAA;EACI;EACA;;AAGJ;AAAA;EACI,WPl1CU;EOm1CV,aP90CgB;EO+0ChB,OPj7CM;EEfV;EACA;EACA;;AKk8CA;AAAA;EACI,WP11CU;EO21CV,ONv9CI;ECiBR;EACA;EACA;;AKy8CA;AAAA;EACI;EACA;EACA;EACA,KN5+CC;EM6+CD;EACA,YP/7CM;EOg8CN;EACA;;AAGJ;AAAA;EACI;EACA;EACA,KP95CQ;EO+5CR,WP/2CU;EOg3CV,ON5+CI;;AM8+CJ;AAAA;EACI,ON/+CA;;AMk/CJ;AAAA;AAAA;AAAA;EAEI;EACA;EACA;EACA,eNj+CO;EMk+CP;EACA;EACA,WP93CM;EO+3CN,OP79CE;EO89CF;EACA;;AAEA;AAAA;AAAA;AAAA;EACI,cNjgDN;;AMogDE;AAAA;AAAA;AAAA;EACI;EACA,cNtgDN;;AM0gDF;AAAA;EACI,ON1gDA;;AM4gDA;AAAA;EACI,OP/+CF;EOg/CE,aP34CU;;AOg5CtB;AAAA;EACI;EACA;EACA,KPz8CQ;;AO48CZ;AAAA;EL7/CA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AKo/CJ;AAAA;EAEI;EACA;EACA;EACA;EACA,WPn6CU;EOo6CV,aP95CgB;EO+5ChB,eN3gDW;EM4gDX;EACA;;AAEA;AAAA;EACI;EACA;EACA;EACA;EACA,aPz6CY;;AO46ChB;AAAA;EACI,OPhhDE;EOihDF,YPljDD;EOmjDC;;AAEA;AAAA;EACI,YP/gDD;EOghDC,cPzhDF;;AO6hDN;AAAA;AAAA;EAEI,OP7jDD;EO8jDC,YN5jDF;EM6jDE;;AAEA;AAAA;AAAA;EACI,YP7jDG;EO8jDH,cP9jDG;;AOikDP;AAAA;AAAA;EACI;;AAKZ;AAAA;EACI,WP98CU;EO+8CV,ON3kDI;;AM+kDR;AAAA;ELnjDA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AK0iDJ;AAAA;EAEI;EACA;EACA;EACA;EACA,WPx9CU;EOy9CV,OPzlDG;EO0lDH,YNxlDE;EMylDF;EACA,eNnkDW;EMokDX;;AAEA;AAAA;EACI,YP3lDO;EO4lDP,cP5lDO;;AO+lDX;AAAA;EACI;;AAGJ;AAAA;EACI;EACA;EACA;EACA;EACA;;AAKR;AAAA;EACI;EACA;EACA,KPtiDQ;EOuiDR;EACA;;AAGJ;AAAA;AAAA;AAAA;AAAA;ELr4CA;EACA;EACA,KFxKY;EEyKZ;EACA,WF1Hc;EE2Hd,aFrHoB;EEsHpB,YF/NU;EEgOV,OF3NU;EE4NV,eFhKa;;AEkKb;AAAA;AAAA;AAAA;EAhOA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;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EACA;EACA;;AAEA;AAAA;EACI;;AMiqBJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,OP9sBE;EO+sBF,ePxrBW;EOyrBX;;AAEA;AAAA;EACI,YR/sBO;;AQktBX;AAAA;EACI;;AAKR;AAAA;EACI;EACA;EACA;EACA;EACA,OPhuBI;EOiuBJ,WRrmBU;EQsmBV;;AAEA;AAAA;EACI,OPluBF;;AOquBF;AAAA;EACI,OPxuBF;;AO2uBF;AAAA;EACI,aR1mBc;;AQ+mBtB;AAAA;EACI;EACA;EACA,KRzqBQ;;;AQirBhB;EACI;EACA;EACA;EACA;EACA,YRrwBO;EQswBP,eP5uBe;EO6uBf,YRjqBW;EQkqBX;;AAEA;EACI;EACA;EACA;EACA,KR9rBQ;EQ+rBR;EACA,YPxwBA;EOywBA;;AAGJ;EACI;EACA;EACA,KRvsBQ;EQwsBR,WRxpBU;EQypBV,aRnpBkB;EQopBlB,ORvvBM;;AQ0vBV;EACI;EACA;;AAGJ;ENnwBA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AM0vBJ;EAEI;EACA;EACA;EACA;EACA;EACA,OPtyBI;EOuyBJ,ePlxBQ;EOmxBR;;AAEA;EACI,YRtwBG;EQuwBH,OR9wBE;;AQixBN;EACI;;AAIR;EACI;EACA;EACA,SR1uBQ;;AE2CZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;AQiyBV;EACI;EACA;EACA;EACA,KRnvBQ;EQovBR;EACA,OPl0BI;EOm0BJ,WRtsBU;;AQwsBV;EACI;;AAGJ;EACI;;AAKR;EACI;EACA;EACA,OPl1BI;;AOo1BJ;EACI;EACA;EACA,eR1wBI;EQ2wBJ;;AAGJ;EACI;EACA,WRhuBM;;AQquBd;EACI;EACA;EACA,KRzxBQ;;AQ4xBZ;EACI;EACA;EACA,KPv3BC;EOw3BD;EACA,YR10BM;EQ20BN,ePz1BQ;EO01BR;;AAEA;EAEI,mBP/2BL;;AOk3BC;EACI,mBPp3BF;;AOu3BF;EAEI;;AAIR;EACI;EACA;;AAEA;EACI;EACA,WRzwBM;EQ0wBN,aRpwBc;EQqwBd,ORx2BE;;AQ22BN;EACI;EACA,WRjxBM;EQkxBN,OP94BA;;AOk5BR;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA,WRnyBU;EQoyBV,ORj4BM;EQk4BN;;AAGJ;EACI;EACA,aR11BQ;EQ21BR;EACA;EACA,aRxyBgB;EQyyBhB;EACA,YRv4BO;EQw4BP,OR/4BM;EQg5BN,ePx5BW;EOy5BX;;AAGJ;EACI,YP/7BC;EOg8BD,WRxzBU;EQyzBV,OPr7BI;EOs7BJ;;AAIJ;EACI;EACA;EACA,KRj3BQ;EQk3BR;EACA;EACA,YR75BM;;AQ+5BN;EACI;EACA,OPp8BA;;AOu8BJ;EACI;EACA;EACA;EACA,WR90BM;EQ+0BN,OR56BE;EQ66BF;EACA;;AAEA;EACI,OPj9BJ;;;AOw9BZ;EACI;IACI;;EAEJ;IACI;;;AAcI;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ePh+BG;EOi+BH;EACA;EACA,ORz9BF;EQ09BE;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;EACI,OP9/BR;EO+/BQ;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA,cPrgCV;EOsgCU;;AAKR;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA;EACA;EACA;EACA,ePz/BG;EO0/BH;EACA;EACA;EACA;EACA,ORt/BF;EQu/BE;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;EACI,cP5hCV;;AO+hCM;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA,cPjiCV;EOkiCU;;;ATnjCpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AUAA;AAAA;AAAA;AAAA;AAYI;AAAA;EACI,YTEG;ESDH;EACA,eR0BW;EQzBX;;AAIJ;AAAA;EACI;EACA;EACA;EACA,KRlBC;EQmBD;EACA,YRHA;EQIA;;AAGJ;AAAA;EACI;EACA;EACA,KT8DQ;ES7DR,WT6GU;ES5GV,aTkHkB;ESjHlB,OTcM;;ASZN;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA,YR5BF;EQ6BE,OT/BD;ESgCC,WT+FM;ES9FN,aTsGU;ESrGV,eT2DK;;ASvDb;AAAA;EACI;EACA;EACA,KTsCQ;;ASnCZ;AAAA;EPbA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOIJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,ORhDI;EQiDJ,eR3BW;EQ4BX;;AAEA;AAAA;EACI,YThBG;ESiBH,OTxBE;;AS2BN;AAAA;EACI,YT/CM;ESgDN,ORzDH;;AQ8DL;AAAA;AAAA;AAAA;EAEI,SR9EC;;AQkFL;AAAA;EACI,eRnFC;;AQsFL;AAAA;EACI;EACA;EACA,KTDQ;ESER,eTDQ;ESER,WT6CU;ES5CV,aTmDkB;ESlDlB;EACA;;AAEA;AAAA;EACI,OT7EM;;AS+EN;AAAA;EACI,ORvFN;;AQ2FF;AAAA;EACI,OR3FH;;AQ6FG;AAAA;EACI,OR9FP;;AQoGL;AAAA;EACI;EACA;EACA,KT5BQ;ES6BR,eT7BQ;;ASgCZ;AAAA;EACI;EACA;;AAGJ;AAAA;EPnBA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;ASsFV;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;AAAA;EPjGA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOwFJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,ORpII;EQqIJ,eT3CS;ES4CT;;AAEA;AAAA;EACI,YTrGG;ESsGH,OR3IF;;AQgJN;AAAA;EACI;;AAGJ;AAAA;EPvHA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AO8GJ;AAAA;EAEI;EACA;EACA,KT1EQ;ES2ER;EACA;EACA,YT7JG;ES8JH;EACA,eRvIQ;EQwIR,OR7JI;EQ8JJ,WTjCU;ESkCV;EACA;;AAEA;AAAA;EACI,cT7HG;;ASgIP;AAAA;EACI,cRxKF;EC4CN;EACA;;AO+HI;AAAA;EACI,OThJE;;ASqJV;AAAA;EACI;;AAGJ;AAAA;EPtFA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;ASyJV;AAAA;EAEI;;AAGJ;AAAA;EP9JA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOqJJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ORtME;EQuMF,eRhLW;EQiLX;;AAEA;AAAA;EACI,YTvMO;;AS4Mf;AAAA;EACI;EACA;EACA,KTrIQ;;ASwIZ;AAAA;EACI;EACA;EACA,KT3IQ;;AS8IZ;AAAA;EP5HA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;AS+LV;AAAA;EAEI;EACA;;AAGJ;AAAA;EACI,ORlOI;EQmOJ,WTtGU;;ASyGd;AAAA;EP1MA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOiMJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,OR7OI;EQ8OJ,eRxNW;EQyNX;;AAEA;AAAA;EACI,YTvOM;ESwON,ORjPH;;AQqPL;AAAA;EP3NA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOkNJ;AAAA;EAEI;EACA;EACA;EACA;EACA,OR9PE;EQ+PF,WTlIU;ESmIV,aT7HgB;ES8HhB,eR1OW;EQ2OX;;AAEA;AAAA;EACI,YTjQO;;ASsQf;AAAA;EACI;EACA;EACA,KThMQ;;ASmMZ;AAAA;EPnPA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AO0OJ;AAAA;EAEI;EACA;EACA;EACA;EACA,YTjPO;ESkPP,OTxPM;ESyPN,WT3JU;ES4JV,aTtJgB;ESuJhB;EACA,eThMS;ESiMT;;AAEA;AAAA;EACI,YTzPG;;AS4PP;AAAA;EACI,YT/RO;ESgSP,ORpSF;EQqSE,cRrSF;;AQ0SN;AAAA;EACI,YRtTC;EQuTD,aRvTC;EQwTD;;AAIJ;AAAA;EACI;EACA;EACA,KTtOQ;;ASyOZ;AAAA;EACI;;AAGJ;AAAA;EP9RA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOqRJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,ORjUI;EQkUJ,eR5SW;EQ6SX;EACA;;AAEA;AAAA;EACI,YT5TM;ES6TN,ORtUH;;AQ0UL;AAAA;EPhTA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOuSJ;AAAA;EAEI;EACA;EACA;EACA,YTpQQ;ESqQR;EACA,ORjVC;EQkVD,WTxNU;ESyNV,aTnNgB;ESoNhB;EACA,eRjUW;EQkUX;;AAEA;AAAA;EACI,YThVM;;ASqVd;AAAA;EPpUA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AO2TJ;AAAA;EAEI;EACA;EACA;EACA;EACA,ORvWE;EQwWF,WT1OU;ES2OV,aTtOgB;ESuOhB;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AAGJ;AAAA;EACI;;AAKR;AAAA;EACI;EACA;EACA,KT/SQ;ESgTR,SRzYC;EQ0YD;;AAIJ;AAAA;EACI;;AAIJ;AAAA;EACI,SRpZC;;AQwZL;AAAA;EACI;EACA;EACA;EACA,SThUQ;ESiUR,ORjZI;EQkZJ,WTrRU;;ASyRd;AAAA;EACI,YT1ZG;ES2ZH;EACA,eRlYW;EQmYX,eRtaC;;AQwaD;AAAA;EACI;;AAIA;AAAA;EACI;;AAGJ;AAAA;EACI;;AAMZ;AAAA;EACI;EACA;EACA,KTlWQ;ESmWR;EACA,YR5aA;EQ6aA;EACA;EACA;;AAEA;AAAA;EACI;EACA;EACA;;AAIR;AAAA;EACI;EACA;EACA;EACA;EACA,ORlcI;;AQocJ;AAAA;EACI;;AAIR;AAAA;EACI;EACA;EACA;EACA,KThYQ;;ASmYZ;AAAA;EACI;EACA;EACA,WTtVU;ESuVV,aTjVkB;ESkVlB,OTrbM;ESsbN;EACA;EACA,eRlcW;EQmcX;;AAEA;AAAA;AAAA;EAEI,YTheD;ESieC,cR1cG;EQ2cH;;AAGJ;AAAA;EACI,ORneA;EQoeA,aTlWY;;ASsWpB;AAAA;EPxUA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YDxKM;ECyKN,OF3KO;EE4KP,WF7Cc;EE8Cd,aFvCsB;EEwCtB,eFjFa;EEkFb;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;;AAEA;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA;;AAKR;AAAA;AAAA;EAEI,YFtKO;EEuKP;;AAEA;AAAA;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;EACA;;AAGJ;AAAA;EACI;;AAGJ;AAAA;EACI,aFpGc;;ASwWlB;AAAA;EPhdA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOucJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,ORnfI;EQofJ,eR9dW;EQ+dX;;AAEA;AAAA;EACI,YT7eM;ES8eN,ORvfH;;AQ4fL;AAAA;EACI,eR3gBC;EQ4gBD,STnbQ;ESobR;EACA;EACA,eR9eQ;;AQifZ;AAAA;EACI;EACA;EACA,KT5bQ;;ASgcZ;AAAA;EACI;EACA;EACA,KTncQ;;ASscZ;AAAA;EACI;EACA;EACA;;AAGJ;AAAA;AAAA;AAAA;EAEI;EP5bJ;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;AAAA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;AAAA;AAAA;EACI,OFnFM;;AS6fV;AAAA;AAAA;AAAA;EAII;;AAKA;AAAA;EACI;EACA;;AAIR;AAAA;EACI;EACA;EACA;EACA;EACA;EACA,OR3iBE;EQ4iBF;;AAEA;AAAA;EACI;;AAGJ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA,YTjhBG;ESkhBH,OThkBD;ESikBC,WTlcM;ESmcN,aT9bY;ES+bZ;EACA,eR3iBO;EQ4iBP;;AAGJ;AAAA;EACI;;AAKR;AAAA;EACI,YRxlBC;;AQ2lBL;AAAA;EACI;EACA;EACA,KTrgBQ;ESsgBR;;AAGA;AAAA;AAAA;EAEI;EACA;EACA;EACA;;AAIR;AAAA;EACI;EACA;EACA;EACA;EACA,YTzlBU;ES0lBV,ORnmBC;EQomBD,WT1eU;ES2eV,aTpekB;ESqelB,eT9gBS;ES+gBT;EACA;;AAEA;AAAA;EACI;;AAIR;AAAA;EACI;EACA;EACA,KTviBQ;;AS0iBZ;AAAA;EACI;EACA;EACA,ST7iBQ;ES8iBR;EACA;EACA,eRxmBQ;;AQ2mBR;AAAA;EACI;EACA,YTrjBI;;ASyjBZ;AAAA;EACI;EACA;EACA;EACA,KT7jBQ;ES8jBR;;AAEA;AAAA;EACI;;AAIJ;AAAA;EACI;EACA;;AAIR;AAAA;EP5nBA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOmnBJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,OR/pBI;EQgqBJ,eR1oBW;EQ2oBX;;AAEA;AAAA;EACI,YTzpBM;ES0pBN,ORnqBH;;AQuqBL;AAAA;AAAA;AAAA;EP7oBA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;EACI;;AOooBJ;AAAA;AAAA;AAAA;EAGI;EACA;EACA;EACA,YTlmBQ;ESmmBR;EACA,OR/qBC;EQgrBD,WTtjBU;ESujBV,aTjjBgB;ESkjBhB;EACA;EACA,eRhqBW;EQiqBX;;AAEA;AAAA;AAAA;AAAA;EACI,YT/qBM;ESgrBN,cRzrBH;;AQ4rBD;AAAA;AAAA;AAAA;EACI;;AAMR;AAAA;EACI;EACA;EACA;EACA,KRrtBC;EQstBD;EACA;EACA,YTzqBM;ES0qBN;EACA;;AAGJ;AAAA;EACI;EACA;EACA;;AAMJ;AAAA;EACI;EACA;EACA,QALc;EAMd;EACA,WTnmBU;ESomBV;EACA;EACA,eR5sBW;;AQ8sBX;AAAA;EACI,cRtuBF;EQuuBE;;AAKR;AAAA;EACI;;AAEA;AAAA;EACI;;AAGJ;AAAA;EACI,QA3BU;EA4BV;EACA,WTznBM;ES0nBN;EACA;EACA;EACA;;AAEA;AAAA;EACI,cR7vBN;EQ8vBM;EACA;EACA;;AAIR;AAAA;EPvuBJ;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AO8tBA;AAAA;EAEI;EACA;EACA;EACA,OAhDU;EAiDV,QAjDU;EAkDV,OR1wBA;EQ2wBA,YTvuBG;ESwuBH;EACA;EACA;;AAEA;AAAA;EACI,YT5uBD;ES6uBC,OTpvBF;;ASuvBF;AAAA;EACI;;AAMZ;AAAA;EACI,QArEc;EAsEd;EACA,WTnqBU;ESoqBV;EACA,eR3wBW;EQ4wBX;;AAEA;AAAA;EACI,cRtyBF;EQuyBE;;AAIR;AAAA;EP9wBA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOqwBJ;AAAA;EAEI;EACA;EACA;EACA,OAvFc;EAwFd,QAxFc;EAyFd,ORjzBI;EQkzBJ;EACA,eR7xBW;EQ8xBX;;AAEA;AAAA;EACI,YTnxBG;ESoxBH,OT1xBE;;AS8xBV;AAAA;EACI;EACA;EACA;EACA;EACA,YT7xBO;ES8xBP,ORl0BI;EQm0BJ,WTvsBU;ESwsBV,aTlsBgB;ESmsBhB,eT3uBS;ES4uBT;;AAEA;AAAA;EACI;;AAEA;AAAA;EACI,YTz0BG;ES00BH,OR90BN;;AQo1BN;AAAA;EACI;EACA;EACA;EACA;EACA,ORx1BI;EQy1BJ,WT7tBU;ES8tBV,aTvtBkB;ESwtBlB;EACA;;AAEA;AAAA;AAAA;EAEI;EACA;EACA;EACA,YR/0BG;EQg1BH;;AAKR;AAAA;EACI;EACA;EACA,KRx3BC;EQy3BD,aRz3BC;EQ03BD,YR13BC;EQ23BD;;AAGJ;AAAA;EACI;EACA;EACA,KTxyBQ;;AS2yBZ;AAAA;EACI,WT7vBU;ES8vBV,aTxvBgB;ESyvBhB,OR33BI;EQ43BJ;;AAGJ;AAAA;EPhyBA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;ASm2BV;AAAA;EAEI;EACA;EACA,WTvwBU;;AS0wBd;AAAA;EPvyBA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;AS02BV;AAAA;EAEI;EACA;EACA,WT9wBU;ES+wBV;EACA;EACA;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;EACI;;AAGJ;AAAA;AAAA;AAAA;EACI;;AAGJ;AAAA;AAAA;AAAA;EACI;EACA;EACA;EACA;EACA;;AAGJ;AAAA;AAAA;AAAA;EACI;EACA;EACA;;AAGJ;AAAA;AAAA;AAAA;EACI;;AAKR;AAAA;EACI;EACA;EACA;EACA;EACA,YTn5BO;ESo5BP,ORx7BI;EQy7BJ,WT7zBU;ES8zBV,aTxzBgB;ESyzBhB,eTj2BS;ESk2BT;EACA;;AAEA;AAAA;EACI,YT35BG;;AS85BP;AAAA;EACI,YTj8BO;ESk8BP,ORt8BF;;AQ08BF;AAAA;EACI;EACA;;AAEA;AAAA;EACI;;AAGJ;AAAA;EACI;;AAIR;AAAA;EACI;;;AVz+BZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AWAA;AAAA;AAAA;AAAA;AAYI;AAAA;EACI;;AAEA;AAAA;AAAA;EAEI;;AAUR;AAAA;EACI;EACA;EACA;EACA,KVgEQ;EU/DR,SV8DQ;EU7DR,YVlBG;EUmBH;EACA,eTIQ;ESHR;;AAEA;AAAA;EACI,cTtBF;ESuBE;;AAKR;AAAA;EACI,YTxCC;;AS2CL;AAAA;EACI,OThCI;ESiCJ;EACA;EACA,aVyCQ;;AUrCZ;AAAA;AAAA;AAAA;ER2CA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;EACI;;AQnDJ;AAAA;AAAA;AAAA;EAGI;EACA;EACA;EACA;EACA;EACA,WV8EU;EU7EV,OVhBM;EUiBN;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;EACI,OTtDA;;ASyDJ;AAAA;AAAA;AAAA;EACI;EACA;EACA;;AAIR;AAAA;EACI;EACA;EACA;EACA,OTrEE;;ASuEF;AAAA;EACI;;AAKR;AAAA;ERhDA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AQuCJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA,OTrFE;ESsFF,YVlFW;EUmFX,eThEW;ESiEX;EACA;;AAEA;AAAA;EACI,YT5FF;ES6FE,OV/FD;;AUkGH;AAAA;EACI;;AAKR;AAAA;AAAA;AAAA;EAEI;EACA;EACA,KV7BQ;;AUgCZ;AAAA;AAAA;AAAA;ERbA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;AAAA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;AAAA;AAAA;EACI,OFnFM;;AUgFV;AAAA;AAAA;AAAA;EAGI;EACA,SVnCQ;EUoCR;EACA,WVWU;;AUTV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEI;EACA;;AAXR;AAAA;AAAA;AAAA;EAaI;;AAGJ;AAAA;EACI,OT7HI;ES8HJ,WVDU;EUEV,aVGgB;;AUApB;AAAA;ERtGA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AQ6FJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,OV5IG;EU6IH,YT3IE;ES4IF,eTtHQ;ESuHR;;AAEA;AAAA;EACI,YV7IO;;AUgJX;AAAA;EACI;;AAKR;AAAA;EACI;EACA;EACA,KV9EQ;;AUkFZ;AAAA;EACI;EACA;EACA,KVtFQ;;AUyFZ;AAAA;AAAA;AAAA;ERtEA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;AAAA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;AAAA;AAAA;EACI,OFnFM;;AUyIV;AAAA;AAAA;AAAA;EAGI;EACA,SV5FQ;EU6FR,WV7CU;;AUiDd;AAAA;EACI;EACA;EACA,KVrGQ;;AUwGZ;AAAA;ERxJA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AQ+IJ;AAAA;EAEI;EACA;EACA;EACA;EACA,OT1LI;ES2LJ;EACA;EACA;EACA,WVlEU;EUmEV,aV9DgB;EU+DhB;EACA;;AAEA;AAAA;EACI,OVtKE;EUuKF,cV9JG;EU+JH;;AAGJ;AAAA;EACI,OT3MF;ES4ME,YVxMO;EUyMP;EACA,aV3EY;;AU8EhB;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;;AAIR;AAAA;EACI;;AAIJ;AAAA;EACI;;AAGJ;AAAA;ERpIA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;AUuMV;AAAA;EAEI;EACA,WVzGU;EU0GV;;AAIJ;AAAA;EACI;EACA;EACA;EACA,YVxOW;EUyOX,OVxOU;EUyOV,eT5NQ;ES6NR,WVrHU;EUsHV,aVjHgB;;AUoHpB;AAAA;EACI;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAKR;AAAA;ERlGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YDxKM;ECyKN,OF3KO;EE4KP,WF7Cc;EE8Cd,aFvCsB;EEwCtB,eFjFa;EEkFb;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;;AAEA;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA;;AAKR;AAAA;AAAA;EAEI,YFtKO;EEuKP;;AAEA;AAAA;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;EACA;;AAGJ;AAAA;EACI;;AAGJ;AAAA;EACI,aFpGc;;AU8HlB;AAAA;EAEI,aVvLQ;;;AD/FhB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AYAA;AAAA;AAAA;AAAA;AAUA;EACI;EACA;EACA;EACA;EACA;EACA;EACA,SXmHS;EWlHT;EACA;;AAEA;EACI;;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YXrBO;EWsBP,eXsEW;EWrEX,YX+EW;EW9EX;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;;;AAKR;EACI;EACA;EACA;EACA,KVrEK;EUsEL;EACA,YVtDI;EUuDJ;EACA;;;AAGJ;EACI,WX6DgB;EW5DhB,aXiEsB;EWhEtB,OXnCU;EWoCV;;;AAGJ;ET3CI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;ASkCR;EAEI;EACA;EACA;EACA;EACA;EACA,OV9EQ;EU+ER,eV1DY;EU2DZ;;AAEA;EACI,YX9CO;EW+CP,OXtDM;;AWyDV;EACI,WXuCU;;;AWlClB;EACI;EACA;EACA,SXjBY;;AEyCZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;;AW0Ed;EACI;EACA;EACA;EACA,KX5BY;EW6BZ;EACA,YVtGI;EUuGJ;EACA;;;AAGJ;ETpFI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AS2ER;EAEI;EACA;EACA;EACA,KXzCY;EW0CZ;EACA,WXMc;EWLd,aXUoB;EWTpB,eVpGY;EUqGZ;;AAEA;EACI,OX/FM;EWgGN,YX1FO;;AW4FP;EACI,YX5FG;;AWgGX;EACI,OXzIG;EW0IH,YVxIE;;AU0IF;EACI,YXxIO;;AW4If;EACI,OXlJG;EWmJH,YV9IC;;AUgJD;EACI;;AAIR;EACI;EACA;;;AAMR;EACI;EACA;EACA;EACA,KXtFY;EWuFZ;EACA,YVhKI;EUiKJ;EACA;;;AAGJ;EACI,WX9Cc;EW+Cd,aXzCsB;EW0CtB,OX7IU;;;AWgJd;ETpJI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AS2IR;EAEI;EACA;EACA;EACA;EACA;EACA,OVvLQ;EUwLR,eVlKe;EUmKf;;AAEA;EACI,YXvJO;EWwJP,OX/JM;;;AWmKd;EACI;EACA;EACA,SXvHY;;AE2CZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;;AW6Kd;EACI;EACA;EACA;EACA,KX/HY;EWgIZ;EACA,YVzMI;EU0MJ;EACA;;;AAGJ;EACI,WXxFc;EWyFd,OVrNQ;;;AUwNZ;ET5LI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;ASmLR;EAEI;EACA;EACA;EACA;EACA,WXlGc;EWmGd,aX7FoB;EW8FpB,OVjOM;EUkON,eV3Me;EU4Mf;;AAEA;EACI,YXlOW;;;AWuOnB;EACI;EACA;EACA;EACA,YXjPO;EWkPP;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAQR;EACI;EACA;EACA;EACA;EACA;EACA;EACA,SX5JS;;AW8JT;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,YXxSG;EWySH,eV/QW;EUgRX,YXpMO;EWqMP;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA,KV7TC;EU8TD;EACA,YV9SA;EU+SA;EACA;;AAGJ;EACI;EACA;EACA,KX9OQ;EW+OR,WX9LY;EW+LZ,aX1LkB;EW2LlB,OX9RM;EW+RN;;AAEA;EACI;EACA,OVpUF;;AUwUN;ET3SA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;ASkSJ;EAEI;EACA;EACA;EACA;EACA;EACA,OV9UI;EU+UJ,eV1TQ;EU2TR;;AAEA;EACI,YX9SG;EW+SH,OXtTE;;AWyTN;EACI;;AAIR;EACI;EACA;EACA,SXhRQ;;AEyCZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;AWyUV;EACI;EACA;EACA;EACA,KX3RQ;EW4RR;EACA,OV1WI;EU2WJ,WX9OU;;AWgPV;EACI,WX/OM;;AWoPd;EACI;EACA;EACA,OVtXI;;AUwXJ;EACI;EACA;EACA,eVvYH;;AU0YD;EACI;;AAGJ;EACI,WXvQM;EWwQN,OVpYA;;AUyYR;EACI;EACA;EACA,KX/TQ;;AWkUZ;EACI;EACA;EACA,KV9ZC;EU+ZD;EACA,YXjXM;EWkXN,eVhYQ;EUiYR;;AAEA;EACI,mBVrZL;;AUwZC;EACI,mBV1ZF;;AU6ZF;EACI;;AAIR;EACI;EACA;;AAEA;EACI;EACA,WX9SM;EW+SN,aXzSc;EW0Sd,OX7YE;;AWgZN;EACI;EACA,WXtTM;EWuTN,OVnbA;;AUubR;EACI;EACA;;AAGJ;EACI;EACA,WXjUU;EWkUV,OX/ZM;EWgaN;;AAGJ;EACI;EACA,YXzXQ;EW0XR;EACA;EACA,aXtUgB;EWuUhB;EACA,YXraO;EWsaP,OX7aM;EW8aN,eVtbW;;AUybf;EACI,YV5dC;EU6dD,WXrVU;EWsVV,OVldI;EUmdJ;;;AZreR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AaAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;AAAA;EAEI;EACA;EACA;EACA;EACA,YZNO;EYOP;EACA,eXkBe;EWjBf,YZ4FW;EY3FX;;AAGA;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKA;AAAA;AAAA;EAEI;EACA;;AAMJ;AAAA;AAAA;EAEI;EACA;EACA;;AAMJ;AAAA;EACI;EACA;EACA;EACA;;AAGJ;AAAA;EACI;EACA;EACA;EACA;;;AASZ;EACI;EACA;EACA;EACA;EACA,YXzEI;EW0EJ;;AAEA;EACI,WZ2CU;EY1CV,aZgDkB;EY/ClB,OZpDM;;AYuDV;EV3DA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AUkDJ;EAEI;EACA;EACA;EACA;EACA;EACA,OX9FI;EW+FJ,eXzEW;EW0EX;;AAEA;EACI,YZ9DG;EY+DH,OZpEE;;;AY6Ed;EACI;EACA;EACA;EACA;EACA,YZ/EU;EYgFV;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OX/HQ;EWgIR,WZJc;EYKd,aZCoB;EYApB;EACA;EACA;;AAEA;EACI,YZnGO;EYoGP,OZ1GM;;AY6GV;EACI,YZ/IG;EYgJH,qBX9IE;EW+IF,OX/IE;;AWkJN;EACI;;;AAQR;EACI;EACA;EACA,KZhFY;EYiFZ;EACA,YZlKO;EYmKP;;AAEA;EACI,OXnKI;EWoKJ;;AAGJ;EACI;EACA;EACA;EACA,WZ/CU;EYgDV,OZ5IM;EY6IN;;AAEA;EACI,OXhLA;;;AWyLZ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;AVzEA;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;AYyKV;EACI;;;AAQR;EACI;EACA;EACA;;;AAQJ;EACI;EACA;EACA,KZ9IY;EY+IZ,SZ/IY;EYgJZ,YZhOO;EYiOP,eXxMe;EWyMf;;AAEA;EACI,YZzMM;;AY6MV;EACI;;;AAKR;EACI;EACA;EACA;EACA;EACA,eX3Ne;EW4Nf,YZ9MW;;;AYkNf;EACI;EACA;EACA;EACA;EACA;EACA;EACA,YZzNW;EY0NX,OX9PQ;EW+PR,eXzOe;EW0Of,WZnIc;;;AYuIlB;EACI;EACA;EACA;EACA;EACA;;;AAIJ;EACI,WZjJc;EYkJd,aZ7IoB;EY8IpB,OZhPU;EEfV;EACA;EACA;;;AUkQJ;AAAA;EAEI,WZ3Jc;EY4Jd,OXxRQ;ECiBR;EACA;EACA;;;AU0QJ;EACI;EACA;EACA,WZpKc;EYqKd,aZ9JsB;EY+JtB,OXnSM;EWoSN,YZhSe;EYiSf,eX9Qe;;;AWqRnB;EACI;EACA,YZ1QU;EY2QV;;;AAGJ;EACI;EACA;EACA;EACA,KZxOY;EYyOZ,WZ1Lc;EY2Ld,OXvTQ;;AWyTR;EACI;;AAGJ;EACI;EACA;EACA;EACA,eX3SW;EW4SX;EACA;EACA,WZxMU;EYyMV,aZnMgB;EYoMhB,OXvUE;EWwUF;EACA;EACA;EACA;EACA;;AAEA;EACI,cX/UF;EWgVE,kBZ5UO;;AY+UX;EACI;EACA,cXrVF;EWsVE;;AAIR;EACI;;AAGJ;EACI,aZ3NkB;EY4NlB,OZjUM;;AYoUV;EACI;EACA;EACA;EACA,SZ1RQ;EY2RR;EACA;EACA,OX1WE;EW2WF,YZvWW;EYwWX,eXrVW;EWsVX;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAEA;EACI;;;AAUhB;EACI;EACA;EACA;EACA;EACA,KZ9TY;EY+TZ,SZ5TY;EY6TZ;EACA,OX9YQ;;AWgZR;EACI;EACA;;AAGJ;EACI;EACA,WZ1RU;;;AY8RlB;EACI;EACA;EACA;EACA,SZ/UY;EYgVZ,OXhaQ;;AWkaR;EACI;EACA,OXraE;EWsaF;;;AAQR;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA,KXjcC;EWkcD;EACA,YXlbA;EWmbA;;AAEA;EACI,aZxTc;EYyTd,OZ5ZE;EY6ZF,WZhUM;;AYmUV;EACI;EACA,WZtUM;EYuUN,aZjUY;EYkUZ,OXpcA;EWqcA,YZhaG;EYiaH;EACA,eXjbO;;AWqbf;EACI;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA,KZ3YQ;EY4YR;EACA;EACA;;AAEA;EACI,YZ3bE;;AY8bN;EACI;EACA;EACA,OXpeA;EWqeA;;AAGJ;EACI;EACA,WZ7WM;EY8WN,OZ3cE;;AY8cN;EACI,WZlXM;EYmXN,aZ7Wc;EY8Wd,OXlfF;EWmfE;EACA;EACA,eX9dO;;;AWoenB;EACI;EACA;;AAEA;EACI;;AAGJ;EACI;;;AASR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YZxhBO;EYyhBP;EACA,eXhgBe;EWigBf,YZtbW;EYubX;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAIJ;AAAA;EAEI;EACA;EACA;EACA;EACA;;;AAIR;EACI;;;AAIJ;EACI;;;AAGJ;EACI;;AAEA;EACI;EACA;;;AAIR;EACI;;;AAGJ;EACI,OXrlBM;EWslBN;EACA;;;AAIJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;;;AAIR;EACI,YXvnBM;EWwnBN,OZ1nBO;;;AY6nBX;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI,YZhmBW;EYimBX,OXtoBQ;;;AFlBZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AcAA;AAAA;AAAA;AAAA;AASA;EACI,YbKO;EaJP;EACA,eZ6Be;;;AYzBnB;EACI;EACA;EACA;EACA,KZdK;EYeL;EACA,YZCI;EYAJ;EACA;EACA;EACA;EACA;;AAEA;EACI,YbaM;;;AaTd;EACI;EACA;EACA;EACA,WbyGc;EaxGd,ab8GsB;Ea7GtB,ObUU;;AaRV;EACI,OZzBI;;;AY8BZ;EACI,SZ3CK;;;AY+CT;EACI,eb2CY;;AazCZ;EACI;;;AAIR;EACI;EACA;EACA,Kb+BY;Ea9BZ,eb8BY;Ea7BZ,Wb6Ec;Ea5Ed,abkFsB;EajFtB,OblBU;;AaoBV;EACI,OZrDI;;;AYyDZ;EACI,eZtEK;EYuEL,WbiEc;EahEd,OZ5DQ;;;AYgEZ;EACI;EACA;EACA,KZ/EK;;;AYkFT;EACI;EACA;;;AAGJ;EACI;EACA;EACA,Wb8Cc;Ea7Cd,abmDoB;EalDpB,OblDU;;;AaqDd;EXYI;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;EACI,cD3GE;EC4CN;EACA;;AAkEA;EACI,OFnFM;;;Aa4Dd;EACI;EACA;EACA,KbdY;;;AaiBhB;EACI;EACA;EACA,KZ7GK;EY8GL,SbrBY;EasBZ,YbhEU;EaiEV,eZ/EY;;AYiFZ;EACI;;;AAIR;EACI;EACA;EACA,KbjCY;EakCZ;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,WbIc;EaHd,abQoB;EaPpB,Ob3FU;;;Aa+Fd;EACI;EACA;EACA;EACA,Yb9FW;Ea+FX,eb1Ca;Ea2Cb;;;AAGJ;EACI;EACA;EACA;EACA,YZ7IM;EY8IN,ebnDa;EaoDb;;;AAGJ;EACI;EACA;EACA;EACA;EACA,YbzJO;Ea0JP;EACA;EACA;EACA;EACA,Yb3DW;Ea4DX;;AAEA;EACI,Yb9DO;;AaiEX;EACI;;AAGJ;EACI;;AAGJ;EACI;;;AAKR;EACI;EACA;EACA,KbvGY;EawGZ;EACA,WbzDc;Ea0Dd;EACA,ObzJU;;;Aa4Jd;EACI,OZ3LQ;;;AY+LZ;EACI,SZ5MK;EY6ML,Yb9JU;Ea+JV,eZ7KY;;;AYgLhB;EACI;EACA;EACA,Kb3HY;Ea4HZ,eZrNK;;;AYwNT;EACI;EACA;EACA;;;AAGJ;EACI,WbtFc;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flJO;EemJP,ehB7ES;EgB8ET;EACA,ahBtCkB;EgBuClB;EACA;EACA,Of5KI;;Ae8KJ;AAAA;EACI,YfhLF;EeiLE,OhBnLD;;AgBwLP;AAAA;EACI;EACA;EACA;EACA;EACA,YhBvJM;EgBwJN;;AAGJ;AAAA;EdlKA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AcyJJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA,YhBzMG;EgB0MH;EACA,eflLW;EemLX,OfzMI;Ee0MJ;EACA,WhB/EU;EgBgFV;;AAEA;AAAA;EACI,YhB3KG;EgB4KH,chBzKG;EgB0KH,OhBtKG;;AgB0KX;AAAA;EACI;EACA;EACA;EACA;EACA,efpMW;EeqMX;EACA;;AAEA;AAAA;EACI,cfhOF;;AemOF;AAAA;EACI,OhB5LG;;AgBiMX;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;;AdtHJ;AAAA;EACI;EACA;;AAGJ;AAAA;EACI,YDzHA;EC0HA;;AAGJ;AAAA;EACI,YD/GO;ECgHP;;AAEA;AAAA;EACI,YF5GE;;AgBuNV;AAAA;AAAA;AAAA;AAAA;AAAA;EAGI;EACA;EACA,OhBhNO;EgBiNP;EACA;;AAGJ;AAAA;EACI,Of3PC;;Ae+PL;AAAA;EACI;EACA;EACA;EACA;EACA,YhBzQG;EgB0QH;EACA;EACA;EACA,OhBjOO;EgBkOP;EACA;EACA;;AAEA;AAAA;EACI,YhB5OG;EgB6OH,cfjRA;;AeoRJ;AAAA;EACI,YftRF;EeuRE,chBpRO;EgBqRP,OhB1RD;;AgB4RC;AAAA;EACI,YhBxRG;EgByRH;;AAKZ;AAAA;EACI;EACA,OhB3PO;EgB4PP,YhB/PO;EgBgQP;EACA;EACA;EACA;;AAEA;AAAA;EACI,OhB7SD;EgB8SC;;AAQR;AAAA;EACI;EACA;EACA,KhBzOQ;;AgB4OZ;AAAA;EACI;EACA;EACA,KhB/OQ;EgBgPR,ShBhPQ;EgBiPR,YhB3RM;EgB4RN,efzSW;;Ae4Sf;AAAA;AAAA;AAAA;EAEI;EACA;;AAGJ;AAAA;EACI,WhB7MU;EgB8MV,Of1UI;Ee2UJ;;AAGJ;AAA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","file":"entity-selector.css","sourcesContent":["/**\n * Entity Selector Styles\n * @package prestashop-entity-selector\n * @version 2.0.0\n *\n * Compiles to: assets/css/admin/entity-selector.css\n */\n\n// Foundation\n@use 'variables' as *;\n@use 'mixins' as *;\n\n// Layouts\n@use 'layouts/form-integration';\n@use 'layouts/responsive';\n\n// Components\n@use 'components/entity-selector';\n@use 'components/entity-item'; // Shared base for chips and list items\n@use 'components/dropdown';\n@use 'components/chips';\n@use 'components/groups';\n@use 'components/value-picker';\n@use 'components/modal';\n@use 'components/list-preview';\n@use 'components/schedule';\n@use 'components/tips';\n@use 'components/condition-trait';\n@use 'components/combinations';\n@use 'components/method-dropdown';\n@use 'components/tooltip';\n@use 'components/tree';\n@use 'components/validation';\n","/**\n * Entity Selector Variables\n * Bootstrap 4 compatible values for PrestaShop admin theme\n *\n * Imports shared variables from prestashop-admin package\n * and maps them to $es-* prefixed aliases for this package\n */\n\n// Import shared variables from prestashop-admin\n@use '../../../prestashop-admin/assets/scss/variables' as admin;\n\n// =============================================================================\n// Base Colors\n// =============================================================================\n\n$es-white: #ffffff !default;\n$es-black: #000000 !default;\n\n// Primary (from prestashop-admin)\n$es-primary: admin.$primary !default;\n$es-primary-hover: #1a9ab7 !default;\n$es-primary-light: rgba(37, 185, 215, 0.1) !default;\n\n// Semantic colors (from prestashop-admin)\n$es-success: admin.$success !default;\n$es-success-light: #d4edda !default;\n$es-success-dark: #1e7e34 !default;\n\n$es-danger: admin.$danger !default;\n$es-danger-light: #f8d7da !default;\n$es-danger-dark: #bd2130 !default;\n\n$es-warning: admin.$warning !default;\n$es-warning-light: #fff3cd !default;\n\n$es-info: admin.$info !default;\n$es-info-light: #d1ecf1 !default;\n\n// =============================================================================\n// Gray Scale (Bootstrap 4)\n// =============================================================================\n\n$es-gray-100: admin.$light !default;\n$es-gray-200: #e9ecef !default;\n$es-gray-300: admin.$border-color !default;\n$es-gray-400: #ced4da !default;\n$es-gray-500: #adb5bd !default;\n$es-gray-600: admin.$secondary !default;\n$es-gray-700: #495057 !default;\n$es-gray-800: admin.$dark !default;\n$es-gray-900: #212529 !default;\n\n// Slate (subtle variations)\n$es-slate-50: #f8fafc !default;\n$es-slate-100: #f1f5f9 !default;\n$es-slate-200: #e2e8f0 !default;\n$es-slate-300: #cbd5e1 !default;\n$es-slate-400: #94a3b8 !default;\n$es-slate-500: #64748b !default;\n$es-slate-600: #475569 !default;\n$es-slate-700: #334155 !default;\n$es-slate-800: #1e293b !default;\n$es-slate-900: #0f172a !default;\n\n// Cyan\n$es-cyan-50: #ecfeff !default;\n$es-cyan-100: #cffafe !default;\n$es-cyan-200: #a5f3fc !default;\n$es-cyan-500: #06b6d4 !default;\n$es-cyan-600: #0891b2 !default;\n$es-cyan-700: #0e7490 !default;\n\n// =============================================================================\n// Semantic Aliases\n// =============================================================================\n\n$es-bg-header: $es-gray-100 !default;\n$es-bg-hover: $es-gray-200 !default;\n$es-bg-active: $es-gray-200 !default;\n$es-bg-body: $es-white !default;\n\n$es-border-color: admin.$border-color !default;\n$es-border-light: $es-gray-200 !default;\n$es-border-dark: $es-gray-400 !default;\n\n$es-text-primary: $es-gray-900 !default;\n$es-text-secondary: $es-gray-700 !default;\n$es-text-muted: $es-gray-600 !default;\n$es-text-light: $es-gray-500 !default;\n\n// =============================================================================\n// Spacing (Bootstrap 4 compatible, derived from admin.$spacer)\n// =============================================================================\n\n$es-spacing-xs: admin.$spacer * 0.25 !default; // 4px\n$es-spacing-sm: admin.$spacer * 0.5 !default; // 8px\n$es-spacing-md: admin.$spacer !default; // 16px\n$es-spacing-lg: admin.$spacer * 1.5 !default; // 24px\n$es-spacing-xl: admin.$spacer * 2 !default; // 32px\n\n// =============================================================================\n// Border Radius (from prestashop-admin)\n// =============================================================================\n\n$es-radius-sm: admin.$border-radius-sm !default;\n$es-radius-md: admin.$border-radius !default;\n$es-radius-lg: admin.$border-radius-lg !default;\n$es-radius-xl: 0.5rem !default;\n$es-radius-full: 50rem !default;\n\n// =============================================================================\n// Box Shadows (Bootstrap 4 compatible)\n// =============================================================================\n\n$es-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !default;\n$es-shadow-md: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !default;\n$es-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175) !default;\n$es-shadow-xl: 0 1.5rem 4rem rgba(0, 0, 0, 0.2) !default;\n\n// =============================================================================\n// Transitions\n// =============================================================================\n\n$es-transition-fast: 0.15s ease-in-out !default;\n$es-transition-normal: 0.2s ease-in-out !default;\n$es-transition-slow: 0.3s ease-in-out !default;\n\n// =============================================================================\n// Z-Index (below Bootstrap modal)\n// =============================================================================\n\n$es-z-dropdown: 1000 !default;\n$es-z-modal: 1050 !default;\n$es-z-popover: 1060 !default;\n$es-z-tooltip: 1070 !default;\n\n// =============================================================================\n// Typography\n// =============================================================================\n\n$es-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif !default;\n\n$es-font-size-xs: 0.75rem !default; // 12px\n$es-font-size-sm: 0.875rem !default; // 14px\n$es-font-size-base: 1rem !default; // 16px\n$es-font-size-lg: 1.125rem !default; // 18px\n\n$es-font-weight-normal: 400 !default;\n$es-font-weight-medium: 500 !default;\n$es-font-weight-semibold: 600 !default;\n$es-font-weight-bold: 700 !default;\n\n$es-line-height-tight: 1.25 !default;\n$es-line-height-normal: 1.5 !default;\n","/**\n * MPR Admin Variables\n * @package prestashop-admin\n */\n\n// Spacing scale (Bootstrap 4 compatible)\n$spacer: 1rem;\n$spacers: (\n 0: 0,\n 1: $spacer * 0.25,\n 2: $spacer * 0.5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3\n);\n\n// Colors - PrestaShop Admin Theme\n$primary: #25b9d7;\n$secondary: #6c757d;\n$success: #28a745;\n$danger: #dc3545;\n$warning: #ffc107;\n$info: #17a2b8;\n$light: #f8f9fa;\n$dark: #343a40;\n\n$colors: (\n primary: $primary,\n secondary: $secondary,\n success: $success,\n danger: $danger,\n warning: $warning,\n info: $info,\n light: $light,\n dark: $dark\n);\n\n// Border\n$border-color: #dee2e6;\n$border-radius: 0.25rem;\n$border-radius-sm: 0.2rem;\n$border-radius-lg: 0.3rem;\n\n// Breakpoints\n$breakpoint-sm: 576px;\n$breakpoint-md: 768px;\n$breakpoint-lg: 991px;\n$breakpoint-xl: 1200px;\n","/**\n * Entity Selector Mixins\n * Reusable patterns - prefer Bootstrap utilities in HTML where possible\n */\n\n@use \"sass:color\";\n@use 'variables' as *;\n\n// =============================================================================\n// Layout\n// =============================================================================\n\n@mixin flex-center {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n@mixin flex-between {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n@mixin grid-columns($cols) {\n display: grid;\n grid-template-columns: repeat($cols, 1fr);\n gap: $es-spacing-sm;\n}\n\n// =============================================================================\n// Text\n// =============================================================================\n\n@mixin text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n// =============================================================================\n// Interactive Elements\n// =============================================================================\n\n// Reset button styles\n@mixin button-reset {\n padding: 0;\n margin: 0;\n background: none;\n border: none;\n cursor: pointer;\n font: inherit;\n color: inherit;\n\n &:focus {\n outline: none;\n }\n}\n\n// Focus ring (Bootstrap 4 style)\n@mixin focus-ring($color: $es-primary) {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba($color, 0.25);\n}\n\n// Interactive hover state\n@mixin interactive-item {\n cursor: pointer;\n transition: background-color $es-transition-fast, color $es-transition-fast;\n\n &:hover {\n background-color: $es-bg-hover;\n }\n}\n\n// =============================================================================\n// Cards & Containers\n// =============================================================================\n\n@mixin card {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n}\n\n@mixin dropdown-container {\n position: absolute;\n z-index: $es-z-dropdown;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-lg;\n}\n\n// =============================================================================\n// Form Elements\n// =============================================================================\n\n// Reset input styles (for inputs in custom wrappers)\n@mixin input-reset {\n padding: 0;\n margin: 0;\n background: none;\n border: none;\n font: inherit;\n color: inherit;\n\n &:focus {\n outline: none;\n }\n}\n\n@mixin input-base {\n width: 100%;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n line-height: $es-line-height-normal;\n color: $es-text-primary;\n background-color: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n transition: border-color $es-transition-fast, box-shadow $es-transition-fast;\n\n &:focus {\n border-color: $es-primary;\n @include focus-ring($es-primary);\n }\n\n &::placeholder {\n color: $es-text-light;\n }\n}\n\n// =============================================================================\n// Scrollbar\n// =============================================================================\n\n@mixin custom-scrollbar {\n &::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n\n &::-webkit-scrollbar-track {\n background: $es-gray-100;\n border-radius: 3px;\n }\n\n &::-webkit-scrollbar-thumb {\n background: $es-gray-300;\n border-radius: 3px;\n\n &:hover {\n background: $es-gray-400;\n }\n }\n}\n\n// =============================================================================\n// Badges & Chips\n// =============================================================================\n\n@mixin badge($bg: $es-gray-200, $color: $es-gray-700) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.125rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n line-height: 1;\n background-color: $bg;\n color: $color;\n border-radius: $es-radius-full;\n}\n\n// Count badge with preview icon (used for tab badges, match counts, totals)\n// Note: Eye icon is provided in HTML via \n@mixin count-badge($bg: $es-primary) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.25rem;\n min-width: 20px;\n height: 20px;\n padding: 0 0.5rem;\n background: $bg;\n color: $es-white;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-full;\n cursor: pointer;\n transition: all $es-transition-fast;\n flex-shrink: 0;\n\n &:hover {\n transform: scale(1.05);\n box-shadow: 0 2px 8px rgba($bg, 0.4);\n }\n\n // Focus state - maintain styled appearance\n &:focus {\n outline: none;\n box-shadow: 0 0 0 2px rgba($bg, 0.3), 0 2px 8px rgba($bg, 0.4);\n }\n\n // Loading state - spinner icon replaces eye\n &.loading {\n cursor: wait;\n\n i {\n font-size: 10px;\n animation: spin 0.6s linear infinite;\n }\n\n &:hover {\n transform: none;\n box-shadow: none;\n }\n }\n\n // Inactive/empty state\n &.inactive,\n &.no-matches {\n background: $es-slate-400;\n cursor: default;\n\n &:hover {\n transform: none;\n box-shadow: none;\n }\n }\n\n // Popover open state\n &.popover-open {\n background: color.adjust($bg, $lightness: -10%);\n box-shadow: 0 2px 8px rgba($bg, 0.4);\n }\n\n // Icon inside badge (eye, spinner, etc.)\n i {\n font-size: 10px;\n line-height: 1;\n opacity: 0.8;\n }\n\n &:hover i {\n opacity: 1;\n }\n\n .preview-count {\n font-weight: $es-font-weight-bold;\n }\n}\n\n@keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n@mixin chip {\n display: inline-flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n background: $es-gray-200;\n color: $es-gray-700;\n border-radius: $es-radius-full;\n\n .chip-remove {\n @include button-reset;\n @include flex-center;\n width: 14px;\n height: 14px;\n font-size: 10px;\n color: $es-text-muted;\n border-radius: 50%;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n }\n}\n\n// =============================================================================\n// Toggle Switch\n// =============================================================================\n\n@mixin toggle-switch($width: 36px, $height: 20px) {\n position: relative;\n width: $width;\n height: $height;\n border-radius: $height;\n background: $es-gray-400;\n transition: background-color $es-transition-normal;\n cursor: pointer;\n\n &::after {\n content: '';\n position: absolute;\n top: 2px;\n left: 2px;\n width: $height - 4px;\n height: $height - 4px;\n background: $es-white;\n border-radius: 50%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n transition: transform $es-transition-normal;\n }\n\n &.active {\n background: $es-success;\n\n &::after {\n transform: translateX($width - $height);\n }\n }\n}\n\n// =============================================================================\n// Screen Reader Only\n// =============================================================================\n\n@mixin sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n","/**\n * Form Integration Styles\n * Handles PrestaShop admin form layout overrides\n */\n\n@use '../variables' as *;\n\n// Base border reset for all entity-selector elements\n.target-conditions-trait,\n.target-conditions-trait *,\n.entity-selector-trait,\n.entity-selector-trait *,\n.method-dropdown-menu,\n.method-dropdown-menu *,\n.target-preview-popover,\n.target-preview-popover * {\n border-style: solid;\n border-width: 0;\n border-color: $es-border-color;\n}\n\n// Full-width form group override using :has()\n// Excludes .layout-form-group which uses standard PrestaShop form layout\n.form-group:has(.entity-selector-trait:not(.layout-form-group)),\n.form-group:has(.target-conditions-trait:not(.layout-form-group)),\n.form-group:has(.condition-trait:not(.layout-form-group)) {\n display: block;\n\n > .control-label {\n display: none;\n }\n\n > .col-lg-8 {\n width: 100%;\n max-width: 100%;\n padding-left: $es-spacing-md;\n padding-right: $es-spacing-md;\n flex: 0 0 100% !important;\n }\n}\n\n// Fallback class for browsers without :has() support\n.form-group.condition-trait-fullwidth {\n display: block;\n\n > .control-label {\n display: none;\n }\n\n > .col-lg-8 {\n width: 100%;\n max-width: 100%;\n padding-left: $es-spacing-md;\n padding-right: $es-spacing-md;\n flex: 0 0 100% !important;\n }\n}\n\n// SAFEGUARD: Force label visibility for form-group layout widgets\n// This overrides any conflicting rules (including fallback class rules)\n// when the widget has layout-form-group class indicating standard form integration\n.form-group:has(.layout-form-group) > .control-label {\n display: flex !important;\n}\n\n// Dropdown overflow fix\n// When dropdown is open, parent containers must allow overflow\n.panel:has(.target-search-dropdown.show),\n.card:has(.target-search-dropdown.show),\n.form-wrapper:has(.target-search-dropdown.show),\n.panel-body:has(.target-search-dropdown.show),\n.card-body:has(.target-search-dropdown.show),\n.form-group:has(.target-search-dropdown.show),\n.col-lg-8:has(.target-search-dropdown.show),\n.col-lg-12:has(.target-search-dropdown.show) {\n overflow: visible !important;\n}\n\n// Target conditions wrapper hierarchy overflow fix\n.target-conditions-trait:has(.target-search-dropdown.show),\n.entity-selector-trait:has(.target-search-dropdown.show),\n.condition-trait-body:has(.target-search-dropdown.show),\n.target-block-content:has(.target-search-dropdown.show),\n.target-block-groups:has(.target-search-dropdown.show),\n.target-group:has(.target-search-dropdown.show),\n.target-group-body:has(.target-search-dropdown.show),\n.target-search-wrapper:has(.target-search-dropdown.show) {\n overflow: visible !important;\n}\n\n// =============================================================================\n// Embedded Layout\n// =============================================================================\n// Use .layout-embedded for entity selectors nested inside other components\n// Removes outer wrapper styling to avoid redundant borders/backgrounds\n\n.target-conditions-trait.layout-embedded,\n.entity-selector-trait.layout-embedded {\n background: transparent;\n border: none;\n border-radius: 0;\n\n // Remove padding from groups container when embedded\n .groups-container {\n padding: 0;\n }\n\n // Remove block body padding\n .block-body {\n padding: 0;\n }\n\n // Remove block footer border when embedded\n .block-footer {\n border-top: none;\n padding: $es-spacing-sm 0 0;\n }\n\n // Simplify selection group when embedded - single thin border only\n .selection-group {\n background: $es-white;\n border: 1px solid $es-slate-200;\n border-radius: $es-radius-md;\n\n // Lighter group header in embedded mode\n .group-header {\n background: $es-slate-50;\n border-bottom-color: $es-slate-200;\n padding: $es-spacing-xs $es-spacing-sm;\n border-radius: $es-radius-md $es-radius-md 0 0;\n }\n\n // Reduce group body padding (slightly more than $es-spacing-sm for readability)\n .group-body {\n padding: 0.75rem;\n }\n\n // Reduce group-include section padding\n .group-include {\n padding: $es-spacing-xs;\n margin-bottom: $es-spacing-sm;\n }\n\n // Smaller modifiers section\n .group-modifiers {\n padding: $es-spacing-xs $es-spacing-sm;\n margin: $es-spacing-sm (-$es-spacing-sm) (-$es-spacing-sm);\n }\n }\n\n // Empty state - smaller padding\n .groups-empty-state {\n padding: $es-spacing-md;\n }\n\n // Smaller add group button\n .btn-add-group {\n padding: 0.375rem 0.625rem;\n font-size: $es-font-size-xs;\n }\n}\n","/**\n * Responsive Styles\n * Media query adjustments for different screen sizes\n */\n\n@use '../variables' as *;\n\n// Tablet and below\n@media (max-width: 991px) {\n .target-conditions-trait,\n .entity-selector-trait {\n .condition-trait-header {\n flex-direction: column;\n align-items: flex-start;\n gap: $es-spacing-sm;\n }\n\n .trait-header-right {\n width: 100%;\n justify-content: flex-end;\n }\n\n .target-block-tabs {\n flex-wrap: wrap;\n }\n }\n}\n\n// Mobile\n@media (max-width: 767px) {\n .target-conditions-trait,\n .entity-selector-trait {\n .target-block-tab {\n padding: $es-spacing-sm;\n font-size: $es-font-size-xs;\n }\n\n .target-group-header {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .target-search-dropdown {\n width: 100% !important;\n left: 0 !important;\n right: 0 !important;\n }\n\n .dropdown-results-grid {\n grid-template-columns: 1fr !important;\n }\n }\n}\n\n// High-resolution displays\n@media (min-width: 1600px) {\n .target-conditions-trait,\n .entity-selector-trait {\n .dropdown-results-grid.view-grid-3 {\n grid-template-columns: repeat(4, 1fr);\n }\n }\n}\n","/**\n * Entity Selector - Main Component Styles\n * Wrapper, header, body, tabs, blocks\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Main wrapper (supports both .target-conditions-trait and .entity-selector-trait)\n.target-conditions-trait,\n.entity-selector-trait {\n position: relative;\n overflow: visible;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n\n // Trait Header (collapsible)\n .condition-trait-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n padding: 0.875rem $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n }\n\n .trait-header-left {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n min-width: 0;\n flex: 1;\n }\n\n .trait-icon {\n font-size: $es-font-size-lg;\n color: $es-text-muted;\n flex-shrink: 0;\n }\n\n .trait-title-group {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n }\n\n .trait-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n white-space: nowrap;\n }\n\n .trait-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n // Total count badge in header\n .trait-total-count {\n @include count-badge($es-primary);\n margin-left: $es-spacing-sm;\n }\n\n // Show all toggle switch\n .trait-show-all-toggle {\n display: inline-flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-right: 0.75rem;\n padding: 0.25rem $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .toggle-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n }\n\n .show-all-checkbox {\n display: none;\n }\n\n .toggle-slider {\n position: relative;\n width: 36px;\n height: 20px;\n background: $es-slate-300;\n border-radius: $es-radius-full;\n transition: background-color $es-transition-normal;\n\n &::after {\n content: '';\n position: absolute;\n top: 2px;\n left: 2px;\n width: 16px;\n height: 16px;\n background: $es-white;\n border-radius: 50%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n transition: transform $es-transition-normal;\n }\n }\n\n .show-all-checkbox:checked + .toggle-slider {\n background: $es-success;\n\n &::after {\n transform: translateX(16px);\n }\n }\n }\n\n // Validation error states\n &.has-validation-error {\n border-color: $es-danger;\n box-shadow: 0 0 0 3px rgba($es-danger, 0.1);\n\n .condition-trait-header {\n border-bottom-color: $es-danger;\n }\n }\n\n .trait-validation-error {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: 0.625rem $es-spacing-md;\n background: $es-danger-light;\n color: #b91c1c;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n border-bottom: 1px solid #fecaca;\n\n i {\n color: $es-danger;\n }\n }\n\n // Required indicator\n &.trait-required .trait-title::after {\n content: ' *';\n color: $es-danger;\n }\n\n // Body\n .condition-trait-body {\n padding: 0;\n background: $es-white;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n // Block type tabs\n .target-block-tabs {\n display: flex;\n flex-wrap: wrap;\n gap: 0;\n padding: 0;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n }\n\n .target-block-tab {\n position: relative;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex: none;\n min-width: 0;\n padding: 0.625rem $es-spacing-md;\n margin-bottom: -1px;\n background: transparent;\n border: 0;\n border-bottom: 2px solid transparent;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-slate-700;\n }\n\n &.active {\n background: $es-white;\n border-bottom-color: $es-cyan-500;\n color: $es-primary;\n }\n\n i {\n font-size: $es-font-size-sm;\n }\n\n .tab-label {\n white-space: nowrap;\n }\n\n .tab-badge {\n @include count-badge($es-primary);\n }\n\n &.has-data:not(.active) .tab-badge {\n @include count-badge($es-slate-400);\n }\n }\n\n // Tabs row with actions (form-content layout)\n .entity-selector-tabs-row {\n display: flex;\n align-items: stretch;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n\n .target-block-tabs {\n flex: 1;\n border-bottom: 0;\n border-radius: $es-radius-lg 0 0 0;\n }\n }\n\n // Expand/collapse toggle area (entire section is clickable)\n .entity-selector-actions.btn-toggle-blocks {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 $es-spacing-md;\n background: $es-slate-100;\n border-left: 1px solid $es-border-color;\n color: $es-slate-400;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-primary;\n }\n\n .material-icons {\n font-size: 20px !important;\n }\n }\n\n // When expanded - highlight the toggle area\n .entity-selector-trait:not(.blocks-collapsed) .entity-selector-actions.btn-toggle-blocks {\n background: $es-primary-light;\n border-left-color: $es-primary;\n color: $es-primary;\n }\n\n // Blocks content wrapper (for form-content layout collapse)\n .entity-selector-blocks-content {\n // Inherits styles from condition-trait-body context\n }\n\n // Block container\n .target-block-container {\n display: none;\n\n &.active {\n display: block;\n }\n }\n\n .target-block-content {\n padding: $es-spacing-md;\n }\n\n .target-block-groups {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-md;\n }\n\n // Block header (for standalone blocks)\n .target-block-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n }\n\n // Empty state\n .target-block-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n }\n\n // Collapse toggle\n .trait-collapse-toggle,\n .collapse-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n cursor: pointer;\n transition: transform $es-transition-normal;\n\n &.collapsed {\n transform: rotate(-90deg);\n }\n }\n\n // Header actions\n .trait-header-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n // Collapsed state\n &.collapsed {\n .condition-trait-body {\n display: none;\n }\n\n .condition-trait-header {\n border-radius: $es-radius-lg;\n }\n }\n}\n\n// Single mode specific styles\n.target-conditions-trait.single-mode,\n.entity-selector-trait.single-mode {\n // Hide tabs in standalone layout (has separate header, 1 tab is redundant)\n .target-block-tabs {\n display: none;\n }\n\n .target-block-container {\n display: block;\n }\n\n // In form-content layout, always show tabs — they serve as the block title\n .entity-selector-tabs-row .target-block-tabs {\n display: flex;\n }\n}\n\n// Header action buttons\n.target-conditions-trait,\n.entity-selector-trait {\n .header-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .header-action-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n background: transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n","/**\n * Entity Item - Shared Base Component\n * Unified styling for entity items in chips, lists, and previews\n *\n * Variants:\n * - .entity-item (base) - default list-row style\n * - .entity-item.chip-style - pill/chip style (compact)\n * - .entity-item.card-style - card/grid style\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// =============================================================================\n// Entity Item Sizing\n// =============================================================================\n\n$entity-item-image-sm: 20px;\n$entity-item-image-md: 32px;\n$entity-item-image-lg: 48px;\n\n// =============================================================================\n// Base Entity Item (list-row layout)\n// =============================================================================\n\n.entity-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-white;\n border-radius: $es-radius-sm;\n transition: background $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n // Clickable variant\n &.clickable {\n cursor: pointer;\n }\n\n // Selected state\n &.selected {\n background: $es-primary-light;\n }\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Image\n// -----------------------------------------------------------------------------\n\n.entity-item-image {\n flex-shrink: 0;\n width: $entity-item-image-md;\n height: $entity-item-image-md;\n object-fit: cover;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n}\n\n// Size variants\n.entity-item-image--sm {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n border-radius: 50%;\n}\n\n.entity-item-image--lg {\n width: $entity-item-image-lg;\n height: $entity-item-image-lg;\n}\n\n// No-image placeholder\n.entity-item-no-image {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: $entity-item-image-md;\n height: $entity-item-image-md;\n background: $es-slate-100;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n font-size: $es-font-size-sm;\n\n &--sm {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n font-size: 10px;\n border-radius: 50%;\n }\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Info (name + meta)\n// -----------------------------------------------------------------------------\n\n.entity-item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n}\n\n.entity-item-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n}\n\n.entity-item-meta {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n @include text-truncate;\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Badge/Price (right side)\n// -----------------------------------------------------------------------------\n\n.entity-item-badge {\n flex-shrink: 0;\n padding: 0.125rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n background: $es-slate-100;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n}\n\n.entity-item-price {\n flex-shrink: 0;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Actions (remove button, etc.)\n// -----------------------------------------------------------------------------\n\n.entity-item-action {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: 50%;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n}\n\n// =============================================================================\n// Chip Style Variant (compact pill)\n// =============================================================================\n\n.entity-item.chip-style {\n display: inline-flex;\n gap: 0.375rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-100;\n border-radius: $es-radius-full;\n\n &:hover {\n background: $es-slate-200;\n }\n\n .entity-item-image {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n border-radius: 50%;\n }\n\n .entity-item-no-image {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n font-size: 10px;\n border-radius: 50%;\n }\n\n .entity-item-info {\n flex-direction: row;\n align-items: center;\n gap: 0.25rem;\n }\n\n .entity-item-name {\n font-size: $es-font-size-xs;\n }\n\n .entity-item-meta {\n display: none;\n }\n\n .entity-item-action {\n width: 16px;\n height: 16px;\n margin-left: 0.125rem;\n }\n}\n\n// =============================================================================\n// List Style Variant (bordered rows)\n// =============================================================================\n\n.entity-item.list-style {\n padding: $es-spacing-sm 0;\n background: transparent;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n}\n\n// =============================================================================\n// Entity Item Container (wrapper for multiple items)\n// =============================================================================\n\n.entity-items-container {\n display: flex;\n flex-direction: column;\n background: $es-slate-50;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n overflow: hidden;\n}\n\n// Toolbar (filter, sort, count, clear)\n.entity-items-toolbar {\n display: none;\n align-items: center;\n flex-wrap: nowrap;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n padding-bottom: 0;\n background: transparent;\n\n &.has-items {\n display: flex;\n }\n}\n\n// Filter input\n.entity-items-filter {\n all: unset;\n display: block;\n flex: 1 1 auto;\n min-width: 80px;\n width: auto;\n height: auto;\n padding: 0.2rem 0.5rem 0.2rem 1.5rem;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E\") no-repeat 0.375rem center;\n background-size: 10px;\n border: 1px solid $es-slate-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n line-height: 1.4;\n color: $es-text-primary;\n box-sizing: border-box;\n transition: all $es-transition-fast;\n\n &::placeholder {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n}\n\n// Sort dropdown\n.entity-items-sort {\n all: unset;\n flex: 0 0 auto;\n padding: 0.2rem 1.25rem 0.2rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.375rem center;\n background-size: 8px;\n font-size: 10px;\n line-height: 1.4;\n color: $es-text-secondary;\n cursor: pointer;\n box-sizing: border-box;\n white-space: nowrap;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n}\n\n// Count badge\n.entity-items-count {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n gap: 0.125rem;\n padding: 0.2rem 0.5rem;\n background: $es-slate-200;\n color: $es-text-secondary;\n font-size: 10px;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-sm;\n white-space: nowrap;\n line-height: 1.4;\n\n &.has-filter {\n background: $es-cyan-100;\n color: $es-cyan-700;\n }\n}\n\n// Clear button\n.entity-items-clear {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n gap: 0.25rem;\n padding: 0.2rem 0.5rem;\n color: $es-danger;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n background: rgba($es-danger, 0.1);\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n white-space: nowrap;\n line-height: 1.4;\n\n &:hover {\n background: $es-danger;\n color: $es-white;\n }\n\n i {\n font-size: 9px;\n flex-shrink: 0;\n }\n}\n\n// Items list area\n.entity-items-list {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md $es-spacing-md;\n min-height: 40px;\n max-height: 300px;\n overflow-y: auto;\n @include custom-scrollbar;\n\n &:empty {\n display: none;\n }\n\n // List layout (vertical)\n &.list-layout {\n flex-direction: column;\n flex-wrap: nowrap;\n gap: 0;\n padding: $es-spacing-sm;\n }\n}\n\n// Load more section\n.entity-items-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: transparent;\n border-top: 1px dashed $es-border-color;\n\n .load-more-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .load-more-select {\n appearance: none;\n padding: 0.25rem 1.75rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.5rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n cursor: pointer;\n transition: all $es-transition-fast;\n height: auto;\n min-height: 0;\n line-height: 1.3;\n\n &:hover {\n border-color: $es-primary;\n background-color: $es-primary-light;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n .load-more-remaining {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .remaining-count {\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n }\n\n .btn-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xs;\n margin: 0;\n border: none;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n font: inherit;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n\n &.loading {\n cursor: wait;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n }\n}\n\n// =============================================================================\n// Empty & Loading States\n// =============================================================================\n\n.entity-items-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n}\n\n.entity-items-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n\n i {\n font-size: 20px;\n animation: spin 0.6s linear infinite;\n }\n}\n","/**\n * Search Dropdown Component\n * Includes search input, filter panel, results grid\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Search wrapper\n .target-search-wrapper {\n position: relative;\n }\n\n // Search dropdown\n .target-search-dropdown {\n @include dropdown-container;\n display: none;\n width: 600px;\n max-width: calc(100vw - 40px);\n\n &.show {\n display: block;\n }\n }\n\n // Dropdown header\n .dropdown-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n }\n\n .dropdown-search-input {\n @include input-base;\n flex: 1;\n padding: $es-spacing-sm $es-spacing-md;\n }\n\n .dropdown-close-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n }\n\n // Dropdown controls bar\n .dropdown-controls {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border-bottom: 1px solid $es-border-color;\n }\n\n .dropdown-controls-left,\n .dropdown-controls-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n // View mode buttons\n .view-mode-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n background: transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-secondary;\n }\n\n &.active {\n background: $es-primary;\n color: $es-white;\n }\n }\n\n // Results count\n .dropdown-results-count {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n // Dropdown body\n .dropdown-body {\n max-height: 400px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n // Results container\n .dropdown-results {\n padding: 0 $es-spacing-sm;\n }\n\n // Results count text\n .results-count {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n padding: $es-spacing-xs $es-spacing-sm;\n }\n\n // Results header (for list view columns)\n .results-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-md;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n\n // Grid view\n .dropdown-results-grid {\n display: grid;\n gap: $es-spacing-sm;\n\n &.view-list {\n grid-template-columns: 1fr;\n }\n\n &.view-grid-2 {\n grid-template-columns: repeat(2, 1fr);\n }\n\n &.view-grid-3 {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n // Result item (both class names for compatibility)\n // Note: Main dropdown-item styling is in the global .target-search-dropdown section below\n .dropdown-result-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm 0;\n background: $es-white;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n cursor: pointer;\n transition: background $es-transition-fast;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n }\n\n &.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n\n &:hover {\n background: $es-white;\n }\n }\n }\n\n .result-item-image,\n .result-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n overflow: hidden;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n &.result-flag {\n width: 32px;\n height: 24px;\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n background: transparent;\n\n img {\n object-fit: contain;\n }\n\n .flag-fallback {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: linear-gradient(135deg, #e8eaed 0%, #dadce0 100%);\n font-size: 14px;\n color: #5f6368;\n }\n }\n }\n\n .result-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n background: $es-slate-100;\n border-radius: $es-radius-sm;\n color: $es-text-muted;\n\n i {\n font-size: 16px;\n }\n }\n\n .result-item-info,\n .result-info {\n flex: 1;\n min-width: 0;\n }\n\n .result-item-name,\n .result-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .result-item-meta,\n .result-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .subtitle-line {\n @include text-truncate;\n }\n\n .subtitle-line-primary {\n color: $es-text-secondary;\n }\n\n .subtitle-line-secondary {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n // Result columns (for product list view)\n .result-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n font-size: $es-font-size-xs;\n }\n\n .result-col-price {\n color: $es-text-secondary;\n }\n\n .result-col-sale {\n color: $es-danger;\n font-weight: $es-font-weight-semibold;\n }\n\n .result-col-stock {\n .col-value {\n &.stock-ok {\n color: $es-success;\n }\n\n &.stock-low {\n color: $es-warning;\n }\n\n &.stock-out {\n color: $es-danger;\n }\n }\n }\n\n .result-col-sales {\n color: $es-text-muted;\n }\n\n .col-value {\n display: block;\n }\n\n .result-item-checkbox,\n .result-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n border: 2px solid $es-border-dark;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n i {\n display: none;\n font-size: 10px;\n color: $es-white;\n }\n\n .dropdown-result-item.selected &,\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n\n // Product-specific result item\n .result-item-product {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n // Combination-level search results ('both' mode)\n .dropdown-item.is-combination {\n padding-left: 28px;\n\n .result-name {\n font-size: 0.9em;\n }\n }\n\n .dropdown-item.is-parent-product {\n background: $es-slate-50;\n font-weight: $es-font-weight-medium;\n }\n\n // No results state\n .no-results {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: 1.25rem;\n opacity: 0.5;\n }\n }\n\n // Empty state\n .dropdown-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n }\n\n // Loading state\n .dropdown-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n\n i {\n font-size: 1.5rem;\n animation: spin 1s linear infinite;\n }\n }\n\n // Unified dropdown footer - combines load more and actions\n .dropdown-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n // Left side: load more controls\n .dropdown-footer-left {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-label {\n color: $es-text-muted;\n }\n\n .load-more-select,\n select.load-more-select {\n appearance: none;\n padding: 0.25rem 1.5rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.4rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n cursor: pointer;\n min-width: 55px;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n }\n }\n\n .remaining-text {\n color: $es-text-muted;\n\n strong {\n color: $es-text-secondary;\n font-weight: $es-font-weight-semibold;\n }\n }\n\n .btn-load-all {\n @include button-reset;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-primary;\n background: transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n }\n\n // Right side: action buttons\n .dropdown-footer-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .dropdown-action-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n .btn-shortcut {\n font-size: 10px;\n padding: 0.125rem 0.25rem;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 3px;\n font-weight: $es-font-weight-normal;\n }\n\n &.btn-cancel {\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-border-dark;\n }\n }\n\n &.btn-apply,\n &.btn-save {\n color: $es-white;\n background: $es-primary;\n border: 1px solid $es-primary;\n\n &:hover {\n background: $es-primary-hover;\n border-color: $es-primary-hover;\n }\n\n .btn-shortcut {\n background: rgba(255, 255, 255, 0.2);\n }\n }\n }\n\n // Legacy support - hide old load more section when new footer exists\n .dropdown-load-more {\n display: none;\n }\n\n .load-more-controls {\n display: none;\n }\n\n // Filter panel\n .dropdown-filter-panel {\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n }\n\n .filter-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: $es-spacing-sm;\n }\n\n .filter-panel-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .filter-panel-toggle {\n @include button-reset;\n font-size: $es-font-size-xs;\n color: $es-primary;\n\n &:hover {\n text-decoration: underline;\n }\n }\n\n .filter-panel-content {\n display: grid;\n gap: $es-spacing-sm;\n grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n }\n\n .filter-group {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .filter-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n }\n\n .filter-select,\n .filter-input {\n @include input-base;\n padding: 0.375rem $es-spacing-sm;\n font-size: $es-font-size-xs;\n }\n}\n\n// Category tree view\n.target-conditions-trait,\n.entity-selector-trait {\n .category-tree {\n padding: $es-spacing-sm;\n }\n\n .tree-container {\n // Contains tree items\n }\n\n .tree-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n // Tree item (used by JavaScript)\n .tree-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: 0.375rem $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .tree-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n\n &.has-children {\n // Parent node styling\n }\n }\n\n // tree-toggle, btn-select-children, tree-checkbox, tree-icon styles in _tree.scss\n\n .tree-info {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n flex: 1;\n min-width: 0;\n }\n\n .tree-name {\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .tree-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n // Legacy category tree classes (for compatibility)\n .category-tree-item {\n padding: 0.25rem 0;\n }\n\n .category-tree-node {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n }\n }\n\n .category-tree-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n color: $es-text-muted;\n transition: transform $es-transition-fast;\n\n &.expanded {\n transform: rotate(90deg);\n }\n\n &.empty {\n visibility: hidden;\n }\n }\n\n .category-tree-checkbox {\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n &.checked {\n background: $es-primary;\n border-color: $es-primary;\n\n &::after {\n content: '\\2713';\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n color: $es-white;\n font-size: 10px;\n }\n }\n\n &.indeterminate {\n background: $es-primary;\n border-color: $es-primary;\n\n &::after {\n content: '\\2212';\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n color: $es-white;\n font-size: 10px;\n }\n }\n }\n\n .category-tree-name {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .category-tree-count {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .category-tree-children {\n margin-left: 24px;\n }\n\n // Search history\n .search-history-list {\n padding: $es-spacing-sm;\n }\n\n .history-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n > i {\n color: $es-text-muted;\n font-size: 14px;\n }\n }\n\n .history-query {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n }\n\n .btn-delete-history {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n opacity: 0;\n transition: all $es-transition-fast;\n\n .history-item:hover & {\n opacity: 1;\n }\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Filter panel\n .filter-panel {\n display: none;\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n\n &.show {\n display: block;\n }\n }\n\n .filter-row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-sm;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // View mode select\n .view-mode-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 80px;\n }\n}\n\n// =============================================================================\n// Global dropdown styles (when appended to body instead of inside wrapper)\n// Duplicates key styles for when dropdown is outside .entity-selector-trait\n// =============================================================================\nbody > .target-search-dropdown,\n.target-search-dropdown {\n @include dropdown-container;\n display: none;\n width: 600px;\n max-width: calc(100vw - 40px);\n\n &.show {\n display: block;\n }\n\n // Dropdown header\n .dropdown-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n flex-wrap: wrap;\n }\n\n .results-count {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n white-space: nowrap;\n }\n\n .dropdown-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n flex-wrap: wrap;\n flex: 1;\n justify-content: flex-end;\n }\n\n .btn-select-all,\n .btn-clear-selection {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n border-color: $es-slate-300;\n }\n\n kbd {\n font-size: 0.65rem;\n padding: 0.125rem 0.25rem;\n background: $es-slate-100;\n border-radius: 2px;\n color: $es-text-muted;\n }\n }\n\n .sort-controls {\n display: flex;\n align-items: center;\n // No gap - elements are connected\n }\n\n .sort-field-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 80px;\n height: 28px; // Match btn-sort-dir height\n border-radius: $es-radius-sm 0 0 $es-radius-sm;\n border-right: none;\n }\n\n .btn-sort-dir {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 38px;\n min-width: 38px;\n flex-shrink: 0;\n height: 28px;\n padding: 0;\n margin: 0;\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n\n &.active {\n background: $es-primary-light;\n border-color: $es-primary;\n color: $es-primary;\n }\n }\n\n .view-mode-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 80px;\n margin-left: 0.25rem;\n }\n\n .btn-toggle-filters,\n .btn-show-history {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n min-width: 32px;\n flex-shrink: 0;\n height: 28px;\n padding: 0;\n margin: 0;\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n\n &.active {\n background: $es-primary-light;\n border-color: $es-primary;\n color: $es-primary;\n }\n }\n\n .refine-compact {\n display: flex;\n align-items: center;\n // No gap - elements are connected\n\n // Connected to refine-input\n .btn-refine-negate {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n min-width: 32px;\n flex-shrink: 0;\n height: 28px;\n padding: 0;\n margin: 0;\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-right: none;\n border-radius: $es-radius-sm 0 0 $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n\n &.active {\n background: $es-danger-light;\n color: $es-danger;\n border-color: $es-danger;\n }\n }\n\n .refine-input {\n @include input-base;\n width: 100px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n }\n\n .btn-clear-refine {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n margin: 0;\n margin-left: -1px; // Overlap input border when visible\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n }\n }\n\n // Filter panel\n .filter-panel {\n display: none;\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n\n &.show {\n display: block;\n }\n }\n\n .filter-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex-wrap: wrap;\n margin-bottom: $es-spacing-sm;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .filter-label {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n cursor: pointer;\n\n input[type=\"checkbox\"] {\n margin: 0;\n }\n }\n\n .filter-price-range {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n\n .filter-price-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .filter-price-min,\n .filter-price-max {\n @include input-base;\n width: 70px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n }\n\n .filter-price-sep {\n color: $es-text-muted;\n }\n }\n\n .btn-clear-filters {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n cursor: pointer;\n margin-left: auto;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n }\n\n // Multi-row filters\n .filter-row-multi {\n flex-direction: column;\n align-items: stretch;\n gap: $es-spacing-sm;\n }\n\n .filter-subrow {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex-wrap: wrap;\n }\n\n .filter-range-group,\n .filter-date-group,\n .filter-select-group {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n\n .filter-range-label,\n .filter-date-label,\n .filter-select-label,\n .filter-row-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n white-space: nowrap;\n\n i {\n margin-right: 0.25rem;\n }\n }\n\n .filter-range-sep {\n color: $es-text-muted;\n }\n\n .filter-product-count-min,\n .filter-product-count-max,\n .filter-sales-min,\n .filter-sales-max,\n .filter-turnover-min,\n .filter-turnover-max,\n .filter-date-add-from,\n .filter-date-add-to,\n .filter-last-product-from,\n .filter-last-product-to {\n @include input-base;\n width: 70px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n }\n\n .filter-depth-select,\n .filter-attribute-group-select,\n .filter-feature-group-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 100px;\n }\n\n .filter-attributes-container,\n .filter-features-container,\n .filter-values-container {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n }\n\n // Filter group toggle buttons (attribute/feature groups)\n .filter-group-toggle {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n border-color: $es-slate-300;\n }\n\n &.active {\n background: $es-primary-light;\n border-color: $es-primary;\n color: $es-primary;\n\n .toggle-count {\n color: $es-primary;\n }\n }\n\n &.has-selection {\n border-color: $es-success;\n background: rgba($es-success, 0.05);\n\n .toggle-count {\n color: $es-success;\n font-weight: $es-font-weight-semibold;\n }\n }\n\n .toggle-name {\n font-weight: $es-font-weight-medium;\n }\n\n .toggle-count {\n color: $es-text-muted;\n font-size: 0.65rem;\n }\n }\n\n // Filter value chips\n .filter-chip {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n background: $es-slate-100;\n border: 1px solid transparent;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n &.active {\n background: $es-primary;\n color: $es-white;\n }\n }\n\n // Filter attribute chip (specific)\n .filter-attr-chip,\n .filter-feat-chip {\n @extend .filter-chip;\n }\n\n // Filter row for values (expandable)\n .filter-row-values {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n\n .filter-values-container {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.25rem;\n flex: 1;\n }\n\n .filter-values-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n white-space: nowrap;\n }\n\n .btn-close-values {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n }\n }\n\n // Filter chip name and count\n .chip-name {\n font-weight: $es-font-weight-medium;\n }\n\n .chip-count {\n font-size: 0.6rem;\n color: $es-text-muted;\n margin-left: 0.125rem;\n }\n\n .filter-chip.active .chip-count {\n color: rgba(255, 255, 255, 0.8);\n }\n\n // Filter chip wrapper (chip/toggle + preview button)\n .filter-chip-wrapper {\n display: inline-flex;\n align-items: stretch;\n border-radius: $es-radius-sm;\n overflow: hidden;\n\n // Left element gets left-only border-radius\n .filter-chip,\n .filter-group-toggle {\n border-radius: $es-radius-sm 0 0 $es-radius-sm;\n }\n\n // Preview eye button — unified for both value chips and group toggles\n .chip-preview-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0 0.375rem;\n font-size: 10px;\n color: $es-text-muted;\n background: $es-slate-100;\n border-left: 1px solid $es-border-color;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.1);\n color: $es-primary;\n }\n\n &.popover-open {\n background: $es-primary;\n color: $es-white;\n }\n\n &.loading i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n // When no preview button, restore full border-radius\n .filter-chip:last-child,\n .filter-group-toggle:last-child {\n border-radius: $es-radius-sm;\n }\n\n // Group toggle active/has-selection states propagate to wrapper border\n .filter-group-toggle.active + .chip-preview-btn {\n border-left-color: $es-primary;\n background: rgba($es-primary, 0.05);\n }\n\n .filter-group-toggle.has-selection + .chip-preview-btn {\n border-left-color: $es-success;\n background: rgba($es-success, 0.03);\n }\n }\n\n // Dropdown content\n .dropdown-content {\n max-height: 400px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n .dropdown-items {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm;\n }\n\n .item-checkbox {\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n }\n }\n\n .item-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n object-fit: cover;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n }\n\n .item-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .item-meta {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n @include text-truncate;\n }\n\n // Dropdown footer - unified structure\n .dropdown-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n .dropdown-footer-left {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-label {\n color: $es-text-muted;\n }\n\n .load-more-select,\n select.load-more-select {\n appearance: none;\n padding: 0.25rem 1.5rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.4rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n cursor: pointer;\n min-width: 55px;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n }\n }\n\n .remaining-text {\n color: $es-text-muted;\n\n strong {\n color: $es-text-secondary;\n font-weight: $es-font-weight-semibold;\n }\n }\n }\n\n .dropdown-footer-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .dropdown-action-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n white-space: nowrap;\n\n .btn-shortcut {\n font-size: 10px;\n padding: 0.125rem 0.25rem;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 3px;\n font-weight: $es-font-weight-normal;\n }\n\n &.btn-cancel {\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-border-dark;\n }\n }\n\n &.btn-apply,\n &.btn-save {\n color: $es-white;\n background: $es-primary;\n border: 1px solid $es-primary;\n\n &:hover {\n background: $es-primary-hover;\n border-color: $es-primary-hover;\n }\n\n .btn-shortcut {\n background: rgba(255, 255, 255, 0.2);\n }\n }\n }\n\n .dropdown-footer-info {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n // Legacy button support\n .btn-cancel-dropdown {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-sm;\n color: $es-white;\n background: $es-primary;\n border: 1px solid $es-primary;\n border-radius: $es-radius-sm;\n cursor: pointer;\n\n &:hover {\n background: $es-primary-hover;\n border-color: $es-primary-hover;\n }\n\n i {\n font-size: 10px;\n }\n\n kbd {\n font-size: 0.65rem;\n padding: 0.125rem 0.25rem;\n background: rgba(255, 255, 255, 0.2);\n border-radius: 2px;\n color: rgba(255, 255, 255, 0.8);\n }\n }\n\n // Filter chips in dropdown\n .filter-chips-row {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-md;\n border-bottom: 1px solid $es-border-color;\n }\n\n .filter-chip {\n @include chip;\n }\n\n // Empty and loading states\n .dropdown-empty,\n .dropdown-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n margin-bottom: $es-spacing-sm;\n }\n }\n\n // Search history panel\n .search-history-panel {\n display: none;\n padding: $es-spacing-sm;\n background: $es-white;\n border-bottom: 1px solid $es-border-color;\n\n &.show {\n display: block;\n }\n }\n\n .history-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n i {\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n }\n\n span {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n }\n\n .btn-remove-history,\n .btn-delete-history {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-danger;\n }\n }\n }\n\n // Search history list container\n .search-history-list {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n }\n\n // Results header (for list view columns)\n .results-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-md;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n\n .header-spacer {\n width: 58px; // checkbox + image width\n flex-shrink: 0;\n }\n\n .header-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n }\n\n .header-col-name {\n flex: 1;\n text-align: left;\n }\n }\n\n // Results container\n .dropdown-results {\n padding: 0 $es-spacing-sm;\n background: $es-white;\n min-height: 200px;\n }\n\n // Dropdown item (search result)\n .dropdown-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm 0;\n background: $es-white;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n cursor: pointer;\n transition: background $es-transition-fast;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .result-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n color: $es-white;\n\n i {\n display: block;\n }\n }\n }\n\n &.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n }\n\n // Checkbox indicator\n .result-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n background: $es-white;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n i {\n display: none;\n font-size: 10px;\n }\n }\n\n // View mode classes (applied to dropdown container) - no gap/padding for shared borders\n &.view-cols-2 .dropdown-results { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-3 .dropdown-results { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-4 .dropdown-results { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-5 .dropdown-results { display: grid; grid-template-columns: repeat(5, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-6 .dropdown-results { display: grid; grid-template-columns: repeat(6, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-7 .dropdown-results { display: grid; grid-template-columns: repeat(7, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-8 .dropdown-results { display: grid; grid-template-columns: repeat(8, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n\n // Grid view item styling (compact cards with shared borders)\n &.view-cols-2,\n &.view-cols-3,\n &.view-cols-4,\n &.view-cols-5,\n &.view-cols-6,\n &.view-cols-7,\n &.view-cols-8 {\n .dropdown-item {\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding: $es-spacing-sm;\n border: none;\n border-right: 1px solid $es-border-color;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n\n .result-checkbox {\n position: absolute;\n top: $es-spacing-xs;\n left: $es-spacing-xs;\n }\n\n .result-image,\n .result-icon {\n width: 48px;\n height: 48px;\n margin-bottom: $es-spacing-xs;\n }\n\n .result-info {\n width: 100%;\n }\n\n .result-name {\n font-size: $es-font-size-xs;\n line-height: 1.3;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .result-subtitle {\n display: none;\n }\n\n // Show compact product info in grid\n .result-col {\n display: none;\n }\n\n .result-grid-info {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 0.25rem;\n margin-top: $es-spacing-xs;\n font-size: 0.65rem;\n\n .grid-price {\n color: $es-text-primary;\n font-weight: $es-font-weight-semibold;\n }\n\n .grid-stock {\n color: $es-text-muted;\n\n &.stock-out { color: $es-danger; }\n &.stock-low { color: $es-warning; }\n }\n\n .grid-discount {\n color: $es-success;\n font-weight: $es-font-weight-medium;\n }\n }\n }\n\n // Hide results header in grid views\n .results-header {\n display: none;\n }\n }\n\n // Remove right border from last item in each row (per column count)\n &.view-cols-2 .dropdown-results .dropdown-item:nth-child(2n) { border-right: none; }\n &.view-cols-3 .dropdown-results .dropdown-item:nth-child(3n) { border-right: none; }\n &.view-cols-4 .dropdown-results .dropdown-item:nth-child(4n) { border-right: none; }\n &.view-cols-5 .dropdown-results .dropdown-item:nth-child(5n) { border-right: none; }\n &.view-cols-6 .dropdown-results .dropdown-item:nth-child(6n) { border-right: none; }\n &.view-cols-7 .dropdown-results .dropdown-item:nth-child(7n) { border-right: none; }\n &.view-cols-8 .dropdown-results .dropdown-item:nth-child(8n) { border-right: none; }\n\n // Smaller items for higher column counts\n &.view-cols-5,\n &.view-cols-6,\n &.view-cols-7,\n &.view-cols-8 {\n .dropdown-item {\n .result-image,\n .result-icon {\n width: 40px;\n height: 40px;\n }\n\n .result-name {\n font-size: 0.65rem;\n }\n }\n }\n\n // Product-specific result item\n .result-item-product {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex: 1;\n min-width: 0;\n }\n\n .result-item-image,\n .result-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n overflow: hidden;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n }\n\n .result-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n background: $es-slate-100;\n border-radius: $es-radius-sm;\n color: $es-text-muted;\n\n i {\n font-size: 16px;\n }\n }\n\n .result-item-info,\n .result-info {\n flex: 1;\n min-width: 0;\n }\n\n .result-item-name,\n .result-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .result-item-meta,\n .result-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .subtitle-line {\n @include text-truncate;\n }\n\n .subtitle-line-primary {\n color: $es-text-secondary;\n }\n\n .subtitle-line-secondary {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n // Result columns (for product list view)\n .result-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n font-size: $es-font-size-xs;\n }\n\n .result-col-price {\n color: $es-text-secondary;\n }\n\n .result-col-sale {\n color: $es-danger;\n font-weight: $es-font-weight-semibold;\n }\n\n .result-col-stock {\n .col-value {\n &.stock-ok {\n color: $es-success;\n }\n\n &.stock-low {\n color: $es-warning;\n }\n\n &.stock-out {\n color: $es-danger;\n }\n }\n }\n\n .result-col-sales {\n color: $es-text-muted;\n }\n\n .col-value {\n display: block;\n }\n\n // Result checkbox\n .result-item-checkbox,\n .result-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n border: 2px solid $es-border-dark;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n i {\n display: none;\n font-size: 10px;\n color: $es-white;\n }\n\n .dropdown-result-item.selected &,\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n\n // No results state\n .no-results {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: 1.25rem;\n opacity: 0.5;\n }\n }\n\n // Load more controls\n .load-more-controls {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-more-label,\n .load-more-of {\n white-space: nowrap;\n }\n\n .remaining-count {\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n\n .load-more-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 60px;\n }\n\n .btn-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xs;\n margin: 0;\n border: none;\n color: $es-primary;\n background: $es-primary-light !important;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n font: inherit;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: rgba($es-primary, 0.2) !important;\n }\n }\n }\n\n // Load more button\n .dropdown-load-more {\n display: flex;\n justify-content: center;\n padding: $es-spacing-md;\n border-top: 1px solid $es-border-color;\n\n .load-more-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n\n &.loading {\n opacity: 0.7;\n cursor: wait;\n }\n }\n }\n\n // Dropdown body\n .dropdown-body {\n max-height: 400px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n // Tree view styles (for categories)\n .tree-container {\n padding: $es-spacing-sm;\n }\n\n .tree-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n .tree-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: 0.375rem $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .tree-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n }\n\n // tree-toggle, btn-select-children, tree-checkbox, tree-icon styles in _tree.scss\n\n .tree-info {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n flex: 1;\n min-width: 0;\n }\n\n .tree-name {\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .tree-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n}\n\n// ============================================================================\n// Standalone dropdown styles (for when dropdown is appended to body)\n// These selectors work because .target-search-dropdown is on the dropdown itself\n// ============================================================================\n\n.target-search-dropdown {\n // Results container - scrollable\n .dropdown-results {\n max-height: 400px;\n overflow-y: auto;\n padding: 0 $es-spacing-sm;\n @include custom-scrollbar;\n }\n\n // Results header (for list view columns)\n .results-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-md;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n\n .header-spacer {\n width: 58px; // checkbox + image width\n flex-shrink: 0;\n }\n\n .header-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n }\n\n .header-col-name {\n flex: 1;\n text-align: left;\n }\n }\n\n // Hide results-header by default, show only for products in list view\n &:not(.view-list) .results-header,\n &.view-tree .results-header {\n display: none;\n }\n\n // Result item for products\n .result-item-product {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex: 1;\n min-width: 0;\n }\n\n // Result columns for product data\n .result-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n font-size: $es-font-size-xs;\n }\n\n .result-col-price {\n color: $es-text-secondary;\n }\n\n .result-col-sale {\n color: $es-danger;\n font-weight: $es-font-weight-semibold;\n }\n\n .result-col-stock {\n .col-value {\n &.stock-ok { color: $es-success; }\n &.stock-low { color: $es-warning; }\n &.stock-out { color: $es-danger; }\n }\n }\n\n .result-col-sales {\n color: $es-text-muted;\n }\n\n // Dropdown item styling\n .dropdown-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: 0;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n }\n }\n\n // Result checkbox styling\n .result-checkbox {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n i {\n font-size: 10px;\n color: transparent;\n }\n\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n color: $es-white;\n }\n }\n }\n\n // Result image\n .result-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n overflow: hidden;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n }\n\n // Result icon (for non-image entities)\n .result-icon {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n background: $es-slate-100;\n border-radius: $es-radius-sm;\n\n i {\n font-size: 16px;\n color: $es-text-muted;\n }\n }\n\n // Result info container\n .result-info {\n flex: 1;\n min-width: 0;\n }\n\n .result-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .result-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .subtitle-line {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .subtitle-line-primary {\n color: $es-text-secondary;\n }\n\n .subtitle-line-secondary {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n // Hide columns in grid/tree views\n &[class*=\"view-cols-\"] .result-col,\n &.view-tree .result-col {\n display: none;\n }\n\n // Entity search box - full width\n .entity-search-box {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n width: 100%;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n\n .entity-search-icon {\n color: $es-text-muted;\n flex-shrink: 0;\n margin-left: $es-spacing-xs;\n }\n\n // Override Bootstrap/parent form input styles\n input.entity-search-input,\n input.entity-search-input[type=\"text\"] {\n flex: 1;\n min-width: 0;\n width: auto !important;\n max-width: none !important;\n height: auto;\n padding: 0;\n margin: 0;\n border: none !important;\n outline: none;\n background: transparent !important;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n box-shadow: none !important;\n\n &::placeholder {\n color: $es-text-muted;\n }\n\n &:focus {\n border: none !important;\n box-shadow: none !important;\n outline: none;\n }\n }\n\n .search-loading {\n color: $es-text-muted;\n }\n }\n}\n\n// Body-level dropdown (when appended to body for z-index)\nbody > .target-search-dropdown {\n // Override dropdown-item border when inside body-appended dropdown\n .dropdown-item {\n border: none;\n border-radius: 0;\n\n &:not(:last-child) {\n border-bottom: 1px solid $es-border-color;\n }\n }\n}\n\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n","/**\n * Chips Component\n * Entity chips, selection pills, tags\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Chips container wrapper with toolbar\n .chips-wrapper {\n display: flex;\n flex-direction: column;\n margin-top: $es-spacing-sm;\n background: $es-slate-50;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n overflow: hidden;\n }\n\n // Chips toolbar - integrated filter bar inside chips area\n .chips-toolbar {\n display: none;\n align-items: center;\n flex-wrap: nowrap;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n padding-bottom: 0;\n background: transparent;\n\n &.has-chips {\n display: flex;\n }\n\n // Filter input - takes available space, icon embedded as background\n // Using [type=\"text\"] for specificity over .bootstrap input[type=\"text\"]\n input[type=\"text\"].chips-search-input {\n all: unset;\n display: block;\n flex: 1 1 auto;\n min-width: 80px;\n width: auto;\n height: auto;\n padding: 0.2rem 0.5rem 0.2rem 1.5rem;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E\") no-repeat 0.375rem center;\n background-size: 10px;\n border: 1px solid $es-slate-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n line-height: 1.4;\n color: $es-text-primary;\n box-sizing: border-box;\n transition: all $es-transition-fast;\n\n &::placeholder {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n // Sort dropdown - compact, auto width\n select.chips-sort-select {\n all: unset;\n flex: 0 0 auto;\n padding: 0.2rem 1.25rem 0.2rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.375rem center;\n background-size: 8px;\n font-size: 10px;\n line-height: 1.4;\n color: $es-text-secondary;\n cursor: pointer;\n box-sizing: border-box;\n white-space: nowrap;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n }\n\n // Count badge - smaller, pill style\n .chips-count {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0; // Don't shrink\n gap: 0.125rem;\n padding: 0.2rem 0.5rem;\n background: $es-slate-200;\n color: $es-text-secondary;\n font-size: 10px;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-sm;\n white-space: nowrap;\n line-height: 1.4;\n\n &.has-filter {\n background: $es-cyan-100;\n color: $es-cyan-700;\n }\n\n .count-filtered {\n font-weight: $es-font-weight-bold;\n }\n\n .count-separator {\n opacity: 0.6;\n margin: 0 0.125rem;\n }\n }\n\n .chips-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n margin-left: auto;\n }\n\n // Clear button - subtle, chip-like\n .btn-chips-clear {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n flex-shrink: 0; // Don't shrink\n gap: 0.25rem;\n padding: 0.2rem 0.5rem;\n color: $es-danger;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n background: rgba($es-danger, 0.1);\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n white-space: nowrap; // Prevent text wrapping\n line-height: 1.4;\n\n &:hover {\n background: $es-danger;\n color: $es-white;\n }\n\n i {\n font-size: 9px;\n flex-shrink: 0;\n }\n\n .clear-text {\n // Hide text on small screens, keep icon\n @media (max-width: 480px) {\n display: none;\n }\n }\n }\n\n // Chips container - flows naturally from toolbar\n .entity-chips {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md $es-spacing-md;\n min-height: 40px;\n max-height: 300px;\n overflow-y: auto;\n\n &:empty {\n display: none;\n }\n }\n\n // Load more section with select dropdown\n .chips-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: transparent;\n border-top: 1px dashed $es-border-color;\n\n .load-more-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .load-more-select,\n select.load-more-select {\n appearance: none;\n padding: 0.25rem 1.75rem 0.25rem 0.5rem !important;\n border: 1px solid $es-border-color !important;\n border-radius: $es-radius-sm !important;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.5rem center !important;\n background-size: 8px !important;\n font-size: $es-font-size-xs !important;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n cursor: pointer;\n transition: all $es-transition-fast;\n height: auto !important;\n min-height: 0 !important;\n line-height: 1.3 !important;\n\n &:hover {\n border-color: $es-primary !important;\n background-color: $es-primary-light !important;\n }\n\n &:focus {\n outline: none !important;\n border-color: $es-primary !important;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1) !important;\n }\n }\n\n .load-more-remaining {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n // Individual chip\n .entity-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-100;\n color: $es-text-secondary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n // Chip with image\n &.has-image {\n padding-left: 0.25rem;\n }\n\n // Hidden by search filter or pagination\n &.chip-filtered-out,\n &.chip-paginated-out {\n display: none;\n }\n }\n\n .chip-image {\n width: 20px;\n height: 20px;\n object-fit: cover;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .chip-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n color: $es-text-muted;\n flex-shrink: 0;\n\n // Product/entity images inside chip\n img {\n width: 20px;\n height: 20px;\n object-fit: cover;\n border-radius: $es-radius-sm;\n }\n }\n\n // Country flag in chip\n .chip-flag {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n\n img {\n width: 18px;\n height: 12px;\n object-fit: cover;\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n }\n\n .flag-fallback {\n width: 18px;\n height: 12px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #e8eaed 0%, #dadce0 100%);\n border-radius: 2px;\n font-size: 10px;\n color: #5f6368;\n }\n }\n\n // Holiday preview button in country chip\n .chip-preview-holidays {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n color: $es-primary;\n border-radius: 50%;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.15);\n color: darken($es-primary, 10%);\n }\n\n i.material-icons {\n font-size: 14px;\n }\n }\n\n .chip-text,\n .chip-name {\n // Show full name, no truncation\n word-break: break-word;\n }\n\n .chip-attrs {\n font-size: 0.85em;\n opacity: 0.7;\n margin-left: 2px;\n\n &::before {\n content: '— ';\n }\n }\n\n .chip-remove {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 0.125rem;\n color: $es-text-muted;\n border-radius: 50%;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Chip variants\n .entity-chip.chip-primary {\n background: $es-primary-light;\n color: $es-primary;\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n }\n\n .entity-chip.chip-success {\n background: $es-success-light;\n color: $es-success-dark;\n\n &:hover {\n background: rgba($es-success, 0.2);\n }\n }\n\n .entity-chip.chip-danger {\n background: $es-danger-light;\n color: $es-danger;\n\n &:hover {\n background: rgba($es-danger, 0.2);\n }\n }\n\n .entity-chip.chip-warning {\n background: $es-warning-light;\n color: color.adjust($es-warning, $lightness: -20%);\n\n &:hover {\n background: rgba($es-warning, 0.3);\n }\n }\n\n // Chip loading state\n .entity-chip.loading,\n .entity-chip-loading {\n opacity: 0.7;\n\n .chip-remove {\n display: none;\n }\n\n .chip-icon i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n // Hidden chip (collapsed view)\n .entity-chip.chip-hidden {\n display: none;\n }\n\n // Chips expanded/collapsed states\n .entity-chips.chips-collapsed,\n .entity-chips.chips-expanded {\n position: relative;\n }\n\n // Show more/less toggle\n .chips-show-more-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n color: $es-primary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n cursor: pointer;\n transition: color $es-transition-fast;\n\n &:hover {\n color: $es-primary-hover;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n .chips-collapse-toggle,\n .chips-expand-toggle {\n // Specific variants inherit from .chips-show-more-toggle\n }\n\n // More chips indicator\n .chips-more {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem 0.5rem;\n background: $es-slate-200;\n color: $es-text-secondary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-full;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-300;\n }\n }\n\n // Add chip button\n .chip-add-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: transparent;\n color: $es-primary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border: 1px dashed $es-primary;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Inline chips (compact mode)\n .entity-chips.inline {\n display: inline-flex;\n padding: 0;\n min-height: auto;\n\n .entity-chip {\n padding: 0.125rem 0.375rem;\n font-size: 11px;\n }\n }\n\n // Selected chips section in include/exclude\n .selected-chips-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n }\n\n .selected-chips-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n }\n\n // Pattern chips (for name/reference patterns)\n .entity-chip.chip-pattern {\n background: #fef3c7;\n color: #92400e;\n font-family: monospace;\n\n &:hover {\n background: #fde68a;\n }\n\n .chip-icon {\n color: #d97706;\n }\n }\n\n // Range chips (price, quantity, etc.)\n .entity-chip.chip-range,\n .range-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.25rem 0.5rem;\n background: $es-cyan-50;\n color: $es-cyan-600;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-cyan-100;\n }\n }\n\n .range-chip-text {\n font-family: monospace;\n }\n\n .btn-remove-range {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n color: $es-cyan-600;\n border-radius: 50%;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Multi-range chips container\n .multi-range-chips {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n margin-bottom: $es-spacing-xs;\n\n &:empty {\n display: none;\n }\n }\n\n // Pattern chips container\n .pattern-chips {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm 0;\n min-height: 32px;\n\n &:empty::before {\n content: attr(data-placeholder);\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-style: italic;\n }\n }\n\n // Pattern tag\n .pattern-tag {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: #fef3c7;\n color: #92400e;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: #fde68a;\n }\n\n &.case-sensitive {\n .case-icon {\n color: $es-success;\n font-weight: $es-font-weight-bold;\n }\n }\n\n &.draft-tag {\n background: $es-white;\n border: 1px solid $es-border-color;\n padding: 0;\n flex: 1;\n min-width: 150px;\n\n &:hover {\n background: $es-white;\n }\n\n .pattern-input {\n flex: 1;\n min-width: 100px;\n padding: 0.375rem;\n border: 0;\n background: transparent;\n font-size: $es-font-size-sm;\n font-family: inherit;\n\n &:focus {\n outline: none;\n }\n\n &::placeholder {\n color: $es-text-muted;\n font-style: italic;\n }\n }\n }\n }\n\n .pattern-tag-text {\n font-family: monospace;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .btn-toggle-case {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n }\n }\n\n .case-icon {\n font-size: 11px;\n font-weight: $es-font-weight-semibold;\n font-family: monospace;\n }\n\n .btn-remove-pattern {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n color: #d97706;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n .btn-add-pattern {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Pattern match count (in draft tag)\n .pattern-match-count {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0 0.375rem;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n cursor: pointer;\n\n &.count-zero {\n color: $es-warning;\n }\n\n &.count-found {\n color: $es-success;\n }\n\n .count-value {\n font-weight: $es-font-weight-semibold;\n }\n }\n\n // Pattern input row\n .pattern-input-row {\n display: flex;\n align-items: stretch;\n gap: $es-spacing-xs;\n }\n}\n\n// ==========================================================================\n// Holiday Preview Popover (Country chip eye button)\n// ==========================================================================\n\n.holiday-preview-popover {\n position: absolute;\n z-index: 10001;\n width: 320px;\n max-width: 90vw;\n background: $es-white;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-xl;\n overflow: hidden;\n\n .popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n }\n\n .popover-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .popover-flag {\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n }\n\n .popover-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i.material-icons {\n font-size: 18px;\n }\n }\n\n .popover-body {\n max-height: 350px;\n overflow-y: auto;\n padding: $es-spacing-sm;\n @include custom-scrollbar;\n }\n\n // Loading state\n .holiday-preview-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i.material-icons {\n font-size: 20px;\n }\n\n .icon-spin {\n animation: spin 1s linear infinite;\n }\n }\n\n // Empty state\n .holiday-preview-empty {\n text-align: center;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n\n i.material-icons {\n font-size: 48px;\n opacity: 0.4;\n margin-bottom: $es-spacing-sm;\n display: block;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n }\n\n // Holiday list\n .holiday-list {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n }\n\n .holiday-item {\n display: flex;\n align-items: flex-start;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n border-left: 3px solid $es-success;\n\n &.holiday-type-bank,\n &.holiday-type-bank-holiday {\n border-left-color: $es-info;\n }\n\n &.holiday-type-observance {\n border-left-color: $es-warning;\n }\n\n &.holiday-type-regional,\n &.holiday-type-local-holiday {\n border-left-color: #8b5cf6;\n }\n }\n\n .holiday-date {\n flex-shrink: 0;\n min-width: 80px;\n\n .holiday-day {\n display: block;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .holiday-weekday {\n display: block;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n .holiday-info {\n flex: 1;\n min-width: 0;\n }\n\n .holiday-country-flag {\n vertical-align: middle;\n margin-right: 0.25rem;\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n }\n\n .holiday-name {\n display: inline;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n word-wrap: break-word;\n }\n\n .holiday-type-badge {\n display: inline-block;\n margin-left: $es-spacing-sm;\n padding: 0.125rem 0.375rem;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n text-transform: capitalize;\n background: $es-slate-200;\n color: $es-text-secondary;\n border-radius: $es-radius-sm;\n vertical-align: middle;\n }\n\n .holiday-preview-note {\n margin-top: $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n text-align: center;\n }\n\n // Filter input\n .popover-filter {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-md;\n border-bottom: 1px solid $es-border-color;\n background: $es-slate-50;\n\n i.material-icons {\n font-size: 18px;\n color: $es-text-muted;\n }\n\n .holiday-filter-input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n outline: none;\n padding: $es-spacing-xs 0;\n\n &::placeholder {\n color: $es-text-muted;\n }\n }\n }\n}\n\n// Spin animation for loading icons\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n// Bootstrap specificity overrides for chips toolbar form elements\n// PrestaShop admin uses #content .mpr-config-form... with high specificity\n// We need to match or exceed that specificity\n#content.bootstrap,\n#content .bootstrap,\n.bootstrap #content {\n .target-conditions-trait,\n .entity-selector-trait {\n .chips-wrapper .chips-toolbar {\n // Double class for extra specificity\n input[type=\"text\"].chips-search-input.chips-search-input {\n all: unset;\n display: block;\n flex: 1 1 auto;\n min-width: 80px;\n width: auto;\n height: auto;\n padding: 0.2rem 0.5rem 0.2rem 1.5rem;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E\") no-repeat 0.375rem center;\n background-size: 10px;\n border: 1px solid $es-slate-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n line-height: 1.4;\n color: $es-text-primary;\n box-sizing: border-box;\n transition: all $es-transition-fast;\n\n &::placeholder {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n // Double class for extra specificity\n select.chips-sort-select.chips-sort-select {\n all: unset;\n flex: 0 0 auto;\n padding: 0.2rem 1.25rem 0.2rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.375rem center;\n background-size: 8px;\n font-size: 10px;\n line-height: 1.4;\n color: $es-text-secondary;\n cursor: pointer;\n box-sizing: border-box;\n white-space: nowrap;\n height: auto;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n }\n }\n}\n","/**\n * Groups Component\n * Selection groups, include/exclude sections, method selectors\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Group container\n .target-group {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n overflow: hidden;\n }\n\n // Group header\n .target-group-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n }\n\n .target-group-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n\n .group-number {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 0.25rem;\n background: $es-primary;\n color: $es-white;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-bold;\n border-radius: $es-radius-full;\n }\n }\n\n .target-group-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .group-action-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n &.danger:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n // Group body\n .target-group-body,\n .group-body {\n padding: $es-spacing-md;\n }\n\n // Include section\n .include-section {\n margin-bottom: $es-spacing-md;\n }\n\n .section-label {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n margin-bottom: $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n\n &.label-include {\n color: $es-success-dark;\n\n i {\n color: $es-success;\n }\n }\n\n &.label-exclude {\n color: $es-danger;\n\n i {\n color: $es-danger;\n }\n }\n }\n\n // Method selector\n .method-selector {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-sm;\n }\n\n .method-selector-wrapper {\n flex: 1;\n position: relative;\n }\n\n .method-select {\n @include input-base;\n padding-right: 2rem;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E\");\n background-position: right 0.5rem center;\n background-repeat: no-repeat;\n background-size: 1.5em 1.5em;\n }\n\n .method-help-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-primary;\n }\n }\n\n // Value picker (search trigger)\n .value-picker {\n position: relative;\n }\n\n .value-picker-trigger {\n @include button-reset;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n width: 100%;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n text-align: left;\n transition: all $es-transition-fast;\n\n &:hover {\n border-color: $es-slate-300;\n }\n\n &:focus {\n border-color: $es-primary;\n @include focus-ring($es-primary);\n }\n\n i {\n color: $es-text-light;\n }\n }\n\n // Pattern input (text input for patterns)\n .pattern-input-wrapper {\n position: relative;\n }\n\n .pattern-input {\n @include input-base;\n font-family: monospace;\n }\n\n .pattern-add-btn {\n @include button-reset;\n position: absolute;\n right: 0.25rem;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n\n // Multi-range input (price ranges)\n .multi-range-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .range-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .range-input {\n @include input-base;\n width: 100px;\n text-align: center;\n }\n\n .range-separator {\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n }\n\n .range-remove-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n .range-add-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n color: $es-primary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n\n // Multi-select tiles (stock status, etc.)\n .multi-select-tiles {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n }\n\n .multi-select-tile {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n background: $es-slate-100;\n color: $es-text-secondary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border: 1px solid transparent;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n &.selected {\n background: $es-primary-light;\n color: $es-primary;\n border-color: $es-primary;\n }\n }\n\n // Exclude section\n .exclude-section {\n margin-top: $es-spacing-md;\n padding-top: $es-spacing-md;\n border-top: 1px dashed $es-border-color;\n }\n\n // Legacy exclude-rows (if used elsewhere)\n .exclude-rows {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .exclude-row-content {\n flex: 1;\n }\n\n .exclude-remove-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n .add-exclude-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n margin-top: $es-spacing-sm;\n padding: 0.25rem 0.5rem;\n color: $es-danger;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border: 1px dashed $es-danger;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n }\n }\n\n // Add group button (used in block-footer)\n .btn-add-group {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.5rem 0.875rem;\n color: $es-primary;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n background: rgba($es-primary, 0.05);\n border: 1px dashed $es-primary;\n border-radius: 0.375rem;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.1);\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Block footer\n .block-footer {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n border-top: 1px solid $es-border-color;\n }\n\n // Block body\n .block-body {\n padding: 0;\n }\n\n // Groups container\n .groups-container {\n padding: $es-spacing-md;\n }\n\n // Groups empty state\n .groups-empty-state {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n }\n\n // Selection group\n .selection-group {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n margin-bottom: $es-spacing-md;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n &.collapsed {\n .group-body {\n display: none;\n }\n\n .group-collapse-toggle i {\n transform: rotate(-90deg);\n }\n }\n }\n\n // Group header\n .group-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n\n &.group-header-single {\n padding: $es-spacing-xs $es-spacing-md;\n background: transparent;\n border-bottom: none;\n }\n }\n\n .group-collapse-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n color: $es-text-muted;\n\n i {\n transition: transform $es-transition-fast;\n }\n }\n\n .group-name-wrapper {\n flex: 1;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .group-name-input {\n flex: 1;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n background: transparent;\n border: 1px solid transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover,\n &:focus {\n background: $es-white;\n border-color: $es-border-color;\n outline: none;\n }\n\n &::placeholder {\n color: $es-text-muted;\n font-weight: $es-font-weight-medium;\n }\n }\n\n .group-count-badge {\n @include count-badge($es-primary);\n }\n\n .btn-remove-group {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n // Group include section - green accent to distinguish from exclude\n .group-include {\n margin-bottom: $es-spacing-md;\n padding: $es-spacing-sm;\n background: rgba($es-success, 0.03);\n border: 1px solid rgba($es-success, 0.2);\n border-radius: $es-radius-md;\n }\n\n .section-row {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n // Method selector wrapper (from PHP)\n .method-selector-wrapper {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .method-info-placeholder {\n display: flex;\n align-items: center;\n min-width: 20px;\n }\n\n .include-method-select,\n .exclude-method-select {\n flex: 1;\n @include input-base;\n cursor: pointer;\n }\n\n // Lock indicator for method selector (when excludes are present)\n .selector-locked {\n .include-method-select {\n opacity: 0.7;\n cursor: not-allowed;\n }\n }\n\n .lock-indicator {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-warning;\n cursor: help;\n\n i {\n font-size: 14px;\n }\n\n .mpr-tooltip {\n display: none;\n position: absolute;\n bottom: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n padding: $es-spacing-xs $es-spacing-sm;\n background: $es-slate-800;\n color: $es-white;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-normal;\n white-space: nowrap;\n border-radius: $es-radius-sm;\n z-index: 100;\n }\n\n &:hover .mpr-tooltip {\n display: block;\n }\n }\n\n // Group excludes section\n .group-excludes {\n margin-top: $es-spacing-md;\n }\n\n .except-separator {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin: 0 0 $es-spacing-sm 0;\n\n // Lines on both sides\n &::before,\n &::after {\n content: '';\n flex: 1;\n height: 1px;\n background: rgba($es-danger, 0.3);\n }\n }\n\n .except-label {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.75rem;\n background: $es-danger-light;\n color: $es-danger;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-full;\n white-space: nowrap;\n flex-shrink: 0;\n\n i {\n font-size: 10px;\n }\n }\n\n .exclude-rows-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .exclude-row {\n display: flex;\n flex-direction: column;\n padding: $es-spacing-sm;\n background: rgba($es-danger, 0.03);\n border: 1px solid rgba($es-danger, 0.15);\n border-radius: $es-radius-md;\n\n // Value picker inside exclude row - full width\n .value-picker {\n width: 100%;\n margin-top: $es-spacing-sm;\n }\n }\n\n .exclude-header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n width: 100%;\n\n .method-selector-wrapper {\n flex: 1;\n }\n\n // Delete button at the far right\n .btn-remove-exclude-row {\n flex-shrink: 0;\n margin-left: auto;\n }\n }\n\n .btn-remove-exclude-row {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n .btn-add-exclude,\n .btn-add-another-exclude {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n margin-top: $es-spacing-sm;\n padding: 0.375rem 0.625rem;\n color: $es-danger;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n background: transparent;\n border: 1px dashed rgba($es-danger, 0.5);\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n border-color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Group modifiers (inline version from PHP)\n // Uses negative margins to break out of .group-body padding\n .group-modifiers {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n margin: $es-spacing-md (-$es-spacing-md) (-$es-spacing-md);\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n .modifier-inline {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n }\n\n // Common height for all modifier controls\n $modifier-height: 26px;\n\n .group-modifier-limit {\n width: 50px;\n max-width: 50px;\n height: $modifier-height;\n padding: 0 0.375rem;\n font-size: $es-font-size-xs;\n text-align: center;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n\n &:focus {\n border-color: $es-primary;\n outline: none;\n }\n }\n\n // Sort modifier - input group style (select + button glued together)\n .modifier-sort {\n gap: 0; // Remove gap to glue select + button together\n\n .modifier-label {\n margin-right: 0.375rem; // Keep space between label and input group\n }\n\n .group-modifier-sort {\n height: $modifier-height;\n padding: 0 0.5rem;\n font-size: $es-font-size-xs;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm 0 0 $es-radius-sm;\n border-right: none;\n cursor: pointer;\n\n &:focus {\n border-color: $es-primary;\n outline: none;\n position: relative;\n z-index: 1;\n }\n }\n\n .btn-sort-dir {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: $modifier-height;\n height: $modifier-height;\n color: $es-text-muted;\n background: $es-slate-100;\n border: 1px solid $es-border-color;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: 11px;\n }\n }\n }\n\n // Fallback for elements outside .modifier-sort context\n .group-modifier-sort {\n height: $modifier-height;\n padding: 0 0.5rem;\n font-size: $es-font-size-xs;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n\n &:focus {\n border-color: $es-primary;\n outline: none;\n }\n }\n\n .btn-sort-dir {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: $modifier-height;\n height: $modifier-height;\n color: $es-text-muted;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-secondary;\n }\n }\n\n .group-preview-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-100;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &.clickable {\n cursor: pointer;\n\n &:hover {\n background: $es-primary-light;\n color: $es-primary;\n }\n }\n }\n\n // OR separator between groups\n .group-separator {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-sm 0;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n &::before,\n &::after {\n content: '';\n flex: 1;\n height: 1px;\n background: $es-border-color;\n margin: 0 $es-spacing-md;\n }\n }\n\n // Group modifiers (limit, sort)\n .group-modifiers {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n padding-top: $es-spacing-md;\n margin-top: $es-spacing-md;\n border-top: 1px solid $es-border-color;\n }\n\n .modifier-group {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .modifier-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n white-space: nowrap;\n }\n\n .modifier-input {\n @include input-base;\n width: 80px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n }\n\n .modifier-select {\n @include input-base;\n width: auto;\n padding: 0.25rem 1.5rem 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E\");\n background-position: right 0.25rem center;\n background-repeat: no-repeat;\n background-size: 1.25em 1.25em;\n }\n\n // Single mode — strip padding, borders, backgrounds for clean single-selection UI\n &[data-mode=single],\n .mode-single {\n .groups-container {\n padding: 0;\n }\n\n .group-body {\n padding: 0;\n }\n\n .group-include {\n padding: 0.5rem;\n margin-bottom: 0;\n background: transparent;\n border: none;\n border-radius: 0;\n }\n\n .selection-group {\n background: transparent;\n border: none;\n margin-bottom: 0;\n }\n\n .group-header {\n display: none;\n }\n }\n\n // Condition match count badge\n .condition-match-count {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.125rem 0.375rem;\n background: $es-slate-100;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n &.has-results {\n background: $es-primary-light;\n color: $es-primary;\n }\n\n // Country holidays variant - use calendar icon style\n &.country-holidays {\n background: rgba(139, 92, 246, 0.1);\n color: #8b5cf6;\n\n &:hover {\n background: rgba(139, 92, 246, 0.2);\n }\n\n &.clickable {\n background: rgba(139, 92, 246, 0.15);\n }\n }\n\n i {\n font-size: 10px;\n }\n }\n}\n","/**\n * Value Picker Component\n * Search boxes, input types, range inputs\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Value picker container\n .value-picker {\n padding: $es-spacing-sm 0;\n\n &[style*=\"display: none\"],\n &[style*=\"display:none\"] {\n padding: 0;\n }\n }\n\n .include-picker,\n .exclude-picker {\n // Section-specific picker styles\n }\n\n // Entity search box\n .entity-search-box {\n position: relative;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:focus-within {\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n // Separation between chips and search box\n .chips-wrapper + .entity-search-box {\n margin-top: $es-spacing-md;\n }\n\n .entity-search-icon {\n color: $es-text-muted;\n font-size: 14px;\n flex-shrink: 0;\n margin-left: $es-spacing-xs;\n }\n\n // Override parent form's max-width on search input\n input.entity-search-input,\n input.entity-search-input[type=\"text\"] {\n @include input-reset;\n flex: 1;\n min-width: 0;\n width: auto !important;\n max-width: none !important;\n padding: 0.375rem;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n border: none !important;\n background: transparent !important;\n box-shadow: none !important;\n\n &::placeholder {\n color: $es-text-muted;\n }\n\n &:focus {\n border: none !important;\n box-shadow: none !important;\n outline: none;\n }\n }\n\n .search-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n color: $es-primary;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n // Browse tree button (for categories)\n .btn-browse-tree {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n margin-left: auto;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary;\n color: $es-white;\n }\n\n i {\n font-size: 14px;\n }\n }\n\n // Numeric range box\n .numeric-range-box,\n .multi-range-input-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .range-min-input,\n .range-max-input {\n @include input-base;\n width: 100px;\n padding: $es-spacing-sm;\n text-align: center;\n font-size: $es-font-size-sm;\n\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n -moz-appearance: textfield;\n }\n\n .range-separator {\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n }\n\n .btn-add-range {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-white;\n background: $es-primary;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-hover;\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Multi-range container\n .multi-range-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n // Date range box\n .date-range-box {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .date-from-input,\n .date-to-input {\n @include input-base;\n width: 140px;\n padding: $es-spacing-sm;\n font-size: $es-font-size-sm;\n }\n\n // Multi-select tiles\n .multi-select-tiles {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n }\n\n .tile-option {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n color: $es-text-muted;\n background: transparent;\n border: 1px dashed $es-border-color;\n border-radius: 100px; // Pill shape\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-normal;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n color: $es-text-secondary;\n border-color: $es-slate-400;\n border-style: solid;\n }\n\n &.selected {\n color: $es-primary;\n background: $es-primary-light;\n border: 1px solid $es-primary;\n font-weight: $es-font-weight-medium;\n }\n\n i {\n font-size: 11px;\n opacity: 0.6;\n }\n\n &.selected i {\n opacity: 1;\n }\n }\n\n .tile-label {\n white-space: nowrap;\n }\n\n // Select input box\n .select-input-box {\n display: inline-block;\n }\n\n .select-value-input {\n @include input-base;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n min-width: 150px;\n }\n\n // Boolean input box\n .boolean-input-box {\n display: inline-flex;\n align-items: center;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-success-light;\n color: $es-success-dark;\n border-radius: $es-radius-md;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n }\n\n .boolean-label {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n\n &::before {\n content: '\\2713';\n font-weight: bold;\n }\n }\n\n // Condition match count badge\n .condition-match-count {\n @include count-badge($es-primary);\n margin-left: $es-spacing-sm;\n }\n}\n","/**\n * Modal Component\n * Preview modals, confirmation dialogs\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Modal backdrop\n.mpr-modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: $es-z-modal;\n opacity: 0;\n transition: opacity $es-transition-normal;\n\n &.show {\n opacity: 1;\n }\n}\n\n// Modal container\n.mpr-modal {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n z-index: $es-z-modal + 1;\n width: 90%;\n max-width: 600px;\n max-height: 90vh;\n background: $es-white;\n border-radius: $es-radius-xl;\n box-shadow: $es-shadow-xl;\n opacity: 0;\n transition: all $es-transition-normal;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n &.show {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n\n &.modal-sm {\n max-width: 400px;\n }\n\n &.modal-lg {\n max-width: 800px;\n }\n\n &.modal-xl {\n max-width: 1000px;\n }\n\n &.modal-fullscreen {\n width: 95%;\n max-width: none;\n height: 90vh;\n max-height: none;\n }\n}\n\n// Modal header\n.mpr-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-md $es-spacing-lg;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n flex-shrink: 0;\n}\n\n.mpr-modal-title {\n font-size: $es-font-size-base;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n margin: 0;\n}\n\n.mpr-modal-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: $es-font-size-lg;\n }\n}\n\n// Modal body\n.mpr-modal-body {\n flex: 1;\n overflow-y: auto;\n padding: $es-spacing-lg;\n @include custom-scrollbar;\n}\n\n// Modal footer\n.mpr-modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: $es-spacing-sm;\n padding: $es-spacing-md $es-spacing-lg;\n background: $es-bg-header;\n border-top: 1px solid $es-border-color;\n flex-shrink: 0;\n}\n\n.mpr-modal-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &.btn-secondary {\n color: $es-text-secondary;\n background: $es-slate-100;\n\n &:hover {\n background: $es-slate-200;\n }\n }\n\n &.btn-primary {\n color: $es-white;\n background: $es-primary;\n\n &:hover {\n background: $es-primary-hover;\n }\n }\n\n &.btn-danger {\n color: $es-white;\n background: $es-danger;\n\n &:hover {\n background: color.adjust($es-danger, $lightness: -10%);\n }\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n// Preview popover styles moved to _list-preview.scss\n\n.popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n}\n\n.popover-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n}\n\n.popover-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n}\n\n.popover-body {\n max-height: 300px;\n overflow-y: auto;\n padding: $es-spacing-sm;\n @include custom-scrollbar;\n}\n\n.popover-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n}\n\n.popover-info {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n}\n\n.popover-load-more {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n}\n\n// Popover arrow\n.popover-arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n background: $es-white;\n border: 1px solid $es-border-color;\n transform: rotate(45deg);\n\n &.arrow-top {\n top: -7px;\n left: 50%;\n margin-left: -6px;\n border-right: none;\n border-bottom: none;\n }\n\n &.arrow-bottom {\n bottom: -7px;\n left: 50%;\n margin-left: -6px;\n border-left: none;\n border-top: none;\n }\n}\n\n// ==========================================================================\n// Holiday Preview Modal\n// ==========================================================================\n\n#mpr-holiday-preview-modal {\n display: none;\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: $es-z-modal;\n\n &.show {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .mpr-modal-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n cursor: pointer;\n }\n\n .mpr-modal-dialog {\n position: relative;\n width: 90%;\n max-width: 480px;\n max-height: 80vh;\n background: $es-white;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-xl;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .mpr-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-md $es-spacing-lg;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n flex-shrink: 0;\n }\n\n .mpr-modal-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-base;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n margin: 0;\n\n i.material-icons {\n font-size: 20px;\n color: $es-primary;\n }\n }\n\n .mpr-modal-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: 18px;\n }\n }\n\n .mpr-modal-body {\n flex: 1;\n overflow-y: auto;\n padding: $es-spacing-lg;\n @include custom-scrollbar;\n }\n\n // Loading state\n .holiday-preview-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: $es-font-size-lg;\n }\n }\n\n // Empty state\n .holiday-preview-empty {\n text-align: center;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n\n i.material-icons {\n font-size: 48px;\n opacity: 0.5;\n margin-bottom: $es-spacing-md;\n }\n\n p {\n margin: 0 0 $es-spacing-xs;\n }\n\n .hint {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n // Holiday list\n .holiday-list {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .holiday-item {\n display: flex;\n align-items: flex-start;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n border-left: 3px solid $es-success;\n\n &.holiday-type-bank {\n border-left-color: $es-info;\n }\n\n &.holiday-type-observance {\n border-left-color: $es-warning;\n }\n\n &.holiday-type-regional {\n border-left-color: #8b5cf6;\n }\n }\n\n .holiday-date {\n flex-shrink: 0;\n min-width: 100px;\n\n .holiday-day {\n display: block;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .holiday-weekday {\n display: block;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n .holiday-info {\n flex: 1;\n min-width: 0;\n }\n\n .holiday-name {\n display: block;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n word-wrap: break-word;\n }\n\n .holiday-type-badge {\n display: inline-block;\n margin-top: $es-spacing-xs;\n padding: 0.125rem 0.375rem;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n text-transform: capitalize;\n background: $es-slate-200;\n color: $es-text-secondary;\n border-radius: $es-radius-sm;\n }\n\n .holiday-preview-note {\n margin-top: $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n text-align: center;\n }\n}\n","/**\n * List Preview Component\n * Popover and modal views for entity preview\n *\n * Uses shared entity-item base for item styling.\n * This file only contains popover/modal container styles.\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// =============================================================================\n// Preview Popover Container\n// =============================================================================\n\n.target-preview-popover,\n.target-list-preview-popover {\n position: absolute;\n z-index: 10000;\n min-width: 320px;\n max-width: 480px;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-lg;\n overflow: hidden;\n\n // Arrow pointing to badge\n &::before {\n content: '';\n position: absolute;\n top: -8px;\n left: 50%;\n transform: translateX(-50%);\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-bottom: 8px solid $es-border-color;\n }\n\n &::after {\n content: '';\n position: absolute;\n top: -6px;\n left: 50%;\n transform: translateX(-50%);\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-bottom: 6px solid $es-white;\n }\n\n // Positioned to the right - arrow on left\n &.position-right {\n &::before,\n &::after {\n left: 20px;\n transform: none;\n }\n }\n\n // Positioned to the left - arrow on right\n &.position-left {\n &::before,\n &::after {\n left: auto;\n right: 20px;\n transform: none;\n }\n }\n\n // Positioned above trigger - arrow pointing down\n &.position-above {\n &::before {\n top: auto;\n bottom: -8px;\n border-top: 8px solid $es-border-color;\n border-bottom: 0;\n }\n\n &::after {\n top: auto;\n bottom: -6px;\n border-top: 6px solid $es-white;\n border-bottom: 0;\n }\n }\n}\n\n// =============================================================================\n// Preview Header\n// =============================================================================\n\n.preview-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n\n .preview-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .preview-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n }\n}\n\n// =============================================================================\n// Preview Tabs (entity type switcher)\n// =============================================================================\n\n.preview-tabs {\n display: flex;\n flex-wrap: wrap;\n gap: 0;\n padding: 0;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n}\n\n.preview-tab {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.5rem 0.75rem;\n background: transparent;\n border: 0;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n cursor: pointer;\n transition: all $es-transition-fast;\n white-space: nowrap;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-secondary;\n }\n\n &.active {\n background: $es-white;\n border-bottom-color: $es-primary;\n color: $es-primary;\n }\n\n i {\n font-size: 12px;\n }\n}\n\n// =============================================================================\n// Preview Filter\n// =============================================================================\n\n.preview-filter {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border-bottom: 1px solid $es-border-color;\n\n i {\n color: $es-text-muted;\n font-size: 12px;\n }\n\n .preview-filter-input {\n all: unset;\n flex: 1;\n padding: 0.25rem 0;\n font-size: $es-font-size-xs;\n color: $es-text-primary;\n box-sizing: border-box;\n\n &::placeholder {\n color: $es-text-muted;\n }\n }\n}\n\n// =============================================================================\n// Preview Contents (tabbed content areas)\n// =============================================================================\n\n.preview-contents {\n max-height: 350px;\n overflow: hidden;\n}\n\n.preview-content {\n display: none;\n max-height: 350px;\n overflow-y: auto;\n @include custom-scrollbar;\n\n &.active {\n display: block;\n }\n}\n\n// =============================================================================\n// Preview Items Container\n// =============================================================================\n\n.preview-items {\n display: flex;\n flex-direction: column;\n padding: $es-spacing-xs $es-spacing-sm;\n}\n\n// =============================================================================\n// Preview Item - Uses entity-item patterns\n// Maps legacy classes to shared styling\n// =============================================================================\n\n.preview-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-white;\n border-radius: $es-radius-sm;\n transition: background $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n // Clickable items\n &[data-id] {\n cursor: pointer;\n }\n}\n\n// Image - matches chip image sizing for consistency\n.preview-item-image {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n object-fit: cover;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n}\n\n// No-image placeholder\n.preview-item-no-image {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n background: $es-slate-100;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n font-size: $es-font-size-sm;\n}\n\n// Info container\n.preview-item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n}\n\n// Name\n.preview-item-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n}\n\n// Meta/ref (category, email, etc.)\n.preview-item-ref,\n.preview-item-meta {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n @include text-truncate;\n}\n\n// Price badge\n.preview-item-price {\n flex-shrink: 0;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n}\n\n// =============================================================================\n// Preview Footer (load more)\n// =============================================================================\n\n.preview-footer {\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n}\n\n.load-more-controls {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-more-label {\n white-space: nowrap;\n }\n\n .load-more-select {\n appearance: none;\n padding: 0.25rem 1.75rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.5rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n cursor: pointer;\n transition: all $es-transition-fast;\n height: auto;\n min-height: 0;\n line-height: 1.3;\n\n &:hover {\n border-color: $es-primary;\n background-color: $es-primary-light;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n .load-more-of {\n white-space: nowrap;\n }\n\n .remaining-count {\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n\n .btn-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xs;\n margin: 0;\n border: none;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n font: inherit;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n\n &.loading {\n cursor: wait;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n }\n}\n\n// =============================================================================\n// Preview States\n// =============================================================================\n\n.preview-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n}\n\n.preview-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n\n i {\n font-size: 20px;\n color: $es-primary;\n animation: spin 0.6s linear infinite;\n }\n}\n\n// =============================================================================\n// Total Summary Popover (header total badge click)\n// =============================================================================\n\n.total-preview-popover {\n min-width: 240px;\n max-width: 320px;\n\n .preview-popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n\n .preview-popover-title {\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n font-size: $es-font-size-sm;\n }\n\n .preview-popover-count {\n flex-shrink: 0;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n background: $es-slate-200;\n padding: 0.125rem 0.5rem;\n border-radius: $es-radius-sm;\n }\n }\n\n .preview-popover-body {\n padding: $es-spacing-xs 0;\n }\n\n .total-summary-list {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .total-summary-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n cursor: pointer;\n transition: background-color 0.15s ease;\n\n &:hover {\n background: $es-slate-50;\n }\n\n i {\n width: 18px;\n text-align: center;\n color: $es-text-muted;\n font-size: 14px;\n }\n\n .summary-item-label {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n }\n\n .summary-item-count {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n background: rgba($es-primary, 0.1);\n padding: 2px 8px;\n border-radius: $es-radius-sm;\n }\n }\n}\n\n// Make trait-total-count clickable\n.trait-total-count {\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n opacity: 0.8;\n }\n\n &.popover-open {\n opacity: 0.9;\n }\n}\n\n// =============================================================================\n// Schedule Dropdown Preview\n// Inline dropdown for schedule details in admin list\n// =============================================================================\n\n.mpr-dropdown-preview {\n display: none;\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-top: 6px;\n z-index: 1000;\n padding: 0.625rem 0.75rem;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-lg;\n font-size: 12px;\n text-align: left;\n text-transform: none;\n font-weight: normal;\n white-space: nowrap; // Allow dropdown to grow as needed\n\n &.is-open {\n display: block;\n }\n}\n\n.mpr-dropdown-preview__item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0;\n color: #666;\n line-height: 1.4;\n\n &:not(:last-child) {\n margin-bottom: 0.25rem;\n padding-bottom: 0.5rem;\n border-bottom: 1px solid rgba($es-border-color, 0.5);\n }\n\n // Icon styles\n > .material-icons,\n > i:first-child {\n flex-shrink: 0;\n width: 16px;\n font-size: 14px;\n color: #999;\n text-align: center;\n }\n}\n\n.mpr-dropdown-preview__muted {\n color: #999;\n}\n\n// Schedule inline layout\n.mpr-dropdown-preview__schedule {\n display: inline;\n}\n\n.mpr-dropdown-preview__schedule-row {\n display: inline;\n\n &:not(:last-child)::after {\n content: ',';\n margin-right: 0.5rem;\n }\n}\n\n.mpr-dropdown-preview__day {\n color: #666;\n}\n\n.mpr-dropdown-preview__hours {\n color: $es-primary;\n font-weight: 500;\n margin-left: 0.25rem;\n}\n\n// Badge trigger for preview dropdown/popover\n.mpr-badge--preview {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.25rem;\n position: relative;\n min-width: 20px;\n height: 20px;\n padding: 0 0.5rem;\n font-size: 0.75rem;\n font-weight: 600;\n border-radius: 50rem;\n cursor: pointer;\n text-transform: none;\n\n .icon-eye {\n font-size: 10px;\n line-height: 1;\n opacity: 0.8;\n }\n\n .material-icons {\n font-size: 12px;\n line-height: 1;\n }\n}\n\n.mpr-badge--preview-primary {\n background: $es-primary;\n color: $es-white;\n}\n\n.mpr-badge--preview-success {\n background: #d4edda;\n color: #155724;\n}\n\n.mpr-badge--preview-warning {\n background: #fff3cd;\n color: #856404;\n}\n\n.mpr-badge--preview-muted {\n background: $es-slate-200;\n color: $es-text-muted;\n}\n","/**\n * Schedule Conditions Component\n * DateTime picker, weekly timeline, holidays\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Schedule conditions wrapper\n.schedule-conditions-trait {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n}\n\n// Schedule header\n.schedule-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: 0.875rem $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n}\n\n.schedule-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n\n i {\n color: $es-text-muted;\n }\n}\n\n// Schedule body\n.schedule-body {\n padding: $es-spacing-md;\n}\n\n// Schedule section\n.schedule-section {\n margin-bottom: $es-spacing-lg;\n\n &:last-child {\n margin-bottom: 0;\n }\n}\n\n.schedule-section-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-sm;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n\n i {\n color: $es-text-muted;\n }\n}\n\n.schedule-section-description {\n margin-bottom: $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n}\n\n// DateTime range picker\n.datetime-range {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n}\n\n.datetime-field {\n flex: 1;\n min-width: 200px;\n}\n\n.datetime-label {\n display: block;\n margin-bottom: 0.25rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n}\n\n.datetime-input {\n @include input-base;\n}\n\n// Weekly schedule\n.weekly-schedule {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n}\n\n.day-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-md;\n padding: $es-spacing-sm;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n\n &.disabled {\n opacity: 0.5;\n }\n}\n\n.day-toggle {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n min-width: 100px;\n}\n\n.day-checkbox {\n width: 18px;\n height: 18px;\n cursor: pointer;\n}\n\n.day-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n}\n\n// Timeline slider\n.timeline-slider {\n flex: 1;\n position: relative;\n height: 24px;\n background: $es-slate-200;\n border-radius: $es-radius-full;\n cursor: pointer;\n}\n\n.timeline-fill {\n position: absolute;\n top: 0;\n height: 100%;\n background: $es-primary;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n}\n\n.timeline-handle {\n position: absolute;\n top: 50%;\n width: 16px;\n height: 16px;\n background: $es-white;\n border: 2px solid $es-primary;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n cursor: grab;\n box-shadow: $es-shadow-sm;\n transition: box-shadow $es-transition-fast;\n\n &:hover {\n box-shadow: $es-shadow-md;\n }\n\n &:active {\n cursor: grabbing;\n }\n\n &.handle-start {\n z-index: 2;\n }\n\n &.handle-end {\n z-index: 1;\n }\n}\n\n// Time display\n.day-times {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n min-width: 120px;\n font-size: $es-font-size-xs;\n font-family: monospace;\n color: $es-text-secondary;\n}\n\n.time-separator {\n color: $es-text-muted;\n}\n\n// Holiday exclusions\n.holiday-section {\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n}\n\n.holiday-toggle {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-md;\n}\n\n.holiday-checkbox {\n width: 18px;\n height: 18px;\n cursor: pointer;\n}\n\n.holiday-label {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n}\n\n.holiday-countries {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n}\n\n.holiday-country-chip {\n @include chip;\n cursor: pointer;\n\n &.selected {\n background: $es-primary-light;\n color: $es-primary;\n }\n}\n\n// Server time display\n.server-time {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-info-light;\n border-radius: $es-radius-md;\n font-size: $es-font-size-xs;\n color: $es-info;\n\n i {\n font-size: $es-font-size-sm;\n }\n\n .time-value {\n font-family: monospace;\n font-weight: $es-font-weight-semibold;\n }\n}\n\n// Schedule summary\n.schedule-summary {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n font-size: $es-font-size-sm;\n color: $es-text-secondary;\n\n .summary-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n\n i {\n color: $es-success;\n font-size: $es-font-size-sm;\n }\n\n &.inactive i {\n color: $es-text-muted;\n }\n }\n}\n\n// Collapsed state\n.schedule-conditions-trait.collapsed {\n .schedule-body {\n display: none;\n }\n\n .schedule-header {\n border-radius: $es-radius-lg;\n }\n}\n\n// Schedule toggle row (form-content layout)\n.schedule-toggle-row {\n display: flex;\n align-items: center;\n background: $es-slate-100;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n\n .schedule-toggle-switch {\n padding: $es-spacing-sm $es-spacing-md;\n }\n\n .schedule-toggle-actions {\n padding: $es-spacing-sm $es-spacing-md;\n border-left: 1px solid $es-border-color;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n .material-icons {\n color: $es-slate-400;\n font-size: 20px;\n }\n }\n}\n\n// Schedule summary badges (read-only indicators in header)\n.schedule-summary-badges {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-left: auto;\n padding: 0 $es-spacing-sm;\n}\n\n.schedule-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-200;\n color: $es-slate-600;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n white-space: nowrap;\n\n .material-icons {\n font-size: 14px;\n opacity: 0.7;\n }\n}\n\n// Section hint after embedded entity selector - add margin\n.schedule-holidays .section-hint {\n margin-top: $es-spacing-md;\n}\n","/**\n * Tips Box Component\n * Pro tips and help information display\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Tips box container\n .target-tips-box {\n margin: $es-spacing-lg $es-spacing-md $es-spacing-md;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n overflow: hidden;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n }\n\n // Tips header (clickable to expand/collapse)\n .tips-header {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: $es-spacing-md $es-spacing-lg;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.02);\n }\n\n // Lightbulb icon\n > i:first-child {\n font-size: 1rem;\n color: $es-warning;\n }\n\n // Title text\n > span {\n flex: 1;\n font-size: 13px;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-600;\n }\n }\n\n // Toggle chevron icon\n .tips-toggle {\n font-size: $es-font-size-xs;\n color: $es-slate-400;\n transition: transform 0.2s;\n }\n\n // Expanded state\n .target-tips-box.expanded {\n .tips-toggle {\n transform: rotate(180deg);\n }\n\n .tips-content {\n display: block;\n }\n }\n\n // Tips content (hidden by default)\n .tips-content {\n display: none;\n padding: 0 $es-spacing-lg $es-spacing-lg;\n }\n\n // Tips grid layout\n .tips-grid {\n display: grid;\n gap: $es-spacing-md;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n }\n\n // Individual tip item\n .tip-item {\n display: flex;\n gap: $es-spacing-md;\n padding: $es-spacing-md;\n background: $es-white;\n border-radius: $es-radius-md;\n border: 1px solid $es-border-color;\n }\n\n // Tip icon\n .tip-icon {\n flex-shrink: 0;\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n background: $es-primary-light;\n border-radius: $es-radius-md;\n color: $es-primary;\n font-size: $es-font-size-sm;\n }\n\n // Tip text content\n .tip-text {\n flex: 1;\n min-width: 0;\n\n strong {\n display: block;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-700;\n margin-bottom: 0.25rem;\n }\n\n p {\n font-size: 11px;\n color: $es-text-muted;\n line-height: 1.625;\n margin: 0;\n }\n }\n\n // Tips footer\n .tips-footer {\n margin-top: $es-spacing-md;\n padding: 0.625rem $es-spacing-md;\n background: $es-white;\n border-radius: $es-radius-md;\n border: 1px dashed $es-gray-300;\n font-size: 11px;\n color: $es-text-muted;\n line-height: 1.625;\n\n i {\n color: $es-primary;\n margin-right: 0.25rem;\n }\n }\n}\n","/**\n * Condition Trait Base Styles\n * Shared styling for all condition trait components\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Base condition trait container\n.condition-trait {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n margin-bottom: $es-spacing-lg;\n\n &:last-child {\n margin-bottom: 0;\n }\n}\n\n// Collapsed state\n.condition-trait.collapsed {\n .condition-trait-header {\n border-bottom-color: transparent;\n border-radius: $es-radius-lg;\n }\n\n .collapse-icon {\n transform: rotate(180deg);\n }\n}\n\n// =============================================================================\n// Trait Header\n// =============================================================================\n\n.condition-trait-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-lg;\n flex-wrap: wrap;\n padding: 0.875rem $es-spacing-lg;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n }\n}\n\n.trait-header-left {\n display: flex;\n align-items: center;\n gap: $es-spacing-md;\n min-width: 0;\n flex: 1;\n}\n\n.trait-icon {\n font-size: 1.125rem;\n color: $es-text-muted;\n flex-shrink: 0;\n}\n\n.trait-title-group {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n}\n\n.trait-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-800;\n white-space: nowrap;\n}\n\n.trait-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n// Schedule summary (shows current config at a glance)\n.trait-summary {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.25rem 0.625rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n background: rgba($es-primary, 0.08);\n border-radius: $es-radius-full;\n white-space: nowrap;\n margin-left: $es-spacing-md;\n flex-shrink: 0;\n max-width: 320px;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:empty {\n display: none;\n }\n}\n\n.trait-header-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-md;\n flex-shrink: 0;\n margin-left: auto;\n}\n\n.trait-header-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n}\n\n// Collapse icon\n.collapse-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.5rem;\n height: 1.5rem;\n font-size: $es-font-size-sm;\n color: $es-text-muted;\n cursor: pointer;\n transition: all 0.2s;\n border-radius: $es-radius-sm;\n background: transparent;\n\n &:hover {\n color: $es-primary;\n background: rgba($es-primary, 0.08);\n }\n}\n\n// Show all toggle\n.trait-show-all-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n font-size: $es-font-size-xs;\n color: $es-primary;\n cursor: pointer;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n// Trait total count badge (global fallback)\n.trait-total-count {\n @include count-badge($es-primary);\n}\n\n// Required indicator\n.trait-required {\n color: $es-danger;\n font-size: $es-font-size-xs;\n}\n\n// Validation error\n.trait-validation-error {\n color: $es-danger;\n font-size: $es-font-size-xs;\n margin-top: 0.25rem;\n}\n\n// Trait toggle button\n.trait-toggle {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-50;\n border-color: $es-gray-300;\n }\n\n &.active {\n color: $es-primary;\n border-color: $es-primary;\n background: $es-primary-light;\n }\n}\n\n// =============================================================================\n// Trait Body\n// =============================================================================\n\n.condition-trait-body {\n padding: $es-spacing-lg;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n background: $es-white;\n animation: slideDown 0.2s ease-out;\n}\n\n// Condition trait collapsed - hide body\n.condition-trait.collapsed .condition-trait-body {\n display: none;\n}\n\n// =============================================================================\n// Section Styles\n// =============================================================================\n\n.schedule-section,\n.context-section {\n margin-bottom: 1.25rem;\n padding-bottom: 1.25rem;\n border-bottom: 1px solid $es-slate-100;\n\n &:last-child {\n margin-bottom: 0;\n padding-bottom: 0;\n border-bottom: 0;\n }\n}\n\n.section-label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 13px;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-600;\n margin-bottom: $es-spacing-md;\n\n i {\n font-size: $es-font-size-sm;\n color: $es-slate-400;\n margin-right: 0.25rem;\n }\n}\n\n.section-content {\n // Container for section content\n}\n\n.section-hint {\n margin-top: 0.5rem;\n font-size: 11px;\n color: $es-slate-400;\n}\n\n// =============================================================================\n// Full-width Form Group Override\n// =============================================================================\n\n.form-group.condition-trait-fullwidth {\n display: block !important;\n\n > .control-label {\n display: none !important;\n }\n\n > .col-lg-8,\n > .col-lg-8.col-lg-offset-3 {\n width: 100% !important;\n max-width: 100% !important;\n flex: 0 0 100% !important;\n padding-left: $es-spacing-lg !important;\n padding-right: $es-spacing-lg !important;\n margin: 0 !important;\n margin-left: 0 !important;\n }\n}\n\n// Condition traits group label\n.condition-traits-group-label {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-700;\n margin-bottom: $es-spacing-md;\n}\n\n.condition-traits-wrapper {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-md;\n}\n\n// =============================================================================\n// Collapse Header (form-content layout)\n// =============================================================================\n\n.entity-selector-collapse-header {\n padding: 0;\n margin-bottom: $es-spacing-sm;\n\n .btn-collapse-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0;\n background: none;\n border: none;\n color: $es-primary;\n font-size: $es-font-size-sm;\n cursor: pointer;\n transition: color $es-transition-fast;\n\n &:hover {\n color: $es-primary-hover;\n }\n\n .collapse-icon {\n font-size: 1.25rem;\n transition: transform 0.2s;\n }\n\n .collapse-label {\n font-weight: $es-font-weight-medium;\n }\n }\n}\n\n// When collapsed, rotate icon\n.condition-trait.collapsed .entity-selector-collapse-header {\n .collapse-icon {\n // Icon already shows expand_more when collapsed\n }\n}\n\n// =============================================================================\n// Animations\n// =============================================================================\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n","/**\n * Combination Attributes Picker Component\n * Product attribute combination selection styles\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Main container\n .combination-attributes-picker {\n display: flex;\n flex-direction: column;\n gap: 0.625rem;\n }\n\n // Mode toggle (Any/All)\n .combination-mode-toggle {\n display: inline-flex;\n gap: 0.25rem;\n padding: 0.125rem;\n background: $es-slate-100;\n border-radius: $es-radius-md;\n margin-bottom: 0.5rem;\n }\n\n .combination-mode-option {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n cursor: pointer;\n font-size: 11px;\n color: $es-text-muted;\n padding: 0.25rem 0.625rem;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n input[type=\"radio\"] {\n display: none;\n }\n\n .mode-label {\n user-select: none;\n }\n\n &:hover {\n color: $es-primary;\n background: rgba($es-primary, 0.1);\n }\n\n &:has(input[type=\"radio\"]:checked) {\n background: $es-primary;\n color: $es-white;\n font-weight: $es-font-weight-medium;\n }\n }\n\n // Groups container\n .combination-groups-container {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n }\n\n // Loading/Empty/Error states\n .combination-loading,\n .combination-empty,\n .combination-error {\n color: $es-text-muted;\n font-style: italic;\n padding: 0.5rem;\n }\n\n .combination-error {\n color: $es-danger;\n }\n\n // Section header\n .combinations-section {\n margin-bottom: $es-spacing-md;\n }\n\n .combinations-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: $es-spacing-sm;\n }\n\n .combinations-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n }\n\n .combinations-help {\n font-size: 11px;\n color: $es-slate-400;\n }\n\n // Toggle combinations button\n .btn-toggle-combinations {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-primary;\n background: transparent;\n border: 1px solid $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n\n .btn-remove-combinations {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-danger;\n background: transparent;\n\n &:hover {\n text-decoration: underline;\n }\n }\n\n // =============================================================================\n // Attribute Group\n // =============================================================================\n\n .comb-attr-group {\n flex: none;\n min-width: 120px;\n max-width: 200px;\n background: $es-white;\n border: 1px solid $es-gray-300;\n border-radius: $es-radius-sm;\n overflow: hidden;\n\n &.has-selections {\n border-color: $es-primary;\n }\n }\n\n .comb-attr-group-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.375rem 0.625rem;\n background: $es-slate-100;\n border-bottom: 1px solid $es-gray-300;\n font-weight: $es-font-weight-semibold;\n font-size: $es-font-size-xs;\n color: $es-slate-800;\n\n .comb-attr-group.has-selections & {\n background: $es-cyan-50;\n border-bottom-color: $es-cyan-200;\n }\n }\n\n .comb-attr-group-name {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .comb-attr-group-count {\n flex-shrink: 0;\n min-width: 18px;\n height: 18px;\n padding: 0 0.25rem;\n background: $es-gray-300;\n border-radius: $es-radius-full;\n font-size: 11px;\n font-weight: $es-font-weight-semibold;\n line-height: 18px;\n text-align: center;\n color: $es-text-muted;\n\n .comb-attr-group.has-selections & {\n background: $es-primary;\n color: $es-white;\n }\n }\n\n // Toolbar\n .comb-attr-toolbar {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.375rem;\n background: $es-slate-50;\n border-bottom: 1px solid $es-slate-100;\n }\n\n .comb-toolbar-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n padding: 0;\n background: $es-white;\n border: 1px solid $es-gray-300;\n border-radius: $es-radius-sm;\n color: $es-text-muted;\n cursor: pointer;\n font-size: $es-font-size-xs;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-slate-400;\n color: $es-slate-800;\n }\n }\n\n .comb-attr-search {\n flex: 1;\n min-width: 60px;\n padding: 0.125rem 0.375rem;\n border: 1px solid $es-gray-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n outline: none;\n\n &:focus {\n border-color: $es-primary;\n }\n\n &::placeholder {\n color: $es-slate-400;\n }\n }\n\n // Values container\n .comb-attr-values {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n padding: 0.375rem;\n max-height: 150px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n .comb-attr-loading,\n .comb-attr-empty,\n .comb-attr-error {\n width: 100%;\n text-align: center;\n color: $es-slate-400;\n font-size: 11px;\n padding: 0.25rem;\n }\n\n .comb-attr-error {\n color: $es-danger;\n }\n\n // Individual value\n .comb-attr-value {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.125rem 0.5rem;\n background: $es-white;\n border: 1px solid $es-slate-400;\n border-radius: 0.75rem;\n font-size: 11px;\n color: $es-slate-600;\n cursor: pointer;\n transition: all $es-transition-fast;\n white-space: nowrap;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-text-muted;\n }\n\n &.selected {\n background: $es-primary;\n border-color: $es-primary-hover;\n color: $es-white;\n\n &:hover {\n background: $es-primary-hover;\n border-color: color.adjust($es-primary-hover, $lightness: -5%);\n }\n }\n }\n\n .comb-attr-value-count {\n font-size: 9px;\n color: $es-slate-400;\n background: $es-slate-100;\n padding: 1px 0.25rem;\n border-radius: 0.5rem;\n min-width: 14px;\n text-align: center;\n\n .comb-attr-value.selected & {\n color: $es-white;\n background: rgba(255, 255, 255, 0.3);\n }\n }\n\n // =============================================================================\n // Combination Conditions (Row-based)\n // =============================================================================\n\n .combination-conditions-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .combination-condition-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-slate-50;\n border-radius: $es-radius-sm;\n }\n\n .combination-group-select,\n .combination-values-select {\n flex: 1;\n min-width: 120px;\n }\n\n .combination-equals {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n padding: 0 0.25rem;\n }\n\n .btn-add-combination-condition {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n background: transparent;\n border: 1px dashed $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n .btn-remove-combination-row {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-danger, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n","/**\n * Method Dropdown Component\n * Custom select dropdown with icons for method selection\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Method dropdown trigger button\n .method-dropdown-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n height: 36px;\n padding: 0 $es-spacing-md;\n border-radius: $es-radius-md;\n background: $es-white;\n color: $es-slate-800;\n font-size: $es-font-size-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n min-width: 180px;\n max-width: 320px;\n border: 1px solid $es-border-color;\n\n &:hover {\n background: $es-slate-50;\n border-color: $es-gray-300;\n }\n\n &:focus,\n &:active {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 3px rgba($es-primary, 0.1);\n }\n }\n\n .method-trigger-icon {\n font-size: $es-font-size-sm;\n color: $es-text-muted;\n flex-shrink: 0;\n width: 18px;\n text-align: center;\n }\n\n .method-trigger-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: $es-font-weight-medium;\n }\n\n .method-trigger-caret {\n font-size: $es-font-size-xs;\n color: $es-slate-400;\n flex-shrink: 0;\n margin-left: auto;\n }\n\n // Locked state\n .selector-locked .method-dropdown-trigger {\n background: $es-slate-100;\n color: $es-slate-400;\n cursor: not-allowed;\n border-color: $es-border-color;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-border-color;\n }\n }\n\n // Method selector wrapper\n .method-selector-wrapper {\n position: relative;\n }\n\n // Hidden select (for form submission)\n .method-select-hidden {\n position: absolute !important;\n opacity: 0 !important;\n pointer-events: none !important;\n width: 0 !important;\n height: 0 !important;\n overflow: hidden !important;\n }\n}\n\n// Global fallback for hidden method selects\n.method-select-hidden {\n position: absolute !important;\n opacity: 0 !important;\n pointer-events: none !important;\n width: 0 !important;\n height: 0 !important;\n overflow: hidden !important;\n}\n\n// =============================================================================\n// Method Dropdown Menu (appended to body, outside trait wrappers)\n// =============================================================================\n\n.method-dropdown-menu {\n position: absolute;\n z-index: $es-z-dropdown + 1;\n min-width: 200px;\n max-width: 360px;\n max-height: 400px;\n overflow-y: auto;\n background: $es-white;\n border-radius: $es-radius-lg;\n padding: 0.375rem 0;\n border: 1px solid $es-border-color;\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15);\n animation: methodDropdownFadeIn 0.15s ease;\n @include custom-scrollbar;\n}\n\n@keyframes methodDropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n// Method dropdown item\n.method-dropdown-item {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: 0.5rem $es-spacing-md;\n cursor: pointer;\n transition: background-color 0.1s;\n position: relative;\n\n &:hover {\n background: $es-slate-100;\n }\n\n &.selected {\n background: rgba($es-primary, 0.08);\n }\n\n .method-item-icon {\n font-size: $es-font-size-sm;\n color: $es-text-muted;\n width: 18px;\n text-align: center;\n flex-shrink: 0;\n }\n\n &.selected .method-item-icon {\n color: $es-primary;\n }\n\n .method-item-label {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-slate-700;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n &.selected .method-item-label {\n color: $es-cyan-700;\n font-weight: $es-font-weight-medium;\n }\n\n .method-item-check {\n font-size: $es-font-size-xs;\n flex-shrink: 0;\n margin-left: auto;\n color: $es-primary;\n }\n}\n\n// Method dropdown optgroup\n.method-dropdown-optgroup {\n margin-top: 0.25rem;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.method-optgroup-label {\n padding: 0.5rem $es-spacing-md;\n font-size: 11px;\n font-weight: $es-font-weight-semibold;\n color: $es-text-muted;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n background: $es-slate-50;\n border-top: 1px solid $es-slate-100;\n border-bottom: 1px solid $es-slate-100;\n\n .method-dropdown-optgroup:first-child & {\n border-top: 0;\n }\n}\n\n.method-optgroup-items {\n padding: 0.25rem 0;\n\n .method-dropdown-item {\n padding-left: $es-spacing-lg;\n }\n}\n\n// Method info placeholder\n.method-info-placeholder {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n font-style: italic;\n}\n","/**\n * Tooltip Component\n * Info tooltips for method help\n */\n\n@use '../variables' as *;\n\n// =============================================================================\n// Info Wrapper (tooltip trigger)\n// =============================================================================\n\n.mpr-info-wrapper {\n display: inline-flex;\n align-items: center;\n position: relative;\n cursor: help;\n vertical-align: middle;\n margin-left: 0.25rem;\n\n .material-icons {\n font-size: 16px;\n color: $es-text-muted;\n transition: color 0.15s ease;\n }\n\n &:hover .material-icons {\n color: $es-primary;\n }\n}\n\n// =============================================================================\n// Fixed Tooltip (appended to body on hover)\n// =============================================================================\n\n.mpr-tooltip-fixed {\n position: fixed;\n background: $es-white;\n color: $es-slate-800;\n padding: $es-spacing-md $es-spacing-lg;\n border-radius: $es-radius-md;\n font-size: 13px;\n line-height: 1.5;\n white-space: normal;\n z-index: 10500;\n max-width: 320px;\n min-width: 180px;\n text-align: left;\n box-shadow: rgba(0, 0, 0, 0.12) 0px 1px 1px 0px,\n rgba(64, 68, 82, 0.16) 0px 0px 0px 1px,\n rgba(64, 68, 82, 0.08) 0px 2px 5px 0px;\n pointer-events: none;\n\n // Pinned tooltip allows interaction\n &.pinned {\n pointer-events: auto;\n padding-right: $es-spacing-xl + 1rem;\n }\n\n strong {\n display: block;\n margin-bottom: 0.375rem;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n }\n\n p {\n margin: 0;\n color: $es-text-secondary;\n }\n\n ul {\n margin: 0.5rem 0 0;\n padding-left: 1.25rem;\n\n li {\n margin: 0.25rem 0;\n color: $es-text-secondary;\n }\n }\n}\n\n// Close button for pinned tooltips\n.mpr-tooltip-close {\n position: absolute;\n top: 0.375rem;\n right: 0.375rem;\n padding: 0.125rem;\n border: none;\n background: transparent;\n cursor: pointer;\n border-radius: $es-radius-sm;\n line-height: 1;\n transition: background-color 0.15s ease;\n\n .material-icons {\n font-size: 16px;\n color: $es-text-muted;\n }\n\n &:hover {\n background: $es-slate-100;\n\n .material-icons {\n color: $es-slate-700;\n }\n }\n}\n","/**\n * Category Tree Component\n * Hierarchical tree view for category selection inside dropdown\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Category tree container (inside dropdown)\n.category-tree {\n display: flex;\n flex-direction: column;\n}\n\n// Tree toolbar inside dropdown\n.category-tree .tree-toolbar {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-sm;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-light;\n flex-shrink: 0;\n\n .btn-expand-all,\n .btn-collapse-all {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: $es-spacing-xs $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-slate-300;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n\n// Tree items container\n.category-tree .tree-items {\n padding: 0;\n}\n\n// Tree item\n.tree-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-sm;\n cursor: pointer;\n transition: background $es-transition-fast;\n border-radius: 0;\n\n &:hover {\n background: $es-slate-100;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .tree-name {\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n }\n\n .tree-checkbox {\n color: $es-primary;\n\n i {\n opacity: 1;\n }\n }\n }\n\n &.inactive {\n opacity: 0.6;\n\n .tree-name {\n font-style: italic;\n }\n }\n\n &.filtered-out {\n display: none;\n }\n\n &.filter-match {\n background: $es-warning-light;\n\n &.selected {\n background: $es-primary-light;\n }\n }\n}\n\n// All tree element styles nested under .category-tree for specificity\n.category-tree {\n // Tree indentation\n .tree-indent {\n flex-shrink: 0;\n }\n\n // Tree toggle (expand/collapse)\n .tree-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n color: $es-text-secondary;\n flex-shrink: 0;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n cursor: pointer;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n\n &.tree-leaf {\n cursor: default;\n visibility: hidden;\n\n &:hover {\n background: transparent;\n }\n }\n\n i {\n font-size: 10px;\n transition: transform $es-transition-fast;\n }\n }\n\n .tree-item.collapsed > .tree-toggle i {\n transform: rotate(-90deg);\n }\n\n // Tree checkbox indicator - 12x12 to match PrestaShop admin standards\n .tree-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n flex-shrink: 0;\n border: 1px solid $es-border-color;\n border-radius: 2px;\n background: $es-white;\n\n i {\n font-size: 8px;\n opacity: 0;\n color: $es-white;\n transition: opacity $es-transition-fast;\n }\n }\n\n .tree-item.selected .tree-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n opacity: 1;\n }\n }\n\n // Tree icon\n .tree-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n color: $es-text-muted;\n flex-shrink: 0;\n\n i {\n font-size: 12px; // match visual weight of other icons\n }\n }\n\n .tree-item.selected .tree-icon {\n color: $es-primary;\n }\n\n // Tree name\n .tree-name {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n // Tree product/page count with preview\n .tree-count {\n @include count-badge($es-primary);\n height: 18px;\n min-width: 18px;\n padding: 0 $es-spacing-sm;\n\n i {\n font-size: 10px;\n }\n\n &.clickable {\n &.loading {\n pointer-events: none;\n\n i {\n animation: spin 1s linear infinite;\n }\n }\n\n &.popover-open {\n background: color.adjust($es-primary, $lightness: -10%);\n }\n }\n }\n\n // Select children button - positioned on the left next to toggle\n .btn-select-children {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n opacity: 0.3;\n transition: all $es-transition-fast;\n flex-shrink: 0;\n\n i {\n font-size: 14px; // larger to visually match other icons\n }\n\n &:hover {\n color: $es-primary;\n opacity: 1;\n }\n }\n\n .tree-item:hover .btn-select-children {\n opacity: 0.6;\n }\n\n // Tree badge (inactive, etc.)\n .tree-badge {\n display: inline-flex;\n align-items: center;\n padding: 0.125rem $es-spacing-xs;\n font-size: 9px;\n font-weight: $es-font-weight-semibold;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n\n &.inactive {\n color: $es-warning;\n background: $es-warning-light;\n }\n }\n\n // Tree children container\n .tree-children {\n display: block;\n\n &.filter-expanded {\n display: block !important;\n }\n }\n\n .tree-item.collapsed + .tree-children {\n display: none;\n }\n\n // Filtering - must be inside .category-tree for specificity\n .tree-item.filtered-out {\n display: none !important;\n }\n} // end .category-tree\n\n// Loading/empty/error states\n.category-tree .tree-loading,\n.category-tree .dropdown-empty,\n.category-tree .dropdown-error {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n margin-right: $es-spacing-sm;\n }\n}\n\n.category-tree .dropdown-error {\n color: $es-danger;\n}\n\n// Tree view mode in dropdown\n.target-search-dropdown.view-tree {\n .dropdown-results {\n padding: 0;\n }\n\n .category-tree {\n max-height: 100%;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n .tree-items {\n max-height: calc(100% - 40px);\n overflow-y: auto;\n @include custom-scrollbar;\n }\n}\n","/**\n * Validation Toast Component\n * Error notifications for selection conflicts\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Validation error toast\n.es-validation-toast {\n display: flex;\n align-items: flex-start;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n background: $es-white;\n border: 1px solid $es-danger;\n border-left: 4px solid $es-danger;\n border-radius: $es-radius-md;\n box-shadow: $es-shadow-lg;\n max-width: 400px;\n animation: es-toast-slide-in 0.2s ease-out;\n\n .es-toast-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-danger;\n flex-shrink: 0;\n\n i {\n font-size: 18px;\n }\n }\n\n .es-toast-content {\n flex: 1;\n min-width: 0;\n }\n\n .es-toast-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-danger;\n margin-bottom: 2px;\n }\n\n .es-toast-message {\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n line-height: 1.4;\n }\n\n .es-toast-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-primary;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n\n@keyframes es-toast-slide-in {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n"]} \ No newline at end of file diff --git a/assets/js/admin/entity-selector.js b/assets/js/admin/entity-selector.js index 08b0923..a364fac 100644 --- a/assets/js/admin/entity-selector.js +++ b/assets/js/admin/entity-selector.js @@ -272,9 +272,9 @@ !$(e.target).closest('.group-count-badge').length && !$(e.target).closest('.group-modifiers').length && !$(e.target).closest('.group-preview-badge').length && - !$(e.target).closest('.toggle-count.clickable').length && !$(e.target).closest('.trait-total-count').length && - !$(e.target).closest('.chip-preview-holidays').length) { + !$(e.target).closest('.chip-preview-holidays').length && + !$(e.target).closest('.chip-preview-btn').length) { self.hidePreviewPopover(); // Also close holiday popover $('.holiday-preview-popover').remove(); @@ -317,6 +317,31 @@ } }); + // Filter chip/group preview eye button (unified handler) + this.$wrapper.on('click', '.chip-preview-btn', function(e) { + e.preventDefault(); + e.stopPropagation(); + + var $btn = $(this); + + if ($btn.hasClass('popover-open')) { + self.hidePreviewPopover(); + } else { + var valueId = $btn.data('id'); + var valueType = $btn.data('type'); + var valueName = $btn.data('name'); + var groupId = $btn.data('groupId'); + + if (valueId) { + // Value-level preview (specific attribute/feature value) + self.showFilterValuePreviewPopover($btn, valueId, valueType, valueName, groupId); + } else if (groupId) { + // Group-level preview (entire attribute/feature group) + self.showFilterGroupPreviewPopover($btn, groupId, valueType, valueName); + } + } + }); + // Group-level collapse toggle (click on group header or toggle icon) this.$wrapper.on('click', '.group-header', function(e) { if ($(e.target).closest('.btn-remove-group, .group-name-input').length) { @@ -1196,7 +1221,7 @@ if (isSelected) { // Remove from pending selections self.pendingSelections = self.pendingSelections.filter(function(s) { - return parseInt(s.id, 10) !== parseInt(id, 10); + return String(s.id) !== String(id); }); self.removeSelection($picker, id); $item.toggleClass('selected'); @@ -1223,7 +1248,7 @@ } else { // Add to pending selections var exists = self.pendingSelections.some(function(s) { - return parseInt(s.id, 10) === parseInt(id, 10); + return String(s.id) === String(id); }); if (!exists) { self.pendingSelections.push({ id: id, name: name, data: $item.data() }); @@ -1248,7 +1273,7 @@ // Also remove from pending selections if dropdown is open if (self.pendingSelections) { self.pendingSelections = self.pendingSelections.filter(function(s) { - return parseInt(s.id, 10) !== parseInt(id, 10); + return String(s.id) !== String(id); }); } @@ -1375,7 +1400,7 @@ // Add to pending selections for Save button var exists = self.pendingSelections.some(function(s) { - return parseInt(s.id, 10) === parseInt(id, 10); + return String(s.id) === String(id); }); if (!exists) { self.pendingSelections.push({ @@ -1990,10 +2015,6 @@ // Toggle filter group - show values this.$dropdown.on('click', '.filter-group-toggle', function(e) { - // Ignore clicks on the preview badge - if ($(e.target).closest('.toggle-count.clickable').length) { - return; - } e.preventDefault(); var $btn = $(this); var groupId = $btn.data('group-id'); @@ -2010,20 +2031,26 @@ } }); - // Filter group toggle count badge click for preview popover - this.$dropdown.on('click', '.filter-group-toggle .toggle-count.clickable', function(e) { - e.stopPropagation(); + // Filter preview eye button (dropdown-level, since dropdown is appended to body) + this.$dropdown.on('click', '.chip-preview-btn', function(e) { e.preventDefault(); + e.stopPropagation(); - var $badge = $(this); - var groupId = $badge.data('groupId'); - var groupType = $badge.data('type'); - var groupName = $badge.data('groupName'); + var $btn = $(this); - if ($badge.hasClass('popover-open')) { + if ($btn.hasClass('popover-open')) { self.hidePreviewPopover(); } else { - self.showFilterGroupPreviewPopover($badge, groupId, groupType, groupName); + var valueId = $btn.data('id'); + var valueType = $btn.data('type'); + var valueName = $btn.data('name'); + var groupId = $btn.data('groupId'); + + if (valueId) { + self.showFilterValuePreviewPopover($btn, valueId, valueType, valueName, groupId); + } else if (groupId) { + self.showFilterGroupPreviewPopover($btn, groupId, valueType, valueName); + } } }); @@ -2182,13 +2209,13 @@ // If already pinned, unpin and close if ($wrapper.hasClass('pinned')) { $wrapper.removeClass('pinned'); - $wrapper.find('.material-icons').text('info_outline'); + $wrapper.find('.material-icons').text('info'); $('.mpr-tooltip-fixed.pinned').remove(); return; } // Close any other pinned tooltips - $('.mpr-info-wrapper.pinned').removeClass('pinned').find('.material-icons').text('info_outline'); + $('.mpr-info-wrapper.pinned').removeClass('pinned').find('.material-icons').text('info'); $('.mpr-tooltip-fixed').remove(); var content = $wrapper.attr('data-tooltip'); @@ -2208,7 +2235,7 @@ // Close button click $closeBtn.on('click', function() { $wrapper.removeClass('pinned'); - $wrapper.find('.material-icons').text('info_outline'); + $wrapper.find('.material-icons').text('info'); $tooltip.remove(); }); @@ -2716,6 +2743,11 @@ sort_dir: this.currentSort ? this.currentSort.dir : 'ASC' }; + // Add product_selection_level if set + if (this.config.productSelectionLevel && this.config.productSelectionLevel !== 'product') { + requestData.product_selection_level = this.config.productSelectionLevel; + } + // Add refine query if present if (this.refineQuery) { requestData.refine = this.refineQuery; @@ -3043,6 +3075,8 @@ var isSelected = selectedIds.indexOf(String(item.id)) !== -1; var itemClass = 'dropdown-item' + (isSelected ? ' selected' : ''); if (item.type === 'product') itemClass += ' result-item-product'; + if (item.is_combination) itemClass += ' is-combination'; + if (item.is_parent) itemClass += ' is-parent-product'; html += '
0) { this.filterableData.attributes.forEach(function(group) { - var html = ''; + html += ''; + html += ''; $attrContainer.append(html); }); this.$dropdown.find('.filter-row-attributes').show(); @@ -3810,12 +3851,17 @@ if (this.filterableData.features && this.filterableData.features.length > 0) { this.filterableData.features.forEach(function(group) { - var html = ''; + html += ''; + html += ''; $featContainer.append(html); }); this.$dropdown.find('.filter-row-features').show(); @@ -3853,6 +3899,7 @@ var colorStyle = val.color ? ' style="--chip-color: ' + val.color + '"' : ''; var colorClass = val.color ? ' has-color' : ''; + html += ''; html += ''; + html += ''; + html += ''; }); $valuesContainer.html(html); @@ -4378,16 +4429,20 @@ console.log('[EntitySelector] Making bulk AJAX request for entities:', JSON.stringify(bulkRequest)); // Single bulk AJAX call for all entity types + var bulkAjaxData = { + ajax: 1, + action: 'getTargetEntitiesByIdsBulk', + trait: 'EntitySelector', + entities: JSON.stringify(bulkRequest) + }; + if (self.config.productSelectionLevel && self.config.productSelectionLevel !== 'product') { + bulkAjaxData.product_selection_level = self.config.productSelectionLevel; + } $.ajax({ url: self.config.ajaxUrl, type: 'POST', dataType: 'json', - data: { - ajax: 1, - action: 'getTargetEntitiesByIdsBulk', - trait: 'EntitySelector', - entities: JSON.stringify(bulkRequest) - }, + data: bulkAjaxData, success: function(response) { console.log('[EntitySelector] AJAX response:', response); if (!response.success || !response.entities) { @@ -4706,18 +4761,22 @@ // Handle entity_search type - load via AJAX var searchEntity = $picker.attr('data-search-entity') || blockType; + var pickerAjaxData = { + ajax: 1, + action: 'getTargetEntitiesByIds', + trait: 'EntitySelector', + entity_type: searchEntity, + ids: JSON.stringify(values) + }; + if (this.config.productSelectionLevel && this.config.productSelectionLevel !== 'product') { + pickerAjaxData.product_selection_level = this.config.productSelectionLevel; + } $.ajax({ url: this.config.ajaxUrl, type: 'POST', dataType: 'json', - data: { - ajax: 1, - action: 'getTargetEntitiesByIds', - trait: 'EntitySelector', - entity_type: searchEntity, - ids: JSON.stringify(values) - }, + data: pickerAjaxData, success: function(response) { if (response.success && response.entities) { // Track which IDs were actually found (entities may have been deleted) @@ -7167,7 +7226,8 @@ clearValidationError: function() { this.$wrapper.removeClass('has-validation-error'); this.$wrapper.find('.trait-validation-error').remove(); - } + }, + }; })(jQuery); @@ -7760,7 +7820,7 @@ class: 'mpr-info-wrapper', 'data-tooltip': helpContent }); - $infoWrapper.append($('', { class: 'material-icons', text: 'info_outline' })); + $infoWrapper.append($('', { class: 'material-icons', text: 'info' })); $placeholder.append($infoWrapper); } }, @@ -8240,23 +8300,8 @@ }); } - // Position popover below badge - var badgeOffset = $badge.offset(); - var badgeHeight = $badge.outerHeight(); - var badgeWidth = $badge.outerWidth(); - var popoverWidth = $popover.outerWidth(); - - var leftPos = badgeOffset.left + (badgeWidth / 2) - (popoverWidth / 2); - var minLeft = 10; - var maxLeft = $(window).width() - popoverWidth - 10; - leftPos = Math.max(minLeft, Math.min(leftPos, maxLeft)); - - $popover.css({ - position: 'absolute', - top: badgeOffset.top + badgeHeight + 8, - left: leftPos, - zIndex: 10000 - }); + // Position popover relative to badge (handles viewport overflow) + this.positionPopover($popover, $badge); // Show with transition $popover.addClass('show'); @@ -8264,6 +8309,61 @@ return $popover; }, + /** + * Position a popover relative to a trigger element. + * Handles horizontal and vertical viewport overflow. + * @param {jQuery} $popover - The popover element + * @param {jQuery} $trigger - The trigger element to position against + * @param {number} [zIndex=10000] - Optional z-index + */ + positionPopover: function($popover, $trigger, zIndex) { + var triggerRect = $trigger[0].getBoundingClientRect(); + var scrollTop = $(window).scrollTop(); + var scrollLeft = $(window).scrollLeft(); + var popoverWidth = $popover.outerWidth(); + var popoverHeight = $popover.outerHeight(); + var windowWidth = $(window).width(); + var windowHeight = $(window).height(); + var gap = 8; + + // Horizontal: center on trigger, then clamp to viewport + var left = triggerRect.left + scrollLeft + (triggerRect.width / 2) - (popoverWidth / 2); + left = Math.max(10, Math.min(left, windowWidth - popoverWidth - 10)); + + // Vertical: prefer below, flip above if it would overflow + var top; + var positionAbove = false; + if (triggerRect.bottom + popoverHeight + gap > windowHeight - 10) { + // Position above the trigger + top = triggerRect.top + scrollTop - popoverHeight - gap; + positionAbove = true; + } else { + // Position below the trigger + top = triggerRect.bottom + scrollTop + gap; + } + + $popover.css({ + position: 'absolute', + top: top, + left: left, + zIndex: zIndex || 10000 + }); + + // Toggle arrow direction class + $popover.toggleClass('position-above', positionAbove); + + // Determine horizontal arrow position class + var triggerCenter = triggerRect.left + (triggerRect.width / 2); + var popoverLeft = left; + var popoverCenter = popoverLeft + (popoverWidth / 2); + $popover.removeClass('position-left position-right'); + if (triggerCenter - popoverLeft < popoverWidth * 0.3) { + $popover.addClass('position-right'); + } else if (triggerCenter - popoverLeft > popoverWidth * 0.7) { + $popover.addClass('position-left'); + } + }, + /** * Update popover after loading more items */ @@ -9228,6 +9328,144 @@ }); }, + // ========================================================================= + // FILTER VALUE PREVIEW (individual attribute/feature value chip) + // ========================================================================= + + /** + * Show preview popover for a specific filter value (attribute or feature value) + * @param {jQuery} $badge - The preview button on the chip + * @param {number} valueId - The attribute/feature value ID + * @param {string} valueType - 'attribute' or 'feature' + * @param {string} valueName - Display name of the value + * @param {number} groupId - The parent group ID + */ + showFilterValuePreviewPopover: function($badge, valueId, valueType, valueName, groupId) { + var self = this; + + this.hidePreviewPopover(); + + $badge.addClass('popover-open loading'); + this.$activeBadge = $badge; + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'previewFilterValueProducts', + trait: 'EntitySelector', + value_id: valueId, + value_type: valueType, + group_id: groupId, + limit: 10 + }, + success: function(response) { + $badge.removeClass('loading'); + + if (response.success) { + self.createPreviewPopover({ + $badge: $badge, + items: response.items || [], + totalCount: response.count || 0, + hasMore: response.hasMore || false, + entityLabel: 'products', + previewType: 'filter-value', + context: { valueId: valueId, valueType: valueType, groupId: groupId, valueName: valueName }, + onLoadMore: function($btn) { + self.loadMoreFilterValueItems($btn); + }, + onFilter: function(query) { + self.filterFilterValueItems(query); + } + }); + } else { + $badge.removeClass('popover-open'); + self.$activeBadge = null; + } + }, + error: function() { + $badge.removeClass('loading popover-open'); + self.$activeBadge = null; + } + }); + }, + + /** + * AJAX filter handler for filter value preview + */ + filterFilterValueItems: function(query) { + var self = this; + var ctx = this.previewContext; + + if (!ctx || !ctx.valueId) { + self.showFilterLoading(false); + return; + } + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'previewFilterValueProducts', + trait: 'EntitySelector', + value_id: ctx.valueId, + value_type: ctx.valueType, + group_id: ctx.groupId, + filter: query, + limit: 20 + }, + success: function(response) { + self.updatePreviewPopoverFiltered(response); + }, + error: function() { + self.showFilterLoading(false); + } + }); + }, + + loadMoreFilterValueItems: function($btn) { + var self = this; + var ctx = this.previewContext; + + if (!ctx || !ctx.valueId) return; + + var loadCount = this.previewLoadCount || 20; + + var ajaxData = { + ajax: 1, + action: 'previewFilterValueProducts', + trait: 'EntitySelector', + value_id: ctx.valueId, + value_type: ctx.valueType, + group_id: ctx.groupId, + limit: self.previewLoadedCount + loadCount + }; + if (self.previewCurrentFilter) { + ajaxData.filter = self.previewCurrentFilter; + } + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: ajaxData, + success: function(response) { + if (response.success) { + self.previewTotalCount = response.count; + self.updatePreviewPopover(response.items || [], response.hasMore); + } + }, + error: function() { + $btn.removeClass('loading'); + $btn.find('i').removeClass('icon-spinner icon-spin').addClass('icon-plus'); + } + }); + }, + // ========================================================================= // CATEGORY ITEMS PREVIEW (products/pages in a category) // ========================================================================= @@ -9565,28 +9803,9 @@ self.switchToBlock(blockType); }); - // Position popover + // Position popover relative to badge (handles viewport overflow) $('body').append($popover); - var badgeOffset = $badge.offset(); - var badgeHeight = $badge.outerHeight(); - var popoverWidth = $popover.outerWidth(); - - $popover.css({ - position: 'absolute', - top: badgeOffset.top + badgeHeight + 5, - left: badgeOffset.left - (popoverWidth / 2) + ($badge.outerWidth() / 2), - zIndex: 10000 - }); - - // Adjust if off screen - var windowWidth = $(window).width(); - var popoverRight = $popover.offset().left + popoverWidth; - if (popoverRight > windowWidth - 10) { - $popover.css('left', windowWidth - popoverWidth - 10); - } - if ($popover.offset().left < 10) { - $popover.css('left', 10); - } + this.positionPopover($popover, $badge); $popover.hide().fadeIn(150); }, diff --git a/assets/js/admin/entity-selector.min.js b/assets/js/admin/entity-selector.min.js index be807d3..45d665b 100644 --- a/assets/js/admin/entity-selector.min.js +++ b/assets/js/admin/entity-selector.min.js @@ -1,2 +1,2 @@ -!function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.utils={debounce:function(e,t){var i;return function(){var a=this,s=arguments;clearTimeout(i),i=setTimeout(function(){e.apply(a,s)},t)}},escapeHtml:function(e){return null==e?"":String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},escapeAttr:function(e){return null==e?"":String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},getEntityTypeIcon:function(e){return{products:"icon-shopping-cart",categories:"icon-folder-open",manufacturers:"icon-building",suppliers:"icon-truck",attributes:"icon-list-alt",features:"icon-tags",cms:"icon-file-text",cms_categories:"icon-folder"}[e]||"icon-cube"},getEntityTypeLabel:function(e){var t=this.config.trans||{};return{products:t.product||"Product",categories:t.category||"Category",manufacturers:t.manufacturer||"Manufacturer",suppliers:t.supplier||"Supplier",attributes:t.attribute||"Attribute",features:t.feature||"Feature",cms:t.cms_page||"CMS Page",cms_categories:t.cms_category||"CMS Category"}[e]||e},validate:function(){if(1!==this.$wrapper.data("required")&&"1"!==this.$wrapper.data("required"))return!0;var t=!1;return this.$wrapper.find(".target-block").each(function(){if(e(this).find(".selection-group").length>0)return t=!0,!1}),t?(this.clearValidationError(),!0):(this.showValidationError(),!1)},showValidationError:function(){this.$wrapper.addClass("has-validation-error");var t=this.$wrapper.data("required-message")||"Please select at least one item";this.$wrapper.find(".trait-validation-error").remove();var i=e("
",{class:"trait-validation-error",html:' '+t});this.$wrapper.find(".condition-trait-header").after(i),e("html, body").animate({scrollTop:this.$wrapper.offset().top-100},300),this.$wrapper.find(".condition-trait-body").is(":visible")||(this.$wrapper.find(".condition-trait-body").slideDown(200),this.$wrapper.removeClass("collapsed"))},clearValidationError:function(){this.$wrapper.removeClass("has-validation-error"),this.$wrapper.find(".trait-validation-error").remove()},getBlockMode:function(e){var t=this.config.blocks[e];return t&&t.mode?t.mode:"multi"},isBlockSingleMode:function(e){return"single"===this.getBlockMode(e)},getCurrentSingleSelection:function(){if("single"!==(this.config.mode||"multi"))return null;var e=this.$wrapper.find(".entity-chips .entity-chip").first();if(e.length){var t=e.closest(".target-block");return{name:e.find(".chip-name").text()||e.data("id"),entityType:t.data("block-type")||"item"}}return null},supportsTreeBrowsing:function(e){return"categories"===e||"cms_categories"===e}}}(jQuery),function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.events={bindEvents:function(){var t=this;this.$wrapper.on("click",".target-block-tab",function(i){i.preventDefault();var a=e(this).data("blockType");t.switchToBlock(a)}),this.$wrapper.on("click",".target-block-tab .tab-badge",function(i){i.stopPropagation(),i.preventDefault();var a=e(this).closest(".target-block-tab");e(this).hasClass("popover-open")?t.hidePreviewPopover():t.showPreviewPopover(a)}),this.$wrapper.on("click",".condition-match-count.clickable",function(i){i.stopPropagation(),i.preventDefault();var a=e(this);a.hasClass("popover-open")?t.hidePreviewPopover():t.showConditionPreviewPopover(a)}),this.$wrapper.on("click",".group-count-badge.clickable",function(i){i.stopPropagation(),i.preventDefault();var a=e(this);a.hasClass("popover-open")?t.hidePreviewPopover():t.showGroupPreviewPopover(a)}),this.$wrapper.on("click",".trait-total-count",function(i){i.stopPropagation(),i.preventDefault();var a=e(this);a.hasClass("popover-open")?t.hidePreviewPopover():t.showTotalPreviewPopover(a)}),e(document).on("click",function(i){e(i.target).closest(".target-preview-popover").length||e(i.target).closest(".holiday-preview-popover").length||e(i.target).closest(".tab-badge").length||e(i.target).closest(".condition-match-count").length||e(i.target).closest(".group-count-badge").length||e(i.target).closest(".group-modifiers").length||e(i.target).closest(".group-preview-badge").length||e(i.target).closest(".toggle-count.clickable").length||e(i.target).closest(".trait-total-count").length||e(i.target).closest(".chip-preview-holidays").length||(t.hidePreviewPopover(),e(".holiday-preview-popover").remove())}),this.$wrapper.on("click",".condition-trait-header",function(i){if(!(e(i.target).closest(".target-block-tabs").length||e(i.target).closest(".trait-header-actions").length||e(i.target).closest(".prestashop-switch").length||e(i.target).closest(".trait-total-count").length)){var a=t.$wrapper.find(".condition-trait-body");a.stop(!0,!0),a.is(":visible")?(a.slideUp(200),t.$wrapper.addClass("collapsed")):(a.slideDown(200),t.$wrapper.removeClass("collapsed"))}}),this.$wrapper.on("click",".btn-toggle-blocks",function(i){i.preventDefault();var a=t.$wrapper.find(".entity-selector-blocks-content"),s=e(this).find(".material-icons");a.stop(!0,!0),a.is(":visible")?(a.slideUp(200),t.$wrapper.addClass("blocks-collapsed"),s.text("expand_more")):(a.slideDown(200),t.$wrapper.removeClass("blocks-collapsed"),s.text("expand_less"))}),this.$wrapper.on("click",".group-header",function(i){e(i.target).closest(".btn-remove-group, .group-name-input").length||"single"!==t.$wrapper.data("mode")&&e(this).closest(".selection-group").toggleClass("collapsed")}),this.$wrapper.on("click",".trait-header-actions .btn-toggle-groups",function(i){i.preventDefault(),i.stopPropagation();var a=e(this),s=a.attr("data-state")||"collapsed",o=t.config.trans||{};"collapsed"===s?(t.$wrapper.find(".selection-group").removeClass("collapsed"),a.attr("data-state","expanded"),a.attr("title",o.collapse_all||"Collapse all groups"),a.find("i").removeClass("icon-expand").addClass("icon-compress")):(t.$wrapper.find(".selection-group").addClass("collapsed"),a.attr("data-state","collapsed"),a.attr("title",o.expand_all||"Expand all groups"),a.find("i").removeClass("icon-compress").addClass("icon-expand"))}),this.$wrapper.on("change",".trait-show-all-toggle .show-all-checkbox",function(i){i.stopPropagation(),e(this).prop("checked")&&t.clearAllConditions()}),this.$wrapper.on("change",".target-switch-toggle",function(i){i.stopPropagation(),"1"===e(this).val()?(t.clearAllConditions(),t.$wrapper.find(".condition-trait-body").slideUp(200),t.$wrapper.addClass("collapsed")):(t.$wrapper.find(".condition-trait-body").slideDown(200),t.$wrapper.removeClass("collapsed"))}),this.$wrapper.on("click",".btn-add-group",function(i){i.preventDefault();var a=e(this).closest(".target-block"),s=a.data("blockType");t.addGroup(a,s)}),this.$wrapper.on("click",".btn-remove-group",function(i){i.preventDefault();var a=e(this).closest(".selection-group"),s=e(this).closest(".target-block");t.removeGroup(a,s)}),this.$wrapper.on("click focus",".group-name-input",function(e){e.stopPropagation()}),this.$wrapper.on("change blur",".group-name-input",function(){var i=e(this),a=i.closest(".selection-group"),s=e.trim(i.val());a.attr("data-group-name",s),t.serializeAllBlocks()}),this.$wrapper.on("click",".btn-add-exclude",function(i){i.preventDefault();var a=e(this).closest(".selection-group"),s=e(this).closest(".target-block");t.addFirstExcludeRow(a,s)}),this.$wrapper.on("click",".btn-add-another-exclude",function(i){i.preventDefault();var a=e(this).closest(".selection-group"),s=e(this).closest(".target-block");t.addExcludeRow(a,s)}),this.$wrapper.on("click",".btn-remove-exclude-row",function(i){i.preventDefault();var a=e(this).closest(".exclude-row"),s=e(this).closest(".selection-group"),o=e(this).closest(".target-block");t.removeExcludeRow(a,s,o)}),this.$wrapper.on("change",".include-method-select",function(){t.hideDropdown();var i=e(this).closest(".selection-group"),a=e(this).closest(".target-block"),s=i.find(".group-include"),o=a.data("blockType"),n=(t.config.blocks[o]||{}).selection_methods||{},r=e(this).find("option:selected"),l=r.data("valueType")||"none",c=r.data("searchEntity")||"",d=r.data("options")||null,p=i.find(".include-picker"),u=t.buildValuePickerHtml("include",l,c,n);if(p.replaceWith(u),"select"===l&&d){var h=(f=i.find(".include-picker")).find(".select-value-input");h.empty(),e.each(d,function(e,i){h.append('")})}if("multi_select_tiles"===l&&d){var f=i.find(".include-picker"),v=!0===r.data("exclusive");t.populateTiles(f,d,v)}if("multi_numeric_range"===l){f=i.find(".include-picker");var m=r.data("step"),g=r.data("min");t.applyRangeInputConstraints(f,m,g)}"combination_attributes"===l&&(f=i.find(".include-picker"),t.loadCombinationAttributeGroups(f));var b=e(this).val();t.updateMethodInfoPlaceholder(i.find(".method-selector-wrapper"),b,o),t.updateBlockStatus(a),t.serializeAllBlocks(s)}),this.$wrapper.on("change",".exclude-method-select",function(){t.hideDropdown();var i=e(this).closest(".exclude-row"),a=(e(this).closest(".selection-group"),e(this).closest(".target-block").data("blockType")),s=(t.config.blocks[a]||{}).selection_methods||{},o=e(this).find("option:selected"),n=o.data("valueType")||"entity_search",r=o.data("searchEntity")||a,l=o.data("options")||null,c=i.find(".exclude-picker"),d=t.buildValuePickerHtml("exclude",n,r,s);if(c.replaceWith(d),"select"===n&&l){var p=(u=i.find(".exclude-picker")).find(".select-value-input");p.empty(),e.each(l,function(e,i){p.append('")})}if("multi_select_tiles"===n&&l){var u=i.find(".exclude-picker"),h=!0===o.data("exclusive");t.populateTiles(u,l,h)}if("multi_numeric_range"===n){u=i.find(".exclude-picker");var f=o.data("step"),v=o.data("min");t.applyRangeInputConstraints(u,f,v)}"combination_attributes"===n&&(u=i.find(".exclude-picker"),t.loadCombinationAttributeGroups(u));var m=e(this).val();t.updateMethodInfoPlaceholder(i.find(".exclude-header-row"),m,a),t.serializeAllBlocks(i)}),this.$wrapper.on("keydown",".pattern-input",function(t){13===t.keyCode&&(t.preventDefault(),e(this).closest(".draft-tag").find(".btn-add-pattern").click())}),this.$wrapper.on("click",".draft-tag .btn-add-pattern",function(i){i.preventDefault(),i.stopPropagation();var a=e(this).closest(".draft-tag"),s=a.closest(".value-picker"),o=a.closest(".group-include, .exclude-row"),n=a.find(".pattern-input"),r=e.trim(n.val());if(r){var l="1"===a.attr("data-case-sensitive");t.addPatternTag(s,r,l),n.val("").focus(),a.find(".pattern-match-count").removeClass("count-found count-zero").hide(),a.find(".pattern-match-count .count-value").text(""),t.serializeAllBlocks(o)}}),this.$wrapper.on("input",".pattern-input",function(){var i=e(this),a=i.closest(".draft-tag");if(a.length){var s=e.trim(i.val());i.data("countTimeout")&&clearTimeout(i.data("countTimeout"));var o=a.find(".pattern-match-count");if(s){var n=setTimeout(function(){var e="1"===a.attr("data-case-sensitive");t.updateDraftTagCount(a,s,e)},300);i.data("countTimeout",n)}else{o.removeClass("count-found count-zero").hide(),o.find(".count-value").text("");var r=a.closest(".selection-group");r.length&&t.updateGroupTotalCount(r)}}}),this.$wrapper.on("click",".pattern-tag .btn-remove-pattern",function(i){i.preventDefault(),i.stopPropagation();var a=e(this).closest(".group-include, .exclude-row");e(this).closest(".pattern-tag").remove(),t.serializeAllBlocks(a)}),this.$wrapper.on("click",".pattern-tag .btn-toggle-case",function(i){i.preventDefault(),i.stopPropagation();var a=e(this).closest(".pattern-tag"),s=e(this),o=t.config.trans||{},n=a.hasClass("draft-tag"),r=!(1===a.data("caseSensitive")||"1"===a.data("caseSensitive")||"1"===a.attr("data-case-sensitive"));a.data("caseSensitive",r?1:0),a.attr("data-case-sensitive",r?"1":"0"),a.toggleClass("case-sensitive",r),s.find(".case-icon").text(r?"Aa":"aa");var l=r?o.case_sensitive||"Case sensitive - click to toggle":o.case_insensitive||"Case insensitive - click to toggle";if(s.attr("title",l),n){var c=e.trim(a.find(".pattern-input").val());c&&t.updateDraftTagCount(a,c,r)}else{var d=a.closest(".group-include, .exclude-row");t.serializeAllBlocks(d)}}),this.$wrapper.on("click",".pattern-match-count",function(i){i.preventDefault(),i.stopPropagation();var a=e(this),s=a.data("count"),o=a.data("pattern"),n=a.data("entityType"),r=a.data("caseSensitive");!s||s<=0||!o||t.showPatternPreviewModal(o,n,r,s)}),this.$wrapper.on("click",".pattern-tag .pattern-tag-text",function(t){t.preventDefault();var i=e(this).closest(".pattern-tag");if(!i.hasClass("editing")){var a=i.data("pattern"),s=e('').val(a),o=e(''),n=e(''),r=e('').append(o,n);i.addClass("editing").find(".pattern-tag-text").hide(),i.find(".btn-remove-pattern").hide(),i.prepend(r).prepend(s),s.focus().select(),s.on("keydown",function(e){13===e.keyCode?(e.preventDefault(),o.click()):27===e.keyCode&&(e.preventDefault(),n.click())})}}),this.$wrapper.on("click",".pattern-tag .btn-pattern-save",function(i){i.preventDefault(),i.stopPropagation();var a=e(this).closest(".pattern-tag"),s=a.find(".pattern-tag-edit"),o=a.data("pattern"),n=e.trim(s.val());n&&n!==o&&(a.data("pattern",n),a.find(".pattern-tag-text").text(n)),s.remove(),a.find(".pattern-edit-actions").remove(),a.removeClass("editing").find(".pattern-tag-text, .btn-remove-pattern").show();var r=a.closest(".group-include, .exclude-row");t.serializeAllBlocks(r)}),this.$wrapper.on("click",".pattern-tag .btn-pattern-cancel",function(t){t.preventDefault(),t.stopPropagation();var i=e(this).closest(".pattern-tag");i.find(".pattern-tag-edit").remove(),i.find(".pattern-edit-actions").remove(),i.removeClass("editing").find(".pattern-tag-text, .btn-remove-pattern").show()}),this.$wrapper.on("mouseenter",".mpr-info-wrapper[data-details]",function(){var t=e(this);if(!t.data("tooltip-active")){var i=t.attr("data-details"),a=t.attr("data-tooltip-class")||"",s=e("
",{class:"mpr-tooltip mpr-tooltip-fixed "+a,html:i});e("body").append(s),t.data("tooltip-active",!0);var o=t.offset(),n=t.outerWidth(),r=s.outerWidth(),l=s.outerHeight(),c=o.left+n/2-r/2,d=o.top-l-10;c<10&&(c=10),c+r>e(window).width()-10&&(c=e(window).width()-r-10),s.css({position:"fixed",left:c+"px",top:d-e(window).scrollTop()+"px"}),t.data("tooltip-el",s)}}),this.$wrapper.on("mouseleave",".mpr-info-wrapper[data-details]",function(){var t=e(this),i=t.data("tooltip-el");i&&i.remove(),t.data("tooltip-active",!1),t.data("tooltip-el",null)}),this.$wrapper.on("change",".range-min-input, .range-max-input",function(){var i=e(this).closest(".group-include, .exclude-row");t.serializeAllBlocks(i)}),this.$wrapper.on("change",".date-from-input, .date-to-input",function(){var i=e(this).closest(".group-include, .exclude-row");t.serializeAllBlocks(i)}),this.$wrapper.on("change",".select-value-input",function(){var i=e(this).closest(".group-include, .exclude-row");t.serializeAllBlocks(i)}),this.$wrapper.on("click",".btn-add-range",function(i){i.preventDefault();var a=e(this).closest(".value-picker"),s=e(this).closest(".group-include, .exclude-row"),o=a.find(".multi-range-container"),n=o.find(".multi-range-chips"),r=o.find(".range-min-input"),l=o.find(".range-max-input"),c=r.val().trim(),d=l.val().trim();if(""!==c||""!==d){var p=parseFloat(r.attr("step"))||.01,u=r.attr("min"),h=void 0!==u&&""!==u;u=h?parseFloat(u):null;var f=""!==c?parseFloat(c):null,v=""!==d?parseFloat(d):null;if(h){if(null!==f&&fv)t.showRangeInputError(r,t.config.trans.min_greater_than_max||"Min cannot be greater than max");else{var m,g=p<1?String(p).split(".")[1].length:0;null!==f&&(f=p>=1?Math.round(f):parseFloat(f.toFixed(g)),c=String(f)),null!==v&&(v=p>=1?Math.round(v):parseFloat(v.toFixed(g)),d=String(v)),m=""!==c&&""!==d?c+" - "+d:""!==c?"≥ "+c:"≤ "+d;var b=e("",{class:"range-chip","data-min":c,"data-max":d});b.append(e("",{class:"range-chip-text",text:m})),b.append(e("",i+='",i+='
',i+='",i+='",i+='",i+="
",i+='
',i+='',i+='',i+='',i+="
",i+='",i+='",i+="
",i+="
",i+='
',i+='
',i+='",i+='",i+='
',i+=''+(t.price||"Price")+":",i+='',i+='-',i+='',i+="
",i+='",i+="
",i+='",i+='",i+='",i+='",i+='",i+='",i+='",i+='",i+='",i+='",i+='",i+='",i+="
",i+='
',i+='',i+=''+(t.product||"Product")+"",i+=''+(t.price||"Price")+"",i+=''+(t.sale||"Sale")+"",i+=''+(t.stock||"Stock")+"",i+=''+(t.sold||"Sold")+"",i+="
",i+='',i+='",i+="
",this.$dropdown=e(i),e("body").append(this.$dropdown)},hideDropdown:function(){this.$dropdown&&this.$dropdown.removeClass("show"),this.activeGroup=null},positionDropdown:function(t){if(this.$dropdown){var i=t.closest(".value-picker"),a=t.closest(".entity-search-box"),s=a.offset(),o=a.outerHeight(),n=i.offset(),r=i.outerWidth(),l=s.top+o+4,c=n.left,d=Math.max(r,400),p=e(window).width();c+d>p-10&&(d=p-c-10);var u=e(window).height()-(l-e(window).scrollTop())-20;u=Math.max(u,400),this.$dropdown.css({position:"absolute",top:l,left:c,width:d,maxHeight:u,zIndex:1e4}),this.$dropdown.addClass("show")}}}}(jQuery),function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.search={categoryTreeCache:null,performSearch:function(t){var i=this;if(this.activeGroup){this.isLoading=!0;var a=this.activeGroup.searchEntity,s=t&&this.loadMoreCount?this.loadMoreCount:20,o={ajax:1,action:"searchTargetEntities",trait:"EntitySelector",entity_type:a,q:this.searchQuery,limit:s,offset:t?this.searchOffset:0,sort_by:this.currentSort?this.currentSort.field:"name",sort_dir:this.currentSort?this.currentSort.dir:"ASC"};this.refineQuery&&(o.refine=this.refineQuery,this.refineNegate&&(o.refine_negate=1)),"products"===a&&this.filters&&(this.filters.inStock&&(o.filter_in_stock=1),this.filters.discounted&&(o.filter_discounted=1),null!==this.filters.priceMin&&""!==this.filters.priceMin&&(o.filter_price_min=this.filters.priceMin),null!==this.filters.priceMax&&""!==this.filters.priceMax&&(o.filter_price_max=this.filters.priceMax),this.filters.attributes&&this.filters.attributes.length>0&&(o.filter_attributes=JSON.stringify(this.filters.attributes)),this.filters.features&&this.filters.features.length>0&&(o.filter_features=JSON.stringify(this.filters.features))),"products"!==a&&this.filters&&(null!==this.filters.productCountMin&&""!==this.filters.productCountMin&&(o.filter_product_count_min=this.filters.productCountMin),null!==this.filters.productCountMax&&""!==this.filters.productCountMax&&(o.filter_product_count_max=this.filters.productCountMax),"categories"===a&&(this.filters.depth&&(o.filter_depth=this.filters.depth),this.filters.hasProducts&&(o.filter_has_products=1),this.filters.hasDescription&&(o.filter_has_description=1),this.filters.hasImage&&(o.filter_has_image=1),null!==this.filters.salesMin&&""!==this.filters.salesMin&&(o.filter_sales_min=this.filters.salesMin),null!==this.filters.salesMax&&""!==this.filters.salesMax&&(o.filter_sales_max=this.filters.salesMax),null!==this.filters.turnoverMin&&""!==this.filters.turnoverMin&&(o.filter_turnover_min=this.filters.turnoverMin),null!==this.filters.turnoverMax&&""!==this.filters.turnoverMax&&(o.filter_turnover_max=this.filters.turnoverMax),this.filters.activeOnly&&(o.filter_active=1)),"manufacturers"===a&&(null!==this.filters.salesMin&&""!==this.filters.salesMin&&(o.filter_sales_min=this.filters.salesMin),null!==this.filters.salesMax&&""!==this.filters.salesMax&&(o.filter_sales_max=this.filters.salesMax),null!==this.filters.turnoverMin&&""!==this.filters.turnoverMin&&(o.filter_turnover_min=this.filters.turnoverMin),null!==this.filters.turnoverMax&&""!==this.filters.turnoverMax&&(o.filter_turnover_max=this.filters.turnoverMax),this.filters.dateAddFrom&&(o.filter_date_add_from=this.filters.dateAddFrom),this.filters.dateAddTo&&(o.filter_date_add_to=this.filters.dateAddTo),this.filters.lastProductFrom&&(o.filter_last_product_from=this.filters.lastProductFrom),this.filters.lastProductTo&&(o.filter_last_product_to=this.filters.lastProductTo),this.filters.activeOnly&&(o.filter_active=1)),"suppliers"===a&&(null!==this.filters.salesMin&&""!==this.filters.salesMin&&(o.filter_sales_min=this.filters.salesMin),null!==this.filters.salesMax&&""!==this.filters.salesMax&&(o.filter_sales_max=this.filters.salesMax),null!==this.filters.turnoverMin&&""!==this.filters.turnoverMin&&(o.filter_turnover_min=this.filters.turnoverMin),null!==this.filters.turnoverMax&&""!==this.filters.turnoverMax&&(o.filter_turnover_max=this.filters.turnoverMax),this.filters.dateAddFrom&&(o.filter_date_add_from=this.filters.dateAddFrom),this.filters.dateAddTo&&(o.filter_date_add_to=this.filters.dateAddTo),this.filters.lastProductFrom&&(o.filter_last_product_from=this.filters.lastProductFrom),this.filters.lastProductTo&&(o.filter_last_product_to=this.filters.lastProductTo),this.filters.activeOnly&&(o.filter_active=1)),"attributes"===a&&(null!==this.filters.salesMin&&""!==this.filters.salesMin&&(o.filter_sales_min=this.filters.salesMin),null!==this.filters.salesMax&&""!==this.filters.salesMax&&(o.filter_sales_max=this.filters.salesMax),null!==this.filters.turnoverMin&&""!==this.filters.turnoverMin&&(o.filter_turnover_min=this.filters.turnoverMin),null!==this.filters.turnoverMax&&""!==this.filters.turnoverMax&&(o.filter_turnover_max=this.filters.turnoverMax),this.filters.attributeGroup&&(o.filter_attribute_group=this.filters.attributeGroup),this.filters.isColor&&(o.filter_is_color=1)),"features"===a&&(null!==this.filters.salesMin&&""!==this.filters.salesMin&&(o.filter_sales_min=this.filters.salesMin),null!==this.filters.salesMax&&""!==this.filters.salesMax&&(o.filter_sales_max=this.filters.salesMax),null!==this.filters.turnoverMin&&""!==this.filters.turnoverMin&&(o.filter_turnover_min=this.filters.turnoverMin),null!==this.filters.turnoverMax&&""!==this.filters.turnoverMax&&(o.filter_turnover_max=this.filters.turnoverMax),this.filters.featureGroup&&(o.filter_feature_group=this.filters.featureGroup),this.filters.isCustom&&(o.filter_is_custom=1)),"cms"===a&&(this.filters.activeOnly&&(o.filter_active=1),this.filters.indexable&&(o.filter_indexable=1)),"cms_categories"===a&&this.filters.activeOnly&&(o.filter_active=1),"countries"===a&&(this.filters.activeOnly&&(o.filter_active=1),this.filters.hasHolidays&&(o.filter_has_holidays=1),this.filters.containsStates&&(o.filter_contains_states=1),this.filters.zone&&(o.filter_zone=this.filters.zone))),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:o,success:function(e){i.isLoading=!1,e.success&&(i.searchQuery&&i.searchQuery.length>=2&&e.total>0&&i.addToSearchHistory(a,i.searchQuery),i.searchResults=t?i.searchResults.concat(e.results||[]):e.results||[],i.searchTotal=e.total||0,i.searchOffset=t?i.searchOffset+(e.results||[]).length:(e.results||[]).length,i.renderSearchResults(t),i.$dropdown.addClass("show"))},error:function(){i.isLoading=!1}})}},renderSearchResults:function(t){var i=this,a=this.config.trans||{},s=this.$dropdown.find(".dropdown-results"),o=[],n=[];if(this.activeGroup){var r=this.$wrapper.find('.target-block[data-block-type="'+this.activeGroup.blockType+'"]').find('.selection-group[data-group-index="'+this.activeGroup.groupIndex+'"]'),l=this.activeGroup.searchEntity,c=this.activeGroup.excludeIndex;"include"===this.activeGroup.section?r.find(".include-picker").find(".entity-chip").each(function(){o.push(String(e(this).data("id")))}):(r.find('.exclude-row[data-exclude-index="'+c+'"]').find(".exclude-picker").find(".entity-chip").each(function(){o.push(String(e(this).data("id")))}),r.find(".exclude-row").each(function(){var t=e(this);if(parseInt(t.data("excludeIndex"),10)!==c){var a=t.find(".exclude-picker");(a.attr("data-search-entity")||i.activeGroup.blockType)===l&&a.find(".entity-chip").each(function(){n.push(String(e(this).data("id")))})}}))}var d=this.activeGroup&&"products"===this.activeGroup.searchEntity,p="list"===this.viewMode;this.$dropdown.find(".results-header").toggle(d&&p);var u=this.searchResults.filter(function(e){return-1===n.indexOf(String(e.id))}),h=this.searchResults.length-u.length,f=u.length+" / "+this.searchTotal+" results";h>0&&(f+=" ("+h+" hidden)"),this.$dropdown.find(".results-count").text(f);var v="";0!==u.length||t?u.forEach(function(e){var t="dropdown-item"+(-1!==o.indexOf(String(e.id))?" selected":"");"product"===e.type&&(t+=" result-item-product"),v+='
'}else if(e.image)v+='
';else{var n="icon-cube";"categories"===a?n="icon-folder":"manufacturers"===a?n="icon-building":"suppliers"===a?n="icon-truck":"attributes"===a?n="icon-paint-brush":"features"===a?n="icon-list-ul":"cms"===a?n="icon-file-text-o":"cms_categories"===a&&(n="icon-folder-o"),v+='
'}if(v+='
',v+='
'+i.escapeHtml(e.name)+"
",e.subtitle){var r=e.subtitle.split("\n");v+='
',r.forEach(function(e,t){v+='
'+i.escapeHtml(e)+"
"}),v+="
"}if(v+="
","product"===e.type)if(p){v+='
',v+=''+(e.regular_price_formatted||e.price_formatted||"")+"",v+="
",e.has_discount?(v+='
',v+=''+(e.price_formatted||"")+"",v+="
"):v+='
';var l="out_of_stock"===e.stock_status?"stock-out":"low_stock"===e.stock_status?"stock-low":"stock-ok";v+='
',v+=''+(void 0!==e.stock_qty?e.stock_qty:"")+"",v+="
",v+='
',v+=''+(void 0!==e.sales_qty?e.sales_qty:"0")+"",v+="
"}else{var c="out_of_stock"===e.stock_status?"stock-out":"low_stock"===e.stock_status?"stock-low":"";v+='
',v+=''+(e.price_formatted||"")+"",void 0!==e.stock_qty&&(v+=''+e.stock_qty+" qty"),e.has_discount&&(v+='-'+(e.discount_percent||"")+"%"),v+="
"}v+=""}):v='
'+(a.no_results||"No results found")+"
",t?s.append(v):s.html(v);var m=this.searchResults.length'+(a.all||"All")+" ("+b+")")}this.$dropdown.find(".dropdown-actions").show(),this.$dropdown.find(".btn-show-history").removeClass("active");var x=this.activeGroup?this.activeGroup.searchEntity:null,_=x&&this.getSearchHistory(x).length>0;this.$dropdown.find(".btn-show-history").prop("disabled",!_)},loadSearchHistory:function(){try{var e=localStorage.getItem(this.searchHistoryKey);this.searchHistory=e?JSON.parse(e):{}}catch(e){this.searchHistory={}}},saveSearchHistory:function(){try{localStorage.setItem(this.searchHistoryKey,JSON.stringify(this.searchHistory))}catch(e){}},addToSearchHistory:function(e,t){if(t&&!(t.length<2)){this.searchHistory[e]||(this.searchHistory[e]=[]);var i=this.searchHistory[e],a=i.indexOf(t);-1!==a&&i.splice(a,1),i.unshift(t),i.length>this.searchHistoryMax&&(i=i.slice(0,this.searchHistoryMax)),this.searchHistory[e]=i,this.saveSearchHistory()}},removeFromSearchHistory:function(e,t){if(this.searchHistory[e]){var i=this.searchHistory[e].indexOf(t);-1!==i&&(this.searchHistory[e].splice(i,1),this.saveSearchHistory())}},getSearchHistory:function(e){return this.searchHistory[e]||[]},showSearchHistory:function(e){var t=this.getSearchHistory(e),i=this.config.trans||{},a=this.$dropdown.find(".dropdown-results");if(this.$dropdown.find(".results-count").text(i.recent_searches||"Recent searches"),this.$dropdown.find(".dropdown-actions").hide(),this.$dropdown.find(".filter-panel").removeClass("show"),this.$dropdown.find(".btn-toggle-filters").removeClass("active"),this.$dropdown.find(".results-header").hide(),t.length){for(var s='
',o=0;o',s+='',s+=''+this.escapeHtml(n)+"",s+='",s+="
"}s+="",a.html(s),this.$dropdown.addClass("show")}else this.performSearch()},refreshSearch:function(){"tree"!==this.viewMode?(this.searchOffset=0,this.loadMoreCount=20,this.$dropdown&&(this.$dropdown.find(".load-more-select").val("20"),this.$dropdown.find('.load-more-select option[data-all="true"]').remove()),this.performSearch(!1)):this.filterCategoryTree(this.searchQuery||"")},clearFilters:function(){if(this.refineQuery="",this.refineNegate=!1,this.filters={inStock:!1,discounted:!1,priceMin:null,priceMax:null,attributes:[],features:[],productCountMin:null,productCountMax:null,salesMin:null,salesMax:null,turnoverMin:null,turnoverMax:null,depth:null,hasProducts:!1,hasDescription:!1,hasImage:!1,activeOnly:!0,attributeGroup:null,featureGroup:null,dateAddFrom:null,dateAddTo:null,lastProductFrom:null,lastProductTo:null,hasHolidays:!1,containsStates:!1,zone:null},this.$dropdown){var e=this.config.trans||{};this.$dropdown.find(".refine-input").val("").attr("placeholder",e.refine_short||"Refine..."),this.$dropdown.find(".btn-clear-refine").hide(),this.$dropdown.find(".btn-refine-negate").removeClass("active"),this.$dropdown.find(".filter-in-stock").prop("checked",!1),this.$dropdown.find(".filter-discounted").prop("checked",!1),this.$dropdown.find(".filter-price-min").val(""),this.$dropdown.find(".filter-price-max").val(""),this.$dropdown.find(".filter-attr-chip").removeClass("active"),this.$dropdown.find(".filter-feat-chip").removeClass("active"),this.$dropdown.find(".filter-group-toggle").removeClass("active has-selection"),this.$dropdown.find(".filter-row-values").hide(),this.$dropdown.find(".filter-product-count-min, .filter-product-count-max").val(""),this.$dropdown.find(".filter-sales-min, .filter-sales-max").val(""),this.$dropdown.find(".filter-turnover-min, .filter-turnover-max").val(""),this.$dropdown.find(".filter-date-add-from, .filter-date-add-to").val(""),this.$dropdown.find(".filter-last-product-from, .filter-last-product-to").val(""),this.$dropdown.find(".filter-depth-select").val(""),this.$dropdown.find(".filter-has-products").prop("checked",!1),this.$dropdown.find(".filter-has-description").prop("checked",!1),this.$dropdown.find(".filter-has-image").prop("checked",!1),this.$dropdown.find(".filter-active-only").prop("checked",!0),this.$dropdown.find(".filter-attribute-group-select, .filter-feature-group-select").val(""),this.$dropdown.find(".filter-has-holidays").prop("checked",!1),this.$dropdown.find(".filter-contains-states").prop("checked",!1),this.$dropdown.find(".filter-zone-select").val("")}this.refreshSearch()},resetFiltersWithoutSearch:function(){if(this.refineQuery="",this.refineNegate=!1,this.filters={inStock:!1,discounted:!1,priceMin:null,priceMax:null,attributes:[],features:[],productCountMin:null,productCountMax:null,salesMin:null,salesMax:null,turnoverMin:null,turnoverMax:null,depth:null,hasProducts:!1,hasDescription:!1,hasImage:!1,activeOnly:!0,attributeGroup:null,featureGroup:null,dateAddFrom:null,dateAddTo:null,lastProductFrom:null,lastProductTo:null,hasHolidays:!1,containsStates:!1,zone:null},this.$dropdown){var e=this.config.trans||{};this.$dropdown.find(".refine-input").val("").attr("placeholder",e.refine_short||"Refine..."),this.$dropdown.find(".btn-clear-refine").hide(),this.$dropdown.find(".btn-refine-negate").removeClass("active"),this.$dropdown.find(".filter-in-stock").prop("checked",!1),this.$dropdown.find(".filter-discounted").prop("checked",!1),this.$dropdown.find(".filter-price-min").val(""),this.$dropdown.find(".filter-price-max").val(""),this.$dropdown.find(".filter-attr-chip").removeClass("active"),this.$dropdown.find(".filter-feat-chip").removeClass("active"),this.$dropdown.find(".filter-group-toggle").removeClass("active has-selection"),this.$dropdown.find(".filter-row-values").hide(),this.$dropdown.find(".filter-product-count-min, .filter-product-count-max").val(""),this.$dropdown.find(".filter-sales-min, .filter-sales-max").val(""),this.$dropdown.find(".filter-turnover-min, .filter-turnover-max").val(""),this.$dropdown.find(".filter-date-add-from, .filter-date-add-to").val(""),this.$dropdown.find(".filter-last-product-from, .filter-last-product-to").val(""),this.$dropdown.find(".filter-depth-select").val(""),this.$dropdown.find(".filter-has-products").prop("checked",!1),this.$dropdown.find(".filter-has-description").prop("checked",!1),this.$dropdown.find(".filter-has-image").prop("checked",!1),this.$dropdown.find(".filter-active-only").prop("checked",!0),this.$dropdown.find(".filter-attribute-group-select, .filter-feature-group-select").val(""),this.$dropdown.find(".filter-has-holidays").prop("checked",!1),this.$dropdown.find(".filter-contains-states").prop("checked",!1),this.$dropdown.find(".filter-zone-select").val("")}},updateFilterPanelForEntity:function(e){if(this.$dropdown){var t=this.$dropdown.find(".filter-panel");t.find(".filter-row").hide();var i=this.$dropdown.find(".view-mode-select option.tree-view-option");"categories"===e||"cms_categories"===e?(i.prop("disabled",!1).prop("hidden",!1),"tree"!==this.viewMode?(this.viewMode="tree",this.$dropdown.find(".view-mode-select").val("tree"),this.$dropdown.removeClass("view-list view-cols-2 view-cols-3 view-cols-4 view-cols-5 view-cols-6 view-cols-7 view-cols-8").addClass("view-tree"),this.loadCategoryTree()):this.loadCategoryTree()):(i.prop("disabled",!0).prop("hidden",!0),"tree"===this.viewMode&&(this.viewMode="list",this.$dropdown.find(".view-mode-select").val("list"),this.$dropdown.removeClass("view-tree").addClass("view-list"))),"products"===e?(t.find(".filter-row-quick").show(),this.filterableData&&(this.filterableData.attributes&&this.filterableData.attributes.length>0&&this.$dropdown.find(".filter-row-attributes").show(),this.filterableData.features&&this.filterableData.features.length>0&&this.$dropdown.find(".filter-row-features").show())):"categories"===e?t.find(".filter-row-entity-categories").show():"manufacturers"===e?t.find(".filter-row-entity-manufacturers").show():"suppliers"===e?t.find(".filter-row-entity-suppliers").show():"attributes"===e?(t.find(".filter-row-entity-attributes").show(),this.loadAttributeGroups()):"features"===e?t.find(".filter-row-entity-features").show():"cms"===e?t.find(".filter-row-entity-cms").show():"cms_categories"===e?t.find(".filter-row-entity-cms-categories").show():"countries"===e&&(t.find(".filter-row-entity-countries").show(),this.loadZonesForCountryFilter())}},loadAttributeGroups:function(){var t=this,i=this.$dropdown.find(".filter-attribute-group-select");i.find("option").length>1||e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getAttributeGroups",trait:"EntitySelector"},success:function(a){a.success&&a.groups&&e.each(a.groups,function(e,a){i.append('")})}})},loadFeatureGroups:function(){var t=this,i=this.$dropdown.find(".filter-feature-group-select");i.find("option").length>1||e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getFeatureGroups",trait:"EntitySelector"},success:function(a){a.success&&a.groups&&e.each(a.groups,function(e,a){i.append('")})}})}}}(jQuery),function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.filters={clearFilters:function(){this.refineQuery="",this.refineNegate=!1,this.filters={inStock:!1,discounted:!1,priceMin:null,priceMax:null,attributes:[],features:[],productCountMin:null,productCountMax:null,salesMin:null,salesMax:null,turnoverMin:null,turnoverMax:null,depth:null,hasProducts:!1,hasDescription:!1,hasImage:!1,activeOnly:!0,attributeGroup:null,featureGroup:null,dateAddFrom:null,dateAddTo:null,lastProductFrom:null,lastProductTo:null,hasHolidays:!1,containsStates:!1,zone:null},this.$dropdown&&(this.config.trans,this.$dropdown.find(".refine-input").val(""),this.$dropdown.find(".btn-refine-negate").removeClass("active"),this.$dropdown.find(".filter-in-stock").prop("checked",!1),this.$dropdown.find(".filter-discounted").prop("checked",!1),this.$dropdown.find(".filter-price-min, .filter-price-max").val(""),this.$dropdown.find(".filter-attr-chip, .filter-feat-chip").removeClass("active"),this.$dropdown.find(".filter-product-count-min, .filter-product-count-max").val(""),this.$dropdown.find(".filter-sales-min, .filter-sales-max").val(""),this.$dropdown.find(".filter-depth-select").val(""),this.$dropdown.find(".filter-has-products").prop("checked",!1),this.$dropdown.find(".filter-active-only").prop("checked",!0),this.$dropdown.find(".filter-has-holidays").prop("checked",!1),this.$dropdown.find(".filter-contains-states").prop("checked",!1),this.$dropdown.find(".filter-zone-select").val("")),this.refreshSearch()},resetFiltersWithoutSearch:function(){this.refineQuery="",this.refineNegate=!1,this.filters={inStock:!1,discounted:!1,priceMin:null,priceMax:null,attributes:[],features:[],productCountMin:null,productCountMax:null,salesMin:null,salesMax:null,turnoverMin:null,turnoverMax:null,depth:null,hasProducts:!1,hasDescription:!1,hasImage:!1,activeOnly:!0,attributeGroup:null,featureGroup:null,dateAddFrom:null,dateAddTo:null,lastProductFrom:null,lastProductTo:null,hasHolidays:!1,containsStates:!1,zone:null}},updateFilterPanelForEntity:function(e){if(this.$dropdown){var t=this.$dropdown.find(".filter-panel");t.find(".filter-row").hide(),t.find('.filter-row[data-entity="'+e+'"]').show(),t.find(".filter-row-entity-"+e.replace("_","-")).show();var i="categories"===e||"cms_categories"===e;this.$dropdown.find(".tree-view-option").toggle(i),i&&"list"===this.viewMode?(this.viewMode="tree",this.$dropdown.find(".view-mode-select").val("tree"),this.$dropdown.removeClass("view-list view-cols-2 view-cols-3 view-cols-4 view-cols-5 view-cols-6 view-cols-7 view-cols-8").addClass("view-tree")):i||"tree"!==this.viewMode||(this.viewMode="list",this.$dropdown.find(".view-mode-select").val("list"),this.$dropdown.removeClass("view-tree view-cols-2 view-cols-3 view-cols-4 view-cols-5 view-cols-6 view-cols-7 view-cols-8").addClass("view-list")),"countries"===e&&this.loadZonesForCountryFilter(),this.updateSortOptionsForEntity(e)}},updateSortOptionsForEntity:function(t){if(this.$dropdown){var i=this.$dropdown.find(".sort-field-select"),a=i.val(),s=!1;i.find("option").each(function(){var i=e(this),o=i.data("entities");if(!o)return i.show(),void(i.val()===a&&(s=!0));var n=-1!==o.split(",").indexOf(t);i.toggle(n),n&&i.val()===a&&(s=!0)}),s||(i.val("name"),this.currentSort.field="name")}},loadFilterableData:function(){var t=this;this.filterableData?this.renderFilterDropdowns():e.ajax({url:this.config.ajaxUrl,type:"POST",data:{ajax:1,action:"getTargetFilterableAttributes",trait:"EntitySelector"},dataType:"json",success:function(e){e.success&&e.data&&(t.filterableData=e.data,t.renderFilterDropdowns())}})},renderFilterDropdowns:function(){if(this.$dropdown&&this.filterableData){var e=this,t=this.$dropdown.find(".filter-attributes-container");t.empty(),this.filterableData.attributes&&this.filterableData.attributes.length>0&&(this.filterableData.attributes.forEach(function(i){var a='",t.append(a)}),this.$dropdown.find(".filter-row-attributes").show());var i=this.$dropdown.find(".filter-features-container");i.empty(),this.filterableData.features&&this.filterableData.features.length>0&&(this.filterableData.features.forEach(function(t){var a='",i.append(a)}),this.$dropdown.find(".filter-row-features").show())}},showFilterGroupValues:function(e,t){if(this.filterableData){var i=this,a=("attribute"===t?this.filterableData.attributes:this.filterableData.features).find(function(t){return t.id==e});if(a){this.$dropdown.find(".filter-row-values").hide();var s="attribute"===t?".filter-row-attr-values":".filter-row-feat-values",o=this.$dropdown.find(s),n=o.find(".filter-values-container");n.empty();var r=''+a.name+":";a.values.forEach(function(a){var s=("attribute"===t?-1!==i.filters.attributes.indexOf(a.id):-1!==i.filters.features.indexOf(a.id))?" active":"",o="attribute"===t?"filter-attr-chip":"filter-feat-chip",n=a.color?' style="--chip-color: '+a.color+'"':"",l=a.color?" has-color":"";r+='"}),n.html(r),o.find(".btn-close-values").remove(),o.append(''),o.show();var l=o[0];l&&l.scrollIntoView({behavior:"smooth",block:"nearest"})}}},hideFilterGroupValues:function(){this.$dropdown.find(".filter-row-values").hide(),this.$dropdown.find(".filter-group-toggle").removeClass("active")},updateFilterToggleStates:function(){if(this.$dropdown&&this.filterableData){var e=this;this.filterableData.attributes&&this.filterableData.attributes.forEach(function(t){var i=e.$dropdown.find('.filter-group-toggle[data-group-id="'+t.id+'"][data-type="attribute"]'),a=t.values.some(function(t){return-1!==e.filters.attributes.indexOf(t.id)});i.toggleClass("has-selection",a)}),this.filterableData.features&&this.filterableData.features.forEach(function(t){var i=e.$dropdown.find('.filter-group-toggle[data-group-id="'+t.id+'"][data-type="feature"]'),a=t.values.some(function(t){return-1!==e.filters.features.indexOf(t.id)});i.toggleClass("has-selection",a)})}},loadZonesForCountryFilter:function(){var t=this;if(!this.zonesLoaded&&this.$dropdown){var i=this.$dropdown.find(".filter-zone-select");i.length&&e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getZonesForFilter",trait:"EntitySelector"},success:function(e){if(e.success&&e.zones&&e.zones.length>0){var a=t.config.trans||{};i.empty(),i.append('"),e.zones.forEach(function(e){i.append('")}),t.zonesLoaded=!0}}})}}}}(jQuery),function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.chips={addSelection:function(e,t,i,a){this.addSelectionNoUpdate(e,t,i,a);var s=e.find(".entity-chips");this.updateChipsVisibility(s)},addSelectionNoUpdate:function(e,t,i,a){var s=e.find(".entity-chips"),o=e.closest(".target-block");if("single"===(this.config.mode||"multi")?(this.$wrapper.find(".entity-chips .entity-chip").remove(),this.$dropdown&&this.$dropdown.find(".dropdown-item.selected, .tree-item.selected").removeClass("selected"),this.$wrapper.find(".target-block-tab .tab-badge").remove(),this.$wrapper.find(".target-block-tab").removeClass("has-data")):"single"===(o.data("mode")||"multi")&&(s.find(".entity-chip").remove(),this.$dropdown&&this.$dropdown.find(".dropdown-item.selected, .tree-item.selected").removeClass("selected")),!s.find('.entity-chip[data-id="'+t+'"]').length){var n=o.data("blockType")||"",r="countries"===(e.attr("data-search-entity")||n),l='':a&&a.image&&(l+=''),l+=''+this.escapeHtml(i)+"",r&&(l+=''),l+='',l+="",s.append(l)}},removeSelection:function(e,t){var i=e.find(".entity-chips");e.find('.entity-chip[data-id="'+t+'"]').remove(),this.updateChipsVisibility(i)},updateChipsVisibility:function(t){var i=this.config.trans||{},a=(t.closest(".value-picker"),t.find(".entity-chip")),s=a.length,o=t.closest(".chips-wrapper");if(0!==s){this.ensureChipsWrapper(t);var n=t.closest(".chips-wrapper"),r=n.find(".chips-toolbar"),l=n.find(".chips-load-more"),c=r.find(".chips-search-input").val()||"";c=c.toLowerCase().trim();var d=0,p=0,u=t.hasClass("chips-expanded"),h=u?999999:this.maxVisibleChips||12;a.each(function(){var t=e(this),i=(t.find(".chip-name").text()||"").toLowerCase(),a=!c||-1!==i.indexOf(c);t.removeClass("chip-filtered-out chip-paginated-out"),a?++p>h?t.addClass("chip-paginated-out"):d++:t.addClass("chip-filtered-out")}),r.addClass("has-chips"),this.updateChipsToolbar(r,s,p,c);var f=p-d;if(f>0&&!u){var v=i.load||"Load",m=(i.remaining||"{count} remaining").replace("{count}",f),g=''+v+''+m+"";l.html(g).show()}else if(u&&p>(this.maxVisibleChips||12)){var b=i.collapse||"Collapse";l.html('").show()}else l.hide()}else o.length&&(o.before(t),o.remove())},ensureChipsWrapper:function(t){if(!t.closest(".chips-wrapper").length){var i=this.config.trans||{},a=(t.closest(".value-picker"),'
'),s=e(a);t.before(s),s.find(".chips-toolbar").after(t),s.append(s.find(".chips-load-more")),this.bindChipsToolbarEvents(s)}},bindChipsToolbarEvents:function(t){var i,a=this,s=t.find(".entity-chips");t.on("input",".chips-search-input",function(){clearTimeout(i),i=setTimeout(function(){s.removeClass("chips-expanded"),a.updateChipsVisibility(s)},150)}),t.on("change",".chips-sort-select",function(){var t=e(this).val();a.sortChips(s,t)}),t.on("click",".btn-chips-clear",function(){((t.find(".chips-search-input").val()||"").trim()?s.find(".entity-chip:not(.chip-filtered-out)"):s.find(".entity-chip")).each(function(){e(this).find(".chip-remove").trigger("click")}),t.find(".chips-search-input").val(""),a.updateChipsVisibility(s)}),t.on("change",".load-more-select",function(){var t=e(this).val();"all"===t?(s.addClass("chips-expanded"),a.maxVisibleChips=999999):a.maxVisibleChips=(a.maxVisibleChips||12)+parseInt(t,10),a.updateChipsVisibility(s)}),t.on("click",".btn-collapse-chips",function(){s.removeClass("chips-expanded"),a.maxVisibleChips=12,a.updateChipsVisibility(s)})},sortChips:function(t,i){var a=t.find(".entity-chip");if(!(a.length<2)){var s=a.toArray().sort(function(t,a){var s=e(t),o=e(a);switch(i){case"name_asc":var n=(s.find(".chip-name").text()||"").toLowerCase(),r=(o.find(".chip-name").text()||"").toLowerCase();return n.localeCompare(r);case"name_desc":var l=(s.find(".chip-name").text()||"").toLowerCase();return(o.find(".chip-name").text()||"").toLowerCase().localeCompare(l);default:return 0}});e.each(s,function(e,i){t.append(i)}),this.updateChipsVisibility(t)}},updateChipsToolbar:function(e,t,i,a){var s=this.config.trans||{},o=e.find(".chips-count"),n=e.find(".btn-chips-clear"),r=n.find(".clear-text");a?(o.addClass("has-filter").html(''+i+'/'+t+""),r.text((s.clear||"Clear")+" "+i)):(o.removeClass("has-filter").html(t),r.text(s.clear_all||"Clear all")),a&&0===i?n.hide():t>0?n.show():n.hide()},loadExistingSelections:function(){var t=this,i={};this.$wrapper.find(".selection-group").each(function(){var a=e(this),s=a.closest(".target-block").data("blockType"),o=a.find(".include-picker");t.collectPickerEntities(o,s,i),t.enhanceMethodSelect(a.find(".include-method-select")),a.find(".exclude-row").each(function(){var a=e(this);t.collectPickerEntities(a.find(".exclude-picker"),s,i),t.enhanceMethodSelect(a.find(".exclude-method-select"))}),a.find(".group-excludes.has-excludes").length>0&&t.updateMethodSelectorLock(a,!0)});var a={},s=!1;Object.keys(i).forEach(function(e){var t=i[e];if(0!==t.ids.length){var o=t.ids.filter(function(e,t,i){return i.indexOf(e)===t});a[e]=o,s=!0}}),s&&e.ajax({url:t.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getTargetEntitiesByIdsBulk",trait:"EntitySelector",entities:JSON.stringify(a)},success:function(e){if(e.success&&e.entities)try{Object.keys(i).forEach(function(a){var s=i[a],o=e.entities[a]||[],n={};o.forEach(function(e){n[e.id]=e}),s.pickers.forEach(function(e){var i=e.$picker,s=i.find(".entity-chips"),o=i.find(".include-values-data, .exclude-values-data"),r=[],l="countries"===a;e.ids.forEach(function(e){var i=s.find('.entity-chip-loading[data-id="'+e+'"]');if(n[e]){var a=n[e];r.push(a.id);var o='':a.image&&(o+=''),o+=''+t.escapeHtml(a.name)+"",l&&(o+=''),o+='',o+="",i.replaceWith(o)}else i.remove()}),t.updateChipsVisibility(s),r.length!==e.ids.length&&(o.val(JSON.stringify(r)),t.serializeAllBlocks()),t.updateBlockStatus(i.closest(".target-block"))})}),t.updateAllConditionCounts()}catch(e){}},error:function(e,t,i){}})},collectPickerEntities:function(t,i,a){if(t.length){var s=this,o=t.find(".include-values-data, .exclude-values-data");if(o.length){var n=t.attr("data-value-type"),r=o.val()||"[]",l=[];try{l=JSON.parse(r)}catch(e){return}if("multi_numeric_range"!==n)if("multi_select_tiles"!==n){if("combination_attributes"===n)return"object"!=typeof l||null===l||0===Object.keys(l).length||o.val(JSON.stringify(l)),void s.loadCombinationAttributeGroups(t);if(l.length)if("pattern"!==n){var c=t.attr("data-search-entity")||i,d=t.find(".entity-chips"),p=this.getEntityTypeIcon(c);l.forEach(function(e){var t='';t+='',t+='Loading...',t+="",d.append(t)}),a[c]||(a[c]={ids:[],pickers:[]}),a[c].ids=a[c].ids.concat(l),a[c].pickers.push({$picker:t,ids:l})}else l.forEach(function(e){"string"==typeof e&&e?s.addPatternTag(t,e,!1):e&&e.pattern&&s.addPatternTag(t,e.pattern,!0===e.caseSensitive)})}else{if(!Array.isArray(l)||0===l.length)return;l.forEach(function(e){t.find('.tile-option[data-value="'+e+'"]').addClass("selected")})}else{if(!Array.isArray(l)||0===l.length)return;var u=t.find(".multi-range-chips");l.forEach(function(t){if(t&&(null!==t.min||null!==t.max)){var i;i=null!==t.min&&null!==t.max?t.min+" - "+t.max:null!==t.min?"≥ "+t.min:"≤ "+t.max;var a=e("",{class:"range-chip","data-min":null!==t.min?t.min:"","data-max":null!==t.max?t.max:""});a.append(e("",{class:"range-chip-text",text:i})),a.append(e("",r+=''+this.escapeHtml(t)+"",r+='',r+="",s.append(r)},getPatternTags:function(t){var i=[];return t.find(".pattern-tag:not(.draft-tag)").each(function(){var t=e(this).data("pattern"),a=1===e(this).data("caseSensitive")||"1"===e(this).data("caseSensitive");t&&i.push({pattern:t,caseSensitive:a})}),i},updateDraftTagCount:function(t,i,a){var s=this,o=t.find(".pattern-match-count"),n=o.find(".count-value"),r=t.closest(".target-block").data("blockType")||"products";n.html(''),o.show(),o.data("pattern",i),o.data("caseSensitive",a),o.data("entityType",r),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countPatternMatches",trait:"EntitySelector",pattern:i,field:"name",entity_type:r,case_sensitive:a?1:0},success:function(e){if(e.success){var i=parseInt(e.count,10)||0;n.text(i),o.show(),o.removeClass("count-zero count-found"),o.addClass(0===i?"count-zero":"count-found"),o.data("count",i);var a=t.closest(".selection-group");a.length&&s.updateGroupTotalCount(a)}else n.text("?"),o.show()},error:function(){n.text("?"),o.show()}})},updateConditionCountWithPendingPattern:function(t,i){this.config.trans;var a=t.find(".method-selector-wrapper > .condition-match-count, > .exclude-header-row > .condition-match-count").first();if(a.length){var s=t.hasClass("exclude-row"),o=(s?t.find(".exclude-method-select"):t.find(".include-method-select")).val();if(o){var n=s?t.find(".exclude-picker"):t.find(".include-picker");if("pattern"===(n.data("valueType")||"none")){var r=this.getPatternTags(n);if(i&&r.push({pattern:i,caseSensitive:!1}),0!==r.length){var l=t.closest(".target-block").data("blockType")||"products";a.find(".preview-count").html(''),a.removeClass("clickable no-matches").show(),a.data("conditionData",{method:o,values:r,blockType:l,isExclude:s}),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countConditionMatches",trait:"EntitySelector",method:o,values:JSON.stringify(r),block_type:l},success:function(e){if(e&&e.success){var t=e.count||0;a.removeClass("no-matches clickable"),0===t?(a.find(".preview-count").text(t),a.addClass("no-matches").show()):(a.find(".preview-count").text(t),a.addClass("clickable").show())}else a.hide().removeClass("clickable")},error:function(){a.hide().removeClass("clickable")}})}else a.hide()}}else a.hide()}},fetchPatternMatchCount:function(t,i,a){var s=t.closest(".exclude-row"),o=-1!==((s.length?s.find(".exclude-method-select"):t.closest(".selection-group").find(".include-method-select")).val()||"").indexOf("reference")?"reference":"name",n=t.closest(".target-block").data("blockType")||"products";a.find(".preview-count").html(''),a.removeClass("clickable no-matches").show(),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countPatternMatches",trait:"EntitySelector",pattern:i,field:o,entity_type:n,case_sensitive:0},success:function(e){if(e&&e.success){var t=e.count||0;a.find(".preview-count").text(t),a.removeClass("no-matches clickable").show(),0===t?a.addClass("no-matches"):a.addClass("clickable")}else a.hide()},error:function(){a.hide()}})},getPickerValues:function(t,i){switch(i){case"entity_search":var a=[];return t.find(".entity-chip").each(function(){var t=e(this).data("id");t&&a.push(t)}),a;case"pattern":var s=this.getPatternTags(t),o=t.find(".draft-tag .pattern-input"),n=e.trim(o.val());if(n){var r="1"===o.closest(".draft-tag").attr("data-case-sensitive");s.push({pattern:n,caseSensitive:r})}return s;case"numeric_range":return{min:t.find(".range-min-input").val()||null,max:t.find(".range-max-input").val()||null};case"date_range":return{from:t.find(".date-from-input").val()||null,to:t.find(".date-to-input").val()||null};case"select":return[t.find(".select-value-input").val()];case"boolean":return[!0];default:return[]}},updateConditionCount:function(t){this.config.trans;var i=t.find(".method-selector-wrapper > .condition-match-count, > .exclude-header-row > .condition-match-count").first();if(i.length){var a=t.hasClass("exclude-row"),s=(a?t.find(".exclude-method-select"):t.find(".include-method-select")).val();if(s){var o=a?t.find(".exclude-picker"):t.find(".include-picker"),n=o.data("valueType")||"none",r=this.getPickerValues(o,n),l=!r||Array.isArray(r)&&0===r.length||"object"==typeof r&&!Array.isArray(r)&&("combination_attributes"===n&&void 0!==r.attributes&&0===Object.keys(r.attributes).length||"combination_attributes"!==n&&0===Object.keys(r).length);if("none"!==n&&"boolean"!==n&&l)i.hide();else{var c=t.closest(".target-block").data("blockType")||"products";i.find(".preview-count").html(''),i.removeClass("clickable no-matches").show(),i.data("conditionData",{method:s,values:r,blockType:c,isExclude:a}),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countConditionMatches",trait:"EntitySelector",method:s,values:JSON.stringify(r),block_type:c},success:function(e){if(e&&e.success){var t=e.count||0;i.removeClass("no-matches clickable"),0===t?(i.find(".preview-count").text(t),i.addClass("no-matches").show()):(i.find(".preview-count").text(t),i.addClass("clickable").show())}else i.hide().removeClass("clickable")},error:function(){i.hide().removeClass("clickable")}})}}else i.hide()}},updateGroupCounts:function(t){var i=this,a=t.find(".group-include");a.length&&this.updateConditionCount(a),t.find(".exclude-row").each(function(){i.updateConditionCount(e(this))}),this.updateGroupTotalCount(t)},updateGroupTotalCount:function(t){var i=t.closest(".target-block").data("blockType")||"products",a=t.find(".group-header .group-count-badge"),s=t.find(".group-modifier-limit"),o=this.serializeGroup(t,i);if(!o.include||!o.include.method)return a.hide(),void s.attr("placeholder","–");a.html('').show(),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countGroupItems",trait:"EntitySelector",group_data:JSON.stringify(o),block_type:i},success:function(e){if(e&&e.success){var n=e.final_count||0,r=e.exclude_count||0,l=' '+n;r>0&&(l+=' (-'+r+")"),a.html(l),a.addClass("clickable").show(),a.data("groupData",o),a.data("blockType",i),a.data("finalCount",n),s.attr("placeholder",n);var c=t.find(".group-preview-badge .preview-count");if(c.length){var d=parseInt(s.val(),10),p=d>0&&dn&&(n=t)});var r=n+1,l=this.buildMethodOptions(o,!1),c=(this.buildMethodOptions(o,!0),'
');c+='
',c+='',c+='',c+='',c+='',c+="",c+='",c+="
",c+='
',c+='
',c+='
',c+='
',c+='",c+=' 0',c+='',c+="
",c+='",c+="
",c+="
",c+='
',c+='",c+="
",c+='
',c+='',c+=''+(s.limit||"Limit")+"",c+='',c+="",c+='',c+=''+(s.sort||"Sort")+"",c+='",c+='",c+="",c+='',c+=' ',c+="",c+="
",c+="
",c+="
",a.append(c);var d=a.find('.selection-group[data-group-index="'+r+'"]');this.enhanceMethodSelect(d.find(".include-method-select")),d.find(".include-method-select").val("all").trigger("change"),this.updateBlockStatus(t),this.serializeAllBlocks()},removeGroup:function(e,t){e.remove();var i=t.find(".groups-container");if(0===i.find(".selection-group").length){var a='
';a+=''+this.getEmptyStateText(t)+"",a+="
",i.html(a)}this.updateBlockStatus(t),this.serializeAllBlocks(),this.updateTabBadges()},clearAllConditions:function(){var t=this;this.$wrapper.find(".target-block").each(function(){var i=e(this),a=i.find(".groups-container");a.find(".selection-group").remove();var s='
';s+=''+t.getEmptyStateText(i)+"",s+="
",a.html(s),t.updateBlockStatus(i)}),this.serializeAllBlocks(),this.updateTabBadges(),this.updateHeaderTotalCount()},switchToBlock:function(e){this.$wrapper.find(".target-block-tab").removeClass("active"),this.$wrapper.find('.target-block-tab[data-block-type="'+e+'"]').addClass("active"),this.$wrapper.find(".target-block").removeClass("active").hide(),this.$wrapper.find('.target-block[data-block-type="'+e+'"]').addClass("active").show(),this.hideDropdown()},updateTabBadges:function(){var t=this,i=[];this.$wrapper.find(".target-block-tab").each(function(){var a=e(this),s=a.data("blockType"),o=t.$wrapper.find('.target-block[data-block-type="'+s+'"]').find(".selection-group").length,n=a.find(".tab-badge");o>0?(n.length?n.addClass("loading").html(''):a.append(''),a.addClass("has-data"),i.push(s)):(n.remove(),a.removeClass("has-data"))}),this.updateTargetSwitchState(),i.length>0&&this.fetchAllCounts(i)},updateTargetSwitchState:function(){var t=this.$wrapper.find(".prestashop-switch");if(t.length){var i=!1;this.$wrapper.find(".target-block").each(function(){if(e(this).find(".selection-group").length>0)return i=!0,!1}),i?t.find('input[value="0"]').prop("checked",!0):t.find('input[value="1"]').prop("checked",!0)}},fetchAllCounts:function(t){var i=this,a=this.$wrapper.find('input[name="'+this.config.name+'"]'),s={};try{s=JSON.parse(a.val()||"{}")}catch(e){s={}}var o={};t.forEach(function(e){var t=s[e]&&s[e].groups?s[e].groups:[];t.length>0&&(o[e]={groups:t})}),0!==Object.keys(o).length?e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewEntitySelectorBulk",trait:"EntitySelector",conditions:JSON.stringify(o)},success:function(e){e.success&&e.counts?(Object.keys(e.counts).forEach(function(t){var a=e.counts[t],s=i.$wrapper.find('.target-block-tab[data-block-type="'+t+'"]'),o=s.find(".tab-badge");o.length&&(o.removeClass("loading").html(' '+a),s.data("previewData",{count:a,success:!0}))}),t.forEach(function(t){if(!(t in e.counts)){var a=i.$wrapper.find('.target-block-tab[data-block-type="'+t+'"]');a.find(".tab-badge").remove(),a.removeClass("has-data")}}),i.updateHeaderTotalCount()):t.forEach(function(e){i.$wrapper.find('.target-block-tab[data-block-type="'+e+'"]').find(".tab-badge").remove()})},error:function(e,a,s){t.forEach(function(e){i.$wrapper.find('.target-block-tab[data-block-type="'+e+'"]').find(".tab-badge").remove()})}}):t.forEach(function(e){var t=i.$wrapper.find('.target-block-tab[data-block-type="'+e+'"]');t.find(".tab-badge").remove(),t.removeClass("has-data")})},fetchProductCount:function(t,i){var a=this,s={},o=this.$wrapper.find('input[name="'+this.config.name+'"]'),n={};try{n=JSON.parse(o.val()||"{}")}catch(e){n={}}var r=n[t]&&n[t].groups?n[t].groups:[];if(0===r.length)return i.find(".tab-badge").remove(),i.removeClass("has-data"),void i.removeData("previewData");var l=i.find(".tab-badge");l.length?l.addClass("loading").html(''):(l=e(''),i.append(l)),i.addClass("has-data"),s[t]={groups:r},e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewEntitySelector",trait:"EntitySelector",conditions:JSON.stringify(s),block_type:t,limit:10},success:function(e){e.success?(i.find(".tab-badge").removeClass("loading").html(' '+e.count),i.data("previewData",e),a.updateHeaderTotalCount()):i.find(".tab-badge").remove()},error:function(e,t,s){i.find(".tab-badge").remove(),a.updateHeaderTotalCount()}})},updateHeaderTotalCount:function(){var t=0;this.$wrapper.find(".target-block-tab .tab-badge").each(function(){var i=e(this);if(!i.hasClass("loading")){var a=parseInt(i.text(),10);isNaN(a)||(t+=a)}});var i=this.$wrapper.find(".trait-total-count");t>0?(i.find(".count-value").text(t),i.show()):i.hide(),this.updateShowAllToggle()},updateShowAllToggle:function(){var e=this.$wrapper.find(".trait-show-all-toggle");if(e.length){var t=e.find(".show-all-checkbox"),i=this.$wrapper.find(".target-block-tab.has-data").length>0;t.prop("checked",!i)}},updateBlockStatus:function(e){var t=e.find(".block-status"),i=e.data("blockType"),a=this.config.blocks[i]||{},s=this.config.trans||{},o=this.getBlockGroups(e);0===o.length?!1!==this.config.emptyMeansAll?t.text((s.all||"All")+" "+(a.entity_label_plural||"items")):t.text(s.nothing_selected||"Nothing selected"):t.text(o.length+" "+(1===o.length?s.group||"group":s.groups||"groups"))},getEmptyStateText:function(e){var t=e.data("blockType"),i=e.data("mode")||"multi",a=this.config.blocks[t]||{},s=this.config.trans||{},o=!1!==this.config.emptyMeansAll;return"single"===i?s.no_item_selected||"No item selected":o?(s.all||"All")+" "+(a.entity_label_plural||"items")+" "+(s.included||"included"):s.nothing_selected||"Nothing selected"},serializeGroup:function(t,i){var a=this,s=t.find(".include-method-select").val()||"all",o=t.find(".include-picker"),n=this.getPickerValues(o),r=[];t.find(".group-excludes.has-excludes").length&&t.find(".exclude-row").each(function(){var t=e(this),i=t.find(".exclude-method-select").val()||null,s=t.find(".exclude-picker"),o=a.getPickerValues(s);i&&o&&(!Array.isArray(o)||o.length>0)&&r.push({method:i,values:o})});var l={include:{method:s,values:n}};r.length>0&&(l.excludes=r);var c=this.getGroupModifiers(t);return(c.limit||c.sort_by)&&(l.modifiers=c),l},serializeAllBlocks:function(t){var i=this,a={};this.$wrapper.find(".target-block").each(function(){var t=e(this),s=t.data("blockType"),o=i.getBlockGroups(t);o.length>0&&(a[s]={groups:o}),i.updateBlockStatus(t)});var s=this.$wrapper.find('input[name="'+this.config.name+'"]'),o=JSON.stringify(a);s.val(o),this.updateTabBadges(),this.countUpdateTimeout&&clearTimeout(this.countUpdateTimeout),this.countUpdateTimeout=setTimeout(function(){if(t&&t.length){i.updateConditionCount(t);var e=t.closest(".selection-group");e.length&&i.updateGroupTotalCount(e)}else i.updateAllConditionCounts()},500)},getBlockGroups:function(t){var i=this,a=[];return t.find(".selection-group").each(function(){var t=e(this),s=t.find(".include-method-select").val()||"all",o=t.find(".include-picker"),n=i.getPickerValues(o);if(!i.isConditionValid(s,n,o))return!0;var r=[];t.find(".group-excludes.has-excludes").length&&t.find(".exclude-row").each(function(){var t=e(this),a=t.find(".exclude-method-select").val()||null,s=t.find(".exclude-picker"),o=i.getPickerValues(s);a&&i.isConditionValid(a,o,s)&&r.push({method:a,values:o})});var l={include:{method:s,values:n}},c=e.trim(t.attr("data-group-name")||"");c&&(l.name=c),r.length>0&&(l.excludes=r);var d=i.getGroupModifiers(t);(d.limit||d.sort_by)&&(l.modifiers=d),a.push(l)}),a},getGroupModifiers:function(e){var t=e.find(".group-modifier-limit").val(),i=e.find(".group-modifier-sort").val()||"sales",a=e.find(".group-modifiers .btn-sort-dir").data("dir")||"DESC";return{limit:t?parseInt(t,10):null,sort_by:i||null,sort_dir:a||"DESC"}},getPickerValues:function(t){var i=t.attr("data-value-type")||"entity_search",a=[];switch(i){case"entity_search":t.find(".entity-chip").each(function(){var t=e(this).data("id");a.push(isNaN(t)?t:Number(t))});break;case"pattern":a=this.getPatternTags(t);var s=t.find(".draft-tag .pattern-input"),o=e.trim(s.val());if(o){var n="1"===s.closest(".draft-tag").attr("data-case-sensitive");a.push({pattern:o,caseSensitive:n})}break;case"numeric_range":var r=t.find(".range-min-input").val(),l=t.find(".range-max-input").val();""===r&&""===l||(a={min:""!==r?parseFloat(r):null,max:""!==l?parseFloat(l):null});break;case"date_range":var c=t.find(".date-from-input").val(),d=t.find(".date-to-input").val();(c||d)&&(a={from:c||null,to:d||null});break;case"select":var p=t.find(".select-value-input").val();p&&(a=[p]);break;case"boolean":a=[!0];break;case"multi_numeric_range":var u=[];t.find(".range-chip").each(function(){var t=e(this),i=t.data("min"),a=t.data("max");u.push({min:""!==i&&void 0!==i?parseFloat(i):null,max:""!==a&&void 0!==a?parseFloat(a):null})}),u.length>0&&(a=u);break;case"multi_select_tiles":t.find(".tile-option.selected").each(function(){a.push(e(this).data("value"))});break;case"combination_attributes":var h={};if(t.find(".comb-attr-value.selected").each(function(){var t=e(this).data("groupId").toString(),i=e(this).data("valueId");h[t]||(h[t]=[]),h[t].push(i)}),Object.keys(h).length>0){var f,v=t.find(".combination-attributes-picker").data("combinationMode")||this.config.combinationMode||"products";f="toggle"===v?t.find(".comb-mode-radio:checked").val()||"products":v,a={mode:f,attributes:h}}}return a},isConditionValid:function(e,t,i){if("all"===e)return!0;var a=i.attr("data-value-type")||"entity_search";return"boolean"===a||(Array.isArray(t)?t.length>0:"object"==typeof t&&null!==t&&("combination_attributes"===a&&void 0!==t.attributes?Object.keys(t.attributes).length>0:Object.keys(t).some(function(e){return null!==t[e]&&""!==t[e]})))},updateAllConditionCounts:function(){var t=this,i={},a={},s=0;this.$wrapper.find(".target-block.active .selection-group").each(function(){var o=e(this),n=o.closest(".target-block").data("blockType")||"products",r=o.find(".group-include");if(r.length){var l=t.getConditionData(r,n);if(l){var c="c"+s++;i[c]=l.condition,a[c]=l.$countEl}}o.find(".exclude-row").each(function(){var o=t.getConditionData(e(this),n);if(o){var r="c"+s++;i[r]=o.condition,a[r]=o.$countEl}})}),0!==Object.keys(i).length&&e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countConditionMatchesBulk",trait:"EntitySelector",conditions:JSON.stringify(i)},success:function(e){e&&e.success&&e.counts&&Object.keys(e.counts).forEach(function(t){var i=e.counts[t]||0,s=a[t];s&&s.length&&(s.removeClass("no-matches clickable"),0===i?(s.find(".preview-count").text(i),s.addClass("no-matches").show()):(s.find(".preview-count").text(i),s.addClass("clickable").show()))})},error:function(){Object.keys(a).forEach(function(e){var t=a[e];t&&t.length&&t.hide().removeClass("clickable")})}})},getConditionData:function(e,t){var i=e.find(".method-selector-wrapper > .condition-match-count, > .exclude-header-row .condition-match-count").first();if(!i.length)return null;var a=e.hasClass("exclude-row"),s=(a?e.find(".exclude-method-select"):e.find(".include-method-select")).val();if(!s)return i.hide(),null;var o=a?e.find(".exclude-picker"):e.find(".include-picker"),n=o.data("valueType")||o.attr("data-value-type")||"none";if("none"===n&&"countries"===t&&"all"===s){var r=this;return setTimeout(function(){r.updateConditionCount(e,t)},0),null}var l=o.attr("data-search-entity")||"";if("countries"===t&&"entity_search"===n&&"countries"===l)return r=this,setTimeout(function(){r.updateConditionCount(e,t)},0),null;if("none"===n)return i.hide(),null;var c=this.getPickerValues(o,n),d=!c||Array.isArray(c)&&0===c.length||"object"==typeof c&&!Array.isArray(c)&&("combination_attributes"===n&&void 0!==c.attributes&&0===Object.keys(c.attributes).length||"combination_attributes"!==n&&0===Object.keys(c).length);return"boolean"!==n&&d?(i.hide(),null):(i.find(".preview-count").html(''),i.removeClass("clickable no-matches").show(),i.data("conditionData",{method:s,values:c,blockType:t,isExclude:a}),{condition:{method:s,values:c,block_type:t},$countEl:i})},updateGroupCounts:function(t){var i=this,a=t.closest(".target-block").data("blockType")||"products",s=t.find(".group-include");s.length&&this.updateConditionCount(s,a),t.find(".exclude-row").each(function(){i.updateConditionCount(e(this),a)}),this.updateGroupTotalCount(t)},updateConditionCount:function(t,i){var a=this,s=t.find(".method-selector-wrapper > .condition-match-count, > .exclude-header-row .condition-match-count").first();if(s.length){var o=t.hasClass("exclude-row"),n=(o?t.find(".exclude-method-select"):t.find(".include-method-select")).val();if(n){var r=o?t.find(".exclude-picker"):t.find(".include-picker"),l=r.data("valueType")||"none",c=r.attr("data-search-entity")||"";if(!i){var d=t.closest(".target-block");i=d.data("blockType")||"products"}if("none"===l&&"countries"===i&&"all"===n)return s.find(".preview-count").html(''),s.removeClass("clickable no-matches country-holidays").show(),void e.ajax({url:a.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"searchTargetEntities",trait:"EntitySelector",entity_type:"countries",query:"",limit:500},success:function(t){var r=t.results||t.items||[];if(t&&t.success&&r.length>0){var l=r.map(function(e){return e.id});s.data("conditionData",{method:n,values:l,blockType:i,isExclude:o,isCountryHolidays:!0,countryIds:l,isAllCountries:!0}),e.ajax({url:a.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getHolidaysForCountries",trait:"EntitySelector",country_ids:l.join(","),count_only:1},success:function(e){if(e&&e.success){var t=e.total_count||0;s.removeClass("no-matches clickable"),s.addClass("country-holidays"),0===t?(s.find(".preview-count").text(t),s.addClass("no-matches").show()):(s.find(".preview-count").text(t),s.addClass("clickable").show()),s.data("countriesInfo",e.countries||[])}else s.hide().removeClass("clickable")},error:function(){s.hide().removeClass("clickable")}})}else s.hide().removeClass("clickable")},error:function(){s.hide().removeClass("clickable")}});if("none"!==l){var p=this.getPickerValues(r,l),u=!p||Array.isArray(p)&&0===p.length||"object"==typeof p&&!Array.isArray(p)&&("combination_attributes"===l&&void 0!==p.attributes&&0===Object.keys(p.attributes).length||"combination_attributes"!==l&&0===Object.keys(p).length);if("boolean"!==l&&u)s.hide();else{i||(d=t.closest(".target-block"),i=d.data("blockType")||"products");var h="countries"===c&&"entity_search"===l;if(s.find(".preview-count").html(''),s.removeClass("clickable no-matches country-holidays").show(),h&&Array.isArray(p)&&p.length>0)return s.data("conditionData",{method:n,values:p,blockType:i,isExclude:o,isCountryHolidays:!0,countryIds:p}),void e.ajax({url:a.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getHolidaysForCountries",trait:"EntitySelector",country_ids:p.join(","),count_only:1},success:function(e){if(e&&e.success){var t=e.total_count||0;s.removeClass("no-matches clickable"),s.addClass("country-holidays"),0===t?(s.find(".preview-count").text(t),s.addClass("no-matches").show()):(s.find(".preview-count").text(t),s.addClass("clickable").show()),s.data("countriesInfo",e.countries||[])}else s.hide().removeClass("clickable")},error:function(){s.hide().removeClass("clickable")}});s.data("conditionData",{method:n,values:p,blockType:i,isExclude:o}),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countConditionMatches",trait:"EntitySelector",method:n,values:JSON.stringify(p),block_type:i},success:function(e){if(e&&e.success){var t=e.count||0;s.removeClass("no-matches clickable"),0===t?(s.find(".preview-count").text(t),s.addClass("no-matches").show()):(s.find(".preview-count").text(t),s.addClass("clickable").show())}else s.hide().removeClass("clickable")},error:function(){s.hide().removeClass("clickable")}})}}else s.hide()}else s.hide()}},updateGroupTotalCount:function(t){var i=t.closest(".target-block").data("blockType")||"products",a=t.find(".group-header .group-count-badge"),s=t.find(".group-modifier-limit"),o=this.serializeGroup(t,i);if(!o.include||!o.include.method)return a.hide(),void s.attr("placeholder","–");a.html('').show(),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countGroupItems",trait:"EntitySelector",group_data:JSON.stringify(o),block_type:i},success:function(e){if(e&&e.success){var n=e.final_count||0,r=e.exclude_count||0,l=' '+n;r>0&&(l+=' (-'+r+")"),a.html(l),a.addClass("clickable").show(),a.data("groupData",o),a.data("blockType",i),a.data("finalCount",n),s.attr("placeholder",n);var c=t.find(".group-preview-badge .preview-count");if(c.length){var d=parseInt(s.val(),10),p=d>0&&d';s+=' '+(a.except||"EXCEPT")+"",s+="",s+='
',s+=this.buildExcludeRowHtml(t,0),s+="
",s+='",i.addClass("has-excludes").html(s);var o=i.find('.exclude-row[data-exclude-index="0"]'),n=o.find(".exclude-method-select");this.enhanceMethodSelect(n);var r=t.data("blockType"),l=n.val();this.updateMethodInfoPlaceholder(o.find(".method-selector-wrapper"),l,r),this.updateMethodSelectorLock(e,!0),this.serializeAllBlocks()},addExcludeRow:function(t,i){var a=t.find(".exclude-rows-container"),s=-1;a.find(".exclude-row").each(function(){var t=parseInt(e(this).data("excludeIndex"),10);t>s&&(s=t)});var o=s+1,n=this.buildExcludeRowHtml(i,o);a.append(n);var r=a.find('.exclude-row[data-exclude-index="'+o+'"]'),l=r.find(".exclude-method-select");this.enhanceMethodSelect(l);var c=i.data("blockType"),d=l.val();this.updateMethodInfoPlaceholder(r.find(".method-selector-wrapper"),d,c),this.serializeAllBlocks()},buildExcludeRowHtml:function(t,i){var a=t.data("blockType"),s=(this.config.blocks[a]||{}).selection_methods||{},o=this.config.trans||{},n=this.buildMethodOptions(s,!0),r=a,l="entity_search";e.each(s,function(e,t){return"all"===e||(r=t.search_entity||a,l=t.value_type||"entity_search",!1)});var c='
';return c+='
',c+='
',c+='",c+=' 0',c+='',c+="
",c+='",c+="
",(c+=this.buildValuePickerHtml("exclude",l,r,s))+"
"},removeExcludeRow:function(e,t,i){var a=t.find(".exclude-rows-container"),s=this.config.trans||{};e.remove(),0===a.find(".exclude-row").length&&(t.find(".group-excludes").removeClass("has-excludes").html('"),this.updateMethodSelectorLock(t,!1)),this.serializeAllBlocks()},buildMethodOptions:function(t,i){var a=this,s=this.config.trans||{},o="",n={select_by:s.select_by||"Select by...",filter_by:s.filter_by||"Filter by..."},r={},l={};return e.each(t,function(e,t){if(i&&"all"===e)return!0;var a=t.group||"";a?(r[a]||(r[a]={}),r[a][e]=t):l[e]=t}),e.each(l,function(e,t){o+=a.buildMethodOption(e,t)}),e.each(r,function(t,i){var s=n[t]||t.replace(/_/g," ");o+='',e.each(i,function(e,t){o+=a.buildMethodOption(e,t)}),o+=""}),o},buildMethodOption:function(e,t){var i='"},buildValuePickerHtml:function(e,t,i,a){var s=this.config.trans||{},o=e+"-picker",n=e+"-chips",r=e+"-values-data",l="";if("none"===t)return l='";switch(l='
',t){case"entity_search":var c=s.no_items_selected||"No items selected - use search below";l+='
',l+='",l+='';break;case"pattern":var d=""+this.escapeHtml(s.pattern_help_title||"Pattern Syntax")+"";d+='
',d+='
* '+this.escapeHtml(s.pattern_help_wildcard||"any text (wildcard)")+"
",d+='
{number} '+this.escapeHtml(s.pattern_help_number||"any number (e.g. 100, 250)")+"
",d+='
{letter} '+this.escapeHtml(s.pattern_help_letter||"single letter (A-Z)")+"
",d+="
",d+='
',d+=""+this.escapeHtml(s.pattern_help_examples||"Examples:")+"",d+='
*cotton* '+this.escapeHtml(s.pattern_example_1||'contains "cotton"')+"
",d+='
iPhone {number} Pro* '+this.escapeHtml(s.pattern_example_2||'matches "iPhone 15 Pro Max"')+"
",d+='
Size {letter} '+this.escapeHtml(s.pattern_example_3||'matches "Size M", "Size L"')+"
",d+="
";var p=s.no_patterns||"No patterns - press Enter to add";l+='
',l+='
',l+='
',l+='',l+='',l+=' ',l+='',l+="
",l+='',l+='',l+="",l+="
",l+='';break;case"numeric_range":l+='
',l+='',l+='-',l+='',l+="
",l+='';break;case"multi_numeric_range":l+='
',l+='
',l+='
',l+='',l+='-',l+='',l+='',l+="
",l+="
",l+='';break;case"multi_select_tiles":l+='
',l+="
",l+='';break;case"date_range":l+='
',l+='',l+='-',l+='',l+="
",l+='';break;case"select":l+='
',l+='',l+="
",l+='';break;case"boolean":l+='
',l+=''+this.escapeHtml(s.yes||"Yes")+"",l+="
",l+='';break;case"combination_attributes":this.escapeHtml(s.combination_help_title||"Combination Targeting"),this.escapeHtml(s.combination_help_desc||"Select attributes to target specific product combinations."),this.escapeHtml(s.combination_help_logic||"Logic:"),this.escapeHtml(s.combination_help_within||"Within group: OR (Red OR Blue)"),this.escapeHtml(s.combination_help_between||"Between groups: AND (Color AND Size)");var u=this.config.combinationMode||"products",h="toggle"===u,f=h?"products":u;l+='
',h&&(l+='
',l+='",l+='",l+="
"),l+='
',l+=' '+this.escapeHtml(s.loading||"Loading...")+"",l+="
",l+="
",l+='';break;default:l+=''}return l+"
"},getSortOptionsArray:function(e){var t=this.config.trans||{};switch(e){case"products":return[{value:"sales",label:t.sort_bestsellers||"Best sellers"},{value:"date_add",label:t.sort_newest||"Newest"},{value:"price",label:t.sort_price||"Price"},{value:"name",label:t.sort_name||"Name"},{value:"position",label:t.sort_position||"Position"},{value:"quantity",label:t.sort_stock||"Stock quantity"},{value:"random",label:t.sort_random||"Random"}];case"categories":return[{value:"name",label:t.sort_name||"Name"},{value:"position",label:t.sort_position||"Position"},{value:"product_count",label:t.sort_products||"Products count"},{value:"date_add",label:t.sort_newest||"Newest"}];default:return[{value:"name",label:t.sort_name||"Name"},{value:"date_add",label:t.sort_newest||"Newest"}]}},getSortIconClass:function(e,t){var i="ASC"===t;switch(e){case"name":return i?"icon-sort-alpha-asc":"icon-sort-alpha-desc";case"price":case"quantity":case"product_count":case"date_add":case"newest_products":case"position":return i?"icon-sort-numeric-asc":"icon-sort-numeric-desc";case"sales":case"total_sales":default:return i?"icon-sort-amount-asc":"icon-sort-amount-desc";case"random":return"icon-random"}},cycleSortOption:function(e,t){for(var i,a,s,o=this.getSortOptionsArray(t),n=e.data("sort")||"sales",r=e.data("dir")||"DESC",l=-1,c=0;c0)return t=!0,!1}),t?(this.clearValidationError(),!0):(this.showValidationError(),!1)},showValidationError:function(){this.$wrapper.addClass("has-validation-error");var t=this.$wrapper.data("required-message")||"Please select at least one item";this.$wrapper.find(".trait-validation-error").remove();var i=e("
",{class:"trait-validation-error",html:' '+t});this.$wrapper.find(".condition-trait-header").after(i),e("html, body").animate({scrollTop:this.$wrapper.offset().top-100},300),this.$wrapper.find(".condition-trait-body").is(":visible")||(this.$wrapper.find(".condition-trait-body").slideDown(200),this.$wrapper.removeClass("collapsed"))},clearValidationError:function(){this.$wrapper.removeClass("has-validation-error"),this.$wrapper.find(".trait-validation-error").remove()}}}(jQuery),function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.methods={initMethodDropdowns:function(){var t=this;this.$wrapper.find(".include-method-select").each(function(){t.enhanceMethodSelect(e(this))}),this.$wrapper.find(".exclude-method-select").each(function(){t.enhanceMethodSelect(e(this))}),this.initMethodInfoPlaceholders()},initMethodInfoPlaceholders:function(){var t=this;this.$wrapper.find(".selection-group").each(function(){var i=e(this),a=i.closest(".target-block").data("blockType")||"products",s=i.find(".include-method-select").val()||"all";t.updateMethodInfoPlaceholder(i.find(".method-selector-wrapper"),s,a),i.find(".exclude-row").each(function(){var i=e(this),s=i.find(".exclude-method-select").val();s&&t.updateMethodInfoPlaceholder(i.find(".method-selector-wrapper"),s,a)})})},enhanceMethodSelect:function(t){var i=this;if(t.length&&!t.data("methodDropdownInit")){t.data("methodDropdownInit",!0),t.addClass("method-select-hidden");var a=t.find("option:selected"),s=a.data("icon")||"icon-caret-down",o=a.text(),n='
';n+='',n+=''+this.escapeHtml(o)+"",n+='';var r=e(n+="
");t.after(r),r.on("click",function(e){e.preventDefault(),e.stopPropagation(),t.closest(".method-selector-wrapper").hasClass("selector-locked")||i.showMethodDropdownMenu(t,r)}),t.on("change.methodDropdown",function(){i.updateMethodTrigger(t,r)})}},updateMethodTrigger:function(e,t){var i=e.find("option:selected"),a=i.data("icon")||"icon-caret-down",s=i.text();t.find(".method-trigger-icon").attr("class",a+" method-trigger-icon"),t.find(".method-trigger-label").text(s)},showMethodDropdownMenu:function(t,i){var a=this;this.closeMethodDropdownMenu();var s=this.buildMethodDropdownMenuHtml(t),o=e(s),n=i.offset(),r=i.outerWidth(),l=i.outerHeight();o.css({position:"absolute",top:n.top+l+2,left:n.left,minWidth:r,zIndex:10001}),e("body").append(o),this.$methodDropdownMenu=o,this.$methodDropdownSelect=t,this.$methodDropdownTrigger=i,o.on("click",".method-dropdown-item",function(i){i.preventDefault(),i.stopPropagation();var s=e(this).data("value");t.val(s).trigger("change"),a.closeMethodDropdownMenu()}),e(document).on("click.methodDropdown",function(t){e(t.target).closest(".method-dropdown-menu, .method-dropdown-trigger").length||a.closeMethodDropdownMenu()}),e(document).on("keydown.methodDropdown",function(e){27===e.keyCode&&a.closeMethodDropdownMenu()})},buildMethodDropdownMenuHtml:function(t){var i=this,a='
';return t.children("option").each(function(){var t=e(this),s=t.data("icon")||"icon-asterisk",o=t.text(),n=t.val(),r=t.is(":selected");a+='
',a+='',a+=''+i.escapeHtml(o)+"",r&&(a+=''),a+="
"}),t.children("optgroup").each(function(){var t=e(this),s=t.attr("label")||"";a+='
',a+='
'+i.escapeHtml(s)+"
",a+='
',t.children("option").each(function(){var t=e(this),s=t.data("icon")||"icon-cog",o=t.text(),n=t.val(),r=t.is(":selected");a+='
',a+='',a+=''+i.escapeHtml(o)+"",r&&(a+=''),a+="
"}),a+="
",a+="
"}),a+="
"},closeMethodDropdownMenu:function(){this.$methodDropdownMenu&&(this.$methodDropdownMenu.remove(),this.$methodDropdownMenu=null),this.$methodDropdownSelect=null,this.$methodDropdownTrigger=null,e(document).off("click.methodDropdown keydown.methodDropdown")},populateTiles:function(t,i,a){var s=t.find(".multi-select-tiles");s.empty(),a?s.attr("data-exclusive","true"):s.removeAttr("data-exclusive"),e.each(i,function(t,i){var a="object"==typeof i?i.label:i,o="object"==typeof i&&i.icon?i.icon:null,n="object"==typeof i&&i.color?i.color:null,r="tile-option";n&&(r+=" tile-color-"+n);var l=e("',c+="
",c+='
',c+='',c+="
",o.length>0){if(c+='
',c+=this.renderPreviewItems(o),c+="
",r){var d=n-o.length;c+='"}}else c+='
'+(a.no_preview||"No items to preview")+"
";var p=e(c+="");e("body").append(p),this.$previewPopover=p,this.$previewList=p.find(".preview-list"),this.previewLoadedCount=o.length,this.previewTotalCount=n,this.previewContext=t.context||{},this.previewOnLoadMore=t.onLoadMore||null,this.previewOnFilter=t.onFilter||null,this.previewCurrentFilter="",this.previewEntityLabel=l,p.find(".preview-close").on("click",function(){i.hidePreviewPopover()});var u=p.find(".preview-filter-input");if(t.onFilter){var h=this.debounce(function(e){i.previewCurrentFilter=e,i.showFilterLoading(!0),t.onFilter.call(i,e)},300);u.on("input",function(){var t=e(this).val().trim();t!==i.previewCurrentFilter&&h(t)})}else u.on("input",function(){var t=e(this).val().toLowerCase().trim();i.filterPreviewItems(t)});t.onLoadMore&&p.find(".btn-load-more").on("click",function(){var a=e(this),s=a.closest(".load-more-controls").find(".load-more-select");if(!a.hasClass("loading")){a.addClass("loading"),a.find("i").removeClass("icon-plus").addClass("icon-spinner icon-spin"),s.prop("disabled",!0);var o=parseInt(s.val(),10)||20;i.previewLoadCount=o,t.onLoadMore.call(i,a)}});var f=s.offset(),v=s.outerHeight(),m=s.outerWidth(),g=p.outerWidth(),b=f.left+m/2-g/2,w=e(window).width()-g-10;return b=Math.max(10,Math.min(b,w)),p.css({position:"absolute",top:f.top+v+8,left:b,zIndex:1e4}),p.addClass("show"),p},updatePreviewPopover:function(e,t){var i=this.config.trans||{};this.$previewList.html(this.renderPreviewItems(e)),this.previewLoadedCount=e.length;var a=this.$previewPopover.find(".preview-footer");if(t){var s=this.previewTotalCount-e.length,o=a.find(".load-more-controls"),n=o.find(".btn-load-more"),r=o.find(".load-more-select");n.removeClass("loading"),n.find("i").removeClass("icon-spinner icon-spin").addClass("icon-plus"),r.prop("disabled",!1),o.find(".remaining-count").text(s),r.empty(),s>=10&&r.append(''),s>=20&&r.append(''),s>=50&&r.append(''),s>=100&&r.append(''),r.append('")}else a.remove();var l=this.$previewPopover.find(".preview-filter-input").val();l&&this.filterPreviewItems(l.toLowerCase().trim())},renderPreviewItems:function(e){for(var t="",i=0;i",a.image?t+='':t+='
inventory_2
',t+='
',t+='
'+this.escapeHtml(a.name||"Unnamed")+"
";var n=[];a.reference&&n.push("Ref: "+a.reference),a.manufacturer&&n.push(a.manufacturer),a.category&&n.push(a.category),a.attributes&&n.push(a.attributes),n.length>0&&(t+='
'+this.escapeHtml(n.join(" • "))+"
"),t+="
",void 0!==a.price&&null!==a.price?t+='
'+this.formatPrice(a.price)+"
":a.price_formatted&&(t+='
'+this.escapeHtml(a.price_formatted)+"
"),void 0===a.active||a.active||(t+='Inactive'),t+=""}return t},filterPreviewItems:function(t){if(this.$previewList){var i=this.$previewList.find(".preview-item");t?i.each(function(){var i=e(this),a=i.data("name")||"",s=i.data("ref")||"",o=i.data("attrs")||"",n=-1!==a.indexOf(t)||-1!==s.indexOf(t)||-1!==o.indexOf(t);i.toggle(n)}):i.show()}},showFilterLoading:function(e){if(this.$previewPopover){var t=this.$previewList;t&&(e?(this.previewLockedWidth||(this.previewLockedWidth=this.$previewPopover.outerWidth(),this.$previewPopover.css("width",this.previewLockedWidth+"px")),t.addClass("filtering"),t.find(".filter-loading-overlay").length||t.append('
')):(t.removeClass("filtering"),t.find(".filter-loading-overlay").remove()))}},updatePreviewPopoverFiltered:function(t){var i=this.config.trans||{};if(this.showFilterLoading(!1),t.success){var a=t.items||[],s=t.count||0,o=t.hasMore||!1,n=this.$previewPopover.find(".preview-header"),r=this.previewEntityLabel||"items";if(n.find(".preview-count").text(s+" "+r),a.length>0)this.$previewList.html(this.renderPreviewItems(a)),this.previewLoadedCount=a.length,this.previewTotalCount=s;else{var l=i.no_filter_results||"No matching items found";this.$previewList.html('
'+l+"
"),this.previewLoadedCount=0,this.previewTotalCount=0}var c=this.$previewPopover.find(".preview-footer");if(o&&a.length>0){var d=s-a.length;if(c.length){var p=c.find(".load-more-controls"),u=p.find(".btn-load-more"),h=p.find(".load-more-select");u.removeClass("loading"),u.find("i").removeClass("icon-spinner icon-spin").addClass("icon-plus"),h.prop("disabled",!1),p.find(".remaining-count").text(d),h.empty(),d>=10&&h.append(''),d>=20&&h.append(''),d>=50&&h.append(''),d>=100&&h.append(''),h.append('")}else{var f='");this.$previewList.after(v);var m=this;this.previewOnLoadMore&&v.find(".btn-load-more").on("click",function(){var t=e(this),i=t.closest(".load-more-controls").find(".load-more-select");if(!t.hasClass("loading")){t.addClass("loading"),t.find("i").removeClass("icon-plus").addClass("icon-spinner icon-spin"),i.prop("disabled",!0);var a=parseInt(i.val(),10)||20;m.previewLoadCount=a,m.previewOnLoadMore.call(m,t)}})}}else c.remove()}},formatPrice:function(e){"number"!=typeof e&&(e=parseFloat(e)||0);var t=this.config&&this.config.currency_sign||"€",i=this.config&&this.config.currency_format||"right",a=e.toFixed(2);return"left"===i?t+" "+a:a+" "+t},hidePreviewPopover:function(){this.$activeBadge&&(this.$activeBadge.removeClass("popover-open loading"),this.$activeBadge=null),this.$previewPopover&&(this.$previewPopover.remove(),this.$previewPopover=null),this.$previewList=null,this.previewContext=null,this.previewOnLoadMore=null,this.previewOnFilter=null,this.previewCurrentFilter="",this.previewEntityLabel=null,this.previewLockedWidth=null},showPreviewPopover:function(e){var t=this,i=e.data("previewData");if(i){this.hidePreviewPopover();var a=e.find(".tab-badge");a.addClass("popover-open"),this.$activeBadge=a;var s=i.items||i.products||[],o=e.data("blockType"),n=(this.config.blocks&&this.config.blocks[o]?this.config.blocks[o]:{}).entity_label_plural||"items";if(this.previewBlockType=o,0===s.length&&i.count>0)return a.addClass("loading"),void this.fetchTabPreviewItems(e,function(s,r){a.removeClass("loading"),t.createPreviewPopover({$badge:a,items:s,totalCount:i.count,hasMore:r,entityLabel:n,previewType:"tab",context:{$tab:e,blockType:o},onLoadMore:function(i){t.loadMoreTabPreviewItems(e,i)},onFilter:function(i){t.filterTabPreviewItems(e,i)}})});this.createPreviewPopover({$badge:a,items:s,totalCount:i.count,hasMore:i.hasMore,entityLabel:n,previewType:"tab",context:{$tab:e,blockType:o},onLoadMore:function(i){t.loadMoreTabPreviewItems(e,i)},onFilter:function(i){t.filterTabPreviewItems(e,i)}})}},fetchTabPreviewItems:function(t,i){var a=t.data("blockType"),s=this.$wrapper.find('input[name="'+this.config.name+'"]'),o={};try{o=JSON.parse(s.val()||"{}")}catch(e){return void i([],!1)}var n=o[a]&&o[a].groups?o[a].groups:[];if(0!==n.length){var r={};r[a]={groups:n},e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewEntitySelector",trait:"EntitySelector",conditions:JSON.stringify(r),block_type:a,limit:20,offset:0},success:function(e){var a=e.items||e.products||[],s=e.hasMore||e.count>a.length;t.data("previewData",e),i(a,s)},error:function(){i([],!1)}})}else i([],!1)},filterTabPreviewItems:function(t,i){var a=this,s=this.previewBlockType,o=this.$wrapper.find('input[name="'+this.config.name+'"]'),n={};try{n=JSON.parse(o.val()||"{}")}catch(e){return void a.showFilterLoading(!1)}var r=n[s]&&n[s].groups?n[s].groups:[];if(0!==r.length){var l={};l[s]={groups:r},e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewTargetConditions",trait:"TargetConditions",conditions:JSON.stringify(l),block_type:s,filter:i,limit:20,offset:0},success:function(e){a.updatePreviewPopoverFiltered(e)},error:function(){a.showFilterLoading(!1)}})}else a.showFilterLoading(!1)},loadMoreTabPreviewItems:function(t,i){var a=this,s=this.previewBlockType,o=this.$wrapper.find('input[name="'+this.config.name+'"]'),n={};try{n=JSON.parse(o.val()||"{}")}catch(e){return}var r=n[s]&&n[s].groups?n[s].groups:[];if(0!==r.length){var l={};l[s]={groups:r};var c=this.previewLoadCount||20,d={ajax:1,action:"previewTargetConditions",trait:"TargetConditions",conditions:JSON.stringify(l),block_type:s,limit:a.previewLoadedCount+c,offset:0};a.previewCurrentFilter&&(d.filter=a.previewCurrentFilter),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:d,success:function(e){var i=e.items||e.products||[];e.success&&i.length>0&&(t.data("previewData",e),a.previewTotalCount=e.count,a.updatePreviewPopover(i,e.hasMore))},error:function(){var e=i.closest(".load-more-controls").find(".load-more-select");i.removeClass("loading"),i.find("i").removeClass("icon-spinner icon-spin").addClass("icon-plus"),e.prop("disabled",!1)}})}},showConditionPreviewPopover:function(t){var i=this,a=t.data("conditionData");if(a)if(a.isCountryHolidays&&a.countryIds)this.showCountriesHolidayPreview(t,a.countryIds);else{this.hidePreviewPopover(),t.addClass("popover-open loading"),this.$activeBadge=t;var s=a.blockType||"products",o=(this.config.blocks&&this.config.blocks[s]?this.config.blocks[s]:{}).entity_label_plural||"products";e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewConditionItems",trait:"EntitySelector",method:a.method,values:JSON.stringify(a.values),block_type:s,limit:10},success:function(e){t.removeClass("loading"),e.success?i.createPreviewPopover({$badge:t,items:e.items||[],totalCount:e.count,hasMore:e.hasMore,entityLabel:o,previewType:"condition",context:{conditionData:a,blockType:s},onLoadMore:function(e){i.loadMoreConditionItems(e)},onFilter:function(e){i.filterConditionItems(e)}}):(t.removeClass("popover-open"),i.$activeBadge=null)},error:function(){t.removeClass("loading popover-open"),i.$activeBadge=null}})}},filterConditionItems:function(t){var i=this,a=this.previewContext;a&&a.conditionData?e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewConditionItems",trait:"EntitySelector",method:a.conditionData.method,values:JSON.stringify(a.conditionData.values),block_type:a.blockType,filter:t,limit:20},success:function(e){i.updatePreviewPopoverFiltered(e)},error:function(){i.showFilterLoading(!1)}}):i.showFilterLoading(!1)},loadMoreConditionItems:function(t){var i=this,a=this.previewContext;if(a&&a.conditionData){var s=this.previewLoadCount||20,o={ajax:1,action:"previewConditionItems",trait:"EntitySelector",method:a.conditionData.method,values:JSON.stringify(a.conditionData.values),block_type:a.blockType,limit:i.previewLoadedCount+s};i.previewCurrentFilter&&(o.filter=i.previewCurrentFilter),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:o,success:function(e){e.success&&(i.previewTotalCount=e.count,i.updatePreviewPopover(e.items||[],e.hasMore))},error:function(){var e=t.closest(".load-more-controls").find(".load-more-select");t.removeClass("loading"),t.find("i").removeClass("icon-spinner icon-spin").addClass("icon-plus"),e.prop("disabled",!1)}})}},showGroupPreviewPopover:function(t,i,a){var s=this;if(i||(i=t.closest(".selection-group")),!a){var o=t.closest(".target-block");a=o.data("blockType")||"products"}var n=t.data("groupData");if(n||(n=this.serializeGroup(i,a)),n&&n.include){this.hidePreviewPopover(),t.addClass("popover-open loading"),this.$activeBadge=t;var r=(this.config.blocks&&this.config.blocks[a]?this.config.blocks[a]:{}).entity_label_plural||"products";e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewGroupItems",trait:"EntitySelector",group_data:JSON.stringify(n),block_type:a,limit:10},success:function(e){t.removeClass("loading"),e.success?s.createPreviewPopover({$badge:t,items:e.items||[],totalCount:e.count,hasMore:e.hasMore,entityLabel:r,previewType:"group",context:{groupData:n,blockType:a,$group:i},onLoadMore:function(e){s.loadMoreGroupItems(e)},onFilter:function(e){s.filterGroupItems(e)}}):(t.removeClass("popover-open"),s.$activeBadge=null)},error:function(){t.removeClass("loading popover-open"),s.$activeBadge=null}})}},filterGroupItems:function(t){var i=this,a=this.previewContext;a&&a.groupData?e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewGroupItems",trait:"EntitySelector",group_data:JSON.stringify(a.groupData),block_type:a.blockType,filter:t,limit:20},success:function(e){i.updatePreviewPopoverFiltered(e)},error:function(){i.showFilterLoading(!1)}}):i.showFilterLoading(!1)},loadMoreGroupItems:function(t){var i=this,a=this.previewContext;if(a&&a.groupData){var s=this.previewLoadCount||20,o={ajax:1,action:"previewGroupItems",trait:"EntitySelector",group_data:JSON.stringify(a.groupData),block_type:a.blockType,limit:i.previewLoadedCount+s};i.previewCurrentFilter&&(o.filter=i.previewCurrentFilter),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:o,success:function(e){e.success&&(i.previewTotalCount=e.count,i.updatePreviewPopover(e.items||[],e.hasMore))},error:function(){t.removeClass("loading"),t.find(".load-more-text").show(),t.find(".load-more-loading").hide()}})}},showFilterGroupPreviewPopover:function(t,i,a,s){var o=this;this.hidePreviewPopover(),t.addClass("popover-open loading"),this.$activeBadge=t,e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewFilterGroupProducts",trait:"EntitySelector",group_id:i,group_type:a,limit:10},success:function(e){t.removeClass("loading"),e.success?o.createPreviewPopover({$badge:t,items:e.items||[],totalCount:e.count||0,hasMore:e.hasMore||!1,entityLabel:"products",previewType:"filter-group",context:{groupId:i,groupType:a,groupName:s},onLoadMore:function(e){o.loadMoreFilterGroupItems(e)},onFilter:function(e){o.filterFilterGroupItems(e)}}):(t.removeClass("popover-open"),o.$activeBadge=null)},error:function(){t.removeClass("loading popover-open"),o.$activeBadge=null}})},filterFilterGroupItems:function(t){var i=this,a=this.previewContext;a&&a.groupId?e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewFilterGroupProducts",trait:"EntitySelector",group_id:a.groupId,group_type:a.groupType,filter:t,limit:20},success:function(e){i.updatePreviewPopoverFiltered(e)},error:function(){i.showFilterLoading(!1)}}):i.showFilterLoading(!1)},loadMoreFilterGroupItems:function(t){var i=this,a=this.previewContext;if(a&&a.groupId){var s=this.previewLoadCount||20,o={ajax:1,action:"previewFilterGroupProducts",trait:"EntitySelector",group_id:a.groupId,group_type:a.groupType,limit:i.previewLoadedCount+s};i.previewCurrentFilter&&(o.filter=i.previewCurrentFilter),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:o,success:function(e){e.success&&(i.previewTotalCount=e.count,i.updatePreviewPopover(e.items||[],e.hasMore))},error:function(){t.removeClass("loading"),t.find(".load-more-text").show(),t.find(".load-more-loading").hide()}})}},showCategoryItemsPreview:function(t,i,a,s){var o=this;this.hidePreviewPopover(),t.addClass("popover-open loading"),this.$activeBadge=t;var n="categories"===s,r=n?"products":"pages",l=n?"previewCategoryProducts":"previewCategoryPages";e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:l,trait:"EntitySelector",category_id:i,limit:10},success:function(e){t.removeClass("loading"),e.success?o.createPreviewPopover({$badge:t,items:e.items||[],totalCount:e.count||0,hasMore:e.hasMore||!1,entityLabel:r,previewType:"category-items",context:{categoryId:i,categoryName:a,entityType:s},onLoadMore:function(e){o.loadMoreCategoryItems(e)},onFilter:function(e){o.filterCategoryItems(e)}}):(t.removeClass("popover-open"),o.$activeBadge=null)},error:function(){t.removeClass("loading popover-open"),o.$activeBadge=null}})},loadMoreCategoryItems:function(t){var i=this,a=this.previewContext;if(a&&a.categoryId){var s="categories"===a.entityType?"previewCategoryProducts":"previewCategoryPages";t.prop("disabled",!0).find("i").addClass("icon-spin"),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:s,trait:"EntitySelector",category_id:a.categoryId,offset:this.previewOffset,limit:10,query:this.previewFilterQuery||""},success:function(e){t.prop("disabled",!1).find("i").removeClass("icon-spin"),e.success&&e.items&&(i.appendPreviewItems(e.items),i.previewOffset+=e.items.length,e.hasMore||t.hide())},error:function(){t.prop("disabled",!1).find("i").removeClass("icon-spin")}})}},filterCategoryItems:function(t){var i=this,a=this.previewContext;if(a&&a.categoryId){var s="categories"===a.entityType?"previewCategoryProducts":"previewCategoryPages";e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:s,trait:"EntitySelector",category_id:a.categoryId,query:t,limit:10},success:function(e){i.showFilterLoading(!1),e.success&&(i.replacePreviewItems(e.items||[],e.count||0,e.hasMore||!1),i.previewOffset=e.items?e.items.length:0,i.previewFilterQuery=t)},error:function(){i.showFilterLoading(!1)}})}else i.showFilterLoading(!1)},showPatternPreviewModal:function(t,i,a,s){var o=this,n=this.config.trans||{},r=this.config.blocks&&this.config.blocks[i]?this.config.blocks[i]:{},l=r.entity_label_plural||"items",c=r.entity_label||"item",d='
';d+='
',d+='
',d+='',d+=' '+(n.preview||"Preview")+": "+this.escapeHtml(t)+"",d+="",d+=''+s+" "+(1===s?c:l)+"",d+='',d+="
",d+='
',d+='
'+(n.loading||"Loading...")+"
",d+="
",d+="
";var p=e(d+="
");e("body").append(p),p.find(".pattern-preview-close").on("click",function(){p.remove()}),p.on("click",function(t){e(t.target).hasClass("pattern-preview-modal-overlay")&&p.remove()}),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewPatternMatches",trait:"TargetConditions",pattern:t,entity_type:i,case_sensitive:a?1:0,limit:50},success:function(e){if(e.success&&e.items){var t=e.items,i='
';if(0===t.length)i+='
'+(n.no_matches||"No matches found")+"
";else{for(var a=0;a',r.image&&(i+=''),i+=''+o.escapeHtml(r.name)+"",r.id&&(i+='#'+r.id+""),i+="
"}s>t.length&&(i+='
... '+(n.and||"and")+" "+(s-t.length)+" "+(n.more||"more")+"
")}i+="",p.find(".pattern-preview-content").html(i)}else p.find(".pattern-preview-content").html('
'+(n.error_loading||"Error loading preview")+"
")},error:function(){p.find(".pattern-preview-content").html('
'+(n.error_loading||"Error loading preview")+"
")}})},refreshGroupPreviewIfOpen:function(e){this.$activeBadge&&this.$previewPopover},escapeHtml:function(e){return e?String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'"):""},escapeAttr:function(e){return e?String(e).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'"):""},showTotalPreviewPopover:function(t){var i=this,a=this.config.trans||{};this.hidePreviewPopover(),t.addClass("popover-open"),this.$activeBadge=t;var s=[];this.$wrapper.find(".target-block-tab.has-data").each(function(){var t=e(this),a=t.data("blockType"),o=t.find(".tab-badge").text().replace(/[^0-9]/g,""),n=parseInt(o,10)||0;if(n>0){i.config.blocks&&i.config.blocks[a]&&i.config.blocks[a];var r=t.find(".tab-label").prev("i").attr("class")||"icon-cube",l=t.find(".tab-label").text()||a;s.push({blockType:a,label:l,icon:r,count:n})}});var o=parseInt(t.find(".count-value").text(),10)||0,n='
';n+='
',n+=''+(a.total_summary||"Selection Summary")+"",n+=''+o+" "+(a.total_items||"total items")+"",n+="
",n+='
',n+='
    ';for(var r=0;r',n+='',n+=''+i.escapeHtml(l.label)+"",n+=''+l.count+"",n+=""}n+="
",n+="
";var c=e(n+="
");this.$previewPopover=c,c.on("click",".total-summary-item",function(){var t=e(this).data("blockType");i.hidePreviewPopover(),i.switchToBlock(t)}),e("body").append(c);var d=t.offset(),p=t.outerHeight(),u=c.outerWidth();c.css({position:"absolute",top:d.top+p+5,left:d.left-u/2+t.outerWidth()/2,zIndex:1e4});var h=e(window).width();c.offset().left+u>h-10&&c.css("left",h-u-10),c.offset().left<10&&c.css("left",10),c.hide().fadeIn(150)},showHolidayPreview:function(t,i,a,s){var o=this,n=this.config.trans||{};e(".holiday-preview-popover").remove();var r='
';r+='
',r+='',a&&(r+=' '),r+=this.escapeHtml(i)+" - "+(n.holidays||"Holidays"),r+="",r+='',r+="
",r+='
',r+='
sync '+(n.loading||"Loading...")+"
",r+="
";var l=e(r+="
");e("body").append(l);var c=s[0].getBoundingClientRect(),d=e(window).scrollTop(),p=e(window).scrollLeft(),u=l.outerWidth(),h=l.outerHeight(),f=e(window).width(),v=e(window).height(),m=c.bottom+d+8,g=c.left+p;g+u>f-10&&(g=f-u-10),g<10&&(g=10),c.bottom+h>v-10&&(m=c.top+d-h-8),l.css({position:"absolute",top:m,left:g,zIndex:10001}),l.find(".popover-close").on("click",function(){l.remove()}),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getHolidaysPreview",trait:"EntitySelector",id_country:t},success:function(e){if(e.success&&e.holidays&&e.holidays.length>0){for(var t='
',i=0;i',t+='
',t+=''+o.escapeHtml(a.date_formatted||a.date)+"",a.day_of_week&&(t+=''+o.escapeHtml(a.day_of_week)+""),t+="
",t+='
',t+=''+o.escapeHtml(a.name)+"",a.type&&(t+=''+o.escapeHtml(a.type)+""),t+="
",t+="
"}t+="",e.total_count&&(t+='
'+e.total_count+" "+(n.upcoming_holidays||"upcoming holidays")+"
"),l.find(".popover-body").html(t)}else{var s='
';s+='event_busy',s+="

"+(n.no_holidays||"No holidays found")+"

",s+="
",l.find(".popover-body").html(s)}var r=l.outerHeight();if(c.bottom+r>v-10){var p=c.top+d-r-8;p>10&&l.css("top",p)}},error:function(){var e='
';e+='error_outline',e+="

"+(n.error_loading||"Error loading holidays")+"

",e+="
",l.find(".popover-body").html(e)}})},showCountriesHolidayPreview:function(t,i){var a=this,s=this.config.trans||{};this.hidePreviewPopover(),e(".holiday-preview-popover").remove();var o='
';o+='
',o+='sync '+(s.loading||"Loading...")+"",o+='',o+="
",o+='
',o+='search',o+='',o+="
",o+='
',o+='
sync '+(s.loading||"Loading...")+"
",o+="
";var n=e(o+="
");e("body").append(n);var r=t[0].getBoundingClientRect(),l=e(window).scrollTop(),c=e(window).scrollLeft(),d=n.outerWidth(),p=n.outerHeight(),u=e(window).width(),h=e(window).height(),f=r.bottom+l+8,v=r.left+c;v+d>u-10&&(v=u-d-10),v<10&&(v=10),r.bottom+p>h-10&&(f=r.top+l-p-8),n.css({position:"absolute",top:f,left:v,zIndex:10001}),t.addClass("popover-open"),this.$activeBadge=t,n.find(".popover-close").on("click",function(){n.remove(),t.removeClass("popover-open"),a.$activeBadge=null}),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getHolidaysForCountries",trait:"EntitySelector",country_ids:i.join(","),count_only:0},success:function(t){if(t.success&&t.holidays&&t.holidays.length>0){var o={},c={};if(t.countries)for(var d=0;d ')}else{for(var y=0;y<2;y++){var x=v[y];x&&x.iso_code&&(m+=' ')}m+="+"+(g-2)+" "}m+=t.total_count+" "+(s.holidays||"Holidays"),n.find(".popover-title").html(m);for(var _='
',k=0;k',_+='
',_+=''+a.escapeHtml(C.date_formatted||C.date)+"",C.day_of_week&&(_+=''+a.escapeHtml(C.day_of_week)+""),_+="
",_+='
',C.country_iso&&i.length>1&&(_+=' '),_+=''+a.escapeHtml(C.name)+"",C.type&&(_+=''+a.escapeHtml(C.type)+""),_+="
",_+="
"}_+="",t.total_count&&i.length>1&&(_+='
'+(s.across_countries||"across")+" "+i.length+" "+(s.countries||"countries")+"
"),n.find(".popover-body").html(_),n.find(".holiday-filter-input").on("input",function(){var t=e(this).val().toLowerCase().trim(),a=n.find(".holiday-item"),o=0;a.each(function(){var i=e(this).attr("data-search")||"";t&&-1===i.indexOf(t)?e(this).hide():(e(this).show(),o++)});var r=n.find(".holiday-preview-note");if(t&&r.length)r.text(o+" "+(s.matches||"matches"));else if(r.length&&i.length>1){var l=(s.across_countries||"across")+" "+i.length+" "+(s.countries||"countries");r.text(l)}})}else{n.find(".popover-title").html("0 "+(s.holidays||"Holidays"));var M='
';M+='event_busy',M+="

"+(s.no_holidays||"No holidays found")+"

",M+="
",n.find(".popover-body").html(M)}var T=n.outerHeight();if(r.bottom+T>h-10){var P=r.top+l-T-8;P>10&&n.css("top",P)}},error:function(){n.find(".popover-title").html('error_outline '+(s.error||"Error"));var e='
';e+='error_outline',e+="

"+(s.error_loading||"Error loading holidays")+"

",e+="
",n.find(".popover-body").html(e)}})}}}(jQuery),function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.tree={treeData:null,treeFlatData:null,loadCategoryTree:function(){var t=this,i=this.$dropdown.find(".dropdown-results"),a=this.config.trans||{},s=this.activeGroup?this.activeGroup.searchEntity:"categories";i.html('
'+this.escapeHtml(a.loading||"Loading...")+"
"),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getCategoryTree",trait:"EntitySelector",entity_type:s},success:function(e){e.success&&e.categories&&e.categories.length>0?(t.treeFlatData=e.categories,t.treeData=t.buildTreeStructure(e.categories),t.renderCategoryTree(i,s)):i.html('")},error:function(){i.html('")}})},buildTreeStructure:function(t){var i={},a=[];return t.forEach(function(t){i[t.id]=e.extend({},t,{children:[]})}),t.forEach(function(e){var t=i[e.id],s=parseInt(e.parent_id,10);s&&i[s]?i[s].children.push(t):a.push(t)}),a},renderCategoryTree:function(e,t){var i=this.config.trans||{},a=this.getSelectedIdsFromChips(),s='
';s+='
',s+='",s+='",s+="
",s+='
',s+=this.renderTreeItems(this.treeData,0,a),s+="
",s+="
",e.html(s);var o=this.treeFlatData?this.treeFlatData.length:0,n=a.length,r=o+" "+("cms_categories"===t?"CMS categories":"categories");n>0&&(r+=" ("+n+" selected)"),this.$dropdown.find(".results-count").text(r),this.updateSelectChildrenButtons(this.$dropdown.find(".tree-item"))},renderTreeItems:function(e,t,i){var a=this,s="",o=this.config.trans||{};return e.forEach(function(e){var n=e.children&&e.children.length>0,r=-1!==i.indexOf(parseInt(e.id,10)),l=20*t,c="tree-item";n&&(c+=" has-children"),r&&(c+=" selected"),e.active||(c+=" inactive"),s+='
',s+='',n?(s+='',s+='"):s+='',s+='',s+='',s+=''+a.escapeHtml(e.name)+"";var d=e.product_count||e.page_count||0;if(d>0){var p=e.page_count?o.pages||"pages":o.products||"products";s+='',s+=' '+d,s+=""}e.active||(s+=''+a.escapeHtml(o.inactive||"Inactive")+""),s+="
",n&&(s+='
',s+=a.renderTreeItems(e.children,t+1,i),s+="
")}),s},getSelectedIdsFromChips:function(){var t=[];if(!this.activeGroup)return t;var i=this.$wrapper.find('.target-block[data-block-type="'+this.activeGroup.blockType+'"]').find('.selection-group[data-group-index="'+this.activeGroup.groupIndex+'"]');return("include"===this.activeGroup.section?i.find(".include-picker"):i.find('.exclude-row[data-exclude-index="'+this.activeGroup.excludeIndex+'"]').find(".exclude-picker")).find(".entity-chip").each(function(){t.push(parseInt(e(this).data("id"),10))}),t},filterCategoryTree:function(t){var i=this.$dropdown.find(".category-tree");if(i.length){var a=i.find(".tree-item"),s=i.find(".tree-children");if(t=(t||"").toLowerCase().trim(),a.css("display",""),!t)return a.removeClass("filtered-out filter-match"),void s.removeClass("filter-expanded");a.addClass("filtered-out").removeClass("filter-match"),a.each(function(){var i=e(this);-1!==(i.data("name")||"").toLowerCase().indexOf(t)&&(i.removeClass("filtered-out"),i.parents(".tree-children").addClass("filter-expanded"),i.parents(".tree-item").removeClass("filtered-out"),i.next(".tree-children").find(".tree-item").removeClass("filtered-out"),i.next(".tree-children").addClass("filter-expanded"))})}},findTreeDescendants:function(e,t){var i=[],a=(parseInt(e.data("id"),10),parseInt(e.data("level"),10),e.next(".tree-children"));return a.length&&a.find(".tree-item").each(function(){i.push(this)}),i},updateSelectChildrenButtons:function(t){var i=this.config.trans||{};t.filter(".has-children").each(function(){var t=e(this),a=t.find(".btn-select-children");if(a.length){var s=t.next(".tree-children");if(s.length){var o=s.find(".tree-item"),n=t.hasClass("selected"),r=!0;o.each(function(){if(!e(this).hasClass("selected"))return r=!1,!1}),n&&r?(a.find("i").removeClass("icon-plus-square").addClass("icon-minus-square"),a.attr("title",i.deselect_with_children||"Deselect with all children")):(a.find("i").removeClass("icon-minus-square").addClass("icon-plus-square"),a.attr("title",i.select_with_children||"Select with all children"))}}})}}}(jQuery),function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.validation={validateSelection:function(t,i,a,s){if(!this.activeGroup)return{valid:!0};var o=this.config.trans||{};t=parseInt(t,10);var n=this.$wrapper.find('.target-block[data-block-type="'+this.activeGroup.blockType+'"]').find('.selection-group[data-group-index="'+this.activeGroup.groupIndex+'"]'),r=this.getChipIds(n.find(".include-picker")),l=[];n.find(".exclude-row").each(function(){var t=e(this).find(".exclude-picker"),i=[];t.find(".entity-chip").each(function(){i.push(parseInt(e(this).data("id"),10))}),l=l.concat(i)});var c=this.checkIncludeExcludeConflict(t,i,a,r,l,o);if(!c.valid)return c;var d=this.checkRedundantSelection(t,i,a,r,l,o);if(!d.valid)return d;var p=this.activeGroup.searchEntity;if("categories"===p||"cms_categories"===p){var u=this.checkTreeConflicts(t,i,a,s,r,l,o);if(!u.valid)return u}return{valid:!0}},checkIncludeExcludeConflict:function(e,t,i,a,s,o){return"include"===i&&-1!==s.indexOf(e)?{valid:!1,type:"include_exclude_conflict",error:(o.error_in_exclude||'"{name}" is already in the exclude list. Remove it from exclude first.').replace("{name}",t)}:"exclude"===i&&-1!==a.indexOf(e)?{valid:!1,type:"include_exclude_conflict",error:(o.error_in_include||'"{name}" is already in the include list. Remove it from include first.').replace("{name}",t)}:{valid:!0}},checkRedundantSelection:function(e,t,i,a,s,o){return"include"===i&&-1!==a.indexOf(e)?{valid:!1,type:"redundant",error:(o.error_already_selected||'"{name}" is already selected.').replace("{name}",t)}:"exclude"===i&&-1!==s.indexOf(e)?{valid:!1,type:"redundant",error:(o.error_already_excluded||'"{name}" is already in an exclude list.').replace("{name}",t)}:{valid:!0}},checkTreeConflicts:function(e,t,i,a,s,o,n){if(!this.treeFlatData)return{valid:!0};a&&a.parentId&&parseInt(a.parentId,10);var r={};this.treeFlatData.forEach(function(e){r[parseInt(e.id,10)]=e});var l=this.getAncestorIds(e,r),c=this.getDescendantIds(e,r);if("include"===i){for(var d=0;d0)return{valid:!1,type:"children_included",error:(n.error_children_included||'Cannot exclude "{name}" because its children ({children}) are included. Remove them from include first.').replace("{name}",t).replace("{children}",m.slice(0,3).join(", ")+(m.length>3?"...":""))}}return{valid:!0}},getAncestorIds:function(e,t){for(var i=[],a=t[e];a&&a.parent_id;){var s=parseInt(a.parent_id,10);if(!s||!t[s])break;i.push(s),a=t[s]}return i},getDescendantIds:function(e,t){var i=[],a=this;return Object.keys(t).forEach(function(s){var o=t[s];if(parseInt(o.parent_id,10)===e){var n=parseInt(o.id,10);i.push(n);var r=a.getDescendantIds(n,t);i=i.concat(r)}}),i},getChipIds:function(t){var i=[];return t.find(".entity-chip").each(function(){i.push(parseInt(e(this).data("id"),10))}),i},validatePendingSelections:function(e,t){var i=this,a=[];return e&&e.length?(e.forEach(function(e){var s=i.validateSelection(e.id,e.name,t,e.data||{});s.valid||a.push({id:e.id,name:e.name,error:s.error,type:s.type})}),a):a},showValidationError:function(t){var i=(this.config.trans||{}).validation_error||"Selection Conflict";e(".es-validation-toast").remove();var a='
';a+='
',a+='
',a+='
'+this.escapeHtml(i)+"
",a+='
'+this.escapeHtml(t)+"
",a+="
",a+='';var s=e(a+="
");if(e("body").append(s),this.$dropdown&&this.$dropdown.hasClass("show")){var o=this.$dropdown.offset();s.css({position:"fixed",top:o.top-s.outerHeight()-10,left:o.left,zIndex:10001})}else s.css({position:"fixed",top:20,right:20,zIndex:10001});s.hide().fadeIn(200),setTimeout(function(){s.fadeOut(200,function(){e(this).remove()})},5e3),s.on("click",".es-toast-close",function(){s.fadeOut(200,function(){e(this).remove()})})},validateAndAddSelection:function(e,t,i,a,s){var o=this.validateSelection(t,i,s,a||{});return o.valid?(this.addSelection(e,t,i,a),!0):(this.showValidationError(o.error),!1)}}}(jQuery),function(e){"use strict";var t={instances:[],create:function(t){var i=function(){var t={config:{},$wrapper:null,$dropdown:null,activeGroup:null,searchTimeout:null,searchResults:[],searchTotal:0,searchOffset:0,searchQuery:"",isLoading:!1,loadMoreCount:20,viewMode:"list",currentSort:{field:"name",dir:"ASC"},refineQuery:"",refineNegate:!1,filters:{inStock:!1,discounted:!1,priceMin:null,priceMax:null,attributes:[],features:[],productCountMin:null,productCountMax:null,salesMin:null,salesMax:null,turnoverMin:null,turnoverMax:null,depth:null,hasProducts:!1,hasDescription:!1,hasImage:!1,activeOnly:!0,attributeGroup:null,featureGroup:null,dateAddFrom:null,dateAddTo:null,lastProductFrom:null,lastProductTo:null,hasHolidays:!1,containsStates:!1,zone:null},filterableData:null,searchHistory:{},searchHistoryMax:10,searchHistoryKey:"targetConditionsSearchHistory",maxVisibleChips:20,$methodDropdownMenu:null,$methodDropdownSelect:null,$methodDropdownTrigger:null,$previewPopover:null,$activeBadge:null,$previewList:null,previewLoadedCount:0,previewBlockType:null,allPreviewData:null,countUpdateTimeout:null,init:function(t){if(this.config=e.extend({id:"target-conditions",name:"target_conditions",namePrefix:"target_",mode:"multi",blocks:{},ajaxUrl:"",trans:{}},t),this.$wrapper=e('[data-entity-selector-id="'+this.config.id+'"]'),this.$wrapper.length){"single"===this.config.mode&&(this.$wrapper.find(".btn-add-group").hide(),this.$wrapper.find(".group-excludes").hide(),this.$wrapper.find(".group-modifiers").hide());var i=this.$wrapper.hasClass("layout-form-group"),a=this.$wrapper.closest(".entity-selector-form-group");if(!i&&!a.length){var s=this.$wrapper.closest(".form-group");s.addClass("condition-trait-fullwidth"),s.find(".col-lg-offset-3").removeClass("col-lg-offset-3")}this.createDropdown(),this.bindEvents(),this.loadExistingSelections(),this.loadSearchHistory(),this.initMethodDropdowns(),this.observeNewSelects();var o=this;setTimeout(function(){o.updateTabBadges(),o.updateAllConditionCounts()},100)}},observeNewSelects:function(){var t=this;"undefined"!=typeof MutationObserver&&new MutationObserver(function(i){i.forEach(function(i){i.addedNodes.length&&e(i.addedNodes).find(".include-method-select, .exclude-method-select").each(function(){t.enhanceMethodSelect(e(this))})})}).observe(this.$wrapper[0],{childList:!0,subtree:!0})},loadExistingSelections:function(){}},i=window._EntitySelectorMixins||{};return i.utils&&e.extend(t,i.utils),i.events&&e.extend(t,i.events),i.dropdown&&e.extend(t,i.dropdown),i.search&&e.extend(t,i.search),i.filters&&e.extend(t,i.filters),i.chips&&e.extend(t,i.chips),i.groups&&e.extend(t,i.groups),i.methods&&e.extend(t,i.methods),i.preview&&e.extend(t,i.preview),i.tree&&e.extend(t,i.tree),i.validation&&e.extend(t,i.validation),t}();return i.init(t),this.instances.push(i),i},init:function(e){return this.create(e)},validateAll:function(){for(var e=!0,t=0;t0&&!t.validateAll())return i.preventDefault(),!1})})}(jQuery); +!function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.utils={debounce:function(e,t){var i;return function(){var a=this,s=arguments;clearTimeout(i),i=setTimeout(function(){e.apply(a,s)},t)}},escapeHtml:function(e){return null==e?"":String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},escapeAttr:function(e){return null==e?"":String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},getEntityTypeIcon:function(e){return{products:"icon-shopping-cart",categories:"icon-folder-open",manufacturers:"icon-building",suppliers:"icon-truck",attributes:"icon-list-alt",features:"icon-tags",cms:"icon-file-text",cms_categories:"icon-folder"}[e]||"icon-cube"},getEntityTypeLabel:function(e){var t=this.config.trans||{};return{products:t.product||"Product",categories:t.category||"Category",manufacturers:t.manufacturer||"Manufacturer",suppliers:t.supplier||"Supplier",attributes:t.attribute||"Attribute",features:t.feature||"Feature",cms:t.cms_page||"CMS Page",cms_categories:t.cms_category||"CMS Category"}[e]||e},validate:function(){if(1!==this.$wrapper.data("required")&&"1"!==this.$wrapper.data("required"))return!0;var t=!1;return this.$wrapper.find(".target-block").each(function(){if(e(this).find(".selection-group").length>0)return t=!0,!1}),t?(this.clearValidationError(),!0):(this.showValidationError(),!1)},showValidationError:function(){this.$wrapper.addClass("has-validation-error");var t=this.$wrapper.data("required-message")||"Please select at least one item";this.$wrapper.find(".trait-validation-error").remove();var i=e("
",{class:"trait-validation-error",html:' '+t});this.$wrapper.find(".condition-trait-header").after(i),e("html, body").animate({scrollTop:this.$wrapper.offset().top-100},300),this.$wrapper.find(".condition-trait-body").is(":visible")||(this.$wrapper.find(".condition-trait-body").slideDown(200),this.$wrapper.removeClass("collapsed"))},clearValidationError:function(){this.$wrapper.removeClass("has-validation-error"),this.$wrapper.find(".trait-validation-error").remove()},getBlockMode:function(e){var t=this.config.blocks[e];return t&&t.mode?t.mode:"multi"},isBlockSingleMode:function(e){return"single"===this.getBlockMode(e)},getCurrentSingleSelection:function(){if("single"!==(this.config.mode||"multi"))return null;var e=this.$wrapper.find(".entity-chips .entity-chip").first();if(e.length){var t=e.closest(".target-block");return{name:e.find(".chip-name").text()||e.data("id"),entityType:t.data("block-type")||"item"}}return null},supportsTreeBrowsing:function(e){return"categories"===e||"cms_categories"===e}}}(jQuery),function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.events={bindEvents:function(){var t=this;this.$wrapper.on("click",".target-block-tab",function(i){i.preventDefault();var a=e(this).data("blockType");t.switchToBlock(a)}),this.$wrapper.on("click",".target-block-tab .tab-badge",function(i){i.stopPropagation(),i.preventDefault();var a=e(this).closest(".target-block-tab");e(this).hasClass("popover-open")?t.hidePreviewPopover():t.showPreviewPopover(a)}),this.$wrapper.on("click",".condition-match-count.clickable",function(i){i.stopPropagation(),i.preventDefault();var a=e(this);a.hasClass("popover-open")?t.hidePreviewPopover():t.showConditionPreviewPopover(a)}),this.$wrapper.on("click",".group-count-badge.clickable",function(i){i.stopPropagation(),i.preventDefault();var a=e(this);a.hasClass("popover-open")?t.hidePreviewPopover():t.showGroupPreviewPopover(a)}),this.$wrapper.on("click",".trait-total-count",function(i){i.stopPropagation(),i.preventDefault();var a=e(this);a.hasClass("popover-open")?t.hidePreviewPopover():t.showTotalPreviewPopover(a)}),e(document).on("click",function(i){e(i.target).closest(".target-preview-popover").length||e(i.target).closest(".holiday-preview-popover").length||e(i.target).closest(".tab-badge").length||e(i.target).closest(".condition-match-count").length||e(i.target).closest(".group-count-badge").length||e(i.target).closest(".group-modifiers").length||e(i.target).closest(".group-preview-badge").length||e(i.target).closest(".trait-total-count").length||e(i.target).closest(".chip-preview-holidays").length||e(i.target).closest(".chip-preview-btn").length||(t.hidePreviewPopover(),e(".holiday-preview-popover").remove())}),this.$wrapper.on("click",".condition-trait-header",function(i){if(!(e(i.target).closest(".target-block-tabs").length||e(i.target).closest(".trait-header-actions").length||e(i.target).closest(".prestashop-switch").length||e(i.target).closest(".trait-total-count").length)){var a=t.$wrapper.find(".condition-trait-body");a.stop(!0,!0),a.is(":visible")?(a.slideUp(200),t.$wrapper.addClass("collapsed")):(a.slideDown(200),t.$wrapper.removeClass("collapsed"))}}),this.$wrapper.on("click",".btn-toggle-blocks",function(i){i.preventDefault();var a=t.$wrapper.find(".entity-selector-blocks-content"),s=e(this).find(".material-icons");a.stop(!0,!0),a.is(":visible")?(a.slideUp(200),t.$wrapper.addClass("blocks-collapsed"),s.text("expand_more")):(a.slideDown(200),t.$wrapper.removeClass("blocks-collapsed"),s.text("expand_less"))}),this.$wrapper.on("click",".chip-preview-btn",function(i){i.preventDefault(),i.stopPropagation();var a=e(this);if(a.hasClass("popover-open"))t.hidePreviewPopover();else{var s=a.data("id"),o=a.data("type"),n=a.data("name"),r=a.data("groupId");s?t.showFilterValuePreviewPopover(a,s,o,n,r):r&&t.showFilterGroupPreviewPopover(a,r,o,n)}}),this.$wrapper.on("click",".group-header",function(i){e(i.target).closest(".btn-remove-group, .group-name-input").length||"single"!==t.$wrapper.data("mode")&&e(this).closest(".selection-group").toggleClass("collapsed")}),this.$wrapper.on("click",".trait-header-actions .btn-toggle-groups",function(i){i.preventDefault(),i.stopPropagation();var a=e(this),s=a.attr("data-state")||"collapsed",o=t.config.trans||{};"collapsed"===s?(t.$wrapper.find(".selection-group").removeClass("collapsed"),a.attr("data-state","expanded"),a.attr("title",o.collapse_all||"Collapse all groups"),a.find("i").removeClass("icon-expand").addClass("icon-compress")):(t.$wrapper.find(".selection-group").addClass("collapsed"),a.attr("data-state","collapsed"),a.attr("title",o.expand_all||"Expand all groups"),a.find("i").removeClass("icon-compress").addClass("icon-expand"))}),this.$wrapper.on("change",".trait-show-all-toggle .show-all-checkbox",function(i){i.stopPropagation(),e(this).prop("checked")&&t.clearAllConditions()}),this.$wrapper.on("change",".target-switch-toggle",function(i){i.stopPropagation(),"1"===e(this).val()?(t.clearAllConditions(),t.$wrapper.find(".condition-trait-body").slideUp(200),t.$wrapper.addClass("collapsed")):(t.$wrapper.find(".condition-trait-body").slideDown(200),t.$wrapper.removeClass("collapsed"))}),this.$wrapper.on("click",".btn-add-group",function(i){i.preventDefault();var a=e(this).closest(".target-block"),s=a.data("blockType");t.addGroup(a,s)}),this.$wrapper.on("click",".btn-remove-group",function(i){i.preventDefault();var a=e(this).closest(".selection-group"),s=e(this).closest(".target-block");t.removeGroup(a,s)}),this.$wrapper.on("click focus",".group-name-input",function(e){e.stopPropagation()}),this.$wrapper.on("change blur",".group-name-input",function(){var i=e(this),a=i.closest(".selection-group"),s=e.trim(i.val());a.attr("data-group-name",s),t.serializeAllBlocks()}),this.$wrapper.on("click",".btn-add-exclude",function(i){i.preventDefault();var a=e(this).closest(".selection-group"),s=e(this).closest(".target-block");t.addFirstExcludeRow(a,s)}),this.$wrapper.on("click",".btn-add-another-exclude",function(i){i.preventDefault();var a=e(this).closest(".selection-group"),s=e(this).closest(".target-block");t.addExcludeRow(a,s)}),this.$wrapper.on("click",".btn-remove-exclude-row",function(i){i.preventDefault();var a=e(this).closest(".exclude-row"),s=e(this).closest(".selection-group"),o=e(this).closest(".target-block");t.removeExcludeRow(a,s,o)}),this.$wrapper.on("change",".include-method-select",function(){t.hideDropdown();var i=e(this).closest(".selection-group"),a=e(this).closest(".target-block"),s=i.find(".group-include"),o=a.data("blockType"),n=(t.config.blocks[o]||{}).selection_methods||{},r=e(this).find("option:selected"),l=r.data("valueType")||"none",c=r.data("searchEntity")||"",d=r.data("options")||null,p=i.find(".include-picker"),u=t.buildValuePickerHtml("include",l,c,n);if(p.replaceWith(u),"select"===l&&d){var h=(f=i.find(".include-picker")).find(".select-value-input");h.empty(),e.each(d,function(e,i){h.append('")})}if("multi_select_tiles"===l&&d){var f=i.find(".include-picker"),v=!0===r.data("exclusive");t.populateTiles(f,d,v)}if("multi_numeric_range"===l){f=i.find(".include-picker");var m=r.data("step"),g=r.data("min");t.applyRangeInputConstraints(f,m,g)}"combination_attributes"===l&&(f=i.find(".include-picker"),t.loadCombinationAttributeGroups(f));var b=e(this).val();t.updateMethodInfoPlaceholder(i.find(".method-selector-wrapper"),b,o),t.updateBlockStatus(a),t.serializeAllBlocks(s)}),this.$wrapper.on("change",".exclude-method-select",function(){t.hideDropdown();var i=e(this).closest(".exclude-row"),a=(e(this).closest(".selection-group"),e(this).closest(".target-block").data("blockType")),s=(t.config.blocks[a]||{}).selection_methods||{},o=e(this).find("option:selected"),n=o.data("valueType")||"entity_search",r=o.data("searchEntity")||a,l=o.data("options")||null,c=i.find(".exclude-picker"),d=t.buildValuePickerHtml("exclude",n,r,s);if(c.replaceWith(d),"select"===n&&l){var p=(u=i.find(".exclude-picker")).find(".select-value-input");p.empty(),e.each(l,function(e,i){p.append('")})}if("multi_select_tiles"===n&&l){var u=i.find(".exclude-picker"),h=!0===o.data("exclusive");t.populateTiles(u,l,h)}if("multi_numeric_range"===n){u=i.find(".exclude-picker");var f=o.data("step"),v=o.data("min");t.applyRangeInputConstraints(u,f,v)}"combination_attributes"===n&&(u=i.find(".exclude-picker"),t.loadCombinationAttributeGroups(u));var m=e(this).val();t.updateMethodInfoPlaceholder(i.find(".exclude-header-row"),m,a),t.serializeAllBlocks(i)}),this.$wrapper.on("keydown",".pattern-input",function(t){13===t.keyCode&&(t.preventDefault(),e(this).closest(".draft-tag").find(".btn-add-pattern").click())}),this.$wrapper.on("click",".draft-tag .btn-add-pattern",function(i){i.preventDefault(),i.stopPropagation();var a=e(this).closest(".draft-tag"),s=a.closest(".value-picker"),o=a.closest(".group-include, .exclude-row"),n=a.find(".pattern-input"),r=e.trim(n.val());if(r){var l="1"===a.attr("data-case-sensitive");t.addPatternTag(s,r,l),n.val("").focus(),a.find(".pattern-match-count").removeClass("count-found count-zero").hide(),a.find(".pattern-match-count .count-value").text(""),t.serializeAllBlocks(o)}}),this.$wrapper.on("input",".pattern-input",function(){var i=e(this),a=i.closest(".draft-tag");if(a.length){var s=e.trim(i.val());i.data("countTimeout")&&clearTimeout(i.data("countTimeout"));var o=a.find(".pattern-match-count");if(s){var n=setTimeout(function(){var e="1"===a.attr("data-case-sensitive");t.updateDraftTagCount(a,s,e)},300);i.data("countTimeout",n)}else{o.removeClass("count-found count-zero").hide(),o.find(".count-value").text("");var r=a.closest(".selection-group");r.length&&t.updateGroupTotalCount(r)}}}),this.$wrapper.on("click",".pattern-tag .btn-remove-pattern",function(i){i.preventDefault(),i.stopPropagation();var a=e(this).closest(".group-include, .exclude-row");e(this).closest(".pattern-tag").remove(),t.serializeAllBlocks(a)}),this.$wrapper.on("click",".pattern-tag .btn-toggle-case",function(i){i.preventDefault(),i.stopPropagation();var a=e(this).closest(".pattern-tag"),s=e(this),o=t.config.trans||{},n=a.hasClass("draft-tag"),r=!(1===a.data("caseSensitive")||"1"===a.data("caseSensitive")||"1"===a.attr("data-case-sensitive"));a.data("caseSensitive",r?1:0),a.attr("data-case-sensitive",r?"1":"0"),a.toggleClass("case-sensitive",r),s.find(".case-icon").text(r?"Aa":"aa");var l=r?o.case_sensitive||"Case sensitive - click to toggle":o.case_insensitive||"Case insensitive - click to toggle";if(s.attr("title",l),n){var c=e.trim(a.find(".pattern-input").val());c&&t.updateDraftTagCount(a,c,r)}else{var d=a.closest(".group-include, .exclude-row");t.serializeAllBlocks(d)}}),this.$wrapper.on("click",".pattern-match-count",function(i){i.preventDefault(),i.stopPropagation();var a=e(this),s=a.data("count"),o=a.data("pattern"),n=a.data("entityType"),r=a.data("caseSensitive");!s||s<=0||!o||t.showPatternPreviewModal(o,n,r,s)}),this.$wrapper.on("click",".pattern-tag .pattern-tag-text",function(t){t.preventDefault();var i=e(this).closest(".pattern-tag");if(!i.hasClass("editing")){var a=i.data("pattern"),s=e('').val(a),o=e(''),n=e(''),r=e('').append(o,n);i.addClass("editing").find(".pattern-tag-text").hide(),i.find(".btn-remove-pattern").hide(),i.prepend(r).prepend(s),s.focus().select(),s.on("keydown",function(e){13===e.keyCode?(e.preventDefault(),o.click()):27===e.keyCode&&(e.preventDefault(),n.click())})}}),this.$wrapper.on("click",".pattern-tag .btn-pattern-save",function(i){i.preventDefault(),i.stopPropagation();var a=e(this).closest(".pattern-tag"),s=a.find(".pattern-tag-edit"),o=a.data("pattern"),n=e.trim(s.val());n&&n!==o&&(a.data("pattern",n),a.find(".pattern-tag-text").text(n)),s.remove(),a.find(".pattern-edit-actions").remove(),a.removeClass("editing").find(".pattern-tag-text, .btn-remove-pattern").show();var r=a.closest(".group-include, .exclude-row");t.serializeAllBlocks(r)}),this.$wrapper.on("click",".pattern-tag .btn-pattern-cancel",function(t){t.preventDefault(),t.stopPropagation();var i=e(this).closest(".pattern-tag");i.find(".pattern-tag-edit").remove(),i.find(".pattern-edit-actions").remove(),i.removeClass("editing").find(".pattern-tag-text, .btn-remove-pattern").show()}),this.$wrapper.on("mouseenter",".mpr-info-wrapper[data-details]",function(){var t=e(this);if(!t.data("tooltip-active")){var i=t.attr("data-details"),a=t.attr("data-tooltip-class")||"",s=e("
",{class:"mpr-tooltip mpr-tooltip-fixed "+a,html:i});e("body").append(s),t.data("tooltip-active",!0);var o=t.offset(),n=t.outerWidth(),r=s.outerWidth(),l=s.outerHeight(),c=o.left+n/2-r/2,d=o.top-l-10;c<10&&(c=10),c+r>e(window).width()-10&&(c=e(window).width()-r-10),s.css({position:"fixed",left:c+"px",top:d-e(window).scrollTop()+"px"}),t.data("tooltip-el",s)}}),this.$wrapper.on("mouseleave",".mpr-info-wrapper[data-details]",function(){var t=e(this),i=t.data("tooltip-el");i&&i.remove(),t.data("tooltip-active",!1),t.data("tooltip-el",null)}),this.$wrapper.on("change",".range-min-input, .range-max-input",function(){var i=e(this).closest(".group-include, .exclude-row");t.serializeAllBlocks(i)}),this.$wrapper.on("change",".date-from-input, .date-to-input",function(){var i=e(this).closest(".group-include, .exclude-row");t.serializeAllBlocks(i)}),this.$wrapper.on("change",".select-value-input",function(){var i=e(this).closest(".group-include, .exclude-row");t.serializeAllBlocks(i)}),this.$wrapper.on("click",".btn-add-range",function(i){i.preventDefault();var a=e(this).closest(".value-picker"),s=e(this).closest(".group-include, .exclude-row"),o=a.find(".multi-range-container"),n=o.find(".multi-range-chips"),r=o.find(".range-min-input"),l=o.find(".range-max-input"),c=r.val().trim(),d=l.val().trim();if(""!==c||""!==d){var p=parseFloat(r.attr("step"))||.01,u=r.attr("min"),h=void 0!==u&&""!==u;u=h?parseFloat(u):null;var f=""!==c?parseFloat(c):null,v=""!==d?parseFloat(d):null;if(h){if(null!==f&&fv)t.showRangeInputError(r,t.config.trans.min_greater_than_max||"Min cannot be greater than max");else{var m,g=p<1?String(p).split(".")[1].length:0;null!==f&&(f=p>=1?Math.round(f):parseFloat(f.toFixed(g)),c=String(f)),null!==v&&(v=p>=1?Math.round(v):parseFloat(v.toFixed(g)),d=String(v)),m=""!==c&&""!==d?c+" - "+d:""!==c?"≥ "+c:"≤ "+d;var b=e("",{class:"range-chip","data-min":c,"data-max":d});b.append(e("",{class:"range-chip-text",text:m})),b.append(e("",i+='",i+='
',i+='",i+='",i+='",i+="
",i+='
',i+='',i+='',i+='',i+="
",i+='",i+='",i+="
",i+="
",i+='
',i+='
',i+='",i+='",i+='
',i+=''+(t.price||"Price")+":",i+='',i+='-',i+='',i+="
",i+='",i+="
",i+='",i+='",i+='",i+='",i+='",i+='",i+='",i+='",i+='",i+='",i+='",i+='",i+="
",i+='
',i+='',i+=''+(t.product||"Product")+"",i+=''+(t.price||"Price")+"",i+=''+(t.sale||"Sale")+"",i+=''+(t.stock||"Stock")+"",i+=''+(t.sold||"Sold")+"",i+="
",i+='',i+='",i+="",this.$dropdown=e(i),e("body").append(this.$dropdown)},hideDropdown:function(){this.$dropdown&&this.$dropdown.removeClass("show"),this.activeGroup=null},positionDropdown:function(t){if(this.$dropdown){var i=t.closest(".value-picker"),a=t.closest(".entity-search-box"),s=a.offset(),o=a.outerHeight(),n=i.offset(),r=i.outerWidth(),l=s.top+o+4,c=n.left,d=Math.max(r,400),p=e(window).width();c+d>p-10&&(d=p-c-10);var u=e(window).height()-(l-e(window).scrollTop())-20;u=Math.max(u,400),this.$dropdown.css({position:"absolute",top:l,left:c,width:d,maxHeight:u,zIndex:1e4}),this.$dropdown.addClass("show")}}}}(jQuery),function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.search={categoryTreeCache:null,performSearch:function(t){var i=this;if(this.activeGroup){this.isLoading=!0;var a=this.activeGroup.searchEntity,s=t&&this.loadMoreCount?this.loadMoreCount:20,o={ajax:1,action:"searchTargetEntities",trait:"EntitySelector",entity_type:a,q:this.searchQuery,limit:s,offset:t?this.searchOffset:0,sort_by:this.currentSort?this.currentSort.field:"name",sort_dir:this.currentSort?this.currentSort.dir:"ASC"};this.config.productSelectionLevel&&"product"!==this.config.productSelectionLevel&&(o.product_selection_level=this.config.productSelectionLevel),this.refineQuery&&(o.refine=this.refineQuery,this.refineNegate&&(o.refine_negate=1)),"products"===a&&this.filters&&(this.filters.inStock&&(o.filter_in_stock=1),this.filters.discounted&&(o.filter_discounted=1),null!==this.filters.priceMin&&""!==this.filters.priceMin&&(o.filter_price_min=this.filters.priceMin),null!==this.filters.priceMax&&""!==this.filters.priceMax&&(o.filter_price_max=this.filters.priceMax),this.filters.attributes&&this.filters.attributes.length>0&&(o.filter_attributes=JSON.stringify(this.filters.attributes)),this.filters.features&&this.filters.features.length>0&&(o.filter_features=JSON.stringify(this.filters.features))),"products"!==a&&this.filters&&(null!==this.filters.productCountMin&&""!==this.filters.productCountMin&&(o.filter_product_count_min=this.filters.productCountMin),null!==this.filters.productCountMax&&""!==this.filters.productCountMax&&(o.filter_product_count_max=this.filters.productCountMax),"categories"===a&&(this.filters.depth&&(o.filter_depth=this.filters.depth),this.filters.hasProducts&&(o.filter_has_products=1),this.filters.hasDescription&&(o.filter_has_description=1),this.filters.hasImage&&(o.filter_has_image=1),null!==this.filters.salesMin&&""!==this.filters.salesMin&&(o.filter_sales_min=this.filters.salesMin),null!==this.filters.salesMax&&""!==this.filters.salesMax&&(o.filter_sales_max=this.filters.salesMax),null!==this.filters.turnoverMin&&""!==this.filters.turnoverMin&&(o.filter_turnover_min=this.filters.turnoverMin),null!==this.filters.turnoverMax&&""!==this.filters.turnoverMax&&(o.filter_turnover_max=this.filters.turnoverMax),this.filters.activeOnly&&(o.filter_active=1)),"manufacturers"===a&&(null!==this.filters.salesMin&&""!==this.filters.salesMin&&(o.filter_sales_min=this.filters.salesMin),null!==this.filters.salesMax&&""!==this.filters.salesMax&&(o.filter_sales_max=this.filters.salesMax),null!==this.filters.turnoverMin&&""!==this.filters.turnoverMin&&(o.filter_turnover_min=this.filters.turnoverMin),null!==this.filters.turnoverMax&&""!==this.filters.turnoverMax&&(o.filter_turnover_max=this.filters.turnoverMax),this.filters.dateAddFrom&&(o.filter_date_add_from=this.filters.dateAddFrom),this.filters.dateAddTo&&(o.filter_date_add_to=this.filters.dateAddTo),this.filters.lastProductFrom&&(o.filter_last_product_from=this.filters.lastProductFrom),this.filters.lastProductTo&&(o.filter_last_product_to=this.filters.lastProductTo),this.filters.activeOnly&&(o.filter_active=1)),"suppliers"===a&&(null!==this.filters.salesMin&&""!==this.filters.salesMin&&(o.filter_sales_min=this.filters.salesMin),null!==this.filters.salesMax&&""!==this.filters.salesMax&&(o.filter_sales_max=this.filters.salesMax),null!==this.filters.turnoverMin&&""!==this.filters.turnoverMin&&(o.filter_turnover_min=this.filters.turnoverMin),null!==this.filters.turnoverMax&&""!==this.filters.turnoverMax&&(o.filter_turnover_max=this.filters.turnoverMax),this.filters.dateAddFrom&&(o.filter_date_add_from=this.filters.dateAddFrom),this.filters.dateAddTo&&(o.filter_date_add_to=this.filters.dateAddTo),this.filters.lastProductFrom&&(o.filter_last_product_from=this.filters.lastProductFrom),this.filters.lastProductTo&&(o.filter_last_product_to=this.filters.lastProductTo),this.filters.activeOnly&&(o.filter_active=1)),"attributes"===a&&(null!==this.filters.salesMin&&""!==this.filters.salesMin&&(o.filter_sales_min=this.filters.salesMin),null!==this.filters.salesMax&&""!==this.filters.salesMax&&(o.filter_sales_max=this.filters.salesMax),null!==this.filters.turnoverMin&&""!==this.filters.turnoverMin&&(o.filter_turnover_min=this.filters.turnoverMin),null!==this.filters.turnoverMax&&""!==this.filters.turnoverMax&&(o.filter_turnover_max=this.filters.turnoverMax),this.filters.attributeGroup&&(o.filter_attribute_group=this.filters.attributeGroup),this.filters.isColor&&(o.filter_is_color=1)),"features"===a&&(null!==this.filters.salesMin&&""!==this.filters.salesMin&&(o.filter_sales_min=this.filters.salesMin),null!==this.filters.salesMax&&""!==this.filters.salesMax&&(o.filter_sales_max=this.filters.salesMax),null!==this.filters.turnoverMin&&""!==this.filters.turnoverMin&&(o.filter_turnover_min=this.filters.turnoverMin),null!==this.filters.turnoverMax&&""!==this.filters.turnoverMax&&(o.filter_turnover_max=this.filters.turnoverMax),this.filters.featureGroup&&(o.filter_feature_group=this.filters.featureGroup),this.filters.isCustom&&(o.filter_is_custom=1)),"cms"===a&&(this.filters.activeOnly&&(o.filter_active=1),this.filters.indexable&&(o.filter_indexable=1)),"cms_categories"===a&&this.filters.activeOnly&&(o.filter_active=1),"countries"===a&&(this.filters.activeOnly&&(o.filter_active=1),this.filters.hasHolidays&&(o.filter_has_holidays=1),this.filters.containsStates&&(o.filter_contains_states=1),this.filters.zone&&(o.filter_zone=this.filters.zone))),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:o,success:function(e){i.isLoading=!1,e.success&&(i.searchQuery&&i.searchQuery.length>=2&&e.total>0&&i.addToSearchHistory(a,i.searchQuery),i.searchResults=t?i.searchResults.concat(e.results||[]):e.results||[],i.searchTotal=e.total||0,i.searchOffset=t?i.searchOffset+(e.results||[]).length:(e.results||[]).length,i.renderSearchResults(t),i.$dropdown.addClass("show"))},error:function(){i.isLoading=!1}})}},renderSearchResults:function(t){var i=this,a=this.config.trans||{},s=this.$dropdown.find(".dropdown-results"),o=[],n=[];if(this.activeGroup){var r=this.$wrapper.find('.target-block[data-block-type="'+this.activeGroup.blockType+'"]').find('.selection-group[data-group-index="'+this.activeGroup.groupIndex+'"]'),l=this.activeGroup.searchEntity,c=this.activeGroup.excludeIndex;"include"===this.activeGroup.section?r.find(".include-picker").find(".entity-chip").each(function(){o.push(String(e(this).data("id")))}):(r.find('.exclude-row[data-exclude-index="'+c+'"]').find(".exclude-picker").find(".entity-chip").each(function(){o.push(String(e(this).data("id")))}),r.find(".exclude-row").each(function(){var t=e(this);if(parseInt(t.data("excludeIndex"),10)!==c){var a=t.find(".exclude-picker");(a.attr("data-search-entity")||i.activeGroup.blockType)===l&&a.find(".entity-chip").each(function(){n.push(String(e(this).data("id")))})}}))}var d=this.activeGroup&&"products"===this.activeGroup.searchEntity,p="list"===this.viewMode;this.$dropdown.find(".results-header").toggle(d&&p);var u=this.searchResults.filter(function(e){return-1===n.indexOf(String(e.id))}),h=this.searchResults.length-u.length,f=u.length+" / "+this.searchTotal+" results";h>0&&(f+=" ("+h+" hidden)"),this.$dropdown.find(".results-count").text(f);var v="";0!==u.length||t?u.forEach(function(e){var t="dropdown-item"+(-1!==o.indexOf(String(e.id))?" selected":"");"product"===e.type&&(t+=" result-item-product"),e.is_combination&&(t+=" is-combination"),e.is_parent&&(t+=" is-parent-product"),v+='
'}else if(e.image)v+='
';else{var n="icon-cube";"categories"===a?n="icon-folder":"manufacturers"===a?n="icon-building":"suppliers"===a?n="icon-truck":"attributes"===a?n="icon-paint-brush":"features"===a?n="icon-list-ul":"cms"===a?n="icon-file-text-o":"cms_categories"===a&&(n="icon-folder-o"),v+='
'}if(v+='
',v+='
'+i.escapeHtml(e.name)+"
",e.subtitle){var r=e.subtitle.split("\n");v+='
',r.forEach(function(e,t){v+='
'+i.escapeHtml(e)+"
"}),v+="
"}if(v+="
","product"===e.type)if(p){v+='
',v+=''+(e.regular_price_formatted||e.price_formatted||"")+"",v+="
",e.has_discount?(v+='
',v+=''+(e.price_formatted||"")+"",v+="
"):v+='
';var l="out_of_stock"===e.stock_status?"stock-out":"low_stock"===e.stock_status?"stock-low":"stock-ok";v+='
',v+=''+(void 0!==e.stock_qty?e.stock_qty:"")+"",v+="
",v+='
',v+=''+(void 0!==e.sales_qty?e.sales_qty:"0")+"",v+="
"}else{var c="out_of_stock"===e.stock_status?"stock-out":"low_stock"===e.stock_status?"stock-low":"";v+='
',v+=''+(e.price_formatted||"")+"",void 0!==e.stock_qty&&(v+=''+e.stock_qty+" qty"),e.has_discount&&(v+='-'+(e.discount_percent||"")+"%"),v+="
"}v+=""}):v='
'+(a.no_results||"No results found")+"
",t?s.append(v):s.html(v);var m=this.searchResults.length'+(a.all||"All")+" ("+b+")")}this.$dropdown.find(".dropdown-actions").show(),this.$dropdown.find(".btn-show-history").removeClass("active");var x=this.activeGroup?this.activeGroup.searchEntity:null,_=x&&this.getSearchHistory(x).length>0;this.$dropdown.find(".btn-show-history").prop("disabled",!_)},loadSearchHistory:function(){try{var e=localStorage.getItem(this.searchHistoryKey);this.searchHistory=e?JSON.parse(e):{}}catch(e){this.searchHistory={}}},saveSearchHistory:function(){try{localStorage.setItem(this.searchHistoryKey,JSON.stringify(this.searchHistory))}catch(e){}},addToSearchHistory:function(e,t){if(t&&!(t.length<2)){this.searchHistory[e]||(this.searchHistory[e]=[]);var i=this.searchHistory[e],a=i.indexOf(t);-1!==a&&i.splice(a,1),i.unshift(t),i.length>this.searchHistoryMax&&(i=i.slice(0,this.searchHistoryMax)),this.searchHistory[e]=i,this.saveSearchHistory()}},removeFromSearchHistory:function(e,t){if(this.searchHistory[e]){var i=this.searchHistory[e].indexOf(t);-1!==i&&(this.searchHistory[e].splice(i,1),this.saveSearchHistory())}},getSearchHistory:function(e){return this.searchHistory[e]||[]},showSearchHistory:function(e){var t=this.getSearchHistory(e),i=this.config.trans||{},a=this.$dropdown.find(".dropdown-results");if(this.$dropdown.find(".results-count").text(i.recent_searches||"Recent searches"),this.$dropdown.find(".dropdown-actions").hide(),this.$dropdown.find(".filter-panel").removeClass("show"),this.$dropdown.find(".btn-toggle-filters").removeClass("active"),this.$dropdown.find(".results-header").hide(),t.length){for(var s='
',o=0;o',s+='',s+=''+this.escapeHtml(n)+"",s+='",s+="
"}s+="",a.html(s),this.$dropdown.addClass("show")}else this.performSearch()},refreshSearch:function(){"tree"!==this.viewMode?(this.searchOffset=0,this.loadMoreCount=20,this.$dropdown&&(this.$dropdown.find(".load-more-select").val("20"),this.$dropdown.find('.load-more-select option[data-all="true"]').remove()),this.performSearch(!1)):this.filterCategoryTree(this.searchQuery||"")},clearFilters:function(){if(this.refineQuery="",this.refineNegate=!1,this.filters={inStock:!1,discounted:!1,priceMin:null,priceMax:null,attributes:[],features:[],productCountMin:null,productCountMax:null,salesMin:null,salesMax:null,turnoverMin:null,turnoverMax:null,depth:null,hasProducts:!1,hasDescription:!1,hasImage:!1,activeOnly:!0,attributeGroup:null,featureGroup:null,dateAddFrom:null,dateAddTo:null,lastProductFrom:null,lastProductTo:null,hasHolidays:!1,containsStates:!1,zone:null},this.$dropdown){var e=this.config.trans||{};this.$dropdown.find(".refine-input").val("").attr("placeholder",e.refine_short||"Refine..."),this.$dropdown.find(".btn-clear-refine").hide(),this.$dropdown.find(".btn-refine-negate").removeClass("active"),this.$dropdown.find(".filter-in-stock").prop("checked",!1),this.$dropdown.find(".filter-discounted").prop("checked",!1),this.$dropdown.find(".filter-price-min").val(""),this.$dropdown.find(".filter-price-max").val(""),this.$dropdown.find(".filter-attr-chip").removeClass("active"),this.$dropdown.find(".filter-feat-chip").removeClass("active"),this.$dropdown.find(".filter-group-toggle").removeClass("active has-selection"),this.$dropdown.find(".filter-row-values").hide(),this.$dropdown.find(".filter-product-count-min, .filter-product-count-max").val(""),this.$dropdown.find(".filter-sales-min, .filter-sales-max").val(""),this.$dropdown.find(".filter-turnover-min, .filter-turnover-max").val(""),this.$dropdown.find(".filter-date-add-from, .filter-date-add-to").val(""),this.$dropdown.find(".filter-last-product-from, .filter-last-product-to").val(""),this.$dropdown.find(".filter-depth-select").val(""),this.$dropdown.find(".filter-has-products").prop("checked",!1),this.$dropdown.find(".filter-has-description").prop("checked",!1),this.$dropdown.find(".filter-has-image").prop("checked",!1),this.$dropdown.find(".filter-active-only").prop("checked",!0),this.$dropdown.find(".filter-attribute-group-select, .filter-feature-group-select").val(""),this.$dropdown.find(".filter-has-holidays").prop("checked",!1),this.$dropdown.find(".filter-contains-states").prop("checked",!1),this.$dropdown.find(".filter-zone-select").val("")}this.refreshSearch()},resetFiltersWithoutSearch:function(){if(this.refineQuery="",this.refineNegate=!1,this.filters={inStock:!1,discounted:!1,priceMin:null,priceMax:null,attributes:[],features:[],productCountMin:null,productCountMax:null,salesMin:null,salesMax:null,turnoverMin:null,turnoverMax:null,depth:null,hasProducts:!1,hasDescription:!1,hasImage:!1,activeOnly:!0,attributeGroup:null,featureGroup:null,dateAddFrom:null,dateAddTo:null,lastProductFrom:null,lastProductTo:null,hasHolidays:!1,containsStates:!1,zone:null},this.$dropdown){var e=this.config.trans||{};this.$dropdown.find(".refine-input").val("").attr("placeholder",e.refine_short||"Refine..."),this.$dropdown.find(".btn-clear-refine").hide(),this.$dropdown.find(".btn-refine-negate").removeClass("active"),this.$dropdown.find(".filter-in-stock").prop("checked",!1),this.$dropdown.find(".filter-discounted").prop("checked",!1),this.$dropdown.find(".filter-price-min").val(""),this.$dropdown.find(".filter-price-max").val(""),this.$dropdown.find(".filter-attr-chip").removeClass("active"),this.$dropdown.find(".filter-feat-chip").removeClass("active"),this.$dropdown.find(".filter-group-toggle").removeClass("active has-selection"),this.$dropdown.find(".filter-row-values").hide(),this.$dropdown.find(".filter-product-count-min, .filter-product-count-max").val(""),this.$dropdown.find(".filter-sales-min, .filter-sales-max").val(""),this.$dropdown.find(".filter-turnover-min, .filter-turnover-max").val(""),this.$dropdown.find(".filter-date-add-from, .filter-date-add-to").val(""),this.$dropdown.find(".filter-last-product-from, .filter-last-product-to").val(""),this.$dropdown.find(".filter-depth-select").val(""),this.$dropdown.find(".filter-has-products").prop("checked",!1),this.$dropdown.find(".filter-has-description").prop("checked",!1),this.$dropdown.find(".filter-has-image").prop("checked",!1),this.$dropdown.find(".filter-active-only").prop("checked",!0),this.$dropdown.find(".filter-attribute-group-select, .filter-feature-group-select").val(""),this.$dropdown.find(".filter-has-holidays").prop("checked",!1),this.$dropdown.find(".filter-contains-states").prop("checked",!1),this.$dropdown.find(".filter-zone-select").val("")}},updateFilterPanelForEntity:function(e){if(this.$dropdown){var t=this.$dropdown.find(".filter-panel");t.find(".filter-row").hide();var i=this.$dropdown.find(".view-mode-select option.tree-view-option");"categories"===e||"cms_categories"===e?(i.prop("disabled",!1).prop("hidden",!1),"tree"!==this.viewMode?(this.viewMode="tree",this.$dropdown.find(".view-mode-select").val("tree"),this.$dropdown.removeClass("view-list view-cols-2 view-cols-3 view-cols-4 view-cols-5 view-cols-6 view-cols-7 view-cols-8").addClass("view-tree"),this.loadCategoryTree()):this.loadCategoryTree()):(i.prop("disabled",!0).prop("hidden",!0),"tree"===this.viewMode&&(this.viewMode="list",this.$dropdown.find(".view-mode-select").val("list"),this.$dropdown.removeClass("view-tree").addClass("view-list"))),"products"===e?(t.find(".filter-row-quick").show(),this.filterableData&&(this.filterableData.attributes&&this.filterableData.attributes.length>0&&this.$dropdown.find(".filter-row-attributes").show(),this.filterableData.features&&this.filterableData.features.length>0&&this.$dropdown.find(".filter-row-features").show())):"categories"===e?t.find(".filter-row-entity-categories").show():"manufacturers"===e?t.find(".filter-row-entity-manufacturers").show():"suppliers"===e?t.find(".filter-row-entity-suppliers").show():"attributes"===e?(t.find(".filter-row-entity-attributes").show(),this.loadAttributeGroups()):"features"===e?t.find(".filter-row-entity-features").show():"cms"===e?t.find(".filter-row-entity-cms").show():"cms_categories"===e?t.find(".filter-row-entity-cms-categories").show():"countries"===e&&(t.find(".filter-row-entity-countries").show(),this.loadZonesForCountryFilter())}},loadAttributeGroups:function(){var t=this,i=this.$dropdown.find(".filter-attribute-group-select");i.find("option").length>1||e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getAttributeGroups",trait:"EntitySelector"},success:function(a){a.success&&a.groups&&e.each(a.groups,function(e,a){i.append('")})}})},loadFeatureGroups:function(){var t=this,i=this.$dropdown.find(".filter-feature-group-select");i.find("option").length>1||e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getFeatureGroups",trait:"EntitySelector"},success:function(a){a.success&&a.groups&&e.each(a.groups,function(e,a){i.append('")})}})}}}(jQuery),function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.filters={clearFilters:function(){this.refineQuery="",this.refineNegate=!1,this.filters={inStock:!1,discounted:!1,priceMin:null,priceMax:null,attributes:[],features:[],productCountMin:null,productCountMax:null,salesMin:null,salesMax:null,turnoverMin:null,turnoverMax:null,depth:null,hasProducts:!1,hasDescription:!1,hasImage:!1,activeOnly:!0,attributeGroup:null,featureGroup:null,dateAddFrom:null,dateAddTo:null,lastProductFrom:null,lastProductTo:null,hasHolidays:!1,containsStates:!1,zone:null},this.$dropdown&&(this.config.trans,this.$dropdown.find(".refine-input").val(""),this.$dropdown.find(".btn-refine-negate").removeClass("active"),this.$dropdown.find(".filter-in-stock").prop("checked",!1),this.$dropdown.find(".filter-discounted").prop("checked",!1),this.$dropdown.find(".filter-price-min, .filter-price-max").val(""),this.$dropdown.find(".filter-attr-chip, .filter-feat-chip").removeClass("active"),this.$dropdown.find(".filter-product-count-min, .filter-product-count-max").val(""),this.$dropdown.find(".filter-sales-min, .filter-sales-max").val(""),this.$dropdown.find(".filter-depth-select").val(""),this.$dropdown.find(".filter-has-products").prop("checked",!1),this.$dropdown.find(".filter-active-only").prop("checked",!0),this.$dropdown.find(".filter-has-holidays").prop("checked",!1),this.$dropdown.find(".filter-contains-states").prop("checked",!1),this.$dropdown.find(".filter-zone-select").val("")),this.refreshSearch()},resetFiltersWithoutSearch:function(){this.refineQuery="",this.refineNegate=!1,this.filters={inStock:!1,discounted:!1,priceMin:null,priceMax:null,attributes:[],features:[],productCountMin:null,productCountMax:null,salesMin:null,salesMax:null,turnoverMin:null,turnoverMax:null,depth:null,hasProducts:!1,hasDescription:!1,hasImage:!1,activeOnly:!0,attributeGroup:null,featureGroup:null,dateAddFrom:null,dateAddTo:null,lastProductFrom:null,lastProductTo:null,hasHolidays:!1,containsStates:!1,zone:null}},updateFilterPanelForEntity:function(e){if(this.$dropdown){var t=this.$dropdown.find(".filter-panel");t.find(".filter-row").hide(),t.find('.filter-row[data-entity="'+e+'"]').show(),t.find(".filter-row-entity-"+e.replace("_","-")).show();var i="categories"===e||"cms_categories"===e;this.$dropdown.find(".tree-view-option").toggle(i),i&&"list"===this.viewMode?(this.viewMode="tree",this.$dropdown.find(".view-mode-select").val("tree"),this.$dropdown.removeClass("view-list view-cols-2 view-cols-3 view-cols-4 view-cols-5 view-cols-6 view-cols-7 view-cols-8").addClass("view-tree")):i||"tree"!==this.viewMode||(this.viewMode="list",this.$dropdown.find(".view-mode-select").val("list"),this.$dropdown.removeClass("view-tree view-cols-2 view-cols-3 view-cols-4 view-cols-5 view-cols-6 view-cols-7 view-cols-8").addClass("view-list")),"countries"===e&&this.loadZonesForCountryFilter(),this.updateSortOptionsForEntity(e)}},updateSortOptionsForEntity:function(t){if(this.$dropdown){var i=this.$dropdown.find(".sort-field-select"),a=i.val(),s=!1;i.find("option").each(function(){var i=e(this),o=i.data("entities");if(!o)return i.show(),void(i.val()===a&&(s=!0));var n=-1!==o.split(",").indexOf(t);i.toggle(n),n&&i.val()===a&&(s=!0)}),s||(i.val("name"),this.currentSort.field="name")}},loadFilterableData:function(){var t=this;this.filterableData?this.renderFilterDropdowns():e.ajax({url:this.config.ajaxUrl,type:"POST",data:{ajax:1,action:"getTargetFilterableAttributes",trait:"EntitySelector"},dataType:"json",success:function(e){e.success&&e.data&&(t.filterableData=e.data,t.renderFilterDropdowns())}})},renderFilterDropdowns:function(){if(this.$dropdown&&this.filterableData){var e=this,t=e.config.trans&&e.config.trans.preview||"Preview",i=this.$dropdown.find(".filter-attributes-container");i.empty(),this.filterableData.attributes&&this.filterableData.attributes.length>0&&(this.filterableData.attributes.forEach(function(a){var s='';s+='",s+='",s+="",i.append(s)}),this.$dropdown.find(".filter-row-attributes").show());var a=this.$dropdown.find(".filter-features-container");a.empty(),this.filterableData.features&&this.filterableData.features.length>0&&(this.filterableData.features.forEach(function(i){var s='';s+='",s+='",s+="",a.append(s)}),this.$dropdown.find(".filter-row-features").show())}},showFilterGroupValues:function(e,t){if(this.filterableData){var i=this,a=("attribute"===t?this.filterableData.attributes:this.filterableData.features).find(function(t){return t.id==e});if(a){this.$dropdown.find(".filter-row-values").hide();var s="attribute"===t?".filter-row-attr-values":".filter-row-feat-values",o=this.$dropdown.find(s),n=o.find(".filter-values-container");n.empty();var r=''+a.name+":";a.values.forEach(function(a){var s=("attribute"===t?-1!==i.filters.attributes.indexOf(a.id):-1!==i.filters.features.indexOf(a.id))?" active":"",o="attribute"===t?"filter-attr-chip":"filter-feat-chip",n=a.color?' style="--chip-color: '+a.color+'"':"",l=a.color?" has-color":"";r+='',r+='",r+='",r+=""}),n.html(r),o.find(".btn-close-values").remove(),o.append(''),o.show();var l=o[0];l&&l.scrollIntoView({behavior:"smooth",block:"nearest"})}}},hideFilterGroupValues:function(){this.$dropdown.find(".filter-row-values").hide(),this.$dropdown.find(".filter-group-toggle").removeClass("active")},updateFilterToggleStates:function(){if(this.$dropdown&&this.filterableData){var e=this;this.filterableData.attributes&&this.filterableData.attributes.forEach(function(t){var i=e.$dropdown.find('.filter-group-toggle[data-group-id="'+t.id+'"][data-type="attribute"]'),a=t.values.some(function(t){return-1!==e.filters.attributes.indexOf(t.id)});i.toggleClass("has-selection",a)}),this.filterableData.features&&this.filterableData.features.forEach(function(t){var i=e.$dropdown.find('.filter-group-toggle[data-group-id="'+t.id+'"][data-type="feature"]'),a=t.values.some(function(t){return-1!==e.filters.features.indexOf(t.id)});i.toggleClass("has-selection",a)})}},loadZonesForCountryFilter:function(){var t=this;if(!this.zonesLoaded&&this.$dropdown){var i=this.$dropdown.find(".filter-zone-select");i.length&&e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getZonesForFilter",trait:"EntitySelector"},success:function(e){if(e.success&&e.zones&&e.zones.length>0){var a=t.config.trans||{};i.empty(),i.append('"),e.zones.forEach(function(e){i.append('")}),t.zonesLoaded=!0}}})}}}}(jQuery),function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.chips={addSelection:function(e,t,i,a){this.addSelectionNoUpdate(e,t,i,a);var s=e.find(".entity-chips");this.updateChipsVisibility(s)},addSelectionNoUpdate:function(e,t,i,a){var s=e.find(".entity-chips"),o=e.closest(".target-block");if("single"===(this.config.mode||"multi")?(this.$wrapper.find(".entity-chips .entity-chip").remove(),this.$dropdown&&this.$dropdown.find(".dropdown-item.selected, .tree-item.selected").removeClass("selected"),this.$wrapper.find(".target-block-tab .tab-badge").remove(),this.$wrapper.find(".target-block-tab").removeClass("has-data")):"single"===(o.data("mode")||"multi")&&(s.find(".entity-chip").remove(),this.$dropdown&&this.$dropdown.find(".dropdown-item.selected, .tree-item.selected").removeClass("selected")),!s.find('.entity-chip[data-id="'+t+'"]').length){var n=o.data("blockType")||"",r="countries"===(e.attr("data-search-entity")||n),l='':a&&a.image&&(l+=''),l+=''+this.escapeHtml(i)+"",r&&(l+=''),l+='',l+="
",s.append(l)}},removeSelection:function(e,t){var i=e.find(".entity-chips");e.find('.entity-chip[data-id="'+t+'"]').remove(),this.updateChipsVisibility(i)},updateChipsVisibility:function(t){var i=this.config.trans||{},a=(t.closest(".value-picker"),t.find(".entity-chip")),s=a.length,o=t.closest(".chips-wrapper");if(0!==s){this.ensureChipsWrapper(t);var n=t.closest(".chips-wrapper"),r=n.find(".chips-toolbar"),l=n.find(".chips-load-more"),c=r.find(".chips-search-input").val()||"";c=c.toLowerCase().trim();var d=0,p=0,u=t.hasClass("chips-expanded"),h=u?999999:this.maxVisibleChips||12;a.each(function(){var t=e(this),i=(t.find(".chip-name").text()||"").toLowerCase(),a=!c||-1!==i.indexOf(c);t.removeClass("chip-filtered-out chip-paginated-out"),a?++p>h?t.addClass("chip-paginated-out"):d++:t.addClass("chip-filtered-out")}),r.addClass("has-chips"),this.updateChipsToolbar(r,s,p,c);var f=p-d;if(f>0&&!u){var v=i.load||"Load",m=(i.remaining||"{count} remaining").replace("{count}",f),g=''+v+''+m+"";l.html(g).show()}else if(u&&p>(this.maxVisibleChips||12)){var b=i.collapse||"Collapse";l.html('").show()}else l.hide()}else o.length&&(o.before(t),o.remove())},ensureChipsWrapper:function(t){if(!t.closest(".chips-wrapper").length){var i=this.config.trans||{},a=(t.closest(".value-picker"),'
'),s=e(a);t.before(s),s.find(".chips-toolbar").after(t),s.append(s.find(".chips-load-more")),this.bindChipsToolbarEvents(s)}},bindChipsToolbarEvents:function(t){var i,a=this,s=t.find(".entity-chips");t.on("input",".chips-search-input",function(){clearTimeout(i),i=setTimeout(function(){s.removeClass("chips-expanded"),a.updateChipsVisibility(s)},150)}),t.on("change",".chips-sort-select",function(){var t=e(this).val();a.sortChips(s,t)}),t.on("click",".btn-chips-clear",function(){((t.find(".chips-search-input").val()||"").trim()?s.find(".entity-chip:not(.chip-filtered-out)"):s.find(".entity-chip")).each(function(){e(this).find(".chip-remove").trigger("click")}),t.find(".chips-search-input").val(""),a.updateChipsVisibility(s)}),t.on("change",".load-more-select",function(){var t=e(this).val();"all"===t?(s.addClass("chips-expanded"),a.maxVisibleChips=999999):a.maxVisibleChips=(a.maxVisibleChips||12)+parseInt(t,10),a.updateChipsVisibility(s)}),t.on("click",".btn-collapse-chips",function(){s.removeClass("chips-expanded"),a.maxVisibleChips=12,a.updateChipsVisibility(s)})},sortChips:function(t,i){var a=t.find(".entity-chip");if(!(a.length<2)){var s=a.toArray().sort(function(t,a){var s=e(t),o=e(a);switch(i){case"name_asc":var n=(s.find(".chip-name").text()||"").toLowerCase(),r=(o.find(".chip-name").text()||"").toLowerCase();return n.localeCompare(r);case"name_desc":var l=(s.find(".chip-name").text()||"").toLowerCase();return(o.find(".chip-name").text()||"").toLowerCase().localeCompare(l);default:return 0}});e.each(s,function(e,i){t.append(i)}),this.updateChipsVisibility(t)}},updateChipsToolbar:function(e,t,i,a){var s=this.config.trans||{},o=e.find(".chips-count"),n=e.find(".btn-chips-clear"),r=n.find(".clear-text");a?(o.addClass("has-filter").html(''+i+'/'+t+""),r.text((s.clear||"Clear")+" "+i)):(o.removeClass("has-filter").html(t),r.text(s.clear_all||"Clear all")),a&&0===i?n.hide():t>0?n.show():n.hide()},loadExistingSelections:function(){var t=this,i={};this.$wrapper.find(".selection-group").each(function(){var a=e(this),s=a.closest(".target-block").data("blockType"),o=a.find(".include-picker");t.collectPickerEntities(o,s,i),t.enhanceMethodSelect(a.find(".include-method-select")),a.find(".exclude-row").each(function(){var a=e(this);t.collectPickerEntities(a.find(".exclude-picker"),s,i),t.enhanceMethodSelect(a.find(".exclude-method-select"))}),a.find(".group-excludes.has-excludes").length>0&&t.updateMethodSelectorLock(a,!0)});var a={},s=!1;if(Object.keys(i).forEach(function(e){var t=i[e];if(0!==t.ids.length){var o=t.ids.filter(function(e,t,i){return i.indexOf(e)===t});a[e]=o,s=!0}}),s){var o={ajax:1,action:"getTargetEntitiesByIdsBulk",trait:"EntitySelector",entities:JSON.stringify(a)};t.config.productSelectionLevel&&"product"!==t.config.productSelectionLevel&&(o.product_selection_level=t.config.productSelectionLevel),e.ajax({url:t.config.ajaxUrl,type:"POST",dataType:"json",data:o,success:function(e){if(e.success&&e.entities)try{Object.keys(i).forEach(function(a){var s=i[a],o=e.entities[a]||[],n={};o.forEach(function(e){n[e.id]=e}),s.pickers.forEach(function(e){var i=e.$picker,s=i.find(".entity-chips"),o=i.find(".include-values-data, .exclude-values-data"),r=[],l="countries"===a;e.ids.forEach(function(e){var i=s.find('.entity-chip-loading[data-id="'+e+'"]');if(n[e]){var a=n[e];r.push(a.id);var o='':a.image&&(o+=''),o+=''+t.escapeHtml(a.name)+"",l&&(o+=''),o+='',o+="
",i.replaceWith(o)}else i.remove()}),t.updateChipsVisibility(s),r.length!==e.ids.length&&(o.val(JSON.stringify(r)),t.serializeAllBlocks()),t.updateBlockStatus(i.closest(".target-block"))})}),t.updateAllConditionCounts()}catch(e){}},error:function(e,t,i){}})}},collectPickerEntities:function(t,i,a){if(t.length){var s=this,o=t.find(".include-values-data, .exclude-values-data");if(o.length){var n=t.attr("data-value-type"),r=o.val()||"[]",l=[];try{l=JSON.parse(r)}catch(e){return}if("multi_numeric_range"!==n)if("multi_select_tiles"!==n){if("combination_attributes"===n)return"object"!=typeof l||null===l||0===Object.keys(l).length||o.val(JSON.stringify(l)),void s.loadCombinationAttributeGroups(t);if(l.length)if("pattern"!==n){var c=t.attr("data-search-entity")||i,d=t.find(".entity-chips"),p=this.getEntityTypeIcon(c);l.forEach(function(e){var t='';t+='',t+='Loading...',t+="",d.append(t)}),a[c]||(a[c]={ids:[],pickers:[]}),a[c].ids=a[c].ids.concat(l),a[c].pickers.push({$picker:t,ids:l})}else l.forEach(function(e){"string"==typeof e&&e?s.addPatternTag(t,e,!1):e&&e.pattern&&s.addPatternTag(t,e.pattern,!0===e.caseSensitive)})}else{if(!Array.isArray(l)||0===l.length)return;l.forEach(function(e){t.find('.tile-option[data-value="'+e+'"]').addClass("selected")})}else{if(!Array.isArray(l)||0===l.length)return;var u=t.find(".multi-range-chips");l.forEach(function(t){if(t&&(null!==t.min||null!==t.max)){var i;i=null!==t.min&&null!==t.max?t.min+" - "+t.max:null!==t.min?"≥ "+t.min:"≤ "+t.max;var a=e("",{class:"range-chip","data-min":null!==t.min?t.min:"","data-max":null!==t.max?t.max:""});a.append(e("",{class:"range-chip-text",text:i})),a.append(e("",r+=''+this.escapeHtml(t)+"",r+='',r+="",s.append(r)},getPatternTags:function(t){var i=[];return t.find(".pattern-tag:not(.draft-tag)").each(function(){var t=e(this).data("pattern"),a=1===e(this).data("caseSensitive")||"1"===e(this).data("caseSensitive");t&&i.push({pattern:t,caseSensitive:a})}),i},updateDraftTagCount:function(t,i,a){var s=this,o=t.find(".pattern-match-count"),n=o.find(".count-value"),r=t.closest(".target-block").data("blockType")||"products";n.html(''),o.show(),o.data("pattern",i),o.data("caseSensitive",a),o.data("entityType",r),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countPatternMatches",trait:"EntitySelector",pattern:i,field:"name",entity_type:r,case_sensitive:a?1:0},success:function(e){if(e.success){var i=parseInt(e.count,10)||0;n.text(i),o.show(),o.removeClass("count-zero count-found"),o.addClass(0===i?"count-zero":"count-found"),o.data("count",i);var a=t.closest(".selection-group");a.length&&s.updateGroupTotalCount(a)}else n.text("?"),o.show()},error:function(){n.text("?"),o.show()}})},updateConditionCountWithPendingPattern:function(t,i){this.config.trans;var a=t.find(".method-selector-wrapper > .condition-match-count, > .exclude-header-row > .condition-match-count").first();if(a.length){var s=t.hasClass("exclude-row"),o=(s?t.find(".exclude-method-select"):t.find(".include-method-select")).val();if(o){var n=s?t.find(".exclude-picker"):t.find(".include-picker");if("pattern"===(n.data("valueType")||"none")){var r=this.getPatternTags(n);if(i&&r.push({pattern:i,caseSensitive:!1}),0!==r.length){var l=t.closest(".target-block").data("blockType")||"products";a.find(".preview-count").html(''),a.removeClass("clickable no-matches").show(),a.data("conditionData",{method:o,values:r,blockType:l,isExclude:s}),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countConditionMatches",trait:"EntitySelector",method:o,values:JSON.stringify(r),block_type:l},success:function(e){if(e&&e.success){var t=e.count||0;a.removeClass("no-matches clickable"),0===t?(a.find(".preview-count").text(t),a.addClass("no-matches").show()):(a.find(".preview-count").text(t),a.addClass("clickable").show())}else a.hide().removeClass("clickable")},error:function(){a.hide().removeClass("clickable")}})}else a.hide()}}else a.hide()}},fetchPatternMatchCount:function(t,i,a){var s=t.closest(".exclude-row"),o=-1!==((s.length?s.find(".exclude-method-select"):t.closest(".selection-group").find(".include-method-select")).val()||"").indexOf("reference")?"reference":"name",n=t.closest(".target-block").data("blockType")||"products";a.find(".preview-count").html(''),a.removeClass("clickable no-matches").show(),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countPatternMatches",trait:"EntitySelector",pattern:i,field:o,entity_type:n,case_sensitive:0},success:function(e){if(e&&e.success){var t=e.count||0;a.find(".preview-count").text(t),a.removeClass("no-matches clickable").show(),0===t?a.addClass("no-matches"):a.addClass("clickable")}else a.hide()},error:function(){a.hide()}})},getPickerValues:function(t,i){switch(i){case"entity_search":var a=[];return t.find(".entity-chip").each(function(){var t=e(this).data("id");t&&a.push(t)}),a;case"pattern":var s=this.getPatternTags(t),o=t.find(".draft-tag .pattern-input"),n=e.trim(o.val());if(n){var r="1"===o.closest(".draft-tag").attr("data-case-sensitive");s.push({pattern:n,caseSensitive:r})}return s;case"numeric_range":return{min:t.find(".range-min-input").val()||null,max:t.find(".range-max-input").val()||null};case"date_range":return{from:t.find(".date-from-input").val()||null,to:t.find(".date-to-input").val()||null};case"select":return[t.find(".select-value-input").val()];case"boolean":return[!0];default:return[]}},updateConditionCount:function(t){this.config.trans;var i=t.find(".method-selector-wrapper > .condition-match-count, > .exclude-header-row > .condition-match-count").first();if(i.length){var a=t.hasClass("exclude-row"),s=(a?t.find(".exclude-method-select"):t.find(".include-method-select")).val();if(s){var o=a?t.find(".exclude-picker"):t.find(".include-picker"),n=o.data("valueType")||"none",r=this.getPickerValues(o,n),l=!r||Array.isArray(r)&&0===r.length||"object"==typeof r&&!Array.isArray(r)&&("combination_attributes"===n&&void 0!==r.attributes&&0===Object.keys(r.attributes).length||"combination_attributes"!==n&&0===Object.keys(r).length);if("none"!==n&&"boolean"!==n&&l)i.hide();else{var c=t.closest(".target-block").data("blockType")||"products";i.find(".preview-count").html(''),i.removeClass("clickable no-matches").show(),i.data("conditionData",{method:s,values:r,blockType:c,isExclude:a}),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countConditionMatches",trait:"EntitySelector",method:s,values:JSON.stringify(r),block_type:c},success:function(e){if(e&&e.success){var t=e.count||0;i.removeClass("no-matches clickable"),0===t?(i.find(".preview-count").text(t),i.addClass("no-matches").show()):(i.find(".preview-count").text(t),i.addClass("clickable").show())}else i.hide().removeClass("clickable")},error:function(){i.hide().removeClass("clickable")}})}}else i.hide()}},updateGroupCounts:function(t){var i=this,a=t.find(".group-include");a.length&&this.updateConditionCount(a),t.find(".exclude-row").each(function(){i.updateConditionCount(e(this))}),this.updateGroupTotalCount(t)},updateGroupTotalCount:function(t){var i=t.closest(".target-block").data("blockType")||"products",a=t.find(".group-header .group-count-badge"),s=t.find(".group-modifier-limit"),o=this.serializeGroup(t,i);if(!o.include||!o.include.method)return a.hide(),void s.attr("placeholder","–");a.html('').show(),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countGroupItems",trait:"EntitySelector",group_data:JSON.stringify(o),block_type:i},success:function(e){if(e&&e.success){var n=e.final_count||0,r=e.exclude_count||0,l=' '+n;r>0&&(l+=' (-'+r+")"),a.html(l),a.addClass("clickable").show(),a.data("groupData",o),a.data("blockType",i),a.data("finalCount",n),s.attr("placeholder",n);var c=t.find(".group-preview-badge .preview-count");if(c.length){var d=parseInt(s.val(),10),p=d>0&&dn&&(n=t)});var r=n+1,l=this.buildMethodOptions(o,!1),c=(this.buildMethodOptions(o,!0),'
');c+='
',c+='',c+='',c+='',c+='',c+="",c+='",c+="
",c+='
',c+='
',c+='
',c+='
',c+='",c+=' 0',c+='',c+="
",c+='",c+="
",c+="
",c+='
',c+='",c+="
",c+='
',c+='',c+=''+(s.limit||"Limit")+"",c+='',c+="",c+='',c+=''+(s.sort||"Sort")+"",c+='",c+='",c+="",c+='',c+=' ',c+="",c+="
",c+="
",c+="
",a.append(c);var d=a.find('.selection-group[data-group-index="'+r+'"]');this.enhanceMethodSelect(d.find(".include-method-select")),d.find(".include-method-select").val("all").trigger("change"),this.updateBlockStatus(t),this.serializeAllBlocks()},removeGroup:function(e,t){e.remove();var i=t.find(".groups-container");if(0===i.find(".selection-group").length){var a='
';a+=''+this.getEmptyStateText(t)+"",a+="
",i.html(a)}this.updateBlockStatus(t),this.serializeAllBlocks(),this.updateTabBadges()},clearAllConditions:function(){var t=this;this.$wrapper.find(".target-block").each(function(){var i=e(this),a=i.find(".groups-container");a.find(".selection-group").remove();var s='
';s+=''+t.getEmptyStateText(i)+"",s+="
",a.html(s),t.updateBlockStatus(i)}),this.serializeAllBlocks(),this.updateTabBadges(),this.updateHeaderTotalCount()},switchToBlock:function(e){this.$wrapper.find(".target-block-tab").removeClass("active"),this.$wrapper.find('.target-block-tab[data-block-type="'+e+'"]').addClass("active"),this.$wrapper.find(".target-block").removeClass("active").hide(),this.$wrapper.find('.target-block[data-block-type="'+e+'"]').addClass("active").show(),this.hideDropdown()},updateTabBadges:function(){var t=this,i=[];this.$wrapper.find(".target-block-tab").each(function(){var a=e(this),s=a.data("blockType"),o=t.$wrapper.find('.target-block[data-block-type="'+s+'"]').find(".selection-group").length,n=a.find(".tab-badge");o>0?(n.length?n.addClass("loading").html(''):a.append(''),a.addClass("has-data"),i.push(s)):(n.remove(),a.removeClass("has-data"))}),this.updateTargetSwitchState(),i.length>0&&this.fetchAllCounts(i)},updateTargetSwitchState:function(){var t=this.$wrapper.find(".prestashop-switch");if(t.length){var i=!1;this.$wrapper.find(".target-block").each(function(){if(e(this).find(".selection-group").length>0)return i=!0,!1}),i?t.find('input[value="0"]').prop("checked",!0):t.find('input[value="1"]').prop("checked",!0)}},fetchAllCounts:function(t){var i=this,a=this.$wrapper.find('input[name="'+this.config.name+'"]'),s={};try{s=JSON.parse(a.val()||"{}")}catch(e){s={}}var o={};t.forEach(function(e){var t=s[e]&&s[e].groups?s[e].groups:[];t.length>0&&(o[e]={groups:t})}),0!==Object.keys(o).length?e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewEntitySelectorBulk",trait:"EntitySelector",conditions:JSON.stringify(o)},success:function(e){e.success&&e.counts?(Object.keys(e.counts).forEach(function(t){var a=e.counts[t],s=i.$wrapper.find('.target-block-tab[data-block-type="'+t+'"]'),o=s.find(".tab-badge");o.length&&(o.removeClass("loading").html(' '+a),s.data("previewData",{count:a,success:!0}))}),t.forEach(function(t){if(!(t in e.counts)){var a=i.$wrapper.find('.target-block-tab[data-block-type="'+t+'"]');a.find(".tab-badge").remove(),a.removeClass("has-data")}}),i.updateHeaderTotalCount()):t.forEach(function(e){i.$wrapper.find('.target-block-tab[data-block-type="'+e+'"]').find(".tab-badge").remove()})},error:function(e,a,s){t.forEach(function(e){i.$wrapper.find('.target-block-tab[data-block-type="'+e+'"]').find(".tab-badge").remove()})}}):t.forEach(function(e){var t=i.$wrapper.find('.target-block-tab[data-block-type="'+e+'"]');t.find(".tab-badge").remove(),t.removeClass("has-data")})},fetchProductCount:function(t,i){var a=this,s={},o=this.$wrapper.find('input[name="'+this.config.name+'"]'),n={};try{n=JSON.parse(o.val()||"{}")}catch(e){n={}}var r=n[t]&&n[t].groups?n[t].groups:[];if(0===r.length)return i.find(".tab-badge").remove(),i.removeClass("has-data"),void i.removeData("previewData");var l=i.find(".tab-badge");l.length?l.addClass("loading").html(''):(l=e(''),i.append(l)),i.addClass("has-data"),s[t]={groups:r},e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewEntitySelector",trait:"EntitySelector",conditions:JSON.stringify(s),block_type:t,limit:10},success:function(e){e.success?(i.find(".tab-badge").removeClass("loading").html(' '+e.count),i.data("previewData",e),a.updateHeaderTotalCount()):i.find(".tab-badge").remove()},error:function(e,t,s){i.find(".tab-badge").remove(),a.updateHeaderTotalCount()}})},updateHeaderTotalCount:function(){var t=0;this.$wrapper.find(".target-block-tab .tab-badge").each(function(){var i=e(this);if(!i.hasClass("loading")){var a=parseInt(i.text(),10);isNaN(a)||(t+=a)}});var i=this.$wrapper.find(".trait-total-count");t>0?(i.find(".count-value").text(t),i.show()):i.hide(),this.updateShowAllToggle()},updateShowAllToggle:function(){var e=this.$wrapper.find(".trait-show-all-toggle");if(e.length){var t=e.find(".show-all-checkbox"),i=this.$wrapper.find(".target-block-tab.has-data").length>0;t.prop("checked",!i)}},updateBlockStatus:function(e){var t=e.find(".block-status"),i=e.data("blockType"),a=this.config.blocks[i]||{},s=this.config.trans||{},o=this.getBlockGroups(e);0===o.length?!1!==this.config.emptyMeansAll?t.text((s.all||"All")+" "+(a.entity_label_plural||"items")):t.text(s.nothing_selected||"Nothing selected"):t.text(o.length+" "+(1===o.length?s.group||"group":s.groups||"groups"))},getEmptyStateText:function(e){var t=e.data("blockType"),i=e.data("mode")||"multi",a=this.config.blocks[t]||{},s=this.config.trans||{},o=!1!==this.config.emptyMeansAll;return"single"===i?s.no_item_selected||"No item selected":o?(s.all||"All")+" "+(a.entity_label_plural||"items")+" "+(s.included||"included"):s.nothing_selected||"Nothing selected"},serializeGroup:function(t,i){var a=this,s=t.find(".include-method-select").val()||"all",o=t.find(".include-picker"),n=this.getPickerValues(o),r=[];t.find(".group-excludes.has-excludes").length&&t.find(".exclude-row").each(function(){var t=e(this),i=t.find(".exclude-method-select").val()||null,s=t.find(".exclude-picker"),o=a.getPickerValues(s);i&&o&&(!Array.isArray(o)||o.length>0)&&r.push({method:i,values:o})});var l={include:{method:s,values:n}};r.length>0&&(l.excludes=r);var c=this.getGroupModifiers(t);return(c.limit||c.sort_by)&&(l.modifiers=c),l},serializeAllBlocks:function(t){var i=this,a={};this.$wrapper.find(".target-block").each(function(){var t=e(this),s=t.data("blockType"),o=i.getBlockGroups(t);o.length>0&&(a[s]={groups:o}),i.updateBlockStatus(t)});var s=this.$wrapper.find('input[name="'+this.config.name+'"]'),o=JSON.stringify(a);s.val(o),this.updateTabBadges(),this.countUpdateTimeout&&clearTimeout(this.countUpdateTimeout),this.countUpdateTimeout=setTimeout(function(){if(t&&t.length){i.updateConditionCount(t);var e=t.closest(".selection-group");e.length&&i.updateGroupTotalCount(e)}else i.updateAllConditionCounts()},500)},getBlockGroups:function(t){var i=this,a=[];return t.find(".selection-group").each(function(){var t=e(this),s=t.find(".include-method-select").val()||"all",o=t.find(".include-picker"),n=i.getPickerValues(o);if(!i.isConditionValid(s,n,o))return!0;var r=[];t.find(".group-excludes.has-excludes").length&&t.find(".exclude-row").each(function(){var t=e(this),a=t.find(".exclude-method-select").val()||null,s=t.find(".exclude-picker"),o=i.getPickerValues(s);a&&i.isConditionValid(a,o,s)&&r.push({method:a,values:o})});var l={include:{method:s,values:n}},c=e.trim(t.attr("data-group-name")||"");c&&(l.name=c),r.length>0&&(l.excludes=r);var d=i.getGroupModifiers(t);(d.limit||d.sort_by)&&(l.modifiers=d),a.push(l)}),a},getGroupModifiers:function(e){var t=e.find(".group-modifier-limit").val(),i=e.find(".group-modifier-sort").val()||"sales",a=e.find(".group-modifiers .btn-sort-dir").data("dir")||"DESC";return{limit:t?parseInt(t,10):null,sort_by:i||null,sort_dir:a||"DESC"}},getPickerValues:function(t){var i=t.attr("data-value-type")||"entity_search",a=[];switch(i){case"entity_search":t.find(".entity-chip").each(function(){var t=e(this).data("id");a.push(isNaN(t)?t:Number(t))});break;case"pattern":a=this.getPatternTags(t);var s=t.find(".draft-tag .pattern-input"),o=e.trim(s.val());if(o){var n="1"===s.closest(".draft-tag").attr("data-case-sensitive");a.push({pattern:o,caseSensitive:n})}break;case"numeric_range":var r=t.find(".range-min-input").val(),l=t.find(".range-max-input").val();""===r&&""===l||(a={min:""!==r?parseFloat(r):null,max:""!==l?parseFloat(l):null});break;case"date_range":var c=t.find(".date-from-input").val(),d=t.find(".date-to-input").val();(c||d)&&(a={from:c||null,to:d||null});break;case"select":var p=t.find(".select-value-input").val();p&&(a=[p]);break;case"boolean":a=[!0];break;case"multi_numeric_range":var u=[];t.find(".range-chip").each(function(){var t=e(this),i=t.data("min"),a=t.data("max");u.push({min:""!==i&&void 0!==i?parseFloat(i):null,max:""!==a&&void 0!==a?parseFloat(a):null})}),u.length>0&&(a=u);break;case"multi_select_tiles":t.find(".tile-option.selected").each(function(){a.push(e(this).data("value"))});break;case"combination_attributes":var h={};if(t.find(".comb-attr-value.selected").each(function(){var t=e(this).data("groupId").toString(),i=e(this).data("valueId");h[t]||(h[t]=[]),h[t].push(i)}),Object.keys(h).length>0){var f,v=t.find(".combination-attributes-picker").data("combinationMode")||this.config.combinationMode||"products";f="toggle"===v?t.find(".comb-mode-radio:checked").val()||"products":v,a={mode:f,attributes:h}}}return a},isConditionValid:function(e,t,i){if("all"===e)return!0;var a=i.attr("data-value-type")||"entity_search";return"boolean"===a||(Array.isArray(t)?t.length>0:"object"==typeof t&&null!==t&&("combination_attributes"===a&&void 0!==t.attributes?Object.keys(t.attributes).length>0:Object.keys(t).some(function(e){return null!==t[e]&&""!==t[e]})))},updateAllConditionCounts:function(){var t=this,i={},a={},s=0;this.$wrapper.find(".target-block.active .selection-group").each(function(){var o=e(this),n=o.closest(".target-block").data("blockType")||"products",r=o.find(".group-include");if(r.length){var l=t.getConditionData(r,n);if(l){var c="c"+s++;i[c]=l.condition,a[c]=l.$countEl}}o.find(".exclude-row").each(function(){var o=t.getConditionData(e(this),n);if(o){var r="c"+s++;i[r]=o.condition,a[r]=o.$countEl}})}),0!==Object.keys(i).length&&e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countConditionMatchesBulk",trait:"EntitySelector",conditions:JSON.stringify(i)},success:function(e){e&&e.success&&e.counts&&Object.keys(e.counts).forEach(function(t){var i=e.counts[t]||0,s=a[t];s&&s.length&&(s.removeClass("no-matches clickable"),0===i?(s.find(".preview-count").text(i),s.addClass("no-matches").show()):(s.find(".preview-count").text(i),s.addClass("clickable").show()))})},error:function(){Object.keys(a).forEach(function(e){var t=a[e];t&&t.length&&t.hide().removeClass("clickable")})}})},getConditionData:function(e,t){var i=e.find(".method-selector-wrapper > .condition-match-count, > .exclude-header-row .condition-match-count").first();if(!i.length)return null;var a=e.hasClass("exclude-row"),s=(a?e.find(".exclude-method-select"):e.find(".include-method-select")).val();if(!s)return i.hide(),null;var o=a?e.find(".exclude-picker"):e.find(".include-picker"),n=o.data("valueType")||o.attr("data-value-type")||"none";if("none"===n&&"countries"===t&&"all"===s){var r=this;return setTimeout(function(){r.updateConditionCount(e,t)},0),null}var l=o.attr("data-search-entity")||"";if("countries"===t&&"entity_search"===n&&"countries"===l)return r=this,setTimeout(function(){r.updateConditionCount(e,t)},0),null;if("none"===n)return i.hide(),null;var c=this.getPickerValues(o,n),d=!c||Array.isArray(c)&&0===c.length||"object"==typeof c&&!Array.isArray(c)&&("combination_attributes"===n&&void 0!==c.attributes&&0===Object.keys(c.attributes).length||"combination_attributes"!==n&&0===Object.keys(c).length);return"boolean"!==n&&d?(i.hide(),null):(i.find(".preview-count").html(''),i.removeClass("clickable no-matches").show(),i.data("conditionData",{method:s,values:c,blockType:t,isExclude:a}),{condition:{method:s,values:c,block_type:t},$countEl:i})},updateGroupCounts:function(t){var i=this,a=t.closest(".target-block").data("blockType")||"products",s=t.find(".group-include");s.length&&this.updateConditionCount(s,a),t.find(".exclude-row").each(function(){i.updateConditionCount(e(this),a)}),this.updateGroupTotalCount(t)},updateConditionCount:function(t,i){var a=this,s=t.find(".method-selector-wrapper > .condition-match-count, > .exclude-header-row .condition-match-count").first();if(s.length){var o=t.hasClass("exclude-row"),n=(o?t.find(".exclude-method-select"):t.find(".include-method-select")).val();if(n){var r=o?t.find(".exclude-picker"):t.find(".include-picker"),l=r.data("valueType")||"none",c=r.attr("data-search-entity")||"";if(!i){var d=t.closest(".target-block");i=d.data("blockType")||"products"}if("none"===l&&"countries"===i&&"all"===n)return s.find(".preview-count").html(''),s.removeClass("clickable no-matches country-holidays").show(),void e.ajax({url:a.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"searchTargetEntities",trait:"EntitySelector",entity_type:"countries",query:"",limit:500},success:function(t){var r=t.results||t.items||[];if(t&&t.success&&r.length>0){var l=r.map(function(e){return e.id});s.data("conditionData",{method:n,values:l,blockType:i,isExclude:o,isCountryHolidays:!0,countryIds:l,isAllCountries:!0}),e.ajax({url:a.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getHolidaysForCountries",trait:"EntitySelector",country_ids:l.join(","),count_only:1},success:function(e){if(e&&e.success){var t=e.total_count||0;s.removeClass("no-matches clickable"),s.addClass("country-holidays"),0===t?(s.find(".preview-count").text(t),s.addClass("no-matches").show()):(s.find(".preview-count").text(t),s.addClass("clickable").show()),s.data("countriesInfo",e.countries||[])}else s.hide().removeClass("clickable")},error:function(){s.hide().removeClass("clickable")}})}else s.hide().removeClass("clickable")},error:function(){s.hide().removeClass("clickable")}});if("none"!==l){var p=this.getPickerValues(r,l),u=!p||Array.isArray(p)&&0===p.length||"object"==typeof p&&!Array.isArray(p)&&("combination_attributes"===l&&void 0!==p.attributes&&0===Object.keys(p.attributes).length||"combination_attributes"!==l&&0===Object.keys(p).length);if("boolean"!==l&&u)s.hide();else{i||(d=t.closest(".target-block"),i=d.data("blockType")||"products");var h="countries"===c&&"entity_search"===l;if(s.find(".preview-count").html(''),s.removeClass("clickable no-matches country-holidays").show(),h&&Array.isArray(p)&&p.length>0)return s.data("conditionData",{method:n,values:p,blockType:i,isExclude:o,isCountryHolidays:!0,countryIds:p}),void e.ajax({url:a.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getHolidaysForCountries",trait:"EntitySelector",country_ids:p.join(","),count_only:1},success:function(e){if(e&&e.success){var t=e.total_count||0;s.removeClass("no-matches clickable"),s.addClass("country-holidays"),0===t?(s.find(".preview-count").text(t),s.addClass("no-matches").show()):(s.find(".preview-count").text(t),s.addClass("clickable").show()),s.data("countriesInfo",e.countries||[])}else s.hide().removeClass("clickable")},error:function(){s.hide().removeClass("clickable")}});s.data("conditionData",{method:n,values:p,blockType:i,isExclude:o}),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countConditionMatches",trait:"EntitySelector",method:n,values:JSON.stringify(p),block_type:i},success:function(e){if(e&&e.success){var t=e.count||0;s.removeClass("no-matches clickable"),0===t?(s.find(".preview-count").text(t),s.addClass("no-matches").show()):(s.find(".preview-count").text(t),s.addClass("clickable").show())}else s.hide().removeClass("clickable")},error:function(){s.hide().removeClass("clickable")}})}}else s.hide()}else s.hide()}},updateGroupTotalCount:function(t){var i=t.closest(".target-block").data("blockType")||"products",a=t.find(".group-header .group-count-badge"),s=t.find(".group-modifier-limit"),o=this.serializeGroup(t,i);if(!o.include||!o.include.method)return a.hide(),void s.attr("placeholder","–");a.html('').show(),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"countGroupItems",trait:"EntitySelector",group_data:JSON.stringify(o),block_type:i},success:function(e){if(e&&e.success){var n=e.final_count||0,r=e.exclude_count||0,l=' '+n;r>0&&(l+=' (-'+r+")"),a.html(l),a.addClass("clickable").show(),a.data("groupData",o),a.data("blockType",i),a.data("finalCount",n),s.attr("placeholder",n);var c=t.find(".group-preview-badge .preview-count");if(c.length){var d=parseInt(s.val(),10),p=d>0&&d';s+=' '+(a.except||"EXCEPT")+"",s+="",s+='
',s+=this.buildExcludeRowHtml(t,0),s+="
",s+='",i.addClass("has-excludes").html(s);var o=i.find('.exclude-row[data-exclude-index="0"]'),n=o.find(".exclude-method-select");this.enhanceMethodSelect(n);var r=t.data("blockType"),l=n.val();this.updateMethodInfoPlaceholder(o.find(".method-selector-wrapper"),l,r),this.updateMethodSelectorLock(e,!0),this.serializeAllBlocks()},addExcludeRow:function(t,i){var a=t.find(".exclude-rows-container"),s=-1;a.find(".exclude-row").each(function(){var t=parseInt(e(this).data("excludeIndex"),10);t>s&&(s=t)});var o=s+1,n=this.buildExcludeRowHtml(i,o);a.append(n);var r=a.find('.exclude-row[data-exclude-index="'+o+'"]'),l=r.find(".exclude-method-select");this.enhanceMethodSelect(l);var c=i.data("blockType"),d=l.val();this.updateMethodInfoPlaceholder(r.find(".method-selector-wrapper"),d,c),this.serializeAllBlocks()},buildExcludeRowHtml:function(t,i){var a=t.data("blockType"),s=(this.config.blocks[a]||{}).selection_methods||{},o=this.config.trans||{},n=this.buildMethodOptions(s,!0),r=a,l="entity_search";e.each(s,function(e,t){return"all"===e||(r=t.search_entity||a,l=t.value_type||"entity_search",!1)});var c='
';return c+='
',c+='
',c+='",c+=' 0',c+='',c+="
",c+='",c+="
",(c+=this.buildValuePickerHtml("exclude",l,r,s))+"
"},removeExcludeRow:function(e,t,i){var a=t.find(".exclude-rows-container"),s=this.config.trans||{};e.remove(),0===a.find(".exclude-row").length&&(t.find(".group-excludes").removeClass("has-excludes").html('"),this.updateMethodSelectorLock(t,!1)),this.serializeAllBlocks()},buildMethodOptions:function(t,i){var a=this,s=this.config.trans||{},o="",n={select_by:s.select_by||"Select by...",filter_by:s.filter_by||"Filter by..."},r={},l={};return e.each(t,function(e,t){if(i&&"all"===e)return!0;var a=t.group||"";a?(r[a]||(r[a]={}),r[a][e]=t):l[e]=t}),e.each(l,function(e,t){o+=a.buildMethodOption(e,t)}),e.each(r,function(t,i){var s=n[t]||t.replace(/_/g," ");o+='',e.each(i,function(e,t){o+=a.buildMethodOption(e,t)}),o+=""}),o},buildMethodOption:function(e,t){var i='"},buildValuePickerHtml:function(e,t,i,a){var s=this.config.trans||{},o=e+"-picker",n=e+"-chips",r=e+"-values-data",l="";if("none"===t)return l='";switch(l='
',t){case"entity_search":var c=s.no_items_selected||"No items selected - use search below";l+='
',l+='",l+='';break;case"pattern":var d=""+this.escapeHtml(s.pattern_help_title||"Pattern Syntax")+"";d+='
',d+='
* '+this.escapeHtml(s.pattern_help_wildcard||"any text (wildcard)")+"
",d+='
{number} '+this.escapeHtml(s.pattern_help_number||"any number (e.g. 100, 250)")+"
",d+='
{letter} '+this.escapeHtml(s.pattern_help_letter||"single letter (A-Z)")+"
",d+="
",d+='
',d+=""+this.escapeHtml(s.pattern_help_examples||"Examples:")+"",d+='
*cotton* '+this.escapeHtml(s.pattern_example_1||'contains "cotton"')+"
",d+='
iPhone {number} Pro* '+this.escapeHtml(s.pattern_example_2||'matches "iPhone 15 Pro Max"')+"
",d+='
Size {letter} '+this.escapeHtml(s.pattern_example_3||'matches "Size M", "Size L"')+"
",d+="
";var p=s.no_patterns||"No patterns - press Enter to add";l+='
',l+='
',l+='
',l+='',l+='',l+=' ',l+='',l+="
",l+='',l+='',l+="",l+="
",l+='';break;case"numeric_range":l+='
',l+='',l+='-',l+='',l+="
",l+='';break;case"multi_numeric_range":l+='
',l+='
',l+='
',l+='',l+='-',l+='',l+='',l+="
",l+="
",l+='';break;case"multi_select_tiles":l+='
',l+="
",l+='';break;case"date_range":l+='
',l+='',l+='-',l+='',l+="
",l+='';break;case"select":l+='
',l+='',l+="
",l+='';break;case"boolean":l+='
',l+=''+this.escapeHtml(s.yes||"Yes")+"",l+="
",l+='';break;case"combination_attributes":this.escapeHtml(s.combination_help_title||"Combination Targeting"),this.escapeHtml(s.combination_help_desc||"Select attributes to target specific product combinations."),this.escapeHtml(s.combination_help_logic||"Logic:"),this.escapeHtml(s.combination_help_within||"Within group: OR (Red OR Blue)"),this.escapeHtml(s.combination_help_between||"Between groups: AND (Color AND Size)");var u=this.config.combinationMode||"products",h="toggle"===u,f=h?"products":u;l+='
',h&&(l+='
',l+='",l+='",l+="
"),l+='
',l+=' '+this.escapeHtml(s.loading||"Loading...")+"",l+="
",l+="
",l+='';break;default:l+=''}return l+"
"},getSortOptionsArray:function(e){var t=this.config.trans||{};switch(e){case"products":return[{value:"sales",label:t.sort_bestsellers||"Best sellers"},{value:"date_add",label:t.sort_newest||"Newest"},{value:"price",label:t.sort_price||"Price"},{value:"name",label:t.sort_name||"Name"},{value:"position",label:t.sort_position||"Position"},{value:"quantity",label:t.sort_stock||"Stock quantity"},{value:"random",label:t.sort_random||"Random"}];case"categories":return[{value:"name",label:t.sort_name||"Name"},{value:"position",label:t.sort_position||"Position"},{value:"product_count",label:t.sort_products||"Products count"},{value:"date_add",label:t.sort_newest||"Newest"}];default:return[{value:"name",label:t.sort_name||"Name"},{value:"date_add",label:t.sort_newest||"Newest"}]}},getSortIconClass:function(e,t){var i="ASC"===t;switch(e){case"name":return i?"icon-sort-alpha-asc":"icon-sort-alpha-desc";case"price":case"quantity":case"product_count":case"date_add":case"newest_products":case"position":return i?"icon-sort-numeric-asc":"icon-sort-numeric-desc";case"sales":case"total_sales":default:return i?"icon-sort-amount-asc":"icon-sort-amount-desc";case"random":return"icon-random"}},cycleSortOption:function(e,t){for(var i,a,s,o=this.getSortOptionsArray(t),n=e.data("sort")||"sales",r=e.data("dir")||"DESC",l=-1,c=0;c0)return t=!0,!1}),t?(this.clearValidationError(),!0):(this.showValidationError(),!1)},showValidationError:function(){this.$wrapper.addClass("has-validation-error");var t=this.$wrapper.data("required-message")||"Please select at least one item";this.$wrapper.find(".trait-validation-error").remove();var i=e("
",{class:"trait-validation-error",html:' '+t});this.$wrapper.find(".condition-trait-header").after(i),e("html, body").animate({scrollTop:this.$wrapper.offset().top-100},300),this.$wrapper.find(".condition-trait-body").is(":visible")||(this.$wrapper.find(".condition-trait-body").slideDown(200),this.$wrapper.removeClass("collapsed"))},clearValidationError:function(){this.$wrapper.removeClass("has-validation-error"),this.$wrapper.find(".trait-validation-error").remove()}}}(jQuery),function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.methods={initMethodDropdowns:function(){var t=this;this.$wrapper.find(".include-method-select").each(function(){t.enhanceMethodSelect(e(this))}),this.$wrapper.find(".exclude-method-select").each(function(){t.enhanceMethodSelect(e(this))}),this.initMethodInfoPlaceholders()},initMethodInfoPlaceholders:function(){var t=this;this.$wrapper.find(".selection-group").each(function(){var i=e(this),a=i.closest(".target-block").data("blockType")||"products",s=i.find(".include-method-select").val()||"all";t.updateMethodInfoPlaceholder(i.find(".method-selector-wrapper"),s,a),i.find(".exclude-row").each(function(){var i=e(this),s=i.find(".exclude-method-select").val();s&&t.updateMethodInfoPlaceholder(i.find(".method-selector-wrapper"),s,a)})})},enhanceMethodSelect:function(t){var i=this;if(t.length&&!t.data("methodDropdownInit")){t.data("methodDropdownInit",!0),t.addClass("method-select-hidden");var a=t.find("option:selected"),s=a.data("icon")||"icon-caret-down",o=a.text(),n='
';n+='',n+=''+this.escapeHtml(o)+"",n+='';var r=e(n+="
");t.after(r),r.on("click",function(e){e.preventDefault(),e.stopPropagation(),t.closest(".method-selector-wrapper").hasClass("selector-locked")||i.showMethodDropdownMenu(t,r)}),t.on("change.methodDropdown",function(){i.updateMethodTrigger(t,r)})}},updateMethodTrigger:function(e,t){var i=e.find("option:selected"),a=i.data("icon")||"icon-caret-down",s=i.text();t.find(".method-trigger-icon").attr("class",a+" method-trigger-icon"),t.find(".method-trigger-label").text(s)},showMethodDropdownMenu:function(t,i){var a=this;this.closeMethodDropdownMenu();var s=this.buildMethodDropdownMenuHtml(t),o=e(s),n=i.offset(),r=i.outerWidth(),l=i.outerHeight();o.css({position:"absolute",top:n.top+l+2,left:n.left,minWidth:r,zIndex:10001}),e("body").append(o),this.$methodDropdownMenu=o,this.$methodDropdownSelect=t,this.$methodDropdownTrigger=i,o.on("click",".method-dropdown-item",function(i){i.preventDefault(),i.stopPropagation();var s=e(this).data("value");t.val(s).trigger("change"),a.closeMethodDropdownMenu()}),e(document).on("click.methodDropdown",function(t){e(t.target).closest(".method-dropdown-menu, .method-dropdown-trigger").length||a.closeMethodDropdownMenu()}),e(document).on("keydown.methodDropdown",function(e){27===e.keyCode&&a.closeMethodDropdownMenu()})},buildMethodDropdownMenuHtml:function(t){var i=this,a='
';return t.children("option").each(function(){var t=e(this),s=t.data("icon")||"icon-asterisk",o=t.text(),n=t.val(),r=t.is(":selected");a+='
',a+='',a+=''+i.escapeHtml(o)+"",r&&(a+=''),a+="
"}),t.children("optgroup").each(function(){var t=e(this),s=t.attr("label")||"";a+='
',a+='
'+i.escapeHtml(s)+"
",a+='
',t.children("option").each(function(){var t=e(this),s=t.data("icon")||"icon-cog",o=t.text(),n=t.val(),r=t.is(":selected");a+='
',a+='',a+=''+i.escapeHtml(o)+"",r&&(a+=''),a+="
"}),a+="
",a+="
"}),a+="
"},closeMethodDropdownMenu:function(){this.$methodDropdownMenu&&(this.$methodDropdownMenu.remove(),this.$methodDropdownMenu=null),this.$methodDropdownSelect=null,this.$methodDropdownTrigger=null,e(document).off("click.methodDropdown keydown.methodDropdown")},populateTiles:function(t,i,a){var s=t.find(".multi-select-tiles");s.empty(),a?s.attr("data-exclusive","true"):s.removeAttr("data-exclusive"),e.each(i,function(t,i){var a="object"==typeof i?i.label:i,o="object"==typeof i&&i.icon?i.icon:null,n="object"==typeof i&&i.color?i.color:null,r="tile-option";n&&(r+=" tile-color-"+n);var l=e("',c+="
",c+='
',c+='',c+="
",o.length>0){if(c+='
',c+=this.renderPreviewItems(o),c+="
",r){var d=n-o.length;c+='"}}else c+='
'+(a.no_preview||"No items to preview")+"
";var p=e(c+="");e("body").append(p),this.$previewPopover=p,this.$previewList=p.find(".preview-list"),this.previewLoadedCount=o.length,this.previewTotalCount=n,this.previewContext=t.context||{},this.previewOnLoadMore=t.onLoadMore||null,this.previewOnFilter=t.onFilter||null,this.previewCurrentFilter="",this.previewEntityLabel=l,p.find(".preview-close").on("click",function(){i.hidePreviewPopover()});var u=p.find(".preview-filter-input");if(t.onFilter){var h=this.debounce(function(e){i.previewCurrentFilter=e,i.showFilterLoading(!0),t.onFilter.call(i,e)},300);u.on("input",function(){var t=e(this).val().trim();t!==i.previewCurrentFilter&&h(t)})}else u.on("input",function(){var t=e(this).val().toLowerCase().trim();i.filterPreviewItems(t)});return t.onLoadMore&&p.find(".btn-load-more").on("click",function(){var a=e(this),s=a.closest(".load-more-controls").find(".load-more-select");if(!a.hasClass("loading")){a.addClass("loading"),a.find("i").removeClass("icon-plus").addClass("icon-spinner icon-spin"),s.prop("disabled",!0);var o=parseInt(s.val(),10)||20;i.previewLoadCount=o,t.onLoadMore.call(i,a)}}),this.positionPopover(p,s),p.addClass("show"),p},positionPopover:function(t,i,a){var s,o=i[0].getBoundingClientRect(),n=e(window).scrollTop(),r=e(window).scrollLeft(),l=t.outerWidth(),c=t.outerHeight(),d=e(window).width(),p=e(window).height(),u=o.left+r+o.width/2-l/2;u=Math.max(10,Math.min(u,d-l-10));var h=!1;o.bottom+c+8>p-10?(s=o.top+n-c-8,h=!0):s=o.bottom+n+8,t.css({position:"absolute",top:s,left:u,zIndex:a||1e4}),t.toggleClass("position-above",h);var f=o.left+o.width/2,v=u;t.removeClass("position-left position-right"),f-v<.3*l?t.addClass("position-right"):f-v>.7*l&&t.addClass("position-left")},updatePreviewPopover:function(e,t){var i=this.config.trans||{};this.$previewList.html(this.renderPreviewItems(e)),this.previewLoadedCount=e.length;var a=this.$previewPopover.find(".preview-footer");if(t){var s=this.previewTotalCount-e.length,o=a.find(".load-more-controls"),n=o.find(".btn-load-more"),r=o.find(".load-more-select");n.removeClass("loading"),n.find("i").removeClass("icon-spinner icon-spin").addClass("icon-plus"),r.prop("disabled",!1),o.find(".remaining-count").text(s),r.empty(),s>=10&&r.append(''),s>=20&&r.append(''),s>=50&&r.append(''),s>=100&&r.append(''),r.append('")}else a.remove();var l=this.$previewPopover.find(".preview-filter-input").val();l&&this.filterPreviewItems(l.toLowerCase().trim())},renderPreviewItems:function(e){for(var t="",i=0;i",a.image?t+='':t+='
inventory_2
',t+='
',t+='
'+this.escapeHtml(a.name||"Unnamed")+"
";var n=[];a.reference&&n.push("Ref: "+a.reference),a.manufacturer&&n.push(a.manufacturer),a.category&&n.push(a.category),a.attributes&&n.push(a.attributes),n.length>0&&(t+='
'+this.escapeHtml(n.join(" • "))+"
"),t+="
",void 0!==a.price&&null!==a.price?t+='
'+this.formatPrice(a.price)+"
":a.price_formatted&&(t+='
'+this.escapeHtml(a.price_formatted)+"
"),void 0===a.active||a.active||(t+='Inactive'),t+=""}return t},filterPreviewItems:function(t){if(this.$previewList){var i=this.$previewList.find(".preview-item");t?i.each(function(){var i=e(this),a=i.data("name")||"",s=i.data("ref")||"",o=i.data("attrs")||"",n=-1!==a.indexOf(t)||-1!==s.indexOf(t)||-1!==o.indexOf(t);i.toggle(n)}):i.show()}},showFilterLoading:function(e){if(this.$previewPopover){var t=this.$previewList;t&&(e?(this.previewLockedWidth||(this.previewLockedWidth=this.$previewPopover.outerWidth(),this.$previewPopover.css("width",this.previewLockedWidth+"px")),t.addClass("filtering"),t.find(".filter-loading-overlay").length||t.append('
')):(t.removeClass("filtering"),t.find(".filter-loading-overlay").remove()))}},updatePreviewPopoverFiltered:function(t){var i=this.config.trans||{};if(this.showFilterLoading(!1),t.success){var a=t.items||[],s=t.count||0,o=t.hasMore||!1,n=this.$previewPopover.find(".preview-header"),r=this.previewEntityLabel||"items";if(n.find(".preview-count").text(s+" "+r),a.length>0)this.$previewList.html(this.renderPreviewItems(a)),this.previewLoadedCount=a.length,this.previewTotalCount=s;else{var l=i.no_filter_results||"No matching items found";this.$previewList.html('
'+l+"
"),this.previewLoadedCount=0,this.previewTotalCount=0}var c=this.$previewPopover.find(".preview-footer");if(o&&a.length>0){var d=s-a.length;if(c.length){var p=c.find(".load-more-controls"),u=p.find(".btn-load-more"),h=p.find(".load-more-select");u.removeClass("loading"),u.find("i").removeClass("icon-spinner icon-spin").addClass("icon-plus"),h.prop("disabled",!1),p.find(".remaining-count").text(d),h.empty(),d>=10&&h.append(''),d>=20&&h.append(''),d>=50&&h.append(''),d>=100&&h.append(''),h.append('")}else{var f='");this.$previewList.after(v);var m=this;this.previewOnLoadMore&&v.find(".btn-load-more").on("click",function(){var t=e(this),i=t.closest(".load-more-controls").find(".load-more-select");if(!t.hasClass("loading")){t.addClass("loading"),t.find("i").removeClass("icon-plus").addClass("icon-spinner icon-spin"),i.prop("disabled",!0);var a=parseInt(i.val(),10)||20;m.previewLoadCount=a,m.previewOnLoadMore.call(m,t)}})}}else c.remove()}},formatPrice:function(e){"number"!=typeof e&&(e=parseFloat(e)||0);var t=this.config&&this.config.currency_sign||"€",i=this.config&&this.config.currency_format||"right",a=e.toFixed(2);return"left"===i?t+" "+a:a+" "+t},hidePreviewPopover:function(){this.$activeBadge&&(this.$activeBadge.removeClass("popover-open loading"),this.$activeBadge=null),this.$previewPopover&&(this.$previewPopover.remove(),this.$previewPopover=null),this.$previewList=null,this.previewContext=null,this.previewOnLoadMore=null,this.previewOnFilter=null,this.previewCurrentFilter="",this.previewEntityLabel=null,this.previewLockedWidth=null},showPreviewPopover:function(e){var t=this,i=e.data("previewData");if(i){this.hidePreviewPopover();var a=e.find(".tab-badge");a.addClass("popover-open"),this.$activeBadge=a;var s=i.items||i.products||[],o=e.data("blockType"),n=(this.config.blocks&&this.config.blocks[o]?this.config.blocks[o]:{}).entity_label_plural||"items";if(this.previewBlockType=o,0===s.length&&i.count>0)return a.addClass("loading"),void this.fetchTabPreviewItems(e,function(s,r){a.removeClass("loading"),t.createPreviewPopover({$badge:a,items:s,totalCount:i.count,hasMore:r,entityLabel:n,previewType:"tab",context:{$tab:e,blockType:o},onLoadMore:function(i){t.loadMoreTabPreviewItems(e,i)},onFilter:function(i){t.filterTabPreviewItems(e,i)}})});this.createPreviewPopover({$badge:a,items:s,totalCount:i.count,hasMore:i.hasMore,entityLabel:n,previewType:"tab",context:{$tab:e,blockType:o},onLoadMore:function(i){t.loadMoreTabPreviewItems(e,i)},onFilter:function(i){t.filterTabPreviewItems(e,i)}})}},fetchTabPreviewItems:function(t,i){var a=t.data("blockType"),s=this.$wrapper.find('input[name="'+this.config.name+'"]'),o={};try{o=JSON.parse(s.val()||"{}")}catch(e){return void i([],!1)}var n=o[a]&&o[a].groups?o[a].groups:[];if(0!==n.length){var r={};r[a]={groups:n},e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewEntitySelector",trait:"EntitySelector",conditions:JSON.stringify(r),block_type:a,limit:20,offset:0},success:function(e){var a=e.items||e.products||[],s=e.hasMore||e.count>a.length;t.data("previewData",e),i(a,s)},error:function(){i([],!1)}})}else i([],!1)},filterTabPreviewItems:function(t,i){var a=this,s=this.previewBlockType,o=this.$wrapper.find('input[name="'+this.config.name+'"]'),n={};try{n=JSON.parse(o.val()||"{}")}catch(e){return void a.showFilterLoading(!1)}var r=n[s]&&n[s].groups?n[s].groups:[];if(0!==r.length){var l={};l[s]={groups:r},e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewTargetConditions",trait:"TargetConditions",conditions:JSON.stringify(l),block_type:s,filter:i,limit:20,offset:0},success:function(e){a.updatePreviewPopoverFiltered(e)},error:function(){a.showFilterLoading(!1)}})}else a.showFilterLoading(!1)},loadMoreTabPreviewItems:function(t,i){var a=this,s=this.previewBlockType,o=this.$wrapper.find('input[name="'+this.config.name+'"]'),n={};try{n=JSON.parse(o.val()||"{}")}catch(e){return}var r=n[s]&&n[s].groups?n[s].groups:[];if(0!==r.length){var l={};l[s]={groups:r};var c=this.previewLoadCount||20,d={ajax:1,action:"previewTargetConditions",trait:"TargetConditions",conditions:JSON.stringify(l),block_type:s,limit:a.previewLoadedCount+c,offset:0};a.previewCurrentFilter&&(d.filter=a.previewCurrentFilter),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:d,success:function(e){var i=e.items||e.products||[];e.success&&i.length>0&&(t.data("previewData",e),a.previewTotalCount=e.count,a.updatePreviewPopover(i,e.hasMore))},error:function(){var e=i.closest(".load-more-controls").find(".load-more-select");i.removeClass("loading"),i.find("i").removeClass("icon-spinner icon-spin").addClass("icon-plus"),e.prop("disabled",!1)}})}},showConditionPreviewPopover:function(t){var i=this,a=t.data("conditionData");if(a)if(a.isCountryHolidays&&a.countryIds)this.showCountriesHolidayPreview(t,a.countryIds);else{this.hidePreviewPopover(),t.addClass("popover-open loading"),this.$activeBadge=t;var s=a.blockType||"products",o=(this.config.blocks&&this.config.blocks[s]?this.config.blocks[s]:{}).entity_label_plural||"products";e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewConditionItems",trait:"EntitySelector",method:a.method,values:JSON.stringify(a.values),block_type:s,limit:10},success:function(e){t.removeClass("loading"),e.success?i.createPreviewPopover({$badge:t,items:e.items||[],totalCount:e.count,hasMore:e.hasMore,entityLabel:o,previewType:"condition",context:{conditionData:a,blockType:s},onLoadMore:function(e){i.loadMoreConditionItems(e)},onFilter:function(e){i.filterConditionItems(e)}}):(t.removeClass("popover-open"),i.$activeBadge=null)},error:function(){t.removeClass("loading popover-open"),i.$activeBadge=null}})}},filterConditionItems:function(t){var i=this,a=this.previewContext;a&&a.conditionData?e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewConditionItems",trait:"EntitySelector",method:a.conditionData.method,values:JSON.stringify(a.conditionData.values),block_type:a.blockType,filter:t,limit:20},success:function(e){i.updatePreviewPopoverFiltered(e)},error:function(){i.showFilterLoading(!1)}}):i.showFilterLoading(!1)},loadMoreConditionItems:function(t){var i=this,a=this.previewContext;if(a&&a.conditionData){var s=this.previewLoadCount||20,o={ajax:1,action:"previewConditionItems",trait:"EntitySelector",method:a.conditionData.method,values:JSON.stringify(a.conditionData.values),block_type:a.blockType,limit:i.previewLoadedCount+s};i.previewCurrentFilter&&(o.filter=i.previewCurrentFilter),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:o,success:function(e){e.success&&(i.previewTotalCount=e.count,i.updatePreviewPopover(e.items||[],e.hasMore))},error:function(){var e=t.closest(".load-more-controls").find(".load-more-select");t.removeClass("loading"),t.find("i").removeClass("icon-spinner icon-spin").addClass("icon-plus"),e.prop("disabled",!1)}})}},showGroupPreviewPopover:function(t,i,a){var s=this;if(i||(i=t.closest(".selection-group")),!a){var o=t.closest(".target-block");a=o.data("blockType")||"products"}var n=t.data("groupData");if(n||(n=this.serializeGroup(i,a)),n&&n.include){this.hidePreviewPopover(),t.addClass("popover-open loading"),this.$activeBadge=t;var r=(this.config.blocks&&this.config.blocks[a]?this.config.blocks[a]:{}).entity_label_plural||"products";e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewGroupItems",trait:"EntitySelector",group_data:JSON.stringify(n),block_type:a,limit:10},success:function(e){t.removeClass("loading"),e.success?s.createPreviewPopover({$badge:t,items:e.items||[],totalCount:e.count,hasMore:e.hasMore,entityLabel:r,previewType:"group",context:{groupData:n,blockType:a,$group:i},onLoadMore:function(e){s.loadMoreGroupItems(e)},onFilter:function(e){s.filterGroupItems(e)}}):(t.removeClass("popover-open"),s.$activeBadge=null)},error:function(){t.removeClass("loading popover-open"),s.$activeBadge=null}})}},filterGroupItems:function(t){var i=this,a=this.previewContext;a&&a.groupData?e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewGroupItems",trait:"EntitySelector",group_data:JSON.stringify(a.groupData),block_type:a.blockType,filter:t,limit:20},success:function(e){i.updatePreviewPopoverFiltered(e)},error:function(){i.showFilterLoading(!1)}}):i.showFilterLoading(!1)},loadMoreGroupItems:function(t){var i=this,a=this.previewContext;if(a&&a.groupData){var s=this.previewLoadCount||20,o={ajax:1,action:"previewGroupItems",trait:"EntitySelector",group_data:JSON.stringify(a.groupData),block_type:a.blockType,limit:i.previewLoadedCount+s};i.previewCurrentFilter&&(o.filter=i.previewCurrentFilter),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:o,success:function(e){e.success&&(i.previewTotalCount=e.count,i.updatePreviewPopover(e.items||[],e.hasMore))},error:function(){t.removeClass("loading"),t.find(".load-more-text").show(),t.find(".load-more-loading").hide()}})}},showFilterGroupPreviewPopover:function(t,i,a,s){var o=this;this.hidePreviewPopover(),t.addClass("popover-open loading"),this.$activeBadge=t,e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewFilterGroupProducts",trait:"EntitySelector",group_id:i,group_type:a,limit:10},success:function(e){t.removeClass("loading"),e.success?o.createPreviewPopover({$badge:t,items:e.items||[],totalCount:e.count||0,hasMore:e.hasMore||!1,entityLabel:"products",previewType:"filter-group",context:{groupId:i,groupType:a,groupName:s},onLoadMore:function(e){o.loadMoreFilterGroupItems(e)},onFilter:function(e){o.filterFilterGroupItems(e)}}):(t.removeClass("popover-open"),o.$activeBadge=null)},error:function(){t.removeClass("loading popover-open"),o.$activeBadge=null}})},filterFilterGroupItems:function(t){var i=this,a=this.previewContext;a&&a.groupId?e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewFilterGroupProducts",trait:"EntitySelector",group_id:a.groupId,group_type:a.groupType,filter:t,limit:20},success:function(e){i.updatePreviewPopoverFiltered(e)},error:function(){i.showFilterLoading(!1)}}):i.showFilterLoading(!1)},loadMoreFilterGroupItems:function(t){var i=this,a=this.previewContext;if(a&&a.groupId){var s=this.previewLoadCount||20,o={ajax:1,action:"previewFilterGroupProducts",trait:"EntitySelector",group_id:a.groupId,group_type:a.groupType,limit:i.previewLoadedCount+s};i.previewCurrentFilter&&(o.filter=i.previewCurrentFilter),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:o,success:function(e){e.success&&(i.previewTotalCount=e.count,i.updatePreviewPopover(e.items||[],e.hasMore))},error:function(){t.removeClass("loading"),t.find(".load-more-text").show(),t.find(".load-more-loading").hide()}})}},showFilterValuePreviewPopover:function(t,i,a,s,o){var n=this;this.hidePreviewPopover(),t.addClass("popover-open loading"),this.$activeBadge=t,e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewFilterValueProducts",trait:"EntitySelector",value_id:i,value_type:a,group_id:o,limit:10},success:function(e){t.removeClass("loading"),e.success?n.createPreviewPopover({$badge:t,items:e.items||[],totalCount:e.count||0,hasMore:e.hasMore||!1,entityLabel:"products",previewType:"filter-value",context:{valueId:i,valueType:a,groupId:o,valueName:s},onLoadMore:function(e){n.loadMoreFilterValueItems(e)},onFilter:function(e){n.filterFilterValueItems(e)}}):(t.removeClass("popover-open"),n.$activeBadge=null)},error:function(){t.removeClass("loading popover-open"),n.$activeBadge=null}})},filterFilterValueItems:function(t){var i=this,a=this.previewContext;a&&a.valueId?e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewFilterValueProducts",trait:"EntitySelector",value_id:a.valueId,value_type:a.valueType,group_id:a.groupId,filter:t,limit:20},success:function(e){i.updatePreviewPopoverFiltered(e)},error:function(){i.showFilterLoading(!1)}}):i.showFilterLoading(!1)},loadMoreFilterValueItems:function(t){var i=this,a=this.previewContext;if(a&&a.valueId){var s=this.previewLoadCount||20,o={ajax:1,action:"previewFilterValueProducts",trait:"EntitySelector",value_id:a.valueId,value_type:a.valueType,group_id:a.groupId,limit:i.previewLoadedCount+s};i.previewCurrentFilter&&(o.filter=i.previewCurrentFilter),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:o,success:function(e){e.success&&(i.previewTotalCount=e.count,i.updatePreviewPopover(e.items||[],e.hasMore))},error:function(){t.removeClass("loading"),t.find("i").removeClass("icon-spinner icon-spin").addClass("icon-plus")}})}},showCategoryItemsPreview:function(t,i,a,s){var o=this;this.hidePreviewPopover(),t.addClass("popover-open loading"),this.$activeBadge=t;var n="categories"===s,r=n?"products":"pages",l=n?"previewCategoryProducts":"previewCategoryPages";e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:l,trait:"EntitySelector",category_id:i,limit:10},success:function(e){t.removeClass("loading"),e.success?o.createPreviewPopover({$badge:t,items:e.items||[],totalCount:e.count||0,hasMore:e.hasMore||!1,entityLabel:r,previewType:"category-items",context:{categoryId:i,categoryName:a,entityType:s},onLoadMore:function(e){o.loadMoreCategoryItems(e)},onFilter:function(e){o.filterCategoryItems(e)}}):(t.removeClass("popover-open"),o.$activeBadge=null)},error:function(){t.removeClass("loading popover-open"),o.$activeBadge=null}})},loadMoreCategoryItems:function(t){var i=this,a=this.previewContext;if(a&&a.categoryId){var s="categories"===a.entityType?"previewCategoryProducts":"previewCategoryPages";t.prop("disabled",!0).find("i").addClass("icon-spin"),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:s,trait:"EntitySelector",category_id:a.categoryId,offset:this.previewOffset,limit:10,query:this.previewFilterQuery||""},success:function(e){t.prop("disabled",!1).find("i").removeClass("icon-spin"),e.success&&e.items&&(i.appendPreviewItems(e.items),i.previewOffset+=e.items.length,e.hasMore||t.hide())},error:function(){t.prop("disabled",!1).find("i").removeClass("icon-spin")}})}},filterCategoryItems:function(t){var i=this,a=this.previewContext;if(a&&a.categoryId){var s="categories"===a.entityType?"previewCategoryProducts":"previewCategoryPages";e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:s,trait:"EntitySelector",category_id:a.categoryId,query:t,limit:10},success:function(e){i.showFilterLoading(!1),e.success&&(i.replacePreviewItems(e.items||[],e.count||0,e.hasMore||!1),i.previewOffset=e.items?e.items.length:0,i.previewFilterQuery=t)},error:function(){i.showFilterLoading(!1)}})}else i.showFilterLoading(!1)},showPatternPreviewModal:function(t,i,a,s){var o=this,n=this.config.trans||{},r=this.config.blocks&&this.config.blocks[i]?this.config.blocks[i]:{},l=r.entity_label_plural||"items",c=r.entity_label||"item",d='
';d+='
',d+='
',d+='',d+=' '+(n.preview||"Preview")+": "+this.escapeHtml(t)+"",d+="",d+=''+s+" "+(1===s?c:l)+"",d+='',d+="
",d+='
',d+='
'+(n.loading||"Loading...")+"
",d+="
",d+="
";var p=e(d+="
");e("body").append(p),p.find(".pattern-preview-close").on("click",function(){p.remove()}),p.on("click",function(t){e(t.target).hasClass("pattern-preview-modal-overlay")&&p.remove()}),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"previewPatternMatches",trait:"TargetConditions",pattern:t,entity_type:i,case_sensitive:a?1:0,limit:50},success:function(e){if(e.success&&e.items){var t=e.items,i='
';if(0===t.length)i+='
'+(n.no_matches||"No matches found")+"
";else{for(var a=0;a',r.image&&(i+=''),i+=''+o.escapeHtml(r.name)+"",r.id&&(i+='#'+r.id+""),i+="
"}s>t.length&&(i+='
... '+(n.and||"and")+" "+(s-t.length)+" "+(n.more||"more")+"
")}i+="",p.find(".pattern-preview-content").html(i)}else p.find(".pattern-preview-content").html('
'+(n.error_loading||"Error loading preview")+"
")},error:function(){p.find(".pattern-preview-content").html('
'+(n.error_loading||"Error loading preview")+"
")}})},refreshGroupPreviewIfOpen:function(e){this.$activeBadge&&this.$previewPopover},escapeHtml:function(e){return e?String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'"):""},escapeAttr:function(e){return e?String(e).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'"):""},showTotalPreviewPopover:function(t){var i=this,a=this.config.trans||{};this.hidePreviewPopover(),t.addClass("popover-open"),this.$activeBadge=t;var s=[];this.$wrapper.find(".target-block-tab.has-data").each(function(){var t=e(this),a=t.data("blockType"),o=t.find(".tab-badge").text().replace(/[^0-9]/g,""),n=parseInt(o,10)||0;if(n>0){i.config.blocks&&i.config.blocks[a]&&i.config.blocks[a];var r=t.find(".tab-label").prev("i").attr("class")||"icon-cube",l=t.find(".tab-label").text()||a;s.push({blockType:a,label:l,icon:r,count:n})}});var o=parseInt(t.find(".count-value").text(),10)||0,n='
';n+='
',n+=''+(a.total_summary||"Selection Summary")+"",n+=''+o+" "+(a.total_items||"total items")+"",n+="
",n+='
',n+='
    ';for(var r=0;r',n+='',n+=''+i.escapeHtml(l.label)+"",n+=''+l.count+"",n+=""}n+="
",n+="
";var c=e(n+="
");this.$previewPopover=c,c.on("click",".total-summary-item",function(){var t=e(this).data("blockType");i.hidePreviewPopover(),i.switchToBlock(t)}),e("body").append(c),this.positionPopover(c,t),c.hide().fadeIn(150)},showHolidayPreview:function(t,i,a,s){var o=this,n=this.config.trans||{};e(".holiday-preview-popover").remove();var r='
';r+='
',r+='',a&&(r+=' '),r+=this.escapeHtml(i)+" - "+(n.holidays||"Holidays"),r+="",r+='',r+="
",r+='
',r+='
sync '+(n.loading||"Loading...")+"
",r+="
";var l=e(r+="
");e("body").append(l);var c=s[0].getBoundingClientRect(),d=e(window).scrollTop(),p=e(window).scrollLeft(),u=l.outerWidth(),h=l.outerHeight(),f=e(window).width(),v=e(window).height(),m=c.bottom+d+8,g=c.left+p;g+u>f-10&&(g=f-u-10),g<10&&(g=10),c.bottom+h>v-10&&(m=c.top+d-h-8),l.css({position:"absolute",top:m,left:g,zIndex:10001}),l.find(".popover-close").on("click",function(){l.remove()}),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getHolidaysPreview",trait:"EntitySelector",id_country:t},success:function(e){if(e.success&&e.holidays&&e.holidays.length>0){for(var t='
',i=0;i',t+='
',t+=''+o.escapeHtml(a.date_formatted||a.date)+"",a.day_of_week&&(t+=''+o.escapeHtml(a.day_of_week)+""),t+="
",t+='
',t+=''+o.escapeHtml(a.name)+"",a.type&&(t+=''+o.escapeHtml(a.type)+""),t+="
",t+="
"}t+="",e.total_count&&(t+='
'+e.total_count+" "+(n.upcoming_holidays||"upcoming holidays")+"
"),l.find(".popover-body").html(t)}else{var s='
';s+='event_busy',s+="

"+(n.no_holidays||"No holidays found")+"

",s+="
",l.find(".popover-body").html(s)}var r=l.outerHeight();if(c.bottom+r>v-10){var p=c.top+d-r-8;p>10&&l.css("top",p)}},error:function(){var e='
';e+='error_outline',e+="

"+(n.error_loading||"Error loading holidays")+"

",e+="
",l.find(".popover-body").html(e)}})},showCountriesHolidayPreview:function(t,i){var a=this,s=this.config.trans||{};this.hidePreviewPopover(),e(".holiday-preview-popover").remove();var o='
';o+='
',o+='sync '+(s.loading||"Loading...")+"",o+='',o+="
",o+='
',o+='search',o+='',o+="
",o+='
',o+='
sync '+(s.loading||"Loading...")+"
",o+="
";var n=e(o+="
");e("body").append(n);var r=t[0].getBoundingClientRect(),l=e(window).scrollTop(),c=e(window).scrollLeft(),d=n.outerWidth(),p=n.outerHeight(),u=e(window).width(),h=e(window).height(),f=r.bottom+l+8,v=r.left+c;v+d>u-10&&(v=u-d-10),v<10&&(v=10),r.bottom+p>h-10&&(f=r.top+l-p-8),n.css({position:"absolute",top:f,left:v,zIndex:10001}),t.addClass("popover-open"),this.$activeBadge=t,n.find(".popover-close").on("click",function(){n.remove(),t.removeClass("popover-open"),a.$activeBadge=null}),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getHolidaysForCountries",trait:"EntitySelector",country_ids:i.join(","),count_only:0},success:function(t){if(t.success&&t.holidays&&t.holidays.length>0){var o={},c={};if(t.countries)for(var d=0;d ')}else{for(var y=0;y<2;y++){var x=v[y];x&&x.iso_code&&(m+=' ')}m+="+"+(g-2)+" "}m+=t.total_count+" "+(s.holidays||"Holidays"),n.find(".popover-title").html(m);for(var _='
',k=0;k',_+='
',_+=''+a.escapeHtml(C.date_formatted||C.date)+"",C.day_of_week&&(_+=''+a.escapeHtml(C.day_of_week)+""),_+="
",_+='
',C.country_iso&&i.length>1&&(_+=' '),_+=''+a.escapeHtml(C.name)+"",C.type&&(_+=''+a.escapeHtml(C.type)+""),_+="
",_+="
"}_+="",t.total_count&&i.length>1&&(_+='
'+(s.across_countries||"across")+" "+i.length+" "+(s.countries||"countries")+"
"),n.find(".popover-body").html(_),n.find(".holiday-filter-input").on("input",function(){var t=e(this).val().toLowerCase().trim(),a=n.find(".holiday-item"),o=0;a.each(function(){var i=e(this).attr("data-search")||"";t&&-1===i.indexOf(t)?e(this).hide():(e(this).show(),o++)});var r=n.find(".holiday-preview-note");if(t&&r.length)r.text(o+" "+(s.matches||"matches"));else if(r.length&&i.length>1){var l=(s.across_countries||"across")+" "+i.length+" "+(s.countries||"countries");r.text(l)}})}else{n.find(".popover-title").html("0 "+(s.holidays||"Holidays"));var M='
';M+='event_busy',M+="

"+(s.no_holidays||"No holidays found")+"

",M+="
",n.find(".popover-body").html(M)}var P=n.outerHeight();if(r.bottom+P>h-10){var T=r.top+l-P-8;T>10&&n.css("top",T)}},error:function(){n.find(".popover-title").html('error_outline '+(s.error||"Error"));var e='
';e+='error_outline',e+="

"+(s.error_loading||"Error loading holidays")+"

",e+="
",n.find(".popover-body").html(e)}})}}}(jQuery),function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.tree={treeData:null,treeFlatData:null,loadCategoryTree:function(){var t=this,i=this.$dropdown.find(".dropdown-results"),a=this.config.trans||{},s=this.activeGroup?this.activeGroup.searchEntity:"categories";i.html('
'+this.escapeHtml(a.loading||"Loading...")+"
"),e.ajax({url:this.config.ajaxUrl,type:"POST",dataType:"json",data:{ajax:1,action:"getCategoryTree",trait:"EntitySelector",entity_type:s},success:function(e){e.success&&e.categories&&e.categories.length>0?(t.treeFlatData=e.categories,t.treeData=t.buildTreeStructure(e.categories),t.renderCategoryTree(i,s)):i.html('")},error:function(){i.html('")}})},buildTreeStructure:function(t){var i={},a=[];return t.forEach(function(t){i[t.id]=e.extend({},t,{children:[]})}),t.forEach(function(e){var t=i[e.id],s=parseInt(e.parent_id,10);s&&i[s]?i[s].children.push(t):a.push(t)}),a},renderCategoryTree:function(e,t){var i=this.config.trans||{},a=this.getSelectedIdsFromChips(),s='
';s+='
',s+='",s+='",s+="
",s+='
',s+=this.renderTreeItems(this.treeData,0,a),s+="
",s+="
",e.html(s);var o=this.treeFlatData?this.treeFlatData.length:0,n=a.length,r=o+" "+("cms_categories"===t?"CMS categories":"categories");n>0&&(r+=" ("+n+" selected)"),this.$dropdown.find(".results-count").text(r),this.updateSelectChildrenButtons(this.$dropdown.find(".tree-item"))},renderTreeItems:function(e,t,i){var a=this,s="",o=this.config.trans||{};return e.forEach(function(e){var n=e.children&&e.children.length>0,r=-1!==i.indexOf(parseInt(e.id,10)),l=20*t,c="tree-item";n&&(c+=" has-children"),r&&(c+=" selected"),e.active||(c+=" inactive"),s+='
',s+='',n?(s+='',s+='"):s+='',s+='',s+='',s+=''+a.escapeHtml(e.name)+"";var d=e.product_count||e.page_count||0;if(d>0){var p=e.page_count?o.pages||"pages":o.products||"products";s+='',s+=' '+d,s+=""}e.active||(s+=''+a.escapeHtml(o.inactive||"Inactive")+""),s+="
",n&&(s+='
',s+=a.renderTreeItems(e.children,t+1,i),s+="
")}),s},getSelectedIdsFromChips:function(){var t=[];if(!this.activeGroup)return t;var i=this.$wrapper.find('.target-block[data-block-type="'+this.activeGroup.blockType+'"]').find('.selection-group[data-group-index="'+this.activeGroup.groupIndex+'"]');return("include"===this.activeGroup.section?i.find(".include-picker"):i.find('.exclude-row[data-exclude-index="'+this.activeGroup.excludeIndex+'"]').find(".exclude-picker")).find(".entity-chip").each(function(){t.push(parseInt(e(this).data("id"),10))}),t},filterCategoryTree:function(t){var i=this.$dropdown.find(".category-tree");if(i.length){var a=i.find(".tree-item"),s=i.find(".tree-children");if(t=(t||"").toLowerCase().trim(),a.css("display",""),!t)return a.removeClass("filtered-out filter-match"),void s.removeClass("filter-expanded");a.addClass("filtered-out").removeClass("filter-match"),a.each(function(){var i=e(this);-1!==(i.data("name")||"").toLowerCase().indexOf(t)&&(i.removeClass("filtered-out"),i.parents(".tree-children").addClass("filter-expanded"),i.parents(".tree-item").removeClass("filtered-out"),i.next(".tree-children").find(".tree-item").removeClass("filtered-out"),i.next(".tree-children").addClass("filter-expanded"))})}},findTreeDescendants:function(e,t){var i=[],a=(parseInt(e.data("id"),10),parseInt(e.data("level"),10),e.next(".tree-children"));return a.length&&a.find(".tree-item").each(function(){i.push(this)}),i},updateSelectChildrenButtons:function(t){var i=this.config.trans||{};t.filter(".has-children").each(function(){var t=e(this),a=t.find(".btn-select-children");if(a.length){var s=t.next(".tree-children");if(s.length){var o=s.find(".tree-item"),n=t.hasClass("selected"),r=!0;o.each(function(){if(!e(this).hasClass("selected"))return r=!1,!1}),n&&r?(a.find("i").removeClass("icon-plus-square").addClass("icon-minus-square"),a.attr("title",i.deselect_with_children||"Deselect with all children")):(a.find("i").removeClass("icon-minus-square").addClass("icon-plus-square"),a.attr("title",i.select_with_children||"Select with all children"))}}})}}}(jQuery),function(e){"use strict";window._EntitySelectorMixins=window._EntitySelectorMixins||{},window._EntitySelectorMixins.validation={validateSelection:function(t,i,a,s){if(!this.activeGroup)return{valid:!0};var o=this.config.trans||{};t=parseInt(t,10);var n=this.$wrapper.find('.target-block[data-block-type="'+this.activeGroup.blockType+'"]').find('.selection-group[data-group-index="'+this.activeGroup.groupIndex+'"]'),r=this.getChipIds(n.find(".include-picker")),l=[];n.find(".exclude-row").each(function(){var t=e(this).find(".exclude-picker"),i=[];t.find(".entity-chip").each(function(){i.push(parseInt(e(this).data("id"),10))}),l=l.concat(i)});var c=this.checkIncludeExcludeConflict(t,i,a,r,l,o);if(!c.valid)return c;var d=this.checkRedundantSelection(t,i,a,r,l,o);if(!d.valid)return d;var p=this.activeGroup.searchEntity;if("categories"===p||"cms_categories"===p){var u=this.checkTreeConflicts(t,i,a,s,r,l,o);if(!u.valid)return u}return{valid:!0}},checkIncludeExcludeConflict:function(e,t,i,a,s,o){return"include"===i&&-1!==s.indexOf(e)?{valid:!1,type:"include_exclude_conflict",error:(o.error_in_exclude||'"{name}" is already in the exclude list. Remove it from exclude first.').replace("{name}",t)}:"exclude"===i&&-1!==a.indexOf(e)?{valid:!1,type:"include_exclude_conflict",error:(o.error_in_include||'"{name}" is already in the include list. Remove it from include first.').replace("{name}",t)}:{valid:!0}},checkRedundantSelection:function(e,t,i,a,s,o){return"include"===i&&-1!==a.indexOf(e)?{valid:!1,type:"redundant",error:(o.error_already_selected||'"{name}" is already selected.').replace("{name}",t)}:"exclude"===i&&-1!==s.indexOf(e)?{valid:!1,type:"redundant",error:(o.error_already_excluded||'"{name}" is already in an exclude list.').replace("{name}",t)}:{valid:!0}},checkTreeConflicts:function(e,t,i,a,s,o,n){if(!this.treeFlatData)return{valid:!0};a&&a.parentId&&parseInt(a.parentId,10);var r={};this.treeFlatData.forEach(function(e){r[parseInt(e.id,10)]=e});var l=this.getAncestorIds(e,r),c=this.getDescendantIds(e,r);if("include"===i){for(var d=0;d0)return{valid:!1,type:"children_included",error:(n.error_children_included||'Cannot exclude "{name}" because its children ({children}) are included. Remove them from include first.').replace("{name}",t).replace("{children}",m.slice(0,3).join(", ")+(m.length>3?"...":""))}}return{valid:!0}},getAncestorIds:function(e,t){for(var i=[],a=t[e];a&&a.parent_id;){var s=parseInt(a.parent_id,10);if(!s||!t[s])break;i.push(s),a=t[s]}return i},getDescendantIds:function(e,t){var i=[],a=this;return Object.keys(t).forEach(function(s){var o=t[s];if(parseInt(o.parent_id,10)===e){var n=parseInt(o.id,10);i.push(n);var r=a.getDescendantIds(n,t);i=i.concat(r)}}),i},getChipIds:function(t){var i=[];return t.find(".entity-chip").each(function(){i.push(parseInt(e(this).data("id"),10))}),i},validatePendingSelections:function(e,t){var i=this,a=[];return e&&e.length?(e.forEach(function(e){var s=i.validateSelection(e.id,e.name,t,e.data||{});s.valid||a.push({id:e.id,name:e.name,error:s.error,type:s.type})}),a):a},showValidationError:function(t){var i=(this.config.trans||{}).validation_error||"Selection Conflict";e(".es-validation-toast").remove();var a='
';a+='
',a+='
',a+='
'+this.escapeHtml(i)+"
",a+='
'+this.escapeHtml(t)+"
",a+="
",a+='';var s=e(a+="
");if(e("body").append(s),this.$dropdown&&this.$dropdown.hasClass("show")){var o=this.$dropdown.offset();s.css({position:"fixed",top:o.top-s.outerHeight()-10,left:o.left,zIndex:10001})}else s.css({position:"fixed",top:20,right:20,zIndex:10001});s.hide().fadeIn(200),setTimeout(function(){s.fadeOut(200,function(){e(this).remove()})},5e3),s.on("click",".es-toast-close",function(){s.fadeOut(200,function(){e(this).remove()})})},validateAndAddSelection:function(e,t,i,a,s){var o=this.validateSelection(t,i,s,a||{});return o.valid?(this.addSelection(e,t,i,a),!0):(this.showValidationError(o.error),!1)}}}(jQuery),function(e){"use strict";var t={instances:[],create:function(t){var i=function(){var t={config:{},$wrapper:null,$dropdown:null,activeGroup:null,searchTimeout:null,searchResults:[],searchTotal:0,searchOffset:0,searchQuery:"",isLoading:!1,loadMoreCount:20,viewMode:"list",currentSort:{field:"name",dir:"ASC"},refineQuery:"",refineNegate:!1,filters:{inStock:!1,discounted:!1,priceMin:null,priceMax:null,attributes:[],features:[],productCountMin:null,productCountMax:null,salesMin:null,salesMax:null,turnoverMin:null,turnoverMax:null,depth:null,hasProducts:!1,hasDescription:!1,hasImage:!1,activeOnly:!0,attributeGroup:null,featureGroup:null,dateAddFrom:null,dateAddTo:null,lastProductFrom:null,lastProductTo:null,hasHolidays:!1,containsStates:!1,zone:null},filterableData:null,searchHistory:{},searchHistoryMax:10,searchHistoryKey:"targetConditionsSearchHistory",maxVisibleChips:20,$methodDropdownMenu:null,$methodDropdownSelect:null,$methodDropdownTrigger:null,$previewPopover:null,$activeBadge:null,$previewList:null,previewLoadedCount:0,previewBlockType:null,allPreviewData:null,countUpdateTimeout:null,init:function(t){if(this.config=e.extend({id:"target-conditions",name:"target_conditions",namePrefix:"target_",mode:"multi",blocks:{},ajaxUrl:"",trans:{}},t),this.$wrapper=e('[data-entity-selector-id="'+this.config.id+'"]'),this.$wrapper.length){"single"===this.config.mode&&(this.$wrapper.find(".btn-add-group").hide(),this.$wrapper.find(".group-excludes").hide(),this.$wrapper.find(".group-modifiers").hide());var i=this.$wrapper.hasClass("layout-form-group"),a=this.$wrapper.closest(".entity-selector-form-group");if(!i&&!a.length){var s=this.$wrapper.closest(".form-group");s.addClass("condition-trait-fullwidth"),s.find(".col-lg-offset-3").removeClass("col-lg-offset-3")}this.createDropdown(),this.bindEvents(),this.loadExistingSelections(),this.loadSearchHistory(),this.initMethodDropdowns(),this.observeNewSelects();var o=this;setTimeout(function(){o.updateTabBadges(),o.updateAllConditionCounts()},100)}},observeNewSelects:function(){var t=this;"undefined"!=typeof MutationObserver&&new MutationObserver(function(i){i.forEach(function(i){i.addedNodes.length&&e(i.addedNodes).find(".include-method-select, .exclude-method-select").each(function(){t.enhanceMethodSelect(e(this))})})}).observe(this.$wrapper[0],{childList:!0,subtree:!0})},loadExistingSelections:function(){}},i=window._EntitySelectorMixins||{};return i.utils&&e.extend(t,i.utils),i.events&&e.extend(t,i.events),i.dropdown&&e.extend(t,i.dropdown),i.search&&e.extend(t,i.search),i.filters&&e.extend(t,i.filters),i.chips&&e.extend(t,i.chips),i.groups&&e.extend(t,i.groups),i.methods&&e.extend(t,i.methods),i.preview&&e.extend(t,i.preview),i.tree&&e.extend(t,i.tree),i.validation&&e.extend(t,i.validation),t}();return i.init(t),this.instances.push(i),i},init:function(e){return this.create(e)},validateAll:function(){for(var e=!0,t=0;t0&&!t.validateAll())return i.preventDefault(),!1})})}(jQuery); //# sourceMappingURL=entity-selector.min.js.map diff --git a/assets/js/admin/entity-selector.min.js.map b/assets/js/admin/entity-selector.min.js.map index 85c3237..abc241c 100644 --- a/assets/js/admin/entity-selector.min.js.map +++ b/assets/js/admin/entity-selector.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["_utils.js","_events.js","_dropdown.js","_search.js","_filters.js","_chips.js","_groups.js","_methods.js","_preview.js","_tree.js","_validation.js","_core.js"],"names":["$","window","_EntitySelectorMixins","utils","debounce","func","wait","timeout","context","this","args","arguments","clearTimeout","setTimeout","apply","escapeHtml","str","String","replace","escapeAttr","getEntityTypeIcon","entityType","products","categories","manufacturers","suppliers","attributes","features","cms","cms_categories","getEntityTypeLabel","trans","config","product","category","manufacturer","supplier","attribute","feature","cms_page","cms_category","validate","$wrapper","data","hasData","find","each","length","clearValidationError","showValidationError","addClass","message","remove","$error","class","html","after","animate","scrollTop","offset","top","is","slideDown","removeClass","getBlockMode","blockType","blockDef","blocks","mode","isBlockSingleMode","getCurrentSingleSelection","$chip","first","$block","closest","name","text","supportsTreeBrowsing","jQuery","events","bindEvents","self","on","e","preventDefault","switchToBlock","stopPropagation","$tab","hasClass","hidePreviewPopover","showPreviewPopover","$badge","showConditionPreviewPopover","showGroupPreviewPopover","showTotalPreviewPopover","document","target","$body","stop","slideUp","$blocksContent","$icon","toggleClass","$btn","currentState","attr","collapse_all","expand_all","prop","clearAllConditions","val","addGroup","$group","removeGroup","$input","trim","serializeAllBlocks","addFirstExcludeRow","addExcludeRow","$excludeRow","removeExcludeRow","hideDropdown","$row","methods","selection_methods","$option","valueType","searchEntity","methodOptions","$oldPicker","newPickerHtml","buildValuePickerHtml","replaceWith","$select","$newPicker","empty","key","label","append","isExclusive","populateTiles","step","min","applyRangeInputConstraints","loadCombinationAttributeGroups","selectedMethod","updateMethodInfoPlaceholder","updateBlockStatus","keyCode","click","$draftTag","$picker","pattern","caseSensitive","addPatternTag","focus","hide","$matchCount","updateDraftTagCount","updateGroupTotalCount","$tag","isDraftTag","newCaseSensitive","caseTitle","case_sensitive","case_insensitive","count","showPatternPreviewModal","currentPattern","$editInput","$saveBtn","$cancelBtn","$editActions","prepend","select","ev","newPattern","show","content","tooltipClass","$tooltip","triggerWidth","outerWidth","tooltipWidth","tooltipHeight","outerHeight","left","width","css","position","$container","$chipsContainer","$minInput","$maxInput","minVal","maxVal","parseFloat","minAllowed","hasMinConstraint","minNum","maxNum","showRangeInputError","min_value_error","min_greater_than_max","chipText","decimals","split","Math","round","toFixed","type","$tile","$value","updateCombinationData","query","toLowerCase","indexOf","$modifiers","$content","slideToggle","$limitInput","limit","parseInt","finalCount","$previewBadge","displayCount","updateModifierButtonState","refreshGroupPreviewIfOpen","newDir","groupIndex","section","excludeIndex","activeGroup","searchResults","searchOffset","searchQuery","viewMode","resetFiltersWithoutSearch","$dropdown","$chips","pendingSelections","push","id","pendingPicker","pendingRow","updateFilterPanelForEntity","loadFilterableData","positionDropdown","performSearch","loadCategoryTree","searchTimeout","filterCategoryTree","$item","removeFromSearchHistory","fadeOut","activeElement","filter","blur","isSelected","s","removeSelection","validation","validateSelection","valid","error","currentSelection","newEntityType","showReplaceConfirmation","addSelection","some","countryId","countryName","countryIso","showHolidayPreview","updateChipsVisibility","skippedCount","addSelectionNoUpdate","msg","items_skipped_conflicts","selectedCount","totalCount","categoryLabel","forEach","sel","isLoading","loadCount","loadMoreCount","currentSort","field","refreshSearch","dir","$allItems","isCollapsed","descendants","findTreeDescendants","i","toggle","updateSelectChildrenButtons","$count","categoryId","categoryName","showCategoryItemsPreview","allSelected","j","$child","select_with_children","skippedChildren","parentValidation","k","$descendant","skipMsg","children_skipped_conflicts","deselect_with_children","minLevel","Infinity","level","hasChildren","refineQuery","refineTimeout","refineNegate","placeholder","refine_exclude","refine_short","$panel","showSearchHistory","filters","inStock","discounted","priceMin","priceMax","productCountMin","productCountMax","salesMin","salesMax","turnoverMin","turnoverMax","dateAddFrom","dateAddTo","lastProductFrom","lastProductTo","depth","hasProducts","hasDescription","hasImage","activeOnly","attributeGroup","featureGroup","isColor","isCustom","indexable","hasHolidays","containsStates","zone","groupId","isActive","hideFilterGroupValues","showFilterGroupValues","groupType","groupName","showFilterGroupPreviewPopover","prevMode","renderSearchResults","filterArray","index","splice","updateFilterToggleStates","clearFilters","isInputFocused","ctrlKey","metaKey","trigger","rect","getBoundingClientRect","innerWidth","bottom","$closeBtn","dropdown","createDropdown","select_all","all","clear_selection","clear","sort_name","sort_id","sort_selected","sort_price","sort_stock","sort_popularity","sort_reference","sort_position","sort_product_count","view_list","view_tree","cols","exclude_matches","toggle_filters","recent_searches","in_stock","price","max","clear_filters","product_count","total_sales","turnover","active_only","all_levels","root","has_products","has_description","has_image","date_added","from","to","last_product","attribute_group","all_groups","color_only","feature_group","custom_only","has_holidays","contains_states","all_zones","sale","stock","sold","load","of","remaining","cancel","save","$searchBox","searchBoxOffset","searchBoxHeight","pickerOffset","pickerWidth","dropdownTop","dropdownLeft","dropdownWidth","viewportWidth","maxHeight","height","zIndex","search","categoryTreeCache","appendMode","requestData","ajax","action","trait","entity_type","q","sort_by","sort_dir","refine","refine_negate","filter_in_stock","filter_discounted","filter_price_min","filter_price_max","filter_attributes","JSON","stringify","filter_features","filter_product_count_min","filter_product_count_max","filter_depth","filter_has_products","filter_has_description","filter_has_image","filter_sales_min","filter_sales_max","filter_turnover_min","filter_turnover_max","filter_active","filter_date_add_from","filter_date_add_to","filter_last_product_from","filter_last_product_to","filter_attribute_group","filter_is_color","filter_feature_group","filter_is_custom","filter_indexable","filter_has_holidays","filter_contains_states","filter_zone","url","ajaxUrl","dataType","success","response","total","addToSearchHistory","concat","results","searchTotal","selectedIds","hiddenIds","currentSearchEntity","currentExcludeIndex","isProductSearch","isListView","visibleResults","item","hiddenCount","countText","itemClass","image","subtitle","iso_code","flagUrl","iconClass","subtitleLines","line","idx","regular_price_formatted","price_formatted","has_discount","stockClass","stock_status","undefined","stock_qty","sales_qty","gridStockClass","discount_percent","no_results","hasMore","$loadMoreControls","$allOption","hasHistory","getSearchHistory","loadSearchHistory","stored","localStorage","getItem","searchHistoryKey","searchHistory","parse","saveSearchHistory","setItem","history","existingIndex","unshift","searchHistoryMax","slice","$treeOption","filterableData","loadAttributeGroups","loadZonesForCountryFilter","groups","group","loadFeatureGroups","isCategory","updateSortOptionsForEntity","currentValue","hasCurrentOption","entities","isAllowed","renderFilterDropdowns","$attrContainer","$featContainer","g","valuesRowClass","$filterRowValues","$valuesContainer","values","activeClass","chipClass","colorStyle","color","colorClass","rowValues","scrollIntoView","behavior","block","$toggle","hasActiveInGroup","zonesLoaded","zones","chips","isCountry","$allChips","$existingWrapper","ensureChipsWrapper","$toolbar","$loadMore","searchTerm","visibleCount","filteredCount","isExpanded","maxVisible","maxVisibleChips","chipName","matchesFilter","updateChipsToolbar","hiddenByPagination","loadText","remainingText","loadMoreHtml","collapseText","collapse","before","wrapperHtml","filter_selected","sort","sort_added","sort_name_asc","sort_name_desc","clear_all","bindChipsToolbarEvents","sortBy","sortChips","sorted","toArray","a","b","$a","$b","nameA","nameB","localeCompare","nameA2","chip","$clearBtn","$clearText","loadExistingSelections","entitiesToLoad","$includePicker","collectPickerEntities","enhanceMethodSelect","updateMethodSelectorLock","bulkRequest","hasEntities","Object","keys","ids","uniqueIds","arr","entityMap","entity","pickers","pickerData","$dataInput","validIds","$loadingChip","updateAllConditionCounts","xhr","status","rawValue","entityIcon","Array","isArray","range","loadPickerValues","isCaseSensitive","remove_pattern","getPatternTags","patterns","$countValue","updateConditionCountWithPendingPattern","pendingPattern","$countEl","isExclude","method","block_type","fetchPatternMatchCount","getPickerValues","patternValues","$draftPatternInput","draftPatternVal","draftCaseSens","updateConditionCount","hasNoValues","updateGroupCounts","$include","groupData","serializeGroup","include","group_data","final_count","excludeCount","exclude_count","badgeHtml","fetchCategoryNamesAndAddChips","callback","maxIndex","buildMethodOptions","click_to_name","remove_group","no_items_selected","search_placeholder","add_exceptions","limit_tooltip","sort_bestsellers","sort_newest","sort_random","sort_direction","preview_results","$newGroup","emptyHtml","getEmptyStateText","updateTabBadges","updateHeaderTotalCount","blockTypesWithData","groupCount","updateTargetSwitchState","fetchAllCounts","$switch","blockTypes","$hiddenInput","savedData","conditions","counts","fetchProductCount","removeData","isNaN","$totalBadge","updateShowAllToggle","$checkbox","$status","getBlockGroups","emptyMeansAll","entity_label_plural","nothing_selected","blockMode","no_item_selected","included","includeMethod","includeValues","excludes","excludeMethod","$excludePicker","excludeValues","modifiers","getGroupModifiers","$changedRow","jsonData","countUpdateTimeout","isConditionValid","sortDir","Number","$draftInput","draftPattern","draftCaseSensitive","selectVal","ranges","combAttrs","toString","valueId","combMode","configMode","combinationMode","conditionElements","conditionIndex","includeData","getConditionData","condition","excludeData","items","allCountryIds","map","isCountryHolidays","countryIds","isAllCountries","country_ids","join","count_only","holidayResponse","total_count","countries","isCountrySelection","$excludesDiv","except","buildExcludeRowHtml","add_another_exception","$firstRow","$firstSelect","initialMethod","$newRow","$newSelect","excludeMethodOptions","firstSearchEntity","firstValueType","methodKey","methodDef","search_entity","value_type","remove_this_exception","excludeAll","groupLabels","select_by","filter_by","grouped","ungrouped","buildMethodOption","groupKey","groupMethods","groupLabel","icon","options","exclusive","pickerClass","chipsClass","dataClass","noItemsText","tooltipContent","pattern_help_title","pattern_help_wildcard","pattern_help_number","pattern_help_letter","pattern_help_examples","pattern_example_1","pattern_example_2","pattern_example_3","noPatternText","no_patterns","enter_pattern","click_to_preview","add_pattern","add_range","yes","combination_help_title","combination_help_desc","combination_help_logic","combination_help_within","combination_help_between","showModeToggle","defaultMode","Date","now","comb_mode_products","comb_mode_combinations","loading","getSortOptionsArray","value","sort_products","getSortIconClass","isAsc","cycleSortOption","newSort","newLabel","sortOptions","currentDir","currentIndex","initMethodDropdowns","initMethodInfoPlaceholders","$selectedOption","selectedIcon","selectedLabel","triggerHtml","$trigger","showMethodDropdownMenu","updateMethodTrigger","closeMethodDropdownMenu","menuHtml","buildMethodDropdownMenuHtml","$menu","triggerOffset","triggerHeight","minWidth","$methodDropdownMenu","$methodDropdownSelect","$methodDropdownTrigger","children","$el","$optgroup","off","removeAttr","optData","tileClass","$inputs","$groupDiv","$groupHeader","title","filter_results","loadCombinationAttributeValues","no_attribute_groups","error_loading","id_attribute_group","productCount","$valueBtn","restoreCombinationSelections","no_values","dataStr","valueIds","updateCombinationGroupCounts","$headerRow","$placeholder","methodHelp","helpContent","getBuiltInMethodHelp","$infoWrapper","help_all_title","help_all_desc","help_specific_title","help_specific_desc","help_category_title","help_category_desc","help_manufacturer_title","help_manufacturer_desc","help_supplier_title","help_supplier_desc","help_tag_title","help_tag_desc","help_attribute_title","help_attribute_desc","help_feature_title","help_feature_desc","help_combination_title","help_combination_desc","help_combination_logic","help_combination_within","help_combination_between","help_carrier_title","help_carrier_desc","help_condition_title","help_condition_desc","help_visibility_title","help_visibility_desc","help_active_title","help_active_desc","help_stock_title","help_stock_desc","help_boolean_title","help_boolean_desc","help_pattern_title","help_pattern_desc","help_pattern_wildcard","help_pattern_number","help_pattern_letter","help_range_title","help_range_desc","help_range_tip","help_date_title","help_date_desc","buildSortOptions","summary","sortLabel","$arrow","insertBefore","locked","wrap","parent","lockHtml","remove_excludes_first","siblings","preview","createPreviewPopover","entityLabel","previewType","renderPreviewItems","no_preview","$popover","$previewPopover","$previewList","previewLoadedCount","previewTotalCount","previewContext","previewOnLoadMore","onLoadMore","previewOnFilter","onFilter","previewCurrentFilter","previewEntityLabel","$filterInput","debouncedFilter","showFilterLoading","call","filterPreviewItems","previewLoadCount","badgeOffset","badgeHeight","badgeWidth","popoverWidth","leftPos","maxLeft","updatePreviewPopover","$footer","$controls","filterQuery","isCombination","dataAttrs","reference","meta","formatPrice","active","$items","ref","attrs","matches","$list","previewLockedWidth","updatePreviewPopoverFiltered","$header","noResultsText","no_filter_results","footerHtml","$newFooter","currencySign","currency_sign","currencyFormat","currency_format","formatted","$activeBadge","previewData","entityLabelPlural","previewBlockType","fetchTabPreviewItems","fetchedItems","loadMoreTabPreviewItems","filterTabPreviewItems","ajaxData","conditionData","showCountriesHolidayPreview","loadMoreConditionItems","filterConditionItems","ctx","loadMoreGroupItems","filterGroupItems","group_id","group_type","loadMoreFilterGroupItems","filterFilterGroupItems","isProducts","category_id","loadMoreCategoryItems","filterCategoryItems","previewOffset","previewFilterQuery","appendPreviewItems","replacePreviewItems","blockConfig","entityLabelSingular","entity_label","$modal","listHtml","no_matches","and","more","summaryItems","prev","popoverHtml","total_summary","total_items","windowWidth","fadeIn","holidays","triggerRect","scrollLeft","popoverHeight","windowHeight","id_country","h","date_formatted","date","day_of_week","upcoming_holidays","noDataHtml","no_holidays","newPopoverHeight","newTop","errorHtml","filter_holidays","badgeRect","countryHolidayCounts","countriesMap","ci","cInfo","hi","hol","country_id","sortedCountries","titleHtml","numCountries","fi","fc","fj","fcc","typeClass","searchText","country_name","country_iso","across_countries","searchData","$note","noteText","tree","treeData","treeFlatData","$results","buildTreeStructure","renderCategoryTree","no_categories","flatData","lookup","extend","node","parentId","parent_id","getSelectedIdsFromChips","renderTreeItems","nodes","indent","itemCount","page_count","countLabel","pages","inactive","$tree","$children","parents","next","$next","$childItems","isParentSelected","allChildrenSelected","includeIds","getChipIds","excludeIds","conflictResult","checkIncludeExcludeConflict","redundantResult","checkRedundantSelection","treeResult","checkTreeConflicts","error_in_exclude","error_in_include","error_already_selected","error_already_excluded","ancestorIds","getAncestorIds","descendantIds","getDescendantIds","ancestorName","error_parent_excluded","descendantName","error_child_excluded","parentName","error_parent_included","includedDescendants","m","childName","error_children_included","ancestors","current","childId","childDescendants","validatePendingSelections","errors","result","validation_error","$toast","dropdownOffset","right","validateAndAddSelection","TargetConditions","instances","create","instance","allPreviewData","init","namePrefix","hasLayoutFormGroup","$entitySelectorFormGroup","$formGroup","observeNewSelects","MutationObserver","mutations","mutation","addedNodes","observe","childList","subtree","mixins","createTargetConditionsInstance","validateAll","allValid","ready","configData"],"mappings":"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","file":"entity-selector.min.js","sourcesContent":["/**\n * Entity Selector - Utilities Module\n * Helper functions: escape, validation, icons, search history\n * @partial _utils.js (must be loaded first)\n *\n * EXTRACTION SOURCE: assets/js/admin/entity-selector.js\n * Lines: 7552-7570 (escapeHtml, escapeAttr)\n * 7577-7590 (getEntityTypeLabel)\n * 6289-6350 (validate, showValidationError, clearValidationError)\n * 7115-7137 (showRangeInputError)\n * 7728-7745 (getBlockMode, isBlockSingleMode)\n * 7707-7723 (getCurrentSingleSelection)\n * 5411-5467 (search history methods)\n */\n\n(function($) {\n 'use strict';\n\n // Create mixin namespace\n window._EntitySelectorMixins = window._EntitySelectorMixins || {};\n\n // Utility functions mixin\n window._EntitySelectorMixins.utils = {\n\n /**\n * Debounce function - delays execution until after wait milliseconds\n * @param {Function} func - Function to debounce\n * @param {number} wait - Milliseconds to wait\n * @returns {Function} Debounced function\n */\n debounce: function(func, wait) {\n var timeout;\n return function() {\n var context = this;\n var args = arguments;\n clearTimeout(timeout);\n timeout = setTimeout(function() {\n func.apply(context, args);\n }, wait);\n };\n },\n\n escapeHtml: function(str) {\n if (str === null || str === undefined) return '';\n return String(str)\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n },\n\n escapeAttr: function(str) {\n if (str === null || str === undefined) return '';\n return String(str)\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n },\n\n getEntityTypeIcon: function(entityType) {\n var icons = {\n 'products': 'icon-shopping-cart',\n 'categories': 'icon-folder-open',\n 'manufacturers': 'icon-building',\n 'suppliers': 'icon-truck',\n 'attributes': 'icon-list-alt',\n 'features': 'icon-tags',\n 'cms': 'icon-file-text',\n 'cms_categories': 'icon-folder'\n };\n return icons[entityType] || 'icon-cube';\n },\n\n getEntityTypeLabel: function(entityType) {\n var trans = this.config.trans || {};\n var labels = {\n 'products': trans.product || 'Product',\n 'categories': trans.category || 'Category',\n 'manufacturers': trans.manufacturer || 'Manufacturer',\n 'suppliers': trans.supplier || 'Supplier',\n 'attributes': trans.attribute || 'Attribute',\n 'features': trans.feature || 'Feature',\n 'cms': trans.cms_page || 'CMS Page',\n 'cms_categories': trans.cms_category || 'CMS Category'\n };\n return labels[entityType] || entityType;\n },\n\n validate: function() {\n var isRequired = this.$wrapper.data('required') === 1 || this.$wrapper.data('required') === '1';\n if (!isRequired) return true;\n\n var hasData = false;\n this.$wrapper.find('.target-block').each(function() {\n if ($(this).find('.selection-group').length > 0) {\n hasData = true;\n return false;\n }\n });\n\n if (!hasData) {\n this.showValidationError();\n return false;\n }\n\n this.clearValidationError();\n return true;\n },\n\n showValidationError: function() {\n this.$wrapper.addClass('has-validation-error');\n var message = this.$wrapper.data('required-message') || 'Please select at least one item';\n this.$wrapper.find('.trait-validation-error').remove();\n var $error = $('
', {\n class: 'trait-validation-error',\n html: ' ' + message\n });\n this.$wrapper.find('.condition-trait-header').after($error);\n $('html, body').animate({ scrollTop: this.$wrapper.offset().top - 100 }, 300);\n if (!this.$wrapper.find('.condition-trait-body').is(':visible')) {\n this.$wrapper.find('.condition-trait-body').slideDown(200);\n this.$wrapper.removeClass('collapsed');\n }\n },\n\n clearValidationError: function() {\n this.$wrapper.removeClass('has-validation-error');\n this.$wrapper.find('.trait-validation-error').remove();\n },\n\n getBlockMode: function(blockType) {\n var blockDef = this.config.blocks[blockType];\n return (blockDef && blockDef.mode) ? blockDef.mode : 'multi';\n },\n\n isBlockSingleMode: function(blockType) {\n return this.getBlockMode(blockType) === 'single';\n },\n\n getCurrentSingleSelection: function() {\n if ((this.config.mode || 'multi') !== 'single') return null;\n var $chip = this.$wrapper.find('.entity-chips .entity-chip').first();\n if ($chip.length) {\n var $block = $chip.closest('.target-block');\n return {\n name: $chip.find('.chip-name').text() || $chip.data('id'),\n entityType: $block.data('block-type') || 'item'\n };\n }\n return null;\n },\n\n /**\n * Check if entity type supports tree browsing\n */\n supportsTreeBrowsing: function(entityType) {\n return entityType === 'categories' || entityType === 'cms_categories';\n }\n };\n\n})(jQuery);\n","/**\n * Entity Selector - Events Module\n * All event binding and handlers\n * @partial _events.js\n *\n * Contains event handlers for:\n * - Tab switching\n * - Block/group collapse toggle\n * - Dropdown open/close\n * - Search input handling\n * - Item selection/deselection\n * - Group add/remove\n * - Exclude row add/remove\n * - Method select changes\n * - Filter panel toggles\n * - Keyboard shortcuts (Ctrl+A, Ctrl+D, Esc, Enter)\n * - Load more pagination\n * - Sort controls\n * - View mode switching\n * - Tree view events\n * - Preview badge clicks\n * - Pattern tag interactions\n * - Combination picker events\n * - Group modifier events\n */\n\n(function($) {\n 'use strict';\n\n window._EntitySelectorMixins = window._EntitySelectorMixins || {};\n\n window._EntitySelectorMixins.events = {\n\n bindEvents: function() {\n var self = this;\n\n // Tab switching\n this.$wrapper.on('click', '.target-block-tab', function(e) {\n e.preventDefault();\n var blockType = $(this).data('blockType');\n self.switchToBlock(blockType);\n });\n\n // Tab badge click for preview popover (toggle)\n this.$wrapper.on('click', '.target-block-tab .tab-badge', function(e) {\n e.stopPropagation();\n e.preventDefault();\n\n var $tab = $(this).closest('.target-block-tab');\n var $badge = $(this);\n\n if ($badge.hasClass('popover-open')) {\n self.hidePreviewPopover();\n } else {\n self.showPreviewPopover($tab);\n }\n });\n\n // Condition count badge click for preview popover\n this.$wrapper.on('click', '.condition-match-count.clickable', function(e) {\n e.stopPropagation();\n e.preventDefault();\n\n var $badge = $(this);\n\n if ($badge.hasClass('popover-open')) {\n self.hidePreviewPopover();\n } else {\n self.showConditionPreviewPopover($badge);\n }\n });\n\n // Group count badge click for preview popover\n this.$wrapper.on('click', '.group-count-badge.clickable', function(e) {\n e.stopPropagation();\n e.preventDefault();\n\n var $badge = $(this);\n\n if ($badge.hasClass('popover-open')) {\n self.hidePreviewPopover();\n } else {\n self.showGroupPreviewPopover($badge);\n }\n });\n\n // Total count badge click for summary popover\n this.$wrapper.on('click', '.trait-total-count', function(e) {\n e.stopPropagation();\n e.preventDefault();\n\n var $badge = $(this);\n\n if ($badge.hasClass('popover-open')) {\n self.hidePreviewPopover();\n } else {\n self.showTotalPreviewPopover($badge);\n }\n });\n\n // Close popover when clicking outside\n $(document).on('click', function(e) {\n if (!$(e.target).closest('.target-preview-popover').length &&\n !$(e.target).closest('.holiday-preview-popover').length &&\n !$(e.target).closest('.tab-badge').length &&\n !$(e.target).closest('.condition-match-count').length &&\n !$(e.target).closest('.group-count-badge').length &&\n !$(e.target).closest('.group-modifiers').length &&\n !$(e.target).closest('.group-preview-badge').length &&\n !$(e.target).closest('.toggle-count.clickable').length &&\n !$(e.target).closest('.trait-total-count').length &&\n !$(e.target).closest('.chip-preview-holidays').length) {\n self.hidePreviewPopover();\n // Also close holiday popover\n $('.holiday-preview-popover').remove();\n }\n });\n\n // Block-level collapse toggle (click on header)\n this.$wrapper.on('click', '.condition-trait-header', function(e) {\n if ($(e.target).closest('.target-block-tabs').length ||\n $(e.target).closest('.trait-header-actions').length ||\n $(e.target).closest('.prestashop-switch').length ||\n $(e.target).closest('.trait-total-count').length) {\n return;\n }\n var $body = self.$wrapper.find('.condition-trait-body');\n $body.stop(true, true);\n if ($body.is(':visible')) {\n $body.slideUp(200);\n self.$wrapper.addClass('collapsed');\n } else {\n $body.slideDown(200);\n self.$wrapper.removeClass('collapsed');\n }\n });\n\n // Toggle blocks content (form-content layout)\n this.$wrapper.on('click', '.btn-toggle-blocks', function(e) {\n e.preventDefault();\n var $blocksContent = self.$wrapper.find('.entity-selector-blocks-content');\n var $icon = $(this).find('.material-icons');\n $blocksContent.stop(true, true);\n if ($blocksContent.is(':visible')) {\n $blocksContent.slideUp(200);\n self.$wrapper.addClass('blocks-collapsed');\n $icon.text('expand_more');\n } else {\n $blocksContent.slideDown(200);\n self.$wrapper.removeClass('blocks-collapsed');\n $icon.text('expand_less');\n }\n });\n\n // Group-level collapse toggle (click on group header or toggle icon)\n this.$wrapper.on('click', '.group-header', function(e) {\n if ($(e.target).closest('.btn-remove-group, .group-name-input').length) {\n return;\n }\n if (self.$wrapper.data('mode') === 'single') {\n return;\n }\n var $group = $(this).closest('.selection-group');\n $group.toggleClass('collapsed');\n });\n\n // Toggle all groups (single button that switches between expand/collapse)\n this.$wrapper.on('click', '.trait-header-actions .btn-toggle-groups', function(e) {\n e.preventDefault();\n e.stopPropagation();\n var $btn = $(this);\n var currentState = $btn.attr('data-state') || 'collapsed';\n var trans = self.config.trans || {};\n\n if (currentState === 'collapsed') {\n self.$wrapper.find('.selection-group').removeClass('collapsed');\n $btn.attr('data-state', 'expanded');\n $btn.attr('title', trans.collapse_all || 'Collapse all groups');\n $btn.find('i').removeClass('icon-expand').addClass('icon-compress');\n } else {\n self.$wrapper.find('.selection-group').addClass('collapsed');\n $btn.attr('data-state', 'collapsed');\n $btn.attr('title', trans.expand_all || 'Expand all groups');\n $btn.find('i').removeClass('icon-compress').addClass('icon-expand');\n }\n });\n\n // Show all toggle change (legacy checkbox)\n this.$wrapper.on('change', '.trait-show-all-toggle .show-all-checkbox', function(e) {\n e.stopPropagation();\n var isChecked = $(this).prop('checked');\n if (isChecked) {\n self.clearAllConditions();\n }\n });\n\n // Target switch change (PrestaShop native switch)\n this.$wrapper.on('change', '.target-switch-toggle', function(e) {\n e.stopPropagation();\n var value = $(this).val();\n if (value === '1') {\n self.clearAllConditions();\n self.$wrapper.find('.condition-trait-body').slideUp(200);\n self.$wrapper.addClass('collapsed');\n } else {\n self.$wrapper.find('.condition-trait-body').slideDown(200);\n self.$wrapper.removeClass('collapsed');\n }\n });\n\n // Add group\n this.$wrapper.on('click', '.btn-add-group', function(e) {\n e.preventDefault();\n var $block = $(this).closest('.target-block');\n var blockType = $block.data('blockType');\n self.addGroup($block, blockType);\n });\n\n // Remove group\n this.$wrapper.on('click', '.btn-remove-group', function(e) {\n e.preventDefault();\n var $group = $(this).closest('.selection-group');\n var $block = $(this).closest('.target-block');\n self.removeGroup($group, $block);\n });\n\n // Group name input - stop propagation to prevent collapse\n this.$wrapper.on('click focus', '.group-name-input', function(e) {\n e.stopPropagation();\n });\n\n // Group name change\n this.$wrapper.on('change blur', '.group-name-input', function() {\n var $input = $(this);\n var $group = $input.closest('.selection-group');\n var name = $.trim($input.val());\n $group.attr('data-group-name', name);\n self.serializeAllBlocks();\n });\n\n // Add exceptions (first exclude row)\n this.$wrapper.on('click', '.btn-add-exclude', function(e) {\n e.preventDefault();\n var $group = $(this).closest('.selection-group');\n var $block = $(this).closest('.target-block');\n self.addFirstExcludeRow($group, $block);\n });\n\n // Add another exclude row\n this.$wrapper.on('click', '.btn-add-another-exclude', function(e) {\n e.preventDefault();\n var $group = $(this).closest('.selection-group');\n var $block = $(this).closest('.target-block');\n self.addExcludeRow($group, $block);\n });\n\n // Remove individual exclude row\n this.$wrapper.on('click', '.btn-remove-exclude-row', function(e) {\n e.preventDefault();\n var $excludeRow = $(this).closest('.exclude-row');\n var $group = $(this).closest('.selection-group');\n var $block = $(this).closest('.target-block');\n self.removeExcludeRow($excludeRow, $group, $block);\n });\n\n // Include method change\n this.$wrapper.on('change', '.include-method-select', function() {\n self.hideDropdown();\n\n var $group = $(this).closest('.selection-group');\n var $block = $(this).closest('.target-block');\n var $row = $group.find('.group-include');\n var blockType = $block.data('blockType');\n var blockDef = self.config.blocks[blockType] || {};\n var methods = blockDef.selection_methods || {};\n\n var $option = $(this).find('option:selected');\n var valueType = $option.data('valueType') || 'none';\n var searchEntity = $option.data('searchEntity') || '';\n var methodOptions = $option.data('options') || null;\n\n var $oldPicker = $group.find('.include-picker');\n var newPickerHtml = self.buildValuePickerHtml('include', valueType, searchEntity, methods);\n $oldPicker.replaceWith(newPickerHtml);\n\n if (valueType === 'select' && methodOptions) {\n var $newPicker = $group.find('.include-picker');\n var $select = $newPicker.find('.select-value-input');\n $select.empty();\n $.each(methodOptions, function(key, label) {\n $select.append('');\n });\n }\n\n if (valueType === 'multi_select_tiles' && methodOptions) {\n var $newPicker = $group.find('.include-picker');\n var isExclusive = $option.data('exclusive') === true;\n self.populateTiles($newPicker, methodOptions, isExclusive);\n }\n\n if (valueType === 'multi_numeric_range') {\n var $newPicker = $group.find('.include-picker');\n var step = $option.data('step');\n var min = $option.data('min');\n self.applyRangeInputConstraints($newPicker, step, min);\n }\n\n if (valueType === 'combination_attributes') {\n var $newPicker = $group.find('.include-picker');\n self.loadCombinationAttributeGroups($newPicker);\n }\n\n var selectedMethod = $(this).val();\n self.updateMethodInfoPlaceholder($group.find('.method-selector-wrapper'), selectedMethod, blockType);\n\n self.updateBlockStatus($block);\n self.serializeAllBlocks($row);\n });\n\n // Exclude method change (within an exclude row)\n this.$wrapper.on('change', '.exclude-method-select', function() {\n self.hideDropdown();\n\n var $excludeRow = $(this).closest('.exclude-row');\n var $group = $(this).closest('.selection-group');\n var $block = $(this).closest('.target-block');\n var blockType = $block.data('blockType');\n var blockDef = self.config.blocks[blockType] || {};\n var methods = blockDef.selection_methods || {};\n\n var $option = $(this).find('option:selected');\n var valueType = $option.data('valueType') || 'entity_search';\n var searchEntity = $option.data('searchEntity') || blockType;\n var methodOptions = $option.data('options') || null;\n\n var $oldPicker = $excludeRow.find('.exclude-picker');\n var newPickerHtml = self.buildValuePickerHtml('exclude', valueType, searchEntity, methods);\n $oldPicker.replaceWith(newPickerHtml);\n\n if (valueType === 'select' && methodOptions) {\n var $newPicker = $excludeRow.find('.exclude-picker');\n var $select = $newPicker.find('.select-value-input');\n $select.empty();\n $.each(methodOptions, function(key, label) {\n $select.append('');\n });\n }\n\n if (valueType === 'multi_select_tiles' && methodOptions) {\n var $newPicker = $excludeRow.find('.exclude-picker');\n var isExclusive = $option.data('exclusive') === true;\n self.populateTiles($newPicker, methodOptions, isExclusive);\n }\n\n if (valueType === 'multi_numeric_range') {\n var $newPicker = $excludeRow.find('.exclude-picker');\n var step = $option.data('step');\n var min = $option.data('min');\n self.applyRangeInputConstraints($newPicker, step, min);\n }\n\n if (valueType === 'combination_attributes') {\n var $newPicker = $excludeRow.find('.exclude-picker');\n self.loadCombinationAttributeGroups($newPicker);\n }\n\n var selectedMethod = $(this).val();\n self.updateMethodInfoPlaceholder($excludeRow.find('.exclude-header-row'), selectedMethod, blockType);\n\n self.serializeAllBlocks($excludeRow);\n });\n\n // Handle pattern input Enter key - adds pattern as tag\n this.$wrapper.on('keydown', '.pattern-input', function(e) {\n if (e.keyCode === 13) {\n e.preventDefault();\n var $btn = $(this).closest('.draft-tag').find('.btn-add-pattern');\n $btn.click();\n }\n });\n\n // Handle add pattern button click (in draft tag)\n this.$wrapper.on('click', '.draft-tag .btn-add-pattern', function(e) {\n e.preventDefault();\n e.stopPropagation();\n var $draftTag = $(this).closest('.draft-tag');\n var $picker = $draftTag.closest('.value-picker');\n var $row = $draftTag.closest('.group-include, .exclude-row');\n var $input = $draftTag.find('.pattern-input');\n var pattern = $.trim($input.val());\n\n if (pattern) {\n var caseSensitive = $draftTag.attr('data-case-sensitive') === '1';\n self.addPatternTag($picker, pattern, caseSensitive);\n\n $input.val('').focus();\n $draftTag.find('.pattern-match-count').removeClass('count-found count-zero').hide();\n $draftTag.find('.pattern-match-count .count-value').text('');\n\n self.serializeAllBlocks($row);\n }\n });\n\n // Handle pattern input live typing - update match count in draft tag\n this.$wrapper.on('input', '.pattern-input', function() {\n var $input = $(this);\n var $draftTag = $input.closest('.draft-tag');\n if (!$draftTag.length) return;\n\n var pattern = $.trim($input.val());\n\n if ($input.data('countTimeout')) {\n clearTimeout($input.data('countTimeout'));\n }\n\n var $matchCount = $draftTag.find('.pattern-match-count');\n\n if (!pattern) {\n $matchCount.removeClass('count-found count-zero').hide();\n $matchCount.find('.count-value').text('');\n var $group = $draftTag.closest('.selection-group');\n if ($group.length) {\n self.updateGroupTotalCount($group);\n }\n return;\n }\n\n var timeout = setTimeout(function() {\n var caseSensitive = $draftTag.attr('data-case-sensitive') === '1';\n self.updateDraftTagCount($draftTag, pattern, caseSensitive);\n }, 300);\n $input.data('countTimeout', timeout);\n });\n\n // Handle pattern tag remove\n this.$wrapper.on('click', '.pattern-tag .btn-remove-pattern', function(e) {\n e.preventDefault();\n e.stopPropagation();\n var $row = $(this).closest('.group-include, .exclude-row');\n $(this).closest('.pattern-tag').remove();\n self.serializeAllBlocks($row);\n });\n\n // Handle pattern tag case-sensitivity toggle\n this.$wrapper.on('click', '.pattern-tag .btn-toggle-case', function(e) {\n e.preventDefault();\n e.stopPropagation();\n var $tag = $(this).closest('.pattern-tag');\n var $btn = $(this);\n var trans = self.config.trans || {};\n var isDraftTag = $tag.hasClass('draft-tag');\n\n var isCaseSensitive = $tag.data('caseSensitive') === 1 || $tag.data('caseSensitive') === '1' || $tag.attr('data-case-sensitive') === '1';\n var newCaseSensitive = !isCaseSensitive;\n\n $tag.data('caseSensitive', newCaseSensitive ? 1 : 0);\n $tag.attr('data-case-sensitive', newCaseSensitive ? '1' : '0');\n $tag.toggleClass('case-sensitive', newCaseSensitive);\n\n $btn.find('.case-icon').text(newCaseSensitive ? 'Aa' : 'aa');\n var caseTitle = newCaseSensitive\n ? (trans.case_sensitive || 'Case sensitive - click to toggle')\n : (trans.case_insensitive || 'Case insensitive - click to toggle');\n $btn.attr('title', caseTitle);\n\n if (isDraftTag) {\n var pattern = $.trim($tag.find('.pattern-input').val());\n if (pattern) {\n self.updateDraftTagCount($tag, pattern, newCaseSensitive);\n }\n } else {\n var $row = $tag.closest('.group-include, .exclude-row');\n self.serializeAllBlocks($row);\n }\n });\n\n // Handle pattern match count click - show preview modal\n this.$wrapper.on('click', '.pattern-match-count', function(e) {\n e.preventDefault();\n e.stopPropagation();\n\n var $matchCount = $(this);\n var count = $matchCount.data('count');\n var pattern = $matchCount.data('pattern');\n var entityType = $matchCount.data('entityType');\n var caseSensitive = $matchCount.data('caseSensitive');\n\n if (!count || count <= 0 || !pattern) {\n return;\n }\n\n self.showPatternPreviewModal(pattern, entityType, caseSensitive, count);\n });\n\n // Handle pattern tag edit (click on tag text)\n this.$wrapper.on('click', '.pattern-tag .pattern-tag-text', function(e) {\n e.preventDefault();\n var $tag = $(this).closest('.pattern-tag');\n if ($tag.hasClass('editing')) return;\n\n var currentPattern = $tag.data('pattern');\n\n var $editInput = $('').val(currentPattern);\n var $saveBtn = $('');\n var $cancelBtn = $('');\n var $editActions = $('').append($saveBtn, $cancelBtn);\n\n $tag.addClass('editing').find('.pattern-tag-text').hide();\n $tag.find('.btn-remove-pattern').hide();\n $tag.prepend($editActions).prepend($editInput);\n $editInput.focus().select();\n\n $editInput.on('keydown', function(ev) {\n if (ev.keyCode === 13) {\n ev.preventDefault();\n $saveBtn.click();\n } else if (ev.keyCode === 27) {\n ev.preventDefault();\n $cancelBtn.click();\n }\n });\n });\n\n // Pattern edit - Save button\n this.$wrapper.on('click', '.pattern-tag .btn-pattern-save', function(e) {\n e.preventDefault();\n e.stopPropagation();\n var $tag = $(this).closest('.pattern-tag');\n var $editInput = $tag.find('.pattern-tag-edit');\n var currentPattern = $tag.data('pattern');\n var newPattern = $.trim($editInput.val());\n\n if (newPattern && newPattern !== currentPattern) {\n $tag.data('pattern', newPattern);\n $tag.find('.pattern-tag-text').text(newPattern);\n }\n $editInput.remove();\n $tag.find('.pattern-edit-actions').remove();\n $tag.removeClass('editing').find('.pattern-tag-text, .btn-remove-pattern').show();\n var $row = $tag.closest('.group-include, .exclude-row');\n self.serializeAllBlocks($row);\n });\n\n // Pattern edit - Cancel button\n this.$wrapper.on('click', '.pattern-tag .btn-pattern-cancel', function(e) {\n e.preventDefault();\n e.stopPropagation();\n var $tag = $(this).closest('.pattern-tag');\n $tag.find('.pattern-tag-edit').remove();\n $tag.find('.pattern-edit-actions').remove();\n $tag.removeClass('editing').find('.pattern-tag-text, .btn-remove-pattern').show();\n });\n\n // Handle mpr-info-wrapper tooltip with fixed positioning\n this.$wrapper.on('mouseenter', '.mpr-info-wrapper[data-details]', function() {\n var $wrapper = $(this);\n if ($wrapper.data('tooltip-active')) return;\n\n var content = $wrapper.attr('data-details');\n var tooltipClass = $wrapper.attr('data-tooltip-class') || '';\n var $tooltip = $('
', { class: 'mpr-tooltip mpr-tooltip-fixed ' + tooltipClass, html: content });\n\n $('body').append($tooltip);\n $wrapper.data('tooltip-active', true);\n\n var offset = $wrapper.offset();\n var triggerWidth = $wrapper.outerWidth();\n var tooltipWidth = $tooltip.outerWidth();\n var tooltipHeight = $tooltip.outerHeight();\n\n var left = offset.left + (triggerWidth / 2) - (tooltipWidth / 2);\n var top = offset.top - tooltipHeight - 10;\n\n if (left < 10) left = 10;\n if (left + tooltipWidth > $(window).width() - 10) {\n left = $(window).width() - tooltipWidth - 10;\n }\n\n $tooltip.css({\n position: 'fixed',\n left: left + 'px',\n top: (top - $(window).scrollTop()) + 'px'\n });\n\n $wrapper.data('tooltip-el', $tooltip);\n });\n\n this.$wrapper.on('mouseleave', '.mpr-info-wrapper[data-details]', function() {\n var $wrapper = $(this);\n var $tooltip = $wrapper.data('tooltip-el');\n if ($tooltip) {\n $tooltip.remove();\n }\n $wrapper.data('tooltip-active', false);\n $wrapper.data('tooltip-el', null);\n });\n\n // Handle numeric range input changes\n this.$wrapper.on('change', '.range-min-input, .range-max-input', function() {\n var $row = $(this).closest('.group-include, .exclude-row');\n self.serializeAllBlocks($row);\n });\n\n // Handle date range input changes\n this.$wrapper.on('change', '.date-from-input, .date-to-input', function() {\n var $row = $(this).closest('.group-include, .exclude-row');\n self.serializeAllBlocks($row);\n });\n\n // Handle select value changes\n this.$wrapper.on('change', '.select-value-input', function() {\n var $row = $(this).closest('.group-include, .exclude-row');\n self.serializeAllBlocks($row);\n });\n\n // Handle multi-range add button click\n this.$wrapper.on('click', '.btn-add-range', function(e) {\n e.preventDefault();\n var $picker = $(this).closest('.value-picker');\n var $row = $(this).closest('.group-include, .exclude-row');\n var $container = $picker.find('.multi-range-container');\n var $chipsContainer = $container.find('.multi-range-chips');\n var $minInput = $container.find('.range-min-input');\n var $maxInput = $container.find('.range-max-input');\n\n var minVal = $minInput.val().trim();\n var maxVal = $maxInput.val().trim();\n\n if (minVal === '' && maxVal === '') {\n return;\n }\n\n var step = parseFloat($minInput.attr('step')) || 0.01;\n var minAllowed = $minInput.attr('min');\n var hasMinConstraint = typeof minAllowed !== 'undefined' && minAllowed !== '';\n minAllowed = hasMinConstraint ? parseFloat(minAllowed) : null;\n\n var minNum = minVal !== '' ? parseFloat(minVal) : null;\n var maxNum = maxVal !== '' ? parseFloat(maxVal) : null;\n\n if (hasMinConstraint) {\n if (minNum !== null && minNum < minAllowed) {\n self.showRangeInputError($minInput, self.config.trans.min_value_error || 'Minimum value is ' + minAllowed);\n return;\n }\n if (maxNum !== null && maxNum < minAllowed) {\n self.showRangeInputError($maxInput, self.config.trans.min_value_error || 'Minimum value is ' + minAllowed);\n return;\n }\n }\n\n if (minNum !== null && maxNum !== null && minNum > maxNum) {\n self.showRangeInputError($minInput, self.config.trans.min_greater_than_max || 'Min cannot be greater than max');\n return;\n }\n\n var decimals = step < 1 ? String(step).split('.')[1].length : 0;\n if (minNum !== null) {\n if (step >= 1) {\n minNum = Math.round(minNum);\n } else {\n minNum = parseFloat(minNum.toFixed(decimals));\n }\n minVal = String(minNum);\n }\n if (maxNum !== null) {\n if (step >= 1) {\n maxNum = Math.round(maxNum);\n } else {\n maxNum = parseFloat(maxNum.toFixed(decimals));\n }\n maxVal = String(maxNum);\n }\n\n var chipText = '';\n if (minVal !== '' && maxVal !== '') {\n chipText = minVal + ' - ' + maxVal;\n } else if (minVal !== '') {\n chipText = '≥ ' + minVal;\n } else {\n chipText = '≤ ' + maxVal;\n }\n\n var $chip = $('', {\n class: 'range-chip',\n 'data-min': minVal,\n 'data-max': maxVal\n });\n $chip.append($('', { class: 'range-chip-text', text: chipText }));\n $chip.append($('';\n html += '';\n\n // Sort controls - options with data-entities attribute for entity-specific filtering\n html += '
';\n html += '';\n html += '';\n\n // View mode selector - Tree option always present, shown for categories\n html += '';\n html += '
'; // End sort-controls\n\n // Refine search\n html += '
';\n html += '';\n html += '';\n html += '';\n html += '
';\n\n // Filter toggle button\n html += '';\n\n // History button\n html += '';\n\n html += '
'; // End dropdown-actions\n html += '
'; // End dropdown-header\n\n // Filter panel\n html += '
';\n\n // Quick filters row (for products)\n html += '
';\n html += '';\n html += '';\n\n // Price range\n html += '
';\n html += '' + (trans.price || 'Price') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n\n html += '';\n html += '
';\n\n // Attribute/Feature filter toggles for products\n html += '
';\n html += ' ' + (trans.attributes || 'Attributes') + ':';\n html += '
';\n html += '
';\n html += '
';\n html += '
';\n html += '
';\n\n html += '
';\n html += ' ' + (trans.features || 'Features') + ':';\n html += '
';\n html += '
';\n html += '
';\n html += '
';\n html += '
';\n\n // Entity-specific filters: Categories\n html += '
';\n html += '
';\n html += '
';\n html += ' ' + (trans.product_count || 'Products') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '
';\n html += ' ' + (trans.total_sales || 'Sales') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '
';\n html += ' ' + (trans.turnover || 'Revenue') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '';\n html += '
';\n html += '
';\n html += '
';\n html += ' ' + (trans.depth || 'Depth') + ':';\n html += '';\n html += '
';\n html += '';\n html += '';\n html += '';\n html += '';\n html += '
';\n html += '
';\n\n // Entity-specific filters: Manufacturers\n html += '
';\n html += '
';\n html += '
';\n html += ' ' + (trans.product_count || 'Products') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '
';\n html += ' ' + (trans.total_sales || 'Sales') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '
';\n html += ' ' + (trans.turnover || 'Revenue') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '';\n html += '
';\n html += '
';\n html += '
';\n html += ' ' + (trans.date_added || 'Added') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '
';\n html += ' ' + (trans.last_product || 'Last product') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '';\n html += '
';\n html += '
';\n\n // Entity-specific filters: Suppliers\n html += '
';\n html += '
';\n html += '
';\n html += ' ' + (trans.product_count || 'Products') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '
';\n html += ' ' + (trans.total_sales || 'Sales') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '
';\n html += ' ' + (trans.turnover || 'Revenue') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '';\n html += '
';\n html += '
';\n html += '
';\n html += ' ' + (trans.date_added || 'Added') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '
';\n html += ' ' + (trans.last_product || 'Last product') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '';\n html += '
';\n html += '
';\n\n // Entity-specific filters: Attributes\n html += '
';\n html += '
';\n html += '
';\n html += ' ' + (trans.product_count || 'Products') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '
';\n html += ' ' + (trans.total_sales || 'Sales') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '
';\n html += ' ' + (trans.turnover || 'Revenue') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '
';\n html += '
';\n html += '
';\n html += ' ' + (trans.attribute_group || 'Group') + ':';\n html += '';\n html += '
';\n html += '';\n html += '';\n html += '
';\n html += '
';\n\n // Entity-specific filters: Features\n html += '
';\n html += '
';\n html += '
';\n html += ' ' + (trans.product_count || 'Products') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '
';\n html += ' ' + (trans.total_sales || 'Sales') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '
';\n html += ' ' + (trans.turnover || 'Revenue') + ':';\n html += '';\n html += '-';\n html += '';\n html += '
';\n html += '
';\n html += '
';\n html += '
';\n html += ' ' + (trans.feature_group || 'Group') + ':';\n html += '';\n html += '
';\n html += '';\n html += '';\n html += '
';\n html += '
';\n\n // Entity-specific filters: CMS Pages\n html += '
';\n html += '';\n html += '';\n html += '';\n html += '
';\n\n // Entity-specific filters: CMS Categories\n html += '
';\n html += '';\n html += '';\n html += '
';\n\n // Entity-specific filters: Countries\n html += '
';\n html += '';\n html += '';\n html += '';\n html += '
';\n html += ' ' + (trans.zone || 'Zone') + ':';\n html += '';\n html += '
';\n html += '';\n html += '
';\n\n html += '
'; // End filter-panel\n\n // Results header for list view (product columns)\n html += '
';\n html += '';\n html += '' + (trans.product || 'Product') + '';\n html += '' + (trans.price || 'Price') + '';\n html += '' + (trans.sale || 'Sale') + '';\n html += '' + (trans.stock || 'Stock') + '';\n html += '' + (trans.sold || 'Sold') + '';\n html += '
';\n\n // Results\n html += '
';\n\n // Footer - unified load more + actions\n html += '
';\n\n // Left side: load more\n html += '';\n\n // Right side: action buttons\n html += '';\n\n html += '
';\n\n html += '';\n\n this.$dropdown = $(html);\n $('body').append(this.$dropdown);\n },\n\n hideDropdown: function() {\n if (this.$dropdown) {\n this.$dropdown.removeClass('show');\n }\n this.activeGroup = null;\n },\n\n positionDropdown: function($input) {\n if (!this.$dropdown) return;\n\n var $picker = $input.closest('.value-picker');\n var $searchBox = $input.closest('.entity-search-box');\n\n // Get absolute positions (dropdown is appended to body)\n var searchBoxOffset = $searchBox.offset();\n var searchBoxHeight = $searchBox.outerHeight();\n var pickerOffset = $picker.offset();\n var pickerWidth = $picker.outerWidth();\n\n // Calculate position relative to document\n var dropdownTop = searchBoxOffset.top + searchBoxHeight + 4;\n var dropdownLeft = pickerOffset.left;\n var dropdownWidth = Math.max(pickerWidth, 400);\n\n // Ensure dropdown doesn't overflow the viewport horizontally\n var viewportWidth = $(window).width();\n if (dropdownLeft + dropdownWidth > viewportWidth - 10) {\n dropdownWidth = viewportWidth - dropdownLeft - 10;\n }\n\n // Ensure dropdown doesn't overflow viewport vertically\n var viewportHeight = $(window).height();\n var scrollTop = $(window).scrollTop();\n var maxHeight = viewportHeight - (dropdownTop - scrollTop) - 20;\n maxHeight = Math.max(maxHeight, 400);\n\n this.$dropdown.css({\n position: 'absolute',\n top: dropdownTop,\n left: dropdownLeft,\n width: dropdownWidth,\n maxHeight: maxHeight,\n zIndex: 10000\n });\n\n // Show the dropdown\n this.$dropdown.addClass('show');\n }\n };\n\n})(jQuery);\n","/**\n * Entity Selector - Search Module\n * AJAX search, results rendering, category tree, filters, search history\n * @partial _search.js\n */\n\n(function($) {\n 'use strict';\n\n window._EntitySelectorMixins = window._EntitySelectorMixins || {};\n\n window._EntitySelectorMixins.search = {\n\n // Category tree cache\n categoryTreeCache: null,\n\n /**\n * Perform AJAX search for entities\n */\n performSearch: function(appendMode) {\n var self = this;\n\n if (!this.activeGroup) return;\n\n this.isLoading = true;\n\n var searchEntity = this.activeGroup.searchEntity;\n\n // Build request data with sort and filter params\n var limit = appendMode && this.loadMoreCount ? this.loadMoreCount : 20;\n var requestData = {\n ajax: 1,\n action: 'searchTargetEntities',\n trait: 'EntitySelector',\n entity_type: searchEntity,\n q: this.searchQuery,\n limit: limit,\n offset: appendMode ? this.searchOffset : 0,\n sort_by: this.currentSort ? this.currentSort.field : 'name',\n sort_dir: this.currentSort ? this.currentSort.dir : 'ASC'\n };\n\n // Add refine query if present\n if (this.refineQuery) {\n requestData.refine = this.refineQuery;\n if (this.refineNegate) {\n requestData.refine_negate = 1;\n }\n }\n\n // Add product-specific filters\n if (searchEntity === 'products' && this.filters) {\n if (this.filters.inStock) {\n requestData.filter_in_stock = 1;\n }\n if (this.filters.discounted) {\n requestData.filter_discounted = 1;\n }\n if (this.filters.priceMin !== null && this.filters.priceMin !== '') {\n requestData.filter_price_min = this.filters.priceMin;\n }\n if (this.filters.priceMax !== null && this.filters.priceMax !== '') {\n requestData.filter_price_max = this.filters.priceMax;\n }\n if (this.filters.attributes && this.filters.attributes.length > 0) {\n requestData.filter_attributes = JSON.stringify(this.filters.attributes);\n }\n if (this.filters.features && this.filters.features.length > 0) {\n requestData.filter_features = JSON.stringify(this.filters.features);\n }\n }\n\n // Add entity-specific filters for non-product entities\n if (searchEntity !== 'products' && this.filters) {\n // Product count range (categories, manufacturers, suppliers, attributes, features)\n if (this.filters.productCountMin !== null && this.filters.productCountMin !== '') {\n requestData.filter_product_count_min = this.filters.productCountMin;\n }\n if (this.filters.productCountMax !== null && this.filters.productCountMax !== '') {\n requestData.filter_product_count_max = this.filters.productCountMax;\n }\n\n // Category-specific\n if (searchEntity === 'categories') {\n if (this.filters.depth) {\n requestData.filter_depth = this.filters.depth;\n }\n if (this.filters.hasProducts) {\n requestData.filter_has_products = 1;\n }\n if (this.filters.hasDescription) {\n requestData.filter_has_description = 1;\n }\n if (this.filters.hasImage) {\n requestData.filter_has_image = 1;\n }\n if (this.filters.salesMin !== null && this.filters.salesMin !== '') {\n requestData.filter_sales_min = this.filters.salesMin;\n }\n if (this.filters.salesMax !== null && this.filters.salesMax !== '') {\n requestData.filter_sales_max = this.filters.salesMax;\n }\n if (this.filters.turnoverMin !== null && this.filters.turnoverMin !== '') {\n requestData.filter_turnover_min = this.filters.turnoverMin;\n }\n if (this.filters.turnoverMax !== null && this.filters.turnoverMax !== '') {\n requestData.filter_turnover_max = this.filters.turnoverMax;\n }\n if (this.filters.activeOnly) {\n requestData.filter_active = 1;\n }\n }\n\n // Manufacturer-specific\n if (searchEntity === 'manufacturers') {\n if (this.filters.salesMin !== null && this.filters.salesMin !== '') {\n requestData.filter_sales_min = this.filters.salesMin;\n }\n if (this.filters.salesMax !== null && this.filters.salesMax !== '') {\n requestData.filter_sales_max = this.filters.salesMax;\n }\n if (this.filters.turnoverMin !== null && this.filters.turnoverMin !== '') {\n requestData.filter_turnover_min = this.filters.turnoverMin;\n }\n if (this.filters.turnoverMax !== null && this.filters.turnoverMax !== '') {\n requestData.filter_turnover_max = this.filters.turnoverMax;\n }\n if (this.filters.dateAddFrom) {\n requestData.filter_date_add_from = this.filters.dateAddFrom;\n }\n if (this.filters.dateAddTo) {\n requestData.filter_date_add_to = this.filters.dateAddTo;\n }\n if (this.filters.lastProductFrom) {\n requestData.filter_last_product_from = this.filters.lastProductFrom;\n }\n if (this.filters.lastProductTo) {\n requestData.filter_last_product_to = this.filters.lastProductTo;\n }\n if (this.filters.activeOnly) {\n requestData.filter_active = 1;\n }\n }\n\n // Supplier-specific\n if (searchEntity === 'suppliers') {\n if (this.filters.salesMin !== null && this.filters.salesMin !== '') {\n requestData.filter_sales_min = this.filters.salesMin;\n }\n if (this.filters.salesMax !== null && this.filters.salesMax !== '') {\n requestData.filter_sales_max = this.filters.salesMax;\n }\n if (this.filters.turnoverMin !== null && this.filters.turnoverMin !== '') {\n requestData.filter_turnover_min = this.filters.turnoverMin;\n }\n if (this.filters.turnoverMax !== null && this.filters.turnoverMax !== '') {\n requestData.filter_turnover_max = this.filters.turnoverMax;\n }\n if (this.filters.dateAddFrom) {\n requestData.filter_date_add_from = this.filters.dateAddFrom;\n }\n if (this.filters.dateAddTo) {\n requestData.filter_date_add_to = this.filters.dateAddTo;\n }\n if (this.filters.lastProductFrom) {\n requestData.filter_last_product_from = this.filters.lastProductFrom;\n }\n if (this.filters.lastProductTo) {\n requestData.filter_last_product_to = this.filters.lastProductTo;\n }\n if (this.filters.activeOnly) {\n requestData.filter_active = 1;\n }\n }\n\n // Attribute-specific\n if (searchEntity === 'attributes') {\n if (this.filters.salesMin !== null && this.filters.salesMin !== '') {\n requestData.filter_sales_min = this.filters.salesMin;\n }\n if (this.filters.salesMax !== null && this.filters.salesMax !== '') {\n requestData.filter_sales_max = this.filters.salesMax;\n }\n if (this.filters.turnoverMin !== null && this.filters.turnoverMin !== '') {\n requestData.filter_turnover_min = this.filters.turnoverMin;\n }\n if (this.filters.turnoverMax !== null && this.filters.turnoverMax !== '') {\n requestData.filter_turnover_max = this.filters.turnoverMax;\n }\n if (this.filters.attributeGroup) {\n requestData.filter_attribute_group = this.filters.attributeGroup;\n }\n if (this.filters.isColor) {\n requestData.filter_is_color = 1;\n }\n }\n\n // Feature-specific\n if (searchEntity === 'features') {\n if (this.filters.salesMin !== null && this.filters.salesMin !== '') {\n requestData.filter_sales_min = this.filters.salesMin;\n }\n if (this.filters.salesMax !== null && this.filters.salesMax !== '') {\n requestData.filter_sales_max = this.filters.salesMax;\n }\n if (this.filters.turnoverMin !== null && this.filters.turnoverMin !== '') {\n requestData.filter_turnover_min = this.filters.turnoverMin;\n }\n if (this.filters.turnoverMax !== null && this.filters.turnoverMax !== '') {\n requestData.filter_turnover_max = this.filters.turnoverMax;\n }\n if (this.filters.featureGroup) {\n requestData.filter_feature_group = this.filters.featureGroup;\n }\n if (this.filters.isCustom) {\n requestData.filter_is_custom = 1;\n }\n }\n\n // CMS-specific\n if (searchEntity === 'cms') {\n if (this.filters.activeOnly) {\n requestData.filter_active = 1;\n }\n if (this.filters.indexable) {\n requestData.filter_indexable = 1;\n }\n }\n\n // CMS Categories-specific\n if (searchEntity === 'cms_categories') {\n if (this.filters.activeOnly) {\n requestData.filter_active = 1;\n }\n }\n\n // Countries-specific\n if (searchEntity === 'countries') {\n if (this.filters.activeOnly) {\n requestData.filter_active = 1;\n }\n if (this.filters.hasHolidays) {\n requestData.filter_has_holidays = 1;\n }\n if (this.filters.containsStates) {\n requestData.filter_contains_states = 1;\n }\n if (this.filters.zone) {\n requestData.filter_zone = this.filters.zone;\n }\n }\n }\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: requestData,\n success: function(response) {\n self.isLoading = false;\n\n if (!response.success) return;\n\n // Save to search history if query is not empty and has results\n if (self.searchQuery && self.searchQuery.length >= 2 && response.total > 0) {\n self.addToSearchHistory(searchEntity, self.searchQuery);\n }\n\n if (appendMode) {\n self.searchResults = self.searchResults.concat(response.results || []);\n } else {\n self.searchResults = response.results || [];\n }\n self.searchTotal = response.total || 0;\n self.searchOffset = appendMode ? self.searchOffset + (response.results || []).length : (response.results || []).length;\n\n self.renderSearchResults(appendMode);\n self.$dropdown.addClass('show');\n },\n error: function() {\n self.isLoading = false;\n }\n });\n },\n\n /**\n * Render search results in the dropdown\n */\n renderSearchResults: function(appendMode) {\n var self = this;\n var trans = this.config.trans || {};\n var $container = this.$dropdown.find('.dropdown-results');\n\n // Get selected IDs from current picker (to mark as selected)\n // and hidden IDs from sibling exclude pickers with same entity type (to hide completely)\n var selectedIds = [];\n var hiddenIds = [];\n if (this.activeGroup) {\n var $block = this.$wrapper.find('.target-block[data-block-type=\"' + this.activeGroup.blockType + '\"]');\n var $group = $block.find('.selection-group[data-group-index=\"' + this.activeGroup.groupIndex + '\"]');\n var currentSearchEntity = this.activeGroup.searchEntity;\n var currentExcludeIndex = this.activeGroup.excludeIndex;\n\n if (this.activeGroup.section === 'include') {\n // For include section, just get current picker's selections\n var $picker = $group.find('.include-picker');\n $picker.find('.entity-chip').each(function() {\n selectedIds.push(String($(this).data('id')));\n });\n } else {\n // For exclude section, get current picker's selections AND\n // collect IDs from sibling exclude rows with same entity type to hide\n var $currentExcludeRow = $group.find('.exclude-row[data-exclude-index=\"' + currentExcludeIndex + '\"]');\n var $currentPicker = $currentExcludeRow.find('.exclude-picker');\n\n // Get selected IDs from current exclude row\n $currentPicker.find('.entity-chip').each(function() {\n selectedIds.push(String($(this).data('id')));\n });\n\n // Get hidden IDs from OTHER exclude rows with the same entity type\n $group.find('.exclude-row').each(function() {\n var $row = $(this);\n var rowIndex = parseInt($row.data('excludeIndex'), 10);\n\n // Skip current exclude row\n if (rowIndex === currentExcludeIndex) return;\n\n var $picker = $row.find('.exclude-picker');\n var rowEntityType = $picker.attr('data-search-entity') || self.activeGroup.blockType;\n\n // Only collect if same entity type\n if (rowEntityType === currentSearchEntity) {\n $picker.find('.entity-chip').each(function() {\n hiddenIds.push(String($(this).data('id')));\n });\n }\n });\n }\n }\n\n // Check if this is a product search\n var isProductSearch = this.activeGroup && this.activeGroup.searchEntity === 'products';\n var isListView = this.viewMode === 'list';\n\n // Show/hide results header for products in list view\n this.$dropdown.find('.results-header').toggle(isProductSearch && isListView);\n\n // Build HTML - filter out items that are hidden (selected in sibling exclude rows)\n var visibleResults = this.searchResults.filter(function(item) {\n return hiddenIds.indexOf(String(item.id)) === -1;\n });\n\n // Update count (show visible count and total, noting hidden items if any)\n var hiddenCount = this.searchResults.length - visibleResults.length;\n var countText = visibleResults.length + ' / ' + this.searchTotal + ' results';\n if (hiddenCount > 0) {\n countText += ' (' + hiddenCount + ' hidden)';\n }\n this.$dropdown.find('.results-count').text(countText);\n\n var html = '';\n if (visibleResults.length === 0 && !appendMode) {\n html = '
' + (trans.no_results || 'No results found') + '
';\n } else {\n visibleResults.forEach(function(item) {\n var isSelected = selectedIds.indexOf(String(item.id)) !== -1;\n var itemClass = 'dropdown-item' + (isSelected ? ' selected' : '');\n if (item.type === 'product') itemClass += ' result-item-product';\n\n html += '
';\n } else if (item.image) {\n html += '
\"\"
';\n } else {\n // Entity-specific icons\n var iconClass = 'icon-cube'; // default\n if (searchEntity === 'categories') iconClass = 'icon-folder';\n else if (searchEntity === 'manufacturers') iconClass = 'icon-building';\n else if (searchEntity === 'suppliers') iconClass = 'icon-truck';\n else if (searchEntity === 'attributes') iconClass = 'icon-paint-brush';\n else if (searchEntity === 'features') iconClass = 'icon-list-ul';\n else if (searchEntity === 'cms') iconClass = 'icon-file-text-o';\n else if (searchEntity === 'cms_categories') iconClass = 'icon-folder-o';\n html += '
';\n }\n\n html += '
';\n html += '
' + self.escapeHtml(item.name) + '
';\n if (item.subtitle) {\n // Split multi-line subtitles into separate divs for styling\n var subtitleLines = item.subtitle.split('\\n');\n html += '
';\n subtitleLines.forEach(function(line, idx) {\n var lineClass = idx === 0 ? 'subtitle-line subtitle-line-primary' : 'subtitle-line subtitle-line-secondary';\n html += '
' + self.escapeHtml(line) + '
';\n });\n html += '
';\n }\n html += '
';\n\n // Add product-specific columns (price, sale price, stock, sold)\n if (item.type === 'product') {\n if (isListView) {\n // List view: full columns\n // Regular price\n html += '
';\n html += '' + (item.regular_price_formatted || item.price_formatted || '') + '';\n html += '
';\n\n // Sale price (only if discounted)\n if (item.has_discount) {\n html += '
';\n html += '' + (item.price_formatted || '') + '';\n html += '
';\n } else {\n html += '
';\n }\n\n // Stock column\n var stockClass = item.stock_status === 'out_of_stock' ? 'stock-out' :\n (item.stock_status === 'low_stock' ? 'stock-low' : 'stock-ok');\n html += '
';\n html += '' + (item.stock_qty !== undefined ? item.stock_qty : '') + '';\n html += '
';\n\n // Sales column\n html += '
';\n html += '' + (item.sales_qty !== undefined ? item.sales_qty : '0') + '';\n html += '
';\n } else {\n // Grid view: compact info line\n var gridStockClass = item.stock_status === 'out_of_stock' ? 'stock-out' :\n (item.stock_status === 'low_stock' ? 'stock-low' : '');\n html += '
';\n html += '' + (item.price_formatted || '') + '';\n if (item.stock_qty !== undefined) {\n html += '' + item.stock_qty + ' qty';\n }\n if (item.has_discount) {\n html += '-' + (item.discount_percent || '') + '%';\n }\n html += '
';\n }\n }\n\n html += '';\n });\n }\n\n if (appendMode) {\n $container.append(html);\n } else {\n $container.html(html);\n }\n\n // Show/hide load more controls and update remaining count\n var hasMore = this.searchResults.length < this.searchTotal;\n var $loadMoreControls = this.$dropdown.find('.load-more-controls');\n $loadMoreControls.toggle(hasMore);\n\n if (hasMore) {\n var remaining = this.searchTotal - this.searchResults.length;\n $loadMoreControls.find('.remaining-count').text(remaining);\n\n // Update \"All\" option in dropdown\n var $select = $loadMoreControls.find('.load-more-select');\n var $allOption = $select.find('option[data-all=\"true\"]');\n if ($allOption.length) {\n $allOption.val(remaining).text((trans.all || 'All') + ' (' + remaining + ')');\n } else {\n $select.find('option:last').after('');\n }\n }\n\n // Ensure dropdown-actions are visible and history button is deactivated\n this.$dropdown.find('.dropdown-actions').show();\n this.$dropdown.find('.btn-show-history').removeClass('active');\n\n // Disable history button if no search history for current entity type\n var entityType = this.activeGroup ? this.activeGroup.searchEntity : null;\n var hasHistory = entityType && this.getSearchHistory(entityType).length > 0;\n this.$dropdown.find('.btn-show-history').prop('disabled', !hasHistory);\n },\n\n // NOTE: Tree methods (loadCategoryTree, renderCategoryTree, filterCategoryTree,\n // findTreeDescendants, findTreeAncestors, updateSelectChildrenButtons) are\n // defined in _tree.js which is merged later and takes precedence.\n\n // =========================================================================\n // Search History\n // =========================================================================\n\n loadSearchHistory: function() {\n try {\n var stored = localStorage.getItem(this.searchHistoryKey);\n this.searchHistory = stored ? JSON.parse(stored) : {};\n } catch (e) {\n this.searchHistory = {};\n }\n },\n\n saveSearchHistory: function() {\n try {\n localStorage.setItem(this.searchHistoryKey, JSON.stringify(this.searchHistory));\n } catch (e) {\n // localStorage might be full or unavailable\n }\n },\n\n addToSearchHistory: function(entityType, query) {\n if (!query || query.length < 2) return;\n\n if (!this.searchHistory[entityType]) {\n this.searchHistory[entityType] = [];\n }\n\n var history = this.searchHistory[entityType];\n\n // Remove if already exists (will re-add at top)\n var existingIndex = history.indexOf(query);\n if (existingIndex !== -1) {\n history.splice(existingIndex, 1);\n }\n\n // Add at beginning\n history.unshift(query);\n\n // Trim to max\n if (history.length > this.searchHistoryMax) {\n history = history.slice(0, this.searchHistoryMax);\n }\n\n this.searchHistory[entityType] = history;\n this.saveSearchHistory();\n },\n\n removeFromSearchHistory: function(entityType, query) {\n if (!this.searchHistory[entityType]) return;\n\n var index = this.searchHistory[entityType].indexOf(query);\n if (index !== -1) {\n this.searchHistory[entityType].splice(index, 1);\n this.saveSearchHistory();\n }\n },\n\n getSearchHistory: function(entityType) {\n return this.searchHistory[entityType] || [];\n },\n\n showSearchHistory: function(entityType) {\n var history = this.getSearchHistory(entityType);\n var trans = this.config.trans || {};\n var $container = this.$dropdown.find('.dropdown-results');\n\n // Update header\n this.$dropdown.find('.results-count').text(trans.recent_searches || 'Recent searches');\n\n // Hide filters, actions, and results header for history view\n this.$dropdown.find('.dropdown-actions').hide();\n this.$dropdown.find('.filter-panel').removeClass('show');\n this.$dropdown.find('.btn-toggle-filters').removeClass('active');\n this.$dropdown.find('.results-header').hide();\n\n if (!history.length) {\n // No history - just do a regular search\n this.performSearch();\n return;\n }\n\n // Build history items\n var html = '
';\n for (var i = 0; i < history.length; i++) {\n var query = history[i];\n html += '
';\n html += '';\n html += '' + this.escapeHtml(query) + '';\n html += '';\n html += '
';\n }\n html += '
';\n\n $container.html(html);\n this.$dropdown.addClass('show');\n },\n\n // =========================================================================\n // Filter Methods\n // =========================================================================\n\n refreshSearch: function() {\n // In tree view mode, re-filter the tree instead of doing a flat AJAX search\n if (this.viewMode === 'tree') {\n this.filterCategoryTree(this.searchQuery || '');\n return;\n }\n\n this.searchOffset = 0;\n this.loadMoreCount = 20;\n // Reset load more select to default\n if (this.$dropdown) {\n this.$dropdown.find('.load-more-select').val('20');\n // Remove the dynamic \"All\" option\n this.$dropdown.find('.load-more-select option[data-all=\"true\"]').remove();\n }\n this.performSearch(false);\n },\n\n clearFilters: function() {\n this.refineQuery = '';\n this.refineNegate = false;\n this.filters = {\n inStock: false,\n discounted: false,\n priceMin: null,\n priceMax: null,\n attributes: [],\n features: [],\n // Entity-specific filters\n productCountMin: null,\n productCountMax: null,\n salesMin: null,\n salesMax: null,\n turnoverMin: null,\n turnoverMax: null,\n depth: null,\n hasProducts: false,\n hasDescription: false,\n hasImage: false,\n activeOnly: true,\n attributeGroup: null,\n featureGroup: null,\n dateAddFrom: null,\n dateAddTo: null,\n lastProductFrom: null,\n lastProductTo: null,\n // Country-specific filters\n hasHolidays: false,\n containsStates: false,\n zone: null\n };\n\n if (this.$dropdown) {\n var trans = this.config.trans || {};\n this.$dropdown.find('.refine-input').val('').attr('placeholder', trans.refine_short || 'Refine...');\n this.$dropdown.find('.btn-clear-refine').hide();\n this.$dropdown.find('.btn-refine-negate').removeClass('active');\n this.$dropdown.find('.filter-in-stock').prop('checked', false);\n this.$dropdown.find('.filter-discounted').prop('checked', false);\n this.$dropdown.find('.filter-price-min').val('');\n this.$dropdown.find('.filter-price-max').val('');\n this.$dropdown.find('.filter-attr-chip').removeClass('active');\n this.$dropdown.find('.filter-feat-chip').removeClass('active');\n this.$dropdown.find('.filter-group-toggle').removeClass('active has-selection');\n this.$dropdown.find('.filter-row-values').hide();\n\n // Clear entity-specific filter inputs\n this.$dropdown.find('.filter-product-count-min, .filter-product-count-max').val('');\n this.$dropdown.find('.filter-sales-min, .filter-sales-max').val('');\n this.$dropdown.find('.filter-turnover-min, .filter-turnover-max').val('');\n this.$dropdown.find('.filter-date-add-from, .filter-date-add-to').val('');\n this.$dropdown.find('.filter-last-product-from, .filter-last-product-to').val('');\n this.$dropdown.find('.filter-depth-select').val('');\n this.$dropdown.find('.filter-has-products').prop('checked', false);\n this.$dropdown.find('.filter-has-description').prop('checked', false);\n this.$dropdown.find('.filter-has-image').prop('checked', false);\n this.$dropdown.find('.filter-active-only').prop('checked', true);\n this.$dropdown.find('.filter-attribute-group-select, .filter-feature-group-select').val('');\n // Country filters\n this.$dropdown.find('.filter-has-holidays').prop('checked', false);\n this.$dropdown.find('.filter-contains-states').prop('checked', false);\n this.$dropdown.find('.filter-zone-select').val('');\n }\n\n this.refreshSearch();\n },\n\n // Reset filters without triggering a search (used when switching entity types)\n resetFiltersWithoutSearch: function() {\n this.refineQuery = '';\n this.refineNegate = false;\n this.filters = {\n inStock: false,\n discounted: false,\n priceMin: null,\n priceMax: null,\n attributes: [],\n features: [],\n productCountMin: null,\n productCountMax: null,\n salesMin: null,\n salesMax: null,\n turnoverMin: null,\n turnoverMax: null,\n depth: null,\n hasProducts: false,\n hasDescription: false,\n hasImage: false,\n activeOnly: true,\n attributeGroup: null,\n featureGroup: null,\n dateAddFrom: null,\n dateAddTo: null,\n lastProductFrom: null,\n lastProductTo: null,\n // Country-specific filters\n hasHolidays: false,\n containsStates: false,\n zone: null\n };\n\n if (this.$dropdown) {\n var trans = this.config.trans || {};\n this.$dropdown.find('.refine-input').val('').attr('placeholder', trans.refine_short || 'Refine...');\n this.$dropdown.find('.btn-clear-refine').hide();\n this.$dropdown.find('.btn-refine-negate').removeClass('active');\n this.$dropdown.find('.filter-in-stock').prop('checked', false);\n this.$dropdown.find('.filter-discounted').prop('checked', false);\n this.$dropdown.find('.filter-price-min').val('');\n this.$dropdown.find('.filter-price-max').val('');\n this.$dropdown.find('.filter-attr-chip').removeClass('active');\n this.$dropdown.find('.filter-feat-chip').removeClass('active');\n this.$dropdown.find('.filter-group-toggle').removeClass('active has-selection');\n this.$dropdown.find('.filter-row-values').hide();\n this.$dropdown.find('.filter-product-count-min, .filter-product-count-max').val('');\n this.$dropdown.find('.filter-sales-min, .filter-sales-max').val('');\n this.$dropdown.find('.filter-turnover-min, .filter-turnover-max').val('');\n this.$dropdown.find('.filter-date-add-from, .filter-date-add-to').val('');\n this.$dropdown.find('.filter-last-product-from, .filter-last-product-to').val('');\n this.$dropdown.find('.filter-depth-select').val('');\n this.$dropdown.find('.filter-has-products').prop('checked', false);\n this.$dropdown.find('.filter-has-description').prop('checked', false);\n this.$dropdown.find('.filter-has-image').prop('checked', false);\n this.$dropdown.find('.filter-active-only').prop('checked', true);\n this.$dropdown.find('.filter-attribute-group-select, .filter-feature-group-select').val('');\n // Country filters\n this.$dropdown.find('.filter-has-holidays').prop('checked', false);\n this.$dropdown.find('.filter-contains-states').prop('checked', false);\n this.$dropdown.find('.filter-zone-select').val('');\n }\n // Note: Does NOT call refreshSearch() - caller handles search/load\n },\n\n updateFilterPanelForEntity: function(entityType) {\n if (!this.$dropdown) {\n return;\n }\n\n var $panel = this.$dropdown.find('.filter-panel');\n\n // Hide all filter rows first\n $panel.find('.filter-row').hide();\n\n // Show/hide tree view option based on entity type\n var $treeOption = this.$dropdown.find('.view-mode-select option.tree-view-option');\n if (entityType === 'categories' || entityType === 'cms_categories') {\n $treeOption.prop('disabled', false).prop('hidden', false);\n // Auto-switch to tree view for categories\n if (this.viewMode !== 'tree') {\n this.viewMode = 'tree';\n this.$dropdown.find('.view-mode-select').val('tree');\n this.$dropdown.removeClass('view-list view-cols-2 view-cols-3 view-cols-4 view-cols-5 view-cols-6 view-cols-7 view-cols-8').addClass('view-tree');\n this.loadCategoryTree();\n } else {\n this.loadCategoryTree();\n }\n } else {\n $treeOption.prop('disabled', true).prop('hidden', true);\n // If currently in tree mode, switch back to list\n if (this.viewMode === 'tree') {\n this.viewMode = 'list';\n this.$dropdown.find('.view-mode-select').val('list');\n this.$dropdown.removeClass('view-tree').addClass('view-list');\n }\n }\n\n // Show entity-specific filter row (prepare visibility, but don't auto-expand panel)\n if (entityType === 'products') {\n // Prepare the correct rows to be visible when panel is shown\n $panel.find('.filter-row-quick').show();\n // Show attribute/feature rows if we have cached data\n if (this.filterableData) {\n if (this.filterableData.attributes && this.filterableData.attributes.length > 0) {\n this.$dropdown.find('.filter-row-attributes').show();\n }\n if (this.filterableData.features && this.filterableData.features.length > 0) {\n this.$dropdown.find('.filter-row-features').show();\n }\n }\n } else if (entityType === 'categories') {\n $panel.find('.filter-row-entity-categories').show();\n } else if (entityType === 'manufacturers') {\n $panel.find('.filter-row-entity-manufacturers').show();\n } else if (entityType === 'suppliers') {\n $panel.find('.filter-row-entity-suppliers').show();\n } else if (entityType === 'attributes') {\n $panel.find('.filter-row-entity-attributes').show();\n this.loadAttributeGroups();\n } else if (entityType === 'features') {\n $panel.find('.filter-row-entity-features').show();\n } else if (entityType === 'cms') {\n $panel.find('.filter-row-entity-cms').show();\n } else if (entityType === 'cms_categories') {\n $panel.find('.filter-row-entity-cms-categories').show();\n } else if (entityType === 'countries') {\n $panel.find('.filter-row-entity-countries').show();\n this.loadZonesForCountryFilter();\n }\n },\n\n loadAttributeGroups: function() {\n var self = this;\n var $select = this.$dropdown.find('.filter-attribute-group-select');\n\n // Already loaded?\n if ($select.find('option').length > 1) return;\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'getAttributeGroups',\n trait: 'EntitySelector'\n },\n success: function(response) {\n if (response.success && response.groups) {\n $.each(response.groups, function(i, group) {\n $select.append('');\n });\n }\n }\n });\n },\n\n loadFeatureGroups: function() {\n var self = this;\n var $select = this.$dropdown.find('.filter-feature-group-select');\n\n // Already loaded?\n if ($select.find('option').length > 1) return;\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'getFeatureGroups',\n trait: 'EntitySelector'\n },\n success: function(response) {\n if (response.success && response.groups) {\n $.each(response.groups, function(i, group) {\n $select.append('');\n });\n }\n }\n });\n }\n };\n\n})(jQuery);\n","/**\n * Entity Selector - Filters Module\n * Filter panel, filter state management\n * @partial _filters.js\n *\n * EXTRACTION SOURCE: assets/js/admin/entity-selector.js\n * Lines: 6605-6758 (filter methods)\n *\n * Contains:\n * - clearFilters() - Reset all filters\n * - resetFiltersWithoutSearch() - Reset without triggering search\n * - updateFilterPanelForEntity() - Show/hide filters based on entity type\n * - loadFilterableData() - Load attributes/features for filter panel\n * - renderFilterDropdowns() - Render attribute/feature group toggles\n * - showFilterGroupValues() - Show values for a filter group\n * - hideFilterGroupValues() - Hide filter values row\n * - updateFilterToggleStates() - Update toggle states based on selections\n */\n\n(function($) {\n 'use strict';\n\n window._EntitySelectorMixins = window._EntitySelectorMixins || {};\n\n window._EntitySelectorMixins.filters = {\n\n clearFilters: function() {\n this.refineQuery = '';\n this.refineNegate = false;\n this.filters = {\n inStock: false,\n discounted: false,\n priceMin: null,\n priceMax: null,\n attributes: [],\n features: [],\n productCountMin: null,\n productCountMax: null,\n salesMin: null,\n salesMax: null,\n turnoverMin: null,\n turnoverMax: null,\n depth: null,\n hasProducts: false,\n hasDescription: false,\n hasImage: false,\n activeOnly: true,\n attributeGroup: null,\n featureGroup: null,\n dateAddFrom: null,\n dateAddTo: null,\n lastProductFrom: null,\n lastProductTo: null,\n // Country-specific filters\n hasHolidays: false,\n containsStates: false,\n zone: null\n };\n\n if (this.$dropdown) {\n var trans = this.config.trans || {};\n this.$dropdown.find('.refine-input').val('');\n this.$dropdown.find('.btn-refine-negate').removeClass('active');\n this.$dropdown.find('.filter-in-stock').prop('checked', false);\n this.$dropdown.find('.filter-discounted').prop('checked', false);\n this.$dropdown.find('.filter-price-min, .filter-price-max').val('');\n this.$dropdown.find('.filter-attr-chip, .filter-feat-chip').removeClass('active');\n this.$dropdown.find('.filter-product-count-min, .filter-product-count-max').val('');\n this.$dropdown.find('.filter-sales-min, .filter-sales-max').val('');\n this.$dropdown.find('.filter-depth-select').val('');\n this.$dropdown.find('.filter-has-products').prop('checked', false);\n this.$dropdown.find('.filter-active-only').prop('checked', true);\n // Country filters\n this.$dropdown.find('.filter-has-holidays').prop('checked', false);\n this.$dropdown.find('.filter-contains-states').prop('checked', false);\n this.$dropdown.find('.filter-zone-select').val('');\n }\n\n this.refreshSearch();\n },\n\n resetFiltersWithoutSearch: function() {\n // Same as clearFilters but doesn't trigger search\n // Used when switching entity types\n this.refineQuery = '';\n this.refineNegate = false;\n this.filters = {\n inStock: false,\n discounted: false,\n priceMin: null,\n priceMax: null,\n attributes: [],\n features: [],\n productCountMin: null,\n productCountMax: null,\n salesMin: null,\n salesMax: null,\n turnoverMin: null,\n turnoverMax: null,\n depth: null,\n hasProducts: false,\n hasDescription: false,\n hasImage: false,\n activeOnly: true,\n attributeGroup: null,\n featureGroup: null,\n dateAddFrom: null,\n dateAddTo: null,\n lastProductFrom: null,\n lastProductTo: null,\n // Country-specific filters\n hasHolidays: false,\n containsStates: false,\n zone: null\n };\n },\n\n updateFilterPanelForEntity: function(entityType) {\n if (!this.$dropdown) {\n return;\n }\n\n var $panel = this.$dropdown.find('.filter-panel');\n\n // Hide all entity-specific filter rows\n $panel.find('.filter-row').hide();\n\n // Show filters for current entity type\n $panel.find('.filter-row[data-entity=\"' + entityType + '\"]').show();\n $panel.find('.filter-row-entity-' + entityType.replace('_', '-')).show();\n\n // Show/hide tree view option based on entity type\n var isCategory = (entityType === 'categories' || entityType === 'cms_categories');\n this.$dropdown.find('.tree-view-option').toggle(isCategory);\n\n // Default to tree view for categories (only if currently on list mode)\n if (isCategory && this.viewMode === 'list') {\n this.viewMode = 'tree';\n this.$dropdown.find('.view-mode-select').val('tree');\n this.$dropdown.removeClass('view-list view-cols-2 view-cols-3 view-cols-4 view-cols-5 view-cols-6 view-cols-7 view-cols-8').addClass('view-tree');\n } else if (!isCategory && this.viewMode === 'tree') {\n // If switching away from categories while in tree mode, switch to list\n this.viewMode = 'list';\n this.$dropdown.find('.view-mode-select').val('list');\n this.$dropdown.removeClass('view-tree view-cols-2 view-cols-3 view-cols-4 view-cols-5 view-cols-6 view-cols-7 view-cols-8').addClass('view-list');\n }\n\n // Load zones for countries filter\n if (entityType === 'countries') {\n this.loadZonesForCountryFilter();\n }\n\n // Update sort options for entity type\n this.updateSortOptionsForEntity(entityType);\n },\n\n /**\n * Show/hide sort options based on entity type\n * Options with data-entities attribute are only shown for matching entities\n */\n updateSortOptionsForEntity: function(entityType) {\n if (!this.$dropdown) {\n return;\n }\n\n var $select = this.$dropdown.find('.sort-field-select');\n var currentValue = $select.val();\n var hasCurrentOption = false;\n\n $select.find('option').each(function() {\n var $option = $(this);\n var entities = $option.data('entities');\n\n // Options without data-entities are universal (always shown)\n if (!entities) {\n $option.show();\n if ($option.val() === currentValue) {\n hasCurrentOption = true;\n }\n return;\n }\n\n // Check if this entity type is in the allowed list\n var allowedEntities = entities.split(',');\n var isAllowed = allowedEntities.indexOf(entityType) !== -1;\n\n $option.toggle(isAllowed);\n\n if (isAllowed && $option.val() === currentValue) {\n hasCurrentOption = true;\n }\n });\n\n // If current sort field is not available for this entity, reset to 'name'\n if (!hasCurrentOption) {\n $select.val('name');\n this.currentSort.field = 'name';\n }\n },\n\n loadFilterableData: function() {\n var self = this;\n\n if (this.filterableData) {\n this.renderFilterDropdowns();\n return;\n }\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n data: {\n ajax: 1,\n action: 'getTargetFilterableAttributes',\n trait: 'EntitySelector'\n },\n dataType: 'json',\n success: function(response) {\n if (response.success && response.data) {\n self.filterableData = response.data;\n self.renderFilterDropdowns();\n }\n }\n });\n },\n\n renderFilterDropdowns: function() {\n if (!this.$dropdown || !this.filterableData) return;\n\n var self = this;\n\n // Render attribute group toggle buttons\n var $attrContainer = this.$dropdown.find('.filter-attributes-container');\n $attrContainer.empty();\n\n if (this.filterableData.attributes && this.filterableData.attributes.length > 0) {\n this.filterableData.attributes.forEach(function(group) {\n var html = '';\n $attrContainer.append(html);\n });\n this.$dropdown.find('.filter-row-attributes').show();\n }\n\n // Render feature group toggle buttons\n var $featContainer = this.$dropdown.find('.filter-features-container');\n $featContainer.empty();\n\n if (this.filterableData.features && this.filterableData.features.length > 0) {\n this.filterableData.features.forEach(function(group) {\n var html = '';\n $featContainer.append(html);\n });\n this.$dropdown.find('.filter-row-features').show();\n }\n },\n\n showFilterGroupValues: function(groupId, type) {\n if (!this.filterableData) return;\n\n var self = this;\n var groups = type === 'attribute' ? this.filterableData.attributes : this.filterableData.features;\n var group = groups.find(function(g) { return g.id == groupId; });\n\n if (!group) return;\n\n // Hide all values rows first, then show the correct one\n this.$dropdown.find('.filter-row-values').hide();\n\n // Target the correct values row based on type\n var valuesRowClass = type === 'attribute' ? '.filter-row-attr-values' : '.filter-row-feat-values';\n var $filterRowValues = this.$dropdown.find(valuesRowClass);\n var $valuesContainer = $filterRowValues.find('.filter-values-container');\n $valuesContainer.empty();\n\n // Add group label\n var html = '' + group.name + ':';\n\n // Add chips\n group.values.forEach(function(val) {\n var isActive = type === 'attribute'\n ? self.filters.attributes.indexOf(val.id) !== -1\n : self.filters.features.indexOf(val.id) !== -1;\n var activeClass = isActive ? ' active' : '';\n var chipClass = type === 'attribute' ? 'filter-attr-chip' : 'filter-feat-chip';\n var colorStyle = val.color ? ' style=\"--chip-color: ' + val.color + '\"' : '';\n var colorClass = val.color ? ' has-color' : '';\n\n html += '';\n });\n\n $valuesContainer.html(html);\n\n // Add close button as sibling (outside filter-values-container, inside filter-row-values)\n $filterRowValues.find('.btn-close-values').remove();\n $filterRowValues.append('');\n $filterRowValues.show();\n\n // Scroll into view if needed\n var rowValues = $filterRowValues[0];\n if (rowValues) {\n rowValues.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n },\n\n hideFilterGroupValues: function() {\n this.$dropdown.find('.filter-row-values').hide();\n this.$dropdown.find('.filter-group-toggle').removeClass('active');\n },\n\n updateFilterToggleStates: function() {\n if (!this.$dropdown || !this.filterableData) return;\n\n var self = this;\n\n // Update attribute group toggles\n if (this.filterableData.attributes) {\n this.filterableData.attributes.forEach(function(group) {\n var $toggle = self.$dropdown.find('.filter-group-toggle[data-group-id=\"' + group.id + '\"][data-type=\"attribute\"]');\n var hasActiveInGroup = group.values.some(function(val) {\n return self.filters.attributes.indexOf(val.id) !== -1;\n });\n $toggle.toggleClass('has-selection', hasActiveInGroup);\n });\n }\n\n // Update feature group toggles\n if (this.filterableData.features) {\n this.filterableData.features.forEach(function(group) {\n var $toggle = self.$dropdown.find('.filter-group-toggle[data-group-id=\"' + group.id + '\"][data-type=\"feature\"]');\n var hasActiveInGroup = group.values.some(function(val) {\n return self.filters.features.indexOf(val.id) !== -1;\n });\n $toggle.toggleClass('has-selection', hasActiveInGroup);\n });\n }\n },\n\n /**\n * Load zones for country filter dropdown\n */\n loadZonesForCountryFilter: function() {\n var self = this;\n\n if (this.zonesLoaded || !this.$dropdown) {\n return;\n }\n\n var $select = this.$dropdown.find('.filter-zone-select');\n if (!$select.length) {\n return;\n }\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'getZonesForFilter',\n trait: 'EntitySelector'\n },\n success: function(response) {\n if (response.success && response.zones && response.zones.length > 0) {\n var trans = self.config.trans || {};\n $select.empty();\n $select.append('');\n\n response.zones.forEach(function(zone) {\n $select.append('');\n });\n\n self.zonesLoaded = true;\n }\n }\n });\n }\n };\n\n})(jQuery);\n","/**\n * Entity Selector - Chips Module\n * Entity chip rendering, selection management, and pattern tag handling\n * @partial _chips.js\n *\n * EXTRACTION SOURCE: assets/js/admin/entity-selector.js\n *\n * Contains:\n * - addSelection() / addSelectionNoUpdate() - Add entity chip to picker\n * - removeSelection() - Remove chip and update state\n * - updateChipsVisibility() - Show/hide based on count\n * - loadExistingSelections() - Load saved values on init\n * - collectPickerEntities() / loadPickerValues() - Entity loading helpers\n * - Pattern tag methods: addPatternTag, getPatternTags, updateDraftTagCount\n * - Single mode: getCurrentSingleSelection, showReplaceConfirmation\n * - Count updates: updateConditionCount, updateGroupCounts, updateGroupTotalCount\n */\n\n(function($) {\n 'use strict';\n\n window._EntitySelectorMixins = window._EntitySelectorMixins || {};\n\n window._EntitySelectorMixins.chips = {\n\n // =========================================================================\n // Selection Methods (Entity Chips)\n // =========================================================================\n\n addSelection: function($picker, id, name, data) {\n this.addSelectionNoUpdate($picker, id, name, data);\n var $chips = $picker.find('.entity-chips');\n this.updateChipsVisibility($chips);\n },\n\n addSelectionNoUpdate: function($picker, id, name, data) {\n var $chips = $picker.find('.entity-chips');\n var $block = $picker.closest('.target-block');\n\n // Check for global single mode (only ONE item across ALL entity types)\n var globalMode = this.config.mode || 'multi';\n\n if (globalMode === 'single') {\n // Clear ALL selections in ALL blocks (across all entity types)\n this.$wrapper.find('.entity-chips .entity-chip').remove();\n // Clear all selected states in dropdown\n if (this.$dropdown) {\n this.$dropdown.find('.dropdown-item.selected, .tree-item.selected').removeClass('selected');\n }\n // Clear tab badges (since we're clearing other blocks)\n this.$wrapper.find('.target-block-tab .tab-badge').remove();\n this.$wrapper.find('.target-block-tab').removeClass('has-data');\n } else {\n // Check if this block is in per-block single mode\n var blockMode = $block.data('mode') || 'multi';\n\n // In per-block single mode, clear chips in THIS block only\n if (blockMode === 'single') {\n $chips.find('.entity-chip').remove();\n // Also deselect all items in dropdown\n if (this.$dropdown) {\n this.$dropdown.find('.dropdown-item.selected, .tree-item.selected').removeClass('selected');\n }\n }\n }\n\n if ($chips.find('.entity-chip[data-id=\"' + id + '\"]').length) {\n return;\n }\n\n // Check if this is a country entity (for flag and holiday preview)\n var blockType = $block.data('blockType') || '';\n var searchEntity = $picker.attr('data-search-entity') || blockType;\n var isCountry = (searchEntity === 'countries');\n\n var html = '';\n } else if (data && data.image) {\n html += '\"\"';\n }\n\n html += '' + this.escapeHtml(name) + '';\n\n // Country: add holiday preview button\n if (isCountry) {\n html += '';\n }\n\n html += '';\n html += '
';\n\n $chips.append(html);\n },\n\n removeSelection: function($picker, id) {\n var $chips = $picker.find('.entity-chips');\n $picker.find('.entity-chip[data-id=\"' + id + '\"]').remove();\n this.updateChipsVisibility($chips);\n },\n\n updateChipsVisibility: function($chips) {\n var self = this;\n var trans = this.config.trans || {};\n var $picker = $chips.closest('.value-picker');\n var $allChips = $chips.find('.entity-chip');\n var totalCount = $allChips.length;\n\n // If no chips, remove the wrapper entirely\n var $existingWrapper = $chips.closest('.chips-wrapper');\n if (totalCount === 0) {\n if ($existingWrapper.length) {\n // Move chips out of wrapper before removing\n $existingWrapper.before($chips);\n $existingWrapper.remove();\n }\n return;\n }\n\n // Ensure chips wrapper structure exists\n this.ensureChipsWrapper($chips);\n\n var $wrapper = $chips.closest('.chips-wrapper');\n var $toolbar = $wrapper.find('.chips-toolbar');\n var $loadMore = $wrapper.find('.chips-load-more');\n\n // Get current search filter\n var searchTerm = $toolbar.find('.chips-search-input').val() || '';\n searchTerm = searchTerm.toLowerCase().trim();\n\n // Filter and paginate chips\n var visibleCount = 0;\n var filteredCount = 0;\n var isExpanded = $chips.hasClass('chips-expanded');\n var maxVisible = isExpanded ? 999999 : (this.maxVisibleChips || 12);\n\n $allChips.each(function() {\n var $chip = $(this);\n var chipName = ($chip.find('.chip-name').text() || '').toLowerCase();\n var matchesFilter = !searchTerm || chipName.indexOf(searchTerm) !== -1;\n\n $chip.removeClass('chip-filtered-out chip-paginated-out');\n\n if (!matchesFilter) {\n $chip.addClass('chip-filtered-out');\n } else {\n filteredCount++;\n if (filteredCount > maxVisible) {\n $chip.addClass('chip-paginated-out');\n } else {\n visibleCount++;\n }\n }\n });\n\n // Update toolbar (always show when we have chips)\n $toolbar.addClass('has-chips');\n this.updateChipsToolbar($toolbar, totalCount, filteredCount, searchTerm);\n\n // Update load more select dropdown\n var hiddenByPagination = filteredCount - visibleCount;\n if (hiddenByPagination > 0 && !isExpanded) {\n var loadText = trans.load || 'Load';\n var remainingText = (trans.remaining || '{count} remaining').replace('{count}', hiddenByPagination);\n var loadMoreHtml = '' + loadText + '' +\n '' +\n '' + remainingText + '';\n $loadMore.html(loadMoreHtml).show();\n } else if (isExpanded && filteredCount > (this.maxVisibleChips || 12)) {\n var collapseText = trans.collapse || 'Collapse';\n $loadMore.html(\n ''\n ).show();\n } else {\n $loadMore.hide();\n }\n },\n\n ensureChipsWrapper: function($chips) {\n // Check if already wrapped\n if ($chips.closest('.chips-wrapper').length) {\n return;\n }\n\n var trans = this.config.trans || {};\n var $picker = $chips.closest('.value-picker');\n\n // Create wrapper structure - integrated filter toolbar with sort\n var wrapperHtml = '
' +\n '
' +\n '' +\n '' +\n '' +\n '' +\n '
' +\n '
' +\n '
';\n\n var $wrapper = $(wrapperHtml);\n\n // Insert wrapper before chips and move chips inside\n $chips.before($wrapper);\n $wrapper.find('.chips-toolbar').after($chips);\n $wrapper.append($wrapper.find('.chips-load-more'));\n\n // Bind toolbar events\n this.bindChipsToolbarEvents($wrapper);\n },\n\n bindChipsToolbarEvents: function($wrapper) {\n var self = this;\n var $chips = $wrapper.find('.entity-chips');\n var searchTimeout;\n\n // Search input\n $wrapper.on('input', '.chips-search-input', function() {\n clearTimeout(searchTimeout);\n searchTimeout = setTimeout(function() {\n // Collapse when searching to show filtered results from start\n $chips.removeClass('chips-expanded');\n self.updateChipsVisibility($chips);\n }, 150);\n });\n\n // Sort select\n $wrapper.on('change', '.chips-sort-select', function() {\n var sortBy = $(this).val();\n self.sortChips($chips, sortBy);\n });\n\n // Clear all button\n $wrapper.on('click', '.btn-chips-clear', function() {\n var searchTerm = $wrapper.find('.chips-search-input').val() || '';\n var $chipsToRemove;\n\n if (searchTerm.trim()) {\n // Remove only filtered (visible) chips\n $chipsToRemove = $chips.find('.entity-chip:not(.chip-filtered-out)');\n } else {\n // Remove all chips\n $chipsToRemove = $chips.find('.entity-chip');\n }\n\n $chipsToRemove.each(function() {\n $(this).find('.chip-remove').trigger('click');\n });\n\n // Clear search\n $wrapper.find('.chips-search-input').val('');\n self.updateChipsVisibility($chips);\n });\n\n // Load more select dropdown\n $wrapper.on('change', '.load-more-select', function() {\n var loadCount = $(this).val();\n if (loadCount === 'all') {\n $chips.addClass('chips-expanded');\n self.maxVisibleChips = 999999;\n } else {\n self.maxVisibleChips = (self.maxVisibleChips || 12) + parseInt(loadCount, 10);\n }\n self.updateChipsVisibility($chips);\n });\n\n // Collapse button\n $wrapper.on('click', '.btn-collapse-chips', function() {\n $chips.removeClass('chips-expanded');\n self.maxVisibleChips = 12;\n self.updateChipsVisibility($chips);\n });\n },\n\n /**\n * Sort chips by specified criteria\n */\n sortChips: function($chips, sortBy) {\n var $allChips = $chips.find('.entity-chip');\n if ($allChips.length < 2) return;\n\n var sorted = $allChips.toArray().sort(function(a, b) {\n var $a = $(a);\n var $b = $(b);\n\n switch (sortBy) {\n case 'name_asc':\n var nameA = ($a.find('.chip-name').text() || '').toLowerCase();\n var nameB = ($b.find('.chip-name').text() || '').toLowerCase();\n return nameA.localeCompare(nameB);\n case 'name_desc':\n var nameA2 = ($a.find('.chip-name').text() || '').toLowerCase();\n var nameB2 = ($b.find('.chip-name').text() || '').toLowerCase();\n return nameB2.localeCompare(nameA2);\n case 'added':\n default:\n // Keep original DOM order (order added)\n return 0;\n }\n });\n\n // Re-append in sorted order\n $.each(sorted, function(i, chip) {\n $chips.append(chip);\n });\n\n this.updateChipsVisibility($chips);\n },\n\n updateChipsToolbar: function($toolbar, totalCount, filteredCount, searchTerm) {\n var trans = this.config.trans || {};\n var $count = $toolbar.find('.chips-count');\n var $clearBtn = $toolbar.find('.btn-chips-clear');\n var $clearText = $clearBtn.find('.clear-text');\n\n // Update count display\n if (searchTerm) {\n $count.addClass('has-filter').html(\n '' + filteredCount + '' +\n '/' +\n '' + totalCount + ''\n );\n $clearText.text((trans.clear || 'Clear') + ' ' + filteredCount);\n } else {\n $count.removeClass('has-filter').html(totalCount);\n $clearText.text(trans.clear_all || 'Clear all');\n }\n\n // Show/hide clear button\n if (searchTerm && filteredCount === 0) {\n $clearBtn.hide();\n } else if (totalCount > 0) {\n $clearBtn.show();\n } else {\n $clearBtn.hide();\n }\n },\n\n // =========================================================================\n // Loading/Initialization\n // =========================================================================\n\n loadExistingSelections: function() {\n var self = this;\n console.log('[EntitySelector] loadExistingSelections called for id:', this.config.id);\n\n // Collect all entity IDs to load, grouped by entity type\n var entitiesToLoad = {}; // { entity_type: { ids: [], pickers: [] } }\n\n console.log('[EntitySelector] Looking for .selection-group in wrapper:', this.$wrapper.length ? 'found' : 'NOT FOUND');\n this.$wrapper.find('.selection-group').each(function() {\n console.log('[EntitySelector] Found .selection-group, index:', $(this).data('groupIndex'));\n var $group = $(this);\n var $block = $group.closest('.target-block');\n var blockType = $block.data('blockType');\n\n // Load include values\n var $includePicker = $group.find('.include-picker');\n self.collectPickerEntities($includePicker, blockType, entitiesToLoad);\n\n // Enhance the include method select if not already enhanced\n self.enhanceMethodSelect($group.find('.include-method-select'));\n\n // Load exclude values from each exclude row\n $group.find('.exclude-row').each(function() {\n var $excludeRow = $(this);\n self.collectPickerEntities($excludeRow.find('.exclude-picker'), blockType, entitiesToLoad);\n\n // Enhance the exclude method select if not already enhanced\n self.enhanceMethodSelect($excludeRow.find('.exclude-method-select'));\n });\n\n // Lock method selector if excludes exist\n var hasExcludes = $group.find('.group-excludes.has-excludes').length > 0;\n if (hasExcludes) {\n self.updateMethodSelectorLock($group, true);\n }\n });\n\n // Build bulk request: { entityType: [uniqueIds], ... }\n var bulkRequest = {};\n var hasEntities = false;\n\n Object.keys(entitiesToLoad).forEach(function(entityType) {\n var data = entitiesToLoad[entityType];\n if (data.ids.length === 0) return;\n\n // Deduplicate IDs\n var uniqueIds = data.ids.filter(function(id, index, arr) {\n return arr.indexOf(id) === index;\n });\n\n bulkRequest[entityType] = uniqueIds;\n hasEntities = true;\n });\n\n // Skip AJAX if no entities to load\n if (!hasEntities) {\n console.log('[EntitySelector] No entities to load, skipping AJAX');\n return;\n }\n\n console.log('[EntitySelector] Making bulk AJAX request for entities:', JSON.stringify(bulkRequest));\n\n // Single bulk AJAX call for all entity types\n $.ajax({\n url: self.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'getTargetEntitiesByIdsBulk',\n trait: 'EntitySelector',\n entities: JSON.stringify(bulkRequest)\n },\n success: function(response) {\n console.log('[EntitySelector] AJAX response:', response);\n if (!response.success || !response.entities) {\n console.log('[EntitySelector] Response failed or no entities');\n return;\n }\n try {\n\n // Process each entity type's results\n Object.keys(entitiesToLoad).forEach(function(entityType) {\n var data = entitiesToLoad[entityType];\n var entities = response.entities[entityType] || [];\n\n // Build a map of id -> entity for quick lookup\n var entityMap = {};\n entities.forEach(function(entity) {\n entityMap[entity.id] = entity;\n });\n\n // Update each picker that requested this entity type\n data.pickers.forEach(function(pickerData) {\n var $picker = pickerData.$picker;\n var $chips = $picker.find('.entity-chips');\n var $dataInput = $picker.find('.include-values-data, .exclude-values-data');\n var validIds = [];\n\n // Check if this is a country entity\n var isCountry = (entityType === 'countries');\n\n // Replace loading chips with real data\n pickerData.ids.forEach(function(id) {\n var $loadingChip = $chips.find('.entity-chip-loading[data-id=\"' + id + '\"]');\n if (entityMap[id]) {\n var entity = entityMap[id];\n validIds.push(entity.id);\n\n // Create real chip\n var html = '';\n } else if (entity.image) {\n html += '\"\"';\n }\n\n html += '' + self.escapeHtml(entity.name) + '';\n\n // Country: add holiday preview button\n if (isCountry) {\n html += '';\n }\n\n html += '';\n html += '
';\n\n $loadingChip.replaceWith(html);\n } else {\n // Entity not found, remove loading chip\n $loadingChip.remove();\n }\n });\n\n // Update chips visibility\n self.updateChipsVisibility($chips);\n\n // If some entities were not found, update the hidden input\n if (validIds.length !== pickerData.ids.length) {\n $dataInput.val(JSON.stringify(validIds));\n self.serializeAllBlocks();\n }\n\n self.updateBlockStatus($picker.closest('.target-block'));\n });\n });\n\n // Update condition counts after chips are loaded (for holiday counts, etc.)\n self.updateAllConditionCounts();\n\n } catch (e) {\n console.error('[EntitySelector] Error processing AJAX response:', e);\n }\n },\n error: function(xhr, status, error) {\n console.error('[EntitySelector] AJAX request failed:', status, error, xhr.responseText);\n }\n });\n },\n\n /**\n * Collect entity IDs from a picker for bulk loading\n * Also shows loading placeholders for entity_search types\n */\n collectPickerEntities: function($picker, blockType, entitiesToLoad) {\n console.log('[EntitySelector] collectPickerEntities called, blockType:', blockType, 'picker length:', $picker.length);\n if (!$picker.length) {\n console.log('[EntitySelector] Picker not found, returning');\n return;\n }\n\n var self = this;\n var $dataInput = $picker.find('.include-values-data, .exclude-values-data');\n console.log('[EntitySelector] Looking for values-data input, found:', $dataInput.length);\n if (!$dataInput.length) {\n console.log('[EntitySelector] No data input found, returning');\n return;\n }\n\n var valueType = $picker.attr('data-value-type');\n var rawValue = $dataInput.val() || '[]';\n console.log('[EntitySelector] valueType:', valueType, 'rawValue:', rawValue);\n\n var values = [];\n try {\n values = JSON.parse(rawValue);\n console.log('[EntitySelector] Parsed values:', values);\n } catch (e) {\n console.log('[EntitySelector] JSON parse error:', e);\n return;\n }\n\n // Handle non-entity types synchronously\n if (valueType === 'multi_numeric_range') {\n if (!Array.isArray(values) || values.length === 0) return;\n\n var $chipsContainer = $picker.find('.multi-range-chips');\n values.forEach(function(range) {\n if (!range || (range.min === null && range.max === null)) return;\n\n var chipText = '';\n if (range.min !== null && range.max !== null) {\n chipText = range.min + ' - ' + range.max;\n } else if (range.min !== null) {\n chipText = '≥ ' + range.min;\n } else {\n chipText = '≤ ' + range.max;\n }\n\n var $chip = $('', {\n class: 'range-chip',\n 'data-min': range.min !== null ? range.min : '',\n 'data-max': range.max !== null ? range.max : ''\n });\n $chip.append($('', { class: 'range-chip-text', text: chipText }));\n $chip.append($('';\n html += '' + this.escapeHtml(pattern) + '';\n html += '';\n html += '';\n $chipsContainer.append(html);\n },\n\n /**\n * Get all pattern tags from a wrapper\n * Returns array of objects: { pattern: string, caseSensitive: boolean }\n */\n getPatternTags: function($wrapper) {\n var patterns = [];\n // Exclude draft-tag which is the input field, not a saved pattern\n $wrapper.find('.pattern-tag:not(.draft-tag)').each(function() {\n var pattern = $(this).data('pattern');\n var caseSensitive = $(this).data('caseSensitive') === 1 || $(this).data('caseSensitive') === '1';\n if (pattern) {\n patterns.push({\n pattern: pattern,\n caseSensitive: caseSensitive\n });\n }\n });\n return patterns;\n },\n\n /**\n * Update the match count displayed in the draft tag while typing\n * Shows live preview with current case sensitivity setting\n */\n updateDraftTagCount: function($draftTag, pattern, caseSensitive) {\n var self = this;\n var $matchCount = $draftTag.find('.pattern-match-count');\n var $countValue = $matchCount.find('.count-value');\n\n // Get entity type from block\n var $block = $draftTag.closest('.target-block');\n var entityType = $block.data('blockType') || 'products';\n\n // Show loading - keep eye icon, update count value\n $countValue.html('');\n $matchCount.show();\n\n // Store pattern for click handler\n $matchCount.data('pattern', pattern);\n $matchCount.data('caseSensitive', caseSensitive);\n $matchCount.data('entityType', entityType);\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countPatternMatches',\n trait: 'EntitySelector',\n pattern: pattern,\n field: 'name',\n entity_type: entityType,\n case_sensitive: caseSensitive ? 1 : 0\n },\n success: function(response) {\n if (response.success) {\n var count = parseInt(response.count, 10) || 0;\n $countValue.text(count);\n $matchCount.show();\n // Add visual feedback based on count\n $matchCount.removeClass('count-zero count-found');\n $matchCount.addClass(count === 0 ? 'count-zero' : 'count-found');\n // Store count for preview\n $matchCount.data('count', count);\n // Update group total count to reflect draft pattern in calculation\n var $group = $draftTag.closest('.selection-group');\n if ($group.length) {\n self.updateGroupTotalCount($group);\n }\n } else {\n $countValue.text('?');\n $matchCount.show();\n }\n },\n error: function() {\n $countValue.text('?');\n $matchCount.show();\n }\n });\n },\n\n /**\n * Update condition count with a pending pattern (typed but not yet added as tag)\n * This shows a live preview of what the count would be if the user pressed Enter\n */\n updateConditionCountWithPendingPattern: function($row, pendingPattern) {\n var self = this;\n var trans = this.config.trans || {};\n\n // Find the count element - in method-selector-wrapper for include, in exclude-header-row for exclude\n var $countEl = $row.find('.method-selector-wrapper > .condition-match-count, > .exclude-header-row > .condition-match-count').first();\n if (!$countEl.length) return;\n\n var isExclude = $row.hasClass('exclude-row');\n var $methodSelect = isExclude\n ? $row.find('.exclude-method-select')\n : $row.find('.include-method-select');\n\n var method = $methodSelect.val();\n if (!method) {\n $countEl.hide();\n return;\n }\n\n var $picker = isExclude\n ? $row.find('.exclude-picker')\n : $row.find('.include-picker');\n\n var valueType = $picker.data('valueType') || 'none';\n\n // Only process for pattern value types\n if (valueType !== 'pattern') {\n return;\n }\n\n // Get existing pattern tags\n var values = this.getPatternTags($picker);\n\n // Add the pending pattern as a temporary tag (case-insensitive by default)\n if (pendingPattern) {\n values.push({ pattern: pendingPattern, caseSensitive: false });\n }\n\n if (values.length === 0) {\n $countEl.hide();\n return;\n }\n\n var $block = $row.closest('.target-block');\n var blockType = $block.data('blockType') || 'products';\n\n // Show loading\n $countEl.find('.preview-count').html('');\n $countEl.removeClass('clickable no-matches').show();\n\n // Store condition data on badge for popover\n $countEl.data('conditionData', {\n method: method,\n values: values,\n blockType: blockType,\n isExclude: isExclude\n });\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countConditionMatches',\n trait: 'EntitySelector',\n method: method,\n values: JSON.stringify(values),\n block_type: blockType\n },\n success: function(response) {\n if (response && response.success) {\n var count = response.count || 0;\n $countEl.removeClass('no-matches clickable');\n if (count === 0) {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('no-matches').show();\n } else {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('clickable').show();\n }\n } else {\n $countEl.hide().removeClass('clickable');\n }\n },\n error: function() {\n $countEl.hide().removeClass('clickable');\n }\n });\n },\n\n /**\n * Fetch pattern match count via AJAX\n */\n fetchPatternMatchCount: function($picker, pattern, $countEl) {\n // Determine field type from method select\n // Check if we're in an exclude row first, then fall back to include\n var $excludeRow = $picker.closest('.exclude-row');\n var $methodSelect;\n if ($excludeRow.length) {\n $methodSelect = $excludeRow.find('.exclude-method-select');\n } else {\n var $group = $picker.closest('.selection-group');\n $methodSelect = $group.find('.include-method-select');\n }\n var method = $methodSelect.val() || '';\n var field = method.indexOf('reference') !== -1 ? 'reference' : 'name';\n\n // Get entity type from block\n var $block = $picker.closest('.target-block');\n var entityType = $block.data('blockType') || 'products';\n\n // Show loading state\n $countEl.find('.preview-count').html('');\n $countEl.removeClass('clickable no-matches').show();\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countPatternMatches',\n trait: 'EntitySelector',\n pattern: pattern,\n field: field,\n entity_type: entityType,\n case_sensitive: 0\n },\n success: function(response) {\n if (response && response.success) {\n var count = response.count || 0;\n $countEl.find('.preview-count').text(count);\n $countEl.removeClass('no-matches clickable').show();\n if (count === 0) {\n $countEl.addClass('no-matches');\n } else {\n $countEl.addClass('clickable');\n }\n } else {\n $countEl.hide();\n }\n },\n error: function() {\n $countEl.hide();\n }\n });\n },\n\n // =========================================================================\n // Picker Value Extraction\n // =========================================================================\n\n /**\n * Get values from a picker based on its type\n */\n getPickerValues: function($picker, valueType) {\n switch (valueType) {\n case 'entity_search':\n var ids = [];\n $picker.find('.entity-chip').each(function() {\n var id = $(this).data('id');\n if (id) ids.push(id);\n });\n return ids;\n\n case 'pattern':\n var patternValues = this.getPatternTags($picker);\n // Also include draft pattern if it has content (not yet added as tag)\n var $draftPatternInput = $picker.find('.draft-tag .pattern-input');\n var draftPatternVal = $.trim($draftPatternInput.val());\n if (draftPatternVal) {\n var draftCaseSens = $draftPatternInput.closest('.draft-tag').attr('data-case-sensitive') === '1';\n patternValues.push({\n pattern: draftPatternVal,\n caseSensitive: draftCaseSens\n });\n }\n return patternValues;\n\n case 'numeric_range':\n var min = $picker.find('.range-min-input').val();\n var max = $picker.find('.range-max-input').val();\n return { min: min || null, max: max || null };\n\n case 'date_range':\n var from = $picker.find('.date-from-input').val();\n var to = $picker.find('.date-to-input').val();\n return { from: from || null, to: to || null };\n\n case 'select':\n return [$picker.find('.select-value-input').val()];\n\n case 'boolean':\n return [true];\n\n default:\n return [];\n }\n },\n\n // =========================================================================\n // Count/Status Updates\n // =========================================================================\n\n /**\n * Fetch and update condition match count for a row (include or exclude)\n */\n updateConditionCount: function($row) {\n var self = this;\n var trans = this.config.trans || {};\n\n // Find the count element - in method-selector-wrapper for include, in exclude-header-row for exclude\n var $countEl = $row.find('.method-selector-wrapper > .condition-match-count, > .exclude-header-row > .condition-match-count').first();\n if (!$countEl.length) return;\n\n // Determine if this is an include or exclude row\n var isExclude = $row.hasClass('exclude-row');\n var $methodSelect = isExclude\n ? $row.find('.exclude-method-select')\n : $row.find('.include-method-select');\n\n var method = $methodSelect.val();\n if (!method) {\n $countEl.hide();\n return;\n }\n\n // Get the picker and extract values\n var $picker = isExclude\n ? $row.find('.exclude-picker')\n : $row.find('.include-picker');\n\n var valueType = $picker.data('valueType') || 'none';\n var values = this.getPickerValues($picker, valueType);\n\n // Don't count if no values (except for boolean/all methods)\n var hasNoValues = !values ||\n (Array.isArray(values) && values.length === 0) ||\n (typeof values === 'object' && !Array.isArray(values) && (\n // For combination_attributes, check if attributes object is empty\n (valueType === 'combination_attributes' && values.attributes !== undefined && Object.keys(values.attributes).length === 0) ||\n // For other objects, check if completely empty\n (valueType !== 'combination_attributes' && Object.keys(values).length === 0)\n ));\n if (valueType !== 'none' && valueType !== 'boolean' && hasNoValues) {\n $countEl.hide();\n return;\n }\n\n // Get block type\n var $block = $row.closest('.target-block');\n var blockType = $block.data('blockType') || 'products';\n\n // Show loading\n $countEl.find('.preview-count').html('');\n $countEl.removeClass('clickable no-matches').show();\n\n // Store condition data on badge for popover\n $countEl.data('conditionData', {\n method: method,\n values: values,\n blockType: blockType,\n isExclude: isExclude\n });\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countConditionMatches',\n trait: 'EntitySelector',\n method: method,\n values: JSON.stringify(values),\n block_type: blockType\n },\n success: function(response) {\n if (response && response.success) {\n var count = response.count || 0;\n $countEl.removeClass('no-matches clickable');\n if (count === 0) {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('no-matches').show();\n } else {\n // Show count, make clickable for preview popover\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('clickable').show();\n }\n } else {\n $countEl.hide().removeClass('clickable');\n }\n },\n error: function() {\n $countEl.hide().removeClass('clickable');\n }\n });\n },\n\n /**\n * Update all condition counts in a group\n */\n updateGroupCounts: function($group) {\n var self = this;\n\n // Update include count\n var $include = $group.find('.group-include');\n if ($include.length) {\n this.updateConditionCount($include);\n }\n\n // Update each exclude row count\n $group.find('.exclude-row').each(function() {\n self.updateConditionCount($(this));\n });\n\n // Update group total count (include - excludes)\n this.updateGroupTotalCount($group);\n },\n\n /**\n * Update the group total count badge (include - excludes)\n * Also updates the limit input placeholder\n */\n updateGroupTotalCount: function($group) {\n var self = this;\n var $block = $group.closest('.target-block');\n var blockType = $block.data('blockType') || 'products';\n var $badge = $group.find('.group-header .group-count-badge');\n var $limitInput = $group.find('.group-modifier-limit');\n\n // Build group data for AJAX\n var groupData = this.serializeGroup($group, blockType);\n\n // Check if include has valid data\n if (!groupData.include || !groupData.include.method) {\n $badge.hide();\n $limitInput.attr('placeholder', '–');\n return;\n }\n\n // Show loading\n $badge.html('').show();\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countGroupItems',\n trait: 'EntitySelector',\n group_data: JSON.stringify(groupData),\n block_type: blockType\n },\n success: function(response) {\n if (response && response.success) {\n var finalCount = response.final_count || 0;\n var excludeCount = response.exclude_count || 0;\n\n // Update badge with eye icon and count\n var badgeHtml = ' ' + finalCount;\n if (excludeCount > 0) {\n badgeHtml += ' (-' + excludeCount + ')';\n }\n $badge.html(badgeHtml);\n $badge.addClass('clickable').show();\n\n // Store group data on badge for preview popover\n $badge.data('groupData', groupData);\n $badge.data('blockType', blockType);\n $badge.data('finalCount', finalCount);\n\n // Update limit placeholder with the count\n $limitInput.attr('placeholder', finalCount);\n\n // Also update the group-preview-badge count (apply limit if set)\n var $previewBadge = $group.find('.group-preview-badge .preview-count');\n if ($previewBadge.length) {\n var limit = parseInt($limitInput.val(), 10);\n var displayCount = (limit > 0 && limit < finalCount) ? limit : finalCount;\n $previewBadge.text(displayCount);\n }\n } else {\n $badge.hide().removeClass('clickable');\n $limitInput.attr('placeholder', '–');\n }\n },\n error: function() {\n $badge.hide();\n $limitInput.attr('placeholder', '–');\n }\n });\n },\n\n /**\n * Update all condition counts for all visible groups\n */\n updateAllConditionCounts: function() {\n var self = this;\n this.$wrapper.find('.target-block.active .selection-group').each(function() {\n self.updateGroupCounts($(this));\n });\n },\n\n /**\n * Fetch category names by IDs and add chips to the picker\n * Used when adding selections from the tree modal\n * @param {jQuery} $picker - Picker element\n * @param {Array} ids - Category IDs to add\n * @param {string} entityType - 'categories' or 'cms_categories'\n * @param {Function} callback - Called when done\n */\n fetchCategoryNamesAndAddChips: function($picker, ids, entityType, callback) {\n var self = this;\n\n if (!ids || ids.length === 0) {\n if (typeof callback === 'function') {\n callback();\n }\n return;\n }\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'getTargetEntitiesByIds',\n trait: 'EntitySelector',\n entity_type: entityType,\n ids: JSON.stringify(ids)\n },\n success: function(response) {\n if (response.success && response.entities) {\n response.entities.forEach(function(entity) {\n self.addSelectionNoUpdate($picker, entity.id, entity.name, entity);\n });\n }\n if (typeof callback === 'function') {\n callback();\n }\n },\n error: function() {\n if (typeof callback === 'function') {\n callback();\n }\n }\n });\n }\n };\n\n})(jQuery);\n","/**\n * Entity Selector - Groups Module\n * Selection group management, serialization, block/tab management\n * @partial _groups.js\n *\n * Contains:\n * - Group management: addGroup, removeGroup, clearAllConditions\n * - Block/Tab: switchToBlock, updateTabBadges, updateBlockStatus\n * - Serialization: serializeGroup, serializeAllBlocks, getBlockGroups\n * - Counts: fetchProductCount, updateHeaderTotalCount, updateAllConditionCounts\n * - Excludes: addFirstExcludeRow, addExcludeRow, removeExcludeRow\n * - Validation: validate, showValidationError, clearValidationError\n */\n\n(function($) {\n 'use strict';\n\n window._EntitySelectorMixins = window._EntitySelectorMixins || {};\n\n window._EntitySelectorMixins.groups = {\n\n addGroup: function($block, blockType) {\n var $container = $block.find('.groups-container');\n var trans = this.config.trans || {};\n var blockDef = this.config.blocks[blockType] || {};\n var methods = blockDef.selection_methods || {};\n\n // Remove empty state\n $container.find('.groups-empty-state').remove();\n\n // Get next group index\n var maxIndex = -1;\n $container.find('.selection-group').each(function() {\n var idx = parseInt($(this).data('groupIndex'), 10);\n if (idx > maxIndex) maxIndex = idx;\n });\n var groupIndex = maxIndex + 1;\n\n // Build method options with optgroups\n var methodOptions = this.buildMethodOptions(methods, false);\n\n // Build exclude method options (no \"all\") with optgroups\n var excludeMethodOptions = this.buildMethodOptions(methods, true);\n\n var defaultGroupName = (trans.group || 'Group') + ' ' + (groupIndex + 1);\n var html = '
';\n\n // Group header\n html += '
';\n html += '';\n html += '';\n html += '';\n html += '';\n html += '';\n html += '';\n html += '
';\n\n // Group body (collapsible content)\n html += '
';\n\n // Include section\n html += '
';\n html += '
';\n html += '
';\n html += '';\n html += ' 0';\n html += '';\n html += '
';\n var noItemsText = trans.no_items_selected || 'No items selected - use search below';\n html += '
';\n html += '
';\n html += '
';\n html += '';\n html += '';\n html += '';\n html += '
';\n html += '';\n html += '
';\n html += '
';\n html += '
';\n\n // Excludes section (collapsed by default)\n html += '
';\n html += '';\n html += '
';\n\n // Group-level modifiers (limit & sort)\n html += '
';\n html += '';\n html += '' + (trans.limit || 'Limit') + '';\n html += '';\n html += '';\n html += '';\n html += '' + (trans.sort || 'Sort') + '';\n html += '';\n html += '';\n html += '';\n html += '';\n html += ' ';\n html += '';\n html += '
';\n\n html += '
'; // Close group-body\n\n html += '
'; // Close selection-group\n\n $container.append(html);\n\n // Find the new group and set method to \"all\" by default\n var $newGroup = $container.find('.selection-group[data-group-index=\"' + groupIndex + '\"]');\n\n // Enhance the method select with styled dropdown\n this.enhanceMethodSelect($newGroup.find('.include-method-select'));\n\n $newGroup.find('.include-method-select').val('all').trigger('change');\n\n this.updateBlockStatus($block);\n this.serializeAllBlocks();\n },\n\n removeGroup: function($group, $block) {\n $group.remove();\n\n var $container = $block.find('.groups-container');\n var remainingGroups = $container.find('.selection-group').length;\n\n if (remainingGroups === 0) {\n var emptyText = this.getEmptyStateText($block);\n var emptyHtml = '
';\n emptyHtml += '' + emptyText + '';\n emptyHtml += '
';\n $container.html(emptyHtml);\n }\n\n this.updateBlockStatus($block);\n this.serializeAllBlocks();\n\n // Update tab badges and header total count\n this.updateTabBadges();\n },\n\n clearAllConditions: function() {\n var self = this;\n\n // Remove all groups from all blocks\n this.$wrapper.find('.target-block').each(function() {\n var $block = $(this);\n var $container = $block.find('.groups-container');\n\n // Remove all groups\n $container.find('.selection-group').remove();\n\n // Show empty state\n var emptyText = self.getEmptyStateText($block);\n var emptyHtml = '
';\n emptyHtml += '' + emptyText + '';\n emptyHtml += '
';\n $container.html(emptyHtml);\n\n self.updateBlockStatus($block);\n });\n\n // Update serialized data\n this.serializeAllBlocks();\n\n // Update tab badges and header count\n this.updateTabBadges();\n\n // Also update header total count immediately (since all cleared)\n this.updateHeaderTotalCount();\n },\n\n switchToBlock: function(blockType) {\n // Update tabs\n this.$wrapper.find('.target-block-tab').removeClass('active');\n this.$wrapper.find('.target-block-tab[data-block-type=\"' + blockType + '\"]').addClass('active');\n\n // Update blocks\n this.$wrapper.find('.target-block').removeClass('active').hide();\n this.$wrapper.find('.target-block[data-block-type=\"' + blockType + '\"]').addClass('active').show();\n\n // Close dropdown if open\n this.hideDropdown();\n },\n\n updateTabBadges: function() {\n var self = this;\n\n // Collect all block types with data and set loading state\n var blockTypesWithData = [];\n this.$wrapper.find('.target-block-tab').each(function() {\n var $tab = $(this);\n var blockType = $tab.data('blockType');\n var $block = self.$wrapper.find('.target-block[data-block-type=\"' + blockType + '\"]');\n var groupCount = $block.find('.selection-group').length;\n\n // Update or add badge\n var $badge = $tab.find('.tab-badge');\n if (groupCount > 0) {\n // Show loading state first\n if ($badge.length) {\n $badge.addClass('loading').html('');\n } else {\n $tab.append('');\n }\n $tab.addClass('has-data');\n blockTypesWithData.push(blockType);\n } else {\n $badge.remove();\n $tab.removeClass('has-data');\n }\n });\n\n // Update target switch state based on whether any data exists\n this.updateTargetSwitchState();\n\n // Fetch all counts in a single bulk request\n if (blockTypesWithData.length > 0) {\n this.fetchAllCounts(blockTypesWithData);\n }\n },\n\n updateTargetSwitchState: function() {\n var $switch = this.$wrapper.find('.prestashop-switch');\n if (!$switch.length) {\n return;\n }\n\n // Check if any block has data\n var hasData = false;\n this.$wrapper.find('.target-block').each(function() {\n if ($(this).find('.selection-group').length > 0) {\n hasData = true;\n return false; // break\n }\n });\n\n // Update switch: value=\"1\" is \"Everyone/All/None\", value=\"0\" is \"Specific/Selected\"\n if (hasData) {\n $switch.find('input[value=\"0\"]').prop('checked', true);\n } else {\n $switch.find('input[value=\"1\"]').prop('checked', true);\n }\n },\n\n /**\n * Fetch counts for all block types in a single bulk AJAX request\n * @param {Array} blockTypes - Array of block type strings to fetch counts for\n */\n fetchAllCounts: function(blockTypes) {\n var self = this;\n\n // Read saved data from hidden input\n var $hiddenInput = this.$wrapper.find('input[name=\"' + this.config.name + '\"]');\n var savedData = {};\n try {\n savedData = JSON.parse($hiddenInput.val() || '{}');\n } catch (e) {\n savedData = {};\n }\n\n // Build conditions object for all requested block types\n var conditions = {};\n blockTypes.forEach(function(blockType) {\n var groups = (savedData[blockType] && savedData[blockType].groups) ? savedData[blockType].groups : [];\n if (groups.length > 0) {\n conditions[blockType] = { groups: groups };\n }\n });\n\n // If no valid conditions, remove loading spinners\n if (Object.keys(conditions).length === 0) {\n blockTypes.forEach(function(blockType) {\n var $tab = self.$wrapper.find('.target-block-tab[data-block-type=\"' + blockType + '\"]');\n $tab.find('.tab-badge').remove();\n $tab.removeClass('has-data');\n });\n return;\n }\n\n // Single bulk AJAX request for all counts\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'previewEntitySelectorBulk',\n trait: 'EntitySelector',\n conditions: JSON.stringify(conditions)\n },\n success: function(response) {\n if (response.success && response.counts) {\n // Update each tab with its count\n Object.keys(response.counts).forEach(function(blockType) {\n var count = response.counts[blockType];\n var $tab = self.$wrapper.find('.target-block-tab[data-block-type=\"' + blockType + '\"]');\n var $badge = $tab.find('.tab-badge');\n\n if ($badge.length) {\n $badge.removeClass('loading').html(' ' + count);\n // Store preview data for later popover use\n $tab.data('previewData', { count: count, success: true });\n }\n });\n\n // Handle any block types not in response (set count to 0 or remove badge)\n blockTypes.forEach(function(blockType) {\n if (!(blockType in response.counts)) {\n var $tab = self.$wrapper.find('.target-block-tab[data-block-type=\"' + blockType + '\"]');\n $tab.find('.tab-badge').remove();\n $tab.removeClass('has-data');\n }\n });\n\n self.updateHeaderTotalCount();\n } else {\n console.error('[EntitySelector] Bulk preview failed:', response.error || 'Unknown error');\n // Remove loading spinners on error\n blockTypes.forEach(function(blockType) {\n var $tab = self.$wrapper.find('.target-block-tab[data-block-type=\"' + blockType + '\"]');\n $tab.find('.tab-badge').remove();\n });\n }\n },\n error: function(xhr, status, error) {\n console.error('[EntitySelector] Bulk AJAX error:', status, error);\n // Remove loading spinners on error\n blockTypes.forEach(function(blockType) {\n var $tab = self.$wrapper.find('.target-block-tab[data-block-type=\"' + blockType + '\"]');\n $tab.find('.tab-badge').remove();\n });\n }\n });\n },\n\n /**\n * Fetch count for a single block type (legacy, used for single updates)\n */\n fetchProductCount: function(blockType, $tab) {\n var self = this;\n var data = {};\n\n // Read from hidden input (contains full saved data or freshly serialized data)\n var $hiddenInput = this.$wrapper.find('input[name=\"' + this.config.name + '\"]');\n var savedData = {};\n try {\n savedData = JSON.parse($hiddenInput.val() || '{}');\n } catch (e) {\n savedData = {};\n }\n\n // Get groups for the requested block type\n var groups = (savedData[blockType] && savedData[blockType].groups) ? savedData[blockType].groups : [];\n\n if (groups.length === 0) {\n $tab.find('.tab-badge').remove();\n $tab.removeClass('has-data');\n $tab.removeData('previewData');\n return;\n }\n\n // Show loading state\n var $badge = $tab.find('.tab-badge');\n if (!$badge.length) {\n $badge = $('');\n $tab.append($badge);\n } else {\n $badge.addClass('loading').html('');\n }\n $tab.addClass('has-data');\n\n data[blockType] = { groups: groups };\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'previewEntitySelector',\n trait: 'EntitySelector',\n conditions: JSON.stringify(data),\n block_type: blockType,\n limit: 10\n },\n success: function(response) {\n if (response.success) {\n var $badge = $tab.find('.tab-badge');\n $badge.removeClass('loading').html(' ' + response.count);\n\n // Store preview data for popover\n $tab.data('previewData', response);\n\n // Update header total count\n self.updateHeaderTotalCount();\n } else {\n console.error('[EntitySelector] Preview failed for', blockType, ':', response.error || 'Unknown error');\n $tab.find('.tab-badge').remove();\n }\n },\n error: function(xhr, status, error) {\n console.error('[EntitySelector] AJAX error for', blockType, ':', status, error);\n $tab.find('.tab-badge').remove();\n self.updateHeaderTotalCount();\n }\n });\n },\n\n updateHeaderTotalCount: function() {\n var self = this;\n var total = 0;\n\n // Sum up all tab badge counts\n this.$wrapper.find('.target-block-tab .tab-badge').each(function() {\n var $badge = $(this);\n if (!$badge.hasClass('loading')) {\n var count = parseInt($badge.text(), 10);\n if (!isNaN(count)) {\n total += count;\n }\n }\n });\n\n var $totalBadge = this.$wrapper.find('.trait-total-count');\n if (total > 0) {\n $totalBadge.find('.count-value').text(total);\n $totalBadge.show();\n } else {\n $totalBadge.hide();\n }\n\n // Update show-all toggle state\n this.updateShowAllToggle();\n },\n\n updateShowAllToggle: function() {\n var $toggle = this.$wrapper.find('.trait-show-all-toggle');\n if (!$toggle.length) return;\n\n var $checkbox = $toggle.find('.show-all-checkbox');\n var hasData = this.$wrapper.find('.target-block-tab.has-data').length > 0;\n\n // If there's data, uncheck (not showing to all), otherwise check\n $checkbox.prop('checked', !hasData);\n },\n\n updateBlockStatus: function($block) {\n var $status = $block.find('.block-status');\n var blockType = $block.data('blockType');\n var blockDef = this.config.blocks[blockType] || {};\n var trans = this.config.trans || {};\n\n var groups = this.getBlockGroups($block);\n\n if (groups.length === 0) {\n var emptyMeansAll = this.config.emptyMeansAll !== false;\n if (emptyMeansAll) {\n $status.text((trans.all || 'All') + ' ' + (blockDef.entity_label_plural || 'items'));\n } else {\n $status.text(trans.nothing_selected || 'Nothing selected');\n }\n } else {\n $status.text(groups.length + ' ' + (groups.length === 1 ? (trans.group || 'group') : (trans.groups || 'groups')));\n }\n },\n\n getEmptyStateText: function($block) {\n var blockType = $block.data('blockType');\n var blockMode = $block.data('mode') || 'multi';\n var blockDef = this.config.blocks[blockType] || {};\n var trans = this.config.trans || {};\n var emptyMeansAll = this.config.emptyMeansAll !== false;\n\n if (blockMode === 'single') {\n return trans.no_item_selected || 'No item selected';\n }\n\n if (emptyMeansAll) {\n return (trans.all || 'All') + ' ' + (blockDef.entity_label_plural || 'items') + ' ' + (trans.included || 'included');\n }\n\n return trans.nothing_selected || 'Nothing selected';\n },\n\n serializeGroup: function($group, blockType) {\n var self = this;\n\n // Include\n var includeMethod = $group.find('.include-method-select').val() || 'all';\n var $includePicker = $group.find('.include-picker');\n var includeValues = this.getPickerValues($includePicker);\n\n // Excludes (multiple rows)\n var excludes = [];\n var $excludesSection = $group.find('.group-excludes.has-excludes');\n if ($excludesSection.length) {\n $group.find('.exclude-row').each(function() {\n var $row = $(this);\n var excludeMethod = $row.find('.exclude-method-select').val() || null;\n var $excludePicker = $row.find('.exclude-picker');\n var excludeValues = self.getPickerValues($excludePicker);\n\n if (excludeMethod && excludeValues && (Array.isArray(excludeValues) ? excludeValues.length > 0 : true)) {\n excludes.push({\n method: excludeMethod,\n values: excludeValues\n });\n }\n });\n }\n\n var groupData = {\n include: {\n method: includeMethod,\n values: includeValues\n }\n };\n\n if (excludes.length > 0) {\n groupData.excludes = excludes;\n }\n\n // Add modifiers if present\n var modifiers = this.getGroupModifiers($group);\n if (modifiers.limit || modifiers.sort_by) {\n groupData.modifiers = modifiers;\n }\n\n return groupData;\n },\n\n serializeAllBlocks: function($changedRow) {\n var self = this;\n var data = {};\n\n console.log('[EntitySelector] serializeAllBlocks called');\n\n this.$wrapper.find('.target-block').each(function() {\n var $block = $(this);\n var blockType = $block.data('blockType');\n var groups = self.getBlockGroups($block);\n\n console.log('[EntitySelector] Block:', blockType, 'Groups:', groups.length);\n\n // Groups now contain their own modifiers, no block-level modifiers\n if (groups.length > 0) {\n data[blockType] = { groups: groups };\n }\n\n self.updateBlockStatus($block);\n });\n\n // Update hidden input first\n var $input = this.$wrapper.find('input[name=\"' + this.config.name + '\"]');\n var jsonData = JSON.stringify(data);\n\n console.log('[EntitySelector] Hidden input name:', this.config.name);\n console.log('[EntitySelector] Hidden input found:', $input.length);\n console.log('[EntitySelector] Serialized data:', jsonData.substring(0, 500));\n\n $input.val(jsonData);\n\n // Then update tab badges (reads from hidden input)\n this.updateTabBadges();\n\n // Debounced update of condition count - only for changed row if specified\n if (this.countUpdateTimeout) {\n clearTimeout(this.countUpdateTimeout);\n }\n this.countUpdateTimeout = setTimeout(function() {\n if ($changedRow && $changedRow.length) {\n // Update the specific row that changed\n self.updateConditionCount($changedRow);\n // Also update the group total count (include - excludes)\n var $group = $changedRow.closest('.selection-group');\n if ($group.length) {\n self.updateGroupTotalCount($group);\n }\n } else {\n // Fallback: update all counts (initial load, structure changes)\n self.updateAllConditionCounts();\n }\n }, 500);\n },\n\n getBlockGroups: function($block) {\n var self = this;\n var groups = [];\n\n $block.find('.selection-group').each(function() {\n var $group = $(this);\n\n // Include\n var includeMethod = $group.find('.include-method-select').val() || 'all';\n var $includePicker = $group.find('.include-picker');\n var includeValues = self.getPickerValues($includePicker);\n\n // Skip groups with invalid include conditions (e.g., \"specific products\" with none selected)\n if (!self.isConditionValid(includeMethod, includeValues, $includePicker)) {\n return true; // continue to next group\n }\n\n // Excludes (multiple rows) - only include valid ones\n var excludes = [];\n var $excludesSection = $group.find('.group-excludes.has-excludes');\n if ($excludesSection.length) {\n $group.find('.exclude-row').each(function() {\n var $row = $(this);\n var excludeMethod = $row.find('.exclude-method-select').val() || null;\n var $excludePicker = $row.find('.exclude-picker');\n var excludeValues = self.getPickerValues($excludePicker);\n\n // Only include valid exclude conditions\n if (excludeMethod && self.isConditionValid(excludeMethod, excludeValues, $excludePicker)) {\n excludes.push({\n method: excludeMethod,\n values: excludeValues\n });\n }\n });\n }\n\n var groupData = {\n include: {\n method: includeMethod,\n values: includeValues\n }\n };\n\n // Group name (optional, for organizational purposes)\n var groupName = $.trim($group.attr('data-group-name') || '');\n if (groupName) {\n groupData.name = groupName;\n }\n\n if (excludes.length > 0) {\n groupData.excludes = excludes;\n }\n\n // Group-level modifiers\n var modifiers = self.getGroupModifiers($group);\n if (modifiers.limit || modifiers.sort_by) {\n groupData.modifiers = modifiers;\n }\n\n groups.push(groupData);\n });\n\n return groups;\n },\n\n getGroupModifiers: function($group) {\n var limit = $group.find('.group-modifier-limit').val();\n var sortBy = $group.find('.group-modifier-sort').val() || 'sales';\n var $sortDirBtn = $group.find('.group-modifiers .btn-sort-dir');\n var sortDir = $sortDirBtn.data('dir') || 'DESC';\n\n return {\n limit: limit ? parseInt(limit, 10) : null,\n sort_by: sortBy || null,\n sort_dir: sortDir || 'DESC'\n };\n },\n\n getPickerValues: function($picker) {\n var valueType = $picker.attr('data-value-type') || 'entity_search';\n var values = [];\n\n switch (valueType) {\n case 'entity_search':\n $picker.find('.entity-chip').each(function() {\n var id = $(this).data('id');\n values.push(isNaN(id) ? id : Number(id));\n });\n break;\n\n case 'pattern':\n values = this.getPatternTags($picker);\n // Also include draft pattern if it has content (not yet added as tag)\n var $draftInput = $picker.find('.draft-tag .pattern-input');\n var draftPattern = $.trim($draftInput.val());\n if (draftPattern) {\n var draftCaseSensitive = $draftInput.closest('.draft-tag').attr('data-case-sensitive') === '1';\n values.push({\n pattern: draftPattern,\n caseSensitive: draftCaseSensitive\n });\n }\n break;\n\n case 'numeric_range':\n var min = $picker.find('.range-min-input').val();\n var max = $picker.find('.range-max-input').val();\n if (min !== '' || max !== '') {\n values = {\n min: min !== '' ? parseFloat(min) : null,\n max: max !== '' ? parseFloat(max) : null\n };\n }\n break;\n\n case 'date_range':\n var from = $picker.find('.date-from-input').val();\n var to = $picker.find('.date-to-input').val();\n if (from || to) {\n values = {\n from: from || null,\n to: to || null\n };\n }\n break;\n\n case 'select':\n var selectVal = $picker.find('.select-value-input').val();\n if (selectVal) {\n values = [selectVal];\n }\n break;\n\n case 'boolean':\n values = [true];\n break;\n\n case 'multi_numeric_range':\n var ranges = [];\n $picker.find('.range-chip').each(function() {\n var $chip = $(this);\n var minVal = $chip.data('min');\n var maxVal = $chip.data('max');\n ranges.push({\n min: minVal !== '' && minVal !== undefined ? parseFloat(minVal) : null,\n max: maxVal !== '' && maxVal !== undefined ? parseFloat(maxVal) : null\n });\n });\n if (ranges.length > 0) {\n values = ranges;\n }\n break;\n\n case 'multi_select_tiles':\n $picker.find('.tile-option.selected').each(function() {\n values.push($(this).data('value'));\n });\n break;\n\n case 'combination_attributes':\n // Returns object: { mode: 'products'|'combinations', attributes: { groupId: [valueId1, valueId2], ... } }\n var combAttrs = {};\n $picker.find('.comb-attr-value.selected').each(function() {\n var groupId = $(this).data('groupId').toString();\n var valueId = $(this).data('valueId');\n if (!combAttrs[groupId]) {\n combAttrs[groupId] = [];\n }\n combAttrs[groupId].push(valueId);\n });\n if (Object.keys(combAttrs).length > 0) {\n // Get mode: from radio if toggle exists, otherwise from config\n var $combPicker = $picker.find('.combination-attributes-picker');\n var configMode = $combPicker.data('combinationMode') || this.config.combinationMode || 'products';\n var combMode;\n if (configMode === 'toggle') {\n combMode = $picker.find('.comb-mode-radio:checked').val() || 'products';\n } else {\n combMode = configMode;\n }\n values = {\n mode: combMode,\n attributes: combAttrs\n };\n }\n break;\n }\n\n return values;\n },\n\n isConditionValid: function(method, values, $picker) {\n // 'all' method never needs values\n if (method === 'all') {\n return true;\n }\n\n // Boolean methods are always valid (the value is implicit true)\n var valueType = $picker.attr('data-value-type') || 'entity_search';\n if (valueType === 'boolean') {\n return true;\n }\n\n // For other methods, check if values are meaningful\n if (Array.isArray(values)) {\n return values.length > 0;\n }\n\n // For object values (ranges, combination_attributes), check if meaningful\n if (typeof values === 'object' && values !== null) {\n // Special handling for combination_attributes: { mode, attributes }\n if (valueType === 'combination_attributes' && values.attributes !== undefined) {\n return Object.keys(values.attributes).length > 0;\n }\n // For ranges and other objects, check if at least one bound is set\n return Object.keys(values).some(function(key) {\n return values[key] !== null && values[key] !== '';\n });\n }\n\n return false;\n },\n\n /**\n * Update all condition counts using a single bulk AJAX request\n */\n updateAllConditionCounts: function() {\n var self = this;\n var conditions = {};\n var conditionElements = {};\n var conditionIndex = 0;\n\n // Collect all conditions from all active groups\n this.$wrapper.find('.target-block.active .selection-group').each(function() {\n var $group = $(this);\n var $block = $group.closest('.target-block');\n var blockType = $block.data('blockType') || 'products';\n\n // Process include row\n var $include = $group.find('.group-include');\n if ($include.length) {\n var includeData = self.getConditionData($include, blockType);\n if (includeData) {\n var id = 'c' + conditionIndex++;\n conditions[id] = includeData.condition;\n conditionElements[id] = includeData.$countEl;\n }\n }\n\n // Process exclude rows\n $group.find('.exclude-row').each(function() {\n var excludeData = self.getConditionData($(this), blockType);\n if (excludeData) {\n var id = 'c' + conditionIndex++;\n conditions[id] = excludeData.condition;\n conditionElements[id] = excludeData.$countEl;\n }\n });\n });\n\n // If no conditions, nothing to do\n if (Object.keys(conditions).length === 0) {\n return;\n }\n\n // Make single bulk AJAX request\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countConditionMatchesBulk',\n trait: 'EntitySelector',\n conditions: JSON.stringify(conditions)\n },\n success: function(response) {\n if (response && response.success && response.counts) {\n // Update each count element with its result\n Object.keys(response.counts).forEach(function(id) {\n var count = response.counts[id] || 0;\n var $countEl = conditionElements[id];\n if ($countEl && $countEl.length) {\n $countEl.removeClass('no-matches clickable');\n if (count === 0) {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('no-matches').show();\n } else {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('clickable').show();\n }\n }\n });\n }\n // Note: Group totals are updated on-demand when user interacts, not on initial load\n },\n error: function() {\n // Hide all count elements on error\n Object.keys(conditionElements).forEach(function(id) {\n var $countEl = conditionElements[id];\n if ($countEl && $countEl.length) {\n $countEl.hide().removeClass('clickable');\n }\n });\n }\n });\n },\n\n /**\n * Extract condition data from a row for bulk counting\n */\n getConditionData: function($row, blockType) {\n console.log('[getConditionData] Called with blockType:', blockType);\n var $countEl = $row.find('.method-selector-wrapper > .condition-match-count, > .exclude-header-row .condition-match-count').first();\n console.log('[getConditionData] $countEl found:', $countEl.length);\n if (!$countEl.length) return null;\n\n var isExclude = $row.hasClass('exclude-row');\n var $methodSelect = isExclude\n ? $row.find('.exclude-method-select')\n : $row.find('.include-method-select');\n\n var method = $methodSelect.val();\n console.log('[getConditionData] method:', method);\n if (!method) {\n $countEl.hide();\n return null;\n }\n\n var $picker = isExclude\n ? $row.find('.exclude-picker')\n : $row.find('.include-picker');\n console.log('[getConditionData] $picker found:', $picker.length, 'data-value-type attr:', $picker.attr('data-value-type'));\n\n var valueType = $picker.data('valueType') || $picker.attr('data-value-type') || 'none';\n console.log('[getConditionData] valueType:', valueType);\n\n // Special case: \"All countries\" method - needs separate handling for holidays\n if (valueType === 'none' && blockType === 'countries' && method === 'all') {\n console.log('[getConditionData] All countries detected - triggering updateConditionCount');\n // Trigger separate update for this special case (uses nested AJAX)\n var self = this;\n setTimeout(function() {\n self.updateConditionCount($row, blockType);\n }, 0);\n return null; // Skip bulk processing, handled separately\n }\n\n // Special case: Specific countries with entity_search - needs holiday counting, not entity counting\n var searchEntity = $picker.attr('data-search-entity') || '';\n if (blockType === 'countries' && valueType === 'entity_search' && searchEntity === 'countries') {\n console.log('[getConditionData] Specific countries detected - triggering updateConditionCount for holiday counting');\n var self = this;\n setTimeout(function() {\n self.updateConditionCount($row, blockType);\n }, 0);\n return null; // Skip bulk processing, handled separately\n }\n\n // Hide badge for other \"all\" type methods (valueType === 'none') since they don't filter\n if (valueType === 'none') {\n $countEl.hide();\n return null;\n }\n\n var values = this.getPickerValues($picker, valueType);\n\n // Don't count if no values (except for boolean methods)\n var hasNoValues = !values ||\n (Array.isArray(values) && values.length === 0) ||\n (typeof values === 'object' && !Array.isArray(values) && (\n (valueType === 'combination_attributes' && values.attributes !== undefined && Object.keys(values.attributes).length === 0) ||\n (valueType !== 'combination_attributes' && Object.keys(values).length === 0)\n ));\n if (valueType !== 'boolean' && hasNoValues) {\n $countEl.hide();\n return null;\n }\n\n // Show loading spinner\n $countEl.find('.preview-count').html('');\n $countEl.removeClass('clickable no-matches').show();\n\n // Store condition data on badge for popover\n $countEl.data('conditionData', {\n method: method,\n values: values,\n blockType: blockType,\n isExclude: isExclude\n });\n\n return {\n condition: {\n method: method,\n values: values,\n block_type: blockType\n },\n $countEl: $countEl\n };\n },\n\n updateGroupCounts: function($group) {\n var self = this;\n var $block = $group.closest('.target-block');\n var blockType = $block.data('blockType') || 'products';\n\n // Update include count\n var $include = $group.find('.group-include');\n if ($include.length) {\n this.updateConditionCount($include, blockType);\n }\n\n // Update each exclude row count\n $group.find('.exclude-row').each(function() {\n self.updateConditionCount($(this), blockType);\n });\n\n // Update group total count (include - excludes)\n this.updateGroupTotalCount($group);\n },\n\n /**\n * Update a single condition count (used for individual updates after user changes)\n */\n updateConditionCount: function($row, blockType) {\n var self = this;\n\n var $countEl = $row.find('.method-selector-wrapper > .condition-match-count, > .exclude-header-row .condition-match-count').first();\n if (!$countEl.length) {\n console.log('[updateConditionCount] No $countEl found');\n return;\n }\n\n var isExclude = $row.hasClass('exclude-row');\n var $methodSelect = isExclude\n ? $row.find('.exclude-method-select')\n : $row.find('.include-method-select');\n\n var method = $methodSelect.val();\n console.log('[updateConditionCount] method:', method, 'isExclude:', isExclude);\n if (!method) {\n console.log('[updateConditionCount] No method, hiding badge');\n $countEl.hide();\n return;\n }\n\n var $picker = isExclude\n ? $row.find('.exclude-picker')\n : $row.find('.include-picker');\n\n var valueType = $picker.data('valueType') || 'none';\n var searchEntity = $picker.attr('data-search-entity') || '';\n\n // Get the block type to check if this is a countries block\n if (!blockType) {\n var $block = $row.closest('.target-block');\n blockType = $block.data('blockType') || 'products';\n }\n\n console.log('[updateConditionCount] valueType:', valueType, 'searchEntity:', searchEntity, 'blockType:', blockType, 'method:', method);\n\n // Special case: \"All countries\" method - fetch holidays for all countries\n if (valueType === 'none' && blockType === 'countries' && method === 'all') {\n console.log('[updateConditionCount] All countries method - fetching all country holidays');\n $countEl.find('.preview-count').html('');\n $countEl.removeClass('clickable no-matches country-holidays').show();\n\n // First fetch all active country IDs, then get holidays\n $.ajax({\n url: self.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'searchTargetEntities',\n trait: 'EntitySelector',\n entity_type: 'countries',\n query: '',\n limit: 500\n },\n success: function(response) {\n var items = response.results || response.items || [];\n if (response && response.success && items.length > 0) {\n var allCountryIds = items.map(function(item) { return item.id; });\n console.log('[updateConditionCount] Found', allCountryIds.length, 'countries, fetching holidays');\n\n // Store condition data for click handler\n $countEl.data('conditionData', {\n method: method,\n values: allCountryIds,\n blockType: blockType,\n isExclude: isExclude,\n isCountryHolidays: true,\n countryIds: allCountryIds,\n isAllCountries: true\n });\n\n // Now fetch holiday count\n $.ajax({\n url: self.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'getHolidaysForCountries',\n trait: 'EntitySelector',\n country_ids: allCountryIds.join(','),\n count_only: 1\n },\n success: function(holidayResponse) {\n console.log('[updateConditionCount] All countries holiday response:', holidayResponse);\n if (holidayResponse && holidayResponse.success) {\n var count = holidayResponse.total_count || 0;\n $countEl.removeClass('no-matches clickable');\n $countEl.addClass('country-holidays');\n if (count === 0) {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('no-matches').show();\n } else {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('clickable').show();\n }\n $countEl.data('countriesInfo', holidayResponse.countries || []);\n } else {\n $countEl.hide().removeClass('clickable');\n }\n },\n error: function() {\n $countEl.hide().removeClass('clickable');\n }\n });\n } else {\n $countEl.hide().removeClass('clickable');\n }\n },\n error: function() {\n $countEl.hide().removeClass('clickable');\n }\n });\n return;\n }\n\n // Hide badge for other \"all\" type methods (valueType === 'none') since they don't filter\n if (valueType === 'none') {\n console.log('[updateConditionCount] valueType is none, hiding badge');\n $countEl.hide();\n return;\n }\n\n var values = this.getPickerValues($picker, valueType);\n\n var hasNoValues = !values ||\n (Array.isArray(values) && values.length === 0) ||\n (typeof values === 'object' && !Array.isArray(values) && (\n (valueType === 'combination_attributes' && values.attributes !== undefined && Object.keys(values.attributes).length === 0) ||\n (valueType !== 'combination_attributes' && Object.keys(values).length === 0)\n ));\n if (valueType !== 'boolean' && hasNoValues) {\n $countEl.hide();\n return;\n }\n\n if (!blockType) {\n var $block = $row.closest('.target-block');\n blockType = $block.data('blockType') || 'products';\n }\n\n // Check if this is a country selection - show holiday count instead\n var isCountrySelection = (searchEntity === 'countries' && valueType === 'entity_search');\n console.log('[updateConditionCount] isCountrySelection:', isCountrySelection, 'values:', values);\n\n $countEl.find('.preview-count').html('');\n $countEl.removeClass('clickable no-matches country-holidays').show();\n\n // For countries, fetch holiday count\n if (isCountrySelection && Array.isArray(values) && values.length > 0) {\n console.log('[updateConditionCount] Fetching holiday count for countries:', values);\n $countEl.data('conditionData', {\n method: method,\n values: values,\n blockType: blockType,\n isExclude: isExclude,\n isCountryHolidays: true,\n countryIds: values\n });\n\n $.ajax({\n url: self.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'getHolidaysForCountries',\n trait: 'EntitySelector',\n country_ids: values.join(','),\n count_only: 1\n },\n success: function(response) {\n console.log('[updateConditionCount] Holiday response:', response);\n if (response && response.success) {\n var count = response.total_count || 0;\n console.log('[updateConditionCount] Holiday count:', count);\n $countEl.removeClass('no-matches clickable');\n $countEl.addClass('country-holidays');\n if (count === 0) {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('no-matches').show();\n } else {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('clickable').show();\n }\n // Store countries info for popover\n $countEl.data('countriesInfo', response.countries || []);\n } else {\n console.log('[updateConditionCount] Holiday response failed:', response);\n $countEl.hide().removeClass('clickable');\n }\n },\n error: function() {\n $countEl.hide().removeClass('clickable');\n }\n });\n return;\n }\n\n // Default: count entities\n $countEl.data('conditionData', {\n method: method,\n values: values,\n blockType: blockType,\n isExclude: isExclude\n });\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countConditionMatches',\n trait: 'EntitySelector',\n method: method,\n values: JSON.stringify(values),\n block_type: blockType\n },\n success: function(response) {\n if (response && response.success) {\n var count = response.count || 0;\n $countEl.removeClass('no-matches clickable');\n if (count === 0) {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('no-matches').show();\n } else {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('clickable').show();\n }\n } else {\n $countEl.hide().removeClass('clickable');\n }\n },\n error: function() {\n $countEl.hide().removeClass('clickable');\n }\n });\n },\n\n updateGroupTotalCount: function($group) {\n var self = this;\n var $block = $group.closest('.target-block');\n var blockType = $block.data('blockType') || 'products';\n var $badge = $group.find('.group-header .group-count-badge');\n var $limitInput = $group.find('.group-modifier-limit');\n\n // Build group data for AJAX\n var groupData = this.serializeGroup($group, blockType);\n\n // Check if include has valid data\n if (!groupData.include || !groupData.include.method) {\n $badge.hide();\n $limitInput.attr('placeholder', '–');\n return;\n }\n\n // Show loading\n $badge.html('').show();\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countGroupItems',\n trait: 'EntitySelector',\n group_data: JSON.stringify(groupData),\n block_type: blockType\n },\n success: function(response) {\n if (response && response.success) {\n var finalCount = response.final_count || 0;\n var excludeCount = response.exclude_count || 0;\n\n // Update badge with eye icon and count\n var badgeHtml = ' ' + finalCount;\n if (excludeCount > 0) {\n badgeHtml += ' (-' + excludeCount + ')';\n }\n $badge.html(badgeHtml);\n $badge.addClass('clickable').show();\n\n // Store group data on badge for preview popover\n $badge.data('groupData', groupData);\n $badge.data('blockType', blockType);\n $badge.data('finalCount', finalCount);\n\n // Update limit placeholder with the count\n $limitInput.attr('placeholder', finalCount);\n\n // Also update the group-preview-badge count (apply limit if set)\n var $previewBadge = $group.find('.group-preview-badge .preview-count');\n if ($previewBadge.length) {\n var limit = parseInt($limitInput.val(), 10);\n var displayCount = (limit > 0 && limit < finalCount) ? limit : finalCount;\n $previewBadge.text(displayCount);\n }\n } else {\n $badge.hide().removeClass('clickable');\n $limitInput.attr('placeholder', '–');\n }\n },\n error: function() {\n $badge.hide();\n $limitInput.attr('placeholder', '–');\n }\n });\n },\n\n // Exclude row management\n addFirstExcludeRow: function($group, $block) {\n var $excludesDiv = $group.find('.group-excludes');\n var trans = this.config.trans || {};\n\n // Build the full excludes structure with first row\n var html = '
';\n html += ' ' + (trans.except || 'EXCEPT') + '';\n html += '
';\n\n html += '
';\n html += this.buildExcludeRowHtml($block, 0);\n html += '
';\n\n html += '';\n\n $excludesDiv.addClass('has-excludes').html(html);\n\n // Enhance the first exclude method select with styled dropdown\n var $firstRow = $excludesDiv.find('.exclude-row[data-exclude-index=\"0\"]');\n var $firstSelect = $firstRow.find('.exclude-method-select');\n this.enhanceMethodSelect($firstSelect);\n\n // Update method info placeholder for initial selection\n var blockType = $block.data('blockType');\n var initialMethod = $firstSelect.val();\n this.updateMethodInfoPlaceholder($firstRow.find('.method-selector-wrapper'), initialMethod, blockType);\n\n this.updateMethodSelectorLock($group, true);\n this.serializeAllBlocks();\n },\n\n addExcludeRow: function($group, $block) {\n var $container = $group.find('.exclude-rows-container');\n\n // Get next exclude index\n var maxIndex = -1;\n $container.find('.exclude-row').each(function() {\n var idx = parseInt($(this).data('excludeIndex'), 10);\n if (idx > maxIndex) maxIndex = idx;\n });\n var excludeIndex = maxIndex + 1;\n\n var html = this.buildExcludeRowHtml($block, excludeIndex);\n $container.append(html);\n\n // Enhance the exclude method select with styled dropdown\n var $newRow = $container.find('.exclude-row[data-exclude-index=\"' + excludeIndex + '\"]');\n var $newSelect = $newRow.find('.exclude-method-select');\n this.enhanceMethodSelect($newSelect);\n\n // Update method info placeholder for initial selection\n var blockType = $block.data('blockType');\n var initialMethod = $newSelect.val();\n this.updateMethodInfoPlaceholder($newRow.find('.method-selector-wrapper'), initialMethod, blockType);\n\n this.serializeAllBlocks();\n },\n\n buildExcludeRowHtml: function($block, excludeIndex) {\n var blockType = $block.data('blockType');\n var blockDef = this.config.blocks[blockType] || {};\n var methods = blockDef.selection_methods || {};\n var trans = this.config.trans || {};\n\n // Build exclude method options with optgroups (no \"all\")\n var excludeMethodOptions = this.buildMethodOptions(methods, true);\n\n // Find first non-all method for default search entity\n var firstSearchEntity = blockType;\n var firstValueType = 'entity_search';\n $.each(methods, function(methodKey, methodDef) {\n if (methodKey === 'all') return true;\n firstSearchEntity = methodDef.search_entity || blockType;\n firstValueType = methodDef.value_type || 'entity_search';\n return false; // break\n });\n\n var html = '
';\n\n // Header row with method select wrapped in method-selector-wrapper (same as include)\n html += '
';\n html += '
';\n html += '';\n html += ' 0';\n html += '';\n html += '
';\n html += '';\n html += '
';\n\n // Value picker based on first method's value type\n html += this.buildValuePickerHtml('exclude', firstValueType, firstSearchEntity, methods);\n\n html += '
';\n\n return html;\n },\n\n removeExcludeRow: function($excludeRow, $group, $block) {\n var $container = $group.find('.exclude-rows-container');\n var trans = this.config.trans || {};\n\n $excludeRow.remove();\n\n // Check if there are remaining exclude rows\n var remainingRows = $container.find('.exclude-row').length;\n\n if (remainingRows === 0) {\n // Remove entire excludes section and show \"Add exceptions\" button\n var $excludesDiv = $group.find('.group-excludes');\n $excludesDiv.removeClass('has-excludes').html(\n ''\n );\n // Unlock the method selector since no excludes exist\n this.updateMethodSelectorLock($group, false);\n }\n\n this.serializeAllBlocks();\n },\n\n // Method options building\n buildMethodOptions: function(methods, excludeAll) {\n var self = this;\n var trans = this.config.trans || {};\n var html = '';\n\n // Group labels\n var groupLabels = {\n 'select_by': trans.select_by || 'Select by...',\n 'filter_by': trans.filter_by || 'Filter by...'\n };\n\n // Separate methods by group\n var grouped = {};\n var ungrouped = {};\n\n $.each(methods, function(methodKey, methodDef) {\n if (excludeAll && methodKey === 'all') return true; // skip\n\n var group = methodDef.group || '';\n if (group) {\n if (!grouped[group]) {\n grouped[group] = {};\n }\n grouped[group][methodKey] = methodDef;\n } else {\n ungrouped[methodKey] = methodDef;\n }\n });\n\n // Render ungrouped options first\n $.each(ungrouped, function(methodKey, methodDef) {\n html += self.buildMethodOption(methodKey, methodDef);\n });\n\n // Render grouped options with optgroups\n $.each(grouped, function(groupKey, groupMethods) {\n var groupLabel = groupLabels[groupKey] || groupKey.replace(/_/g, ' ');\n html += '';\n $.each(groupMethods, function(methodKey, methodDef) {\n html += self.buildMethodOption(methodKey, methodDef);\n });\n html += '';\n });\n\n return html;\n },\n\n buildMethodOption: function(methodKey, methodDef) {\n var html = '
';\n\n $chips.append(html);\n },\n\n removeSelection: function($picker, id) {\n var $chips = $picker.find('.entity-chips');\n $picker.find('.entity-chip[data-id=\"' + id + '\"]').remove();\n this.updateChipsVisibility($chips);\n },\n\n updateChipsVisibility: function($chips) {\n var self = this;\n var trans = this.config.trans || {};\n var $picker = $chips.closest('.value-picker');\n var $allChips = $chips.find('.entity-chip');\n var totalCount = $allChips.length;\n\n // If no chips, remove the wrapper entirely\n var $existingWrapper = $chips.closest('.chips-wrapper');\n if (totalCount === 0) {\n if ($existingWrapper.length) {\n // Move chips out of wrapper before removing\n $existingWrapper.before($chips);\n $existingWrapper.remove();\n }\n return;\n }\n\n // Ensure chips wrapper structure exists\n this.ensureChipsWrapper($chips);\n\n var $wrapper = $chips.closest('.chips-wrapper');\n var $toolbar = $wrapper.find('.chips-toolbar');\n var $loadMore = $wrapper.find('.chips-load-more');\n\n // Get current search filter\n var searchTerm = $toolbar.find('.chips-search-input').val() || '';\n searchTerm = searchTerm.toLowerCase().trim();\n\n // Filter and paginate chips\n var visibleCount = 0;\n var filteredCount = 0;\n var isExpanded = $chips.hasClass('chips-expanded');\n var maxVisible = isExpanded ? 999999 : (this.maxVisibleChips || 12);\n\n $allChips.each(function() {\n var $chip = $(this);\n var chipName = ($chip.find('.chip-name').text() || '').toLowerCase();\n var matchesFilter = !searchTerm || chipName.indexOf(searchTerm) !== -1;\n\n $chip.removeClass('chip-filtered-out chip-paginated-out');\n\n if (!matchesFilter) {\n $chip.addClass('chip-filtered-out');\n } else {\n filteredCount++;\n if (filteredCount > maxVisible) {\n $chip.addClass('chip-paginated-out');\n } else {\n visibleCount++;\n }\n }\n });\n\n // Update toolbar (always show when we have chips)\n $toolbar.addClass('has-chips');\n this.updateChipsToolbar($toolbar, totalCount, filteredCount, searchTerm);\n\n // Update load more select dropdown\n var hiddenByPagination = filteredCount - visibleCount;\n if (hiddenByPagination > 0 && !isExpanded) {\n var loadText = trans.load || 'Load';\n var remainingText = (trans.remaining || '{count} remaining').replace('{count}', hiddenByPagination);\n var loadMoreHtml = '' + loadText + '' +\n '' +\n '' + remainingText + '';\n $loadMore.html(loadMoreHtml).show();\n } else if (isExpanded && filteredCount > (this.maxVisibleChips || 12)) {\n var collapseText = trans.collapse || 'Collapse';\n $loadMore.html(\n ''\n ).show();\n } else {\n $loadMore.hide();\n }\n },\n\n ensureChipsWrapper: function($chips) {\n // Check if already wrapped\n if ($chips.closest('.chips-wrapper').length) {\n return;\n }\n\n var trans = this.config.trans || {};\n var $picker = $chips.closest('.value-picker');\n\n // Create wrapper structure - integrated filter toolbar with sort\n var wrapperHtml = '
' +\n '
' +\n '' +\n '' +\n '' +\n '' +\n '
' +\n '
' +\n '
';\n\n var $wrapper = $(wrapperHtml);\n\n // Insert wrapper before chips and move chips inside\n $chips.before($wrapper);\n $wrapper.find('.chips-toolbar').after($chips);\n $wrapper.append($wrapper.find('.chips-load-more'));\n\n // Bind toolbar events\n this.bindChipsToolbarEvents($wrapper);\n },\n\n bindChipsToolbarEvents: function($wrapper) {\n var self = this;\n var $chips = $wrapper.find('.entity-chips');\n var searchTimeout;\n\n // Search input\n $wrapper.on('input', '.chips-search-input', function() {\n clearTimeout(searchTimeout);\n searchTimeout = setTimeout(function() {\n // Collapse when searching to show filtered results from start\n $chips.removeClass('chips-expanded');\n self.updateChipsVisibility($chips);\n }, 150);\n });\n\n // Sort select\n $wrapper.on('change', '.chips-sort-select', function() {\n var sortBy = $(this).val();\n self.sortChips($chips, sortBy);\n });\n\n // Clear all button\n $wrapper.on('click', '.btn-chips-clear', function() {\n var searchTerm = $wrapper.find('.chips-search-input').val() || '';\n var $chipsToRemove;\n\n if (searchTerm.trim()) {\n // Remove only filtered (visible) chips\n $chipsToRemove = $chips.find('.entity-chip:not(.chip-filtered-out)');\n } else {\n // Remove all chips\n $chipsToRemove = $chips.find('.entity-chip');\n }\n\n $chipsToRemove.each(function() {\n $(this).find('.chip-remove').trigger('click');\n });\n\n // Clear search\n $wrapper.find('.chips-search-input').val('');\n self.updateChipsVisibility($chips);\n });\n\n // Load more select dropdown\n $wrapper.on('change', '.load-more-select', function() {\n var loadCount = $(this).val();\n if (loadCount === 'all') {\n $chips.addClass('chips-expanded');\n self.maxVisibleChips = 999999;\n } else {\n self.maxVisibleChips = (self.maxVisibleChips || 12) + parseInt(loadCount, 10);\n }\n self.updateChipsVisibility($chips);\n });\n\n // Collapse button\n $wrapper.on('click', '.btn-collapse-chips', function() {\n $chips.removeClass('chips-expanded');\n self.maxVisibleChips = 12;\n self.updateChipsVisibility($chips);\n });\n },\n\n /**\n * Sort chips by specified criteria\n */\n sortChips: function($chips, sortBy) {\n var $allChips = $chips.find('.entity-chip');\n if ($allChips.length < 2) return;\n\n var sorted = $allChips.toArray().sort(function(a, b) {\n var $a = $(a);\n var $b = $(b);\n\n switch (sortBy) {\n case 'name_asc':\n var nameA = ($a.find('.chip-name').text() || '').toLowerCase();\n var nameB = ($b.find('.chip-name').text() || '').toLowerCase();\n return nameA.localeCompare(nameB);\n case 'name_desc':\n var nameA2 = ($a.find('.chip-name').text() || '').toLowerCase();\n var nameB2 = ($b.find('.chip-name').text() || '').toLowerCase();\n return nameB2.localeCompare(nameA2);\n case 'added':\n default:\n // Keep original DOM order (order added)\n return 0;\n }\n });\n\n // Re-append in sorted order\n $.each(sorted, function(i, chip) {\n $chips.append(chip);\n });\n\n this.updateChipsVisibility($chips);\n },\n\n updateChipsToolbar: function($toolbar, totalCount, filteredCount, searchTerm) {\n var trans = this.config.trans || {};\n var $count = $toolbar.find('.chips-count');\n var $clearBtn = $toolbar.find('.btn-chips-clear');\n var $clearText = $clearBtn.find('.clear-text');\n\n // Update count display\n if (searchTerm) {\n $count.addClass('has-filter').html(\n '' + filteredCount + '' +\n '/' +\n '' + totalCount + ''\n );\n $clearText.text((trans.clear || 'Clear') + ' ' + filteredCount);\n } else {\n $count.removeClass('has-filter').html(totalCount);\n $clearText.text(trans.clear_all || 'Clear all');\n }\n\n // Show/hide clear button\n if (searchTerm && filteredCount === 0) {\n $clearBtn.hide();\n } else if (totalCount > 0) {\n $clearBtn.show();\n } else {\n $clearBtn.hide();\n }\n },\n\n // =========================================================================\n // Loading/Initialization\n // =========================================================================\n\n loadExistingSelections: function() {\n var self = this;\n console.log('[EntitySelector] loadExistingSelections called for id:', this.config.id);\n\n // Collect all entity IDs to load, grouped by entity type\n var entitiesToLoad = {}; // { entity_type: { ids: [], pickers: [] } }\n\n console.log('[EntitySelector] Looking for .selection-group in wrapper:', this.$wrapper.length ? 'found' : 'NOT FOUND');\n this.$wrapper.find('.selection-group').each(function() {\n console.log('[EntitySelector] Found .selection-group, index:', $(this).data('groupIndex'));\n var $group = $(this);\n var $block = $group.closest('.target-block');\n var blockType = $block.data('blockType');\n\n // Load include values\n var $includePicker = $group.find('.include-picker');\n self.collectPickerEntities($includePicker, blockType, entitiesToLoad);\n\n // Enhance the include method select if not already enhanced\n self.enhanceMethodSelect($group.find('.include-method-select'));\n\n // Load exclude values from each exclude row\n $group.find('.exclude-row').each(function() {\n var $excludeRow = $(this);\n self.collectPickerEntities($excludeRow.find('.exclude-picker'), blockType, entitiesToLoad);\n\n // Enhance the exclude method select if not already enhanced\n self.enhanceMethodSelect($excludeRow.find('.exclude-method-select'));\n });\n\n // Lock method selector if excludes exist\n var hasExcludes = $group.find('.group-excludes.has-excludes').length > 0;\n if (hasExcludes) {\n self.updateMethodSelectorLock($group, true);\n }\n });\n\n // Build bulk request: { entityType: [uniqueIds], ... }\n var bulkRequest = {};\n var hasEntities = false;\n\n Object.keys(entitiesToLoad).forEach(function(entityType) {\n var data = entitiesToLoad[entityType];\n if (data.ids.length === 0) return;\n\n // Deduplicate IDs\n var uniqueIds = data.ids.filter(function(id, index, arr) {\n return arr.indexOf(id) === index;\n });\n\n bulkRequest[entityType] = uniqueIds;\n hasEntities = true;\n });\n\n // Skip AJAX if no entities to load\n if (!hasEntities) {\n console.log('[EntitySelector] No entities to load, skipping AJAX');\n return;\n }\n\n console.log('[EntitySelector] Making bulk AJAX request for entities:', JSON.stringify(bulkRequest));\n\n // Single bulk AJAX call for all entity types\n var bulkAjaxData = {\n ajax: 1,\n action: 'getTargetEntitiesByIdsBulk',\n trait: 'EntitySelector',\n entities: JSON.stringify(bulkRequest)\n };\n if (self.config.productSelectionLevel && self.config.productSelectionLevel !== 'product') {\n bulkAjaxData.product_selection_level = self.config.productSelectionLevel;\n }\n $.ajax({\n url: self.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: bulkAjaxData,\n success: function(response) {\n console.log('[EntitySelector] AJAX response:', response);\n if (!response.success || !response.entities) {\n console.log('[EntitySelector] Response failed or no entities');\n return;\n }\n try {\n\n // Process each entity type's results\n Object.keys(entitiesToLoad).forEach(function(entityType) {\n var data = entitiesToLoad[entityType];\n var entities = response.entities[entityType] || [];\n\n // Build a map of id -> entity for quick lookup\n var entityMap = {};\n entities.forEach(function(entity) {\n entityMap[entity.id] = entity;\n });\n\n // Update each picker that requested this entity type\n data.pickers.forEach(function(pickerData) {\n var $picker = pickerData.$picker;\n var $chips = $picker.find('.entity-chips');\n var $dataInput = $picker.find('.include-values-data, .exclude-values-data');\n var validIds = [];\n\n // Check if this is a country entity\n var isCountry = (entityType === 'countries');\n\n // Replace loading chips with real data\n pickerData.ids.forEach(function(id) {\n var $loadingChip = $chips.find('.entity-chip-loading[data-id=\"' + id + '\"]');\n if (entityMap[id]) {\n var entity = entityMap[id];\n validIds.push(entity.id);\n\n // Create real chip\n var html = '';\n } else if (entity.image) {\n html += '\"\"';\n }\n\n html += '' + self.escapeHtml(entity.name) + '';\n\n // Country: add holiday preview button\n if (isCountry) {\n html += '';\n }\n\n html += '';\n html += '
';\n\n $loadingChip.replaceWith(html);\n } else {\n // Entity not found, remove loading chip\n $loadingChip.remove();\n }\n });\n\n // Update chips visibility\n self.updateChipsVisibility($chips);\n\n // If some entities were not found, update the hidden input\n if (validIds.length !== pickerData.ids.length) {\n $dataInput.val(JSON.stringify(validIds));\n self.serializeAllBlocks();\n }\n\n self.updateBlockStatus($picker.closest('.target-block'));\n });\n });\n\n // Update condition counts after chips are loaded (for holiday counts, etc.)\n self.updateAllConditionCounts();\n\n } catch (e) {\n console.error('[EntitySelector] Error processing AJAX response:', e);\n }\n },\n error: function(xhr, status, error) {\n console.error('[EntitySelector] AJAX request failed:', status, error, xhr.responseText);\n }\n });\n },\n\n /**\n * Collect entity IDs from a picker for bulk loading\n * Also shows loading placeholders for entity_search types\n */\n collectPickerEntities: function($picker, blockType, entitiesToLoad) {\n console.log('[EntitySelector] collectPickerEntities called, blockType:', blockType, 'picker length:', $picker.length);\n if (!$picker.length) {\n console.log('[EntitySelector] Picker not found, returning');\n return;\n }\n\n var self = this;\n var $dataInput = $picker.find('.include-values-data, .exclude-values-data');\n console.log('[EntitySelector] Looking for values-data input, found:', $dataInput.length);\n if (!$dataInput.length) {\n console.log('[EntitySelector] No data input found, returning');\n return;\n }\n\n var valueType = $picker.attr('data-value-type');\n var rawValue = $dataInput.val() || '[]';\n console.log('[EntitySelector] valueType:', valueType, 'rawValue:', rawValue);\n\n var values = [];\n try {\n values = JSON.parse(rawValue);\n console.log('[EntitySelector] Parsed values:', values);\n } catch (e) {\n console.log('[EntitySelector] JSON parse error:', e);\n return;\n }\n\n // Handle non-entity types synchronously\n if (valueType === 'multi_numeric_range') {\n if (!Array.isArray(values) || values.length === 0) return;\n\n var $chipsContainer = $picker.find('.multi-range-chips');\n values.forEach(function(range) {\n if (!range || (range.min === null && range.max === null)) return;\n\n var chipText = '';\n if (range.min !== null && range.max !== null) {\n chipText = range.min + ' - ' + range.max;\n } else if (range.min !== null) {\n chipText = '≥ ' + range.min;\n } else {\n chipText = '≤ ' + range.max;\n }\n\n var $chip = $('', {\n class: 'range-chip',\n 'data-min': range.min !== null ? range.min : '',\n 'data-max': range.max !== null ? range.max : ''\n });\n $chip.append($('', { class: 'range-chip-text', text: chipText }));\n $chip.append($('';\n html += '' + this.escapeHtml(pattern) + '';\n html += '';\n html += '';\n $chipsContainer.append(html);\n },\n\n /**\n * Get all pattern tags from a wrapper\n * Returns array of objects: { pattern: string, caseSensitive: boolean }\n */\n getPatternTags: function($wrapper) {\n var patterns = [];\n // Exclude draft-tag which is the input field, not a saved pattern\n $wrapper.find('.pattern-tag:not(.draft-tag)').each(function() {\n var pattern = $(this).data('pattern');\n var caseSensitive = $(this).data('caseSensitive') === 1 || $(this).data('caseSensitive') === '1';\n if (pattern) {\n patterns.push({\n pattern: pattern,\n caseSensitive: caseSensitive\n });\n }\n });\n return patterns;\n },\n\n /**\n * Update the match count displayed in the draft tag while typing\n * Shows live preview with current case sensitivity setting\n */\n updateDraftTagCount: function($draftTag, pattern, caseSensitive) {\n var self = this;\n var $matchCount = $draftTag.find('.pattern-match-count');\n var $countValue = $matchCount.find('.count-value');\n\n // Get entity type from block\n var $block = $draftTag.closest('.target-block');\n var entityType = $block.data('blockType') || 'products';\n\n // Show loading - keep eye icon, update count value\n $countValue.html('');\n $matchCount.show();\n\n // Store pattern for click handler\n $matchCount.data('pattern', pattern);\n $matchCount.data('caseSensitive', caseSensitive);\n $matchCount.data('entityType', entityType);\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countPatternMatches',\n trait: 'EntitySelector',\n pattern: pattern,\n field: 'name',\n entity_type: entityType,\n case_sensitive: caseSensitive ? 1 : 0\n },\n success: function(response) {\n if (response.success) {\n var count = parseInt(response.count, 10) || 0;\n $countValue.text(count);\n $matchCount.show();\n // Add visual feedback based on count\n $matchCount.removeClass('count-zero count-found');\n $matchCount.addClass(count === 0 ? 'count-zero' : 'count-found');\n // Store count for preview\n $matchCount.data('count', count);\n // Update group total count to reflect draft pattern in calculation\n var $group = $draftTag.closest('.selection-group');\n if ($group.length) {\n self.updateGroupTotalCount($group);\n }\n } else {\n $countValue.text('?');\n $matchCount.show();\n }\n },\n error: function() {\n $countValue.text('?');\n $matchCount.show();\n }\n });\n },\n\n /**\n * Update condition count with a pending pattern (typed but not yet added as tag)\n * This shows a live preview of what the count would be if the user pressed Enter\n */\n updateConditionCountWithPendingPattern: function($row, pendingPattern) {\n var self = this;\n var trans = this.config.trans || {};\n\n // Find the count element - in method-selector-wrapper for include, in exclude-header-row for exclude\n var $countEl = $row.find('.method-selector-wrapper > .condition-match-count, > .exclude-header-row > .condition-match-count').first();\n if (!$countEl.length) return;\n\n var isExclude = $row.hasClass('exclude-row');\n var $methodSelect = isExclude\n ? $row.find('.exclude-method-select')\n : $row.find('.include-method-select');\n\n var method = $methodSelect.val();\n if (!method) {\n $countEl.hide();\n return;\n }\n\n var $picker = isExclude\n ? $row.find('.exclude-picker')\n : $row.find('.include-picker');\n\n var valueType = $picker.data('valueType') || 'none';\n\n // Only process for pattern value types\n if (valueType !== 'pattern') {\n return;\n }\n\n // Get existing pattern tags\n var values = this.getPatternTags($picker);\n\n // Add the pending pattern as a temporary tag (case-insensitive by default)\n if (pendingPattern) {\n values.push({ pattern: pendingPattern, caseSensitive: false });\n }\n\n if (values.length === 0) {\n $countEl.hide();\n return;\n }\n\n var $block = $row.closest('.target-block');\n var blockType = $block.data('blockType') || 'products';\n\n // Show loading\n $countEl.find('.preview-count').html('');\n $countEl.removeClass('clickable no-matches').show();\n\n // Store condition data on badge for popover\n $countEl.data('conditionData', {\n method: method,\n values: values,\n blockType: blockType,\n isExclude: isExclude\n });\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countConditionMatches',\n trait: 'EntitySelector',\n method: method,\n values: JSON.stringify(values),\n block_type: blockType\n },\n success: function(response) {\n if (response && response.success) {\n var count = response.count || 0;\n $countEl.removeClass('no-matches clickable');\n if (count === 0) {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('no-matches').show();\n } else {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('clickable').show();\n }\n } else {\n $countEl.hide().removeClass('clickable');\n }\n },\n error: function() {\n $countEl.hide().removeClass('clickable');\n }\n });\n },\n\n /**\n * Fetch pattern match count via AJAX\n */\n fetchPatternMatchCount: function($picker, pattern, $countEl) {\n // Determine field type from method select\n // Check if we're in an exclude row first, then fall back to include\n var $excludeRow = $picker.closest('.exclude-row');\n var $methodSelect;\n if ($excludeRow.length) {\n $methodSelect = $excludeRow.find('.exclude-method-select');\n } else {\n var $group = $picker.closest('.selection-group');\n $methodSelect = $group.find('.include-method-select');\n }\n var method = $methodSelect.val() || '';\n var field = method.indexOf('reference') !== -1 ? 'reference' : 'name';\n\n // Get entity type from block\n var $block = $picker.closest('.target-block');\n var entityType = $block.data('blockType') || 'products';\n\n // Show loading state\n $countEl.find('.preview-count').html('');\n $countEl.removeClass('clickable no-matches').show();\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countPatternMatches',\n trait: 'EntitySelector',\n pattern: pattern,\n field: field,\n entity_type: entityType,\n case_sensitive: 0\n },\n success: function(response) {\n if (response && response.success) {\n var count = response.count || 0;\n $countEl.find('.preview-count').text(count);\n $countEl.removeClass('no-matches clickable').show();\n if (count === 0) {\n $countEl.addClass('no-matches');\n } else {\n $countEl.addClass('clickable');\n }\n } else {\n $countEl.hide();\n }\n },\n error: function() {\n $countEl.hide();\n }\n });\n },\n\n // =========================================================================\n // Picker Value Extraction\n // =========================================================================\n\n /**\n * Get values from a picker based on its type\n */\n getPickerValues: function($picker, valueType) {\n switch (valueType) {\n case 'entity_search':\n var ids = [];\n $picker.find('.entity-chip').each(function() {\n var id = $(this).data('id');\n if (id) ids.push(id);\n });\n return ids;\n\n case 'pattern':\n var patternValues = this.getPatternTags($picker);\n // Also include draft pattern if it has content (not yet added as tag)\n var $draftPatternInput = $picker.find('.draft-tag .pattern-input');\n var draftPatternVal = $.trim($draftPatternInput.val());\n if (draftPatternVal) {\n var draftCaseSens = $draftPatternInput.closest('.draft-tag').attr('data-case-sensitive') === '1';\n patternValues.push({\n pattern: draftPatternVal,\n caseSensitive: draftCaseSens\n });\n }\n return patternValues;\n\n case 'numeric_range':\n var min = $picker.find('.range-min-input').val();\n var max = $picker.find('.range-max-input').val();\n return { min: min || null, max: max || null };\n\n case 'date_range':\n var from = $picker.find('.date-from-input').val();\n var to = $picker.find('.date-to-input').val();\n return { from: from || null, to: to || null };\n\n case 'select':\n return [$picker.find('.select-value-input').val()];\n\n case 'boolean':\n return [true];\n\n default:\n return [];\n }\n },\n\n // =========================================================================\n // Count/Status Updates\n // =========================================================================\n\n /**\n * Fetch and update condition match count for a row (include or exclude)\n */\n updateConditionCount: function($row) {\n var self = this;\n var trans = this.config.trans || {};\n\n // Find the count element - in method-selector-wrapper for include, in exclude-header-row for exclude\n var $countEl = $row.find('.method-selector-wrapper > .condition-match-count, > .exclude-header-row > .condition-match-count').first();\n if (!$countEl.length) return;\n\n // Determine if this is an include or exclude row\n var isExclude = $row.hasClass('exclude-row');\n var $methodSelect = isExclude\n ? $row.find('.exclude-method-select')\n : $row.find('.include-method-select');\n\n var method = $methodSelect.val();\n if (!method) {\n $countEl.hide();\n return;\n }\n\n // Get the picker and extract values\n var $picker = isExclude\n ? $row.find('.exclude-picker')\n : $row.find('.include-picker');\n\n var valueType = $picker.data('valueType') || 'none';\n var values = this.getPickerValues($picker, valueType);\n\n // Don't count if no values (except for boolean/all methods)\n var hasNoValues = !values ||\n (Array.isArray(values) && values.length === 0) ||\n (typeof values === 'object' && !Array.isArray(values) && (\n // For combination_attributes, check if attributes object is empty\n (valueType === 'combination_attributes' && values.attributes !== undefined && Object.keys(values.attributes).length === 0) ||\n // For other objects, check if completely empty\n (valueType !== 'combination_attributes' && Object.keys(values).length === 0)\n ));\n if (valueType !== 'none' && valueType !== 'boolean' && hasNoValues) {\n $countEl.hide();\n return;\n }\n\n // Get block type\n var $block = $row.closest('.target-block');\n var blockType = $block.data('blockType') || 'products';\n\n // Show loading\n $countEl.find('.preview-count').html('');\n $countEl.removeClass('clickable no-matches').show();\n\n // Store condition data on badge for popover\n $countEl.data('conditionData', {\n method: method,\n values: values,\n blockType: blockType,\n isExclude: isExclude\n });\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countConditionMatches',\n trait: 'EntitySelector',\n method: method,\n values: JSON.stringify(values),\n block_type: blockType\n },\n success: function(response) {\n if (response && response.success) {\n var count = response.count || 0;\n $countEl.removeClass('no-matches clickable');\n if (count === 0) {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('no-matches').show();\n } else {\n // Show count, make clickable for preview popover\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('clickable').show();\n }\n } else {\n $countEl.hide().removeClass('clickable');\n }\n },\n error: function() {\n $countEl.hide().removeClass('clickable');\n }\n });\n },\n\n /**\n * Update all condition counts in a group\n */\n updateGroupCounts: function($group) {\n var self = this;\n\n // Update include count\n var $include = $group.find('.group-include');\n if ($include.length) {\n this.updateConditionCount($include);\n }\n\n // Update each exclude row count\n $group.find('.exclude-row').each(function() {\n self.updateConditionCount($(this));\n });\n\n // Update group total count (include - excludes)\n this.updateGroupTotalCount($group);\n },\n\n /**\n * Update the group total count badge (include - excludes)\n * Also updates the limit input placeholder\n */\n updateGroupTotalCount: function($group) {\n var self = this;\n var $block = $group.closest('.target-block');\n var blockType = $block.data('blockType') || 'products';\n var $badge = $group.find('.group-header .group-count-badge');\n var $limitInput = $group.find('.group-modifier-limit');\n\n // Build group data for AJAX\n var groupData = this.serializeGroup($group, blockType);\n\n // Check if include has valid data\n if (!groupData.include || !groupData.include.method) {\n $badge.hide();\n $limitInput.attr('placeholder', '–');\n return;\n }\n\n // Show loading\n $badge.html('').show();\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countGroupItems',\n trait: 'EntitySelector',\n group_data: JSON.stringify(groupData),\n block_type: blockType\n },\n success: function(response) {\n if (response && response.success) {\n var finalCount = response.final_count || 0;\n var excludeCount = response.exclude_count || 0;\n\n // Update badge with eye icon and count\n var badgeHtml = ' ' + finalCount;\n if (excludeCount > 0) {\n badgeHtml += ' (-' + excludeCount + ')';\n }\n $badge.html(badgeHtml);\n $badge.addClass('clickable').show();\n\n // Store group data on badge for preview popover\n $badge.data('groupData', groupData);\n $badge.data('blockType', blockType);\n $badge.data('finalCount', finalCount);\n\n // Update limit placeholder with the count\n $limitInput.attr('placeholder', finalCount);\n\n // Also update the group-preview-badge count (apply limit if set)\n var $previewBadge = $group.find('.group-preview-badge .preview-count');\n if ($previewBadge.length) {\n var limit = parseInt($limitInput.val(), 10);\n var displayCount = (limit > 0 && limit < finalCount) ? limit : finalCount;\n $previewBadge.text(displayCount);\n }\n } else {\n $badge.hide().removeClass('clickable');\n $limitInput.attr('placeholder', '–');\n }\n },\n error: function() {\n $badge.hide();\n $limitInput.attr('placeholder', '–');\n }\n });\n },\n\n /**\n * Update all condition counts for all visible groups\n */\n updateAllConditionCounts: function() {\n var self = this;\n this.$wrapper.find('.target-block.active .selection-group').each(function() {\n self.updateGroupCounts($(this));\n });\n },\n\n /**\n * Fetch category names by IDs and add chips to the picker\n * Used when adding selections from the tree modal\n * @param {jQuery} $picker - Picker element\n * @param {Array} ids - Category IDs to add\n * @param {string} entityType - 'categories' or 'cms_categories'\n * @param {Function} callback - Called when done\n */\n fetchCategoryNamesAndAddChips: function($picker, ids, entityType, callback) {\n var self = this;\n\n if (!ids || ids.length === 0) {\n if (typeof callback === 'function') {\n callback();\n }\n return;\n }\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'getTargetEntitiesByIds',\n trait: 'EntitySelector',\n entity_type: entityType,\n ids: JSON.stringify(ids)\n },\n success: function(response) {\n if (response.success && response.entities) {\n response.entities.forEach(function(entity) {\n self.addSelectionNoUpdate($picker, entity.id, entity.name, entity);\n });\n }\n if (typeof callback === 'function') {\n callback();\n }\n },\n error: function() {\n if (typeof callback === 'function') {\n callback();\n }\n }\n });\n }\n };\n\n})(jQuery);\n","/**\n * Entity Selector - Groups Module\n * Selection group management, serialization, block/tab management\n * @partial _groups.js\n *\n * Contains:\n * - Group management: addGroup, removeGroup, clearAllConditions\n * - Block/Tab: switchToBlock, updateTabBadges, updateBlockStatus\n * - Serialization: serializeGroup, serializeAllBlocks, getBlockGroups\n * - Counts: fetchProductCount, updateHeaderTotalCount, updateAllConditionCounts\n * - Excludes: addFirstExcludeRow, addExcludeRow, removeExcludeRow\n * - Validation: validate, showValidationError, clearValidationError\n */\n\n(function($) {\n 'use strict';\n\n window._EntitySelectorMixins = window._EntitySelectorMixins || {};\n\n window._EntitySelectorMixins.groups = {\n\n addGroup: function($block, blockType) {\n var $container = $block.find('.groups-container');\n var trans = this.config.trans || {};\n var blockDef = this.config.blocks[blockType] || {};\n var methods = blockDef.selection_methods || {};\n\n // Remove empty state\n $container.find('.groups-empty-state').remove();\n\n // Get next group index\n var maxIndex = -1;\n $container.find('.selection-group').each(function() {\n var idx = parseInt($(this).data('groupIndex'), 10);\n if (idx > maxIndex) maxIndex = idx;\n });\n var groupIndex = maxIndex + 1;\n\n // Build method options with optgroups\n var methodOptions = this.buildMethodOptions(methods, false);\n\n // Build exclude method options (no \"all\") with optgroups\n var excludeMethodOptions = this.buildMethodOptions(methods, true);\n\n var defaultGroupName = (trans.group || 'Group') + ' ' + (groupIndex + 1);\n var html = '
';\n\n // Group header\n html += '
';\n html += '';\n html += '';\n html += '';\n html += '';\n html += '';\n html += '';\n html += '
';\n\n // Group body (collapsible content)\n html += '
';\n\n // Include section\n html += '
';\n html += '
';\n html += '
';\n html += '';\n html += ' 0';\n html += '';\n html += '
';\n var noItemsText = trans.no_items_selected || 'No items selected - use search below';\n html += '
';\n html += '
';\n html += '
';\n html += '';\n html += '';\n html += '';\n html += '
';\n html += '';\n html += '
';\n html += '
';\n html += '
';\n\n // Excludes section (collapsed by default)\n html += '
';\n html += '';\n html += '
';\n\n // Group-level modifiers (limit & sort)\n html += '
';\n html += '';\n html += '' + (trans.limit || 'Limit') + '';\n html += '';\n html += '';\n html += '';\n html += '' + (trans.sort || 'Sort') + '';\n html += '';\n html += '';\n html += '';\n html += '';\n html += ' ';\n html += '';\n html += '
';\n\n html += '
'; // Close group-body\n\n html += '
'; // Close selection-group\n\n $container.append(html);\n\n // Find the new group and set method to \"all\" by default\n var $newGroup = $container.find('.selection-group[data-group-index=\"' + groupIndex + '\"]');\n\n // Enhance the method select with styled dropdown\n this.enhanceMethodSelect($newGroup.find('.include-method-select'));\n\n $newGroup.find('.include-method-select').val('all').trigger('change');\n\n this.updateBlockStatus($block);\n this.serializeAllBlocks();\n },\n\n removeGroup: function($group, $block) {\n $group.remove();\n\n var $container = $block.find('.groups-container');\n var remainingGroups = $container.find('.selection-group').length;\n\n if (remainingGroups === 0) {\n var emptyText = this.getEmptyStateText($block);\n var emptyHtml = '
';\n emptyHtml += '' + emptyText + '';\n emptyHtml += '
';\n $container.html(emptyHtml);\n }\n\n this.updateBlockStatus($block);\n this.serializeAllBlocks();\n\n // Update tab badges and header total count\n this.updateTabBadges();\n },\n\n clearAllConditions: function() {\n var self = this;\n\n // Remove all groups from all blocks\n this.$wrapper.find('.target-block').each(function() {\n var $block = $(this);\n var $container = $block.find('.groups-container');\n\n // Remove all groups\n $container.find('.selection-group').remove();\n\n // Show empty state\n var emptyText = self.getEmptyStateText($block);\n var emptyHtml = '
';\n emptyHtml += '' + emptyText + '';\n emptyHtml += '
';\n $container.html(emptyHtml);\n\n self.updateBlockStatus($block);\n });\n\n // Update serialized data\n this.serializeAllBlocks();\n\n // Update tab badges and header count\n this.updateTabBadges();\n\n // Also update header total count immediately (since all cleared)\n this.updateHeaderTotalCount();\n },\n\n switchToBlock: function(blockType) {\n // Update tabs\n this.$wrapper.find('.target-block-tab').removeClass('active');\n this.$wrapper.find('.target-block-tab[data-block-type=\"' + blockType + '\"]').addClass('active');\n\n // Update blocks\n this.$wrapper.find('.target-block').removeClass('active').hide();\n this.$wrapper.find('.target-block[data-block-type=\"' + blockType + '\"]').addClass('active').show();\n\n // Close dropdown if open\n this.hideDropdown();\n },\n\n updateTabBadges: function() {\n var self = this;\n\n // Collect all block types with data and set loading state\n var blockTypesWithData = [];\n this.$wrapper.find('.target-block-tab').each(function() {\n var $tab = $(this);\n var blockType = $tab.data('blockType');\n var $block = self.$wrapper.find('.target-block[data-block-type=\"' + blockType + '\"]');\n var groupCount = $block.find('.selection-group').length;\n\n // Update or add badge\n var $badge = $tab.find('.tab-badge');\n if (groupCount > 0) {\n // Show loading state first\n if ($badge.length) {\n $badge.addClass('loading').html('');\n } else {\n $tab.append('');\n }\n $tab.addClass('has-data');\n blockTypesWithData.push(blockType);\n } else {\n $badge.remove();\n $tab.removeClass('has-data');\n }\n });\n\n // Update target switch state based on whether any data exists\n this.updateTargetSwitchState();\n\n // Fetch all counts in a single bulk request\n if (blockTypesWithData.length > 0) {\n this.fetchAllCounts(blockTypesWithData);\n }\n },\n\n updateTargetSwitchState: function() {\n var $switch = this.$wrapper.find('.prestashop-switch');\n if (!$switch.length) {\n return;\n }\n\n // Check if any block has data\n var hasData = false;\n this.$wrapper.find('.target-block').each(function() {\n if ($(this).find('.selection-group').length > 0) {\n hasData = true;\n return false; // break\n }\n });\n\n // Update switch: value=\"1\" is \"Everyone/All/None\", value=\"0\" is \"Specific/Selected\"\n if (hasData) {\n $switch.find('input[value=\"0\"]').prop('checked', true);\n } else {\n $switch.find('input[value=\"1\"]').prop('checked', true);\n }\n },\n\n /**\n * Fetch counts for all block types in a single bulk AJAX request\n * @param {Array} blockTypes - Array of block type strings to fetch counts for\n */\n fetchAllCounts: function(blockTypes) {\n var self = this;\n\n // Read saved data from hidden input\n var $hiddenInput = this.$wrapper.find('input[name=\"' + this.config.name + '\"]');\n var savedData = {};\n try {\n savedData = JSON.parse($hiddenInput.val() || '{}');\n } catch (e) {\n savedData = {};\n }\n\n // Build conditions object for all requested block types\n var conditions = {};\n blockTypes.forEach(function(blockType) {\n var groups = (savedData[blockType] && savedData[blockType].groups) ? savedData[blockType].groups : [];\n if (groups.length > 0) {\n conditions[blockType] = { groups: groups };\n }\n });\n\n // If no valid conditions, remove loading spinners\n if (Object.keys(conditions).length === 0) {\n blockTypes.forEach(function(blockType) {\n var $tab = self.$wrapper.find('.target-block-tab[data-block-type=\"' + blockType + '\"]');\n $tab.find('.tab-badge').remove();\n $tab.removeClass('has-data');\n });\n return;\n }\n\n // Single bulk AJAX request for all counts\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'previewEntitySelectorBulk',\n trait: 'EntitySelector',\n conditions: JSON.stringify(conditions)\n },\n success: function(response) {\n if (response.success && response.counts) {\n // Update each tab with its count\n Object.keys(response.counts).forEach(function(blockType) {\n var count = response.counts[blockType];\n var $tab = self.$wrapper.find('.target-block-tab[data-block-type=\"' + blockType + '\"]');\n var $badge = $tab.find('.tab-badge');\n\n if ($badge.length) {\n $badge.removeClass('loading').html(' ' + count);\n // Store preview data for later popover use\n $tab.data('previewData', { count: count, success: true });\n }\n });\n\n // Handle any block types not in response (set count to 0 or remove badge)\n blockTypes.forEach(function(blockType) {\n if (!(blockType in response.counts)) {\n var $tab = self.$wrapper.find('.target-block-tab[data-block-type=\"' + blockType + '\"]');\n $tab.find('.tab-badge').remove();\n $tab.removeClass('has-data');\n }\n });\n\n self.updateHeaderTotalCount();\n } else {\n console.error('[EntitySelector] Bulk preview failed:', response.error || 'Unknown error');\n // Remove loading spinners on error\n blockTypes.forEach(function(blockType) {\n var $tab = self.$wrapper.find('.target-block-tab[data-block-type=\"' + blockType + '\"]');\n $tab.find('.tab-badge').remove();\n });\n }\n },\n error: function(xhr, status, error) {\n console.error('[EntitySelector] Bulk AJAX error:', status, error);\n // Remove loading spinners on error\n blockTypes.forEach(function(blockType) {\n var $tab = self.$wrapper.find('.target-block-tab[data-block-type=\"' + blockType + '\"]');\n $tab.find('.tab-badge').remove();\n });\n }\n });\n },\n\n /**\n * Fetch count for a single block type (legacy, used for single updates)\n */\n fetchProductCount: function(blockType, $tab) {\n var self = this;\n var data = {};\n\n // Read from hidden input (contains full saved data or freshly serialized data)\n var $hiddenInput = this.$wrapper.find('input[name=\"' + this.config.name + '\"]');\n var savedData = {};\n try {\n savedData = JSON.parse($hiddenInput.val() || '{}');\n } catch (e) {\n savedData = {};\n }\n\n // Get groups for the requested block type\n var groups = (savedData[blockType] && savedData[blockType].groups) ? savedData[blockType].groups : [];\n\n if (groups.length === 0) {\n $tab.find('.tab-badge').remove();\n $tab.removeClass('has-data');\n $tab.removeData('previewData');\n return;\n }\n\n // Show loading state\n var $badge = $tab.find('.tab-badge');\n if (!$badge.length) {\n $badge = $('');\n $tab.append($badge);\n } else {\n $badge.addClass('loading').html('');\n }\n $tab.addClass('has-data');\n\n data[blockType] = { groups: groups };\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'previewEntitySelector',\n trait: 'EntitySelector',\n conditions: JSON.stringify(data),\n block_type: blockType,\n limit: 10\n },\n success: function(response) {\n if (response.success) {\n var $badge = $tab.find('.tab-badge');\n $badge.removeClass('loading').html(' ' + response.count);\n\n // Store preview data for popover\n $tab.data('previewData', response);\n\n // Update header total count\n self.updateHeaderTotalCount();\n } else {\n console.error('[EntitySelector] Preview failed for', blockType, ':', response.error || 'Unknown error');\n $tab.find('.tab-badge').remove();\n }\n },\n error: function(xhr, status, error) {\n console.error('[EntitySelector] AJAX error for', blockType, ':', status, error);\n $tab.find('.tab-badge').remove();\n self.updateHeaderTotalCount();\n }\n });\n },\n\n updateHeaderTotalCount: function() {\n var self = this;\n var total = 0;\n\n // Sum up all tab badge counts\n this.$wrapper.find('.target-block-tab .tab-badge').each(function() {\n var $badge = $(this);\n if (!$badge.hasClass('loading')) {\n var count = parseInt($badge.text(), 10);\n if (!isNaN(count)) {\n total += count;\n }\n }\n });\n\n var $totalBadge = this.$wrapper.find('.trait-total-count');\n if (total > 0) {\n $totalBadge.find('.count-value').text(total);\n $totalBadge.show();\n } else {\n $totalBadge.hide();\n }\n\n // Update show-all toggle state\n this.updateShowAllToggle();\n },\n\n updateShowAllToggle: function() {\n var $toggle = this.$wrapper.find('.trait-show-all-toggle');\n if (!$toggle.length) return;\n\n var $checkbox = $toggle.find('.show-all-checkbox');\n var hasData = this.$wrapper.find('.target-block-tab.has-data').length > 0;\n\n // If there's data, uncheck (not showing to all), otherwise check\n $checkbox.prop('checked', !hasData);\n },\n\n updateBlockStatus: function($block) {\n var $status = $block.find('.block-status');\n var blockType = $block.data('blockType');\n var blockDef = this.config.blocks[blockType] || {};\n var trans = this.config.trans || {};\n\n var groups = this.getBlockGroups($block);\n\n if (groups.length === 0) {\n var emptyMeansAll = this.config.emptyMeansAll !== false;\n if (emptyMeansAll) {\n $status.text((trans.all || 'All') + ' ' + (blockDef.entity_label_plural || 'items'));\n } else {\n $status.text(trans.nothing_selected || 'Nothing selected');\n }\n } else {\n $status.text(groups.length + ' ' + (groups.length === 1 ? (trans.group || 'group') : (trans.groups || 'groups')));\n }\n },\n\n getEmptyStateText: function($block) {\n var blockType = $block.data('blockType');\n var blockMode = $block.data('mode') || 'multi';\n var blockDef = this.config.blocks[blockType] || {};\n var trans = this.config.trans || {};\n var emptyMeansAll = this.config.emptyMeansAll !== false;\n\n if (blockMode === 'single') {\n return trans.no_item_selected || 'No item selected';\n }\n\n if (emptyMeansAll) {\n return (trans.all || 'All') + ' ' + (blockDef.entity_label_plural || 'items') + ' ' + (trans.included || 'included');\n }\n\n return trans.nothing_selected || 'Nothing selected';\n },\n\n serializeGroup: function($group, blockType) {\n var self = this;\n\n // Include\n var includeMethod = $group.find('.include-method-select').val() || 'all';\n var $includePicker = $group.find('.include-picker');\n var includeValues = this.getPickerValues($includePicker);\n\n // Excludes (multiple rows)\n var excludes = [];\n var $excludesSection = $group.find('.group-excludes.has-excludes');\n if ($excludesSection.length) {\n $group.find('.exclude-row').each(function() {\n var $row = $(this);\n var excludeMethod = $row.find('.exclude-method-select').val() || null;\n var $excludePicker = $row.find('.exclude-picker');\n var excludeValues = self.getPickerValues($excludePicker);\n\n if (excludeMethod && excludeValues && (Array.isArray(excludeValues) ? excludeValues.length > 0 : true)) {\n excludes.push({\n method: excludeMethod,\n values: excludeValues\n });\n }\n });\n }\n\n var groupData = {\n include: {\n method: includeMethod,\n values: includeValues\n }\n };\n\n if (excludes.length > 0) {\n groupData.excludes = excludes;\n }\n\n // Add modifiers if present\n var modifiers = this.getGroupModifiers($group);\n if (modifiers.limit || modifiers.sort_by) {\n groupData.modifiers = modifiers;\n }\n\n return groupData;\n },\n\n serializeAllBlocks: function($changedRow) {\n var self = this;\n var data = {};\n\n console.log('[EntitySelector] serializeAllBlocks called');\n\n this.$wrapper.find('.target-block').each(function() {\n var $block = $(this);\n var blockType = $block.data('blockType');\n var groups = self.getBlockGroups($block);\n\n console.log('[EntitySelector] Block:', blockType, 'Groups:', groups.length);\n\n // Groups now contain their own modifiers, no block-level modifiers\n if (groups.length > 0) {\n data[blockType] = { groups: groups };\n }\n\n self.updateBlockStatus($block);\n });\n\n // Update hidden input first\n var $input = this.$wrapper.find('input[name=\"' + this.config.name + '\"]');\n var jsonData = JSON.stringify(data);\n\n console.log('[EntitySelector] Hidden input name:', this.config.name);\n console.log('[EntitySelector] Hidden input found:', $input.length);\n console.log('[EntitySelector] Serialized data:', jsonData.substring(0, 500));\n\n $input.val(jsonData);\n\n // Then update tab badges (reads from hidden input)\n this.updateTabBadges();\n\n // Debounced update of condition count - only for changed row if specified\n if (this.countUpdateTimeout) {\n clearTimeout(this.countUpdateTimeout);\n }\n this.countUpdateTimeout = setTimeout(function() {\n if ($changedRow && $changedRow.length) {\n // Update the specific row that changed\n self.updateConditionCount($changedRow);\n // Also update the group total count (include - excludes)\n var $group = $changedRow.closest('.selection-group');\n if ($group.length) {\n self.updateGroupTotalCount($group);\n }\n } else {\n // Fallback: update all counts (initial load, structure changes)\n self.updateAllConditionCounts();\n }\n }, 500);\n },\n\n getBlockGroups: function($block) {\n var self = this;\n var groups = [];\n\n $block.find('.selection-group').each(function() {\n var $group = $(this);\n\n // Include\n var includeMethod = $group.find('.include-method-select').val() || 'all';\n var $includePicker = $group.find('.include-picker');\n var includeValues = self.getPickerValues($includePicker);\n\n // Skip groups with invalid include conditions (e.g., \"specific products\" with none selected)\n if (!self.isConditionValid(includeMethod, includeValues, $includePicker)) {\n return true; // continue to next group\n }\n\n // Excludes (multiple rows) - only include valid ones\n var excludes = [];\n var $excludesSection = $group.find('.group-excludes.has-excludes');\n if ($excludesSection.length) {\n $group.find('.exclude-row').each(function() {\n var $row = $(this);\n var excludeMethod = $row.find('.exclude-method-select').val() || null;\n var $excludePicker = $row.find('.exclude-picker');\n var excludeValues = self.getPickerValues($excludePicker);\n\n // Only include valid exclude conditions\n if (excludeMethod && self.isConditionValid(excludeMethod, excludeValues, $excludePicker)) {\n excludes.push({\n method: excludeMethod,\n values: excludeValues\n });\n }\n });\n }\n\n var groupData = {\n include: {\n method: includeMethod,\n values: includeValues\n }\n };\n\n // Group name (optional, for organizational purposes)\n var groupName = $.trim($group.attr('data-group-name') || '');\n if (groupName) {\n groupData.name = groupName;\n }\n\n if (excludes.length > 0) {\n groupData.excludes = excludes;\n }\n\n // Group-level modifiers\n var modifiers = self.getGroupModifiers($group);\n if (modifiers.limit || modifiers.sort_by) {\n groupData.modifiers = modifiers;\n }\n\n groups.push(groupData);\n });\n\n return groups;\n },\n\n getGroupModifiers: function($group) {\n var limit = $group.find('.group-modifier-limit').val();\n var sortBy = $group.find('.group-modifier-sort').val() || 'sales';\n var $sortDirBtn = $group.find('.group-modifiers .btn-sort-dir');\n var sortDir = $sortDirBtn.data('dir') || 'DESC';\n\n return {\n limit: limit ? parseInt(limit, 10) : null,\n sort_by: sortBy || null,\n sort_dir: sortDir || 'DESC'\n };\n },\n\n getPickerValues: function($picker) {\n var valueType = $picker.attr('data-value-type') || 'entity_search';\n var values = [];\n\n switch (valueType) {\n case 'entity_search':\n $picker.find('.entity-chip').each(function() {\n var id = $(this).data('id');\n values.push(isNaN(id) ? id : Number(id));\n });\n break;\n\n case 'pattern':\n values = this.getPatternTags($picker);\n // Also include draft pattern if it has content (not yet added as tag)\n var $draftInput = $picker.find('.draft-tag .pattern-input');\n var draftPattern = $.trim($draftInput.val());\n if (draftPattern) {\n var draftCaseSensitive = $draftInput.closest('.draft-tag').attr('data-case-sensitive') === '1';\n values.push({\n pattern: draftPattern,\n caseSensitive: draftCaseSensitive\n });\n }\n break;\n\n case 'numeric_range':\n var min = $picker.find('.range-min-input').val();\n var max = $picker.find('.range-max-input').val();\n if (min !== '' || max !== '') {\n values = {\n min: min !== '' ? parseFloat(min) : null,\n max: max !== '' ? parseFloat(max) : null\n };\n }\n break;\n\n case 'date_range':\n var from = $picker.find('.date-from-input').val();\n var to = $picker.find('.date-to-input').val();\n if (from || to) {\n values = {\n from: from || null,\n to: to || null\n };\n }\n break;\n\n case 'select':\n var selectVal = $picker.find('.select-value-input').val();\n if (selectVal) {\n values = [selectVal];\n }\n break;\n\n case 'boolean':\n values = [true];\n break;\n\n case 'multi_numeric_range':\n var ranges = [];\n $picker.find('.range-chip').each(function() {\n var $chip = $(this);\n var minVal = $chip.data('min');\n var maxVal = $chip.data('max');\n ranges.push({\n min: minVal !== '' && minVal !== undefined ? parseFloat(minVal) : null,\n max: maxVal !== '' && maxVal !== undefined ? parseFloat(maxVal) : null\n });\n });\n if (ranges.length > 0) {\n values = ranges;\n }\n break;\n\n case 'multi_select_tiles':\n $picker.find('.tile-option.selected').each(function() {\n values.push($(this).data('value'));\n });\n break;\n\n case 'combination_attributes':\n // Returns object: { mode: 'products'|'combinations', attributes: { groupId: [valueId1, valueId2], ... } }\n var combAttrs = {};\n $picker.find('.comb-attr-value.selected').each(function() {\n var groupId = $(this).data('groupId').toString();\n var valueId = $(this).data('valueId');\n if (!combAttrs[groupId]) {\n combAttrs[groupId] = [];\n }\n combAttrs[groupId].push(valueId);\n });\n if (Object.keys(combAttrs).length > 0) {\n // Get mode: from radio if toggle exists, otherwise from config\n var $combPicker = $picker.find('.combination-attributes-picker');\n var configMode = $combPicker.data('combinationMode') || this.config.combinationMode || 'products';\n var combMode;\n if (configMode === 'toggle') {\n combMode = $picker.find('.comb-mode-radio:checked').val() || 'products';\n } else {\n combMode = configMode;\n }\n values = {\n mode: combMode,\n attributes: combAttrs\n };\n }\n break;\n }\n\n return values;\n },\n\n isConditionValid: function(method, values, $picker) {\n // 'all' method never needs values\n if (method === 'all') {\n return true;\n }\n\n // Boolean methods are always valid (the value is implicit true)\n var valueType = $picker.attr('data-value-type') || 'entity_search';\n if (valueType === 'boolean') {\n return true;\n }\n\n // For other methods, check if values are meaningful\n if (Array.isArray(values)) {\n return values.length > 0;\n }\n\n // For object values (ranges, combination_attributes), check if meaningful\n if (typeof values === 'object' && values !== null) {\n // Special handling for combination_attributes: { mode, attributes }\n if (valueType === 'combination_attributes' && values.attributes !== undefined) {\n return Object.keys(values.attributes).length > 0;\n }\n // For ranges and other objects, check if at least one bound is set\n return Object.keys(values).some(function(key) {\n return values[key] !== null && values[key] !== '';\n });\n }\n\n return false;\n },\n\n /**\n * Update all condition counts using a single bulk AJAX request\n */\n updateAllConditionCounts: function() {\n var self = this;\n var conditions = {};\n var conditionElements = {};\n var conditionIndex = 0;\n\n // Collect all conditions from all active groups\n this.$wrapper.find('.target-block.active .selection-group').each(function() {\n var $group = $(this);\n var $block = $group.closest('.target-block');\n var blockType = $block.data('blockType') || 'products';\n\n // Process include row\n var $include = $group.find('.group-include');\n if ($include.length) {\n var includeData = self.getConditionData($include, blockType);\n if (includeData) {\n var id = 'c' + conditionIndex++;\n conditions[id] = includeData.condition;\n conditionElements[id] = includeData.$countEl;\n }\n }\n\n // Process exclude rows\n $group.find('.exclude-row').each(function() {\n var excludeData = self.getConditionData($(this), blockType);\n if (excludeData) {\n var id = 'c' + conditionIndex++;\n conditions[id] = excludeData.condition;\n conditionElements[id] = excludeData.$countEl;\n }\n });\n });\n\n // If no conditions, nothing to do\n if (Object.keys(conditions).length === 0) {\n return;\n }\n\n // Make single bulk AJAX request\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countConditionMatchesBulk',\n trait: 'EntitySelector',\n conditions: JSON.stringify(conditions)\n },\n success: function(response) {\n if (response && response.success && response.counts) {\n // Update each count element with its result\n Object.keys(response.counts).forEach(function(id) {\n var count = response.counts[id] || 0;\n var $countEl = conditionElements[id];\n if ($countEl && $countEl.length) {\n $countEl.removeClass('no-matches clickable');\n if (count === 0) {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('no-matches').show();\n } else {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('clickable').show();\n }\n }\n });\n }\n // Note: Group totals are updated on-demand when user interacts, not on initial load\n },\n error: function() {\n // Hide all count elements on error\n Object.keys(conditionElements).forEach(function(id) {\n var $countEl = conditionElements[id];\n if ($countEl && $countEl.length) {\n $countEl.hide().removeClass('clickable');\n }\n });\n }\n });\n },\n\n /**\n * Extract condition data from a row for bulk counting\n */\n getConditionData: function($row, blockType) {\n console.log('[getConditionData] Called with blockType:', blockType);\n var $countEl = $row.find('.method-selector-wrapper > .condition-match-count, > .exclude-header-row .condition-match-count').first();\n console.log('[getConditionData] $countEl found:', $countEl.length);\n if (!$countEl.length) return null;\n\n var isExclude = $row.hasClass('exclude-row');\n var $methodSelect = isExclude\n ? $row.find('.exclude-method-select')\n : $row.find('.include-method-select');\n\n var method = $methodSelect.val();\n console.log('[getConditionData] method:', method);\n if (!method) {\n $countEl.hide();\n return null;\n }\n\n var $picker = isExclude\n ? $row.find('.exclude-picker')\n : $row.find('.include-picker');\n console.log('[getConditionData] $picker found:', $picker.length, 'data-value-type attr:', $picker.attr('data-value-type'));\n\n var valueType = $picker.data('valueType') || $picker.attr('data-value-type') || 'none';\n console.log('[getConditionData] valueType:', valueType);\n\n // Special case: \"All countries\" method - needs separate handling for holidays\n if (valueType === 'none' && blockType === 'countries' && method === 'all') {\n console.log('[getConditionData] All countries detected - triggering updateConditionCount');\n // Trigger separate update for this special case (uses nested AJAX)\n var self = this;\n setTimeout(function() {\n self.updateConditionCount($row, blockType);\n }, 0);\n return null; // Skip bulk processing, handled separately\n }\n\n // Special case: Specific countries with entity_search - needs holiday counting, not entity counting\n var searchEntity = $picker.attr('data-search-entity') || '';\n if (blockType === 'countries' && valueType === 'entity_search' && searchEntity === 'countries') {\n console.log('[getConditionData] Specific countries detected - triggering updateConditionCount for holiday counting');\n var self = this;\n setTimeout(function() {\n self.updateConditionCount($row, blockType);\n }, 0);\n return null; // Skip bulk processing, handled separately\n }\n\n // Hide badge for other \"all\" type methods (valueType === 'none') since they don't filter\n if (valueType === 'none') {\n $countEl.hide();\n return null;\n }\n\n var values = this.getPickerValues($picker, valueType);\n\n // Don't count if no values (except for boolean methods)\n var hasNoValues = !values ||\n (Array.isArray(values) && values.length === 0) ||\n (typeof values === 'object' && !Array.isArray(values) && (\n (valueType === 'combination_attributes' && values.attributes !== undefined && Object.keys(values.attributes).length === 0) ||\n (valueType !== 'combination_attributes' && Object.keys(values).length === 0)\n ));\n if (valueType !== 'boolean' && hasNoValues) {\n $countEl.hide();\n return null;\n }\n\n // Show loading spinner\n $countEl.find('.preview-count').html('');\n $countEl.removeClass('clickable no-matches').show();\n\n // Store condition data on badge for popover\n $countEl.data('conditionData', {\n method: method,\n values: values,\n blockType: blockType,\n isExclude: isExclude\n });\n\n return {\n condition: {\n method: method,\n values: values,\n block_type: blockType\n },\n $countEl: $countEl\n };\n },\n\n updateGroupCounts: function($group) {\n var self = this;\n var $block = $group.closest('.target-block');\n var blockType = $block.data('blockType') || 'products';\n\n // Update include count\n var $include = $group.find('.group-include');\n if ($include.length) {\n this.updateConditionCount($include, blockType);\n }\n\n // Update each exclude row count\n $group.find('.exclude-row').each(function() {\n self.updateConditionCount($(this), blockType);\n });\n\n // Update group total count (include - excludes)\n this.updateGroupTotalCount($group);\n },\n\n /**\n * Update a single condition count (used for individual updates after user changes)\n */\n updateConditionCount: function($row, blockType) {\n var self = this;\n\n var $countEl = $row.find('.method-selector-wrapper > .condition-match-count, > .exclude-header-row .condition-match-count').first();\n if (!$countEl.length) {\n console.log('[updateConditionCount] No $countEl found');\n return;\n }\n\n var isExclude = $row.hasClass('exclude-row');\n var $methodSelect = isExclude\n ? $row.find('.exclude-method-select')\n : $row.find('.include-method-select');\n\n var method = $methodSelect.val();\n console.log('[updateConditionCount] method:', method, 'isExclude:', isExclude);\n if (!method) {\n console.log('[updateConditionCount] No method, hiding badge');\n $countEl.hide();\n return;\n }\n\n var $picker = isExclude\n ? $row.find('.exclude-picker')\n : $row.find('.include-picker');\n\n var valueType = $picker.data('valueType') || 'none';\n var searchEntity = $picker.attr('data-search-entity') || '';\n\n // Get the block type to check if this is a countries block\n if (!blockType) {\n var $block = $row.closest('.target-block');\n blockType = $block.data('blockType') || 'products';\n }\n\n console.log('[updateConditionCount] valueType:', valueType, 'searchEntity:', searchEntity, 'blockType:', blockType, 'method:', method);\n\n // Special case: \"All countries\" method - fetch holidays for all countries\n if (valueType === 'none' && blockType === 'countries' && method === 'all') {\n console.log('[updateConditionCount] All countries method - fetching all country holidays');\n $countEl.find('.preview-count').html('');\n $countEl.removeClass('clickable no-matches country-holidays').show();\n\n // First fetch all active country IDs, then get holidays\n $.ajax({\n url: self.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'searchTargetEntities',\n trait: 'EntitySelector',\n entity_type: 'countries',\n query: '',\n limit: 500\n },\n success: function(response) {\n var items = response.results || response.items || [];\n if (response && response.success && items.length > 0) {\n var allCountryIds = items.map(function(item) { return item.id; });\n console.log('[updateConditionCount] Found', allCountryIds.length, 'countries, fetching holidays');\n\n // Store condition data for click handler\n $countEl.data('conditionData', {\n method: method,\n values: allCountryIds,\n blockType: blockType,\n isExclude: isExclude,\n isCountryHolidays: true,\n countryIds: allCountryIds,\n isAllCountries: true\n });\n\n // Now fetch holiday count\n $.ajax({\n url: self.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'getHolidaysForCountries',\n trait: 'EntitySelector',\n country_ids: allCountryIds.join(','),\n count_only: 1\n },\n success: function(holidayResponse) {\n console.log('[updateConditionCount] All countries holiday response:', holidayResponse);\n if (holidayResponse && holidayResponse.success) {\n var count = holidayResponse.total_count || 0;\n $countEl.removeClass('no-matches clickable');\n $countEl.addClass('country-holidays');\n if (count === 0) {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('no-matches').show();\n } else {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('clickable').show();\n }\n $countEl.data('countriesInfo', holidayResponse.countries || []);\n } else {\n $countEl.hide().removeClass('clickable');\n }\n },\n error: function() {\n $countEl.hide().removeClass('clickable');\n }\n });\n } else {\n $countEl.hide().removeClass('clickable');\n }\n },\n error: function() {\n $countEl.hide().removeClass('clickable');\n }\n });\n return;\n }\n\n // Hide badge for other \"all\" type methods (valueType === 'none') since they don't filter\n if (valueType === 'none') {\n console.log('[updateConditionCount] valueType is none, hiding badge');\n $countEl.hide();\n return;\n }\n\n var values = this.getPickerValues($picker, valueType);\n\n var hasNoValues = !values ||\n (Array.isArray(values) && values.length === 0) ||\n (typeof values === 'object' && !Array.isArray(values) && (\n (valueType === 'combination_attributes' && values.attributes !== undefined && Object.keys(values.attributes).length === 0) ||\n (valueType !== 'combination_attributes' && Object.keys(values).length === 0)\n ));\n if (valueType !== 'boolean' && hasNoValues) {\n $countEl.hide();\n return;\n }\n\n if (!blockType) {\n var $block = $row.closest('.target-block');\n blockType = $block.data('blockType') || 'products';\n }\n\n // Check if this is a country selection - show holiday count instead\n var isCountrySelection = (searchEntity === 'countries' && valueType === 'entity_search');\n console.log('[updateConditionCount] isCountrySelection:', isCountrySelection, 'values:', values);\n\n $countEl.find('.preview-count').html('');\n $countEl.removeClass('clickable no-matches country-holidays').show();\n\n // For countries, fetch holiday count\n if (isCountrySelection && Array.isArray(values) && values.length > 0) {\n console.log('[updateConditionCount] Fetching holiday count for countries:', values);\n $countEl.data('conditionData', {\n method: method,\n values: values,\n blockType: blockType,\n isExclude: isExclude,\n isCountryHolidays: true,\n countryIds: values\n });\n\n $.ajax({\n url: self.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'getHolidaysForCountries',\n trait: 'EntitySelector',\n country_ids: values.join(','),\n count_only: 1\n },\n success: function(response) {\n console.log('[updateConditionCount] Holiday response:', response);\n if (response && response.success) {\n var count = response.total_count || 0;\n console.log('[updateConditionCount] Holiday count:', count);\n $countEl.removeClass('no-matches clickable');\n $countEl.addClass('country-holidays');\n if (count === 0) {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('no-matches').show();\n } else {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('clickable').show();\n }\n // Store countries info for popover\n $countEl.data('countriesInfo', response.countries || []);\n } else {\n console.log('[updateConditionCount] Holiday response failed:', response);\n $countEl.hide().removeClass('clickable');\n }\n },\n error: function() {\n $countEl.hide().removeClass('clickable');\n }\n });\n return;\n }\n\n // Default: count entities\n $countEl.data('conditionData', {\n method: method,\n values: values,\n blockType: blockType,\n isExclude: isExclude\n });\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countConditionMatches',\n trait: 'EntitySelector',\n method: method,\n values: JSON.stringify(values),\n block_type: blockType\n },\n success: function(response) {\n if (response && response.success) {\n var count = response.count || 0;\n $countEl.removeClass('no-matches clickable');\n if (count === 0) {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('no-matches').show();\n } else {\n $countEl.find('.preview-count').text(count);\n $countEl.addClass('clickable').show();\n }\n } else {\n $countEl.hide().removeClass('clickable');\n }\n },\n error: function() {\n $countEl.hide().removeClass('clickable');\n }\n });\n },\n\n updateGroupTotalCount: function($group) {\n var self = this;\n var $block = $group.closest('.target-block');\n var blockType = $block.data('blockType') || 'products';\n var $badge = $group.find('.group-header .group-count-badge');\n var $limitInput = $group.find('.group-modifier-limit');\n\n // Build group data for AJAX\n var groupData = this.serializeGroup($group, blockType);\n\n // Check if include has valid data\n if (!groupData.include || !groupData.include.method) {\n $badge.hide();\n $limitInput.attr('placeholder', '–');\n return;\n }\n\n // Show loading\n $badge.html('').show();\n\n $.ajax({\n url: this.config.ajaxUrl,\n type: 'POST',\n dataType: 'json',\n data: {\n ajax: 1,\n action: 'countGroupItems',\n trait: 'EntitySelector',\n group_data: JSON.stringify(groupData),\n block_type: blockType\n },\n success: function(response) {\n if (response && response.success) {\n var finalCount = response.final_count || 0;\n var excludeCount = response.exclude_count || 0;\n\n // Update badge with eye icon and count\n var badgeHtml = ' ' + finalCount;\n if (excludeCount > 0) {\n badgeHtml += ' (-' + excludeCount + ')';\n }\n $badge.html(badgeHtml);\n $badge.addClass('clickable').show();\n\n // Store group data on badge for preview popover\n $badge.data('groupData', groupData);\n $badge.data('blockType', blockType);\n $badge.data('finalCount', finalCount);\n\n // Update limit placeholder with the count\n $limitInput.attr('placeholder', finalCount);\n\n // Also update the group-preview-badge count (apply limit if set)\n var $previewBadge = $group.find('.group-preview-badge .preview-count');\n if ($previewBadge.length) {\n var limit = parseInt($limitInput.val(), 10);\n var displayCount = (limit > 0 && limit < finalCount) ? limit : finalCount;\n $previewBadge.text(displayCount);\n }\n } else {\n $badge.hide().removeClass('clickable');\n $limitInput.attr('placeholder', '–');\n }\n },\n error: function() {\n $badge.hide();\n $limitInput.attr('placeholder', '–');\n }\n });\n },\n\n // Exclude row management\n addFirstExcludeRow: function($group, $block) {\n var $excludesDiv = $group.find('.group-excludes');\n var trans = this.config.trans || {};\n\n // Build the full excludes structure with first row\n var html = '
';\n html += ' ' + (trans.except || 'EXCEPT') + '';\n html += '
';\n\n html += '
';\n html += this.buildExcludeRowHtml($block, 0);\n html += '
';\n\n html += '';\n\n $excludesDiv.addClass('has-excludes').html(html);\n\n // Enhance the first exclude method select with styled dropdown\n var $firstRow = $excludesDiv.find('.exclude-row[data-exclude-index=\"0\"]');\n var $firstSelect = $firstRow.find('.exclude-method-select');\n this.enhanceMethodSelect($firstSelect);\n\n // Update method info placeholder for initial selection\n var blockType = $block.data('blockType');\n var initialMethod = $firstSelect.val();\n this.updateMethodInfoPlaceholder($firstRow.find('.method-selector-wrapper'), initialMethod, blockType);\n\n this.updateMethodSelectorLock($group, true);\n this.serializeAllBlocks();\n },\n\n addExcludeRow: function($group, $block) {\n var $container = $group.find('.exclude-rows-container');\n\n // Get next exclude index\n var maxIndex = -1;\n $container.find('.exclude-row').each(function() {\n var idx = parseInt($(this).data('excludeIndex'), 10);\n if (idx > maxIndex) maxIndex = idx;\n });\n var excludeIndex = maxIndex + 1;\n\n var html = this.buildExcludeRowHtml($block, excludeIndex);\n $container.append(html);\n\n // Enhance the exclude method select with styled dropdown\n var $newRow = $container.find('.exclude-row[data-exclude-index=\"' + excludeIndex + '\"]');\n var $newSelect = $newRow.find('.exclude-method-select');\n this.enhanceMethodSelect($newSelect);\n\n // Update method info placeholder for initial selection\n var blockType = $block.data('blockType');\n var initialMethod = $newSelect.val();\n this.updateMethodInfoPlaceholder($newRow.find('.method-selector-wrapper'), initialMethod, blockType);\n\n this.serializeAllBlocks();\n },\n\n buildExcludeRowHtml: function($block, excludeIndex) {\n var blockType = $block.data('blockType');\n var blockDef = this.config.blocks[blockType] || {};\n var methods = blockDef.selection_methods || {};\n var trans = this.config.trans || {};\n\n // Build exclude method options with optgroups (no \"all\")\n var excludeMethodOptions = this.buildMethodOptions(methods, true);\n\n // Find first non-all method for default search entity\n var firstSearchEntity = blockType;\n var firstValueType = 'entity_search';\n $.each(methods, function(methodKey, methodDef) {\n if (methodKey === 'all') return true;\n firstSearchEntity = methodDef.search_entity || blockType;\n firstValueType = methodDef.value_type || 'entity_search';\n return false; // break\n });\n\n var html = '
';\n\n // Header row with method select wrapped in method-selector-wrapper (same as include)\n html += '
';\n html += '
';\n html += '';\n html += ' 0';\n html += '';\n html += '
';\n html += '';\n html += '
';\n\n // Value picker based on first method's value type\n html += this.buildValuePickerHtml('exclude', firstValueType, firstSearchEntity, methods);\n\n html += '
';\n\n return html;\n },\n\n removeExcludeRow: function($excludeRow, $group, $block) {\n var $container = $group.find('.exclude-rows-container');\n var trans = this.config.trans || {};\n\n $excludeRow.remove();\n\n // Check if there are remaining exclude rows\n var remainingRows = $container.find('.exclude-row').length;\n\n if (remainingRows === 0) {\n // Remove entire excludes section and show \"Add exceptions\" button\n var $excludesDiv = $group.find('.group-excludes');\n $excludesDiv.removeClass('has-excludes').html(\n ''\n );\n // Unlock the method selector since no excludes exist\n this.updateMethodSelectorLock($group, false);\n }\n\n this.serializeAllBlocks();\n },\n\n // Method options building\n buildMethodOptions: function(methods, excludeAll) {\n var self = this;\n var trans = this.config.trans || {};\n var html = '';\n\n // Group labels\n var groupLabels = {\n 'select_by': trans.select_by || 'Select by...',\n 'filter_by': trans.filter_by || 'Filter by...'\n };\n\n // Separate methods by group\n var grouped = {};\n var ungrouped = {};\n\n $.each(methods, function(methodKey, methodDef) {\n if (excludeAll && methodKey === 'all') return true; // skip\n\n var group = methodDef.group || '';\n if (group) {\n if (!grouped[group]) {\n grouped[group] = {};\n }\n grouped[group][methodKey] = methodDef;\n } else {\n ungrouped[methodKey] = methodDef;\n }\n });\n\n // Render ungrouped options first\n $.each(ungrouped, function(methodKey, methodDef) {\n html += self.buildMethodOption(methodKey, methodDef);\n });\n\n // Render grouped options with optgroups\n $.each(grouped, function(groupKey, groupMethods) {\n var groupLabel = groupLabels[groupKey] || groupKey.replace(/_/g, ' ');\n html += '';\n $.each(groupMethods, function(methodKey, methodDef) {\n html += self.buildMethodOption(methodKey, methodDef);\n });\n html += '';\n });\n\n return html;\n },\n\n buildMethodOption: function(methodKey, methodDef) {\n var html = '
'; $attrContainer.append(html); }); this.$dropdown.find('.filter-row-attributes').show(); @@ -252,12 +258,17 @@ if (this.filterableData.features && this.filterableData.features.length > 0) { this.filterableData.features.forEach(function(group) { - var html = ''; + html += ''; + html += '
'; $featContainer.append(html); }); this.$dropdown.find('.filter-row-features').show(); @@ -295,6 +306,7 @@ var colorStyle = val.color ? ' style="--chip-color: ' + val.color + '"' : ''; var colorClass = val.color ? ' has-color' : ''; + html += ''; html += ''; + html += ''; + html += ''; }); $valuesContainer.html(html); diff --git a/sources/js/admin/entity-selector/_groups.js b/sources/js/admin/entity-selector/_groups.js index 456faf5..8760015 100644 --- a/sources/js/admin/entity-selector/_groups.js +++ b/sources/js/admin/entity-selector/_groups.js @@ -1852,7 +1852,8 @@ clearValidationError: function() { this.$wrapper.removeClass('has-validation-error'); this.$wrapper.find('.trait-validation-error').remove(); - } + }, + }; })(jQuery); diff --git a/sources/js/admin/entity-selector/_methods.js b/sources/js/admin/entity-selector/_methods.js index 2042da0..5993823 100644 --- a/sources/js/admin/entity-selector/_methods.js +++ b/sources/js/admin/entity-selector/_methods.js @@ -586,7 +586,7 @@ class: 'mpr-info-wrapper', 'data-tooltip': helpContent }); - $infoWrapper.append($('', { class: 'material-icons', text: 'info_outline' })); + $infoWrapper.append($('', { class: 'material-icons', text: 'info' })); $placeholder.append($infoWrapper); } }, diff --git a/sources/js/admin/entity-selector/_preview.js b/sources/js/admin/entity-selector/_preview.js index 44ffaa8..4fdf70a 100644 --- a/sources/js/admin/entity-selector/_preview.js +++ b/sources/js/admin/entity-selector/_preview.js @@ -192,23 +192,8 @@ }); } - // Position popover below badge - var badgeOffset = $badge.offset(); - var badgeHeight = $badge.outerHeight(); - var badgeWidth = $badge.outerWidth(); - var popoverWidth = $popover.outerWidth(); - - var leftPos = badgeOffset.left + (badgeWidth / 2) - (popoverWidth / 2); - var minLeft = 10; - var maxLeft = $(window).width() - popoverWidth - 10; - leftPos = Math.max(minLeft, Math.min(leftPos, maxLeft)); - - $popover.css({ - position: 'absolute', - top: badgeOffset.top + badgeHeight + 8, - left: leftPos, - zIndex: 10000 - }); + // Position popover relative to badge (handles viewport overflow) + this.positionPopover($popover, $badge); // Show with transition $popover.addClass('show'); @@ -216,6 +201,61 @@ return $popover; }, + /** + * Position a popover relative to a trigger element. + * Handles horizontal and vertical viewport overflow. + * @param {jQuery} $popover - The popover element + * @param {jQuery} $trigger - The trigger element to position against + * @param {number} [zIndex=10000] - Optional z-index + */ + positionPopover: function($popover, $trigger, zIndex) { + var triggerRect = $trigger[0].getBoundingClientRect(); + var scrollTop = $(window).scrollTop(); + var scrollLeft = $(window).scrollLeft(); + var popoverWidth = $popover.outerWidth(); + var popoverHeight = $popover.outerHeight(); + var windowWidth = $(window).width(); + var windowHeight = $(window).height(); + var gap = 8; + + // Horizontal: center on trigger, then clamp to viewport + var left = triggerRect.left + scrollLeft + (triggerRect.width / 2) - (popoverWidth / 2); + left = Math.max(10, Math.min(left, windowWidth - popoverWidth - 10)); + + // Vertical: prefer below, flip above if it would overflow + var top; + var positionAbove = false; + if (triggerRect.bottom + popoverHeight + gap > windowHeight - 10) { + // Position above the trigger + top = triggerRect.top + scrollTop - popoverHeight - gap; + positionAbove = true; + } else { + // Position below the trigger + top = triggerRect.bottom + scrollTop + gap; + } + + $popover.css({ + position: 'absolute', + top: top, + left: left, + zIndex: zIndex || 10000 + }); + + // Toggle arrow direction class + $popover.toggleClass('position-above', positionAbove); + + // Determine horizontal arrow position class + var triggerCenter = triggerRect.left + (triggerRect.width / 2); + var popoverLeft = left; + var popoverCenter = popoverLeft + (popoverWidth / 2); + $popover.removeClass('position-left position-right'); + if (triggerCenter - popoverLeft < popoverWidth * 0.3) { + $popover.addClass('position-right'); + } else if (triggerCenter - popoverLeft > popoverWidth * 0.7) { + $popover.addClass('position-left'); + } + }, + /** * Update popover after loading more items */ @@ -1180,6 +1220,144 @@ }); }, + // ========================================================================= + // FILTER VALUE PREVIEW (individual attribute/feature value chip) + // ========================================================================= + + /** + * Show preview popover for a specific filter value (attribute or feature value) + * @param {jQuery} $badge - The preview button on the chip + * @param {number} valueId - The attribute/feature value ID + * @param {string} valueType - 'attribute' or 'feature' + * @param {string} valueName - Display name of the value + * @param {number} groupId - The parent group ID + */ + showFilterValuePreviewPopover: function($badge, valueId, valueType, valueName, groupId) { + var self = this; + + this.hidePreviewPopover(); + + $badge.addClass('popover-open loading'); + this.$activeBadge = $badge; + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'previewFilterValueProducts', + trait: 'EntitySelector', + value_id: valueId, + value_type: valueType, + group_id: groupId, + limit: 10 + }, + success: function(response) { + $badge.removeClass('loading'); + + if (response.success) { + self.createPreviewPopover({ + $badge: $badge, + items: response.items || [], + totalCount: response.count || 0, + hasMore: response.hasMore || false, + entityLabel: 'products', + previewType: 'filter-value', + context: { valueId: valueId, valueType: valueType, groupId: groupId, valueName: valueName }, + onLoadMore: function($btn) { + self.loadMoreFilterValueItems($btn); + }, + onFilter: function(query) { + self.filterFilterValueItems(query); + } + }); + } else { + $badge.removeClass('popover-open'); + self.$activeBadge = null; + } + }, + error: function() { + $badge.removeClass('loading popover-open'); + self.$activeBadge = null; + } + }); + }, + + /** + * AJAX filter handler for filter value preview + */ + filterFilterValueItems: function(query) { + var self = this; + var ctx = this.previewContext; + + if (!ctx || !ctx.valueId) { + self.showFilterLoading(false); + return; + } + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'previewFilterValueProducts', + trait: 'EntitySelector', + value_id: ctx.valueId, + value_type: ctx.valueType, + group_id: ctx.groupId, + filter: query, + limit: 20 + }, + success: function(response) { + self.updatePreviewPopoverFiltered(response); + }, + error: function() { + self.showFilterLoading(false); + } + }); + }, + + loadMoreFilterValueItems: function($btn) { + var self = this; + var ctx = this.previewContext; + + if (!ctx || !ctx.valueId) return; + + var loadCount = this.previewLoadCount || 20; + + var ajaxData = { + ajax: 1, + action: 'previewFilterValueProducts', + trait: 'EntitySelector', + value_id: ctx.valueId, + value_type: ctx.valueType, + group_id: ctx.groupId, + limit: self.previewLoadedCount + loadCount + }; + if (self.previewCurrentFilter) { + ajaxData.filter = self.previewCurrentFilter; + } + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: ajaxData, + success: function(response) { + if (response.success) { + self.previewTotalCount = response.count; + self.updatePreviewPopover(response.items || [], response.hasMore); + } + }, + error: function() { + $btn.removeClass('loading'); + $btn.find('i').removeClass('icon-spinner icon-spin').addClass('icon-plus'); + } + }); + }, + // ========================================================================= // CATEGORY ITEMS PREVIEW (products/pages in a category) // ========================================================================= @@ -1517,28 +1695,9 @@ self.switchToBlock(blockType); }); - // Position popover + // Position popover relative to badge (handles viewport overflow) $('body').append($popover); - var badgeOffset = $badge.offset(); - var badgeHeight = $badge.outerHeight(); - var popoverWidth = $popover.outerWidth(); - - $popover.css({ - position: 'absolute', - top: badgeOffset.top + badgeHeight + 5, - left: badgeOffset.left - (popoverWidth / 2) + ($badge.outerWidth() / 2), - zIndex: 10000 - }); - - // Adjust if off screen - var windowWidth = $(window).width(); - var popoverRight = $popover.offset().left + popoverWidth; - if (popoverRight > windowWidth - 10) { - $popover.css('left', windowWidth - popoverWidth - 10); - } - if ($popover.offset().left < 10) { - $popover.css('left', 10); - } + this.positionPopover($popover, $badge); $popover.hide().fadeIn(150); }, diff --git a/sources/js/admin/entity-selector/_search.js b/sources/js/admin/entity-selector/_search.js index c69b15d..6eb5169 100644 --- a/sources/js/admin/entity-selector/_search.js +++ b/sources/js/admin/entity-selector/_search.js @@ -40,6 +40,11 @@ sort_dir: this.currentSort ? this.currentSort.dir : 'ASC' }; + // Add product_selection_level if set + if (this.config.productSelectionLevel && this.config.productSelectionLevel !== 'product') { + requestData.product_selection_level = this.config.productSelectionLevel; + } + // Add refine query if present if (this.refineQuery) { requestData.refine = this.refineQuery; @@ -367,6 +372,8 @@ var isSelected = selectedIds.indexOf(String(item.id)) !== -1; var itemClass = 'dropdown-item' + (isSelected ? ' selected' : ''); if (item.type === 'product') itemClass += ' result-item-product'; + if (item.is_combination) itemClass += ' is-combination'; + if (item.is_parent) itemClass += ' is-parent-product'; html += '
.target-search-dropdown, font-weight: $es-font-weight-medium; } - // Count with eye icon (like group-count-badge) .toggle-count { - display: inline-flex; - align-items: center; - gap: 0.125rem; color: $es-text-muted; font-size: 0.65rem; - - i { - font-size: 10px; - color: $es-primary; - } - - // Clickable preview badge - &.clickable { - cursor: pointer; - padding: 0.125rem 0.25rem; - border-radius: $es-radius-sm; - transition: all $es-transition-fast; - - &:hover { - background: rgba($es-primary, 0.1); - color: $es-primary; - - i { - color: $es-primary; - } - } - - &.popover-open { - background: $es-primary; - color: $es-white; - - i { - color: $es-white; - } - } - - &.loading { - i { - animation: spin 0.6s linear infinite; - } - } - } } } @@ -1426,6 +1399,67 @@ body > .target-search-dropdown, color: rgba(255, 255, 255, 0.8); } + // Filter chip wrapper (chip/toggle + preview button) + .filter-chip-wrapper { + display: inline-flex; + align-items: stretch; + border-radius: $es-radius-sm; + overflow: hidden; + + // Left element gets left-only border-radius + .filter-chip, + .filter-group-toggle { + border-radius: $es-radius-sm 0 0 $es-radius-sm; + } + + // Preview eye button — unified for both value chips and group toggles + .chip-preview-btn { + @include button-reset; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0 0.375rem; + font-size: 10px; + color: $es-text-muted; + background: $es-slate-100; + border-left: 1px solid $es-border-color; + border-radius: 0 $es-radius-sm $es-radius-sm 0; + cursor: pointer; + transition: all $es-transition-fast; + + &:hover { + background: rgba($es-primary, 0.1); + color: $es-primary; + } + + &.popover-open { + background: $es-primary; + color: $es-white; + } + + &.loading i { + animation: spin 0.6s linear infinite; + } + } + + // When no preview button, restore full border-radius + .filter-chip:last-child, + .filter-group-toggle:last-child { + border-radius: $es-radius-sm; + } + + // Group toggle active/has-selection states propagate to wrapper border + .filter-group-toggle.active + .chip-preview-btn { + border-left-color: $es-primary; + background: rgba($es-primary, 0.05); + } + + .filter-group-toggle.has-selection + .chip-preview-btn { + border-left-color: $es-success; + background: rgba($es-success, 0.03); + } + } + // Dropdown content .dropdown-content { max-height: 400px; diff --git a/sources/scss/components/_entity-selector.scss b/sources/scss/components/_entity-selector.scss index 9e20591..2b3599e 100644 --- a/sources/scss/components/_entity-selector.scss +++ b/sources/scss/components/_entity-selector.scss @@ -368,6 +368,7 @@ // Single mode specific styles .target-conditions-trait.single-mode, .entity-selector-trait.single-mode { + // Hide tabs in standalone layout (has separate header, 1 tab is redundant) .target-block-tabs { display: none; } @@ -375,6 +376,11 @@ .target-block-container { display: block; } + + // In form-content layout, always show tabs — they serve as the block title + .entity-selector-tabs-row .target-block-tabs { + display: flex; + } } // Header action buttons diff --git a/sources/scss/components/_groups.scss b/sources/scss/components/_groups.scss index f8cd6b7..ec55e34 100644 --- a/sources/scss/components/_groups.scss +++ b/sources/scss/components/_groups.scss @@ -931,6 +931,36 @@ background-size: 1.25em 1.25em; } + // Single mode — strip padding, borders, backgrounds for clean single-selection UI + &[data-mode=single], + .mode-single { + .groups-container { + padding: 0; + } + + .group-body { + padding: 0; + } + + .group-include { + padding: 0.5rem; + margin-bottom: 0; + background: transparent; + border: none; + border-radius: 0; + } + + .selection-group { + background: transparent; + border: none; + margin-bottom: 0; + } + + .group-header { + display: none; + } + } + // Condition match count badge .condition-match-count { display: inline-flex; diff --git a/sources/scss/components/_list-preview.scss b/sources/scss/components/_list-preview.scss index 8f1873a..dd9af79 100644 --- a/sources/scss/components/_list-preview.scss +++ b/sources/scss/components/_list-preview.scss @@ -66,6 +66,23 @@ transform: none; } } + + // Positioned above trigger - arrow pointing down + &.position-above { + &::before { + top: auto; + bottom: -8px; + border-top: 8px solid $es-border-color; + border-bottom: 0; + } + + &::after { + top: auto; + bottom: -6px; + border-top: 6px solid $es-white; + border-bottom: 0; + } + } } // ============================================================================= diff --git a/src/EntitySelector.php b/src/EntitySelector.php index e262ed6..73d7982 100644 --- a/src/EntitySelector.php +++ b/src/EntitySelector.php @@ -156,8 +156,11 @@ trait EntitySelector } /** - * Get base path for target conditions assets from vendor package - * Assets are loaded directly from the package - no manual copying needed + * Get base path for entity selector assets from the vendor package. + * Auto-detects the correct path via reflection — no manual copying needed. + * + * DO NOT override this method. DO NOT copy CSS/JS to views/ directories. + * The sync script (sync-entity-selector.sh) enforces single-source assets. * * @return string URL path ending with / */ @@ -172,8 +175,17 @@ trait EntitySelector $assetsDir = $packageDir . '/assets/'; // Convert filesystem path to URL path relative to PS root - $psRoot = _PS_ROOT_DIR_ . '/'; - $relativePath = str_replace($psRoot, '', $assetsDir); + // Use realpath() on PS root to handle symlinks consistently + $psRoot = realpath(_PS_ROOT_DIR_) . '/'; + $assetsReal = realpath($packageDir . '/assets'); + $relativePath = $assetsReal ? str_replace($psRoot, '', $assetsReal . '/') : null; + + // If symlink resolution caused the path to escape PS root, fall back to module URI + if (!$relativePath || strpos($relativePath, '/') === 0 || strpos($relativePath, '..') !== false) { + // Use module's web-accessible path as base + $modulePath = $this->module->getPathUri(); + return $modulePath . 'vendor/myprestarocks/prestashop-entity-selector/assets/'; + } return __PS_BASE_URI__ . $relativePath; } @@ -275,6 +287,9 @@ trait EntitySelector case 'previewFilterGroupProducts': $this->ajaxPreviewFilterGroupProducts(); return true; + case 'previewFilterValueProducts': + $this->ajaxPreviewFilterValueProducts(); + return true; case 'previewCategoryProducts': $this->ajaxPreviewCategoryProducts(); return true; @@ -837,6 +852,114 @@ trait EntitySelector } } + /** + * AJAX: Preview products for a specific attribute/feature value + * Used by filter chip eye button + */ + protected function ajaxPreviewFilterValueProducts() + { + $valueId = (int) Tools::getValue('value_id'); + $valueType = Tools::getValue('value_type'); // 'attribute' or 'feature' + $groupId = (int) Tools::getValue('group_id'); + $limit = (int) Tools::getValue('limit', 10); + $filter = Tools::getValue('filter', ''); + + if (!$valueId || !in_array($valueType, ['attribute', 'feature'])) { + die(json_encode([ + 'success' => false, + 'error' => 'Invalid parameters' + ])); + } + + $idLang = (int) Context::getContext()->language->id; + $idShop = (int) Context::getContext()->shop->id; + + try { + $db = Db::getInstance(); + + if ($valueType === 'attribute') { + $sql = new DbQuery(); + $sql->select('DISTINCT p.id_product'); + $sql->from('product', 'p'); + $sql->innerJoin('product_shop', 'ps', 'ps.id_product = p.id_product AND ps.id_shop = ' . $idShop); + $sql->innerJoin('product_attribute', 'pa', 'pa.id_product = p.id_product'); + $sql->innerJoin('product_attribute_combination', 'pac', 'pac.id_product_attribute = pa.id_product_attribute'); + $sql->where('pac.id_attribute = ' . $valueId); + $sql->where('ps.active = 1'); + } else { + $sql = new DbQuery(); + $sql->select('DISTINCT p.id_product'); + $sql->from('product', 'p'); + $sql->innerJoin('product_shop', 'ps', 'ps.id_product = p.id_product AND ps.id_shop = ' . $idShop); + $sql->innerJoin('feature_product', 'fp', 'fp.id_product = p.id_product'); + $sql->where('fp.id_feature_value = ' . $valueId); + $sql->where('ps.active = 1'); + } + + $results = $db->executeS($sql); + $productIds = array_column($results, 'id_product'); + + if (!empty($filter) && !empty($productIds)) { + $productIds = $this->getEntityPreviewHandler()->filterProductIdsByQuery($productIds, $filter, $idLang, $idShop); + } + + $totalCount = count($productIds); + $previewIds = array_slice($productIds, 0, $limit); + + $items = []; + if (!empty($previewIds)) { + $productSql = new DbQuery(); + $productSql->select('p.id_product, pl.name, p.reference, i.id_image, m.name as manufacturer'); + $productSql->from('product', 'p'); + $productSql->innerJoin('product_lang', 'pl', 'pl.id_product = p.id_product AND pl.id_lang = ' . $idLang . ' AND pl.id_shop = ' . $idShop); + $productSql->leftJoin('image', 'i', 'i.id_product = p.id_product AND i.cover = 1'); + $productSql->leftJoin('manufacturer', 'm', 'm.id_manufacturer = p.id_manufacturer'); + $productSql->where('p.id_product IN (' . implode(',', array_map('intval', $previewIds)) . ')'); + + $products = $db->executeS($productSql); + + $productsById = []; + foreach ($products as $product) { + $imageUrl = null; + if ($product['id_image']) { + $imageUrl = Context::getContext()->link->getImageLink( + Tools::link_rewrite($product['name']), + $product['id_product'] . '-' . $product['id_image'], + 'small_default' + ); + } + + $productsById[(int) $product['id_product']] = [ + 'id' => (int) $product['id_product'], + 'name' => $product['name'], + 'reference' => $product['reference'], + 'manufacturer' => $product['manufacturer'], + 'image' => $imageUrl + ]; + } + + foreach ($previewIds as $id) { + if (isset($productsById[(int) $id])) { + $items[] = $productsById[(int) $id]; + } + } + } + + die(json_encode([ + 'success' => true, + 'items' => $items, + 'count' => $totalCount, + 'hasMore' => $totalCount > count($items) + ])); + + } catch (\Exception $e) { + die(json_encode([ + 'success' => false, + 'error' => $e->getMessage() + ])); + } + } + /** * AJAX: Preview products in a category * Used by tree view product count click @@ -1279,6 +1402,8 @@ trait EntitySelector // Sorting 'sort_by' => $sortBy, 'sort_dir' => $sortDir, + // Product selection level + 'product_selection_level' => Tools::getValue('product_selection_level', 'product'), ]; // Delegate to EntitySearchEngine @@ -1302,6 +1427,7 @@ trait EntitySelector protected function ajaxGetTargetEntitiesByIds() { $entityType = Tools::getValue('entity_type', ''); + $productSelectionLevel = Tools::getValue('product_selection_level', 'product'); $ids = Tools::getValue('ids', ''); if (is_string($ids)) { $ids = json_decode($ids, true); @@ -1311,7 +1437,7 @@ trait EntitySelector } // Delegate to EntitySearchEngine - $entities = $this->getEntitySearchEngine()->getByIds($entityType, $ids); + $entities = $this->getEntitySearchEngine()->getByIds($entityType, $ids, $productSelectionLevel); $this->ajaxDie(json_encode([ 'success' => true, @@ -1327,7 +1453,7 @@ trait EntitySelector protected function ajaxGetTargetEntitiesByIdsBulk() { $entitiesParam = Tools::getValue('entities', ''); - \PrestaShopLogger::addLog('[EntitySelector] ajaxGetTargetEntitiesByIdsBulk called, raw param: ' . substr($entitiesParam, 0, 500), 1); + $productSelectionLevel = Tools::getValue('product_selection_level', 'product'); if (is_string($entitiesParam)) { $entitiesParam = json_decode($entitiesParam, true); @@ -1336,21 +1462,20 @@ trait EntitySelector $entitiesParam = []; } - \PrestaShopLogger::addLog('[EntitySelector] Parsed entities param: ' . json_encode($entitiesParam), 1); - $result = []; $searchEngine = $this->getEntitySearchEngine(); foreach ($entitiesParam as $entityType => $ids) { if (!is_array($ids) || empty($ids)) { - \PrestaShopLogger::addLog('[EntitySelector] Skipping entityType=' . $entityType . ' - empty or not array', 1); continue; } - // Deduplicate and sanitize IDs - $ids = array_unique(array_map('intval', $ids)); - \PrestaShopLogger::addLog('[EntitySelector] Fetching entityType=' . $entityType . ' ids=' . implode(',', $ids), 1); - $result[$entityType] = $searchEngine->getByIds($entityType, $ids); - \PrestaShopLogger::addLog('[EntitySelector] Got ' . count($result[$entityType]) . ' results for ' . $entityType, 1); + // For combination-level products, keep string IDs (c:32, p:17); otherwise intval + if ($entityType === 'products' && ($productSelectionLevel === 'combination' || $productSelectionLevel === 'both')) { + $ids = array_unique(array_map('strval', $ids)); + } else { + $ids = array_unique(array_map('intval', $ids)); + } + $result[$entityType] = $searchEngine->getByIds($entityType, $ids, $productSelectionLevel); } $this->ajaxDie(json_encode([ diff --git a/src/EntitySelector/EntityPreviewHandler.php b/src/EntitySelector/EntityPreviewHandler.php index 042647e..053f5f3 100644 --- a/src/EntitySelector/EntityPreviewHandler.php +++ b/src/EntitySelector/EntityPreviewHandler.php @@ -305,6 +305,19 @@ class EntityPreviewHandler return []; } + // Detect prefixed IDs (c:32, p:17) — route to combination-aware preview + $hasPrefixed = false; + foreach ($productIds as $id) { + if (is_string($id) && (strpos($id, 'c:') === 0 || strpos($id, 'p:') === 0)) { + $hasPrefixed = true; + break; + } + } + + if ($hasPrefixed) { + return $this->getProductPreviewDataPrefixed($productIds, $idLang, $idShop); + } + $sql = new DbQuery(); $sql->select('p.id_product, pl.name, p.reference, p.price, p.active'); $sql->select('sa.quantity, m.name AS manufacturer_name'); @@ -353,6 +366,130 @@ class EntityPreviewHandler return $ordered; } + /** + * Get preview data for prefixed IDs (c:32, p:17). + * Splits into combination IDs and product IDs, fetches data for each. + * + * @param array $prefixedIds Prefixed string IDs + * @param int $idLang Language ID + * @param int $idShop Shop ID + * @return array Formatted preview items in original order + */ + protected function getProductPreviewDataPrefixed(array $prefixedIds, $idLang, $idShop) + { + $comboIds = []; + $productIds = []; + + foreach ($prefixedIds as $prefixedId) { + $prefixedId = (string) $prefixedId; + if (strpos($prefixedId, 'c:') === 0) { + $comboIds[] = (int) substr($prefixedId, 2); + } elseif (strpos($prefixedId, 'p:') === 0) { + $productIds[] = (int) substr($prefixedId, 2); + } else { + $productIds[] = (int) $prefixedId; + } + } + + $db = Db::getInstance(); + $imageType = $this->getProductImageType(); + $itemsByKey = []; + + // Fetch combination data + if (!empty($comboIds)) { + $sql = 'SELECT pa.id_product_attribute, pa.id_product, pl.name, p.reference AS product_reference, + pa.reference AS combo_reference, p.price, p.active, + IFNULL(sa_c.quantity, 0) AS quantity, + m.name AS manufacturer_name, cl.name AS category_name, + i.id_image, pai.id_image AS combo_id_image, + GROUP_CONCAT(CONCAT(agl.name, \': \', al.name) ORDER BY ag.position ASC SEPARATOR \', \') AS attributes + FROM ' . _DB_PREFIX_ . 'product_attribute pa + INNER JOIN ' . _DB_PREFIX_ . 'product p ON p.id_product = pa.id_product + INNER JOIN ' . _DB_PREFIX_ . 'product_attribute_shop pas ON pas.id_product_attribute = pa.id_product_attribute AND pas.id_shop = ' . (int) $idShop . ' + INNER JOIN ' . _DB_PREFIX_ . 'product_lang pl ON pl.id_product = p.id_product AND pl.id_lang = ' . (int) $idLang . ' AND pl.id_shop = ' . (int) $idShop . ' + INNER JOIN ' . _DB_PREFIX_ . 'product_attribute_combination pac ON pac.id_product_attribute = pa.id_product_attribute + INNER JOIN ' . _DB_PREFIX_ . 'attribute a ON a.id_attribute = pac.id_attribute + INNER JOIN ' . _DB_PREFIX_ . 'attribute_lang al ON al.id_attribute = a.id_attribute AND al.id_lang = ' . (int) $idLang . ' + INNER JOIN ' . _DB_PREFIX_ . 'attribute_group ag ON ag.id_attribute_group = a.id_attribute_group + INNER JOIN ' . _DB_PREFIX_ . 'attribute_group_lang agl ON agl.id_attribute_group = a.id_attribute_group AND agl.id_lang = ' . (int) $idLang . ' + LEFT JOIN ' . _DB_PREFIX_ . 'manufacturer m ON m.id_manufacturer = p.id_manufacturer + LEFT JOIN ' . _DB_PREFIX_ . 'category_lang cl ON cl.id_category = p.id_category_default AND cl.id_lang = ' . (int) $idLang . ' AND cl.id_shop = ' . (int) $idShop . ' + LEFT JOIN ' . _DB_PREFIX_ . 'stock_available sa_c ON sa_c.id_product = pa.id_product AND sa_c.id_product_attribute = pa.id_product_attribute AND sa_c.id_shop = ' . (int) $idShop . ' + LEFT JOIN ' . _DB_PREFIX_ . 'image i ON i.id_product = p.id_product AND i.cover = 1 + LEFT JOIN ' . _DB_PREFIX_ . 'product_attribute_image pai ON pai.id_product_attribute = pa.id_product_attribute + WHERE pa.id_product_attribute IN (' . implode(',', array_map('intval', $comboIds)) . ') + GROUP BY pa.id_product_attribute'; + + $rows = $db->executeS($sql); + if ($rows) { + foreach ($rows as $row) { + $key = 'c:' . (int) $row['id_product_attribute']; + $imageId = !empty($row['combo_id_image']) ? $row['combo_id_image'] : ($row['id_image'] ?? null); + $ref = $row['combo_reference'] ?: $row['product_reference']; + + $itemsByKey[$key] = [ + 'id' => $key, + 'name' => $row['name'] . ', ' . $row['attributes'], + 'reference' => $ref, + 'price' => (float) $row['price'], + 'quantity' => (int) $row['quantity'], + 'active' => (bool) $row['active'], + 'manufacturer' => $row['manufacturer_name'], + 'category' => $row['category_name'], + 'image' => $imageId ? $this->getProductImageUrl($row['id_product'], $imageId, $imageType) : null, + 'attributes' => $row['attributes'], + 'isCombination' => true, + ]; + } + } + } + + // Fetch plain product data + if (!empty($productIds)) { + $sql = new DbQuery(); + $sql->select('p.id_product, pl.name, p.reference, p.price, p.active'); + $sql->select('sa.quantity, m.name AS manufacturer_name'); + $sql->select('cl.name AS category_name, i.id_image'); + $sql->from('product', 'p'); + $sql->innerJoin('product_shop', 'ps', 'ps.id_product = p.id_product AND ps.id_shop = ' . (int) $idShop); + $sql->leftJoin('product_lang', 'pl', 'pl.id_product = p.id_product AND pl.id_lang = ' . (int) $idLang . ' AND pl.id_shop = ' . (int) $idShop); + $sql->leftJoin('manufacturer', 'm', 'm.id_manufacturer = p.id_manufacturer'); + $sql->leftJoin('category_lang', 'cl', 'cl.id_category = p.id_category_default AND cl.id_lang = ' . (int) $idLang . ' AND cl.id_shop = ' . (int) $idShop); + $sql->leftJoin('stock_available', 'sa', 'sa.id_product = p.id_product AND sa.id_product_attribute = 0 AND sa.id_shop = ' . (int) $idShop); + $sql->leftJoin('image', 'i', 'i.id_product = p.id_product AND i.cover = 1'); + $sql->where('p.id_product IN (' . implode(',', array_map('intval', $productIds)) . ')'); + + $rows = $db->executeS($sql); + if ($rows) { + foreach ($rows as $row) { + $key = 'p:' . (int) $row['id_product']; + $itemsByKey[$key] = [ + 'id' => $key, + 'name' => $row['name'], + 'reference' => $row['reference'], + 'price' => (float) $row['price'], + 'quantity' => (int) $row['quantity'], + 'active' => (bool) $row['active'], + 'manufacturer' => $row['manufacturer_name'], + 'category' => $row['category_name'], + 'image' => $row['id_image'] ? $this->getProductImageUrl($row['id_product'], $row['id_image'], $imageType) : null, + ]; + } + } + } + + // Return in original order + $ordered = []; + foreach ($prefixedIds as $id) { + $key = (string) $id; + if (isset($itemsByKey[$key])) { + $ordered[] = $itemsByKey[$key]; + } + } + + return $ordered; + } + /** * Get product image type for thumbnails * diff --git a/src/EntitySelector/EntitySearchEngine.php b/src/EntitySelector/EntitySearchEngine.php index 676f3a6..6dc0ac0 100644 --- a/src/EntitySelector/EntitySearchEngine.php +++ b/src/EntitySelector/EntitySearchEngine.php @@ -58,6 +58,12 @@ class EntitySearchEngine */ public function search($entityType, $query, $limit = 20, $offset = 0, array $filters = []) { + // product_selection_level: route product searches to combination methods + $psl = $filters['product_selection_level'] ?? 'product'; + if ($entityType === 'products' && ($psl === 'combination' || $psl === 'both')) { + return $this->searchProductCombinations($query, $this->idLang, $this->idShop, $limit, $offset, $filters); + } + $method = 'searchTarget' . $this->camelCase($entityType); if (method_exists($this, $method)) { @@ -77,6 +83,11 @@ class EntitySearchEngine */ public function count($entityType, $query, array $filters = []) { + $psl = $filters['product_selection_level'] ?? 'product'; + if ($entityType === 'products' && ($psl === 'combination' || $psl === 'both')) { + return $this->countProductCombinations($query, $this->idLang, $this->idShop, $filters); + } + $method = 'countTarget' . $this->camelCase($entityType); if (method_exists($this, $method)) { @@ -93,8 +104,13 @@ class EntitySearchEngine * @param array $ids Entity IDs * @return array Entities data */ - public function getByIds($entityType, array $ids) + public function getByIds($entityType, array $ids, $productSelectionLevel = 'product') { + // If product type with combination-level IDs (prefixed strings), use combination handler + if ($entityType === 'products' && ($productSelectionLevel === 'combination' || $productSelectionLevel === 'both')) { + return $this->getProductCombinationsByIds($ids, $this->idLang, $this->idShop); + } + $method = 'getTarget' . $this->camelCase($entityType) . 'ByIds'; if (method_exists($this, $method)) { @@ -414,6 +430,492 @@ class EntitySearchEngine return $ordered; } + // ========================================================================= + // PRODUCT COMBINATIONS (product_selection_level = combination) + // ========================================================================= + + /** + * Search products at combination level. + * Products WITH combinations return one result per combination (id = "c:{id_product_attribute}"). + * Simple products (no combinations) return with id = "p:{id_product}". + * + * @param string $query Search query + * @param int $idLang Language ID + * @param int $idShop Shop ID + * @param int $limit Results limit + * @param int $offset Results offset + * @param array $filters Additional filters + * @return array Search results + */ + public function searchProductCombinations($query, $idLang, $idShop, $limit = 20, $offset = 0, array $filters = []) + { + $db = Db::getInstance(); + $escapedQuery = !empty($query) ? $this->escapePattern($query) : ''; + + // Step 1: Find matching products (same query as searchTargetProducts but no limit — we paginate the flat result) + $sqlProducts = new DbQuery(); + $sqlProducts->select('DISTINCT p.id_product, pl.name, p.reference, ps.price AS base_price, ps.active, + m.name AS manufacturer_name, cl.name AS category_name, i.id_image, + IFNULL(sa.quantity, 0) AS stock_qty'); + // Sales + $sqlProducts->select('(SELECT COALESCE(SUM(od.product_quantity), 0) FROM ' . _DB_PREFIX_ . 'order_detail od + INNER JOIN ' . _DB_PREFIX_ . 'orders o ON o.id_order = od.id_order + WHERE od.product_id = p.id_product AND o.valid = 1) AS sales_qty'); + $sqlProducts->from('product', 'p'); + $sqlProducts->innerJoin('product_shop', 'ps', 'ps.id_product = p.id_product AND ps.id_shop = ' . (int) $idShop); + $sqlProducts->leftJoin('product_lang', 'pl', 'pl.id_product = p.id_product AND pl.id_lang = ' . (int) $idLang . ' AND pl.id_shop = ' . (int) $idShop); + $sqlProducts->leftJoin('manufacturer', 'm', 'm.id_manufacturer = p.id_manufacturer'); + $sqlProducts->leftJoin('category_lang', 'cl', 'cl.id_category = p.id_category_default AND cl.id_lang = ' . (int) $idLang . ' AND cl.id_shop = ' . (int) $idShop); + $sqlProducts->leftJoin('stock_available', 'sa', 'sa.id_product = p.id_product AND sa.id_product_attribute = 0 AND sa.id_shop = ' . (int) $idShop); + $sqlProducts->leftJoin('image', 'i', 'i.id_product = p.id_product AND i.cover = 1'); + + if (!empty($escapedQuery)) { + $sqlProducts->where('(pl.name LIKE \'%' . $escapedQuery . '%\' OR p.reference LIKE \'%' . $escapedQuery . '%\' OR p.id_product = ' . (int) $query . ')'); + } + + $this->applyProductFilters($sqlProducts, $filters, $idLang, $idShop); + $sqlProducts->orderBy('pl.name ASC'); + + $matchingProducts = $db->executeS($sqlProducts); + if (!$matchingProducts) { + return []; + } + + $productIds = array_column($matchingProducts, 'id_product'); + $productMap = []; + foreach ($matchingProducts as $p) { + $productMap[(int) $p['id_product']] = $p; + } + + // Step 2: Get all combinations with stock, image, attributes + $sqlCombos = 'SELECT pa.id_product_attribute, pa.id_product, pa.reference AS combo_reference, + pas.price AS combo_price_impact, + IFNULL(sa_c.quantity, 0) AS combo_stock, + pai.id_image AS combo_id_image, + GROUP_CONCAT(CONCAT(agl.name, \': \', al.name) ORDER BY ag.position ASC SEPARATOR \', \') AS attributes + FROM ' . _DB_PREFIX_ . 'product_attribute pa + INNER JOIN ' . _DB_PREFIX_ . 'product_attribute_shop pas ON pas.id_product_attribute = pa.id_product_attribute AND pas.id_shop = ' . (int) $idShop . ' + INNER JOIN ' . _DB_PREFIX_ . 'product_attribute_combination pac ON pac.id_product_attribute = pa.id_product_attribute + INNER JOIN ' . _DB_PREFIX_ . 'attribute a ON a.id_attribute = pac.id_attribute + INNER JOIN ' . _DB_PREFIX_ . 'attribute_lang al ON al.id_attribute = a.id_attribute AND al.id_lang = ' . (int) $idLang . ' + INNER JOIN ' . _DB_PREFIX_ . 'attribute_group ag ON ag.id_attribute_group = a.id_attribute_group + INNER JOIN ' . _DB_PREFIX_ . 'attribute_group_lang agl ON agl.id_attribute_group = a.id_attribute_group AND agl.id_lang = ' . (int) $idLang . ' + LEFT JOIN ' . _DB_PREFIX_ . 'stock_available sa_c ON sa_c.id_product = pa.id_product AND sa_c.id_product_attribute = pa.id_product_attribute AND sa_c.id_shop = ' . (int) $idShop . ' + LEFT JOIN ' . _DB_PREFIX_ . 'product_attribute_image pai ON pai.id_product_attribute = pa.id_product_attribute + WHERE pa.id_product IN (' . implode(',', array_map('intval', $productIds)) . ')'; + + // Filter combinations by selected attribute values + $comboAttrIds = $this->extractAttributeFilterIds($filters); + if (!empty($comboAttrIds)) { + $sqlCombos .= ' AND EXISTS ( + SELECT 1 FROM ' . _DB_PREFIX_ . 'product_attribute_combination pac_f + WHERE pac_f.id_product_attribute = pa.id_product_attribute + AND pac_f.id_attribute IN (' . implode(',', $comboAttrIds) . ') + )'; + } + + $sqlCombos .= ' GROUP BY pa.id_product_attribute + ORDER BY pa.id_product, pa.id_product_attribute'; + + $combinations = $db->executeS($sqlCombos); + + // Group combinations by product + $combosByProduct = []; + if ($combinations) { + foreach ($combinations as $combo) { + $combosByProduct[(int) $combo['id_product']][] = $combo; + } + } + + // Step 3: Build flat result list with full product data + $imageType = $this->getProductImageType(); + $context = Context::getContext(); + $locale = $context->getCurrentLocale(); + $currency = $context->currency; + $isBothMode = ($filters['product_selection_level'] ?? 'combination') === 'both'; + + $allResults = []; + foreach ($productIds as $idProduct) { + $idProduct = (int) $idProduct; + $product = $productMap[$idProduct]; + + if (!empty($combosByProduct[$idProduct])) { + // In 'both' mode, add the base product entry first + if ($isBothMode) { + $basePrice = (float) ($product['base_price'] ?? 0); + $stockQty = (int) ($product['stock_qty'] ?? 0); + $regularPriceFormatted = $locale->formatPrice($basePrice, $currency->iso_code); + $finalPrice = \Product::getPriceStatic($idProduct, true, null, 2, null, false, true, 1, false, null, null, null, $dummyNull, true, true, $context); + $finalPriceFormatted = $locale->formatPrice($finalPrice, $currency->iso_code); + $hasDiscount = ($basePrice > 0 && $finalPrice < $basePrice); + $stockStatus = $stockQty <= 0 ? 'out_of_stock' : ($stockQty <= 5 ? 'low_stock' : 'in_stock'); + + $allResults[] = [ + 'id' => 'p:' . $idProduct, + 'type' => 'product', + 'name' => $product['name'], + 'subtitle' => $product['reference'] ? 'Ref: ' . $product['reference'] : null, + 'reference' => $product['reference'], + 'is_combination' => false, + 'is_parent' => true, + 'combination_count' => count($combosByProduct[$idProduct]), + 'id_product' => $idProduct, + 'active' => (bool) $product['active'], + 'manufacturer' => $product['manufacturer_name'], + 'category' => $product['category_name'], + 'image' => $product['id_image'] ? $this->getProductImageUrl($idProduct, $product['id_image'], $imageType) : null, + 'regular_price_formatted' => $regularPriceFormatted, + 'price_formatted' => $finalPriceFormatted, + 'has_discount' => $hasDiscount, + 'stock_qty' => $stockQty, + 'stock_status' => $stockStatus, + 'sales_qty' => (int) ($product['sales_qty'] ?? 0), + ]; + } + + // Product HAS combinations — one entry per combination + foreach ($combosByProduct[$idProduct] as $combo) { + $idPA = (int) $combo['id_product_attribute']; + $comboStock = (int) $combo['combo_stock']; + + // Price: use Product::getPrice with combination ID for accurate price + $comboPrice = \Product::getPriceStatic($idProduct, true, $idPA, 2, null, false, true, 1, false, null, null, null, $dummyNull, true, true, $context); + $comboPriceFormatted = $locale->formatPrice($comboPrice, $currency->iso_code); + + // Regular price (without reduction) + $comboRegularPrice = \Product::getPriceStatic($idProduct, true, $idPA, 2, null, false, false, 1, false, null, null, null, $dummyNull, true, true, $context); + $comboRegularPriceFormatted = $locale->formatPrice($comboRegularPrice, $currency->iso_code); + + $hasDiscount = ($comboRegularPrice > $comboPrice); + + // Image: combination image if exists, otherwise product cover + $imageId = !empty($combo['combo_id_image']) ? $combo['combo_id_image'] : ($product['id_image'] ?? null); + + // Stock status + $stockStatus = 'in_stock'; + if ($comboStock <= 0) { + $stockStatus = 'out_of_stock'; + } elseif ($comboStock <= 5) { + $stockStatus = 'low_stock'; + } + + // Name includes attributes: "Product name, Attr1: Val1, Attr2: Val2" + $fullName = $product['name'] . ', ' . $combo['attributes']; + $ref = $combo['combo_reference'] ?: $product['reference']; + + $allResults[] = [ + 'id' => 'c:' . $idPA, + 'type' => 'product', + 'name' => $fullName, + 'subtitle' => $ref ? 'Ref: ' . $ref : null, + 'reference' => $ref, + 'attributes' => $combo['attributes'], + 'is_combination' => true, + 'id_product' => $idProduct, + 'id_product_attribute' => $idPA, + 'active' => (bool) $product['active'], + 'manufacturer' => $product['manufacturer_name'], + 'category' => $product['category_name'], + 'image' => $imageId ? $this->getProductImageUrl($idProduct, $imageId, $imageType) : null, + 'regular_price_formatted' => $comboRegularPriceFormatted, + 'price_formatted' => $comboPriceFormatted, + 'has_discount' => $hasDiscount, + 'stock_qty' => $comboStock, + 'stock_status' => $stockStatus, + 'sales_qty' => (int) ($product['sales_qty'] ?? 0), + ]; + } + } else { + // Simple product — no combinations + // Skip simple products when attribute filter is active (they can't match) + if (!empty($comboAttrIds)) { + continue; + } + $basePrice = (float) ($product['base_price'] ?? 0); + $stockQty = (int) ($product['stock_qty'] ?? 0); + $salesQty = (int) ($product['sales_qty'] ?? 0); + + $regularPriceFormatted = $locale->formatPrice($basePrice, $currency->iso_code); + $finalPrice = \Product::getPriceStatic($idProduct, true, null, 2, null, false, true, 1, false, null, null, null, $dummyNull, true, true, $context); + $finalPriceFormatted = $locale->formatPrice($finalPrice, $currency->iso_code); + $hasDiscount = ($basePrice > 0 && $finalPrice < $basePrice); + + $stockStatus = 'in_stock'; + if ($stockQty <= 0) { + $stockStatus = 'out_of_stock'; + } elseif ($stockQty <= 5) { + $stockStatus = 'low_stock'; + } + + $allResults[] = [ + 'id' => 'p:' . $idProduct, + 'type' => 'product', + 'name' => $product['name'], + 'subtitle' => $product['reference'] ? 'Ref: ' . $product['reference'] : null, + 'reference' => $product['reference'], + 'is_combination' => false, + 'id_product' => $idProduct, + 'active' => (bool) $product['active'], + 'manufacturer' => $product['manufacturer_name'], + 'category' => $product['category_name'], + 'image' => $product['id_image'] ? $this->getProductImageUrl($idProduct, $product['id_image'], $imageType) : null, + 'regular_price_formatted' => $regularPriceFormatted, + 'price_formatted' => $finalPriceFormatted, + 'has_discount' => $hasDiscount, + 'stock_qty' => $stockQty, + 'stock_status' => $stockStatus, + 'sales_qty' => $salesQty, + ]; + } + } + + // Apply offset/limit to the flat list + return array_slice($allResults, (int) $offset, (int) $limit); + } + + /** + * Count products at combination level. + * Each combination counts as 1. Simple products count as 1. + * + * @param string $query Search query + * @param int $idLang Language ID + * @param int $idShop Shop ID + * @param array $filters Additional filters + * @return int Total count + */ + public function countProductCombinations($query, $idLang, $idShop, array $filters = []) + { + $db = Db::getInstance(); + $escapedQuery = !empty($query) ? $this->escapePattern($query) : ''; + + // Get matching product IDs + $sqlProducts = new DbQuery(); + $sqlProducts->select('DISTINCT p.id_product'); + $sqlProducts->from('product', 'p'); + $sqlProducts->innerJoin('product_shop', 'ps', 'ps.id_product = p.id_product AND ps.id_shop = ' . (int) $idShop); + $sqlProducts->leftJoin('product_lang', 'pl', 'pl.id_product = p.id_product AND pl.id_lang = ' . (int) $idLang . ' AND pl.id_shop = ' . (int) $idShop); + + if (!empty($escapedQuery)) { + $sqlProducts->where('(pl.name LIKE \'%' . $escapedQuery . '%\' OR p.reference LIKE \'%' . $escapedQuery . '%\' OR p.id_product = ' . (int) $query . ')'); + } + + $this->applyProductFilters($sqlProducts, $filters, $idLang, $idShop); + + $matchingProducts = $db->executeS($sqlProducts); + if (!$matchingProducts) { + return 0; + } + + $productIds = array_column($matchingProducts, 'id_product'); + + // Count combinations for these products + $sqlComboCount = 'SELECT COUNT(*) FROM ' . _DB_PREFIX_ . 'product_attribute pa + INNER JOIN ' . _DB_PREFIX_ . 'product_attribute_shop pas ON pas.id_product_attribute = pa.id_product_attribute AND pas.id_shop = ' . (int) $idShop . ' + WHERE pa.id_product IN (' . implode(',', array_map('intval', $productIds)) . ')'; + + // Filter combination count by selected attribute values + $comboAttrIds = $this->extractAttributeFilterIds($filters); + if (!empty($comboAttrIds)) { + $sqlComboCount .= ' AND EXISTS ( + SELECT 1 FROM ' . _DB_PREFIX_ . 'product_attribute_combination pac_f + WHERE pac_f.id_product_attribute = pa.id_product_attribute + AND pac_f.id_attribute IN (' . implode(',', $comboAttrIds) . ') + )'; + } + + $comboCount = (int) $db->getValue($sqlComboCount); + + // Count simple products (those with no combinations) + // Simple products only included when no attribute filter is active + // (simple products have no combinations, so they can't match attribute filters) + $simpleCount = 0; + if (empty($comboAttrIds)) { + $sqlSimpleCount = 'SELECT COUNT(*) FROM (' . $sqlProducts->build() . ') AS matched_products + WHERE matched_products.id_product NOT IN ( + SELECT DISTINCT pa2.id_product FROM ' . _DB_PREFIX_ . 'product_attribute pa2 + INNER JOIN ' . _DB_PREFIX_ . 'product_attribute_shop pas2 ON pas2.id_product_attribute = pa2.id_product_attribute AND pas2.id_shop = ' . (int) $idShop . ' + )'; + $simpleCount = (int) $db->getValue($sqlSimpleCount); + } + + // In 'both' mode, also count parent products (products that have combinations) + $isBothMode = ($filters['product_selection_level'] ?? 'combination') === 'both'; + $parentCount = 0; + if ($isBothMode) { + $sqlParentCount = 'SELECT COUNT(DISTINCT pa3.id_product) FROM ' . _DB_PREFIX_ . 'product_attribute pa3 + INNER JOIN ' . _DB_PREFIX_ . 'product_attribute_shop pas3 ON pas3.id_product_attribute = pa3.id_product_attribute AND pas3.id_shop = ' . (int) $idShop . ' + WHERE pa3.id_product IN (' . implode(',', array_map('intval', $productIds)) . ')'; + $parentCount = (int) $db->getValue($sqlParentCount); + } + + return $comboCount + $simpleCount + $parentCount; + } + + /** + * Get product combinations by prefixed IDs. + * Handles "c:{id_product_attribute}" and "p:{id_product}" formats. + * + * @param array $ids Prefixed string IDs + * @param int $idLang Language ID + * @param int $idShop Shop ID + * @return array Entities data + */ + public function getProductCombinationsByIds(array $ids, $idLang, $idShop = null) + { + if (empty($ids)) { + return []; + } + + $idShop = $idShop ?: $this->idShop; + $db = Db::getInstance(); + + // Parse prefixed IDs + $comboIds = []; + $productIds = []; + foreach ($ids as $prefixedId) { + $prefixedId = (string) $prefixedId; + if (strpos($prefixedId, 'c:') === 0) { + $comboIds[] = (int) substr($prefixedId, 2); + } elseif (strpos($prefixedId, 'p:') === 0) { + $productIds[] = (int) substr($prefixedId, 2); + } else { + // Fallback: treat as product ID + $productIds[] = (int) $prefixedId; + } + } + + $imageType = $this->getProductImageType(); + $context = Context::getContext(); + $locale = $context->getCurrentLocale(); + $currency = $context->currency; + + $results = []; + + // Fetch combinations with full data + if (!empty($comboIds)) { + $sqlCombos = 'SELECT pa.id_product_attribute, pa.id_product, pa.reference AS combo_reference, + pl.name, p.reference AS product_reference, i.id_image, + IFNULL(sa_c.quantity, 0) AS combo_stock, + pai.id_image AS combo_id_image, + GROUP_CONCAT(CONCAT(agl.name, \': \', al.name) ORDER BY ag.position ASC SEPARATOR \', \') AS attributes + FROM ' . _DB_PREFIX_ . 'product_attribute pa + INNER JOIN ' . _DB_PREFIX_ . 'product p ON p.id_product = pa.id_product + INNER JOIN ' . _DB_PREFIX_ . 'product_attribute_shop pas ON pas.id_product_attribute = pa.id_product_attribute AND pas.id_shop = ' . (int) $idShop . ' + INNER JOIN ' . _DB_PREFIX_ . 'product_lang pl ON pl.id_product = p.id_product AND pl.id_lang = ' . (int) $idLang . ' AND pl.id_shop = ' . (int) $idShop . ' + INNER JOIN ' . _DB_PREFIX_ . 'product_attribute_combination pac ON pac.id_product_attribute = pa.id_product_attribute + INNER JOIN ' . _DB_PREFIX_ . 'attribute a ON a.id_attribute = pac.id_attribute + INNER JOIN ' . _DB_PREFIX_ . 'attribute_lang al ON al.id_attribute = a.id_attribute AND al.id_lang = ' . (int) $idLang . ' + INNER JOIN ' . _DB_PREFIX_ . 'attribute_group ag ON ag.id_attribute_group = a.id_attribute_group + INNER JOIN ' . _DB_PREFIX_ . 'attribute_group_lang agl ON agl.id_attribute_group = a.id_attribute_group AND agl.id_lang = ' . (int) $idLang . ' + LEFT JOIN ' . _DB_PREFIX_ . 'stock_available sa_c ON sa_c.id_product = pa.id_product AND sa_c.id_product_attribute = pa.id_product_attribute AND sa_c.id_shop = ' . (int) $idShop . ' + LEFT JOIN ' . _DB_PREFIX_ . 'product_attribute_image pai ON pai.id_product_attribute = pa.id_product_attribute + LEFT JOIN ' . _DB_PREFIX_ . 'image i ON i.id_product = p.id_product AND i.cover = 1 + WHERE pa.id_product_attribute IN (' . implode(',', array_map('intval', $comboIds)) . ') + GROUP BY pa.id_product_attribute'; + + $comboRows = $db->executeS($sqlCombos); + if ($comboRows) { + foreach ($comboRows as $row) { + $idPA = (int) $row['id_product_attribute']; + $idProduct = (int) $row['id_product']; + $key = 'c:' . $idPA; + + // Price + $comboPrice = \Product::getPriceStatic($idProduct, true, $idPA, 2, null, false, true, 1, false, null, null, null, $dummyNull, true, true, $context); + $comboRegularPrice = \Product::getPriceStatic($idProduct, true, $idPA, 2, null, false, false, 1, false, null, null, null, $dummyNull, true, true, $context); + $hasDiscount = ($comboRegularPrice > $comboPrice); + + // Image: combination image if exists, otherwise product cover + $imageId = !empty($row['combo_id_image']) ? $row['combo_id_image'] : ($row['id_image'] ?? null); + + // Stock + $comboStock = (int) $row['combo_stock']; + $stockStatus = $comboStock <= 0 ? 'out_of_stock' : ($comboStock <= 5 ? 'low_stock' : 'in_stock'); + + $ref = $row['combo_reference'] ?: $row['product_reference']; + + $results[$key] = [ + 'id' => $key, + 'type' => 'product', + 'name' => $row['name'] . ', ' . $row['attributes'], + 'subtitle' => $ref ? 'Ref: ' . $ref : null, + 'reference' => $ref, + 'attributes' => $row['attributes'], + 'is_combination' => true, + 'id_product' => $idProduct, + 'id_product_attribute' => $idPA, + 'image' => $imageId ? $this->getProductImageUrl($idProduct, $imageId, $imageType) : null, + 'regular_price_formatted' => $locale->formatPrice($comboRegularPrice, $currency->iso_code), + 'price_formatted' => $locale->formatPrice($comboPrice, $currency->iso_code), + 'has_discount' => $hasDiscount, + 'stock_qty' => $comboStock, + 'stock_status' => $stockStatus, + ]; + } + } + } + + // Fetch simple products with full data + if (!empty($productIds)) { + $sqlProducts = new DbQuery(); + $sqlProducts->select('p.id_product, pl.name, p.reference, ps.price AS base_price, + IFNULL(sa.quantity, 0) AS stock_qty, i.id_image'); + $sqlProducts->from('product', 'p'); + $sqlProducts->innerJoin('product_shop', 'ps', 'ps.id_product = p.id_product AND ps.id_shop = ' . (int) $idShop); + $sqlProducts->leftJoin('product_lang', 'pl', 'pl.id_product = p.id_product AND pl.id_lang = ' . (int) $idLang . ' AND pl.id_shop = ' . (int) $idShop); + $sqlProducts->leftJoin('stock_available', 'sa', 'sa.id_product = p.id_product AND sa.id_product_attribute = 0 AND sa.id_shop = ' . (int) $idShop); + $sqlProducts->leftJoin('image', 'i', 'i.id_product = p.id_product AND i.cover = 1'); + $sqlProducts->where('p.id_product IN (' . implode(',', array_map('intval', $productIds)) . ')'); + + $productRows = $db->executeS($sqlProducts); + if ($productRows) { + foreach ($productRows as $row) { + $idProduct = (int) $row['id_product']; + $key = 'p:' . $idProduct; + $stockQty = (int) $row['stock_qty']; + + $finalPrice = \Product::getPriceStatic($idProduct, true, null, 2, null, false, true, 1, false, null, null, null, $dummyNull, true, true, $context); + $regularPrice = (float) $row['base_price']; + $hasDiscount = ($regularPrice > 0 && $finalPrice < $regularPrice); + + $stockStatus = $stockQty <= 0 ? 'out_of_stock' : ($stockQty <= 5 ? 'low_stock' : 'in_stock'); + + $results[$key] = [ + 'id' => $key, + 'type' => 'product', + 'name' => $row['name'], + 'subtitle' => $row['reference'] ? 'Ref: ' . $row['reference'] : null, + 'reference' => $row['reference'], + 'is_combination' => false, + 'id_product' => $idProduct, + 'image' => $row['id_image'] ? $this->getProductImageUrl($idProduct, $row['id_image'], $imageType) : null, + 'regular_price_formatted' => $locale->formatPrice($regularPrice, $currency->iso_code), + 'price_formatted' => $locale->formatPrice($finalPrice, $currency->iso_code), + 'has_discount' => $hasDiscount, + 'stock_qty' => $stockQty, + 'stock_status' => $stockStatus, + ]; + } + } + } + + // Return in original order + $ordered = []; + foreach ($ids as $originalId) { + $key = (string) $originalId; + if (isset($results[$key])) { + $ordered[] = $results[$key]; + } elseif (isset($results['p:' . $key])) { + // Plain integer ID → stored as "p:{id}" (simple product fallback) + $ordered[] = $results['p:' . $key]; + } elseif (isset($results['c:' . $key])) { + $ordered[] = $results['c:' . $key]; + } + } + + return $ordered; + } + /** * Apply product-specific filters to query * @@ -451,23 +953,40 @@ class EntitySearchEngine $sql->where('ps.active = 1'); } - // Attribute filter + // Attribute filter — supports flat array [id1, id2] or grouped [{id_attribute_group, values}] if (!empty($filters['attributes'])) { - foreach ($filters['attributes'] as $attrFilter) { - if (!empty($attrFilter['values'])) { - $attrIds = array_map('intval', $attrFilter['values']); - $sql->innerJoin('product_attribute_combination', 'pac_' . (int) $attrFilter['id_attribute_group'], 'pac_' . (int) $attrFilter['id_attribute_group'] . '.id_attribute IN (' . implode(',', $attrIds) . ')'); - $sql->innerJoin('product_attribute', 'pa_' . (int) $attrFilter['id_attribute_group'], 'pa_' . (int) $attrFilter['id_attribute_group'] . '.id_product_attribute = pac_' . (int) $attrFilter['id_attribute_group'] . '.id_product_attribute AND pa_' . (int) $attrFilter['id_attribute_group'] . '.id_product = p.id_product'); + $first = reset($filters['attributes']); + if (is_numeric($first)) { + // Flat array of attribute value IDs (from filter chips) + $attrIds = array_map('intval', $filters['attributes']); + $sql->innerJoin('product_attribute_combination', 'pac_filter', 'pac_filter.id_attribute IN (' . implode(',', $attrIds) . ')'); + $sql->innerJoin('product_attribute', 'pa_filter', 'pa_filter.id_product_attribute = pac_filter.id_product_attribute AND pa_filter.id_product = p.id_product'); + } else { + // Grouped format: [{id_attribute_group: X, values: [1,2,3]}, ...] + foreach ($filters['attributes'] as $attrFilter) { + if (!empty($attrFilter['values'])) { + $attrIds = array_map('intval', $attrFilter['values']); + $sql->innerJoin('product_attribute_combination', 'pac_' . (int) $attrFilter['id_attribute_group'], 'pac_' . (int) $attrFilter['id_attribute_group'] . '.id_attribute IN (' . implode(',', $attrIds) . ')'); + $sql->innerJoin('product_attribute', 'pa_' . (int) $attrFilter['id_attribute_group'], 'pa_' . (int) $attrFilter['id_attribute_group'] . '.id_product_attribute = pac_' . (int) $attrFilter['id_attribute_group'] . '.id_product_attribute AND pa_' . (int) $attrFilter['id_attribute_group'] . '.id_product = p.id_product'); + } } } } - // Feature filter + // Feature filter — supports flat array [id1, id2] or grouped [{id_feature, values}] if (!empty($filters['features'])) { - foreach ($filters['features'] as $featFilter) { - if (!empty($featFilter['values'])) { - $featIds = array_map('intval', $featFilter['values']); - $sql->innerJoin('feature_product', 'fp_' . (int) $featFilter['id_feature'], 'fp_' . (int) $featFilter['id_feature'] . '.id_product = p.id_product AND fp_' . (int) $featFilter['id_feature'] . '.id_feature_value IN (' . implode(',', $featIds) . ')'); + $first = reset($filters['features']); + if (is_numeric($first)) { + // Flat array of feature value IDs (from filter chips) + $featIds = array_map('intval', $filters['features']); + $sql->innerJoin('feature_product', 'fp_filter', 'fp_filter.id_product = p.id_product AND fp_filter.id_feature_value IN (' . implode(',', $featIds) . ')'); + } else { + // Grouped format: [{id_feature: X, values: [1,2,3]}, ...] + foreach ($filters['features'] as $featFilter) { + if (!empty($featFilter['values'])) { + $featIds = array_map('intval', $featFilter['values']); + $sql->innerJoin('feature_product', 'fp_' . (int) $featFilter['id_feature'], 'fp_' . (int) $featFilter['id_feature'] . '.id_product = p.id_product AND fp_' . (int) $featFilter['id_feature'] . '.id_feature_value IN (' . implode(',', $featIds) . ')'); + } } } } @@ -481,6 +1000,33 @@ class EntitySearchEngine } } + /** + * Extract flat array of attribute value IDs from filters. + * Handles both flat [id1, id2] and grouped [{id_attribute_group, values}] formats. + * + * @param array $filters + * @return array Integer attribute IDs + */ + protected function extractAttributeFilterIds(array $filters) + { + if (empty($filters['attributes'])) { + return []; + } + + $first = reset($filters['attributes']); + if (is_numeric($first)) { + return array_map('intval', $filters['attributes']); + } + + $ids = []; + foreach ($filters['attributes'] as $attrFilter) { + if (!empty($attrFilter['values'])) { + $ids = array_merge($ids, array_map('intval', $attrFilter['values'])); + } + } + return $ids; + } + /** * Get product image type for thumbnails * @@ -3469,6 +4015,130 @@ class EntitySearchEngine return $ordered; } + // ========================================================================= + // MPR MATERIALS (module-specific entity type) + // ========================================================================= + + /** + * Search materials + */ + public function searchTargetMprMaterials($query, $idLang, $idShop, $limit = 20, $offset = 0, array $filters = []) + { + $db = Db::getInstance(); + $escapedQuery = $this->escapePattern($query); + + $sql = new DbQuery(); + $sql->select('m.id_material, m.reference, m.unit, m.unit_cost, m.active, + ml.name, ml.description, + IFNULL(SUM(ms.quantity), 0) AS stock_qty'); + $sql->from('mprwarehouserevolution_material', 'm'); + $sql->leftJoin('mprwarehouserevolution_material_lang', 'ml', 'ml.id_material = m.id_material AND ml.id_lang = ' . (int) $idLang); + $sql->leftJoin('mprwarehouserevolution_material_stock', 'ms', 'ms.id_material = m.id_material'); + + if ($query !== '') { + $sql->where('(ml.name LIKE \'%' . $escapedQuery . '%\' OR m.reference LIKE \'%' . $escapedQuery . '%\' OR m.barcode LIKE \'%' . $escapedQuery . '%\')'); + } + + $sql->groupBy('m.id_material'); + $sql->orderBy('ml.name ASC'); + $sql->limit($limit, $offset); + + $rows = $db->executeS($sql); + if (!$rows) { + return []; + } + + $results = []; + foreach ($rows as $row) { + $stockQty = (int) $row['stock_qty']; + $stockStatus = $stockQty <= 0 ? 'out_of_stock' : ($stockQty <= (int) ($row['min_stock'] ?? 5) ? 'low_stock' : 'in_stock'); + + $results[] = [ + 'id' => (int) $row['id_material'], + 'type' => 'mpr_material', + 'name' => $row['name'], + 'subtitle' => $row['reference'] ? 'Ref: ' . $row['reference'] : null, + 'reference' => $row['reference'], + 'stock_qty' => $stockQty, + 'stock_status' => $stockStatus, + 'active' => (bool) $row['active'], + ]; + } + + return $results; + } + + /** + * Count materials matching query + */ + public function countTargetMprMaterials($query, $idLang, $idShop, array $filters = []) + { + $escapedQuery = $this->escapePattern($query); + + $sql = new DbQuery(); + $sql->select('COUNT(DISTINCT m.id_material)'); + $sql->from('mprwarehouserevolution_material', 'm'); + $sql->leftJoin('mprwarehouserevolution_material_lang', 'ml', 'ml.id_material = m.id_material AND ml.id_lang = ' . (int) $idLang); + + if ($query !== '') { + $sql->where('(ml.name LIKE \'%' . $escapedQuery . '%\' OR m.reference LIKE \'%' . $escapedQuery . '%\' OR m.barcode LIKE \'%' . $escapedQuery . '%\')'); + } + + return (int) Db::getInstance()->getValue($sql); + } + + /** + * Get materials by IDs + */ + public function getTargetMprMaterialsByIds(array $ids, $idLang, $idShop = null) + { + if (empty($ids)) { + return []; + } + + $db = Db::getInstance(); + + $sql = new DbQuery(); + $sql->select('m.id_material, m.reference, m.unit, m.unit_cost, m.active, + ml.name, ml.description, + IFNULL(SUM(ms.quantity), 0) AS stock_qty'); + $sql->from('mprwarehouserevolution_material', 'm'); + $sql->leftJoin('mprwarehouserevolution_material_lang', 'ml', 'ml.id_material = m.id_material AND ml.id_lang = ' . (int) ($idLang ?: $this->idLang)); + $sql->leftJoin('mprwarehouserevolution_material_stock', 'ms', 'ms.id_material = m.id_material'); + $sql->where('m.id_material IN (' . implode(',', array_map('intval', $ids)) . ')'); + $sql->groupBy('m.id_material'); + + $rows = $db->executeS($sql); + if (!$rows) { + return []; + } + + $materials = []; + foreach ($rows as $row) { + $stockQty = (int) $row['stock_qty']; + $materials[(int) $row['id_material']] = [ + 'id' => (int) $row['id_material'], + 'type' => 'mpr_material', + 'name' => $row['name'], + 'subtitle' => $row['reference'] ? 'Ref: ' . $row['reference'] : null, + 'reference' => $row['reference'], + 'stock_qty' => $stockQty, + 'stock_status' => $stockQty <= 0 ? 'out_of_stock' : 'in_stock', + 'active' => (bool) $row['active'], + ]; + } + + // Return in original order + $ordered = []; + foreach ($ids as $id) { + if (isset($materials[(int) $id])) { + $ordered[] = $materials[(int) $id]; + } + } + + return $ordered; + } + // ========================================================================= // FILTERABLE DATA (for UI dropdowns) // ========================================================================= diff --git a/src/EntitySelector/EntitySelectorRenderer.php b/src/EntitySelector/EntitySelectorRenderer.php index d822a07..1408f32 100644 --- a/src/EntitySelector/EntitySelectorRenderer.php +++ b/src/EntitySelector/EntitySelectorRenderer.php @@ -121,6 +121,7 @@ class EntitySelectorRenderer 'show_cms' => true, 'show_cms_categories' => true, 'combination_mode' => 'products', + 'product_selection_level' => 'product', 'mode' => 'multi', 'blocks' => [], 'customBlocks' => [], @@ -139,6 +140,9 @@ class EntitySelectorRenderer if (is_string($savedData)) { $savedData = json_decode($savedData, true) ?: []; } + if (!is_array($savedData)) { + $savedData = []; + } // Determine which block is active $enabledBlocks = []; @@ -1542,6 +1546,7 @@ class EntitySelectorRenderer ], 'methodHelp' => $this->getAllMethodHelpContent(), 'combinationMode' => $config['combination_mode'] ?? 'products', + 'productSelectionLevel' => $config['product_selection_level'] ?? 'product', 'emptyMeansAll' => $config['empty_means_all'] ?? true, ]; } diff --git a/src/EntitySelector/ProductConditionResolver.php b/src/EntitySelector/ProductConditionResolver.php index 8c46886..ded01b9 100644 --- a/src/EntitySelector/ProductConditionResolver.php +++ b/src/EntitySelector/ProductConditionResolver.php @@ -176,7 +176,18 @@ class ProductConditionResolver return $this->getAllActiveProductIds(); case 'specific': - return is_array($values) ? array_map('intval', $values) : []; + if (!is_array($values)) { + return []; + } + // Support prefixed string IDs (c:32, p:17) — return as-is + $hasPrefixed = false; + foreach ($values as $v) { + if (is_string($v) && (strpos($v, 'c:') === 0 || strpos($v, 'p:') === 0)) { + $hasPrefixed = true; + break; + } + } + return $hasPrefixed ? array_map('strval', $values) : array_map('intval', $values); case 'by_category': return $this->getProductIdsByCategories($values); @@ -2049,4 +2060,62 @@ class ProductConditionResolver 'combinations' => $allCombinations, ]; } + + /** + * Expand product IDs to combination-level prefixed IDs. + * Products WITH combinations → "c:{id_product_attribute}" per combination. + * Products WITHOUT combinations (simple) → "p:{id_product}". + * + * @param array $productIds Plain integer product IDs + * @param string $mode 'combination' (only combos + simple) or 'both' (parent + combos + simple) + * @return array Prefixed string IDs + */ + public function expandToCombinations(array $productIds, $mode = 'combination') + { + if (empty($productIds)) { + return []; + } + + $db = Db::getInstance(); + $idShop = $this->idShop; + + // Get all combinations for these products + $sql = 'SELECT pa.id_product_attribute, pa.id_product + FROM ' . _DB_PREFIX_ . 'product_attribute pa + INNER JOIN ' . _DB_PREFIX_ . 'product_attribute_shop pas + ON pas.id_product_attribute = pa.id_product_attribute AND pas.id_shop = ' . (int) $idShop . ' + WHERE pa.id_product IN (' . implode(',', array_map('intval', $productIds)) . ') + ORDER BY pa.id_product, pa.id_product_attribute'; + + $rows = $db->executeS($sql); + + // Group combinations by product + $combosByProduct = []; + if ($rows) { + foreach ($rows as $row) { + $combosByProduct[(int) $row['id_product']][] = (int) $row['id_product_attribute']; + } + } + + $result = []; + foreach ($productIds as $idProduct) { + $idProduct = (int) $idProduct; + + if (!empty($combosByProduct[$idProduct])) { + // Product has combinations + if ($mode === 'both') { + // Include parent product entry + $result[] = 'p:' . $idProduct; + } + foreach ($combosByProduct[$idProduct] as $idPA) { + $result[] = 'c:' . $idPA; + } + } else { + // Simple product — no combinations + $result[] = 'p:' . $idProduct; + } + } + + return $result; + } }