@masterteam/components 0.0.73 → 0.0.75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/common.css +1 -1
- package/fesm2022/masterteam-components-date-field.mjs +2 -2
- package/fesm2022/masterteam-components-date-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-formula.mjs +1126 -0
- package/fesm2022/masterteam-components-formula.mjs.map +1 -0
- package/fesm2022/masterteam-components-module-summary-card.mjs +1 -1
- package/fesm2022/masterteam-components-module-summary-card.mjs.map +1 -1
- package/fesm2022/masterteam-components-page-header.mjs +2 -2
- package/fesm2022/masterteam-components-page-header.mjs.map +1 -1
- package/fesm2022/masterteam-components-pick-list-field.mjs +1 -1
- package/fesm2022/masterteam-components-pick-list-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-table.mjs +3 -4
- package/fesm2022/masterteam-components-table.mjs.map +1 -1
- package/fesm2022/masterteam-components-toggle-field.mjs +20 -5
- package/fesm2022/masterteam-components-toggle-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-topbar.mjs +2 -2
- package/fesm2022/masterteam-components-topbar.mjs.map +1 -1
- package/fesm2022/masterteam-components-tree.mjs +14 -6
- package/fesm2022/masterteam-components-tree.mjs.map +1 -1
- package/fesm2022/masterteam-components.mjs +7 -2
- package/fesm2022/masterteam-components.mjs.map +1 -1
- package/package.json +6 -1
- package/types/masterteam-components-formula.d.ts +500 -0
- package/types/masterteam-components-toggle-field.d.ts +7 -1
- package/types/masterteam-components-tree.d.ts +2 -2
- package/types/masterteam-components.d.ts +16 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"masterteam-components-formula.mjs","sources":["../../../../packages/masterteam/components/formula/models/formula-token.model.ts","../../../../packages/masterteam/components/formula/models/smart-block.model.ts","../../../../packages/masterteam/components/formula/models/validation-result.model.ts","../../../../packages/masterteam/components/formula/models/formula-block.model.ts","../../../../packages/masterteam/components/formula/models/index.ts","../../../../packages/masterteam/components/formula/editor/formula-editor.ts","../../../../packages/masterteam/components/formula/editor/formula-editor.html","../../../../packages/masterteam/components/formula/toolbar-item/toolbar-item.ts","../../../../packages/masterteam/components/formula/toolbar-item/toolbar-item.html","../../../../packages/masterteam/components/formula/toolbar/formula-toolbar.ts","../../../../packages/masterteam/components/formula/toolbar/formula-toolbar.html","../../../../packages/masterteam/components/formula/status-bar/formula-status-bar.ts","../../../../packages/masterteam/components/formula/status-bar/formula-status-bar.html","../../../../packages/masterteam/components/formula/public-api.ts","../../../../packages/masterteam/components/formula/masterteam-components-formula.ts"],"sourcesContent":["/**\r\n * Flat Formula Token Model\r\n *\r\n * The formula is represented as a FLAT array of tokens.\r\n * This approach provides:\r\n * - Better performance (no deep component nesting)\r\n * - Solid drag-drop behavior (functions move as complete units)\r\n * - Simple serialization (just join token values)\r\n *\r\n * STRUCTURE RULES:\r\n * - fn-open: \"IF(\" - function name + opening paren as ONE token\r\n * - fn-close: \")\" - closing paren, belongs to a function\r\n * - fn-separator: \",\" - argument separator, belongs to a function\r\n * - Dragging any structural token moves the ENTIRE function\r\n * - Content tokens (property, operator, literal) can move individually\r\n */\r\n\r\n/** Token types */\r\nexport type TokenType =\r\n | 'fn-open' // Function opening: \"SUM(\", \"IF(\"\r\n | 'fn-close' // Function closing: \")\"\r\n | 'fn-separator' // Argument separator: \",\"\r\n | 'property' // Property reference: \"@Status\", \"*.Cost\"\r\n | 'operator' // Operators: \"+\", \"-\", \"==\", etc.\r\n | 'literal'; // Literal values: \"0\", '\"Active\"'\r\n\r\n/** What happens when this token is dragged */\r\nexport type DragBehavior =\r\n | 'function' // Drag entire function (start to matching end)\r\n | 'single'; // Drag only this token\r\n\r\n/**\r\n * Formula Token - a single element in the flat formula array\r\n */\r\nexport interface FormulaToken {\r\n id: string;\r\n type: TokenType;\r\n value: string; // Display/serialize value\r\n\r\n // Function context\r\n functionId?: string; // Which function this token belongs to (for grouping)\r\n depth: number; // Nesting level (0 = root level)\r\n argIndex?: number; // Which argument slot (0, 1, 2...) - for content tokens\r\n\r\n // Drag behavior\r\n dragBehavior: DragBehavior;\r\n\r\n // Metadata for specific types\r\n functionName?: string; // For fn-open: the function name\r\n propertyType?: 'current' | 'children' | 'parent'; // For property tokens\r\n literalType?: 'string' | 'number' | 'boolean'; // For literal tokens\r\n}\r\n\r\n/**\r\n * Function structure info - tracks open/close pairs\r\n */\r\nexport interface FunctionInfo {\r\n id: string;\r\n name: string;\r\n openIndex: number; // Index of fn-open token\r\n closeIndex: number; // Index of fn-close token\r\n argCount: number; // Number of arguments\r\n depth: number; // Nesting depth\r\n}\r\n\r\n// ============ UTILITY FUNCTIONS ============\r\n\r\n/** Generate unique token ID */\r\nexport function generateTokenId(): string {\r\n return `tok_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`;\r\n}\r\n\r\n/** Generate unique function ID */\r\nexport function generateFunctionId(): string {\r\n return `fn_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`;\r\n}\r\n\r\n/** Parse function signature like \"SUM(values)\" or \"IF(cond, a, b)\" */\r\nexport function parseSignature(signature: string): {\r\n name: string;\r\n args: string[];\r\n} {\r\n const match = signature.match(/^(\\w+)\\((.*)\\)$/);\r\n if (!match) return { name: signature, args: [] };\r\n\r\n const name = match[1];\r\n const argsStr = match[2].trim();\r\n if (!argsStr) return { name, args: [] };\r\n\r\n const args: string[] = [];\r\n let current = '';\r\n let depth = 0;\r\n\r\n for (const char of argsStr) {\r\n if (char === '(') depth++;\r\n else if (char === ')') depth--;\r\n else if (char === ',' && depth === 0) {\r\n args.push(current.trim());\r\n current = '';\r\n continue;\r\n }\r\n current += char;\r\n }\r\n if (current.trim()) args.push(current.trim());\r\n\r\n return { name, args };\r\n}\r\n\r\n/**\r\n * Create a function's tokens from signature\r\n * e.g., \"IF(condition, trueVal, falseVal)\" creates:\r\n * - fn-open: \"IF(\"\r\n * - fn-separator: \",\" (x2)\r\n * - fn-close: \")\"\r\n */\r\nexport function createFunctionTokens(\r\n signature: string,\r\n depth: number = 0,\r\n): FormulaToken[] {\r\n const parsed = parseSignature(signature);\r\n const functionId = generateFunctionId();\r\n const tokens: FormulaToken[] = [];\r\n\r\n // Opening token: \"NAME(\"\r\n tokens.push({\r\n id: generateTokenId(),\r\n type: 'fn-open',\r\n value: `${parsed.name}(`,\r\n functionId,\r\n functionName: parsed.name,\r\n depth,\r\n dragBehavior: 'function',\r\n });\r\n\r\n // Separators for arguments (one less than arg count)\r\n for (let i = 0; i < parsed.args.length - 1; i++) {\r\n tokens.push({\r\n id: generateTokenId(),\r\n type: 'fn-separator',\r\n value: ',',\r\n functionId,\r\n depth,\r\n argIndex: i, // Separator AFTER this argument\r\n dragBehavior: 'function',\r\n });\r\n }\r\n\r\n // Closing token: \")\"\r\n tokens.push({\r\n id: generateTokenId(),\r\n type: 'fn-close',\r\n value: ')',\r\n functionId,\r\n depth,\r\n dragBehavior: 'function',\r\n });\r\n\r\n return tokens;\r\n}\r\n\r\n/**\r\n * Create a property token\r\n */\r\nexport function createPropertyToken(\r\n propertyKey: string,\r\n propertyType: 'current' | 'children' | 'parent' = 'current',\r\n depth: number = 0,\r\n functionId?: string,\r\n argIndex?: number,\r\n): FormulaToken {\r\n const prefix =\r\n propertyType === 'current'\r\n ? '@'\r\n : propertyType === 'children'\r\n ? '*.'\r\n : '$.';\r\n return {\r\n id: generateTokenId(),\r\n type: 'property',\r\n value: `${prefix}${propertyKey}`,\r\n propertyType,\r\n depth,\r\n functionId,\r\n argIndex,\r\n dragBehavior: 'single',\r\n };\r\n}\r\n\r\n/**\r\n * Create an operator token\r\n */\r\nexport function createOperatorToken(\r\n symbol: string,\r\n depth: number = 0,\r\n functionId?: string,\r\n argIndex?: number,\r\n): FormulaToken {\r\n return {\r\n id: generateTokenId(),\r\n type: 'operator',\r\n value: symbol,\r\n depth,\r\n functionId,\r\n argIndex,\r\n dragBehavior: 'single',\r\n };\r\n}\r\n\r\n/**\r\n * Create a literal token\r\n */\r\nexport function createLiteralToken(\r\n value: string | number | boolean,\r\n depth: number = 0,\r\n functionId?: string,\r\n argIndex?: number,\r\n): FormulaToken {\r\n let displayValue = String(value);\r\n let literalType: 'string' | 'number' | 'boolean' = 'string';\r\n\r\n if (typeof value === 'number') {\r\n literalType = 'number';\r\n } else if (typeof value === 'boolean') {\r\n literalType = 'boolean';\r\n } else if (typeof value === 'string' && !value.startsWith('\"')) {\r\n displayValue = `\"${value}\"`;\r\n }\r\n\r\n return {\r\n id: generateTokenId(),\r\n type: 'literal',\r\n value: displayValue,\r\n literalType,\r\n depth,\r\n functionId,\r\n argIndex,\r\n dragBehavior: 'single',\r\n };\r\n}\r\n\r\n// ============ TOKEN ARRAY OPERATIONS ============\r\n\r\n/**\r\n * Find the complete range of a function in the token array\r\n * This includes ALL tokens between fn-open and fn-close (including nested content)\r\n * Returns [startIndex, endIndex] inclusive\r\n */\r\nexport function findFunctionRange(\r\n tokens: FormulaToken[],\r\n functionId: string,\r\n): [number, number] | null {\r\n // Find the fn-open token with this functionId\r\n const openIndex = tokens.findIndex(\r\n (t) => t.functionId === functionId && t.type === 'fn-open',\r\n );\r\n if (openIndex === -1) return null;\r\n\r\n // Now find the matching fn-close by counting depth\r\n // Start from fn-open and find matching close paren\r\n let depth = 1;\r\n for (let i = openIndex + 1; i < tokens.length; i++) {\r\n const token = tokens[i];\r\n if (token.type === 'fn-open') {\r\n depth++;\r\n } else if (token.type === 'fn-close') {\r\n depth--;\r\n if (depth === 0) {\r\n // Found the matching close\r\n return [openIndex, i];\r\n }\r\n }\r\n }\r\n\r\n // Fallback: find fn-close with same functionId\r\n const closeIndex = tokens.findIndex(\r\n (t) => t.functionId === functionId && t.type === 'fn-close',\r\n );\r\n if (closeIndex === -1) return null;\r\n\r\n return [openIndex, closeIndex];\r\n}\r\n\r\n/**\r\n * Get all tokens belonging to a function (including nested content)\r\n */\r\nexport function getFunctionTokens(\r\n tokens: FormulaToken[],\r\n functionId: string,\r\n): FormulaToken[] {\r\n const range = findFunctionRange(tokens, functionId);\r\n if (!range) return [];\r\n return tokens.slice(range[0], range[1] + 1);\r\n}\r\n\r\n/**\r\n * Validate if a drop position is allowed\r\n */\r\nexport function isValidDropPosition(\r\n tokens: FormulaToken[],\r\n dropIndex: number,\r\n draggedTokens: FormulaToken[],\r\n): boolean {\r\n // Can always drop at start or end\r\n if (dropIndex === 0 || dropIndex === tokens.length) return true;\r\n\r\n const _prevToken = tokens[dropIndex - 1];\r\n const _nextToken = tokens[dropIndex];\r\n\r\n // If dragging a function, check if it would create invalid nesting\r\n const isDraggingFunction = draggedTokens.some(\r\n (t) => t.type === 'fn-open' || t.type === 'fn-close',\r\n );\r\n\r\n if (isDraggingFunction) {\r\n // Don't allow dropping a function that would break structure\r\n // For now, allow all - we can refine later\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Serialize tokens to formula string\r\n */\r\nexport function serializeTokens(tokens: FormulaToken[]): string {\r\n const parts: string[] = [];\r\n let lastType: TokenType | null = null;\r\n\r\n for (const token of tokens) {\r\n // Add space between tokens (except after fn-open, before fn-close, after separator)\r\n if (\r\n lastType &&\r\n lastType !== 'fn-open' &&\r\n token.type !== 'fn-close' &&\r\n token.type !== 'fn-separator' &&\r\n lastType !== 'fn-separator'\r\n ) {\r\n parts.push(' ');\r\n }\r\n\r\n parts.push(token.value);\r\n lastType = token.type;\r\n }\r\n\r\n return parts.join('');\r\n}\r\n\r\n/**\r\n * Clone a token with new ID\r\n */\r\nexport function cloneToken(token: FormulaToken): FormulaToken {\r\n return {\r\n ...token,\r\n id: generateTokenId(),\r\n };\r\n}\r\n\r\n/**\r\n * Clone multiple tokens with new IDs and new function IDs\r\n */\r\nexport function cloneTokens(tokens: FormulaToken[]): FormulaToken[] {\r\n // Map old function IDs to new ones\r\n const functionIdMap = new Map<string, string>();\r\n\r\n return tokens.map((token) => {\r\n const newToken = cloneToken(token);\r\n\r\n // Remap function IDs\r\n if (token.functionId) {\r\n if (!functionIdMap.has(token.functionId)) {\r\n functionIdMap.set(token.functionId, generateFunctionId());\r\n }\r\n newToken.functionId = functionIdMap.get(token.functionId);\r\n }\r\n\r\n return newToken;\r\n });\r\n}\r\n\r\n/**\r\n * Update depth for all tokens (after move)\r\n */\r\nexport function recalculateDepths(tokens: FormulaToken[]): FormulaToken[] {\r\n let currentDepth = 0;\r\n const result: FormulaToken[] = [];\r\n\r\n for (const token of tokens) {\r\n if (token.type === 'fn-open') {\r\n result.push({ ...token, depth: currentDepth });\r\n currentDepth++;\r\n } else if (token.type === 'fn-close') {\r\n currentDepth--;\r\n result.push({ ...token, depth: currentDepth });\r\n } else {\r\n result.push({ ...token, depth: currentDepth });\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Find which argument index a position belongs to within a function\r\n */\r\nexport function getArgumentIndexAtPosition(\r\n tokens: FormulaToken[],\r\n functionId: string,\r\n position: number,\r\n): number {\r\n const range = findFunctionRange(tokens, functionId);\r\n if (!range) return 0;\r\n\r\n let argIndex = 0;\r\n for (let i = range[0] + 1; i < position && i <= range[1]; i++) {\r\n if (\r\n tokens[i].type === 'fn-separator' &&\r\n tokens[i].functionId === functionId\r\n ) {\r\n argIndex++;\r\n }\r\n }\r\n\r\n return argIndex;\r\n}\r\n","/**\r\n * Smart Formula Block - Types and Factory Functions\r\n * Defines the block structure and creation helpers\r\n */\r\n\r\n/** Block type */\r\nexport type BlockType = 'function' | 'property' | 'operator' | 'literal';\r\n\r\n/** Argument slot for functions */\r\nexport interface ArgumentSlot {\r\n id: string;\r\n name: string;\r\n blocks: SmartBlock[];\r\n placeholder?: string;\r\n}\r\n\r\n/** Smart block structure */\r\nexport interface SmartBlock {\r\n id: string;\r\n type: BlockType;\r\n value: string;\r\n\r\n // For functions\r\n functionName?: string;\r\n signature?: string;\r\n arguments?: ArgumentSlot[];\r\n\r\n // For properties\r\n propertyType?: 'current' | 'children' | 'parent';\r\n propertyKey?: string;\r\n\r\n // For operators\r\n operatorSymbol?: string;\r\n\r\n // For literals\r\n literalValue?: string | number | boolean;\r\n}\r\n\r\nimport { parseSignature } from './formula-token.model';\r\n\r\n/** Generate unique block ID */\r\nexport function generateSmartBlockId(): string {\r\n return `sb_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\r\n}\r\n\r\n/** Create a function block from signature */\r\nexport function createFunctionBlock(\r\n signature: string,\r\n name?: string,\r\n): SmartBlock {\r\n const parsed = parseSignature(signature);\r\n return {\r\n id: generateSmartBlockId(),\r\n type: 'function',\r\n value: parsed.name,\r\n functionName: name || parsed.name,\r\n signature,\r\n arguments: parsed.args.map((arg) => ({\r\n id: generateSmartBlockId(),\r\n name: arg,\r\n blocks: [],\r\n placeholder: arg,\r\n })),\r\n };\r\n}\r\n\r\n/** Create a property block */\r\nexport function createPropertyBlock(\r\n propertyKey: string,\r\n propertyType: 'current' | 'children' | 'parent' = 'current',\r\n): SmartBlock {\r\n const prefix =\r\n propertyType === 'current'\r\n ? '@'\r\n : propertyType === 'children'\r\n ? '*.'\r\n : '$.';\r\n return {\r\n id: generateSmartBlockId(),\r\n type: 'property',\r\n value: `${prefix}${propertyKey}`,\r\n propertyType,\r\n propertyKey,\r\n };\r\n}\r\n\r\n/** Create an operator block */\r\nexport function createOperatorBlock(symbol: string): SmartBlock {\r\n return {\r\n id: generateSmartBlockId(),\r\n type: 'operator',\r\n value: symbol,\r\n operatorSymbol: symbol,\r\n };\r\n}\r\n\r\n/** Create a literal block */\r\nexport function createLiteralBlock(\r\n value: string | number | boolean,\r\n): SmartBlock {\r\n return {\r\n id: generateSmartBlockId(),\r\n type: 'literal',\r\n value: String(value),\r\n literalValue: value,\r\n };\r\n}\r\n\r\n/** Deep clone a block with new IDs */\r\nexport function cloneBlock(block: SmartBlock): SmartBlock {\r\n const newBlock: SmartBlock = { ...block, id: generateSmartBlockId() };\r\n if (block.arguments) {\r\n newBlock.arguments = block.arguments.map((arg) => ({\r\n ...arg,\r\n id: generateSmartBlockId(),\r\n blocks: arg.blocks.map((b) => cloneBlock(b)),\r\n }));\r\n }\r\n return newBlock;\r\n}\r\n","/**\r\n * Validation Result Models\r\n * API response types for formula validation\r\n */\r\n\r\n/** Validation error/warning severity */\r\nexport type ValidationSeverity = 'Error' | 'Warning';\r\n\r\n/** Validation error or warning */\r\nexport interface ValidationError {\r\n message: string;\r\n line: number;\r\n column: number;\r\n severity: ValidationSeverity;\r\n}\r\n\r\n/** Validation warning (same structure as error) */\r\nexport type ValidationWarning = ValidationError;\r\n\r\n/** Complete validation result from API */\r\nexport interface ValidationResult {\r\n isValid: boolean;\r\n errors: ValidationError[];\r\n warnings: ValidationWarning[];\r\n dependencies: string[];\r\n complexity: number;\r\n}\r\n\r\n/** Validation request payload */\r\nexport interface ValidationRequest {\r\n formula: string;\r\n knownProperties?: string[];\r\n levelSchemaId?: number;\r\n templateId?: number;\r\n}\r\n\r\n/** Autocomplete suggestion */\r\nexport interface AutocompleteSuggestion {\r\n text: string;\r\n displayText: string;\r\n type: 'Function' | 'Property' | 'Operator' | 'Context';\r\n description: string;\r\n insertText: string;\r\n category?: string;\r\n}\r\n\r\n/** Autocomplete context */\r\nexport interface AutocompleteContext {\r\n type: 'None' | 'Function' | 'Property' | 'Operator';\r\n scope: string;\r\n prefix: string;\r\n}\r\n\r\n/** Autocomplete response from API */\r\nexport interface AutocompleteResponse {\r\n suggestions: AutocompleteSuggestion[];\r\n context: AutocompleteContext;\r\n}\r\n\r\n/** Autocomplete request payload */\r\nexport interface AutocompleteRequest {\r\n formula: string;\r\n cursorPosition: number;\r\n knownProperties?: string[];\r\n levelSchemaId?: number;\r\n}\r\n\r\n/** API error response */\r\nexport interface ApiErrorResponse {\r\n error: string;\r\n message?: string;\r\n}\r\n","/**\r\n * Formula Block Model - Types for formula functions and operators\r\n */\r\n\r\n/** Function category types */\r\nexport type FunctionCategory =\r\n | 'Math'\r\n | 'Aggregation'\r\n | 'Logic'\r\n | 'Hierarchy'\r\n | 'Date'\r\n | 'String'\r\n | 'PhaseGate';\r\n\r\n/** Parameter definition for a function */\r\nexport interface ParameterDefinition {\r\n name: string;\r\n type: string;\r\n description: string;\r\n required: boolean;\r\n defaultValue?: unknown;\r\n}\r\n\r\n/** Function definition */\r\nexport interface FunctionDefinition {\r\n name: string;\r\n category: FunctionCategory;\r\n description: string;\r\n signature: string;\r\n parameters: ParameterDefinition[];\r\n returnType: string;\r\n examples: string[];\r\n}\r\n\r\n/** Function category group */\r\nexport interface FunctionCategoryGroup {\r\n name: FunctionCategory;\r\n displayName: string;\r\n functions: FunctionDefinition[];\r\n}\r\n\r\n/** Operator definition */\r\nexport interface OperatorDefinition {\r\n symbol: string;\r\n name: string;\r\n type: 'arithmetic' | 'comparison' | 'logical';\r\n description: string;\r\n precedence: number;\r\n}\r\n","// Models index\r\nexport * from './formula-token.model';\r\nexport * from './smart-block.model';\r\nexport * from './validation-result.model';\r\nexport * from './formula-block.model';\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n input,\r\n output,\r\n signal,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n FormsModule,\r\n} from '@angular/forms';\r\nimport {\r\n CdkDragDrop,\r\n CdkDragStart,\r\n DragDropModule,\r\n moveItemInArray,\r\n} from '@angular/cdk/drag-drop';\r\n\r\nimport {\r\n FormulaToken,\r\n cloneTokens,\r\n createFunctionTokens,\r\n createLiteralToken,\r\n createOperatorToken,\r\n createPropertyToken,\r\n findFunctionRange,\r\n recalculateDepths,\r\n serializeTokens,\r\n} from '../models/formula-token.model';\r\nimport type { SmartBlock } from '../models/smart-block.model';\r\n\r\n@Component({\r\n selector: 'mt-formula-editor',\r\n standalone: true,\r\n imports: [CommonModule, DragDropModule, FormsModule],\r\n templateUrl: './formula-editor.html',\r\n styleUrls: ['./formula-editor.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => FormulaEditor),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class FormulaEditor implements ControlValueAccessor {\r\n // ============ INPUTS ============\r\n readonly placeholder = input('Click toolbar items to build formula...');\r\n readonly initialTokens = input<FormulaToken[]>([]);\r\n readonly disabled = input<boolean>(false);\r\n\r\n // ============ OUTPUTS ============\r\n readonly formulaChange = output<string>();\r\n readonly tokensChange = output<FormulaToken[]>();\r\n readonly onBlur = output<void>();\r\n readonly onFocus = output<void>();\r\n\r\n // ============ STATE ============\r\n readonly tokens = signal<FormulaToken[]>([]);\r\n\r\n /** Index range being dragged [start, end] inclusive */\r\n private draggedRange: [number, number] | null = null;\r\n\r\n /** Is currently dragging */\r\n readonly isDragging = signal(false);\r\n\r\n /** Hovered function ID for highlighting */\r\n readonly hoveredFunctionId = signal<string | null>(null);\r\n\r\n /** Is focused */\r\n readonly isFocused = signal(false);\r\n\r\n // ============ CVA ============\r\n private onChange: (value: FormulaToken[]) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n // ============ COMPUTED ============\r\n\r\n /** Line numbers based on token count */\r\n readonly lines = computed(() => {\r\n const count = Math.max(1, Math.ceil(this.tokens().length / 8));\r\n return Array(count).fill(0);\r\n });\r\n\r\n /** Serialized formula string */\r\n readonly formulaString = computed(() => serializeTokens(this.tokens()));\r\n\r\n constructor() {\r\n // Initialize from input\r\n effect(() => {\r\n const initial = this.initialTokens();\r\n if (initial.length > 0) {\r\n this.tokens.set(initial);\r\n }\r\n });\r\n }\r\n\r\n // ============ CONTROL VALUE ACCESSOR ============\r\n\r\n writeValue(value: FormulaToken[] | null): void {\r\n if (value === null || value === undefined) {\r\n this.tokens.set([]);\r\n return;\r\n }\r\n\r\n // Value should be tokens array\r\n if (Array.isArray(value)) {\r\n this.tokens.set(value);\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: FormulaToken[]) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n // ============ PUBLIC API ============\r\n\r\n /**\r\n * Add a block from toolbar (converts SmartBlock to tokens)\r\n */\r\n addBlock(block: SmartBlock): void {\r\n if (this.disabled()) return;\r\n\r\n const newTokens = this.smartBlockToTokens(block);\r\n this.tokens.update((tokens) => [...tokens, ...cloneTokens(newTokens)]);\r\n this.emit();\r\n }\r\n\r\n /**\r\n * Add tokens directly\r\n */\r\n addTokens(newTokens: FormulaToken[]): void {\r\n if (this.disabled()) return;\r\n\r\n this.tokens.update((tokens) => [...tokens, ...cloneTokens(newTokens)]);\r\n this.emit();\r\n }\r\n\r\n /**\r\n * Clear all tokens\r\n */\r\n clear(): void {\r\n if (this.disabled()) return;\r\n\r\n this.tokens.set([]);\r\n this.emit();\r\n }\r\n\r\n /**\r\n * Get current formula string\r\n */\r\n serialize(): string {\r\n return this.formulaString();\r\n }\r\n\r\n /**\r\n * Get current tokens\r\n */\r\n getTokens(): FormulaToken[] {\r\n return this.tokens();\r\n }\r\n\r\n // ============ FOCUS HANDLERS ============\r\n\r\n handleFocus(): void {\r\n this.isFocused.set(true);\r\n this.onFocus.emit();\r\n }\r\n\r\n handleBlur(): void {\r\n this.isFocused.set(false);\r\n this.onTouched();\r\n this.onBlur.emit();\r\n }\r\n\r\n // ============ DRAG HANDLERS ============\r\n\r\n /**\r\n * Handle drag start - determine what tokens to drag\r\n */\r\n onDragStart(event: CdkDragStart, token: FormulaToken, index: number): void {\r\n if (this.disabled()) return;\r\n\r\n this.isDragging.set(true);\r\n\r\n if (token.dragBehavior === 'function' && token.functionId) {\r\n // Drag entire function (all tokens from fn-open to fn-close)\r\n const range = findFunctionRange(this.tokens(), token.functionId);\r\n if (range) {\r\n this.draggedRange = range;\r\n } else {\r\n // Fallback to single token if range not found\r\n this.draggedRange = [index, index];\r\n }\r\n } else {\r\n // Drag single token\r\n this.draggedRange = [index, index];\r\n }\r\n }\r\n\r\n /**\r\n * Handle drop - reorder tokens in the formula\r\n */\r\n onDrop(event: CdkDragDrop<FormulaToken[]>): void {\r\n if (this.disabled()) return;\r\n\r\n this.isDragging.set(false);\r\n\r\n const { previousIndex, currentIndex } = event;\r\n\r\n // No movement\r\n if (previousIndex === currentIndex) {\r\n this.resetDragState();\r\n return;\r\n }\r\n\r\n // No drag data (shouldn't happen but be safe)\r\n if (!this.draggedRange) {\r\n this.resetDragState();\r\n return;\r\n }\r\n\r\n const [start, end] = this.draggedRange;\r\n const count = end - start + 1;\r\n const isSingleToken = start === end;\r\n\r\n // Block dropping inside own range (only for multi-token drag)\r\n if (!isSingleToken && currentIndex > start && currentIndex <= end) {\r\n this.resetDragState();\r\n return;\r\n }\r\n\r\n const tokens = [...this.tokens()];\r\n\r\n if (isSingleToken) {\r\n // Simple single-token move using CDK utility\r\n moveItemInArray(tokens, previousIndex, currentIndex);\r\n } else {\r\n // Multi-token move (function with all content)\r\n // 1. Extract the tokens we're moving\r\n const moving = tokens.splice(start, count);\r\n\r\n // 2. Calculate insert position\r\n let insertAt: number;\r\n if (currentIndex <= start) {\r\n // Moving left/backward - insert at drop position\r\n insertAt = currentIndex;\r\n } else {\r\n // Moving right/forward\r\n // After removal, adjust for removed count and insert AFTER drop target\r\n insertAt = currentIndex - count + 1;\r\n }\r\n\r\n // 3. Clamp and insert\r\n insertAt = Math.max(0, Math.min(insertAt, tokens.length));\r\n tokens.splice(insertAt, 0, ...moving);\r\n }\r\n\r\n // Update state with recalculated depths\r\n this.tokens.set(recalculateDepths(tokens));\r\n this.resetDragState();\r\n this.emit();\r\n }\r\n\r\n /**\r\n * Reset drag state\r\n */\r\n private resetDragState(): void {\r\n this.draggedRange = null;\r\n }\r\n\r\n /**\r\n * Handle drag end\r\n * NOTE: CDK fires cdkDragEnded BEFORE cdkDropListDropped\r\n * So we don't reset draggedRange here - onDrop handles it\r\n */\r\n onDragEnd(): void {\r\n this.isDragging.set(false);\r\n }\r\n\r\n // ============ DELETE ============\r\n\r\n /**\r\n * Remove a token or function\r\n */\r\n removeToken(token: FormulaToken, index: number): void {\r\n if (this.disabled()) return;\r\n\r\n if (token.dragBehavior === 'function' && token.functionId) {\r\n // Remove entire function\r\n const range = findFunctionRange(this.tokens(), token.functionId);\r\n if (range) {\r\n this.tokens.update((tokens) => {\r\n const newTokens = [...tokens];\r\n newTokens.splice(range[0], range[1] - range[0] + 1);\r\n return recalculateDepths(newTokens);\r\n });\r\n }\r\n } else {\r\n // Remove single token\r\n this.tokens.update((tokens) => tokens.filter((_, i) => i !== index));\r\n }\r\n this.emit();\r\n }\r\n\r\n // ============ HOVER EFFECTS ============\r\n\r\n onTokenHover(token: FormulaToken): void {\r\n if (token.functionId && token.dragBehavior === 'function') {\r\n this.hoveredFunctionId.set(token.functionId);\r\n }\r\n }\r\n\r\n onTokenLeave(): void {\r\n this.hoveredFunctionId.set(null);\r\n }\r\n\r\n /**\r\n * Check if token should be highlighted\r\n * Only structural tokens (fn-open, fn-close, fn-separator) get highlighted\r\n * Content tokens (property, operator, literal) inside function are NOT highlighted\r\n */\r\n isHighlighted(token: FormulaToken): boolean {\r\n const hoveredId = this.hoveredFunctionId();\r\n if (!hoveredId) return false;\r\n\r\n // Only highlight structural tokens of the function, not content inside\r\n const isStructural =\r\n token.type === 'fn-open' ||\r\n token.type === 'fn-close' ||\r\n token.type === 'fn-separator';\r\n\r\n return isStructural && token.functionId === hoveredId;\r\n }\r\n\r\n // ============ STYLING ============\r\n\r\n /** Base token classes */\r\n private readonly baseTokenClasses =\r\n 'inline-flex items-center px-2 py-1 rounded text-sm font-medium cursor-grab select-none whitespace-nowrap active:cursor-grabbing';\r\n\r\n /**\r\n * Get Tailwind classes for a token\r\n */\r\n getTokenClasses(token: FormulaToken): string {\r\n const base = this.baseTokenClasses;\r\n\r\n // Type-based styling using Tailwind\r\n switch (token.type) {\r\n case 'fn-open':\r\n // Function opening: \"IF(\" - rounded left only\r\n return `${base} bg-slate-200 dark:bg-slate-700 text-slate-700 dark:text-slate-300 font-semibold hover:bg-slate-300 dark:hover:bg-slate-600 rounded-r-none pr-0.5`;\r\n\r\n case 'fn-close':\r\n // Function closing: \")\" - rounded right only\r\n return `${base} bg-slate-200 dark:bg-slate-700 text-slate-700 dark:text-slate-300 font-semibold hover:bg-slate-300 dark:hover:bg-slate-600 rounded-l-none pl-0.5`;\r\n\r\n case 'fn-separator':\r\n // Function separator: \",\"\r\n return `${base} bg-slate-200 dark:bg-slate-700 text-slate-700 dark:text-slate-300 font-semibold hover:bg-slate-300 dark:hover:bg-slate-600 rounded-sm px-1`;\r\n\r\n case 'property':\r\n // Property tokens - amber colors\r\n return `${base} bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300 font-semibold hover:bg-amber-200 dark:hover:bg-amber-900/50`;\r\n\r\n case 'operator':\r\n // Operator tokens - sky colors\r\n return `${base} bg-sky-100 dark:bg-sky-900/30 text-sky-700 dark:text-sky-300 font-bold hover:bg-sky-200 dark:hover:bg-sky-900/50 px-2`;\r\n\r\n case 'literal':\r\n // Literal tokens - emerald colors\r\n return `${base} bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 hover:bg-emerald-200 dark:hover:bg-emerald-900/50`;\r\n\r\n default:\r\n return base;\r\n }\r\n }\r\n\r\n // ============ CONVERSION ============\r\n\r\n /**\r\n * Convert SmartBlock to FormulaTokens\r\n */\r\n private smartBlockToTokens(block: SmartBlock): FormulaToken[] {\r\n switch (block.type) {\r\n case 'function':\r\n return createFunctionTokens(\r\n block.signature || `${block.functionName}()`,\r\n 0,\r\n );\r\n case 'property':\r\n return [\r\n createPropertyToken(\r\n block.propertyKey || block.value,\r\n block.propertyType,\r\n ),\r\n ];\r\n case 'operator':\r\n return [createOperatorToken(block.operatorSymbol || block.value)];\r\n case 'literal':\r\n return [createLiteralToken(block.literalValue ?? block.value)];\r\n default:\r\n return [createLiteralToken(block.value)];\r\n }\r\n }\r\n\r\n // ============ EMIT ============\r\n\r\n private emit(): void {\r\n const formula = this.formulaString();\r\n const tokens = this.tokens();\r\n\r\n this.tokensChange.emit(tokens);\r\n this.formulaChange.emit(formula);\r\n this.onChange(tokens);\r\n }\r\n\r\n // ============ CDK HELPERS ============\r\n\r\n /**\r\n * Track function for ngFor\r\n */\r\n trackByToken(_index: number, token: FormulaToken): string {\r\n return token.id;\r\n }\r\n}\r\n","<div\r\n class=\"flex border border-surface-200 dark:border-surface-700 rounded-md bg-white dark:bg-surface-800 min-h-20 font-mono text-sm focus-within:border-primary focus-within:ring-2 focus-within:ring-primary/10\"\r\n [class.opacity-60]=\"disabled()\"\r\n [class.pointer-events-none]=\"disabled()\"\r\n (focus)=\"handleFocus()\"\r\n (blur)=\"handleBlur()\"\r\n tabindex=\"0\"\r\n>\r\n <!-- Line Numbers -->\r\n <div\r\n class=\"flex flex-col px-1.5 py-2 bg-surface-50 dark:bg-surface-900 border-r border-surface-200 dark:border-surface-700 rounded-l-md select-none min-w-6 text-right\"\r\n >\r\n @for (line of lines(); track $index) {\r\n <div class=\"text-surface-400 dark:text-surface-500 text-sm leading-6\">\r\n {{ $index + 1 }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Editor Content - Single Drop Zone -->\r\n <div\r\n class=\"flex-1 p-2 flex flex-wrap gap-0.5 items-start content-start min-h-14 cursor-text\"\r\n cdkDropList\r\n cdkDropListOrientation=\"mixed\"\r\n [cdkDropListData]=\"tokens()\"\r\n [cdkDropListDisabled]=\"disabled()\"\r\n (cdkDropListDropped)=\"onDrop($event)\"\r\n >\r\n @if (tokens().length === 0) {\r\n <div class=\"text-surface-400 dark:text-surface-500 text-sm italic\">\r\n {{ placeholder() }}\r\n </div>\r\n } @else {\r\n @for (token of tokens(); track token.id; let i = $index) {\r\n <div\r\n class=\"relative inline-flex items-center group\"\r\n cdkDrag\r\n [cdkDragData]=\"token\"\r\n [cdkDragDisabled]=\"disabled()\"\r\n (cdkDragStarted)=\"onDragStart($event, token, i)\"\r\n (cdkDragEnded)=\"onDragEnd()\"\r\n >\r\n <!-- Drag Placeholder (thin cursor line) -->\r\n <div\r\n *cdkDragPlaceholder\r\n class=\"w-2 min-w-2 h-5 bg-primary rounded-sm opacity-80\"\r\n ></div>\r\n\r\n <!-- Token -->\r\n <span\r\n [class]=\"getTokenClasses(token)\"\r\n [class.border-b-2]=\"!isDragging() && isHighlighted(token)\"\r\n [class.border-primary]=\"!isDragging() && isHighlighted(token)\"\r\n (mouseenter)=\"onTokenHover(token)\"\r\n (mouseleave)=\"onTokenLeave()\"\r\n >\r\n {{ token.value }}\r\n </span>\r\n\r\n <!-- Delete Button (shows on hover, hidden during drag) -->\r\n @if (!isDragging() && !disabled()) {\r\n <button\r\n type=\"button\"\r\n class=\"absolute -top-1.5 -right-1.5 w-3.5 h-3.5 flex items-center justify-center bg-red-500 hover:bg-red-600 text-white rounded-full cursor-pointer scale-75 hover:scale-100 opacity-0 group-hover:opacity-100 pointer-events-none group-hover:pointer-events-auto z-10\"\r\n (click)=\"removeToken(token, i); $event.stopPropagation()\"\r\n [title]=\"\r\n token.dragBehavior === 'function' ? 'Remove function' : 'Remove'\r\n \"\r\n >\r\n <svg\r\n class=\"h-2.5 w-2.5\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"3\"\r\n >\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M6 18L18 6M6 6l12 12\"\r\n />\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n</div>\r\n","/**\r\n * Toolbar Item Component\r\n * Clickable item in the toolbar (function, property, operator)\r\n * Items are clicked to insert - no drag from toolbar\r\n *\r\n * This is a pure input/output component with no service dependencies.\r\n */\r\n\r\nimport { Component, input, output, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport type { SmartBlock } from '../models/smart-block.model';\r\nimport {\r\n createFunctionBlock,\r\n createPropertyBlock,\r\n createOperatorBlock,\r\n} from '../models/smart-block.model';\r\n\r\nexport type ToolbarItemType = 'function' | 'property' | 'operator';\r\n\r\n@Component({\r\n selector: 'mt-formula-toolbar-item',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './toolbar-item.html',\r\n host: {\r\n class: 'inline-block',\r\n },\r\n})\r\nexport class FormulaToolbarItem {\r\n /** Item type */\r\n readonly type = input.required<ToolbarItemType>();\r\n\r\n /** Item value (function name, property key, operator symbol) */\r\n readonly value = input.required<string>();\r\n\r\n /** Display value (optional, defaults to value) */\r\n readonly display = input<string>();\r\n\r\n /** Description for tooltip */\r\n readonly description = input<string>('');\r\n\r\n /** Function signature (for functions only, e.g., \"SUM(values)\") */\r\n readonly signature = input<string>();\r\n\r\n /** Property type for properties */\r\n readonly propertyType = input<'current' | 'children' | 'parent'>('current');\r\n\r\n /** Insert event - emits SmartBlock */\r\n readonly onInsert = output<SmartBlock>();\r\n\r\n /** Computed display value */\r\n readonly displayValue = computed(() => this.display() ?? this.value());\r\n\r\n /** Build SmartBlock from item data */\r\n readonly smartBlock = computed((): SmartBlock => {\r\n switch (this.type()) {\r\n case 'function':\r\n return createFunctionBlock(\r\n this.signature() || `${this.value()}()`,\r\n this.value(),\r\n );\r\n case 'property':\r\n return createPropertyBlock(this.value(), this.propertyType());\r\n case 'operator':\r\n return createOperatorBlock(this.value());\r\n default:\r\n return createOperatorBlock(this.value());\r\n }\r\n });\r\n\r\n /** Item CSS class based on type */\r\n readonly itemClass = computed(() => {\r\n switch (this.type()) {\r\n case 'function':\r\n return 'bg-slate-200 text-slate-700 hover:bg-slate-300 dark:bg-slate-700 dark:text-slate-300 dark:hover:bg-slate-600';\r\n case 'property':\r\n return 'bg-amber-100 text-amber-700 hover:bg-amber-200 dark:bg-amber-900/30 dark:text-amber-300 dark:hover:bg-amber-900/50';\r\n case 'operator':\r\n return 'bg-sky-100 text-sky-700 hover:bg-sky-200 dark:bg-sky-900/30 dark:text-sky-300 dark:hover:bg-sky-900/50';\r\n default:\r\n return 'bg-slate-100 text-slate-700 dark:bg-slate-800 dark:text-slate-300';\r\n }\r\n });\r\n\r\n /** Handle click - emit the SmartBlock */\r\n handleClick(): void {\r\n this.onInsert.emit(this.smartBlock());\r\n }\r\n}\r\n","<button\r\n type=\"button\"\r\n class=\"inline-flex cursor-pointer items-center gap-1 rounded px-2 py-1 text-sm font-medium transition-colors hover:shadow-sm active:scale-95\"\r\n [class]=\"itemClass()\"\r\n [title]=\"description()\"\r\n (click)=\"handleClick()\"\r\n>\r\n @if (type() === \"function\") {\r\n <span class=\"text-sm opacity-60\">ƒ</span>\r\n }\r\n {{ displayValue() }}\r\n</button>\r\n","/**\r\n * Formula Toolbar Component\r\n * Vertical tabs toolbar with functions, properties, and operators\r\n *\r\n * This is a PURE input/output component with NO service dependencies.\r\n * All data (functions, operators, properties) must be passed via inputs.\r\n */\r\n\r\nimport {\r\n Component,\r\n input,\r\n output,\r\n signal,\r\n computed,\r\n effect,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nimport { FormulaToolbarItem } from '../toolbar-item/toolbar-item';\r\nimport {\r\n FunctionCategoryGroup,\r\n OperatorDefinition,\r\n} from '../models/formula-block.model';\r\nimport type { SmartBlock } from '../models/smart-block.model';\r\nimport { createLiteralBlock } from '../models/smart-block.model';\r\n\r\nexport type ToolbarTab = 'functions' | 'properties' | 'operators';\r\n\r\ninterface OperatorGroup {\r\n type: string;\r\n operators: OperatorDefinition[];\r\n}\r\n\r\n@Component({\r\n selector: 'mt-formula-toolbar',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, FormulaToolbarItem],\r\n templateUrl: './formula-toolbar.html',\r\n})\r\nexport class FormulaToolbar {\r\n // ============ INPUTS ============\r\n\r\n /** Known properties to show in properties tab */\r\n readonly knownProperties = input<string[]>([]);\r\n\r\n /** Function categories (from API or static data) */\r\n readonly functionCategories = input<FunctionCategoryGroup[]>([]);\r\n\r\n /** Operators list */\r\n readonly operators = input<OperatorDefinition[]>([]);\r\n\r\n /** Initial active tab */\r\n readonly initialTab = input<ToolbarTab>('functions');\r\n\r\n /** Placeholder for search input */\r\n readonly searchPlaceholder = input<string>('Search...');\r\n\r\n /** Labels */\r\n readonly labels = input<{\r\n functions?: string;\r\n properties?: string;\r\n operators?: string;\r\n noFunctionsFound?: string;\r\n noPropertiesAvailable?: string;\r\n noOperatorsFound?: string;\r\n }>({});\r\n\r\n // ============ OUTPUTS ============\r\n\r\n /** Insert event - emits SmartBlock for the editor */\r\n readonly onBlockInsert = output<SmartBlock>();\r\n\r\n /** Tab change event */\r\n readonly onTabChange = output<ToolbarTab>();\r\n\r\n // ============ STATE ============\r\n\r\n /** Active tab */\r\n readonly activeTab = signal<ToolbarTab>('functions');\r\n\r\n /** Tab options */\r\n readonly tabOptions = [\r\n { label: 'Functions', value: 'functions' as ToolbarTab },\r\n { label: 'Properties', value: 'properties' as ToolbarTab },\r\n { label: 'Operators', value: 'operators' as ToolbarTab },\r\n ];\r\n\r\n /** Search query */\r\n readonly searchQuery = signal('');\r\n\r\n /** Custom value input */\r\n readonly customValue = signal('');\r\n\r\n /** Detected type of custom value */\r\n readonly customValueType = computed((): 'number' | 'string' | 'text' => {\r\n const val = this.customValue().trim();\r\n if (!val) return 'text';\r\n\r\n // Check if it's a number\r\n if (/^-?\\d+(\\.\\d+)?$/.test(val)) {\r\n return 'number';\r\n }\r\n\r\n // Check if it's a quoted string\r\n if (\r\n (val.startsWith('\"') && val.endsWith('\"')) ||\r\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\r\n ) {\r\n return 'string';\r\n }\r\n\r\n return 'text';\r\n });\r\n\r\n /** Preview of custom value */\r\n readonly customValuePreview = computed(() => {\r\n const val = this.customValue().trim();\r\n if (!val) return '';\r\n\r\n const type = this.customValueType();\r\n if (type === 'string') {\r\n // Show the quoted string as-is\r\n return val;\r\n }\r\n if (type === 'number') {\r\n return val;\r\n }\r\n // For unquoted text, show as string preview\r\n return `\"${val}\"`;\r\n });\r\n\r\n /** CSS class for custom value type */\r\n readonly customValueTypeClass = computed(() => {\r\n switch (this.customValueType()) {\r\n case 'number':\r\n return 'bg-rose-100 text-rose-700 hover:bg-rose-200 dark:bg-rose-900/30 dark:text-rose-300 dark:hover:bg-rose-900/50';\r\n case 'string':\r\n return 'bg-emerald-100 text-emerald-700 hover:bg-emerald-200 dark:bg-emerald-900/30 dark:text-emerald-300 dark:hover:bg-emerald-900/50';\r\n default:\r\n return 'bg-slate-100 text-slate-700 hover:bg-slate-200 dark:bg-slate-700 dark:text-slate-300 dark:hover:bg-slate-600';\r\n }\r\n });\r\n\r\n constructor() {\r\n // Initialize active tab from input\r\n effect(() => {\r\n const initial = this.initialTab();\r\n if (initial) {\r\n this.activeTab.set(initial);\r\n }\r\n });\r\n }\r\n\r\n // ============ COMPUTED ============\r\n\r\n /** Filtered categories based on search */\r\n readonly filteredCategories = computed(() => {\r\n const query = this.searchQuery().toLowerCase();\r\n const categories = this.functionCategories();\r\n if (!query) return categories;\r\n\r\n return categories\r\n .map((cat) => ({\r\n ...cat,\r\n functions: cat.functions.filter(\r\n (fn) =>\r\n fn.name.toLowerCase().includes(query) ||\r\n fn.description.toLowerCase().includes(query),\r\n ),\r\n }))\r\n .filter((cat) => cat.functions.length > 0);\r\n });\r\n\r\n /** Filtered properties based on search */\r\n readonly filteredProperties = computed(() => {\r\n const query = this.searchQuery().toLowerCase();\r\n const props = this.knownProperties();\r\n if (!query) return props;\r\n return props.filter((p) => p.toLowerCase().includes(query));\r\n });\r\n\r\n /** Filtered operators based on search */\r\n readonly filteredOperators = computed(() => {\r\n const query = this.searchQuery().toLowerCase();\r\n const ops = this.operators();\r\n if (!query) return ops;\r\n return ops.filter(\r\n (op) =>\r\n op.symbol.toLowerCase().includes(query) ||\r\n op.name.toLowerCase().includes(query) ||\r\n op.description.toLowerCase().includes(query),\r\n );\r\n });\r\n\r\n /** Count of filtered items per tab */\r\n readonly filteredFunctionsCount = computed(() =>\r\n this.filteredCategories().reduce(\r\n (sum, cat) => sum + cat.functions.length,\r\n 0,\r\n ),\r\n );\r\n\r\n readonly filteredPropertiesCount = computed(\r\n () => this.filteredProperties().length,\r\n );\r\n\r\n readonly filteredOperatorsCount = computed(\r\n () => this.filteredOperators().length,\r\n );\r\n\r\n /** Smart search effect - switches to tab with results */\r\n private readonly smartSearchEffect = effect(() => {\r\n const query = this.searchQuery();\r\n if (!query || query.length < 2) return;\r\n\r\n const currentTab = this.activeTab();\r\n const functionsCount = this.filteredFunctionsCount();\r\n const propertiesCount = this.filteredPropertiesCount();\r\n const operatorsCount = this.filteredOperatorsCount();\r\n\r\n // Check if current tab has results\r\n const currentHasResults =\r\n (currentTab === 'functions' && functionsCount > 0) ||\r\n (currentTab === 'properties' && propertiesCount > 0) ||\r\n (currentTab === 'operators' && operatorsCount > 0);\r\n\r\n // If current tab has no results, switch to first tab with results\r\n if (!currentHasResults) {\r\n if (functionsCount > 0) {\r\n this.activeTab.set('functions');\r\n } else if (propertiesCount > 0) {\r\n this.activeTab.set('properties');\r\n } else if (operatorsCount > 0) {\r\n this.activeTab.set('operators');\r\n }\r\n }\r\n });\r\n\r\n /** Group operators by type */\r\n readonly operatorGroups = computed((): OperatorGroup[] => {\r\n const ops = this.filteredOperators();\r\n const groups = new Map<string, OperatorDefinition[]>();\r\n\r\n ops.forEach((op) => {\r\n const type = op.type || 'other';\r\n if (!groups.has(type)) {\r\n groups.set(type, []);\r\n }\r\n groups.get(type)!.push(op);\r\n });\r\n\r\n return Array.from(groups.entries()).map(([type, operators]) => ({\r\n type: type.charAt(0).toUpperCase() + type.slice(1),\r\n operators,\r\n }));\r\n });\r\n\r\n /** Total item count for current tab */\r\n readonly itemCount = computed(() => {\r\n switch (this.activeTab()) {\r\n case 'functions':\r\n return this.filteredCategories().reduce(\r\n (sum, cat) => sum + cat.functions.length,\r\n 0,\r\n );\r\n case 'properties':\r\n return this.filteredProperties().length;\r\n case 'operators':\r\n return this.filteredOperators().length;\r\n default:\r\n return 0;\r\n }\r\n });\r\n\r\n // ============ COMPUTED LABELS ============\r\n\r\n readonly labelFunctions = computed(\r\n () => this.labels()?.functions ?? 'Functions',\r\n );\r\n readonly labelProperties = computed(\r\n () => this.labels()?.properties ?? 'Properties',\r\n );\r\n readonly labelOperators = computed(\r\n () => this.labels()?.operators ?? 'Operators',\r\n );\r\n readonly labelNoFunctions = computed(\r\n () => this.labels()?.noFunctionsFound ?? 'No functions found',\r\n );\r\n readonly labelNoProperties = computed(\r\n () => this.labels()?.noPropertiesAvailable ?? 'No properties available',\r\n );\r\n readonly labelNoOperators = computed(\r\n () => this.labels()?.noOperatorsFound ?? 'No operators found',\r\n );\r\n\r\n // ============ METHODS ============\r\n\r\n /** Get count for a specific tab (filtered when searching) */\r\n getTabCount(tab: ToolbarTab): number {\r\n const query = this.searchQuery();\r\n if (query) {\r\n // When searching, show filtered count\r\n switch (tab) {\r\n case 'functions':\r\n return this.filteredFunctionsCount();\r\n case 'properties':\r\n return this.filteredPropertiesCount();\r\n case 'operators':\r\n return this.filteredOperatorsCount();\r\n default:\r\n return 0;\r\n }\r\n } else {\r\n // When not searching, show total count\r\n switch (tab) {\r\n case 'functions':\r\n return this.functionCategories().reduce(\r\n (sum, cat) => sum + cat.functions.length,\r\n 0,\r\n );\r\n case 'properties':\r\n return this.knownProperties().length;\r\n case 'operators':\r\n return this.operators().length;\r\n default:\r\n return 0;\r\n }\r\n }\r\n }\r\n\r\n /** Check if a tab has results when searching */\r\n tabHasResults(tab: ToolbarTab): boolean {\r\n return this.getTabCount(tab) > 0;\r\n }\r\n\r\n /** Set active tab */\r\n setActiveTab(tab: ToolbarTab): void {\r\n this.activeTab.set(tab);\r\n this.onTabChange.emit(tab);\r\n }\r\n\r\n /** Emit block insert event */\r\n insertBlock(block: SmartBlock): void {\r\n this.onBlockInsert.emit(block);\r\n }\r\n\r\n /** Clear search */\r\n clearSearch(): void {\r\n this.searchQuery.set('');\r\n }\r\n\r\n /** Insert custom value */\r\n insertCustomValue(): void {\r\n const val = this.customValue().trim();\r\n if (!val) return;\r\n\r\n const type = this.customValueType();\r\n let literalValue: string | number;\r\n\r\n if (type === 'number') {\r\n literalValue = parseFloat(val);\r\n } else if (type === 'string') {\r\n // Remove quotes for storage, keep the content\r\n literalValue = val.slice(1, -1);\r\n } else {\r\n // Treat as string, add quotes\r\n literalValue = val;\r\n }\r\n\r\n const block = createLiteralBlock(literalValue);\r\n\r\n // For strings, ensure the value includes quotes for display\r\n if (type === 'string' || type === 'text') {\r\n block.value = type === 'string' ? val : `\"${val}\"`;\r\n }\r\n\r\n this.onBlockInsert.emit(block);\r\n this.clearCustomValue();\r\n }\r\n\r\n /** Clear custom value input */\r\n clearCustomValue(): void {\r\n this.customValue.set('');\r\n }\r\n}\r\n","<div class=\"flex h-52 flex-col border-b border-slate-200 dark:border-slate-700\">\r\n <!-- Top Bar: Search + Quick Insert -->\r\n <div\r\n class=\"flex items-center gap-2 border-b border-slate-200 px-3 py-2 dark:border-slate-700\"\r\n >\r\n <!-- Search Field -->\r\n <div class=\"relative flex-1\">\r\n <svg\r\n class=\"absolute start-3 top-1/2 h-4 w-4 -translate-y-1/2 text-slate-400\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\r\n />\r\n </svg>\r\n <input\r\n type=\"text\"\r\n class=\"w-full rounded-lg border border-slate-300 bg-white py-1.5 ps-9 pe-8 text-sm text-slate-700 placeholder:text-slate-400 focus:border-primary focus:outline-none focus:ring-2 focus:ring-primary/20 transition-all duration-200 dark:border-slate-600 dark:bg-slate-900 dark:text-slate-200 dark:placeholder:text-slate-500\"\r\n [placeholder]=\"searchPlaceholder()\"\r\n [(ngModel)]=\"searchQuery\"\r\n />\r\n @if (searchQuery()) {\r\n <button\r\n type=\"button\"\r\n class=\"absolute end-2 top-1/2 -translate-y-1/2 rounded p-0.5 text-slate-400 hover:bg-slate-200 hover:text-slate-600 transition-all duration-200 dark:hover:bg-slate-700\"\r\n (click)=\"clearSearch()\"\r\n >\r\n <svg\r\n class=\"h-4 w-4\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M6 18L18 6M6 6l12 12\"\r\n />\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n\r\n <!-- Separator -->\r\n <div class=\"h-6 w-px bg-slate-200 dark:bg-slate-600\"></div>\r\n\r\n <!-- Quick Insert Input -->\r\n <div class=\"relative flex items-center gap-2\">\r\n <span\r\n class=\"text-sm font-medium text-slate-500 dark:text-slate-400 uppercase tracking-wide\"\r\n >Insert:</span\r\n >\r\n <div class=\"relative\">\r\n <input\r\n #customValueInput\r\n type=\"text\"\r\n class=\"w-32 rounded-md border border-dashed border-slate-300 bg-slate-50 px-3 py-1.5 text-sm font-mono text-slate-700 placeholder:text-slate-400 focus:border-primary focus:bg-white focus:outline-none focus:ring-2 focus:ring-primary/20 transition-all duration-200 dark:border-slate-600 dark:bg-slate-800 dark:text-slate-200 dark:placeholder:text-slate-500 dark:focus:bg-slate-900\"\r\n placeholder='123 or \"text\"'\r\n [(ngModel)]=\"customValue\"\r\n (keydown.enter)=\"insertCustomValue()\"\r\n (keydown.escape)=\"clearCustomValue()\"\r\n />\r\n </div>\r\n\r\n <!-- Insert Button with Type Preview -->\r\n @if (customValue()) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium transition-all duration-200 hover:shadow-sm active:scale-95\"\r\n [class]=\"customValueTypeClass()\"\r\n (click)=\"insertCustomValue()\"\r\n [title]=\"'Insert ' + customValueType() + ' (Enter)'\"\r\n >\r\n @switch (customValueType()) {\r\n @case (\"number\") {\r\n <svg\r\n class=\"h-3 w-3\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M7 20l4-16m2 16l4-16M6 9h14M4 15h14\"\r\n />\r\n </svg>\r\n }\r\n @case (\"string\") {\r\n <svg\r\n class=\"h-3 w-3\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M7.5 8.25h9m-9 3H12m-9.75 1.51c0 1.6 1.123 2.994 2.707 3.227 1.129.166 2.27.293 3.423.379.35.026.67.21.865.501L12 21l2.755-4.133a1.14 1.14 0 01.865-.501 48.172 48.172 0 003.423-.379c1.584-.233 2.707-1.626 2.707-3.228V6.741c0-1.602-1.123-2.995-2.707-3.228A48.394 48.394 0 0012 3c-2.392 0-4.744.175-7.043.513C3.373 3.746 2.25 5.14 2.25 6.741v6.018z\"\r\n />\r\n </svg>\r\n }\r\n @default {\r\n <svg\r\n class=\"h-3 w-3\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M12 4.5v15m7.5-7.5h-15\"\r\n />\r\n </svg>\r\n }\r\n }\r\n <span class=\"max-w-16 truncate\">{{ customValuePreview() }}</span>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Row -->\r\n <div class=\"flex flex-1 overflow-hidden\">\r\n <!-- Vertical Tabs -->\r\n <div\r\n class=\"flex w-44 flex-col border-e border-slate-200 dark:border-slate-700\"\r\n >\r\n @for (tab of tabOptions; track tab.value) {\r\n <button\r\n type=\"button\"\r\n class=\"flex cursor-pointer items-center gap-2 px-3 py-2.5 text-start text-sm font-medium transition-all duration-200\"\r\n [class]=\"\r\n activeTab() === tab.value\r\n ? 'bg-white border-e-2 border-primary text-primary dark:bg-slate-900'\r\n : searchQuery() && !tabHasResults(tab.value)\r\n ? 'text-slate-300 dark:text-slate-600'\r\n : 'text-slate-600 hover:bg-slate-100 hover:text-slate-800 dark:text-slate-300 dark:hover:bg-slate-700'\r\n \"\r\n (click)=\"setActiveTab(tab.value)\"\r\n >\r\n <!-- Tab Icons -->\r\n @switch (tab.value) {\r\n @case (\"functions\") {\r\n <svg\r\n class=\"h-5 w-5 shrink-0\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M17.25 6.75L22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3l-4.5 16.5\"\r\n />\r\n </svg>\r\n }\r\n @case (\"properties\") {\r\n <svg\r\n class=\"h-5 w-5 shrink-0\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M9.568 3H5.25A2.25 2.25 0 003 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 005.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 009.568 3z\"\r\n />\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M6 6h.008v.008H6V6z\"\r\n />\r\n </svg>\r\n }\r\n @case (\"operators\") {\r\n <svg\r\n class=\"h-5 w-5 shrink-0\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M15.75 15.75V18m-7.5-6.75h.008v.008H8.25v-.008zm0 2.25h.008v.008H8.25V13.5zm0 2.25h.008v.008H8.25v-.008zm0 2.25h.008v.008H8.25V18zm2.498-6.75h.007v.008h-.007v-.008zm0 2.25h.007v.008h-.007V13.5zm0 2.25h.007v.008h-.007v-.008zm0 2.25h.007v.008h-.007V18zm2.504-6.75h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V13.5zm0 2.25h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V18zm2.498-6.75h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V13.5zM8.25 6h7.5v2.25h-7.5V6zM12 2.25c-1.892 0-3.758.11-5.593.322C5.307 2.7 4.5 3.65 4.5 4.757V19.5a2.25 2.25 0 002.25 2.25h10.5a2.25 2.25 0 002.25-2.25V4.757c0-1.108-.806-2.057-1.907-2.185A48.507 48.507 0 0012 2.25z\"\r\n />\r\n </svg>\r\n }\r\n }\r\n <!-- Label (always visible) -->\r\n <span class=\"truncate whitespace-nowrap text-sm\">{{\r\n tab.label\r\n }}</span>\r\n <!-- Count Badge -->\r\n <span\r\n class=\"ms-auto rounded-full px-1.5 py-0.5 text-xs font-semibold\"\r\n [class]=\"\r\n activeTab() === tab.value\r\n ? 'bg-primary/10 text-primary'\r\n : 'bg-slate-200 text-slate-600 dark:bg-slate-600 dark:text-slate-300'\r\n \"\r\n >\r\n {{ getTabCount(tab.value) }}\r\n </span>\r\n </button>\r\n }\r\n </div>\r\n\r\n <!-- Content Area -->\r\n <div class=\"flex flex-1 flex-col overflow-hidden\">\r\n <!-- Items Grid -->\r\n <div class=\"flex-1 overflow-y-auto p-2.5\">\r\n @switch (activeTab()) {\r\n @case (\"functions\") {\r\n @if (filteredCategories().length === 0) {\r\n <div\r\n class=\"flex h-full items-center justify-center text-sm text-slate-400 dark:text-slate-500\"\r\n >\r\n {{ labelNoFunctions() }}\r\n </div>\r\n } @else {\r\n <div class=\"space-y-3\">\r\n @for (category of filteredCategories(); track category.name) {\r\n <div>\r\n <div class=\"mb-2 flex items-center gap-2\">\r\n <span\r\n class=\"text-sm font-semibold uppercase tracking-wider text-slate-500 dark:text-slate-400\"\r\n >\r\n {{ category.name }}\r\n </span>\r\n <span\r\n class=\"h-px flex-1 bg-slate-200/60 dark:bg-slate-700/60\"\r\n ></span>\r\n <span\r\n class=\"text-sm text-slate-400 dark:text-slate-500\"\r\n >{{ category.functions.length }}</span\r\n >\r\n </div>\r\n <div class=\"flex flex-wrap gap-1.5\">\r\n @for (fn of category.functions; track fn.name) {\r\n <mt-formula-toolbar-item\r\n type=\"function\"\r\n [value]=\"fn.name\"\r\n [description]=\"fn.description\"\r\n [signature]=\"fn.signature\"\r\n (onInsert)=\"insertBlock($event)\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n @case (\"properties\") {\r\n @if (filteredProperties().length === 0) {\r\n <div\r\n class=\"flex h-full items-center justify-center text-sm text-slate-400 dark:text-slate-500\"\r\n >\r\n {{ labelNoProperties() }}\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-wrap gap-1.5\">\r\n @for (prop of filteredProperties(); track prop) {\r\n <mt-formula-toolbar-item\r\n type=\"property\"\r\n [value]=\"prop\"\r\n [description]=\"'Property: ' + prop\"\r\n propertyType=\"current\"\r\n (onInsert)=\"insertBlock($event)\"\r\n />\r\n }\r\n </div>\r\n }\r\n }\r\n @case (\"operators\") {\r\n @if (filteredOperators().length === 0) {\r\n <div\r\n class=\"flex h-full items-center justify-center text-sm text-slate-400 dark:text-slate-500\"\r\n >\r\n {{ labelNoOperators() }}\r\n </div>\r\n } @else {\r\n <div class=\"space-y-3\">\r\n @for (group of operatorGroups(); track group.type) {\r\n <div>\r\n <div class=\"mb-2 flex items-center gap-2\">\r\n <span\r\n class=\"text-sm font-semibold uppercase tracking-wider text-slate-500 dark:text-slate-400\"\r\n >\r\n {{ group.type }}\r\n </span>\r\n <span\r\n class=\"h-px flex-1 bg-slate-200/60 dark:bg-slate-700/60\"\r\n ></span>\r\n </div>\r\n <div class=\"flex flex-wrap gap-1.5\">\r\n @for (op of group.operators; track op.symbol) {\r\n <mt-formula-toolbar-item\r\n type=\"operator\"\r\n [value]=\"op.symbol\"\r\n [description]=\"op.description\"\r\n (onInsert)=\"insertBlock($event)\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","/**\r\n * Formula Status Bar Component\r\n * Displays validation status, complexity, and dependencies\r\n *\r\n * This is a PURE input/output component with NO service dependencies.\r\n */\r\n\r\nimport { Component, input, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ValidationResult } from '../models/validation-result.model';\r\n\r\n@Component({\r\n selector: 'mt-formula-status-bar',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './formula-status-bar.html',\r\n})\r\nexport class FormulaStatusBar {\r\n // ============ INPUTS ============\r\n\r\n /** Validation result */\r\n readonly validation = input<ValidationResult | null>(null);\r\n\r\n /** Labels for i18n support */\r\n readonly labels = input<{\r\n valid?: string;\r\n invalid?: string;\r\n complexity?: string;\r\n dependencies?: string;\r\n }>({});\r\n\r\n // ============ COMPUTED ============\r\n\r\n /** Is formula valid */\r\n readonly isValid = computed(() => this.validation()?.isValid ?? true);\r\n\r\n /** Complexity score */\r\n readonly complexity = computed(() => this.validation()?.complexity ?? 0);\r\n\r\n /** Dependencies list */\r\n readonly dependencies = computed(() => this.validation()?.dependencies ?? []);\r\n\r\n /** Dependencies as text */\r\n readonly dependenciesText = computed(() => {\r\n const deps = this.dependencies();\r\n if (deps.length <= 3) {\r\n return deps.join(', ');\r\n }\r\n return `${deps.slice(0, 3).join(', ')} +${deps.length - 3}`;\r\n });\r\n\r\n /** First error */\r\n readonly firstError = computed(() => this.validation()?.errors[0] ?? null);\r\n\r\n /** Complexity CSS class */\r\n readonly complexityClass = computed(() => {\r\n const c = this.complexity();\r\n if (c <= 10) return 'text-emerald-600 dark:text-emerald-400';\r\n if (c <= 25) return 'text-amber-600 dark:text-amber-400';\r\n return 'text-rose-600 dark:text-rose-400';\r\n });\r\n\r\n // ============ COMPUTED LABELS ============\r\n\r\n readonly labelValid = computed(() => this.labels()?.valid ?? 'Valid');\r\n readonly labelInvalid = computed(() => this.labels()?.invalid ?? 'Invalid');\r\n readonly labelComplexity = computed(\r\n () => this.labels()?.complexity ?? 'Complexity',\r\n );\r\n readonly labelDependencies = computed(\r\n () => this.labels()?.dependencies ?? 'Dependencies',\r\n );\r\n}\r\n","<div\r\n class=\"flex items-center gap-4 border-t border-slate-200 px-4 py-2 text-sm dark:border-slate-700\"\r\n>\r\n <!-- Validation Status -->\r\n <div class=\"flex items-center gap-1.5\">\r\n @if (isValid()) {\r\n <span\r\n class=\"flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-emerald-600 dark:bg-emerald-900 dark:text-emerald-400\"\r\n >\r\n <svg\r\n class=\"h-3.5 w-3.5\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.5\"\r\n >\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M5 13l4 4L19 7\"\r\n />\r\n </svg>\r\n </span>\r\n <span class=\"font-medium text-emerald-600 dark:text-emerald-400\">\r\n {{ labelValid() }}\r\n </span>\r\n } @else {\r\n <span\r\n class=\"flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-rose-600 dark:bg-rose-900 dark:text-rose-400\"\r\n >\r\n <svg\r\n class=\"h-3.5 w-3.5\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.5\"\r\n >\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M6 18L18 6M6 6l12 12\"\r\n />\r\n </svg>\r\n </span>\r\n <span class=\"font-medium text-rose-600 dark:text-rose-400\">\r\n {{ labelInvalid() }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <!-- Separator -->\r\n <div class=\"h-4 w-px bg-slate-300 dark:bg-slate-600\"></div>\r\n\r\n <!-- Complexity -->\r\n <div class=\"flex items-center gap-1.5 text-slate-500 dark:text-slate-400\">\r\n <svg class=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"2\"\r\n d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\"\r\n />\r\n </svg>\r\n <span>{{ labelComplexity() }}:</span>\r\n <span class=\"font-medium\" [class]=\"complexityClass()\">\r\n {{ complexity() }}\r\n </span>\r\n </div>\r\n\r\n <!-- Dependencies -->\r\n @if (dependencies().length > 0) {\r\n <div class=\"h-4 w-px bg-slate-300 dark:bg-slate-600\"></div>\r\n <div class=\"flex items-center gap-1.5 text-slate-500 dark:text-slate-400\">\r\n <svg\r\n class=\"h-4 w-4\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"2\"\r\n d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\"\r\n />\r\n </svg>\r\n <span>{{ labelDependencies() }}:</span>\r\n <span class=\"font-medium text-slate-700 dark:text-slate-300\">\r\n {{ dependenciesText() }}\r\n </span>\r\n </div>\r\n }\r\n\r\n <!-- Error message (if any) -->\r\n @if (firstError(); as error) {\r\n <div\r\n class=\"ms-auto flex items-center gap-1.5 text-rose-600 dark:text-rose-400\"\r\n >\r\n <svg\r\n class=\"h-4 w-4\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"2\"\r\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\r\n />\r\n </svg>\r\n <span class=\"text-xs\">{{ error.message }}</span>\r\n <span class=\"text-xs opacity-60\"\r\n >({{ error.line }}:{{ error.column }})</span\r\n >\r\n </div>\r\n }\r\n</div>\r\n","// Formula components public API\r\nexport * from './models';\r\nexport * from './editor';\r\nexport * from './toolbar';\r\nexport * from './toolbar-item';\r\nexport * from './status-bar';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ class ModuleSummaryCard {
|
|
|
17
17
|
showButton = input(true, { ...(ngDevMode ? { debugName: "showButton" } : {}), transform: booleanAttribute });
|
|
18
18
|
onButtonClick = output();
|
|
19
19
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: ModuleSummaryCard, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
20
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: ModuleSummaryCard, isStandalone: true, selector: "mt-module-summary-card", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, buttonLabel: { classPropertyName: "buttonLabel", publicName: "buttonLabel", isSignal: true, isRequired: false, transformFunction: null }, showToggle: { classPropertyName: "showToggle", publicName: "showToggle", isSignal: true, isRequired: false, transformFunction: null }, showButton: { classPropertyName: "showButton", publicName: "showButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { active: "activeChange", onButtonClick: "onButtonClick" }, ngImport: i0, template: "<mt-card headless class=\"h-full\">\r\n <div class=\"content flex flex-col gap-5 items-center text-center h-full\">\r\n @if (showToggle()) {\r\n <div class=\"flex justify-end w-full\">\r\n <mt-toggle-field [(ngModel)]=\"active\" />\r\n </div>\r\n }\r\n @if (icon()) {\r\n <mt-avatar\r\n style=\"\r\n --p-avatar-background: var(--p-primary-50);\r\n --p-avatar-color: var(--p-primary-color);\r\n \"\r\n [icon]=\"icon()\"\r\n size=\"large\"\r\n shape=\"square\"\r\n ></mt-avatar>\r\n }\r\n <div class=\"flex flex-col gap-1\">\r\n @if (title()) {\r\n <div class=\"title text-lg font-semibold\">\r\n {{ title() }}\r\n </div>\r\n }\r\n @if (description()) {\r\n <div\r\n class=\"description text-sm text-muted-foreground secondary text-surface-500\"\r\n >\r\n {{ description() }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"grow flex flex-col justify-end\">\r\n @if (showButton()) {\r\n <mt-button\r\n label=\"{{ buttonLabel() }}\"\r\n (onClick)=\"onButtonClick.emit($event)\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n</mt-card>\r\n", styles: [""], dependencies: [{ kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required"], outputs: ["onChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
20
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: ModuleSummaryCard, isStandalone: true, selector: "mt-module-summary-card", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, buttonLabel: { classPropertyName: "buttonLabel", publicName: "buttonLabel", isSignal: true, isRequired: false, transformFunction: null }, showToggle: { classPropertyName: "showToggle", publicName: "showToggle", isSignal: true, isRequired: false, transformFunction: null }, showButton: { classPropertyName: "showButton", publicName: "showButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { active: "activeChange", onButtonClick: "onButtonClick" }, ngImport: i0, template: "<mt-card headless class=\"h-full\">\r\n <div class=\"content flex flex-col gap-5 items-center text-center h-full\">\r\n @if (showToggle()) {\r\n <div class=\"flex justify-end w-full\">\r\n <mt-toggle-field [(ngModel)]=\"active\" />\r\n </div>\r\n }\r\n @if (icon()) {\r\n <mt-avatar\r\n style=\"\r\n --p-avatar-background: var(--p-primary-50);\r\n --p-avatar-color: var(--p-primary-color);\r\n \"\r\n [icon]=\"icon()\"\r\n size=\"large\"\r\n shape=\"square\"\r\n ></mt-avatar>\r\n }\r\n <div class=\"flex flex-col gap-1\">\r\n @if (title()) {\r\n <div class=\"title text-lg font-semibold\">\r\n {{ title() }}\r\n </div>\r\n }\r\n @if (description()) {\r\n <div\r\n class=\"description text-sm text-muted-foreground secondary text-surface-500\"\r\n >\r\n {{ description() }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"grow flex flex-col justify-end\">\r\n @if (showButton()) {\r\n <mt-button\r\n label=\"{{ buttonLabel() }}\"\r\n (onClick)=\"onButtonClick.emit($event)\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n</mt-card>\r\n", styles: [""], dependencies: [{ kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "icon", "descriptionCard"], outputs: ["onChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
21
21
|
}
|
|
22
22
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: ModuleSummaryCard, decorators: [{
|
|
23
23
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-module-summary-card.mjs","sources":["../../../../packages/masterteam/components/module-summary-card/module-summary-card.ts","../../../../packages/masterteam/components/module-summary-card/module-summary-card.html","../../../../packages/masterteam/components/module-summary-card/masterteam-components-module-summary-card.ts"],"sourcesContent":["import {\r\n Component,\r\n input,\r\n model,\r\n output,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MTIcon } from '@masterteam/icons';\r\n\r\n@Component({\r\n selector: 'mt-module-summary-card',\r\n standalone: true,\r\n templateUrl: './module-summary-card.html',\r\n styleUrl: './module-summary-card.scss',\r\n imports: [Card, Button, Avatar, ToggleField, FormsModule],\r\n})\r\nexport class ModuleSummaryCard {\r\n readonly icon = input<MTIcon>();\r\n readonly title = input<string>();\r\n readonly description = input<string>();\r\n readonly active = model<boolean>(false);\r\n readonly buttonLabel = input<string>('Action');\r\n readonly showToggle = input<boolean, unknown>(true, {\r\n transform: booleanAttribute,\r\n });\r\n readonly showButton = input<boolean, unknown>(true, {\r\n transform: booleanAttribute,\r\n });\r\n readonly onButtonClick = output<MouseEvent>();\r\n}\r\n","<mt-card headless class=\"h-full\">\r\n <div class=\"content flex flex-col gap-5 items-center text-center h-full\">\r\n @if (showToggle()) {\r\n <div class=\"flex justify-end w-full\">\r\n <mt-toggle-field [(ngModel)]=\"active\" />\r\n </div>\r\n }\r\n @if (icon()) {\r\n <mt-avatar\r\n style=\"\r\n --p-avatar-background: var(--p-primary-50);\r\n --p-avatar-color: var(--p-primary-color);\r\n \"\r\n [icon]=\"icon()\"\r\n size=\"large\"\r\n shape=\"square\"\r\n ></mt-avatar>\r\n }\r\n <div class=\"flex flex-col gap-1\">\r\n @if (title()) {\r\n <div class=\"title text-lg font-semibold\">\r\n {{ title() }}\r\n </div>\r\n }\r\n @if (description()) {\r\n <div\r\n class=\"description text-sm text-muted-foreground secondary text-surface-500\"\r\n >\r\n {{ description() }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"grow flex flex-col justify-end\">\r\n @if (showButton()) {\r\n <mt-button\r\n label=\"{{ buttonLabel() }}\"\r\n (onClick)=\"onButtonClick.emit($event)\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n</mt-card>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"masterteam-components-module-summary-card.mjs","sources":["../../../../packages/masterteam/components/module-summary-card/module-summary-card.ts","../../../../packages/masterteam/components/module-summary-card/module-summary-card.html","../../../../packages/masterteam/components/module-summary-card/masterteam-components-module-summary-card.ts"],"sourcesContent":["import {\r\n Component,\r\n input,\r\n model,\r\n output,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MTIcon } from '@masterteam/icons';\r\n\r\n@Component({\r\n selector: 'mt-module-summary-card',\r\n standalone: true,\r\n templateUrl: './module-summary-card.html',\r\n styleUrl: './module-summary-card.scss',\r\n imports: [Card, Button, Avatar, ToggleField, FormsModule],\r\n})\r\nexport class ModuleSummaryCard {\r\n readonly icon = input<MTIcon>();\r\n readonly title = input<string>();\r\n readonly description = input<string>();\r\n readonly active = model<boolean>(false);\r\n readonly buttonLabel = input<string>('Action');\r\n readonly showToggle = input<boolean, unknown>(true, {\r\n transform: booleanAttribute,\r\n });\r\n readonly showButton = input<boolean, unknown>(true, {\r\n transform: booleanAttribute,\r\n });\r\n readonly onButtonClick = output<MouseEvent>();\r\n}\r\n","<mt-card headless class=\"h-full\">\r\n <div class=\"content flex flex-col gap-5 items-center text-center h-full\">\r\n @if (showToggle()) {\r\n <div class=\"flex justify-end w-full\">\r\n <mt-toggle-field [(ngModel)]=\"active\" />\r\n </div>\r\n }\r\n @if (icon()) {\r\n <mt-avatar\r\n style=\"\r\n --p-avatar-background: var(--p-primary-50);\r\n --p-avatar-color: var(--p-primary-color);\r\n \"\r\n [icon]=\"icon()\"\r\n size=\"large\"\r\n shape=\"square\"\r\n ></mt-avatar>\r\n }\r\n <div class=\"flex flex-col gap-1\">\r\n @if (title()) {\r\n <div class=\"title text-lg font-semibold\">\r\n {{ title() }}\r\n </div>\r\n }\r\n @if (description()) {\r\n <div\r\n class=\"description text-sm text-muted-foreground secondary text-surface-500\"\r\n >\r\n {{ description() }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"grow flex flex-col justify-end\">\r\n @if (showButton()) {\r\n <mt-button\r\n label=\"{{ buttonLabel() }}\"\r\n (onClick)=\"onButtonClick.emit($event)\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n</mt-card>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -27,11 +27,11 @@ class PageHeader {
|
|
|
27
27
|
}, ...(ngDevMode ? [{ debugName: "backIcon" }] : []));
|
|
28
28
|
hasTabs = computed(() => this.tabs().length > 0, ...(ngDevMode ? [{ debugName: "hasTabs" }] : []));
|
|
29
29
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PageHeader, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
30
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: PageHeader, isStandalone: true, selector: "mt-page-header", inputs: { backButton: { classPropertyName: "backButton", publicName: "backButton", isSignal: true, isRequired: false, transformFunction: null }, backButtonIcon: { classPropertyName: "backButtonIcon", publicName: "backButtonIcon", isSignal: true, isRequired: false, transformFunction: null }, avatarIcon: { classPropertyName: "avatarIcon", publicName: "avatarIcon", isSignal: true, isRequired: false, transformFunction: null }, avatarStyle: { classPropertyName: "avatarStyle", publicName: "avatarStyle", isSignal: true, isRequired: false, transformFunction: null }, avatarShape: { classPropertyName: "avatarShape", publicName: "avatarShape", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: false, transformFunction: null }, activeTab: { classPropertyName: "activeTab", publicName: "activeTab", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { backButtonClick: "backButtonClick", tabChange: "tabChange" }, queries: [{ propertyName: "titleEnd", first: true, predicate: ["titleEnd"], descendants: true, isSignal: true }, { propertyName: "headerEnd", first: true, predicate: ["headerEnd"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\r\n class=\"grid grid-cols-3 bg-content items-center p-3 border-b border-surface min-h-18.5\"\r\n>\r\n <div class=\"flex gap-2 items-center\">\r\n @if (backButton()) {\r\n <mt-button\r\n [text]=\"true\"\r\n [icon]=\"backIcon()\"\r\n size=\"large\"\r\n (click)=\"backButtonClick.emit()\"\r\n >\r\n </mt-button>\r\n }\r\n\r\n @if (avatarIcon()) {\r\n <mt-avatar\r\n [icon]=\"avatarIcon()\"\r\n [shape]=\"avatarShape()\"\r\n [style]=\"avatarStyle()\"\r\n >\r\n </mt-avatar>\r\n }\r\n\r\n <h3 class=\"font-bold text-
|
|
30
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: PageHeader, isStandalone: true, selector: "mt-page-header", inputs: { backButton: { classPropertyName: "backButton", publicName: "backButton", isSignal: true, isRequired: false, transformFunction: null }, backButtonIcon: { classPropertyName: "backButtonIcon", publicName: "backButtonIcon", isSignal: true, isRequired: false, transformFunction: null }, avatarIcon: { classPropertyName: "avatarIcon", publicName: "avatarIcon", isSignal: true, isRequired: false, transformFunction: null }, avatarStyle: { classPropertyName: "avatarStyle", publicName: "avatarStyle", isSignal: true, isRequired: false, transformFunction: null }, avatarShape: { classPropertyName: "avatarShape", publicName: "avatarShape", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: false, transformFunction: null }, activeTab: { classPropertyName: "activeTab", publicName: "activeTab", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { backButtonClick: "backButtonClick", tabChange: "tabChange" }, queries: [{ propertyName: "titleEnd", first: true, predicate: ["titleEnd"], descendants: true, isSignal: true }, { propertyName: "headerEnd", first: true, predicate: ["headerEnd"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\r\n class=\"grid grid-cols-3 bg-content items-center p-3 border-b border-surface min-h-18.5\"\r\n>\r\n <div class=\"flex gap-2 items-center\">\r\n @if (backButton()) {\r\n <mt-button\r\n [text]=\"true\"\r\n [icon]=\"backIcon()\"\r\n size=\"large\"\r\n (click)=\"backButtonClick.emit()\"\r\n >\r\n </mt-button>\r\n }\r\n\r\n @if (avatarIcon()) {\r\n <mt-avatar\r\n [icon]=\"avatarIcon()\"\r\n [shape]=\"avatarShape()\"\r\n [style]=\"avatarStyle()\"\r\n >\r\n </mt-avatar>\r\n }\r\n\r\n <h3 class=\"font-bold text-lg\">{{ title() }}</h3>\r\n\r\n @if (titleEnd(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n }\r\n </div>\r\n\r\n <div class=\"justify-self-center\">\r\n @if (hasTabs()) {\r\n <mt-tabs\r\n [options]=\"tabs()\"\r\n [active]=\"activeTab()\"\r\n size=\"large\"\r\n (onChange)=\"tabChange.emit($event)\"\r\n >\r\n </mt-tabs>\r\n }\r\n </div>\r\n\r\n <div class=\"justify-self-end\">\r\n @if (headerEnd(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n }\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Tabs, selector: "mt-tabs", inputs: ["options", "optionLabel", "optionValue", "active", "size", "fluid", "disabled"], outputs: ["activeChange", "onChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
31
31
|
}
|
|
32
32
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PageHeader, decorators: [{
|
|
33
33
|
type: Component,
|
|
34
|
-
args: [{ selector: 'mt-page-header', standalone: true, imports: [Avatar, Button, Tabs, NgTemplateOutlet], template: "<div\r\n class=\"grid grid-cols-3 bg-content items-center p-3 border-b border-surface min-h-18.5\"\r\n>\r\n <div class=\"flex gap-2 items-center\">\r\n @if (backButton()) {\r\n <mt-button\r\n [text]=\"true\"\r\n [icon]=\"backIcon()\"\r\n size=\"large\"\r\n (click)=\"backButtonClick.emit()\"\r\n >\r\n </mt-button>\r\n }\r\n\r\n @if (avatarIcon()) {\r\n <mt-avatar\r\n [icon]=\"avatarIcon()\"\r\n [shape]=\"avatarShape()\"\r\n [style]=\"avatarStyle()\"\r\n >\r\n </mt-avatar>\r\n }\r\n\r\n <h3 class=\"font-bold text-
|
|
34
|
+
args: [{ selector: 'mt-page-header', standalone: true, imports: [Avatar, Button, Tabs, NgTemplateOutlet], template: "<div\r\n class=\"grid grid-cols-3 bg-content items-center p-3 border-b border-surface min-h-18.5\"\r\n>\r\n <div class=\"flex gap-2 items-center\">\r\n @if (backButton()) {\r\n <mt-button\r\n [text]=\"true\"\r\n [icon]=\"backIcon()\"\r\n size=\"large\"\r\n (click)=\"backButtonClick.emit()\"\r\n >\r\n </mt-button>\r\n }\r\n\r\n @if (avatarIcon()) {\r\n <mt-avatar\r\n [icon]=\"avatarIcon()\"\r\n [shape]=\"avatarShape()\"\r\n [style]=\"avatarStyle()\"\r\n >\r\n </mt-avatar>\r\n }\r\n\r\n <h3 class=\"font-bold text-lg\">{{ title() }}</h3>\r\n\r\n @if (titleEnd(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n }\r\n </div>\r\n\r\n <div class=\"justify-self-center\">\r\n @if (hasTabs()) {\r\n <mt-tabs\r\n [options]=\"tabs()\"\r\n [active]=\"activeTab()\"\r\n size=\"large\"\r\n (onChange)=\"tabChange.emit($event)\"\r\n >\r\n </mt-tabs>\r\n }\r\n </div>\r\n\r\n <div class=\"justify-self-end\">\r\n @if (headerEnd(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n }\r\n </div>\r\n</div>\r\n" }]
|
|
35
35
|
}], propDecorators: { backButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "backButton", required: false }] }], backButtonIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "backButtonIcon", required: false }] }], avatarIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarIcon", required: false }] }], avatarStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarStyle", required: false }] }], avatarShape: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarShape", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], tabs: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabs", required: false }] }], activeTab: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeTab", required: false }] }], titleEnd: [{ type: i0.ContentChild, args: ['titleEnd', { isSignal: true }] }], headerEnd: [{ type: i0.ContentChild, args: ['headerEnd', { isSignal: true }] }], backButtonClick: [{ type: i0.Output, args: ["backButtonClick"] }], tabChange: [{ type: i0.Output, args: ["tabChange"] }] } });
|
|
36
36
|
|
|
37
37
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-page-header.mjs","sources":["../../../../packages/masterteam/components/page-header/page-header.ts","../../../../packages/masterteam/components/page-header/page-header.html","../../../../packages/masterteam/components/page-header/masterteam-components-page-header.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n Component,\r\n input,\r\n output,\r\n computed,\r\n contentChild,\r\n TemplateRef,\r\n signal,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { MTIcon } from '@masterteam/icons';\r\n\r\nexport interface PageHeaderTab {\r\n label: string;\r\n value: string | number;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-page-header',\r\n standalone: true,\r\n imports: [Avatar, Button, Tabs, NgTemplateOutlet],\r\n templateUrl: './page-header.html',\r\n})\r\nexport class PageHeader {\r\n backButton = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n backButtonIcon = input<'arrow' | 'close'>('arrow');\r\n avatarIcon = input<MTIcon>();\r\n avatarStyle = input<Record<string, string>>({});\r\n avatarShape = input<'circle' | 'square'>('square');\r\n title = input.required<string>();\r\n tabs = input<PageHeaderTab[]>([]);\r\n activeTab = input<string | number>();\r\n\r\n titleEnd = contentChild<TemplateRef<any>>('titleEnd');\r\n headerEnd = contentChild<TemplateRef<any>>('headerEnd');\r\n\r\n backButtonClick = output<void>();\r\n tabChange = output<string | number>();\r\n\r\n rtl = signal<boolean>(document.documentElement.dir === 'rtl');\r\n\r\n backIcon = computed(() => {\r\n if (this.backButtonIcon() === 'close') {\r\n return 'general.x-close';\r\n }\r\n return this.rtl() ? 'arrow.arrow-narrow-right' : 'arrow.arrow-narrow-left';\r\n });\r\n\r\n hasTabs = computed(() => this.tabs().length > 0);\r\n}\r\n","<div\r\n class=\"grid grid-cols-3 bg-content items-center p-3 border-b border-surface min-h-18.5\"\r\n>\r\n <div class=\"flex gap-2 items-center\">\r\n @if (backButton()) {\r\n <mt-button\r\n [text]=\"true\"\r\n [icon]=\"backIcon()\"\r\n size=\"large\"\r\n (click)=\"backButtonClick.emit()\"\r\n >\r\n </mt-button>\r\n }\r\n\r\n @if (avatarIcon()) {\r\n <mt-avatar\r\n [icon]=\"avatarIcon()\"\r\n [shape]=\"avatarShape()\"\r\n [style]=\"avatarStyle()\"\r\n >\r\n </mt-avatar>\r\n }\r\n\r\n <h3 class=\"font-bold text-
|
|
1
|
+
{"version":3,"file":"masterteam-components-page-header.mjs","sources":["../../../../packages/masterteam/components/page-header/page-header.ts","../../../../packages/masterteam/components/page-header/page-header.html","../../../../packages/masterteam/components/page-header/masterteam-components-page-header.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n Component,\r\n input,\r\n output,\r\n computed,\r\n contentChild,\r\n TemplateRef,\r\n signal,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { MTIcon } from '@masterteam/icons';\r\n\r\nexport interface PageHeaderTab {\r\n label: string;\r\n value: string | number;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-page-header',\r\n standalone: true,\r\n imports: [Avatar, Button, Tabs, NgTemplateOutlet],\r\n templateUrl: './page-header.html',\r\n})\r\nexport class PageHeader {\r\n backButton = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n backButtonIcon = input<'arrow' | 'close'>('arrow');\r\n avatarIcon = input<MTIcon>();\r\n avatarStyle = input<Record<string, string>>({});\r\n avatarShape = input<'circle' | 'square'>('square');\r\n title = input.required<string>();\r\n tabs = input<PageHeaderTab[]>([]);\r\n activeTab = input<string | number>();\r\n\r\n titleEnd = contentChild<TemplateRef<any>>('titleEnd');\r\n headerEnd = contentChild<TemplateRef<any>>('headerEnd');\r\n\r\n backButtonClick = output<void>();\r\n tabChange = output<string | number>();\r\n\r\n rtl = signal<boolean>(document.documentElement.dir === 'rtl');\r\n\r\n backIcon = computed(() => {\r\n if (this.backButtonIcon() === 'close') {\r\n return 'general.x-close';\r\n }\r\n return this.rtl() ? 'arrow.arrow-narrow-right' : 'arrow.arrow-narrow-left';\r\n });\r\n\r\n hasTabs = computed(() => this.tabs().length > 0);\r\n}\r\n","<div\r\n class=\"grid grid-cols-3 bg-content items-center p-3 border-b border-surface min-h-18.5\"\r\n>\r\n <div class=\"flex gap-2 items-center\">\r\n @if (backButton()) {\r\n <mt-button\r\n [text]=\"true\"\r\n [icon]=\"backIcon()\"\r\n size=\"large\"\r\n (click)=\"backButtonClick.emit()\"\r\n >\r\n </mt-button>\r\n }\r\n\r\n @if (avatarIcon()) {\r\n <mt-avatar\r\n [icon]=\"avatarIcon()\"\r\n [shape]=\"avatarShape()\"\r\n [style]=\"avatarStyle()\"\r\n >\r\n </mt-avatar>\r\n }\r\n\r\n <h3 class=\"font-bold text-lg\">{{ title() }}</h3>\r\n\r\n @if (titleEnd(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n }\r\n </div>\r\n\r\n <div class=\"justify-self-center\">\r\n @if (hasTabs()) {\r\n <mt-tabs\r\n [options]=\"tabs()\"\r\n [active]=\"activeTab()\"\r\n size=\"large\"\r\n (onChange)=\"tabChange.emit($event)\"\r\n >\r\n </mt-tabs>\r\n }\r\n </div>\r\n\r\n <div class=\"justify-self-end\">\r\n @if (headerEnd(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n }\r\n </div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-pick-list-field.mjs","sources":["../../../../packages/masterteam/components/pick-list-field/pick-list-field.ts","../../../../packages/masterteam/components/pick-list-field/pick-list-field.html","../../../../packages/masterteam/components/pick-list-field/masterteam-components-pick-list-field.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n OnInit,\r\n ViewChild,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\r\nimport { PickList, PickListModule } from 'primeng/picklist';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport { isInvalid } from '@masterteam/components';\r\n\r\n@Component({\r\n selector: 'mt-pick-list-field',\r\n templateUrl: './pick-list-field.html',\r\n styleUrls: ['./pick-list-field.scss'],\r\n imports: [PickListModule, FieldValidation],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-1',\r\n },\r\n})\r\nexport class PickListField implements ControlValueAccessor, OnInit {\r\n readonly label = input<string>();\r\n readonly class = input<string>('');\r\n readonly readonly = input<boolean>(false);\r\n readonly options = input<any[]>([]);\r\n readonly optionLabel = input<string>('label');\r\n readonly optionValue = input<string>('value');\r\n readonly sourceHeader = input<string>('Available');\r\n readonly targetHeader = input<string>('Selected');\r\n readonly showSourceControls = input<boolean>(true);\r\n readonly showTargetControls = input<boolean>(true);\r\n readonly showSourceFilter = input<boolean>(false);\r\n readonly showTargetFilter = input<boolean>(false);\r\n readonly filterBy = input<string>();\r\n readonly dataKey = input<string>();\r\n readonly filterLocale = input<string>();\r\n readonly filterMatchMode = input<\r\n | 'contains'\r\n | 'startsWith'\r\n | 'endsWith'\r\n | 'equals'\r\n | 'notEquals'\r\n | 'in'\r\n | 'lt'\r\n | 'lte'\r\n | 'gt'\r\n | 'gte'\r\n | string\r\n >('contains');\r\n readonly dragdrop = input<boolean>(false);\r\n readonly responsive = input<boolean>(true);\r\n readonly required = input<boolean>(false);\r\n\r\n @HostBinding('class') styleClass: string = '';\r\n\r\n requiredValidator = Validators.required;\r\n value = signal<any[]>([]);\r\n targetItems = signal<any[]>([]);\r\n sourceItems = signal<any[]>([]);\r\n disabled = signal<boolean>(false);\r\n\r\n private onTouched: () => void = () => {};\r\n private onModelChange: (value: any) => void = () => {};\r\n\r\n public ngControl = inject(NgControl, { self: true });\r\n\r\n isInvalid = isInvalid;\r\n\r\n private hasInitialized = false;\r\n\r\n @ViewChild('pickList') pickList?: PickList;\r\n\r\n constructor() {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n effect(() => {\r\n if (this.ngControl?.control && this.required()) {\r\n this.ngControl.control.addValidators(Validators.required);\r\n this.ngControl.control.updateValueAndValidity();\r\n }\r\n });\r\n effect(\r\n () => {\r\n this.options();\r\n if (this.hasInitialized) {\r\n this.syncLists();\r\n }\r\n },\r\n { allowSignalWrites: true },\r\n );\r\n }\r\n\r\n ngOnInit() {\r\n this.styleClass = this.class();\r\n this.syncLists();\r\n this.hasInitialized = true;\r\n }\r\n\r\n writeValue(value: any) {\r\n const nextValue = Array.isArray(value)\r\n ? [...value]\r\n : value === null || value === undefined\r\n ? []\r\n : [value];\r\n this.value.set(nextValue);\r\n this.syncLists();\r\n }\r\n\r\n registerOnChange(fn: any) {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any) {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean) {\r\n this.disabled.set(disabled);\r\n }\r\n\r\n onInteractiveChange() {\r\n this.syncFromPickList();\r\n }\r\n\r\n handleBlur() {\r\n this.onTouched();\r\n }\r\n\r\n displayLabel(item: any): string {\r\n if (item === null || item === undefined) {\r\n return '';\r\n }\r\n if (typeof item === 'string' || typeof item === 'number') {\r\n return String(item);\r\n }\r\n const labelKey = this.optionLabel();\r\n if (labelKey && item[labelKey] !== undefined) {\r\n return item[labelKey];\r\n }\r\n return JSON.stringify(item);\r\n }\r\n\r\n private syncLists() {\r\n const currentValue = this.value();\r\n const targetOptions = this.normalizeValueToOptions(currentValue);\r\n this.targetItems.set(targetOptions);\r\n this.updateSourceFromTarget(targetOptions);\r\n }\r\n\r\n private syncFromPickList() {\r\n const pickListInstance = this.pickList;\r\n if (!pickListInstance) {\r\n return;\r\n }\r\n const currentTarget = [...(pickListInstance.target() ?? [])];\r\n const currentSource = [...(pickListInstance.source() ?? [])];\r\n this.targetItems.set(currentTarget);\r\n this.sourceItems.set(currentSource);\r\n\r\n const newValue = this.extractValues(currentTarget);\r\n this.value.set(newValue);\r\n this.onModelChange(newValue);\r\n this.onTouched();\r\n }\r\n\r\n private normalizeValueToOptions(value: any[]): any[] {\r\n if (!Array.isArray(value)) {\r\n return [];\r\n }\r\n return value\r\n .map((entry) => this.findOption(entry) ?? entry)\r\n .filter((item) => item !== undefined && item !== null);\r\n }\r\n\r\n private extractValues(items: any[]): any[] {\r\n const optionValueKey = this.optionValue();\r\n if (!optionValueKey) {\r\n return items ?? [];\r\n }\r\n const values: any[] = [];\r\n (items ?? []).forEach((item) => {\r\n if (item && typeof item === 'object') {\r\n values.push(item[optionValueKey] ?? item);\r\n } else {\r\n values.push(item);\r\n }\r\n });\r\n return values;\r\n }\r\n\r\n private updateSourceFromTarget(targetItems: any[]) {\r\n const options = this.options() ?? [];\r\n const targetIds = new Set(\r\n (targetItems ?? []).map((item) => this.getIdentifier(item)),\r\n );\r\n const newSource = options.filter(\r\n (option) => !targetIds.has(this.getIdentifier(option)),\r\n );\r\n this.sourceItems.set(newSource);\r\n }\r\n\r\n private getIdentifier(item: any): any {\r\n if (item === null || item === undefined) {\r\n return item;\r\n }\r\n const optionValueKey = this.optionValue();\r\n if (!optionValueKey) {\r\n return item;\r\n }\r\n if (typeof item === 'object') {\r\n return item[optionValueKey];\r\n }\r\n return item;\r\n }\r\n\r\n private findOption(entry: any): any | undefined {\r\n const options = this.options() ?? [];\r\n const entryId = this.getIdentifier(entry);\r\n return options.find((option) => this.getIdentifier(option) === entryId);\r\n }\r\n}\r\n","@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<p-pickList\r\n #pickList\r\n [source]=\"sourceItems()\"\r\n [target]=\"targetItems()\"\r\n (onMoveToTarget)=\"onInteractiveChange()\"\r\n (onMoveToSource)=\"onInteractiveChange()\"\r\n (onMoveAllToTarget)=\"onInteractiveChange()\"\r\n (onMoveAllToSource)=\"onInteractiveChange()\"\r\n (onTargetReorder)=\"onInteractiveChange()\"\r\n (onSourceReorder)=\"onInteractiveChange()\"\r\n (onBlur)=\"handleBlur()\"\r\n [filterBy]=\"filterBy() || optionLabel()\"\r\n [showSourceControls]=\"showSourceControls()\"\r\n [showTargetControls]=\"showTargetControls()\"\r\n [showSourceFilter]=\"showSourceFilter()\"\r\n [showTargetFilter]=\"showTargetFilter()\"\r\n [sourceHeader]=\"sourceHeader()\"\r\n [targetHeader]=\"targetHeader()\"\r\n [dragdrop]=\"dragdrop()\"\r\n [responsive]=\"responsive()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n [styleClass]=\"'w-full relative'\"\r\n [class.p-invalid]=\"isInvalid(ngControl?.control)\"\r\n>\r\n <ng-template let-item pTemplate=\"item\">\r\n {{ displayLabel(item) }}\r\n </ng-template>\r\n</p-pickList>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"masterteam-components-pick-list-field.mjs","sources":["../../../../packages/masterteam/components/pick-list-field/pick-list-field.ts","../../../../packages/masterteam/components/pick-list-field/pick-list-field.html","../../../../packages/masterteam/components/pick-list-field/masterteam-components-pick-list-field.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n OnInit,\r\n ViewChild,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\r\nimport { PickList, PickListModule } from 'primeng/picklist';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport { isInvalid } from '@masterteam/components';\r\n\r\n@Component({\r\n selector: 'mt-pick-list-field',\r\n templateUrl: './pick-list-field.html',\r\n styleUrls: ['./pick-list-field.scss'],\r\n imports: [PickListModule, FieldValidation],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'grid gap-1',\r\n },\r\n})\r\nexport class PickListField implements ControlValueAccessor, OnInit {\r\n readonly label = input<string>();\r\n readonly class = input<string>('');\r\n readonly readonly = input<boolean>(false);\r\n readonly options = input<any[]>([]);\r\n readonly optionLabel = input<string>('label');\r\n readonly optionValue = input<string>('value');\r\n readonly sourceHeader = input<string>('Available');\r\n readonly targetHeader = input<string>('Selected');\r\n readonly showSourceControls = input<boolean>(true);\r\n readonly showTargetControls = input<boolean>(true);\r\n readonly showSourceFilter = input<boolean>(false);\r\n readonly showTargetFilter = input<boolean>(false);\r\n readonly filterBy = input<string>();\r\n readonly dataKey = input<string>();\r\n readonly filterLocale = input<string>();\r\n readonly filterMatchMode = input<\r\n | 'contains'\r\n | 'startsWith'\r\n | 'endsWith'\r\n | 'equals'\r\n | 'notEquals'\r\n | 'in'\r\n | 'lt'\r\n | 'lte'\r\n | 'gt'\r\n | 'gte'\r\n | string\r\n >('contains');\r\n readonly dragdrop = input<boolean>(false);\r\n readonly responsive = input<boolean>(true);\r\n readonly required = input<boolean>(false);\r\n\r\n @HostBinding('class') styleClass: string = '';\r\n\r\n requiredValidator = Validators.required;\r\n value = signal<any[]>([]);\r\n targetItems = signal<any[]>([]);\r\n sourceItems = signal<any[]>([]);\r\n disabled = signal<boolean>(false);\r\n\r\n private onTouched: () => void = () => {};\r\n private onModelChange: (value: any) => void = () => {};\r\n\r\n public ngControl = inject(NgControl, { self: true });\r\n\r\n isInvalid = isInvalid;\r\n\r\n private hasInitialized = false;\r\n\r\n @ViewChild('pickList') pickList?: PickList;\r\n\r\n constructor() {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n effect(() => {\r\n if (this.ngControl?.control && this.required()) {\r\n this.ngControl.control.addValidators(Validators.required);\r\n this.ngControl.control.updateValueAndValidity();\r\n }\r\n });\r\n effect(() => {\r\n this.options();\r\n if (this.hasInitialized) {\r\n this.syncLists();\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.styleClass = this.class();\r\n this.syncLists();\r\n this.hasInitialized = true;\r\n }\r\n\r\n writeValue(value: any) {\r\n const nextValue = Array.isArray(value)\r\n ? [...value]\r\n : value === null || value === undefined\r\n ? []\r\n : [value];\r\n this.value.set(nextValue);\r\n this.syncLists();\r\n }\r\n\r\n registerOnChange(fn: any) {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any) {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean) {\r\n this.disabled.set(disabled);\r\n }\r\n\r\n onInteractiveChange() {\r\n this.syncFromPickList();\r\n }\r\n\r\n handleBlur() {\r\n this.onTouched();\r\n }\r\n\r\n displayLabel(item: any): string {\r\n if (item === null || item === undefined) {\r\n return '';\r\n }\r\n if (typeof item === 'string' || typeof item === 'number') {\r\n return String(item);\r\n }\r\n const labelKey = this.optionLabel();\r\n if (labelKey && item[labelKey] !== undefined) {\r\n return item[labelKey];\r\n }\r\n return JSON.stringify(item);\r\n }\r\n\r\n private syncLists() {\r\n const currentValue = this.value();\r\n const targetOptions = this.normalizeValueToOptions(currentValue);\r\n this.targetItems.set(targetOptions);\r\n this.updateSourceFromTarget(targetOptions);\r\n }\r\n\r\n private syncFromPickList() {\r\n const pickListInstance = this.pickList;\r\n if (!pickListInstance) {\r\n return;\r\n }\r\n const currentTarget = [...(pickListInstance.target() ?? [])];\r\n const currentSource = [...(pickListInstance.source() ?? [])];\r\n this.targetItems.set(currentTarget);\r\n this.sourceItems.set(currentSource);\r\n\r\n const newValue = this.extractValues(currentTarget);\r\n this.value.set(newValue);\r\n this.onModelChange(newValue);\r\n this.onTouched();\r\n }\r\n\r\n private normalizeValueToOptions(value: any[]): any[] {\r\n if (!Array.isArray(value)) {\r\n return [];\r\n }\r\n return value\r\n .map((entry) => this.findOption(entry) ?? entry)\r\n .filter((item) => item !== undefined && item !== null);\r\n }\r\n\r\n private extractValues(items: any[]): any[] {\r\n const optionValueKey = this.optionValue();\r\n if (!optionValueKey) {\r\n return items ?? [];\r\n }\r\n const values: any[] = [];\r\n (items ?? []).forEach((item) => {\r\n if (item && typeof item === 'object') {\r\n values.push(item[optionValueKey] ?? item);\r\n } else {\r\n values.push(item);\r\n }\r\n });\r\n return values;\r\n }\r\n\r\n private updateSourceFromTarget(targetItems: any[]) {\r\n const options = this.options() ?? [];\r\n const targetIds = new Set(\r\n (targetItems ?? []).map((item) => this.getIdentifier(item)),\r\n );\r\n const newSource = options.filter(\r\n (option) => !targetIds.has(this.getIdentifier(option)),\r\n );\r\n this.sourceItems.set(newSource);\r\n }\r\n\r\n private getIdentifier(item: any): any {\r\n if (item === null || item === undefined) {\r\n return item;\r\n }\r\n const optionValueKey = this.optionValue();\r\n if (!optionValueKey) {\r\n return item;\r\n }\r\n if (typeof item === 'object') {\r\n return item[optionValueKey];\r\n }\r\n return item;\r\n }\r\n\r\n private findOption(entry: any): any | undefined {\r\n const options = this.options() ?? [];\r\n const entryId = this.getIdentifier(entry);\r\n return options.find((option) => this.getIdentifier(option) === entryId);\r\n }\r\n}\r\n","@if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<p-pickList\r\n #pickList\r\n [source]=\"sourceItems()\"\r\n [target]=\"targetItems()\"\r\n (onMoveToTarget)=\"onInteractiveChange()\"\r\n (onMoveToSource)=\"onInteractiveChange()\"\r\n (onMoveAllToTarget)=\"onInteractiveChange()\"\r\n (onMoveAllToSource)=\"onInteractiveChange()\"\r\n (onTargetReorder)=\"onInteractiveChange()\"\r\n (onSourceReorder)=\"onInteractiveChange()\"\r\n (onBlur)=\"handleBlur()\"\r\n [filterBy]=\"filterBy() || optionLabel()\"\r\n [showSourceControls]=\"showSourceControls()\"\r\n [showTargetControls]=\"showTargetControls()\"\r\n [showSourceFilter]=\"showSourceFilter()\"\r\n [showTargetFilter]=\"showTargetFilter()\"\r\n [sourceHeader]=\"sourceHeader()\"\r\n [targetHeader]=\"targetHeader()\"\r\n [dragdrop]=\"dragdrop()\"\r\n [responsive]=\"responsive()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n [styleClass]=\"'w-full relative'\"\r\n [class.p-invalid]=\"isInvalid(ngControl?.control)\"\r\n>\r\n <ng-template let-item pTemplate=\"item\">\r\n {{ displayLabel(item) }}\r\n </ng-template>\r\n</p-pickList>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|