jupiter-dynamic-forms 1.9.2 → 1.9.3

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../node_modules/@lit/reactive-element/decorators/custom-element.js","../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/@lit/reactive-element/decorators/property.js","../node_modules/@lit/reactive-element/decorators/state.js","../src/utils/validation.ts","../src/utils/xbrl-form-builder.ts","../src/core/form-field.ts","../src/core/concept-tree.ts","../src/core/add-column-dialog.ts","../src/core/form-section.ts","../src/core/filter-roles-dialog.ts","../src/core/dynamic-form.ts","../src/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer((()=>{customElements.define(t,e)})):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce(((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1]),t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet));else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach((t=>t(this)))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach((t=>t.hostConnected?.()))}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach((t=>t.hostDisconnected?.()))}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i){if(void 0!==t){const e=this.constructor,h=this[t];if(i??=e.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(e._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach((t=>t.hostUpdate?.())),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach((t=>t.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach((t=>this._$ET(t,this[t]))),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.1\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","import{defaultConverter as t,notEqual as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:t,reflect:!1,hasChanged:e},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","import { ValidationRule, ValidationError, FieldType } from '../schema/types';\n\nexport class FormValidator {\n /**\n * Validates a field value against its validation rules\n */\n static validateField(\n fieldId: string,\n conceptId: string,\n columnId: string,\n value: any,\n fieldType: FieldType,\n rules: ValidationRule[] = []\n ): ValidationError[] {\n const errors: ValidationError[] = [];\n\n for (const rule of rules) {\n const error = this.validateRule(fieldId, conceptId, columnId, value, fieldType, rule);\n if (error) {\n errors.push(error);\n }\n }\n\n return errors;\n }\n\n /**\n * Validates a single rule against a value\n */\n private static validateRule(\n fieldId: string,\n conceptId: string,\n columnId: string,\n value: any,\n _fieldType: FieldType,\n rule: ValidationRule\n ): ValidationError | null {\n const isEmpty = value === null || value === undefined || value === '';\n\n switch (rule.type) {\n case 'required':\n if (isEmpty) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'min':\n if (!isEmpty && typeof value === 'number' && value < rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'max':\n if (!isEmpty && typeof value === 'number' && value > rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'minLength':\n if (!isEmpty && typeof value === 'string' && value.length < rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'maxLength':\n if (!isEmpty && typeof value === 'string' && value.length > rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'pattern':\n if (!isEmpty && typeof value === 'string') {\n const regex = new RegExp(rule.value);\n if (!regex.test(value)) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n }\n break;\n\n case 'email':\n if (!isEmpty && typeof value === 'string') {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n }\n break;\n\n case 'url':\n if (!isEmpty && typeof value === 'string') {\n try {\n new URL(value);\n } catch {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n }\n break;\n\n case 'custom':\n // Custom validation would be handled by consuming application\n break;\n\n default:\n console.warn(`Unknown validation rule type: ${rule.type}`);\n }\n\n return null;\n }\n\n /**\n * Creates a validation error object\n */\n private static createError(\n fieldId: string,\n conceptId: string,\n columnId: string,\n rule: ValidationRule\n ): ValidationError {\n return {\n fieldId,\n conceptId,\n columnId,\n message: rule.message,\n severity: rule.severity || 'error',\n rule\n };\n }\n\n /**\n * Validates data type conversion\n */\n static validateDataType(value: any, fieldType: FieldType): { valid: boolean; convertedValue?: any; error?: string } {\n if (value === null || value === undefined || value === '') {\n return { valid: true, convertedValue: value };\n }\n\n switch (fieldType) {\n case 'number':\n case 'decimal':\n case 'currency':\n case 'percentage': {\n const numValue = Number(value);\n if (isNaN(numValue)) {\n return { valid: false, error: 'Invalid number format' };\n }\n return { valid: true, convertedValue: numValue };\n }\n\n case 'date': {\n const dateValue = new Date(value);\n if (isNaN(dateValue.getTime())) {\n return { valid: false, error: 'Invalid date format' };\n }\n return { valid: true, convertedValue: dateValue.toISOString().split('T')[0] };\n }\n\n case 'datetime': {\n const datetimeValue = new Date(value);\n if (isNaN(datetimeValue.getTime())) {\n return { valid: false, error: 'Invalid datetime format' };\n }\n return { valid: true, convertedValue: datetimeValue.toISOString() };\n }\n\n case 'boolean':\n if (typeof value === 'boolean') {\n return { valid: true, convertedValue: value };\n }\n if (typeof value === 'string') {\n const boolValue = value.toLowerCase();\n if (boolValue === 'true' || boolValue === '1') {\n return { valid: true, convertedValue: true };\n }\n if (boolValue === 'false' || boolValue === '0') {\n return { valid: true, convertedValue: false };\n }\n }\n return { valid: false, error: 'Invalid boolean format' };\n\n case 'text':\n case 'textarea':\n case 'email':\n case 'url':\n case 'tel':\n return { valid: true, convertedValue: String(value) };\n\n case 'select':\n case 'multiselect':\n return { valid: true, convertedValue: value };\n\n default:\n return { valid: true, convertedValue: value };\n }\n }\n\n /**\n * Formats value for display based on field type\n */\n static formatValue(value: any, fieldType: FieldType, locale = 'en-US'): string {\n if (value === null || value === undefined) return '';\n\n switch (fieldType) {\n case 'number':\n return new Intl.NumberFormat(locale).format(Number(value));\n\n case 'decimal':\n return new Intl.NumberFormat(locale, { \n minimumFractionDigits: 2,\n maximumFractionDigits: 2 \n }).format(Number(value));\n\n case 'currency':\n return new Intl.NumberFormat(locale, { \n style: 'currency',\n currency: 'USD' // Should be configurable\n }).format(Number(value));\n\n case 'percentage':\n return new Intl.NumberFormat(locale, { \n style: 'percent',\n minimumFractionDigits: 2\n }).format(Number(value) / 100);\n\n case 'date':\n return new Date(value).toLocaleDateString(locale);\n\n case 'datetime':\n return new Date(value).toLocaleString(locale);\n\n default:\n return String(value);\n }\n }\n}\n","import { \n XBRLFormInput, \n XBRLPresentationRole,\n XBRLPresentationConcept,\n XBRLLabel,\n XBRLHypercubeData,\n XBRLHypercubeRole\n} from '../schema/xbrl-types';\nimport { \n XBRLFormSchema, \n FormSection, \n FormField, \n FormColumn,\n ConceptTree,\n FieldType \n} from '../schema/types';\n\n/**\n * XBRL Form B private static assignColumnIdsToConceptFields(conceptTree: ConceptTree, columnIds: string[]): void {\n // Filter fields to only keep those that match available columns\n conceptTree.fields = conceptTree.fields.filter(field => {\n return columnIds.includes(field.columnId);\n });\n\n // Recursively process children\n if (conceptTree.children) {\n conceptTree.children.forEach(child => {\n this.assignColumnIdsToConceptFields(child, columnIds);\n });\n }\n }ransforms XBRL taxonomy data into Jupiter Dynamic Form schemas\n * Updated to handle actual presentation.json structure with roles\n */\nexport class XBRLFormBuilder {\n \n /**\n * Create unique concept ID by combining original ID with preferred label suffix\n * This handles cases where the same concept appears multiple times with different labels\n */\n private static createUniqueConceptId(concept: XBRLPresentationConcept, sectionId?: string): string {\n let baseId = concept.id;\n \n // Add preferred label suffix if exists\n if (concept.preferredLabel && concept.preferredLabel.trim() !== '') {\n // Extract the last part of the role URL as suffix\n const roleMatch = concept.preferredLabel.match(/\\/([^\\/]+)$/);\n const roleSuffix = roleMatch ? roleMatch[1] : concept.preferredLabel.replace(/[^a-zA-Z0-9]/g, '_');\n baseId = `${concept.id}_${roleSuffix}`;\n }\n \n // Add section context to avoid conflicts across roles\n if (sectionId) {\n // Create a short hash of the section ID to keep concept IDs manageable\n const sectionHash = this.createSectionHash(sectionId);\n return `${baseId}__${sectionHash}`;\n }\n \n return baseId;\n }\n \n /**\n * Create a short hash from section ID for concept uniqueness\n */\n private static createSectionHash(sectionId: string): string {\n // Simple hash to create a short identifier from the section ID\n let hash = 0;\n for (let i = 0; i < sectionId.length; i++) {\n const char = sectionId.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(36).substr(0, 6);\n }\n \n /**\n * Build form schema from XBRL input data\n * Creates accordion sections for each presentation role\n * @param xbrlInput - XBRL taxonomy data\n * @param periodStartDate - Start date for the reporting period\n * @param periodEndDate - End date for the reporting period\n * @param language - ISO language code for labels (e.g., 'en', 'nl', 'de')\n */\n static buildFormSchema(\n xbrlInput: XBRLFormInput, \n periodStartDate?: string, \n periodEndDate?: string,\n language: string = 'en'\n ): XBRLFormSchema {\n if (!xbrlInput.presentation || xbrlInput.presentation.length === 0) {\n throw new Error('XBRL presentation data is required');\n }\n\n // Use the first entrypoint (typically there's only one)\n const presentationData = xbrlInput.presentation[0];\n \n // Extract hypercube data for dimension processing\n const hypercubeData = xbrlInput.hypercubes?.[0]; // Use first entrypoint\n \n const sections: FormSection[] = [];\n\n // Sort roles by ascending order of their title before processing\n const sortedRoles = [...presentationData.roles].sort((a, b) => {\n return a.role.localeCompare(b.role);\n });\n\n // Create a form section for each presentation role\n sortedRoles.forEach(role => {\n const section = this.buildSectionFromRole(role, periodStartDate, periodEndDate, hypercubeData, language);\n \n // Post-process fields to assign correct column IDs based on generated columns\n this.assignFieldColumnIds(section);\n \n sections.push(section);\n });\n\n return {\n formId: `xbrl-form-${Date.now()}`,\n title: `XBRL Form - ${this.extractEntityName(presentationData.entrypoint)}`,\n description: `Dynamic form generated from XBRL taxonomy data`,\n version: '1.0.0',\n sections: sections\n };\n }\n\n /**\n * Build a form section from a presentation role\n */\n private static buildSectionFromRole(\n role: XBRLPresentationRole, \n periodStartDate?: string, \n periodEndDate?: string,\n hypercubeData?: XBRLHypercubeData,\n language: string = 'en'\n ): FormSection {\n // Extract section title from role name (remove role number prefix)\n const title = this.extractRoleTitle(role.role);\n \n // Analyze period types in this role first to determine consistent column strategy\n const nonAbstractConcepts = this.getAllNonAbstractConcepts(role);\n const periodTypes = new Set(\n nonAbstractConcepts\n .filter(concept => concept.periodType)\n .map(concept => concept.periodType)\n );\n\n // Find matching hypercube role for dimension processing\n const hypercubeRole = hypercubeData?.roles.find(hr => hr.roleId === role.id);\n \n if (hypercubeRole) {\n //console.log(`🏷️ Found matching hypercube role \"${role.id}\"`);\n } else {\n //console.log(`❌ No hypercube role found for \"${role.id}\"`);\n }\n \n // Generate appropriate columns based on concept period types and hypercube dimensions FIRST\n const columns = this.generateDefaultColumnsForRole(role, periodStartDate || '2025-01-01', periodEndDate || '2025-12-31', hypercubeRole, nonAbstractConcepts, periodTypes);\n\n // Extract column IDs for field creation\n const availableColumnIds = columns.map(col => col.id);\n //console.log(`📋 Available column IDs for role \"${role.id}\":`, availableColumnIds);\n \n\n \n const roleInfo = { periodTypes, availableColumnIds };\n const conceptTrees: ConceptTree[] = [];\n\n // Process root concepts and build tree structure with knowledge of available columns\n if (role.presentationLinkbase?.concepts) {\n role.presentationLinkbase.concepts.forEach(concept => {\n const conceptTree = this.buildConceptTree(concept, 0, periodStartDate, periodEndDate, roleInfo, role.id, language);\n if (conceptTree) {\n conceptTrees.push(conceptTree);\n }\n });\n }\n\n return {\n id: role.id,\n title: title,\n description: role.description || `Section for ${title}`,\n concepts: conceptTrees,\n columns: columns,\n expanded: false,\n metadata: {\n roleURI: role.roleURI,\n originalRole: role.role\n }\n };\n }\n\n /**\n * Build concept tree from XBRL presentation concept\n */\n private static buildConceptTree(\n concept: XBRLPresentationConcept, \n level: number, \n periodStartDate?: string, \n periodEndDate?: string,\n roleInfo?: { periodTypes: Set<string>, availableColumnIds?: string[] },\n sectionId?: string,\n language: string = 'en'\n ): ConceptTree | null {\n const label = this.getPreferredLabel(concept.labels, language);\n \n // Build fields for this concept (if not abstract)\n const fields: FormField[] = [];\n if (!concept.elementAbstract) {\n // Use available column IDs if provided, otherwise fall back to period-based logic\n let columnIds: string[] = [];\n \n if (roleInfo?.availableColumnIds && roleInfo.availableColumnIds.length > 0) {\n // Multi-dimensional or complex column scenario - filter by concept's period type\n columnIds = roleInfo.availableColumnIds.filter(colId => {\n if (concept.periodType === 'instant') {\n return colId.includes('instant') || colId === 'instant';\n } else if (concept.periodType === 'duration') {\n return colId.includes('duration') || colId === 'duration';\n } else {\n // If concept has no period type, include all columns\n return true;\n }\n });\n \n // If no columns match the period type, fall back to all available columns\n if (columnIds.length === 0) {\n columnIds = roleInfo.availableColumnIds;\n }\n } else {\n // Fallback to original period-based logic\n if (!roleInfo?.periodTypes || roleInfo.periodTypes.size === 0) {\n columnIds = ['default'];\n } else if (roleInfo.periodTypes.size === 1 && roleInfo.periodTypes.has('instant')) {\n columnIds = ['instant'];\n } else if (roleInfo.periodTypes.size === 1 && roleInfo.periodTypes.has('duration')) {\n columnIds = ['duration'];\n } else {\n // Mixed period types - create fields for both duration and instant columns\n // based on the concept's own period type\n if (concept.periodType === 'instant') {\n columnIds = ['instant'];\n } else if (concept.periodType === 'duration') {\n columnIds = ['duration'];\n } else {\n // Fallback if period type is not specified\n columnIds = ['duration', 'instant'];\n }\n }\n }\n \n // Create fields for appropriate column IDs\n columnIds.forEach(columnId => {\n const field = this.createFieldFromConcept(concept, periodStartDate, periodEndDate, columnId);\n if (field) fields.push(field);\n });\n }\n\n // Process children recursively\n const children: ConceptTree[] = [];\n if (concept.children && concept.children.length > 0) {\n concept.children.forEach(child => {\n const childTree = this.buildConceptTree(child, level + 1, periodStartDate, periodEndDate, roleInfo, sectionId, language);\n if (childTree) {\n children.push(childTree);\n }\n });\n }\n\n // Check if this concept should be included in the tree\n // For abstract concepts: only include if they have fields OR have children with content\n // For non-abstract concepts: always include if they have fields\n const hasContent = fields.length > 0 || children.length > 0;\n \n if (!hasContent) {\n // Abstract concept with no fields and no children with content - omit from tree\n return null;\n }\n\n return {\n id: this.createUniqueConceptId(concept, sectionId), // Use unique ID for form management\n originalConceptId: concept.id, // Store original for submission data\n name: concept.conceptName,\n label: label,\n description: `${concept.conceptName} (${concept.type})`,\n level: level,\n children: children,\n fields: fields,\n collapsed: level > 0, // Collapse nested levels by default\n abstract: concept.elementAbstract,\n periodType: concept.periodType as 'instant' | 'duration'\n };\n }\n\n /**\n * Create form field from XBRL concept\n */\n private static createFieldFromConcept(\n concept: XBRLPresentationConcept, \n periodStartDate?: string, \n periodEndDate?: string,\n forcedColumnId?: string\n ): FormField | null {\n const fieldType = this.mapXBRLTypeToFieldType(concept.type);\n const label = this.getPreferredLabel(concept.labels);\n\n // Determine appropriate column ID based on concept's period type or forced value\n let columnId: string;\n \n if (forcedColumnId) {\n // Use the forced column ID if provided\n columnId = forcedColumnId;\n } else {\n // Determine column ID based on period type\n if (concept.periodType === 'instant') {\n columnId = 'instant';\n } else if (concept.periodType === 'duration') {\n columnId = 'duration'; // Single column for duration\n } else {\n columnId = 'default';\n }\n } const field: FormField = {\n id: `${concept.id}_${columnId}_field`,\n conceptId: concept.id,\n columnId: columnId,\n type: fieldType,\n label: label,\n placeholder: `Enter ${label.toLowerCase()}`,\n required: false, // Will be determined by validation rules\n disabled: concept.elementAbstract,\n defaultValue: null\n };\n\n // Add period information if the concept is period-specific\n if (concept.periodType === 'duration' || concept.periodType === 'instant') {\n field.periodStartDate = periodStartDate || '2025-01-01';\n field.periodEndDate = periodEndDate || '2025-12-31';\n }\n\n return field;\n }\n\n /**\n * Map XBRL data type to form field type\n */\n private static mapXBRLTypeToFieldType(xbrlType: string): FieldType {\n const typeMap: Record<string, FieldType> = {\n 'xbrli:stringItemType': 'text',\n 'xbrli:monetaryItemType': 'currency',\n 'xbrli:integerItemType': 'number',\n 'xbrli:decimalItemType': 'decimal',\n 'xbrli:percentItemType': 'percentage',\n 'xbrli:dateItemType': 'date',\n 'xbrli:booleanItemType': 'boolean',\n 'dtr-types:domainItemType': 'select',\n 'bw2-titel9:chamberOfCommerceRegistrationNumberItemType': 'text'\n };\n\n return typeMap[xbrlType] || 'text';\n }\n\n /**\n * Get preferred label from labels array with language support\n * @param labels - Array of XBRL labels\n * @param language - ISO language code (e.g., 'en', 'nl', 'de')\n */\n private static getPreferredLabel(labels: XBRLLabel[], language: string = 'en'): string {\n if (!labels || labels.length === 0) return 'Unnamed Concept';\n\n // Filter labels by language\n const languageLabels = labels.filter(l => l.lang === language);\n \n // If no labels found for the specified language, fall back to all labels\n const labelsToSearch = languageLabels.length > 0 ? languageLabels : labels;\n\n // Try to find preferred label\n const preferred = labelsToSearch.find(l => l.preferredLabel);\n if (preferred) return preferred.label;\n\n // Try to find standard label\n const standard = labelsToSearch.find(l => l.role === 'http://www.xbrl.org/2003/role/label');\n if (standard) return standard.label;\n\n // Try to find terse label\n const terse = labelsToSearch.find(l => l.role === 'http://www.xbrl.org/2003/role/terseLabel');\n if (terse) return terse.label;\n\n // Return first available label from language-specific labels or fallback to any label\n return labelsToSearch.length > 0 ? labelsToSearch[0].label : labels[0].label;\n }\n\n /**\n * Assign appropriate column IDs to fields based on section's generated columns\n */\n private static assignFieldColumnIds(section: FormSection): void {\n if (!section.columns || section.columns.length === 0) {\n return;\n }\n\n // Get available column IDs\n const columnIds = section.columns.map(col => col.id);\n \n // Process all fields in all concept trees\n section.concepts.forEach(conceptTree => {\n this.assignColumnIdsToConceptFields(conceptTree, columnIds);\n });\n }\n\n /**\n * Recursively assign column IDs to fields in a concept tree\n */\n private static assignColumnIdsToConceptFields(conceptTree: ConceptTree, columnIds: string[]): void {\n // Filter fields to only keep those that match available columns\n conceptTree.fields = conceptTree.fields.filter(field => {\n return columnIds.includes(field.columnId);\n });\n\n // Process children recursively\n if (conceptTree.children) {\n conceptTree.children.forEach(child => {\n this.assignColumnIdsToConceptFields(child, columnIds);\n });\n }\n }\n\n /**\n * Count total fields in a concept tree recursively\n */\n private static countFieldsInTree(conceptTree: ConceptTree): number {\n let count = conceptTree.fields.length;\n if (conceptTree.children) {\n conceptTree.children.forEach(child => {\n count += this.countFieldsInTree(child);\n });\n }\n return count;\n }\n\n /**\n * Get all non-abstract concepts from a role recursively\n */\n static getAllNonAbstractConcepts(role: XBRLPresentationRole): XBRLPresentationConcept[] {\n const nonAbstractConcepts: XBRLPresentationConcept[] = [];\n \n if (role.presentationLinkbase?.concepts) {\n role.presentationLinkbase.concepts.forEach(concept => {\n this.collectNonAbstractConcepts(concept, nonAbstractConcepts);\n });\n }\n \n return nonAbstractConcepts;\n }\n\n /**\n * Recursively collect non-abstract concepts from a concept tree\n */\n private static collectNonAbstractConcepts(\n concept: XBRLPresentationConcept, \n collection: XBRLPresentationConcept[]\n ): void {\n // Add this concept if it's not abstract\n if (!concept.elementAbstract) {\n collection.push(concept);\n }\n \n // Recursively process children\n if (concept.children && concept.children.length > 0) {\n concept.children.forEach(child => {\n this.collectNonAbstractConcepts(child, collection);\n });\n }\n }\n\n /**\n * Generate default columns based on period types of non-abstract concepts in a role\n */\n static generateDefaultColumnsForRole(\n role: XBRLPresentationRole, \n periodStartDate: string, \n periodEndDate: string,\n hypercubeRole?: XBRLHypercubeRole,\n nonAbstractConcepts?: XBRLPresentationConcept[],\n rolePeriodTypes?: Set<string>\n ): FormColumn[] {\n // Use pre-calculated values if provided, otherwise calculate them\n const concepts = nonAbstractConcepts || this.getAllNonAbstractConcepts(role);\n const periodTypes = rolePeriodTypes || new Set(\n concepts\n .filter(concept => concept.periodType) // Only concepts with period type\n .map(concept => concept.periodType)\n );\n \n //console.log(`📊 Analyzing role \"${role.role}\" with ${concepts.length} non-abstract concepts`);\n \n if (concepts.length === 0) {\n // No non-abstract concepts, return single default column\n //console.log('📊 No non-abstract concepts found, using default column');\n return [{\n id: 'default',\n title: 'Value',\n description: 'Default value column',\n type: 'base',\n order: 0,\n removable: false\n }];\n }\n \n // Check for hypercube dimensions and generate appropriate columns\n let dimensionColumns: FormColumn[] = [];\n if (hypercubeRole?.items?.length === 1) {\n const item = hypercubeRole.items[0];\n \n \n if (item.dimensions.length === 1) {\n // Single dimension - existing logic\n dimensionColumns = this.generateSingleDimensionColumns(item.dimensions[0], periodStartDate, periodEndDate, periodTypes);\n } else if (item.dimensions.length > 1) {\n // Multiple dimensions - generate combination columns\n dimensionColumns = this.generateMultiDimensionColumns(item.dimensions, periodStartDate, periodEndDate, periodTypes);\n }\n } else if (hypercubeRole?.items?.length && hypercubeRole.items.length > 1) {\n //console.log(`⚠️ Multiple items found (${hypercubeRole.items.length}), skipping for now`);\n }\n \n // Analyze period types (use the pre-calculated or newly calculated set)\n //console.log(`📅 Found period types: ${Array.from(periodTypes).join(', ')}`);\n \n const columns: FormColumn[] = [];\n \n // If we have dimension columns, use them\n if (dimensionColumns.length > 0) {\n columns.push(...dimensionColumns);\n } else {\n // Fallback to period-based columns\n if (periodTypes.size === 0) {\n // No period types specified, use single default column\n //console.log('📅 No period types found, using default column');\n columns.push({\n id: 'default',\n title: 'Value',\n description: 'Default value column',\n type: 'base',\n order: 0,\n removable: false\n });\n } else if (periodTypes.size === 1 && periodTypes.has('instant')) {\n // All concepts are instant - single column with start date\n //console.log('📅 All concepts are instant type, creating single column');\n columns.push({\n id: 'instant',\n title: `Current`,\n description: `Values as of ${periodStartDate}`,\n type: 'base',\n order: 0,\n removable: false\n });\n } else if (periodTypes.size === 1 && periodTypes.has('duration')) {\n // All concepts are duration - single column with period range\n //console.log('📅 All concepts are duration type, creating single column with period range');\n columns.push({\n id: 'duration',\n title: `Current Period`,\n description: `Period: ${periodStartDate} to ${periodEndDate}`,\n type: 'base',\n order: 0,\n removable: false\n });\n } else {\n // Mixed period types - create both duration and instant columns\n //console.log('📅 Mixed period types found, creating both duration and instant columns');\n \n // Duration column with period range\n columns.push({\n id: 'duration',\n title: `Current Period`,\n description: `Period: ${periodStartDate} to ${periodEndDate}`,\n type: 'base',\n order: 0,\n removable: false\n });\n \n // Instant column using periodStartDate as the instant date\n columns.push({\n id: 'instant',\n title: `Current`,\n description: `Values as of ${periodStartDate}`,\n type: 'base',\n order: 1,\n removable: false\n });\n }\n }\n \n //console.log(`📊 Generated ${columns.length} columns for role \"${role.role}\":`, columns.map(c => c.title));\n return columns;\n }\n\n /**\n * Generate columns for single dimension scenarios\n */\n private static generateSingleDimensionColumns(\n dimension: any, \n periodStartDate: string, \n periodEndDate: string, \n periodTypes: Set<string>\n ): FormColumn[] {\n // //console.log(`📊 Processing single dimension:`, {\n // id: dimension.id,\n // conceptName: dimension.conceptName,\n // hasMembers: !!(dimension.members && Array.isArray(dimension.members)),\n // membersCount: dimension.members?.length || 0,\n // hasTypedMember: !!dimension.typedMember,\n // typedMemberId: dimension.typedMember?.id\n // });\n\n // Handle typed dimensions (no explicit members)\n if (dimension.typedMember && (!dimension.members || dimension.members.length === 0)) {\n //console.log(`🔤 Processing typed dimension: ${dimension.id} with typed member: ${dimension.typedMember.id}`);\n \n const axisLabel = dimension.labels.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n \n const dimensionInfo = {\n axisId: dimension.id,\n axisLabel,\n typedMemberId: dimension.typedMember.id,\n dimensionKey: `${axisLabel} | [Typed Input]`,\n dimensionIdKey: `${dimension.id}|[typed]`\n };\n \n //console.log(`🔤 Generated typed dimension info:`, dimensionInfo);\n \n const columns: FormColumn[] = [];\n \n if (periodTypes.size === 0) {\n columns.push({\n id: 'typed-default',\n title: axisLabel,\n description: 'Typed dimension input column',\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-default',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false\n });\n } else if (periodTypes.size === 1 && periodTypes.has('instant')) {\n columns.push({\n id: 'typed-instant',\n title: `${axisLabel} [Typed Input Available]`,\n description: `Typed values as of ${periodStartDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-instant',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false\n });\n } else if (periodTypes.size === 1 && periodTypes.has('duration')) {\n columns.push({\n id: 'typed-duration',\n title: `${axisLabel} [Typed Input Available]`,\n description: `Typed values for period ${periodStartDate} to ${periodEndDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-duration',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false\n });\n } else {\n // Mixed period types - create both instant and duration columns\n columns.push({\n id: 'typed-duration',\n title: `${axisLabel} [Typed Input Available]`,\n description: `Typed values for period ${periodStartDate} to ${periodEndDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-duration',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false\n });\n \n columns.push({\n id: 'typed-instant',\n title: `${axisLabel} [Typed Input Available]`,\n description: `Typed values as of ${periodStartDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-instant',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 1,\n removable: false\n });\n }\n \n //console.log(`🔤 Generated ${columns.length} typed dimension columns`);\n return columns;\n }\n\n // Handle explicit dimensions (existing logic)\n if (!dimension.members || !Array.isArray(dimension.members)) {\n //console.log(`⚠️ Dimension ${dimension.id} has no members defined and no typed member, skipping column generation`);\n return [];\n }\n\n // //console.log(`📊 Found single dimension:`, {\n // id: dimension.id,\n // conceptName: dimension.conceptName,\n // membersCount: dimension.members.length\n // });\n \n if (dimension.members.length === 0) {\n return [];\n }\n \n const axisLabel = dimension.labels.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n const firstMember = dimension.members[0];\n const memberLabel = firstMember.labels.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || firstMember.conceptName;\n \n const dimensionInfo = {\n axisId: dimension.id,\n axisLabel,\n memberId: firstMember.id,\n memberLabel,\n dimensionKey: `${axisLabel} | ${memberLabel}`,\n dimensionIdKey: `${dimension.id} | ${firstMember.id}`\n };\n \n //console.log(`📊 Generated dimension info:`, dimensionInfo);\n \n const columns: FormColumn[] = [];\n \n if (periodTypes.size === 0) {\n columns.push({\n id: 'default',\n title: dimensionInfo.memberLabel,\n description: 'Default value column',\n type: 'dimension',\n dimensionData: {\n dimensionId: 'default',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false\n });\n } else if (periodTypes.size === 1 && periodTypes.has('instant')) {\n columns.push({\n id: 'instant',\n title: `${dimensionInfo.memberLabel}`,\n description: `Values as of ${periodStartDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'instant',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false\n });\n } else if (periodTypes.size === 1 && periodTypes.has('duration')) {\n columns.push({\n id: 'duration',\n title: `${dimensionInfo.memberLabel}`,\n description: `Period: ${periodStartDate} to ${periodEndDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'duration',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false\n });\n } else {\n // Mixed period types - create both duration and instant columns\n columns.push({\n id: 'duration',\n title: `${dimensionInfo.memberLabel}`,\n description: `Period: ${periodStartDate} to ${periodEndDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'duration',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false\n });\n \n columns.push({\n id: 'instant',\n title: `${dimensionInfo.memberLabel}`,\n description: `Values as of ${periodStartDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'instant',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 1,\n removable: false\n });\n }\n \n return columns;\n }\n\n /**\n * Generate columns for multi-dimension scenarios - creates combinations of all dimension members\n */\n private static generateMultiDimensionColumns(\n dimensions: any[], \n periodStartDate: string, \n periodEndDate: string, \n periodTypes: Set<string>\n ): FormColumn[] {\n //console.log(`📊 Processing ${dimensions.length} dimensions for multi-dimensional columns`);\n // console.log(`🔍 [DEBUG] Input dimensions:`, dimensions.map(d => ({\n // id: d.id,\n // label: d.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label,\n // membersCount: d.members?.length || 0,\n // hasTypedMember: !!d.typedMember\n // })));\n \n // Detect typed members for header indication\n const hasTypedMembers = dimensions.some(dimension => dimension.typedMember);\n if (hasTypedMembers) {\n //console.log(`🔤 Found typed members in dimensions - will indicate in column headers`);\n }\n \n // Filter out dimensions without members (but keep typed dimensions)\n const validDimensions = dimensions.filter(dimension => {\n // Keep dimensions with typed members even if they don't have domain members\n if (dimension.typedMember) {\n //console.log(`🔤 Keeping typed dimension: ${dimension.id} with typed member: ${dimension.typedMember.id}`);\n return true;\n }\n // Keep dimensions with domain members\n if (dimension.members && Array.isArray(dimension.members) && dimension.members.length > 0) {\n //console.log(`📂 Keeping domain dimension: ${dimension.id} with ${dimension.members.length} members`);\n return true;\n }\n // Skip dimensions without any members\n //console.log(`⚠️ Skipping dimension ${dimension.id} - no members or typed member defined`);\n return false;\n });\n\n if (validDimensions.length === 0) {\n //console.log(`⚠️ No valid dimensions with members found, skipping multi-dimensional column generation`);\n return [];\n }\n \n // Get all dimension information\n const dimensionInfos = validDimensions.map(dimension => {\n const axisLabel = dimension.labels.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n \n // Handle typed dimensions differently\n if (dimension.typedMember) {\n return {\n id: dimension.id,\n axisLabel,\n isTyped: true,\n typedMemberId: dimension.typedMember.id,\n members: [{\n id: '[typed]',\n label: `${axisLabel} [Typed Input Available]`\n }]\n };\n }\n \n // Handle domain dimensions (existing logic)\n const allMembers = this.getAllDimensionMembers(dimension.members);\n \n return {\n id: dimension.id,\n axisLabel,\n isTyped: false,\n members: allMembers.map(member => ({\n id: member.id,\n label: member.labels.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || member.conceptName\n }))\n };\n });\n \n // Generate all combinations of dimension members\n const combinations = this.generateDimensionCombinations(dimensionInfos);\n //console.log(`📊 Generated ${combinations.length} dimension combinations`);\n // //console.log(`🔍 [DEBUG] Generated combinations:`, combinations.map(combo => ({\n // memberLabels: combo.map((c: any) => c.memberLabel),\n // axisIds: combo.map((c: any) => c.axisId),\n // memberIds: combo.map((c: any) => c.memberId)\n // })));\n \n const columns: FormColumn[] = [];\n \n combinations.forEach((combination: any[], index: number) => {\n // Create column title from combination\n const columnTitle = combination.map((c: any) => c.memberLabel).join(' | ');\n \n // Identify typed and domain members in this combination\n const typedMembers = combination.filter((c: any) => c.isTyped);\n const domainMembers = combination.filter((c: any) => !c.isTyped);\n \n // console.log(`🔍 [Column ${index}] Combination analysis:`, {\n // totalMembers: combination.length,\n // typedMembers: typedMembers.length,\n // domainMembers: domainMembers.length,\n // hasTypedMembers: typedMembers.length > 0,\n // columnTitle: columnTitle,\n // memberLabels: combination.map((c: any) => c.memberLabel),\n // memberIds: combination.map((c: any) => c.memberId)\n // });\n \n // Create dimension data for this combination\n const dimensionData = {\n dimensionId: `multi_${index}`,\n memberValue: columnTitle, // Required field\n memberLabel: columnTitle, // Required field\n combinations: domainMembers.map((c: any) => ({\n axisId: c.axisId,\n axisLabel: c.axisLabel,\n memberId: c.memberId,\n memberLabel: c.memberLabel\n })),\n // Add typed member information for form fields\n typedMembers: typedMembers.map((c: any) => ({\n axisId: c.axisId,\n axisLabel: c.axisLabel,\n typedMemberId: c.typedMemberId,\n memberLabel: c.memberLabel\n })),\n hasTypedMembers: typedMembers.length > 0,\n memberKey: columnTitle,\n dimensionIdKey: [\n ...domainMembers.map((c: any) => `${c.axisId}|${c.memberId}`),\n ...typedMembers.map((c: any) => `${c.axisId}|[typed]`)\n ].join('::')\n };\n \n // console.log(`🔍 [Column ${index}] Final dimension data:`, {\n // dimensionId: dimensionData.dimensionId,\n // memberLabel: dimensionData.memberLabel,\n // dimensionIdKey: dimensionData.dimensionIdKey,\n // combinationsCount: dimensionData.combinations?.length,\n // typedMembersCount: dimensionData.typedMembers?.length\n // });\n \n // Create columns based on period types\n if (periodTypes.size === 0 || (periodTypes.size === 1 && periodTypes.has('duration'))) {\n columns.push({\n id: `duration_${index}`,\n title: `${columnTitle}`,\n description: `Period: ${periodStartDate} to ${periodEndDate}`,\n type: 'dimension',\n dimensionData: {\n ...dimensionData,\n dimensionId: `duration_${index}`\n },\n order: index * 2,\n removable: false\n });\n } else if (periodTypes.size === 1 && periodTypes.has('instant')) {\n columns.push({\n id: `instant_${index}`,\n title: `${columnTitle}`,\n description: `Values as of ${periodStartDate}`,\n type: 'dimension',\n dimensionData: {\n ...dimensionData,\n dimensionId: `instant_${index}`\n },\n order: index * 2,\n removable: false\n });\n } else {\n // Mixed period types - create both duration and instant columns for each combination\n columns.push({\n id: `duration_${index}`,\n title: `${columnTitle}`,\n description: `Period: ${periodStartDate} to ${periodEndDate}`,\n type: 'dimension',\n dimensionData: {\n ...dimensionData,\n dimensionId: `duration_${index}`\n },\n order: index * 2,\n removable: false\n });\n \n columns.push({\n id: `instant_${index}`,\n title: `${columnTitle}`,\n description: `Values as of ${periodStartDate}`,\n type: 'dimension',\n dimensionData: {\n ...dimensionData,\n dimensionId: `instant_${index}`\n },\n order: index * 2 + 1,\n removable: false\n });\n }\n });\n \n //console.log(`📊 Generated ${columns.length} multi-dimensional columns`);\n return columns;\n }\n\n /**\n * Get all members including children recursively\n */\n private static getAllDimensionMembers(members: any[]): any[] {\n if (!members || !Array.isArray(members)) {\n return [];\n }\n\n const allMembers: any[] = [];\n \n members.forEach(member => {\n allMembers.push(member);\n \n if (member.children && member.children.length > 0) {\n allMembers.push(...this.getAllDimensionMembers(member.children));\n }\n });\n \n return allMembers;\n }\n\n /**\n * Generate all combinations of dimension members\n */\n private static generateDimensionCombinations(dimensionInfos: any[]): any[] {\n if (dimensionInfos.length === 0) return [];\n if (dimensionInfos.length === 1) {\n return dimensionInfos[0].members.map((member: any) => [{\n axisId: dimensionInfos[0].id,\n axisLabel: dimensionInfos[0].axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: dimensionInfos[0].isTyped || false,\n typedMemberId: dimensionInfos[0].typedMemberId\n }]);\n }\n \n // Generate combinations recursively\n const [firstDimension, ...restDimensions] = dimensionInfos;\n const restCombinations = this.generateDimensionCombinations(restDimensions);\n \n const combinations: any[] = [];\n \n firstDimension.members.forEach((member: any) => {\n if (restCombinations.length === 0) {\n combinations.push([{\n axisId: firstDimension.id,\n axisLabel: firstDimension.axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: firstDimension.isTyped || false,\n typedMemberId: firstDimension.typedMemberId\n }]);\n } else {\n restCombinations.forEach(restCombination => {\n combinations.push([\n {\n axisId: firstDimension.id,\n axisLabel: firstDimension.axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: firstDimension.isTyped || false,\n typedMemberId: firstDimension.typedMemberId\n },\n ...restCombination\n ]);\n });\n }\n });\n \n return combinations;\n }\n\n /**\n * Format date for display in column headers\n */\n private static formatDateForDisplay(dateString: string): string {\n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n });\n } catch {\n return dateString;\n }\n }\n\n /**\n * Extract entity name from entrypoint URL\n */\n private static extractEntityName(entrypoint: string): string {\n try {\n const url = new URL(entrypoint);\n const pathParts = url.pathname.split('/');\n const filename = pathParts[pathParts.length - 1];\n return filename.replace('.xsd', '').replace(/[^a-zA-Z0-9]/g, ' ').trim() || 'Entity';\n } catch {\n return 'Entity';\n }\n }\n\n /**\n * Extract role title from role string\n */\n private static extractRoleTitle(role: string): string {\n // Remove role number prefix like \"[000001] \" and return the title\n const match = role.match(/^\\[[\\d]+\\]\\s*(.+)$/);\n return match ? match[1].trim() : role;\n }\n\n /**\n * Extract role order from role string\n */\n private static extractRoleOrder(role: string): number {\n const match = role.match(/^\\[([\\d]+)\\]/);\n return match ? parseInt(match[1], 10) : 0;\n }\n\n /**\n * Build columns from XBRL hypercube data (placeholder for now)\n */\n static buildColumnsFromHypercubes(/* _hypercubes: any[] */): any[] {\n // For now, return default column structure\n // This will be expanded when we implement hypercube support\n return [{\n id: 'default',\n label: 'Values',\n type: 'data'\n }];\n }\n}\n","import { LitElement, html, css, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { FormField, ValidationError } from '../schema/types';\nimport { FormValidator } from '../utils/validation';\n\n@customElement('jupiter-form-field')\nexport class JupiterFormField extends LitElement {\n @property({ type: Object }) field!: FormField;\n @property({ type: String }) conceptId!: string;\n @property({ type: String }) columnId!: string;\n @property() value: any = null;\n @property({ type: Boolean }) disabled = false;\n @property({ type: String }) locale = 'en-US';\n @property({ type: Boolean }) hideLabel = false;\n\n @state() private _errors: ValidationError[] = [];\n @state() private _touched = false;\n\n static styles = css`\n :host {\n display: block;\n margin-bottom: 0px; /* Remove bottom margin for table layout */\n }\n\n :host([hideLabel]) {\n margin-bottom: 0px;\n }\n\n .field-container {\n position: relative;\n }\n\n .field-label {\n display: block;\n font-weight: 500;\n margin-bottom: 4px;\n color: var(--jupiter-text-primary, #333);\n font-size: 14px;\n }\n\n .field-label.required::after {\n content: ' *';\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .field-input {\n width: 100%;\n padding: 6px 8px; /* Reduced padding for table cells */\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n font-size: 13px; /* Slightly smaller font for table */\n font-family: inherit;\n background: var(--jupiter-input-background, #fff);\n color: var(--jupiter-text-primary, #333);\n box-sizing: border-box;\n }\n\n .field-input:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 0 0 2px var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2));\n }\n\n .field-input:disabled {\n background: var(--jupiter-disabled-background, #f5f5f5);\n color: var(--jupiter-disabled-text, #999);\n cursor: not-allowed;\n }\n\n .field-input.error {\n border-color: var(--jupiter-error-color, #d32f2f);\n }\n\n .field-input.warning {\n border-color: var(--jupiter-warning-color, #ff9800);\n }\n\n .field-errors {\n margin-top: 4px;\n }\n\n .field-error {\n display: block;\n font-size: 12px;\n margin-bottom: 2px;\n }\n\n .field-error.error {\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .field-error.warning {\n color: var(--jupiter-warning-color, #ff9800);\n }\n\n .field-error.info {\n color: var(--jupiter-info-color, #2196f3);\n }\n\n select.field-input {\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e\");\n background-position: right 8px center;\n background-repeat: no-repeat;\n background-size: 16px;\n padding-right: 32px;\n }\n\n textarea.field-input {\n resize: vertical;\n min-height: 60px;\n }\n\n .checkbox-container {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .checkbox-container input[type=\"checkbox\"] {\n margin: 0;\n width: auto;\n }\n `;\n\n protected willUpdate(changedProperties: PropertyValues) {\n if (changedProperties.has('value') || changedProperties.has('field')) {\n this._validateField();\n }\n }\n\n private _validateField() {\n if (this.field?.validation) {\n this._errors = FormValidator.validateField(\n this.field.id,\n this.conceptId,\n this.columnId,\n this.value,\n this.field.type,\n this.field.validation\n );\n }\n }\n\n private _handleInput(event: Event) {\n const target = event.target as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n let value: any = target.value;\n\n // Convert value based on field type\n if (this.field.type === 'number' || this.field.type === 'decimal') {\n value = value === '' ? null : Number(value);\n } else if (this.field.type === 'boolean') {\n value = (target as HTMLInputElement).checked;\n }\n\n this.value = value;\n this._touched = true;\n \n this.dispatchEvent(new CustomEvent('field-change', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n value,\n oldValue: this.value\n },\n bubbles: true\n }));\n }\n\n private _handleFocus() {\n this.dispatchEvent(new CustomEvent('field-focus', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId\n },\n bubbles: true\n }));\n }\n\n private _handleBlur() {\n this._touched = true;\n this.dispatchEvent(new CustomEvent('field-blur', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId\n },\n bubbles: true\n }));\n }\n\n private _renderInput() {\n const hasErrors = this._errors.some(e => e.severity === 'error');\n const hasWarnings = this._errors.some(e => e.severity === 'warning');\n const cssClass = `field-input ${hasErrors ? 'error' : hasWarnings ? 'warning' : ''}`;\n \n // Generate unique field identifiers for form submission\n const fieldId = `${this.conceptId}__${this.columnId}`;\n const fieldName = `data[${this.conceptId}][${this.columnId}]`;\n\n switch (this.field.type) {\n case 'textarea':\n return html`\n <textarea\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n class=\"${cssClass}\"\n .value=\"${this.value || ''}\"\n ?disabled=\"${this.disabled || this.field.disabled}\"\n placeholder=\"${this.field.placeholder || ''}\"\n @input=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n ></textarea>\n `;\n\n case 'select':\n return html`\n <select\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n class=\"${cssClass}\"\n .value=\"${this.value || ''}\"\n ?disabled=\"${this.disabled || this.field.disabled}\"\n @change=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n >\n <option value=\"\">Select...</option>\n ${this.field.options?.map(option => html`\n <option \n value=\"${option.value}\"\n ?disabled=\"${option.disabled}\"\n ?selected=\"${this.value === option.value}\"\n >\n ${option.label}\n </option>\n `)}\n </select>\n `;\n\n case 'boolean':\n return html`\n <div class=\"checkbox-container\">\n <input\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n type=\"checkbox\"\n class=\"field-input\"\n .checked=\"${Boolean(this.value)}\"\n ?disabled=\"${this.disabled || this.field.disabled}\"\n @change=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n />\n <span>${this.field.label}</span>\n </div>\n `;\n\n default:\n return html`\n <input\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n type=\"${this._getInputType()}\"\n class=\"${cssClass}\"\n .value=\"${this.value || ''}\"\n ?disabled=\"${this.disabled || this.field.disabled}\"\n placeholder=\"${this.field.placeholder || ''}\"\n @input=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n />\n `;\n }\n }\n\n private _getInputType(): string {\n switch (this.field.type) {\n case 'number':\n case 'decimal':\n case 'currency':\n case 'percentage':\n return 'number';\n case 'date':\n return 'date';\n case 'datetime':\n return 'datetime-local';\n case 'email':\n return 'email';\n case 'url':\n return 'url';\n case 'tel':\n return 'tel';\n default:\n return 'text';\n }\n }\n\n render() {\n const showLabel = !this.hideLabel && this.field.type !== 'boolean';\n\n return html`\n <div class=\"field-container\">\n ${showLabel ? html`\n <label class=\"field-label ${this.field.required ? 'required' : ''}\">\n ${this.field.label}\n </label>\n ` : ''}\n \n ${this._renderInput()}\n \n ${this._errors.length > 0 && this._touched ? html`\n <div class=\"field-errors\">\n ${this._errors.map(error => html`\n <span class=\"field-error ${error.severity}\">\n ${error.message}\n </span>\n `)}\n </div>\n ` : ''}\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { ConceptTree, FormColumn, FormField } from '../schema/types';\nimport './form-field';\n\n@customElement('jupiter-concept-tree')\nexport class JupiterConceptTree extends LitElement {\n @property({ type: Object }) concept!: ConceptTree;\n @property({ type: Array }) columns: FormColumn[] = [];\n @property({ type: Object }) formData: Record<string, any> = {};\n @property({ type: Boolean }) disabled = false;\n @property({ type: String }) locale = 'en-US';\n @property({ type: Set }) expandedConcepts: Set<string> = new Set();\n\n @state() private _expanded = true;\n\n static styles = css`\n :host {\n /* Component renders table cells directly */\n display: contents;\n }\n\n .concept-name-cell {\n vertical-align: top;\n padding: 2px 4px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-bottom: none;\n background: var(--jupiter-concept-background, #f8f9fa);\n position: sticky;\n left: 0;\n z-index: 1;\n width: 300px;\n min-width: 300px;\n max-width: 300px;\n }\n\n .concept-name-cell.abstract {\n background: var(--jupiter-abstract-background, #f0f2f5);\n font-weight: 600;\n }\n\n .concept-name-cell.leaf {\n background: var(--jupiter-leaf-background, #fff);\n font-weight: 400;\n }\n\n .concept-content {\n display: flex;\n align-items: center;\n min-height: 28px;\n font-size: 13px;\n line-height: 1.3;\n width: 100%;\n overflow: hidden;\n }\n\n .concept-indent {\n width: calc(var(--level, 0) * 16px);\n flex-shrink: 0;\n }\n\n .concept-toggle {\n width: 14px;\n height: 14px;\n margin-right: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n transition: transform 0.2s ease;\n cursor: pointer;\n }\n\n .concept-toggle.expanded {\n transform: rotate(90deg);\n }\n\n .concept-toggle.no-children {\n visibility: hidden;\n }\n\n .concept-label {\n flex: 1;\n color: var(--jupiter-text-primary, #333);\n cursor: pointer;\n word-wrap: break-word;\n overflow-wrap: break-word;\n hyphens: auto;\n line-height: 1.3;\n min-width: 0; /* Allows flex item to shrink below content size */\n }\n\n .field-cell {\n vertical-align: middle;\n padding: 2px 6px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-bottom: none;\n background: var(--jupiter-cell-background, #fff);\n min-height: 28px;\n text-align: center;\n min-width: 180px;\n width: 180px;\n }\n\n .field-cell.empty {\n background: var(--jupiter-empty-cell-background, #f8f9fa);\n }\n\n .field-cell.abstract-row {\n background: var(--jupiter-abstract-cell-background, #f0f2f5);\n }\n\n /* Children are rendered as separate table rows, not nested */\n .children-wrapper {\n display: none;\n }\n\n\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._expanded = this.expandedConcepts.has(this.concept.id);\n }\n\n willUpdate(changedProperties: Map<string, unknown>) {\n super.willUpdate(changedProperties);\n if (changedProperties.has('expandedConcepts')) {\n this._expanded = this.expandedConcepts.has(this.concept.id);\n }\n }\n\n private _toggleExpanded() {\n this._expanded = !this._expanded;\n \n this.dispatchEvent(new CustomEvent('concept-expand', {\n detail: {\n conceptId: this.concept.id,\n expanded: this._expanded\n },\n bubbles: true\n }));\n }\n\n private _getFieldForColumn(columnId: string): FormField | undefined {\n return this.concept.fields?.find(field => field.columnId === columnId);\n }\n\n private _getFieldValue(field: FormField): any {\n return this.formData[this.concept.id]?.[field.columnId];\n }\n\n private _handleFieldChange(event: CustomEvent) {\n event.stopPropagation();\n // Re-dispatch with updated detail\n this.dispatchEvent(new CustomEvent('field-change', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n render() {\n const hasChildren = this.concept.children && this.concept.children.length > 0;\n const level = this.concept.level || 0;\n const isAbstract = this.concept.abstract || false;\n\n return html`\n <!-- Concept Name Cell (Left Column) -->\n <td class=\"concept-name-cell ${isAbstract ? 'abstract' : (hasChildren ? '' : 'leaf')}\">\n <div class=\"concept-content\" style=\"--level: ${level}\">\n <div class=\"concept-indent\"></div>\n <div class=\"concept-toggle ${hasChildren ? (this._expanded ? 'expanded' : '') : 'no-children'}\"\n @click=\"${this._toggleExpanded}\">\n ${hasChildren ? '▶' : ''}\n </div>\n <div class=\"concept-label\" \n @click=\"${this._toggleExpanded}\"\n title=\"${this.concept.id}${this.concept.description ? ' - ' + this.concept.description : ''}\">\n ${this.concept.label}\n </div>\n </div>\n </td>\n\n <!-- Input Field Cells (Period Columns) - Only for non-abstract concepts -->\n ${this.columns.map(column => {\n const field = this._getFieldForColumn(column.id);\n const shouldShowField = !isAbstract && field;\n \n return html`\n <td class=\"field-cell ${!shouldShowField ? 'empty' : ''} ${isAbstract ? 'abstract-row' : ''}\">\n ${shouldShowField ? html`\n <jupiter-form-field\n .field=\"${field}\"\n .conceptId=\"${this.concept.id}\"\n .columnId=\"${column.id}\"\n .value=\"${this._getFieldValue(field)}\"\n .disabled=\"${this.disabled}\"\n .locale=\"${this.locale}\"\n .hideLabel=\"${true}\"\n @field-change=\"${this._handleFieldChange}\"\n ></jupiter-form-field>\n ` : ''}\n </td>\n `;\n })}\n `;\n }\n}\n","import { LitElement, html, css, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nexport interface AddColumnRequest {\n periodType: 'duration' | 'instant' | 'mixed';\n startDate?: string;\n endDate?: string;\n instantDate?: string;\n selectedDimensions?: DimensionSelection[];\n}\n\nexport interface DimensionSelection {\n axisId: string;\n axisLabel: string;\n memberId?: string;\n memberLabel?: string;\n isTyped?: boolean;\n typedValue?: string;\n}\n\nexport interface AvailableDimension {\n id: string;\n conceptName: string;\n axisLabel: string;\n members?: AvailableDimensionMember[];\n typedMember?: {\n id: string;\n dataType: string;\n };\n}\n\nexport interface AvailableDimensionMember {\n id: string;\n label: string;\n}\n\n@customElement('jupiter-add-column-dialog')\nexport class JupiterAddColumnDialog extends LitElement {\n @property({ type: String }) periodType: 'duration' | 'instant' | 'mixed' = 'duration';\n @property({ type: Boolean }) open = false;\n @property({ type: Array }) availableDimensions: AvailableDimension[] = [];\n\n @state() private _startDate = '';\n @state() private _endDate = '';\n @state() private _instantDate = '';\n @state() private _selectedType: 'duration' | 'instant' = 'duration';\n @state() private _selectedDimensions: Map<string, DimensionSelection> = new Map();\n\n updated(changedProperties: PropertyValues) {\n if (changedProperties.has('open') && this.open) {\n // Reset form when dialog opens\n this._resetForm();\n }\n \n if (changedProperties.has('availableDimensions')) {\n //////console.log(`🎯 Add Column Dialog received ${this.availableDimensions.length} dimensions:`, this.availableDimensions.map(d => d.axisLabel));\n }\n }\n\n static styles = css`\n :host {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.3s ease, visibility 0.3s ease;\n }\n\n :host([open]) {\n opacity: 1;\n visibility: visible;\n }\n\n .dialog {\n background: white;\n border-radius: 8px;\n padding: 24px;\n min-width: 400px;\n max-width: 500px;\n max-height: 90vh;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n transform: scale(0.9);\n transition: transform 0.3s ease;\n display: flex;\n flex-direction: column;\n }\n\n :host([open]) .dialog {\n transform: scale(1);\n }\n\n .dialog-header {\n margin-bottom: 20px;\n flex-shrink: 0;\n }\n\n .dialog-title {\n font-size: 20px;\n font-weight: 600;\n color: var(--jupiter-text-primary, #333);\n margin: 0 0 8px 0;\n }\n\n .dialog-description {\n font-size: 14px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0;\n }\n\n .dialog-content {\n margin-bottom: 24px;\n flex: 1;\n overflow-y: auto;\n max-height: calc(90vh - 160px);\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group.date-row {\n display: flex;\n gap: 12px;\n }\n\n .form-group.date-row .date-field {\n flex: 1;\n }\n\n .form-label {\n display: block;\n font-weight: 500;\n margin-bottom: 6px;\n color: var(--jupiter-text-primary, #333);\n font-size: 14px;\n }\n\n .form-label.required::after {\n content: ' *';\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .form-input {\n width: 100%;\n box-sizing: border-box;\n padding: 10px 12px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n font-size: 14px;\n font-family: inherit;\n transition: border-color 0.2s ease;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #007bff);\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n }\n\n select.form-input {\n cursor: pointer;\n background-color: white;\n }\n\n .dialog-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n flex-shrink: 0;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n padding-top: 16px;\n margin-top: 16px;\n }\n\n .btn {\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .btn-cancel {\n background: var(--jupiter-neutral-background, #f5f5f5);\n color: var(--jupiter-text-primary, #333);\n }\n\n .btn-cancel:hover {\n background: var(--jupiter-neutral-background-hover, #e0e0e0);\n }\n\n .btn-primary {\n background: var(--jupiter-primary-color, #667eea);\n color: white;\n }\n\n .btn-primary:hover {\n background: var(--jupiter-primary-color-dark, #5a6fd8);\n }\n\n .btn-primary:disabled {\n background: var(--jupiter-disabled-background, #ccc);\n cursor: not-allowed;\n }\n\n /* Dimension Selection Styles */\n .dimensions-section {\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .dimensions-section h3 {\n margin: 0 0 16px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n }\n\n .dimension-item {\n margin-bottom: 16px;\n padding: 16px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n background: var(--jupiter-card-background, #fafafa);\n }\n\n .dimension-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n }\n\n .dimension-checkbox {\n margin: 0;\n }\n\n .dimension-label {\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n flex: 1;\n }\n\n .dimension-details {\n margin-left: 24px;\n }\n\n .member-selection {\n margin-top: 12px;\n }\n\n .member-selection label {\n display: block;\n margin-bottom: 4px;\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n }\n\n .typed-input {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n font-size: 14px;\n }\n\n .member-list {\n max-height: 120px;\n overflow-y: auto;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n padding: 8px;\n }\n\n .member-option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n }\n\n .member-option input[type=\"radio\"] {\n margin: 0;\n }\n\n .member-option label {\n margin: 0;\n font-size: 13px;\n color: var(--jupiter-text-primary, #333);\n cursor: pointer;\n }\n\n .no-dimensions {\n text-align: center;\n color: var(--jupiter-text-secondary, #666);\n font-style: italic;\n padding: 20px;\n }\n\n .form-description {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0 0 12px 0;\n line-height: 1.4;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._resetForm();\n }\n\n willUpdate(changedProperties: Map<string, unknown>) {\n super.willUpdate(changedProperties);\n if (changedProperties.has('open') && this.open) {\n this._resetForm();\n }\n }\n\n private _handleCancel() {\n this.open = false;\n this.dispatchEvent(new CustomEvent('dialog-cancel', { bubbles: true }));\n }\n\n private _handleConfirm() {\n if (!this._isFormValid()) return;\n\n const request: AddColumnRequest = {\n periodType: this.periodType === 'mixed' ? this._selectedType : this.periodType\n };\n\n if (this.periodType === 'instant' || (this.periodType === 'mixed' && this._selectedType === 'instant')) {\n request.instantDate = this._instantDate;\n } else {\n request.startDate = this._startDate;\n request.endDate = this._endDate;\n }\n\n // Add selected dimensions\n if (this._selectedDimensions.size > 0) {\n request.selectedDimensions = Array.from(this._selectedDimensions.values());\n }\n\n this.dispatchEvent(new CustomEvent('column-add', {\n detail: request,\n bubbles: true\n }));\n }\n\n private _isFormValid(): boolean {\n if (this.periodType === 'mixed') {\n if (this._selectedType === 'instant') {\n return !!this._instantDate;\n } else {\n return !!this._startDate && !!this._endDate && this._startDate <= this._endDate;\n }\n } else if (this.periodType === 'duration') {\n return !!this._startDate && !!this._endDate && this._startDate <= this._endDate;\n } else if (this.periodType === 'instant') {\n return !!this._instantDate;\n }\n return false;\n }\n\n private _handleStartDateChange(e: Event) {\n this._startDate = (e.target as HTMLInputElement).value;\n }\n\n private _handleEndDateChange(e: Event) {\n this._endDate = (e.target as HTMLInputElement).value;\n }\n\n private _handleSelectedTypeChange(e: Event) {\n this._selectedType = (e.target as HTMLSelectElement).value as 'duration' | 'instant';\n }\n\n private _handleInstantDateChange(e: Event) {\n this._instantDate = (e.target as HTMLInputElement).value;\n }\n\n private _handleDimensionToggle(dimensionId: string, event: Event) {\n const checkbox = event.target as HTMLInputElement;\n \n if (checkbox.checked) {\n const dimension = this.availableDimensions.find(d => d.id === dimensionId);\n if (dimension) {\n const selection: DimensionSelection = {\n axisId: dimension.id,\n axisLabel: dimension.axisLabel,\n isTyped: !!(dimension.typedMember && (!dimension.members || dimension.members.length === 0))\n };\n \n this._selectedDimensions.set(dimensionId, selection);\n }\n } else {\n this._selectedDimensions.delete(dimensionId);\n }\n \n this.requestUpdate();\n }\n\n private _handleMemberSelection(dimensionId: string, memberId: string, memberLabel: string) {\n const existing = this._selectedDimensions.get(dimensionId);\n if (existing) {\n existing.memberId = memberId;\n existing.memberLabel = memberLabel;\n this._selectedDimensions.set(dimensionId, existing);\n this.requestUpdate();\n }\n }\n\n private _handleTypedValueChange(dimensionId: string, event: Event) {\n const input = event.target as HTMLInputElement;\n const existing = this._selectedDimensions.get(dimensionId);\n if (existing) {\n existing.typedValue = input.value;\n this._selectedDimensions.set(dimensionId, existing);\n }\n }\n\n private _resetForm() {\n const today = new Date().toISOString().split('T')[0];\n this._startDate = today;\n this._endDate = today;\n this._instantDate = today;\n this._selectedType = this.periodType === 'instant' ? 'instant' : 'duration';\n this._selectedDimensions.clear();\n \n // Auto-select dimensions with only one member\n this._autoSelectSingleMemberDimensions();\n \n this.requestUpdate();\n }\n\n private _autoSelectSingleMemberDimensions() {\n this.availableDimensions.forEach(dimension => {\n // Auto-select if dimension has exactly one member\n if (dimension.members && dimension.members.length === 1) {\n const member = dimension.members[0];\n const selection: DimensionSelection = {\n axisId: dimension.id,\n axisLabel: dimension.axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: false\n };\n this._selectedDimensions.set(dimension.id, selection);\n ////console.log(`🎯 Auto-selected single member: ${dimension.axisLabel} -> ${member.label}`);\n }\n // Auto-select typed dimensions (no domain members, only typed input)\n else if (dimension.typedMember && (!dimension.members || dimension.members.length === 0)) {\n const selection: DimensionSelection = {\n axisId: dimension.id,\n axisLabel: dimension.axisLabel,\n isTyped: true\n // Note: typedValue will be entered in column header, not here\n };\n this._selectedDimensions.set(dimension.id, selection);\n ////console.log(`🎯 Auto-selected typed dimension: ${dimension.axisLabel} (value will be entered in column header)`);\n }\n });\n }\n\n render() {\n if (!this.open) return html``;\n\n const isValid = this._isFormValid();\n\n return html`\n <div class=\"dialog\" @click=\"${(e: Event) => e.stopPropagation()}\">\n <div class=\"dialog-header\">\n <h2 class=\"dialog-title\">Add Column</h2>\n\n </div>\n\n <div class=\"dialog-content\">\n ${this.periodType === 'mixed' ? html`\n <div class=\"form-group\">\n <label class=\"form-label required\">Column Type</label>\n <select \n class=\"form-input\"\n .value=\"${this._selectedType}\"\n @change=\"${this._handleSelectedTypeChange}\"\n required\n >\n <option value=\"instant\">Instant (single date)</option>\n <option value=\"duration\">Duration (start and end dates)</option>\n </select>\n </div>\n ` : ''}\n\n ${(this.periodType === 'instant' || (this.periodType === 'mixed' && this._selectedType === 'instant')) ? html`\n <div class=\"form-group\">\n <label class=\"form-label required\">Instant Date</label>\n <input \n type=\"date\" \n class=\"form-input\"\n .value=\"${this._instantDate}\"\n @change=\"${this._handleInstantDateChange}\"\n required\n />\n </div>\n ` : html`\n <div class=\"form-group date-row\">\n <div class=\"date-field\">\n <label class=\"form-label required\">Start Period Date</label>\n <input \n type=\"date\" \n class=\"form-input\"\n .value=\"${this._startDate}\"\n @change=\"${this._handleStartDateChange}\"\n required\n />\n </div>\n <div class=\"date-field\">\n <label class=\"form-label required\">End Period Date</label>\n <input \n type=\"date\" \n class=\"form-input\"\n .value=\"${this._endDate}\"\n @change=\"${this._handleEndDateChange}\"\n required\n />\n </div>\n </div>\n `}\n\n <!-- Dimensions Section -->\n ${this.availableDimensions.length > 0 ? html`\n <div class=\"dimensions-section\">\n <h3>Available Dimensions</h3>\n <p class=\"form-description\">Select dimensions to include in the column. Domain members can be selected here, while typed dimension values will be entered directly in the column header.</p>\n \n ${this.availableDimensions.map(dimension => {\n const isSelected = this._selectedDimensions.has(dimension.id);\n const selection = this._selectedDimensions.get(dimension.id);\n const isTypedDimension = !!(dimension.typedMember && (!dimension.members || dimension.members.length === 0));\n \n return html`\n <div class=\"dimension-item\">\n <div class=\"dimension-header\">\n <input \n type=\"checkbox\" \n class=\"dimension-checkbox\"\n .checked=\"${isSelected}\"\n @change=\"${(e: Event) => this._handleDimensionToggle(dimension.id, e)}\"\n id=\"dim-${dimension.id}\"\n />\n <label for=\"dim-${dimension.id}\" class=\"dimension-label\">\n ${dimension.axisLabel || dimension.conceptName}\n </label>\n </div>\n \n ${isSelected ? html`\n <div class=\"dimension-details\">\n ${isTypedDimension ? html`\n <!-- Typed Dimension Input -->\n <div class=\"member-selection\">\n <label>Enter value for ${dimension.conceptName}:</label>\n <input\n type=\"text\"\n class=\"typed-input\"\n .value=\"${selection?.typedValue || ''}\"\n @input=\"${(e: Event) => this._handleTypedValueChange(dimension.id, e)}\"\n placeholder=\"Enter value...\"\n />\n </div>\n ` : html`\n <!-- Domain Members Selection -->\n ${dimension.members && dimension.members.length > 0 ? html`\n <div class=\"member-selection\">\n <label>Select member:</label>\n <div class=\"member-list\">\n ${dimension.members.map(member => html`\n <div class=\"member-option\">\n <input\n type=\"radio\"\n name=\"member-${dimension.id}\"\n .checked=\"${selection?.memberId === member.id}\"\n @change=\"${() => this._handleMemberSelection(dimension.id, member.id, member.label)}\"\n id=\"member-${dimension.id}-${member.id}\"\n />\n <label for=\"member-${dimension.id}-${member.id}\">\n ${member.label}\n </label>\n </div>\n `)}\n </div>\n </div>\n ` : html`\n <p class=\"form-description\">No members available for this dimension</p>\n `}\n `}\n </div>\n ` : ''}\n </div>\n `;\n })}\n </div>\n ` : ''}\n </div>\n\n <div class=\"dialog-actions\">\n <button class=\"btn btn-cancel\" @click=\"${this._handleCancel}\">\n Cancel\n </button>\n <button \n class=\"btn btn-primary\" \n ?disabled=\"${!isValid}\"\n @click=\"${this._handleConfirm}\"\n >\n Add Column\n </button>\n </div>\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { FormSection, FormColumn, ConceptTree } from '../schema/types';\nimport './concept-tree';\nimport './add-column-dialog';\nimport { AddColumnRequest, AvailableDimension } from './add-column-dialog';\n\n@customElement('jupiter-form-section')\nexport class JupiterFormSection extends LitElement {\n @property({ type: Object }) section!: FormSection;\n @property({ type: Array }) columns: FormColumn[] = [];\n @property({ type: Object }) formData: Record<string, any> = {};\n @property({ type: Object }) typedMemberData: Record<string, Record<string, string>> = {};\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean }) collapsible = true;\n @property({ type: String }) locale = 'en-US';\n @property({ type: Boolean }) isFirstSection = false;\n @property({ type: Array }) availableDimensions: AvailableDimension[] = [];\n\n @state() private _expanded = true;\n @state() private _showAddColumnDialog = false;\n @state() private _sectionPeriodType: 'duration' | 'instant' | 'mixed' = 'duration';\n\n static styles = css`\n :host {\n display: block;\n margin-bottom: 16px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .section-header {\n background: var(--jupiter-section-header-background, #f0f2f5);\n padding: 16px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n cursor: pointer;\n user-select: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .section-header:hover {\n background: var(--jupiter-section-header-hover-background, #e4e7ea);\n }\n\n .section-header.not-collapsible {\n cursor: default;\n }\n\n .section-header.not-collapsible:hover {\n background: var(--jupiter-section-header-background, #f0f2f5);\n }\n\n .section-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--jupiter-text-primary, #333);\n margin: 0;\n }\n\n .section-description {\n font-size: 14px;\n color: var(--jupiter-text-secondary, #666);\n margin: 4px 0 0 0;\n }\n\n .section-toggle {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n transition: transform 0.2s ease;\n color: var(--jupiter-text-secondary, #666);\n }\n\n .section-toggle.expanded {\n transform: rotate(90deg);\n }\n\n .section-toggle.hidden {\n visibility: hidden;\n }\n\n .section-header-controls {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .tree-control {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--jupiter-text-secondary, #666);\n background: var(--jupiter-button-background, #fff);\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n padding: 4px 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .tree-control:hover {\n background: var(--jupiter-button-hover-background, #f5f5f5);\n border-color: var(--jupiter-primary-color, #007bff);\n }\n\n .tree-control-checkbox {\n width: 14px;\n height: 14px;\n cursor: pointer;\n }\n\n .tree-control-label {\n cursor: pointer;\n font-weight: 500;\n white-space: nowrap;\n }\n\n .section-content {\n display: block;\n transition: max-height 0.3s ease;\n overflow: hidden;\n }\n\n .section-content.collapsed {\n display: none;\n }\n\n .table-container {\n overflow-x: auto;\n }\n\n .form-table {\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n background: var(--jupiter-table-background, #fff);\n }\n\n .table-header {\n background: var(--jupiter-header-background, #f8f9fa);\n position: sticky;\n top: 0;\n z-index: 1;\n }\n\n .header-row {\n /* Table row - no special display needed */\n }\n\n .header-cell {\n padding: 8px 12px;\n text-align: left;\n font-weight: 600;\n color: var(--jupiter-text-primary, #333);\n border: 1px solid var(--jupiter-border-color, #ddd);\n background: var(--jupiter-header-background, #f8f9fa);\n min-width: 180px;\n width: 180px;\n font-size: 14px;\n vertical-align: middle;\n }\n\n .header-cell.concept-column {\n width: 300px;\n min-width: 300px;\n max-width: 300px;\n position: sticky;\n left: 0;\n z-index: 2;\n }\n\n .header-cell.removable {\n position: relative;\n }\n\n .remove-column-btn {\n position: absolute;\n top: 4px;\n right: 4px;\n width: 20px;\n height: 20px;\n border: none;\n background: var(--jupiter-error-color, #d32f2f);\n color: white;\n border-radius: 50%;\n font-size: 12px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .remove-column-btn:hover {\n background: var(--jupiter-error-color-dark, #b71c1c);\n }\n\n .add-column-btn {\n background: var(--jupiter-primary-color, #667eea);\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n margin: 8px;\n }\n\n .add-column-btn:hover {\n background: var(--jupiter-primary-color-dark, #5a6fd8);\n }\n\n /* Column header content styling */\n .column-header-content {\n display: flex;\n flex-direction: column;\n gap: 8px;\n align-items: center;\n }\n\n .column-title {\n text-align: center;\n }\n\n /* Typed member header input styles */\n .typed-members-header {\n display: flex;\n flex-direction: column;\n gap: 4px;\n width: 100%;\n padding: 8px;\n background: var(--jupiter-typed-member-header-background, #f8f9fa);\n border-radius: 4px;\n border: 1px solid var(--jupiter-border-color, #e0e0e0);\n }\n\n .typed-member-header-input {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .typed-member-header-label {\n font-size: 11px;\n font-weight: 500;\n color: var(--jupiter-text-secondary, #666);\n text-align: left;\n }\n\n .typed-member-header-field {\n width: 100%;\n padding: 4px 6px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 3px;\n font-size: 12px;\n background: var(--jupiter-input-background, #fff);\n }\n\n .typed-member-header-field:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 0 0 1px var(--jupiter-primary-color, #1976d2);\n }\n\n .typed-member-header-field::placeholder {\n color: var(--jupiter-text-placeholder, #999);\n font-size: 11px;\n }\n\n .empty-section {\n padding: 24px;\n text-align: center;\n color: var(--jupiter-text-secondary, #666);\n font-style: italic;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._expanded = this.section.expanded !== false;\n this._determinePeriodType();\n this._checkAndExpandFirstSection();\n }\n \n updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n \n // Check if this became the first section or if section/isFirstSection properties changed\n if (changedProperties.has('isFirstSection') || changedProperties.has('section')) {\n this._checkAndExpandFirstSection();\n }\n }\n \n private _checkAndExpandFirstSection() {\n // If this is the first section, expand it and its tree by default\n if (this.isFirstSection && this.section && this.section.concepts) {\n this._expanded = true;\n // Use setTimeout to ensure the DOM is ready for tree expansion\n setTimeout(() => {\n this._expandAllTrees();\n console.log('🎯 First section detected - expanded section and tree by default');\n }, 0);\n }\n }\n\n private _determinePeriodType() {\n // Get all non-abstract concepts\n const nonAbstractConcepts = this._getAllNonAbstractConcepts(this.section.concepts);\n \n if (nonAbstractConcepts.length === 0) {\n this._sectionPeriodType = 'duration';\n console.log(`📊 Section ${this.section.id}: No concepts, defaulting to duration`);\n return;\n }\n\n // Check period types\n const periodTypes = new Set(nonAbstractConcepts.map(c => c.periodType).filter(Boolean));\n \n console.log(`🏷️ Section ${this.section.id}: Found period types:`, Array.from(periodTypes));\n console.log(`📝 Section ${this.section.id}: Non-abstract concepts and their period types:`, \n nonAbstractConcepts.map(c => ({ name: c.name, periodType: c.periodType, abstract: c.abstract }))\n );\n \n if (periodTypes.size === 0) {\n this._sectionPeriodType = 'duration';\n console.log(`📊 Section ${this.section.id}: No period types defined, defaulting to duration`);\n } else if (periodTypes.size === 1) {\n const singleType = Array.from(periodTypes)[0];\n this._sectionPeriodType = singleType === 'instant' ? 'instant' : 'duration';\n console.log(`📊 Section ${this.section.id}: Single period type '${singleType}', setting to '${this._sectionPeriodType}'`);\n } else {\n this._sectionPeriodType = 'mixed';\n console.log(`📊 Section ${this.section.id}: Mixed period types, setting to 'mixed'`);\n }\n \n console.log(`✅ Section ${this.section.id}: Final period type: ${this._sectionPeriodType}`);\n }\n\n private _getAllNonAbstractConcepts(concepts: ConceptTree[]): ConceptTree[] {\n const result: ConceptTree[] = [];\n \n for (const concept of concepts) {\n if (!concept.abstract) {\n result.push(concept);\n }\n if (concept.children) {\n result.push(...this._getAllNonAbstractConcepts(concept.children));\n }\n }\n \n return result;\n }\n\n private _toggleExpanded() {\n if (!this.collapsible) return;\n \n this._expanded = !this._expanded;\n \n this.dispatchEvent(new CustomEvent('section-expand', {\n detail: {\n sectionId: this.section.id,\n expanded: this._expanded\n },\n bubbles: true\n }));\n }\n\n private _handleRemoveColumn(columnId: string) {\n this.dispatchEvent(new CustomEvent('column-remove', {\n detail: { \n columnId,\n sectionId: this.section.id \n },\n bubbles: true\n }));\n }\n\n private _handleAddColumn() {\n // Determine period type specifically for this add column action\n const buttonPeriodType = this._determineButtonPeriodType();\n \n // Override the section period type for this dialog\n this._sectionPeriodType = buttonPeriodType;\n this._showAddColumnDialog = true;\n }\n\n private _determineButtonPeriodType(): 'duration' | 'instant' | 'mixed' {\n // Get all non-abstract concepts in the section (not just those with fields)\n // This ensures we correctly identify mixed period sections even when some concepts\n // don't have fields in the default column due to period type filtering\n const allNonAbstractConcepts = this._getAllNonAbstractConcepts(this.section.concepts);\n \n if (allNonAbstractConcepts.length === 0) {\n return 'duration';\n }\n\n // Check period types of all non-abstract concepts in the section\n const periodTypes = new Set(\n allNonAbstractConcepts\n .map(c => c.periodType)\n .filter(periodType => periodType !== undefined && periodType !== null)\n );\n \n if (periodTypes.size === 0) {\n return 'duration';\n } else if (periodTypes.size === 1) {\n const singleType = Array.from(periodTypes)[0];\n return singleType === 'instant' ? 'instant' : 'duration';\n } else {\n return 'mixed';\n }\n }\n\n private _getConceptsWithFields(concepts: ConceptTree[]): ConceptTree[] {\n const result: ConceptTree[] = [];\n \n for (const concept of concepts) {\n // Include concepts that have fields and are not abstract\n if (!concept.abstract && concept.fields && concept.fields.length > 0) {\n result.push(concept);\n }\n \n // Recursively check children\n if (concept.children) {\n result.push(...this._getConceptsWithFields(concept.children));\n }\n }\n \n return result;\n }\n\n private _handleDialogCancel() {\n this._showAddColumnDialog = false;\n }\n\n private _handleColumnAdd(event: CustomEvent<AddColumnRequest>) {\n event.stopPropagation();\n this._showAddColumnDialog = false;\n \n // Dispatch event to parent component with the column request\n this.dispatchEvent(new CustomEvent('column-add-request', {\n detail: {\n sectionId: this.section.id,\n columnRequest: event.detail\n },\n bubbles: true\n }));\n }\n\n private _handleFieldChange(event: CustomEvent) {\n event.stopPropagation();\n this.dispatchEvent(new CustomEvent('field-change', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _flattenConcepts(concepts: ConceptTree[], expanded: Set<string> = new Set()): ConceptTree[] {\n const result: ConceptTree[] = [];\n \n for (const concept of concepts) {\n result.push(concept);\n \n // If concept is expanded and has children, include them\n if (concept.children && concept.children.length > 0 && expanded.has(concept.id)) {\n const childrenFlattened = this._flattenConcepts(concept.children, expanded);\n result.push(...childrenFlattened);\n }\n }\n \n return result;\n }\n\n @state() private _expandedConcepts = new Set<string>();\n @state() private _allTreeExpanded = false;\n\n private _getAllConceptIds(concepts: ConceptTree[]): string[] {\n const result: string[] = [];\n \n for (const concept of concepts) {\n if (concept.children && concept.children.length > 0) {\n result.push(concept.id);\n result.push(...this._getAllConceptIds(concept.children));\n }\n }\n \n return result;\n }\n\n private _expandAllTrees() {\n const allConceptIds = this._getAllConceptIds(this.section.concepts || []);\n allConceptIds.forEach(id => this._expandedConcepts.add(id));\n this._allTreeExpanded = true;\n this.requestUpdate();\n }\n\n private _collapseAllTrees() {\n this._expandedConcepts.clear();\n this._allTreeExpanded = false;\n this.requestUpdate();\n }\n\n private _toggleAllTrees(event: Event) {\n event.stopPropagation(); // Prevent triggering accordion toggle\n \n // Auto-expand the accordion if it's collapsed\n if (!this._expanded) {\n this._expanded = true;\n }\n \n if (this._allTreeExpanded) {\n this._collapseAllTrees();\n } else {\n this._expandAllTrees();\n }\n }\n\n private _handleTreeCheckboxChange(event: Event) {\n event.stopPropagation(); // Prevent triggering accordion toggle\n const checkbox = event.target as HTMLInputElement;\n \n // Auto-expand the accordion if it's collapsed\n if (!this._expanded) {\n this._expanded = true;\n }\n \n if (checkbox.checked) {\n this._expandAllTrees();\n } else {\n this._collapseAllTrees();\n }\n }\n\n private _handleConceptExpand(event: CustomEvent) {\n event.stopPropagation();\n const { conceptId, expanded } = event.detail;\n \n if (expanded) {\n this._expandedConcepts.add(conceptId);\n } else {\n this._expandedConcepts.delete(conceptId);\n }\n \n // Update the allTreeExpanded state based on whether all concepts are expanded\n const allConceptIds = this._getAllConceptIds(this.section.concepts || []);\n this._allTreeExpanded = allConceptIds.length > 0 && allConceptIds.every(id => this._expandedConcepts.has(id));\n \n // Force re-render\n this.requestUpdate();\n \n this.dispatchEvent(new CustomEvent('concept-expand', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _getTypedMemberHeaderValue(columnId: string, axisId: string): string {\n // Get typed member value from the dedicated typed member data structure\n return this.typedMemberData[columnId]?.[axisId] || '';\n }\n\n private _handleTypedMemberHeaderChange(event: Event, columnId: string, axisId: string) {\n const target = event.target as HTMLInputElement;\n const value = target.value;\n \n console.log(`🔍 [FormSection] Typed member header change: columnId=${columnId}, axisId=${axisId}, value=${value}`);\n \n // Dispatch typed member change event (matches what dynamic form expects)\n this.dispatchEvent(new CustomEvent('typed-member-change', {\n detail: {\n columnId: columnId,\n axisId: axisId,\n value: value\n },\n bubbles: true\n }));\n }\n\n render() {\n if (!this.section.concepts || this.section.concepts.length === 0) {\n return html`\n <div class=\"section-header ${!this.collapsible ? 'not-collapsible' : ''}\" \n @click=\"${this._toggleExpanded}\">\n <div>\n <h3 class=\"section-title\">${this.section.title}</h3>\n ${this.section.description ? html`\n <p class=\"section-description\">${this.section.description}</p>\n ` : ''}\n </div>\n <div class=\"section-header-controls\">\n <div class=\"section-toggle ${this.collapsible ? (this._expanded ? 'expanded' : '') : 'hidden'}\">\n ${this.collapsible ? '▶' : ''}\n </div>\n </div>\n </div>\n \n <div class=\"section-content ${!this._expanded ? 'collapsed' : ''}\">\n <div class=\"empty-section\">\n No concepts defined for this section.\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"section-header ${!this.collapsible ? 'not-collapsible' : ''}\" \n @click=\"${this._toggleExpanded}\">\n <div>\n <h3 class=\"section-title\">${this.section.title}</h3>\n ${this.section.description ? html`\n <p class=\"section-description\">${this.section.description}</p>\n ` : ''}\n </div>\n <div class=\"section-header-controls\">\n <div class=\"tree-control\">\n <input\n type=\"checkbox\"\n class=\"tree-control-checkbox\"\n .checked=\"${this._allTreeExpanded}\"\n @change=\"${this._handleTreeCheckboxChange}\"\n />\n <span class=\"tree-control-label\" @click=\"${this._toggleAllTrees}\">${this._allTreeExpanded ? 'Collapse Tree' : 'Expand Tree'}</span>\n </div>\n <div class=\"section-toggle ${this.collapsible ? (this._expanded ? 'expanded' : '') : 'hidden'}\">\n ${this.collapsible ? '▶' : ''}\n </div>\n </div>\n </div>\n\n <div class=\"section-content ${!this._expanded ? 'collapsed' : ''}\">\n <div class=\"table-container\">\n <table class=\"form-table\">\n <thead class=\"table-header\">\n <tr class=\"header-row\">\n <th class=\"header-cell concept-column\">Concept</th>\n ${this.columns.map(column => html`\n <th class=\"header-cell ${column.removable ? 'removable' : ''}\">\n <div class=\"column-header-content\">\n <div class=\"column-title\">\n ${column.title}\n ${column.description ? html`<div style=\"font-weight: normal; font-size: 12px; color: var(--jupiter-text-secondary, #666);\">${column.description}</div>` : ''}\n </div>\n \n <!-- Typed member input fields in column header -->\n ${column.dimensionData?.hasTypedMembers ? html`\n <div class=\"typed-members-header\">\n ${column.dimensionData?.typedMembers?.map((typedMember: any) => html`\n <div class=\"typed-member-header-input\">\n <input\n type=\"text\"\n class=\"typed-member-header-field\"\n placeholder=\"Enter ${typedMember.axisLabel}\"\n .value=\"${this._getTypedMemberHeaderValue(column.id, typedMember.axisId)}\"\n @input=\"${(e: Event) => this._handleTypedMemberHeaderChange(e, column.id, typedMember.axisId)}\"\n />\n </div>\n `)}\n </div>\n ` : ''}\n \n ${column.removable ? html`\n <button \n class=\"remove-column-btn\"\n @click=\"${(e: Event) => {\n e.stopPropagation();\n this._handleRemoveColumn(column.id);\n }}\"\n title=\"Remove column\"\n >×</button>\n ` : ''}\n </div>\n </th>\n `)}\n <th class=\"header-cell\">\n <button class=\"add-column-btn\" @click=\"${(e: Event) => {\n e.stopPropagation();\n this._handleAddColumn();\n }}\" title=\"Add Column\">\n + Add Column\n </button>\n </th>\n </tr>\n </thead>\n <tbody class=\"table-body\">\n ${this._flattenConcepts(this.section.concepts, this._expandedConcepts).map(concept => html`\n <tr>\n <jupiter-concept-tree\n .concept=\"${concept}\"\n .columns=\"${this.columns}\"\n .formData=\"${this.formData}\"\n .disabled=\"${this.disabled}\"\n .locale=\"${this.locale}\"\n .expandedConcepts=\"${this._expandedConcepts}\"\n @field-change=\"${this._handleFieldChange}\"\n @concept-expand=\"${this._handleConceptExpand}\"\n ></jupiter-concept-tree>\n </tr>\n `)}\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- Add Column Dialog -->\n <jupiter-add-column-dialog\n .periodType=\"${this._sectionPeriodType}\"\n ?open=\"${this._showAddColumnDialog}\"\n .availableDimensions=\"${this.availableDimensions}\"\n @dialog-cancel=\"${this._handleDialogCancel}\"\n @column-add=\"${this._handleColumnAdd}\"\n ></jupiter-add-column-dialog>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { FormSection } from '../schema/types';\n\nexport interface FilterRolesRequest {\n availableRoles: FormSection[];\n currentSelectedRoles: string[];\n}\n\n@customElement('jupiter-filter-roles-dialog')\nexport class JupiterFilterRolesDialog extends LitElement {\n @property({ type: Boolean, reflect: true }) open = false;\n @property({ type: Array }) availableRoles: FormSection[] = [];\n @property({ type: Array }) selectedRoleIds: string[] = [];\n\n @state() private _tempSelectedRoles = new Set<string>();\n @state() private _searchQuery = '';\n @state() private _filteredRoles: FormSection[] = [];\n\n static styles = css`\n :host {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 10000;\n display: none;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.5);\n font-family: var(--jupiter-font-family, system-ui, -apple-system, sans-serif);\n }\n\n :host([open]) {\n display: flex;\n }\n\n .dialog {\n background: var(--jupiter-background, #fff);\n border-radius: 8px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n \n width: 90vw;\n max-height: 80vh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .dialog-header {\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .dialog-title {\n font-size: 18px;\n font-weight: 600;\n margin: 0;\n color: var(--jupiter-text-primary, #333);\n flex: 1;\n }\n\n .filter-icon {\n width: 20px;\n height: 20px;\n fill: var(--jupiter-primary-color, #1976d2);\n }\n\n .close-button {\n background: none;\n border: none;\n font-size: 24px;\n cursor: pointer;\n padding: 4px;\n color: var(--jupiter-text-secondary, #666);\n border-radius: 4px;\n transition: background-color 0.2s ease;\n }\n\n .close-button:hover {\n background: var(--jupiter-hover-background, #f5f5f5);\n }\n\n .dialog-content {\n flex: 1;\n overflow-y: auto;\n padding: 20px 24px;\n }\n\n .description {\n color: var(--jupiter-text-secondary, #666);\n font-size: 14px;\n margin: 0 0 20px 0;\n line-height: 1.5;\n }\n\n .selection-controls {\n display: flex;\n gap: 12px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n }\n\n .search-container {\n margin-bottom: 16px;\n position: relative;\n }\n\n .search-input {\n width: 100%;\n padding: 10px 40px 10px 12px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n font-size: 14px;\n font-family: inherit;\n background: var(--jupiter-background, #fff);\n color: var(--jupiter-text-primary, #333);\n transition: border-color 0.2s ease;\n }\n\n .search-input:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.1);\n }\n\n .search-input::placeholder {\n color: var(--jupiter-text-secondary, #666);\n }\n\n .search-icon {\n position: absolute;\n right: 12px;\n top: 50%;\n transform: translateY(-50%);\n width: 16px;\n height: 16px;\n fill: var(--jupiter-text-secondary, #666);\n pointer-events: none;\n }\n\n .clear-search {\n position: absolute;\n right: 12px;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n cursor: pointer;\n padding: 2px;\n border-radius: 2px;\n color: var(--jupiter-text-secondary, #666);\n font-size: 16px;\n line-height: 1;\n transition: color 0.2s ease;\n }\n\n .clear-search:hover {\n color: var(--jupiter-text-primary, #333);\n }\n\n .search-results-info {\n font-size: 12px;\n color: var(--jupiter-text-secondary, #666);\n margin-bottom: 8px;\n text-align: center;\n }\n\n .no-results {\n text-align: center;\n padding: 40px 20px;\n color: var(--jupiter-text-secondary, #666);\n font-style: italic;\n }\n\n mark {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: 500;\n }\n\n .selection-control {\n background: none;\n border: 1px solid var(--jupiter-primary-color, #1976d2);\n color: var(--jupiter-primary-color, #1976d2);\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .selection-control:hover {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n }\n\n .roles-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n max-height: 300px;\n overflow-y: auto;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n padding: 12px;\n }\n\n .role-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 8px;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n }\n\n .role-item:hover {\n background: var(--jupiter-hover-background, #f5f5f5);\n }\n\n .role-checkbox {\n margin-top: 2px;\n cursor: pointer;\n }\n\n .role-info {\n flex: 1;\n min-width: 0;\n }\n\n .role-title {\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n margin: 0 0 4px 0;\n word-wrap: break-word;\n line-height: 1.3;\n }\n\n .role-description {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0;\n line-height: 1.4;\n word-break: break-all; /* Allow URI breaking */\n }\n\n .role-description:last-child {\n margin-bottom: 4px;\n }\n\n .selected-count {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n margin-top: 16px;\n text-align: center;\n }\n\n .dialog-actions {\n padding: 16px 24px;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n background: var(--jupiter-form-actions-background, #f8f9fa);\n }\n\n .dialog-actions button {\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .btn-primary {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--jupiter-primary-color-dark, #1565c0);\n }\n\n .btn-secondary {\n background: transparent;\n color: var(--jupiter-text-secondary, #666);\n border: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--jupiter-hover-background, #f5f5f5);\n }\n\n button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._initializeTempSelection();\n }\n\n updated(changedProperties: Map<string, any>) {\n if (changedProperties.has('selectedRoleIds') || changedProperties.has('open')) {\n this._initializeTempSelection();\n }\n if (changedProperties.has('availableRoles') || changedProperties.has('_searchQuery')) {\n this._updateFilteredRoles();\n }\n }\n\n private _updateFilteredRoles() {\n if (!this._searchQuery.trim()) {\n // Sort roles by title in ascending order\n this._filteredRoles = [...this.availableRoles].sort((a, b) => {\n return a.title.localeCompare(b.title);\n });\n return;\n }\n\n const query = this._searchQuery.toLowerCase().trim();\n const filtered = this.availableRoles.filter(role => {\n // Search in role title\n const titleMatch = role.title.toLowerCase().includes(query);\n \n // Search in role ID\n const idMatch = role.id.toLowerCase().includes(query);\n \n // Search in role description if available\n const descriptionMatch = role.description?.toLowerCase().includes(query) || false;\n \n // Search in roleURI if available (from metadata or if stored separately)\n // For now, we'll search in the title for URI-like patterns or check if role has URI-like structure\n const uriMatch = this._searchInRoleURI(role, query);\n \n return titleMatch || idMatch || descriptionMatch || uriMatch;\n });\n\n // Sort filtered results by title in ascending order\n this._filteredRoles = filtered.sort((a, b) => {\n return a.title.localeCompare(b.title);\n });\n }\n\n private _searchInRoleURI(role: FormSection, query: string): boolean {\n // If the role has metadata that contains roleURI\n if (role.metadata?.roleURI) {\n return role.metadata.roleURI.toLowerCase().includes(query);\n }\n \n // Look for URI patterns in title or ID\n const uriPattern = /https?:\\/\\/[^\\s]+/i;\n const titleHasURI = uriPattern.test(role.title);\n const idHasURI = uriPattern.test(role.id);\n \n if (titleHasURI || idHasURI) {\n return role.title.toLowerCase().includes(query) || role.id.toLowerCase().includes(query);\n }\n \n // If role ID follows URI-like pattern (contains dots, slashes, etc.)\n if (role.id.includes('.') || role.id.includes('/') || role.id.includes(':')) {\n return role.id.toLowerCase().includes(query);\n }\n \n return false;\n }\n\n private _handleSearchInput(event: Event) {\n const input = event.target as HTMLInputElement;\n this._searchQuery = input.value;\n }\n\n private _clearSearch() {\n this._searchQuery = '';\n const searchInput = this.shadowRoot?.querySelector('.search-input') as HTMLInputElement;\n if (searchInput) {\n searchInput.value = '';\n searchInput.focus();\n }\n }\n\n private _highlightSearchTerm(text: string): string {\n if (!this._searchQuery.trim()) {\n return text;\n }\n\n const query = this._searchQuery.trim();\n const regex = new RegExp(`(${query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})`, 'gi');\n return text.replace(regex, '<mark>$1</mark>');\n }\n\n private _renderHighlightedText(text: string) {\n // For compatibility, just return the text without highlighting for now\n return text;\n }\n\n private _getSelectedFilteredCount(): number {\n return this._filteredRoles.filter(role => this._tempSelectedRoles.has(role.id)).length;\n }\n\n private _initializeTempSelection() {\n this._tempSelectedRoles = new Set(this.selectedRoleIds);\n }\n\n private _handleCheckboxChange(event: Event, roleId: string) {\n const checkbox = event.target as HTMLInputElement;\n const newSelection = new Set(this._tempSelectedRoles);\n \n if (checkbox.checked) {\n newSelection.add(roleId);\n } else {\n newSelection.delete(roleId);\n }\n \n this._tempSelectedRoles = newSelection;\n this.requestUpdate();\n }\n\n private _selectAll() {\n // Select all currently filtered roles\n const newSelection = new Set(this._tempSelectedRoles);\n this._filteredRoles.forEach(role => newSelection.add(role.id));\n this._tempSelectedRoles = newSelection;\n this.requestUpdate();\n }\n\n private _selectNone() {\n // Deselect all currently filtered roles\n const newSelection = new Set(this._tempSelectedRoles);\n this._filteredRoles.forEach(role => newSelection.delete(role.id));\n this._tempSelectedRoles = newSelection;\n this.requestUpdate();\n }\n\n private _selectAllGlobal() {\n // Select all available roles (ignore filter)\n this._tempSelectedRoles = new Set(this.availableRoles.map(role => role.id));\n this.requestUpdate();\n }\n\n private _selectNoneGlobal() {\n // Deselect all roles (ignore filter)\n this._tempSelectedRoles = new Set();\n this.requestUpdate();\n }\n\n private _resetToOriginal() {\n this._tempSelectedRoles = new Set(this.selectedRoleIds);\n this.requestUpdate();\n }\n\n private _handleCancel() {\n this._initializeTempSelection();\n this.dispatchEvent(new CustomEvent('dialog-cancel', {\n bubbles: true\n }));\n }\n\n private _handleApply() {\n const selectedRoles = Array.from(this._tempSelectedRoles);\n this.dispatchEvent(new CustomEvent('roles-filter-apply', {\n detail: { selectedRoleIds: selectedRoles },\n bubbles: true\n }));\n }\n\n private _handleBackdropClick(event: Event) {\n if (event.target === this) {\n this._handleCancel();\n }\n }\n\n render() {\n const selectedCount = this._tempSelectedRoles.size;\n const totalCount = this.availableRoles.length;\n const filteredCount = this._filteredRoles.length;\n const hasSearchQuery = this._searchQuery.trim().length > 0;\n\n return html`\n <div class=\"dialog\" @click=\"${(e: Event) => e.stopPropagation()}\">\n <!-- Dialog Header -->\n <div class=\"dialog-header\">\n <svg class=\"filter-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"/>\n </svg>\n <h2 class=\"dialog-title\">Filter Roles</h2>\n <button class=\"close-button\" @click=\"${this._handleCancel}\">×</button>\n </div>\n\n <!-- Dialog Content -->\n <div class=\"dialog-content\">\n <p class=\"description\">\n Select the roles you want to display in the form. You can search and choose specific roles \n to focus on or manage all ${totalCount} available roles.\n </p>\n\n <!-- Search Input -->\n <div class=\"search-container\">\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search roles by name, ID, or URI...\"\n .value=\"${this._searchQuery}\"\n @input=\"${this._handleSearchInput}\"\n />\n ${this._searchQuery ? html`\n <button class=\"clear-search\" @click=\"${this._clearSearch}\" title=\"Clear search\">\n ×\n </button>\n ` : html`\n <svg class=\"search-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>\n </svg>\n `}\n </div>\n\n <!-- Search Results Info -->\n ${hasSearchQuery ? html`\n <div class=\"search-results-info\">\n Showing ${filteredCount} of ${totalCount} roles\n ${filteredCount !== totalCount ? html`matching \"${this._searchQuery}\"` : ''}\n </div>\n ` : ''}\n\n <!-- Selection Controls -->\n <div class=\"selection-controls\">\n ${hasSearchQuery ? html`\n <button class=\"selection-control\" @click=\"${this._selectAll}\">\n Select Filtered (${filteredCount})\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNone}\">\n Deselect Filtered\n </button>\n <button class=\"selection-control\" @click=\"${this._selectAllGlobal}\">\n Select All (${totalCount})\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNoneGlobal}\">\n Deselect All\n </button>\n ` : html`\n <button class=\"selection-control\" @click=\"${this._selectAll}\">\n Select All\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNone}\">\n Select None\n </button>\n `}\n <button class=\"selection-control\" @click=\"${this._resetToOriginal}\">\n Reset\n </button>\n </div>\n\n <!-- Roles List -->\n <div class=\"roles-list\">\n ${this._filteredRoles.length === 0 ? html`\n <div class=\"no-results\">\n ${hasSearchQuery ? html`\n No roles found matching \"${this._searchQuery}\".<br>\n Try a different search term or clear the search.\n ` : html`\n No roles available.\n `}\n </div>\n ` : html`\n ${this._filteredRoles.map(role => {\n const isSelected = this._tempSelectedRoles.has(role.id);\n return html`\n <div class=\"role-item\">\n <input\n type=\"checkbox\"\n class=\"role-checkbox\"\n .checked=\"${isSelected}\"\n @change=\"${(e: Event) => this._handleCheckboxChange(e, role.id)}\"\n />\n <div class=\"role-info\">\n <h4 class=\"role-title\">${role.title}</h4>\n ${role.metadata?.roleURI ? html`\n <p class=\"role-description\">URI: ${role.metadata.roleURI}</p>\n ` : ''}\n </div>\n </div>\n `;\n })}\n `}\n </div>\n\n <div class=\"selected-count\">\n ${selectedCount} of ${totalCount} roles selected\n ${hasSearchQuery && filteredCount !== totalCount ? html`\n <br><small>(${this._getSelectedFilteredCount()} of ${filteredCount} filtered roles selected)</small>\n ` : ''}\n </div>\n </div>\n\n <!-- Dialog Actions -->\n <div class=\"dialog-actions\">\n <button class=\"btn-secondary\" @click=\"${this._handleCancel}\">\n Cancel\n </button>\n <button \n class=\"btn-primary\" \n @click=\"${this._handleApply}\"\n ?disabled=\"${selectedCount === 0}\"\n >\n Apply Filter (${selectedCount})\n </button>\n </div>\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { \n XBRLFormSchema, \n FormData, \n FormColumn, \n ValidationError, \n FormState,\n ComponentConfig,\n ConceptTree,\n FormField,\n FieldType,\n SubmissionData,\n SubmissionEntry,\n FormSection\n} from '../schema/types';\nimport { XBRLFormInput } from '../schema/xbrl-types';\nimport { FormValidator } from '../utils/validation';\nimport { XBRLFormBuilder } from '../utils/xbrl-form-builder';\nimport { AddColumnRequest, AvailableDimension } from './add-column-dialog';\nimport './form-section';\nimport './filter-roles-dialog';\n\n@customElement('jupiter-dynamic-form')\nexport class JupiterDynamicForm extends LitElement {\n @property({ type: Object }) schema?: XBRLFormSchema;\n @property({ type: Object }) xbrlInput?: XBRLFormInput;\n @property({ type: Object }) config: ComponentConfig = {};\n @property({ type: Object }) initialData: FormData = {};\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean }) readonly = false;\n @property({ type: String }) periodStartDate = '2025-01-01';\n @property({ type: String }) periodEndDate = '2025-12-31';\n @property({ type: String }) language = 'en';\n\n @state() private _formData: FormData = {};\n @state() private _preservedFormData: FormData = {}; // Preserve data for hidden sections\n @state() private _typedMemberData: { [columnId: string]: { [axisId: string]: string } } = {};\n @state() private _preservedTypedMemberData: { [columnId: string]: { [axisId: string]: string } } = {}; // Preserve typed data for hidden sections\n @state() private _columns: FormColumn[] = [];\n @state() private _errors: ValidationError[] = [];\n @state() private _touched = new Set<string>();\n @state() private _dirty = false;\n @state() private _valid = true;\n @state() private _submitted = false;\n @state() private _currentSchema?: XBRLFormSchema;\n @state() private _allSections: FormSection[] = [];\n @state() private _selectedRoleIds: string[] = [];\n @state() private _showFilterDialog = false;\n\n static styles = css`\n :host {\n display: block;\n font-family: var(--jupiter-font-family, system-ui, -apple-system, sans-serif);\n color: var(--jupiter-text-primary, #333);\n background: var(--jupiter-background, #fff);\n }\n\n .form-container {\n width: 100%;\n max-width: var(--jupiter-max-width, none);\n margin: 0 auto;\n }\n\n .form-header {\n padding: 24px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n background: var(--jupiter-form-header-background, #fff);\n }\n\n .form-title {\n font-size: 24px;\n font-weight: 600;\n margin: 0 0 8px 0;\n color: var(--jupiter-text-primary, #333);\n }\n\n .form-description {\n font-size: 16px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0;\n line-height: 1.5;\n }\n\n .form-actions {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n padding: 16px 24px;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n background: var(--jupiter-form-actions-background, #f8f9fa);\n display: flex;\n gap: 12px;\n align-items: center;\n z-index: 1000;\n box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .form-sections {\n padding: 24px;\n padding-bottom: 100px; /* Add space for fixed footer */\n }\n\n .validation-summary {\n margin-bottom: 16px;\n padding: 16px;\n border-radius: 4px;\n background: var(--jupiter-error-background, #ffebee);\n border: 1px solid var(--jupiter-error-color, #d32f2f);\n }\n\n .validation-summary-title {\n font-weight: 600;\n color: var(--jupiter-error-color, #d32f2f);\n margin: 0 0 8px 0;\n }\n\n .validation-summary-list {\n margin: 0;\n padding-left: 20px;\n }\n\n .validation-summary-item {\n color: var(--jupiter-error-color, #d32f2f);\n margin-bottom: 4px;\n }\n\n .form-actions button {\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .btn-primary {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--jupiter-primary-color-dark, #1565c0);\n }\n\n .btn-secondary {\n background: var(--jupiter-secondary-color, #757575);\n color: white;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--jupiter-secondary-color-dark, #616161);\n }\n\n .btn-outline {\n background: transparent;\n color: var(--jupiter-primary-color, #1976d2);\n border: 1px solid var(--jupiter-primary-color, #1976d2);\n }\n\n .btn-outline:hover:not(:disabled) {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n }\n\n button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .form-meta {\n display: flex;\n gap: 16px;\n align-items: center;\n font-size: 12px;\n color: var(--jupiter-text-secondary, #666);\n margin-left: auto;\n }\n\n .filter-roles-button {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: transparent;\n border: 1px solid var(--jupiter-primary-color, #1976d2);\n color: var(--jupiter-primary-color, #1976d2);\n border-radius: 4px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n margin-right: auto;\n }\n\n .filter-roles-button:hover:not(:disabled) {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n }\n\n .filter-roles-button .filter-icon {\n width: 16px;\n height: 16px;\n fill: currentColor;\n }\n\n .roles-count {\n display: inline-flex;\n align-items: center;\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n padding: 2px 6px;\n margin-left: 4px;\n min-width: 18px;\n justify-content: center;\n }\n\n .no-roles-message {\n padding: 40px;\n text-align: center;\n color: var(--jupiter-text-secondary, #666);\n background: var(--jupiter-background-light, #f8f9fa);\n border-radius: 8px;\n margin: 20px 0;\n }\n\n .no-roles-message h3 {\n margin: 0 0 16px 0;\n color: var(--jupiter-text-primary, #333);\n }\n\n .no-roles-message p {\n margin: 8px 0;\n line-height: 1.5;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._initializeForm();\n }\n\n updated(changedProperties: Map<string, any>) {\n if (changedProperties.has('xbrlInput') || changedProperties.has('schema')) {\n this._initializeForm();\n } else if (changedProperties.has('language')) {\n // Language changed - rebuild schema with new language while preserving form data\n console.log('🌐 Language changed from', changedProperties.get('language'), 'to', this.language);\n this._handleLanguageChange();\n }\n }\n\n /**\n * Handle language change - rebuild schema with new language while preserving form data\n */\n private _handleLanguageChange() {\n if (!this.xbrlInput) {\n console.warn('⚠️ Cannot change language without XBRL input data');\n return;\n }\n\n try {\n // Preserve current form data and state\n const currentFormData = { ...this._formData };\n const currentPreservedData = { ...this._preservedFormData };\n const currentTypedMemberData = { ...this._typedMemberData };\n const currentPreservedTypedMemberData = { ...this._preservedTypedMemberData };\n const currentSelectedRoles = [...this._selectedRoleIds];\n\n console.log('💾 Preserving form data during language change:', currentFormData);\n\n // Rebuild schema with new language\n console.log('🔄 Rebuilding form schema with language:', this.language);\n this._currentSchema = XBRLFormBuilder.buildFormSchema(\n this.xbrlInput,\n this.periodStartDate,\n this.periodEndDate,\n this.language\n );\n\n // Update all sections\n this._allSections = [...this._currentSchema.sections];\n\n // Restore selected roles and apply filter\n this._selectedRoleIds = currentSelectedRoles;\n this._applyRoleFilter();\n\n // Restore all form data\n this._formData = currentFormData;\n this._preservedFormData = currentPreservedData;\n this._typedMemberData = currentTypedMemberData;\n this._preservedTypedMemberData = currentPreservedTypedMemberData;\n\n console.log('✅ Language changed successfully, form data preserved');\n \n // Force complete re-render by clearing and rebuilding sections\n this.requestUpdate('_currentSchema');\n this.requestUpdate('language');\n } catch (error) {\n console.error('❌ Error changing language:', error);\n }\n }\n\n private _initializeForm() {\n // Generate schema from XBRL input if provided, otherwise use provided schema\n if (this.xbrlInput) {\n try {\n console.log('🔄 Initializing form from XBRL input:', this.xbrlInput);\n console.log('📅 Using period dates:', this.periodStartDate, 'to', this.periodEndDate);\n console.log('🌐 Using language:', this.language);\n this._currentSchema = XBRLFormBuilder.buildFormSchema(\n this.xbrlInput, \n this.periodStartDate, \n this.periodEndDate,\n this.language\n );\n console.log('✅ Generated schema with sections:', this._currentSchema.sections.length);\n \n // Store all sections for filtering\n this._allSections = [...this._currentSchema.sections];\n \n // Initialize selected roles - always let user choose which roles to display\n if (this._selectedRoleIds.length === 0) {\n // Don't preselect any roles - let user choose\n this._selectedRoleIds = [];\n // Show dialog by default to let user choose\n this._showFilterDialog = true;\n // Immediately set empty sections for consistency\n this._currentSchema = {\n ...this._currentSchema,\n sections: []\n };\n }\n \n // Apply current role filter - this will show empty form if no roles selected\n this._applyRoleFilter();\n \n // Use simple column structure for now\n this._columns = [\n {\n id: 'base',\n title: 'Value',\n description: 'Base values for concepts',\n type: 'base',\n order: 0,\n removable: false\n }\n ];\n } catch (error) {\n console.error('❌ Error building form from XBRL input:', error);\n this._currentSchema = this._getDefaultSchema();\n this._allSections = [];\n this._selectedRoleIds = [];\n this._columns = this._getDefaultColumns();\n }\n } else if (this.schema) {\n this._currentSchema = this.schema;\n this._allSections = [...this.schema.sections];\n this._selectedRoleIds = this._allSections.map(section => section.id);\n this._columns = this._getDefaultColumns();\n } else {\n this._currentSchema = this._getDefaultSchema();\n this._allSections = [];\n this._selectedRoleIds = [];\n this._columns = this._getDefaultColumns();\n }\n\n // Initialize form data\n this._formData = { ...this.initialData };\n if (this.xbrlInput?.initialData) {\n this._formData = { ...this._formData, ...this.xbrlInput.initialData };\n }\n \n // Validate initial data\n this._validateForm();\n }\n\n private _getDefaultSchema(): XBRLFormSchema {\n return {\n version: '1.0',\n formId: 'default-form',\n title: 'Dynamic Form',\n description: 'Please provide form schema or XBRL input data',\n sections: []\n };\n }\n\n private _getDefaultColumns(): FormColumn[] {\n return [\n {\n id: 'base',\n title: 'Value',\n description: 'Base values for concepts',\n type: 'base',\n order: 0,\n removable: false\n }\n ];\n }\n\n private _applyRoleFilter() {\n if (!this._currentSchema || !this._allSections.length) return;\n \n console.log(`🔍 Applying role filter: ${this._selectedRoleIds.length} selected out of ${this._allSections.length} total`);\n \n // If no roles are selected, show empty form (user needs to select roles)\n if (this._selectedRoleIds.length === 0) {\n console.log(`📝 No roles selected - showing empty form`);\n this._currentSchema = {\n ...this._currentSchema,\n sections: []\n };\n return;\n }\n \n // Before filtering, preserve data from sections that will be hidden\n this._preserveDataForHiddenSections();\n \n // Filter sections based on selected role IDs\n const filteredSections = this._allSections.filter(section => \n this._selectedRoleIds.includes(section.id)\n );\n \n // Restore data for sections that are now being shown\n this._restoreDataForVisibleSections(filteredSections);\n \n // Update current schema with filtered sections\n this._currentSchema = {\n ...this._currentSchema,\n sections: filteredSections\n };\n }\n\n private _preserveDataForHiddenSections() {\n // Get currently visible section IDs\n const currentlyVisibleSectionIds = this._currentSchema?.sections.map(s => s.id) || [];\n \n // Find sections that will be hidden after filter is applied\n const sectionsThatWillBeHidden = currentlyVisibleSectionIds.filter(\n sectionId => !this._selectedRoleIds.includes(sectionId)\n );\n \n // Preserve form data for concepts in hidden sections\n sectionsThatWillBeHidden.forEach(sectionId => {\n const section = this._allSections.find(s => s.id === sectionId);\n if (section) {\n this._preserveSectionData(section);\n }\n });\n \n console.log(`📦 Preserved data for ${sectionsThatWillBeHidden.length} hidden sections:`, sectionsThatWillBeHidden);\n }\n\n private _restoreDataForVisibleSections(visibleSections: FormSection[]) {\n // Restore data for sections that are now being shown\n visibleSections.forEach(section => {\n this._restoreSectionData(section);\n });\n \n console.log(`🔄 Restored data for ${visibleSections.length} visible sections`);\n }\n\n private _preserveSectionData(section: FormSection) {\n // Preserve form data for all concepts in this section\n section.concepts.forEach(concept => {\n this._preserveConceptData(concept);\n });\n }\n\n private _preserveConceptData(concept: ConceptTree) {\n // Preserve data for this concept\n if (this._formData[concept.id]) {\n this._preservedFormData[concept.id] = { ...this._formData[concept.id] };\n console.log(`💾 Preserved form data for concept: ${concept.id}`);\n }\n \n // Preserve typed member data for columns related to this concept\n concept.fields.forEach(field => {\n if (this._typedMemberData[field.columnId]) {\n this._preservedTypedMemberData[field.columnId] = { ...this._typedMemberData[field.columnId] };\n console.log(`💾 Preserved typed data for column: ${field.columnId}`);\n }\n });\n \n // Recursively preserve data for child concepts\n if (concept.children) {\n concept.children.forEach(child => {\n this._preserveConceptData(child);\n });\n }\n }\n\n private _restoreSectionData(section: FormSection) {\n // Restore form data for all concepts in this section\n section.concepts.forEach(concept => {\n this._restoreConceptData(concept);\n });\n }\n\n private _restoreConceptData(concept: ConceptTree) {\n // Restore data for this concept if it was preserved\n if (this._preservedFormData[concept.id]) {\n this._formData[concept.id] = { ...this._preservedFormData[concept.id] };\n console.log(`🔄 Restored form data for concept: ${concept.id}`);\n }\n \n // Restore typed member data for columns related to this concept\n concept.fields.forEach(field => {\n if (this._preservedTypedMemberData[field.columnId]) {\n this._typedMemberData[field.columnId] = { ...this._preservedTypedMemberData[field.columnId] };\n console.log(`🔄 Restored typed data for column: ${field.columnId}`);\n }\n });\n \n // Recursively restore data for child concepts\n if (concept.children) {\n concept.children.forEach(child => {\n this._restoreConceptData(child);\n });\n }\n }\n\n private _shouldShowFilterButton(): boolean {\n return true; // Always show filter button to allow role selection\n }\n\n private _handleFilterRolesClick() {\n this._showFilterDialog = true;\n }\n\n private _handleFilterDialogCancel() {\n this._showFilterDialog = false;\n \n // If no roles were previously selected (first time opening), \n // and user cancels, keep empty selection for consistency\n console.log(`🚫 Filter dialog cancelled. Current selection: ${this._selectedRoleIds.length}/${this._allSections.length}`);\n }\n\n private _handleRoleFilterApply(event: CustomEvent) {\n const { selectedRoleIds } = event.detail;\n this._selectedRoleIds = selectedRoleIds;\n this._applyRoleFilter();\n this._showFilterDialog = false;\n \n console.log(`🎯 Applied role filter: ${selectedRoleIds.length}/${this._allSections.length} roles selected`);\n \n // Dispatch event for external listeners\n this.dispatchEvent(new CustomEvent('roles-filter-changed', {\n detail: { \n selectedRoleIds, \n totalRoles: this._allSections.length,\n visibleRoles: selectedRoleIds.length\n },\n bubbles: true\n }));\n }\n\n private _validateForm() {\n const errors: ValidationError[] = [];\n \n // Use current schema for validation\n const schema = this._currentSchema;\n if (!schema) return;\n \n // Validate each section and its concepts\n for (const section of schema.sections) {\n for (const concept of section.concepts) {\n for (const field of concept.fields) {\n const value = this._formData[concept.id]?.[field.columnId];\n const fieldErrors = FormValidator.validateField(\n field.id,\n concept.id,\n field.columnId,\n value,\n field.type,\n field.validation || []\n );\n errors.push(...fieldErrors);\n }\n }\n }\n\n this._errors = errors;\n this._valid = errors.filter(e => e.severity === 'error').length === 0;\n }\n\n private _handleFieldChange(event: CustomEvent) {\n const { fieldId, conceptId, columnId, value } = event.detail;\n \n // Update form data with proper immutable update to trigger Lit reactivity\n const updatedFormData = { ...this._formData };\n if (!updatedFormData[conceptId]) {\n updatedFormData[conceptId] = {};\n }\n const oldValue = updatedFormData[conceptId][columnId];\n updatedFormData[conceptId] = { ...updatedFormData[conceptId], [columnId]: value };\n this._formData = updatedFormData;\n \n // Mark as touched and dirty\n this._touched.add(`${conceptId}-${columnId}`);\n this._dirty = true;\n \n // Re-validate\n this._validateForm();\n \n // Trigger update (should be automatic with the new object reference)\n this.requestUpdate();\n \n // Dispatch change event\n this.dispatchEvent(new CustomEvent('field-change', {\n detail: { fieldId, conceptId, columnId, value, oldValue },\n bubbles: true\n }));\n }\n\n /**\n * Generate a unique concept key that includes section context\n */\n private _generateUniqueConceptKey(sectionId: string, conceptId: string): string {\n return `${sectionId}::${conceptId}`;\n }\n\n /**\n * Extract the original concept ID from a unique concept key\n */\n private _extractOriginalConceptId(uniqueConceptKey: string): string {\n const parts = uniqueConceptKey.split('::');\n return parts.length > 1 ? parts[1] : uniqueConceptKey;\n }\n\n private _handleTypedMemberChange(event: CustomEvent) {\n const { columnId, axisId, value } = event.detail;\n \n console.log(`🔍 [DynamicForm] Typed member change: columnId=${columnId}, axisId=${axisId}, value=${value}`);\n \n // Update typed member data with immutable update\n const updatedTypedMemberData = { ...this._typedMemberData };\n if (!updatedTypedMemberData[columnId]) {\n updatedTypedMemberData[columnId] = {};\n }\n updatedTypedMemberData[columnId] = { ...updatedTypedMemberData[columnId], [axisId]: value };\n this._typedMemberData = updatedTypedMemberData;\n \n // Mark as dirty\n this._dirty = true;\n \n // Trigger update\n this.requestUpdate();\n \n // Dispatch change event\n this.dispatchEvent(new CustomEvent('typed-member-change', {\n detail: { columnId, axisId, value },\n bubbles: true\n }));\n }\n\n private _handleSectionExpand(event: CustomEvent) {\n this.dispatchEvent(new CustomEvent('section-expand', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _handleConceptExpand(event: CustomEvent) {\n this.dispatchEvent(new CustomEvent('concept-expand', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _handleColumnRemove(event: CustomEvent) {\n const { columnId, sectionId } = event.detail;\n \n // Remove column from ONLY the specific section\n if (this._currentSchema && sectionId) {\n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection && targetSection.columns) {\n targetSection.columns = targetSection.columns.filter(col => col.id !== columnId);\n }\n } else {\n // Fallback: remove from all sections (for backward compatibility)\n this._columns = this._columns.filter(col => col.id !== columnId);\n \n if (this._currentSchema) {\n this._currentSchema.sections.forEach(section => {\n if (section.columns) {\n section.columns = section.columns.filter(col => col.id !== columnId);\n }\n });\n }\n }\n \n // Remove data for this column from the specific section's concepts\n this._removeColumnData(columnId, sectionId);\n \n this._dirty = true;\n this._validateForm();\n this.requestUpdate();\n \n this.dispatchEvent(new CustomEvent('column-remove', {\n detail: { columnId, sectionId },\n bubbles: true\n }));\n }\n\n private _handleColumnAddRequest(event: CustomEvent) {\n const { sectionId, columnRequest } = event.detail;\n this._addColumnFromRequest(columnRequest, sectionId);\n }\n\n private _getAvailableDimensionsForSection(sectionId: string): AvailableDimension[] {\n console.log(`🔍 Getting dimensions for section: ${sectionId}`);\n \n if (!this.xbrlInput?.hypercubes?.[0]) {\n console.log('❌ No hypercubes data available');\n return [];\n }\n\n //console.log(`📊 Available hypercube roles:`, this.xbrlInput.hypercubes[0].roles.map(r => r.roleId));\n \n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === sectionId);\n \n if (!hypercubeRole?.items?.length) {\n console.log(`❌ No hypercube items found for role: ${sectionId}`);\n return [];\n }\n\n console.log(`✅ Found hypercube role with ${hypercubeRole.items.length} items`);\n \n const availableDimensions: AvailableDimension[] = [];\n\n // Process all hypercube items to find unique dimensions\n hypercubeRole.items.forEach(item => {\n if (item.dimensions && item.dimensions.length > 0) {\n item.dimensions.forEach(dimension => {\n // Check if we already have this dimension\n if (!availableDimensions.find(d => d.id === dimension.id)) {\n const axisLabel = dimension.labels.find(l => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n \n const availableDimension: AvailableDimension = {\n id: dimension.id,\n conceptName: dimension.conceptName,\n axisLabel: axisLabel\n };\n\n // Add members if available\n if (dimension.members && dimension.members.length > 0) {\n availableDimension.members = dimension.members.map(member => ({\n id: member.id,\n label: member.labels?.find(l => l.role === 'http://www.xbrl.org/2003/role/label')?.label || member.conceptName || member.id\n }));\n }\n\n // Add typed member if available\n if (dimension.typedMember) {\n availableDimension.typedMember = {\n id: dimension.typedMember.id,\n dataType: 'string' // Default to string for now\n };\n }\n\n availableDimensions.push(availableDimension);\n }\n });\n }\n });\n\n console.log(`📈 Found ${availableDimensions.length} dimensions for section ${sectionId}:`, availableDimensions.map(d => d.axisLabel));\n return availableDimensions;\n }\n\n private _addColumnFromRequest(request: AddColumnRequest, sectionId: string) {\n const timestamp = Date.now();\n const newColumnId = `col-${timestamp}`;\n \n let title = '';\n let description = '';\n \n if (request.periodType === 'instant') {\n title = 'Current';\n description = `Values as of ${request.instantDate}`;\n } else if (request.periodType === 'duration' || request.periodType === 'mixed') {\n title = 'Current Period';\n description = `Period: ${request.startDate} to ${request.endDate}`;\n }\n \n // Process selected dimensions from the dialog\n let dimensionData: any = {\n dimensionId: 'period',\n memberValue: request.periodType === 'instant' ? \n `instant-${request.instantDate}` : \n `duration-${request.startDate}-${request.endDate}`,\n memberLabel: title,\n };\n \n // If dimensions were selected in the dialog, use them\n if (request.selectedDimensions && request.selectedDimensions.length > 0) {\n const dimensionParts: string[] = [];\n const dimensionKeys: string[] = [];\n \n for (const dimSelection of request.selectedDimensions) {\n if (dimSelection.isTyped && dimSelection.typedValue) {\n // Typed dimension\n dimensionParts.push(`${dimSelection.axisLabel}: ${dimSelection.typedValue}`);\n dimensionKeys.push(`${dimSelection.axisId}|${dimSelection.typedValue}`);\n } else if (dimSelection.memberId && dimSelection.memberLabel) {\n // Domain dimension with selected member\n dimensionParts.push(dimSelection.memberLabel);\n dimensionKeys.push(`${dimSelection.axisId}|${dimSelection.memberId}`);\n }\n }\n \n // Build combined title with dimensions\n const periodPart = request.periodType === 'instant' ? \n `(${request.instantDate})` : \n `(${request.startDate} / ${request.endDate})`;\n \n if (dimensionParts.length > 0) {\n title = `${dimensionParts.join(' | ')} ${periodPart}`;\n \n dimensionData = {\n dimensionId: newColumnId,\n memberValue: dimensionParts.join(' | '),\n memberLabel: dimensionParts.join(' | '),\n memberKey: dimensionParts.join(' | '),\n dimensionIdKey: dimensionKeys.join('::'),\n selectedDimensions: request.selectedDimensions\n };\n \n console.log(`📊 Applied selected dimensions to new column: ${dimensionData.memberKey}`);\n }\n } else {\n // Fallback to existing hypercube logic for backwards compatibility\n if (this.xbrlInput?.hypercubes?.[0]) {\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === sectionId);\n \n if (hypercubeRole?.items?.length === 1) {\n const item = hypercubeRole.items[0];\n if (item.dimensions.length === 1) {\n const dimension = item.dimensions[0];\n if (dimension.members && dimension.members.length > 0) {\n // Find axis label\n const axisLabel = dimension.labels.find(l => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n \n // For manually added columns, we could offer choice or use first member\n // For now, using first member as specified in requirements\n const firstMember = dimension.members[0];\n const memberLabel = firstMember.labels.find(l => l.role === 'http://www.xbrl.org/2003/role/label')?.label || firstMember.conceptName;\n \n // Update title to include dimension information\n const periodPart = request.periodType === 'instant' ? \n `(${request.instantDate})` : \n `(${request.startDate} / ${request.endDate})`;\n title = `${memberLabel} ${periodPart}`;\n \n dimensionData = {\n dimensionId: newColumnId,\n axisId: dimension.id,\n memberId: firstMember.id,\n memberValue: memberLabel,\n memberLabel: memberLabel,\n axis: axisLabel,\n axisLabel: axisLabel,\n memberKey: `${axisLabel} | ${memberLabel}`,\n dimensionIdKey: `${dimension.id} | ${firstMember.id}`\n };\n \n console.log(`📊 Applied hypercube dimension to new column: ${dimensionData.memberKey}`);\n }\n }\n }\n }\n }\n \n const newColumn: FormColumn = {\n id: newColumnId,\n title,\n description,\n type: dimensionData.memberKey ? 'dimension' : 'dimension',\n order: this._columns.length,\n removable: true,\n dimensionData\n };\n\n // Store typed member data for the new column if typed dimensions were selected\n if (request.selectedDimensions && request.selectedDimensions.length > 0) {\n const typedMembers: { [axisId: string]: string } = {};\n let hasTypedDimensions = false;\n \n for (const dimSelection of request.selectedDimensions) {\n if (dimSelection.isTyped) {\n // Initialize typed member data with provided value or empty string\n typedMembers[dimSelection.axisId] = dimSelection.typedValue || '';\n hasTypedDimensions = true;\n console.log(`💾 Initializing typed member data: ${dimSelection.axisLabel} = \"${dimSelection.typedValue || '(empty - will be entered in column header)'}\"`);\n }\n }\n \n if (hasTypedDimensions) {\n this._typedMemberData[newColumnId] = typedMembers;\n // Update dimension data to indicate it has typed members and include the typed member info\n if (newColumn.dimensionData) {\n newColumn.dimensionData.hasTypedMembers = true;\n // Create typedMembers array for the form-section template\n newColumn.dimensionData.typedMembers = request.selectedDimensions\n .filter(dim => dim.isTyped)\n .map(dim => ({\n axisId: dim.axisId,\n axisLabel: dim.axisLabel,\n typedMemberId: dim.axisId, // Use axisId as typedMemberId for typed dimensions\n memberLabel: dim.axisLabel // Use axisLabel as memberLabel\n }));\n console.log(`� Added typed members to column dimension data:`, newColumn.dimensionData.typedMembers);\n }\n console.log(`� Initialized typed member data for column ${newColumnId}:`, typedMembers);\n }\n }\n \n // Add column ONLY to the specific section that requested it\n if (this._currentSchema) {\n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection) {\n if (!targetSection.columns) {\n targetSection.columns = [...this._columns];\n }\n targetSection.columns = [...targetSection.columns, newColumn];\n }\n }\n \n // Replicate form fields for existing concepts in ONLY the target section\n this._replicateFieldsForNewColumn(newColumnId, request, sectionId);\n \n this._dirty = true;\n this.requestUpdate();\n \n this.dispatchEvent(new CustomEvent('column-add', {\n detail: { column: newColumn },\n bubbles: true\n }));\n }\n\n private _removeColumnData(columnId: string, sectionId?: string) {\n if (!this._currentSchema) return;\n \n if (sectionId) {\n // Remove data only for concepts in the specific section\n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection) {\n this._removeColumnDataFromConcepts(targetSection.concepts, columnId);\n }\n } else {\n // Remove data for all concepts in all sections\n for (const conceptId in this._formData) {\n if (this._formData[conceptId][columnId] !== undefined) {\n delete this._formData[conceptId][columnId];\n }\n }\n }\n }\n\n private _removeColumnDataFromConcepts(concepts: ConceptTree[], columnId: string) {\n concepts.forEach(concept => {\n // Remove form data for this concept and column\n if (this._formData[concept.id] && this._formData[concept.id][columnId] !== undefined) {\n delete this._formData[concept.id][columnId];\n }\n \n // Remove field from concept's fields array\n if (concept.fields) {\n concept.fields = concept.fields.filter(field => field.columnId !== columnId);\n }\n \n // Recursively process children\n if (concept.children) {\n this._removeColumnDataFromConcepts(concept.children, columnId);\n }\n });\n }\n\n private _shouldCreateFieldForConcept(concept: ConceptTree, request: AddColumnRequest): boolean {\n // Don't create fields for abstract concepts\n if (concept.abstract) {\n return false;\n }\n \n // Check period type compatibility\n if (concept.periodType) {\n if (request.periodType === 'instant' && concept.periodType !== 'instant') {\n return false;\n }\n if (request.periodType === 'duration' && concept.periodType !== 'duration') {\n return false;\n }\n }\n \n return true;\n }\n\n private _replicateFieldsForNewColumn(columnId: string, request: AddColumnRequest, sectionId: string) {\n if (!this._currentSchema) return;\n \n // Build fields for the new column for ONLY the specific section\n const formBuilder = new XBRLFormBuilder();\n \n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection) {\n this._replicateFieldsForSection(targetSection.concepts, columnId, request, formBuilder);\n }\n }\n\n private _replicateFieldsForSection(concepts: ConceptTree[], columnId: string, request: AddColumnRequest, formBuilder: XBRLFormBuilder) {\n concepts.forEach(concept => {\n // Check if we should create a field for this concept in the new column\n if (this._shouldCreateFieldForConcept(concept, request)) {\n // Create a new field manually based on existing field structure or from scratch\n const existingField = concept.fields?.[0]; // Use first existing field as template\n \n let field: FormField;\n if (existingField) {\n // Template from existing field\n field = {\n id: `${concept.id}_${columnId}`,\n conceptId: concept.id,\n columnId: columnId,\n type: existingField.type,\n label: existingField.label,\n placeholder: existingField.placeholder,\n required: existingField.required,\n disabled: existingField.disabled,\n validation: existingField.validation,\n defaultValue: existingField.defaultValue,\n // Set period dates from the add column request\n periodStartDate: request.periodType === 'instant' ? request.instantDate : request.startDate,\n periodEndDate: request.periodType === 'instant' ? request.instantDate : request.endDate\n };\n } else {\n // Create field from scratch for concepts without existing fields\n field = {\n id: `${concept.id}_${columnId}`,\n conceptId: concept.id,\n columnId: columnId,\n type: 'text' as FieldType,\n label: concept.label || concept.name,\n placeholder: `Enter ${concept.name}`,\n required: false,\n disabled: false,\n validation: [],\n defaultValue: '',\n // Set period dates from the add column request\n periodStartDate: request.periodType === 'instant' ? request.instantDate : request.startDate,\n periodEndDate: request.periodType === 'instant' ? request.instantDate : request.endDate\n };\n }\n \n // Add field to concept's fields array\n if (!concept.fields) {\n concept.fields = [];\n }\n concept.fields.push(field);\n }\n \n // Recursively process children\n if (concept.children) {\n this._replicateFieldsForSection(concept.children, columnId, request, formBuilder);\n }\n });\n }\n\n private _addColumn() {\n // This would typically open a dialog to configure the new dimension column\n // For now, we'll add a generic dimension column\n const newColumnId = `dim-${Date.now()}`;\n const newColumn: FormColumn = {\n id: newColumnId,\n title: `Dimension ${this._columns.length}`,\n description: 'Additional dimension column',\n type: 'dimension',\n order: this._columns.length,\n removable: true,\n dimensionData: {\n dimensionId: 'custom',\n memberValue: 'default',\n memberLabel: 'Default Member',\n }\n };\n \n this._columns = [...this._columns, newColumn];\n this.requestUpdate();\n \n this.dispatchEvent(new CustomEvent('column-add', {\n detail: { column: newColumn },\n bubbles: true\n }));\n }\n\n private _handleSubmit() {\n console.log('📝 Form submission started...');\n this._submitted = true;\n this._validateForm();\n \n // Generate submission data in the required format\n const submissionData = this._generateSubmissionData();\n \n // Log final submission data for debugging\n console.log('📊 Form Submission Data:', JSON.stringify(submissionData, null, 2));\n \n this.dispatchEvent(new CustomEvent('form-submit', {\n detail: {\n data: this._formData,\n submissionData: submissionData,\n valid: this._valid,\n errors: this._errors\n },\n bubbles: true\n }));\n \n console.log('✅ Form submit event dispatched');\n }\n\n private _handleSaveDraft() {\n // Generate draft data in the same format as submission\n const draftData = this._generateSubmissionData();\n \n this.dispatchEvent(new CustomEvent('form-save-draft', {\n detail: {\n data: this._formData,\n draftData: draftData,\n valid: this._valid,\n errors: this._errors\n },\n bubbles: true\n }));\n }\n\n private _generateSubmissionData(): SubmissionData {\n const submissionData: SubmissionData = [];\n \n if (!this._currentSchema) {\n return submissionData;\n }\n\n // Include data from currently visible sections\n this._currentSchema.sections.forEach(section => {\n this._processConceptsForSubmission(section.concepts, submissionData, section);\n });\n\n // IMPORTANT: Also include data from preserved (hidden) sections\n this._includePreservedDataInSubmission(submissionData);\n\n // Remove duplicates from submission data\n const uniqueSubmissionData = this._removeDuplicateSubmissions(submissionData);\n \n return uniqueSubmissionData;\n }\n\n private _includePreservedDataInSubmission(submissionData: SubmissionData) {\n // Process preserved form data\n Object.keys(this._preservedFormData).forEach(conceptId => {\n const conceptData = this._preservedFormData[conceptId];\n if (conceptData) {\n Object.keys(conceptData).forEach(columnId => {\n const value = conceptData[columnId];\n if (value !== undefined && value !== null && value !== '') {\n // Find the original concept from all sections to get proper submission data\n const originalConcept = this._findConceptInAllSections(conceptId);\n if (originalConcept) {\n const originalSection = this._findSectionForConcept(conceptId);\n this._addConceptDataToSubmission(originalConcept, columnId, value, submissionData, originalSection || undefined);\n }\n }\n });\n }\n });\n\n console.log(`📤 Included preserved data in submission. Total entries: ${submissionData.length}`);\n }\n\n private _findConceptInAllSections(conceptId: string): ConceptTree | null {\n for (const section of this._allSections) {\n const concept = this._findConceptInSection(section.concepts, conceptId);\n if (concept) {\n return concept;\n }\n }\n return null;\n }\n\n private _findConceptInSection(concepts: ConceptTree[], conceptId: string): ConceptTree | null {\n for (const concept of concepts) {\n if (concept.id === conceptId) {\n return concept;\n }\n if (concept.children) {\n const found = this._findConceptInSection(concept.children, conceptId);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n\n private _findSectionForConcept(conceptId: string): FormSection | null {\n for (const section of this._allSections) {\n const concept = this._findConceptInSection(section.concepts, conceptId);\n if (concept) {\n return section;\n }\n }\n return null;\n }\n\n private _addConceptDataToSubmission(concept: ConceptTree, columnId: string, value: any, submissionData: SubmissionData, section?: FormSection) {\n // Find the matching field for this column\n const field = concept.fields.find(f => f.columnId === columnId);\n if (!field) return;\n\n // Determine period type for submission\n const isInstant = concept.periodType === 'instant';\n \n const entry: SubmissionEntry = {\n conceptId: concept.originalConceptId || concept.id,\n value: value,\n period: {\n type: concept.periodType || 'duration',\n ...(isInstant \n ? { date: field.periodStartDate || this.periodStartDate }\n : { \n startDate: field.periodStartDate || this.periodStartDate,\n endDate: field.periodEndDate || this.periodEndDate\n })\n }\n };\n\n // Add dimension information if available\n const column = this._findColumnByIdInAllSections(columnId);\n if (column?.dimensionData?.memberLabel) {\n entry.dimension = column.dimensionData.memberLabel;\n }\n\n submissionData.push(entry);\n }\n\n private _findColumnByIdInAllSections(columnId: string): FormColumn | undefined {\n for (const section of this._allSections) {\n if (section.columns) {\n const column = section.columns.find(col => col.id === columnId);\n if (column) {\n return column;\n }\n }\n }\n return undefined;\n }\n\n private _removeDuplicateSubmissions(submissionData: SubmissionData): SubmissionData {\n const uniqueEntries = new Map<string, any>();\n \n submissionData.forEach(entry => {\n // Create a unique key based on concept ID, value, and dimension\n const key = `${entry.conceptId}_${entry.value}_${entry.dimension || 'no-dimension'}`;\n \n // Only keep the first occurrence of each unique entry\n if (!uniqueEntries.has(key)) {\n uniqueEntries.set(key, entry);\n }\n });\n \n return Array.from(uniqueEntries.values());\n }\n\n private _findColumnById(columnId: string): FormColumn | undefined {\n if (!this._currentSchema) {\n return undefined;\n }\n\n for (const section of this._currentSchema.sections) {\n if (section.columns) {\n const column = section.columns.find(col => col.id === columnId);\n if (column) {\n return column;\n }\n }\n }\n return undefined;\n }\n\n private _findColumnByIdInSection(columnId: string, section?: FormSection): FormColumn | undefined {\n if (!section?.columns) {\n return undefined;\n }\n\n return section.columns.find(col => col.id === columnId);\n }\n\n private _getTypedMemberNameForAxis(axisId: string, section?: FormSection): string | null {\n // Look for the typed member name in the hypercube data\n if (!this.xbrlInput?.hypercubes?.[0]) {\n return null;\n }\n\n const sectionRoleId = section?.id;\n if (!sectionRoleId) {\n return null;\n }\n\n // Find the role in hypercubes\n const hypercube = this.xbrlInput.hypercubes[0];\n const role = hypercube.roles?.find((r: any) => r.roleId === sectionRoleId);\n if (!role?.items) {\n return null;\n }\n\n // Search through all items for dimensions matching the axis\n for (const item of role.items) {\n if (item.dimensions) {\n const dimension = item.dimensions.find((d: any) => d.id === axisId);\n if (dimension?.typedMember?.id) {\n return dimension.typedMember.id;\n }\n }\n }\n\n return null;\n }\n\n private _doesConceptApplyToTypedDimension(concept: ConceptTree, section?: FormSection, columnId?: string): boolean {\n // Check if this concept is part of a hypercube that has typed dimensions\n if (!this.xbrlInput?.hypercubes?.[0]) {\n return false;\n }\n\n const sectionRoleId = section?.id;\n if (!sectionRoleId) {\n return false;\n }\n\n // Find the hypercube role that matches this section\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === sectionRoleId);\n if (!hypercubeRole?.items?.length) {\n return false;\n }\n\n // Check if any hypercube item contains this concept and has typed dimensions\n for (const item of hypercubeRole.items) {\n // Check if this concept is in the conceptIds list for this hypercube item\n const conceptIdToCheck = concept.originalConceptId || concept.id;\n if (item.conceptIds && item.conceptIds.includes(conceptIdToCheck)) {\n // Check if this hypercube item has typed dimensions\n const hasTypedDimensions = item.dimensions.some(dim => dim.typedMember);\n console.log(`🔍 [DynamicForm] Concept ${conceptIdToCheck} found in hypercube item. Has typed dimensions:`, hasTypedDimensions);\n return hasTypedDimensions;\n }\n }\n\n console.log(`🔍 [DynamicForm] Concept ${concept.originalConceptId || concept.id} not found in any hypercube items for role ${sectionRoleId}`);\n return false;\n }\n\n /**\n * Get the specific typed dimensions that apply to a concept in its role\n */\n private _getApplicableTypedDimensions(concept: ConceptTree, section?: FormSection): string[] {\n if (!this.xbrlInput?.hypercubes?.[0] || !section?.id) {\n return [];\n }\n\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === section.id);\n if (!hypercubeRole?.items?.length) {\n return [];\n }\n\n const conceptIdToCheck = concept.originalConceptId || concept.id;\n \n // Find the hypercube item that contains this concept\n for (const item of hypercubeRole.items) {\n if (item.conceptIds && item.conceptIds.includes(conceptIdToCheck)) {\n // Return the IDs of typed dimensions in this hypercube item\n const typedDimensions = item.dimensions\n .filter(dim => dim.typedMember)\n .map(dim => dim.id);\n \n console.log(`🔍 [DynamicForm] Found applicable typed dimensions for concept ${conceptIdToCheck}:`, typedDimensions);\n return typedDimensions;\n }\n }\n\n return [];\n }\n\n private _processConceptsForSubmission(concepts: ConceptTree[], submissionData: SubmissionData, section?: FormSection) {\n const targetRole = \"Toelichting op de geconsolideerde jaarrekening - Financiële vaste activa: Deelnemingen: Volledig geconsolideerd: Specificatie\";\n const sectionTitle = section?.title || 'Unknown';\n \n concepts.forEach(concept => {\n // Enhanced debug logging for target role\n if (sectionTitle === targetRole) {\n console.warn(`[DUPLICATE DEBUG] Processing concept ${concept.originalConceptId || concept.id} in target role`);\n if (concept.fields) {\n console.warn(`[DUPLICATE DEBUG] Concept has ${concept.fields.length} fields`);\n concept.fields.forEach((field, index) => {\n console.warn(`[DUPLICATE DEBUG] Field ${index}: columnId=${field.columnId}, current value=${this._formData[concept.id]?.[field.columnId]}`);\n });\n }\n }\n \n // Debug log for any concept with multiple fields\n if (concept.fields && concept.fields.length > 1) {\n console.log(`🔍 [DEBUG] Processing concept ${concept.originalConceptId}, fields count: ${concept.fields.length}`);\n concept.fields.forEach((field, index) => {\n console.log(` Field ${index}: columnId=${field.columnId}, value=${this._formData[concept.id]?.[field.columnId]}`);\n });\n }\n \n // Process fields for this concept\n if (concept.fields && concept.fields.length > 0) {\n concept.fields.forEach(field => {\n // Get the value from the nested form data structure\n const conceptData = this._formData[concept.id];\n const fieldValue = conceptData?.[field.columnId];\n \n // Only include fields that have values\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n // Log submission entry creation for target role\n if (sectionTitle === targetRole) {\n console.warn(`[DUPLICATE DEBUG] Creating submission entry for concept ${concept.originalConceptId || concept.id}, field columnId=${field.columnId}, value=${fieldValue}`);\n }\n \n // Find the column information from the SPECIFIC section to check for dimension data\n const column = this._findColumnByIdInSection(field.columnId, section);\n console.log(`🔍 [DynamicForm] Processing field for concept ${concept.originalConceptId || concept.id}, field columnId: ${field.columnId}, found column in section ${section?.id}: ${!!column}, column title: ${column?.title}`);\n \n const submissionEntry: any = {\n conceptId: concept.id,\n value: fieldValue,\n period: {\n type: concept.periodType || 'duration'\n } as { type: 'instant' | 'duration'; date?: string; startDate?: string; endDate?: string; }\n };\n\n // Determine period structure based on concept's period type\n if (concept.periodType === 'instant') {\n // For instant concepts, use a single date\n submissionEntry.period.date = field.periodStartDate || this.periodStartDate;\n } else {\n // For duration concepts, use start and end dates\n submissionEntry.period.startDate = field.periodStartDate || this.periodStartDate;\n submissionEntry.period.endDate = field.periodEndDate || this.periodEndDate;\n }\n\n // Add dimension information\n // Only use dimension data from the specific column that this field is linked to\n if (column?.type === 'dimension' && column.dimensionData?.dimensionIdKey) {\n submissionEntry.dimension = column.dimensionData.dimensionIdKey;\n console.log(`🔍 [DynamicForm] Using dimension key from field's column (${field.columnId}):`, column.dimensionData.dimensionIdKey);\n } else {\n console.log(`🔍 [DynamicForm] No dimension data found for field column ${field.columnId}. Column type: ${column?.type}, has dimensionData: ${!!column?.dimensionData}`);\n }\n\n // Add typed member values if they exist for this column AND the concept is part of the hypercube\n if (this._typedMemberData[field.columnId]) {\n const applicableTypedDimensions = this._getApplicableTypedDimensions(concept, section);\n console.log(`🔍 [DynamicForm] Concept ${concept.id} applicable typed dimensions:`, applicableTypedDimensions);\n \n if (applicableTypedDimensions.length > 0) {\n // Filter typed member data to only include dimensions applicable to this concept\n const filteredTypedMembers: { [axisId: string]: { value: string; memberName: string } } = {};\n const allTypedMemberData = this._typedMemberData[field.columnId];\n \n applicableTypedDimensions.forEach(dimensionId => {\n if (allTypedMemberData[dimensionId]) {\n const memberName = this._getTypedMemberNameForAxis(dimensionId, section);\n filteredTypedMembers[dimensionId] = {\n value: allTypedMemberData[dimensionId],\n memberName: memberName || 'Unknown'\n };\n }\n });\n \n if (Object.keys(filteredTypedMembers).length > 0) {\n submissionEntry.typedMembers = filteredTypedMembers;\n console.log(`🔍 [DynamicForm] Adding filtered typed members to submission:`, filteredTypedMembers);\n } else {\n console.log(`🔍 [DynamicForm] No typed member values found for applicable dimensions:`, applicableTypedDimensions);\n }\n } else {\n console.log(`🔍 [DynamicForm] Skipping typed members for concept ${concept.id} - not applicable to this hypercube`);\n }\n } else {\n console.log(`🔍 [DynamicForm] No typed member data found for column ${field.columnId}. Available columns:`, Object.keys(this._typedMemberData));\n if (column) {\n console.log(`🔍 [DynamicForm] Column details:`, {\n id: column.id,\n type: column.type,\n hasTypedMembers: column.dimensionData?.hasTypedMembers,\n dimensionData: column.dimensionData\n });\n }\n }\n\n // Log final submission entry for target role\n if (sectionTitle === targetRole) {\n console.warn(`[DUPLICATE DEBUG] Final submission entry:`, submissionEntry);\n }\n\n submissionData.push(submissionEntry);\n }\n });\n }\n\n // Recursively process children\n if (concept.children) {\n this._processConceptsForSubmission(concept.children, submissionData, section);\n }\n });\n }\n\n private _handleReset() {\n this._formData = { ...this.initialData };\n this._touched.clear();\n this._dirty = false;\n this._submitted = false;\n\n // Clear preserved data when form is reset\n this._preservedFormData = {};\n this._preservedTypedMemberData = {};\n\n console.log('🔄 Form reset - all data and preserved data cleared');\n\n this._validateForm();\n this.requestUpdate();\n \n this.dispatchEvent(new CustomEvent('form-reset', {\n detail: {},\n bubbles: true\n }));\n }\n\n private _getFormState(): FormState {\n return {\n data: this._formData,\n errors: this._errors,\n touched: this._touched,\n dirty: this._dirty,\n valid: this._valid,\n submitted: this._submitted\n };\n }\n\n // Public API methods\n public getData(): FormData {\n return { ...this._formData };\n }\n\n public setData(data: FormData) {\n this._formData = { ...data };\n this._dirty = true;\n this._validateForm();\n this.requestUpdate();\n }\n\n public validate(): boolean {\n this._validateForm();\n return this._valid;\n }\n\n public reset() {\n this._handleReset();\n }\n\n public getState(): FormState {\n return this._getFormState();\n }\n\n /**\n * Change the form language and re-render labels while preserving data\n * @param newLanguage - ISO language code (e.g., 'en', 'nl', 'de')\n */\n public changeLanguage(newLanguage: string): void {\n if (this.language === newLanguage) {\n console.log('🌐 Language already set to', newLanguage);\n return;\n }\n \n console.log('🌐 Changing language from', this.language, 'to', newLanguage);\n this.language = newLanguage;\n // The updated() lifecycle will handle the rebuild\n }\n\n render() {\n const errorCount = this._errors.filter(e => e.severity === 'error').length;\n const config = this.config || {};\n const showValidationSummary = config.showValidationSummary !== false && \n errorCount > 0 && \n this._submitted;\n\n const schema = this._currentSchema;\n if (!schema) {\n return html`<div>Loading form...</div>`;\n }\n\n return html`\n <div class=\"form-container\">\n <!-- Form Header -->\n <div class=\"form-header\">\n <h1 class=\"form-title\">${schema.title}</h1>\n ${schema.description ? html`\n <p class=\"form-description\">${schema.description}</p>\n ` : ''}\n </div>\n\n <!-- Form Content -->\n <div class=\"form-sections\">\n <!-- Validation Summary -->\n ${showValidationSummary ? html`\n <div class=\"validation-summary\">\n <h4 class=\"validation-summary-title\">Please fix the following errors:</h4>\n <ul class=\"validation-summary-list\">\n ${this._errors\n .filter(e => e.severity === 'error')\n .map(error => html`\n <li class=\"validation-summary-item\">${error.message}</li>\n `)}\n </ul>\n </div>\n ` : ''}\n\n <!-- Form Sections or No Selection Message -->\n ${schema.sections.length === 0 ? html`\n <div class=\"no-roles-message\">\n <h3>No Roles Selected</h3>\n <p>Please use the \"Filter Roles\" button below to select which sections you want to work with.</p>\n <p>Available roles: ${this._allSections.length}</p>\n </div>\n ` : schema.sections.map((section, index) => html`\n <jupiter-form-section\n .key=\"${section.id}-${this.language}\"\n .section=\"${section}\"\n .columns=\"${section.columns || this._columns}\"\n .formData=\"${this._formData}\"\n .typedMemberData=\"${this._typedMemberData}\"\n .disabled=\"${this.disabled || this.readonly}\"\n .collapsible=\"${config.collapsibleSections !== false}\"\n .locale=\"${config.locale || 'en-US'}\"\n .isFirstSection=\"${index === 0}\"\n .availableDimensions=\"${this._getAvailableDimensionsForSection(section.id)}\"\n @field-change=\"${this._handleFieldChange}\"\n @typed-member-change=\"${this._handleTypedMemberChange}\"\n @section-expand=\"${this._handleSectionExpand}\"\n @concept-expand=\"${this._handleConceptExpand}\"\n @column-remove=\"${this._handleColumnRemove}\"\n @column-add-request=\"${this._handleColumnAddRequest}\"\n ></jupiter-form-section>\n `)}\n </div>\n\n <!-- Form Actions - Fixed Footer -->\n <div class=\"form-actions\">\n <!-- Filter Roles Button (shown when more than 10 roles) -->\n ${this._shouldShowFilterButton() ? html`\n <button \n class=\"filter-roles-button\"\n @click=\"${this._handleFilterRolesClick}\"\n ?disabled=\"${this.disabled || this.readonly}\"\n >\n <svg class=\"filter-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"/>\n </svg>\n ${this._selectedRoleIds.length === 0 ? 'Select Roles' : 'Filter Roles'}\n <span class=\"roles-count\">${this._selectedRoleIds.length}/${this._allSections.length}</span>\n </button>\n ` : ''}\n \n <button \n class=\"btn-secondary\"\n @click=\"${this._handleSaveDraft}\"\n ?disabled=\"${this.disabled || this.readonly}\"\n >\n Save Draft\n </button>\n \n <button \n class=\"btn-primary\"\n @click=\"${this._handleSubmit}\"\n ?disabled=\"${this.disabled || this.readonly}\"\n >\n Submit\n </button>\n\n <div class=\"form-meta\">\n <span>Errors: ${errorCount}</span>\n <span>Modified: ${this._dirty ? 'Yes' : 'No'}</span>\n <span>Valid: ${this._valid ? 'Yes' : 'No'}</span>\n </div>\n </div>\n\n <!-- Filter Roles Dialog -->\n ${this._showFilterDialog ? html`\n <jupiter-filter-roles-dialog\n ?open=\"${this._showFilterDialog}\"\n .availableRoles=\"${this._allSections}\"\n .selectedRoleIds=\"${this._selectedRoleIds}\"\n @dialog-cancel=\"${this._handleFilterDialogCancel}\"\n @roles-filter-apply=\"${this._handleRoleFilterApply}\"\n @click=\"${this._handleFilterDialogCancel}\"\n ></jupiter-filter-roles-dialog>\n ` : ''}\n </div>\n `;\n }\n}\n","// Main entry point for Jupiter Dynamic Forms\nexport * from './core/dynamic-form';\nexport * from './core/form-section';\nexport * from './core/concept-tree';\nexport * from './core/form-field';\nexport * from './core/add-column-dialog';\nexport * from './core/filter-roles-dialog';\nexport * from './schema/types';\nexport * from './utils/validation';\n\n// Register all custom elements\nimport './core/dynamic-form';\nimport './core/form-section';\nimport './core/concept-tree';\nimport './core/form-field';\nimport './core/add-column-dialog';\nimport './core/filter-roles-dialog';\n\n// Version export\nexport const version = '1.5.0';\n"],"names":["t","e","o","addInitializer","customElements","define","globalThis","ShadowRoot","ShadyCSS","nativeShadow","Document","prototype","CSSStyleSheet","s","Symbol","WeakMap","n$2","constructor","this","_$cssResult$","Error","cssText","styleSheet","length","get","replaceSync","set","toString","c","cssRules","n","r","is","i","defineProperty","getOwnPropertyDescriptor","h","getOwnPropertyNames","getOwnPropertySymbols","getPrototypeOf","Object","a","trustedTypes","l","emptyScript","p","reactiveElementPolyfillSupport","d","u","toAttribute","Boolean","Array","JSON","stringify","fromAttribute","Number","parse","f","b","attribute","type","String","converter","reflect","useDefault","hasChanged","metadata","litPropertyMetadata","y","HTMLElement","_$Ei","push","observedAttributes","finalize","_$Eh","keys","createProperty","state","hasOwnProperty","create","wrapped","elementProperties","noAccessor","getPropertyDescriptor","call","requestUpdate","configurable","enumerable","getPropertyOptions","Map","finalized","properties","_$Eu","elementStyles","finalizeStyles","styles","isArray","Set","flat","reverse","unshift","toLowerCase","super","_$Ep","isUpdatePending","hasUpdated","_$Em","_$Ev","_$ES","Promise","enableUpdating","_$AL","_$E_","_a","forEach","addController","_$EO","add","renderRoot","isConnected","hostConnected","removeController","delete","size","createRenderRoot","shadowRoot","attachShadow","shadowRootOptions","adoptedStyleSheets","map","document","createElement","litNonce","setAttribute","textContent","appendChild","connectedCallback","disconnectedCallback","hostDisconnected","attributeChangedCallback","_$AK","_$ET","removeAttribute","_b","_$Ej","hasAttribute","C","_$EP","has","_$Eq","reject","scheduleUpdate","performUpdate","shouldUpdate","willUpdate","hostUpdate","update","_$EM","_$AE","hostUpdated","firstUpdated","updated","updateComplete","getUpdateComplete","mode","ReactiveElement","reactiveElementVersions","kind","name","init","FormValidator","validateField","fieldId","conceptId","columnId","value","fieldType","rules","errors","rule","error","validateRule","_fieldType","isEmpty","createError","RegExp","test","URL","console","warn","message","severity","validateDataType","valid","convertedValue","numValue","isNaN","dateValue","Date","getTime","toISOString","split","datetimeValue","boolValue","formatValue","locale","Intl","NumberFormat","format","minimumFractionDigits","maximumFractionDigits","style","currency","toLocaleDateString","toLocaleString","XBRLFormBuilder","createUniqueConceptId","concept","sectionId","baseId","id","preferredLabel","trim","roleMatch","match","roleSuffix","replace","createSectionHash","hash","charCodeAt","Math","abs","substr","buildFormSchema","xbrlInput","periodStartDate","periodEndDate","language","presentation","presentationData","hypercubeData","hypercubes","sections","roles","sort","role","localeCompare","section","buildSectionFromRole","assignFieldColumnIds","formId","now","title","extractEntityName","entrypoint","description","version","extractRoleTitle","nonAbstractConcepts","getAllNonAbstractConcepts","periodTypes","filter","periodType","hypercubeRole","find","hr","roleId","columns","generateDefaultColumnsForRole","roleInfo","availableColumnIds","col","conceptTrees","presentationLinkbase","concepts","conceptTree","buildConceptTree","expanded","roleURI","originalRole","level","label","getPreferredLabel","labels","fields","elementAbstract","columnIds","colId","includes","field","createFieldFromConcept","children","child","childTree","originalConceptId","conceptName","collapsed","abstract","forcedColumnId","mapXBRLTypeToFieldType","placeholder","required","disabled","defaultValue","xbrlType","languageLabels","lang","labelsToSearch","preferred","standard","terse","assignColumnIdsToConceptFields","countFieldsInTree","count","collectNonAbstractConcepts","collection","rolePeriodTypes","order","removable","dimensionColumns","items","item","dimensions","generateSingleDimensionColumns","generateMultiDimensionColumns","dimension","typedMember","members","axisLabel","dimensionInfo","axisId","typedMemberId","dimensionKey","dimensionIdKey","dimensionData","dimensionId","memberId","memberValue","memberLabel","axis","memberKey","hasTypedMembers","typedMembers","firstMember","_c","some","validDimensions","dimensionInfos","isTyped","allMembers","getAllDimensionMembers","member","combinations","generateDimensionCombinations","combination","index","columnTitle","join","domainMembers","firstDimension","restDimensions","restCombinations","restCombination","formatDateForDisplay","dateString","year","month","day","pathParts","pathname","extractRoleOrder","parseInt","buildColumnsFromHypercubes","JupiterFormField","LitElement","arguments","hideLabel","_errors","_touched","changedProperties","_validateField","validation","_handleInput","event","target","checked","dispatchEvent","CustomEvent","detail","oldValue","bubbles","_handleFocus","_handleBlur","_renderInput","hasErrors","hasWarnings","cssClass","fieldName","html","options","option","_getInputType","render","showLabel","css","__decorateClass","property","customElement","JupiterConceptTree","formData","expandedConcepts","_expanded","_toggleExpanded","_getFieldForColumn","_getFieldValue","_handleFieldChange","stopPropagation","hasChildren","isAbstract","column","shouldShowField","JupiterAddColumnDialog","open","availableDimensions","_startDate","_endDate","_instantDate","_selectedType","_selectedDimensions","_resetForm","_handleCancel","_handleConfirm","_isFormValid","request","instantDate","startDate","endDate","selectedDimensions","from","values","_handleStartDateChange","_handleEndDateChange","_handleSelectedTypeChange","_handleInstantDateChange","_handleDimensionToggle","selection","_handleMemberSelection","existing","_handleTypedValueChange","input","typedValue","today","clear","_autoSelectSingleMemberDimensions","isValid","isSelected","isTypedDimension","JupiterFormSection","typedMemberData","collapsible","isFirstSection","_showAddColumnDialog","_sectionPeriodType","_expandedConcepts","_allTreeExpanded","_determinePeriodType","_checkAndExpandFirstSection","setTimeout","_expandAllTrees","log","_getAllNonAbstractConcepts","singleType","result","_handleRemoveColumn","_handleAddColumn","buttonPeriodType","_determineButtonPeriodType","allNonAbstractConcepts","_getConceptsWithFields","_handleDialogCancel","_handleColumnAdd","columnRequest","_flattenConcepts","childrenFlattened","_getAllConceptIds","_collapseAllTrees","_toggleAllTrees","_handleTreeCheckboxChange","checkbox","_handleConceptExpand","allConceptIds","every","_getTypedMemberHeaderValue","_handleTypedMemberHeaderChange","JupiterFilterRolesDialog","availableRoles","selectedRoleIds","_tempSelectedRoles","_searchQuery","_filteredRoles","_initializeTempSelection","_updateFilteredRoles","query","filtered","titleMatch","idMatch","descriptionMatch","uriMatch","_searchInRoleURI","uriPattern","titleHasURI","idHasURI","_handleSearchInput","_clearSearch","searchInput","querySelector","focus","_highlightSearchTerm","text","regex","_renderHighlightedText","_getSelectedFilteredCount","_handleCheckboxChange","newSelection","_selectAll","_selectNone","_selectAllGlobal","_selectNoneGlobal","_resetToOriginal","_handleApply","selectedRoles","_handleBackdropClick","selectedCount","totalCount","filteredCount","hasSearchQuery","JupiterDynamicForm","config","initialData","readonly","_formData","_preservedFormData","_typedMemberData","_preservedTypedMemberData","_columns","_dirty","_valid","_submitted","_allSections","_selectedRoleIds","_showFilterDialog","_initializeForm","_handleLanguageChange","currentFormData","currentPreservedData","currentTypedMemberData","currentPreservedTypedMemberData","currentSelectedRoles","_currentSchema","_applyRoleFilter","_getDefaultSchema","_getDefaultColumns","schema","_validateForm","_preserveDataForHiddenSections","filteredSections","_restoreDataForVisibleSections","sectionsThatWillBeHidden","_preserveSectionData","visibleSections","_restoreSectionData","_preserveConceptData","_restoreConceptData","_shouldShowFilterButton","_handleFilterRolesClick","_handleFilterDialogCancel","_handleRoleFilterApply","totalRoles","visibleRoles","fieldErrors","updatedFormData","_generateUniqueConceptKey","_extractOriginalConceptId","uniqueConceptKey","parts","_handleTypedMemberChange","updatedTypedMemberData","_handleSectionExpand","_handleColumnRemove","targetSection","_removeColumnData","_handleColumnAddRequest","_addColumnFromRequest","_getAvailableDimensionsForSection","availableDimension","dataType","newColumnId","dimensionParts","dimensionKeys","dimSelection","periodPart","_d","_e","newColumn","hasTypedDimensions","dim","_replicateFieldsForNewColumn","_removeColumnDataFromConcepts","_shouldCreateFieldForConcept","formBuilder","_replicateFieldsForSection","existingField","_addColumn","_handleSubmit","submissionData","_generateSubmissionData","data","_handleSaveDraft","draftData","_processConceptsForSubmission","_includePreservedDataInSubmission","_removeDuplicateSubmissions","conceptData","originalConcept","_findConceptInAllSections","originalSection","_findSectionForConcept","_addConceptDataToSubmission","_findConceptInSection","found","isInstant","entry","period","date","_findColumnByIdInAllSections","uniqueEntries","key","_findColumnById","_findColumnByIdInSection","_getTypedMemberNameForAxis","sectionRoleId","_doesConceptApplyToTypedDimension","conceptIdToCheck","conceptIds","_getApplicableTypedDimensions","typedDimensions","targetRole","sectionTitle","fieldValue","submissionEntry","applicableTypedDimensions","filteredTypedMembers","allTypedMemberData","memberName","_handleReset","_getFormState","touched","dirty","submitted","getData","setData","validate","reset","getState","changeLanguage","newLanguage","errorCount","showValidationSummary","collapsibleSections"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4]}
1
+ {"version":3,"file":"index.js","sources":["../node_modules/@lit/reactive-element/decorators/custom-element.js","../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/@lit/reactive-element/decorators/property.js","../node_modules/@lit/reactive-element/decorators/state.js","../src/utils/validation.ts","../src/utils/xbrl-form-builder.ts","../src/core/form-field.ts","../src/core/concept-tree.ts","../src/core/add-column-dialog.ts","../src/core/form-section.ts","../src/core/filter-roles-dialog.ts","../src/core/dynamic-form.ts","../src/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer((()=>{customElements.define(t,e)})):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce(((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1]),t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet));else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach((t=>t(this)))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach((t=>t.hostConnected?.()))}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach((t=>t.hostDisconnected?.()))}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i){if(void 0!==t){const e=this.constructor,h=this[t];if(i??=e.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(e._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach((t=>t.hostUpdate?.())),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach((t=>t.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach((t=>this._$ET(t,this[t]))),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.1\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","import{defaultConverter as t,notEqual as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:t,reflect:!1,hasChanged:e},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","import { ValidationRule, ValidationError, FieldType } from '../schema/types';\n\nexport class FormValidator {\n /**\n * Validates a field value against its validation rules\n */\n static validateField(\n fieldId: string,\n conceptId: string,\n columnId: string,\n value: any,\n fieldType: FieldType,\n rules: ValidationRule[] = []\n ): ValidationError[] {\n const errors: ValidationError[] = [];\n\n for (const rule of rules) {\n const error = this.validateRule(fieldId, conceptId, columnId, value, fieldType, rule);\n if (error) {\n errors.push(error);\n }\n }\n\n return errors;\n }\n\n /**\n * Validates a single rule against a value\n */\n private static validateRule(\n fieldId: string,\n conceptId: string,\n columnId: string,\n value: any,\n _fieldType: FieldType,\n rule: ValidationRule\n ): ValidationError | null {\n const isEmpty = value === null || value === undefined || value === '';\n\n switch (rule.type) {\n case 'required':\n if (isEmpty) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'min':\n if (!isEmpty && typeof value === 'number' && value < rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'max':\n if (!isEmpty && typeof value === 'number' && value > rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'minLength':\n if (!isEmpty && typeof value === 'string' && value.length < rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'maxLength':\n if (!isEmpty && typeof value === 'string' && value.length > rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'pattern':\n if (!isEmpty && typeof value === 'string') {\n const regex = new RegExp(rule.value);\n if (!regex.test(value)) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n }\n break;\n\n case 'email':\n if (!isEmpty && typeof value === 'string') {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n }\n break;\n\n case 'url':\n if (!isEmpty && typeof value === 'string') {\n try {\n new URL(value);\n } catch {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n }\n break;\n\n case 'custom':\n // Custom validation would be handled by consuming application\n break;\n\n default:\n console.warn(`Unknown validation rule type: ${rule.type}`);\n }\n\n return null;\n }\n\n /**\n * Creates a validation error object\n */\n private static createError(\n fieldId: string,\n conceptId: string,\n columnId: string,\n rule: ValidationRule\n ): ValidationError {\n return {\n fieldId,\n conceptId,\n columnId,\n message: rule.message,\n severity: rule.severity || 'error',\n rule\n };\n }\n\n /**\n * Validates data type conversion\n */\n static validateDataType(value: any, fieldType: FieldType): { valid: boolean; convertedValue?: any; error?: string } {\n if (value === null || value === undefined || value === '') {\n return { valid: true, convertedValue: value };\n }\n\n switch (fieldType) {\n case 'number':\n case 'decimal':\n case 'currency':\n case 'percentage': {\n const numValue = Number(value);\n if (isNaN(numValue)) {\n return { valid: false, error: 'Invalid number format' };\n }\n return { valid: true, convertedValue: numValue };\n }\n\n case 'date': {\n const dateValue = new Date(value);\n if (isNaN(dateValue.getTime())) {\n return { valid: false, error: 'Invalid date format' };\n }\n return { valid: true, convertedValue: dateValue.toISOString().split('T')[0] };\n }\n\n case 'datetime': {\n const datetimeValue = new Date(value);\n if (isNaN(datetimeValue.getTime())) {\n return { valid: false, error: 'Invalid datetime format' };\n }\n return { valid: true, convertedValue: datetimeValue.toISOString() };\n }\n\n case 'boolean':\n if (typeof value === 'boolean') {\n return { valid: true, convertedValue: value };\n }\n if (typeof value === 'string') {\n const boolValue = value.toLowerCase();\n if (boolValue === 'true' || boolValue === '1') {\n return { valid: true, convertedValue: true };\n }\n if (boolValue === 'false' || boolValue === '0') {\n return { valid: true, convertedValue: false };\n }\n }\n return { valid: false, error: 'Invalid boolean format' };\n\n case 'text':\n case 'textarea':\n case 'email':\n case 'url':\n case 'tel':\n return { valid: true, convertedValue: String(value) };\n\n case 'select':\n case 'multiselect':\n return { valid: true, convertedValue: value };\n\n default:\n return { valid: true, convertedValue: value };\n }\n }\n\n /**\n * Formats value for display based on field type\n */\n static formatValue(value: any, fieldType: FieldType, locale = 'en-US'): string {\n if (value === null || value === undefined) return '';\n\n switch (fieldType) {\n case 'number':\n return new Intl.NumberFormat(locale).format(Number(value));\n\n case 'decimal':\n return new Intl.NumberFormat(locale, { \n minimumFractionDigits: 2,\n maximumFractionDigits: 2 \n }).format(Number(value));\n\n case 'currency':\n return new Intl.NumberFormat(locale, { \n style: 'currency',\n currency: 'USD' // Should be configurable\n }).format(Number(value));\n\n case 'percentage':\n return new Intl.NumberFormat(locale, { \n style: 'percent',\n minimumFractionDigits: 2\n }).format(Number(value) / 100);\n\n case 'date':\n return new Date(value).toLocaleDateString(locale);\n\n case 'datetime':\n return new Date(value).toLocaleString(locale);\n\n default:\n return String(value);\n }\n }\n}\n","import { \n XBRLFormInput, \n XBRLPresentationRole,\n XBRLPresentationConcept,\n XBRLLabel,\n XBRLHypercubeData,\n XBRLHypercubeRole\n} from '../schema/xbrl-types';\nimport { \n XBRLFormSchema, \n FormSection, \n FormField, \n FormColumn,\n ConceptTree,\n FieldType \n} from '../schema/types';\n\n/**\n * XBRL Form B private static assignColumnIdsToConceptFields(conceptTree: ConceptTree, columnIds: string[]): void {\n // Filter fields to only keep those that match available columns\n conceptTree.fields = conceptTree.fields.filter(field => {\n return columnIds.includes(field.columnId);\n });\n\n // Recursively process children\n if (conceptTree.children) {\n conceptTree.children.forEach(child => {\n this.assignColumnIdsToConceptFields(child, columnIds);\n });\n }\n }ransforms XBRL taxonomy data into Jupiter Dynamic Form schemas\n * Updated to handle actual presentation.json structure with roles\n */\nexport class XBRLFormBuilder {\n \n /**\n * Create unique concept ID by combining original ID with preferred label suffix\n * This handles cases where the same concept appears multiple times with different labels\n */\n private static createUniqueConceptId(concept: XBRLPresentationConcept, sectionId?: string): string {\n let baseId = concept.id;\n \n // Add preferred label suffix if exists\n if (concept.preferredLabel && concept.preferredLabel.trim() !== '') {\n // Extract the last part of the role URL as suffix\n const roleMatch = concept.preferredLabel.match(/\\/([^\\/]+)$/);\n const roleSuffix = roleMatch ? roleMatch[1] : concept.preferredLabel.replace(/[^a-zA-Z0-9]/g, '_');\n baseId = `${concept.id}_${roleSuffix}`;\n }\n \n // Add section context to avoid conflicts across roles\n if (sectionId) {\n // Create a short hash of the section ID to keep concept IDs manageable\n const sectionHash = this.createSectionHash(sectionId);\n return `${baseId}__${sectionHash}`;\n }\n \n return baseId;\n }\n \n /**\n * Create a short hash from section ID for concept uniqueness\n */\n private static createSectionHash(sectionId: string): string {\n // Simple hash to create a short identifier from the section ID\n let hash = 0;\n for (let i = 0; i < sectionId.length; i++) {\n const char = sectionId.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(36).substr(0, 6);\n }\n \n /**\n * Build form schema from XBRL input data\n * Creates accordion sections for each presentation role\n * @param xbrlInput - XBRL taxonomy data\n * @param periodStartDate - Start date for the reporting period\n * @param periodEndDate - End date for the reporting period\n * @param language - ISO language code for labels (e.g., 'en', 'nl', 'de')\n */\n static buildFormSchema(\n xbrlInput: XBRLFormInput, \n periodStartDate?: string, \n periodEndDate?: string,\n language: string = 'en'\n ): XBRLFormSchema {\n if (!xbrlInput.presentation || xbrlInput.presentation.length === 0) {\n throw new Error('XBRL presentation data is required');\n }\n\n // Use the first entrypoint (typically there's only one)\n const presentationData = xbrlInput.presentation[0];\n \n // Extract hypercube data for dimension processing\n const hypercubeData = xbrlInput.hypercubes?.[0]; // Use first entrypoint\n \n const sections: FormSection[] = [];\n\n // Sort roles by ascending order of their title before processing\n const sortedRoles = [...presentationData.roles].sort((a, b) => {\n return a.role.localeCompare(b.role);\n });\n\n // Create a form section for each presentation role\n sortedRoles.forEach(role => {\n const section = this.buildSectionFromRole(role, periodStartDate, periodEndDate, hypercubeData, language);\n \n // Post-process fields to assign correct column IDs based on generated columns\n this.assignFieldColumnIds(section);\n \n sections.push(section);\n });\n\n return {\n formId: `xbrl-form-${Date.now()}`,\n title: `XBRL Form - ${this.extractEntityName(presentationData.entrypoint)}`,\n description: `Dynamic form generated from XBRL taxonomy data`,\n version: '1.0.0',\n sections: sections\n };\n }\n\n /**\n * Build a form section from a presentation role\n */\n private static buildSectionFromRole(\n role: XBRLPresentationRole, \n periodStartDate?: string, \n periodEndDate?: string,\n hypercubeData?: XBRLHypercubeData,\n language: string = 'en'\n ): FormSection {\n // Extract section title from role name (remove role number prefix)\n const title = this.extractRoleTitle(role.role);\n \n // Analyze period types in this role first to determine consistent column strategy\n const nonAbstractConcepts = this.getAllNonAbstractConcepts(role);\n const periodTypes = new Set(\n nonAbstractConcepts\n .filter(concept => concept.periodType)\n .map(concept => concept.periodType)\n );\n\n // Find matching hypercube role for dimension processing\n const hypercubeRole = hypercubeData?.roles.find(hr => hr.roleId === role.id);\n \n if (hypercubeRole) {\n //console.log(`🏷️ Found matching hypercube role \"${role.id}\"`);\n } else {\n //console.log(`❌ No hypercube role found for \"${role.id}\"`);\n }\n \n // Generate appropriate columns based on concept period types and hypercube dimensions FIRST\n const columns = this.generateDefaultColumnsForRole(role, periodStartDate || '2025-01-01', periodEndDate || '2025-12-31', hypercubeRole, nonAbstractConcepts, periodTypes);\n\n // Extract column IDs for field creation\n const availableColumnIds = columns.map(col => col.id);\n //console.log(`📋 Available column IDs for role \"${role.id}\":`, availableColumnIds);\n \n\n \n const roleInfo = { periodTypes, availableColumnIds };\n const conceptTrees: ConceptTree[] = [];\n\n // Process root concepts and build tree structure with knowledge of available columns\n if (role.presentationLinkbase?.concepts) {\n role.presentationLinkbase.concepts.forEach(concept => {\n const conceptTree = this.buildConceptTree(concept, 0, periodStartDate, periodEndDate, roleInfo, role.id, language);\n if (conceptTree) {\n conceptTrees.push(conceptTree);\n }\n });\n }\n\n return {\n id: role.id,\n title: title,\n description: role.description || `Section for ${title}`,\n concepts: conceptTrees,\n columns: columns,\n expanded: false,\n metadata: {\n roleURI: role.roleURI,\n originalRole: role.role\n }\n };\n }\n\n /**\n * Build concept tree from XBRL presentation concept\n */\n private static buildConceptTree(\n concept: XBRLPresentationConcept, \n level: number, \n periodStartDate?: string, \n periodEndDate?: string,\n roleInfo?: { periodTypes: Set<string>, availableColumnIds?: string[] },\n sectionId?: string,\n language: string = 'en'\n ): ConceptTree | null {\n const label = this.getPreferredLabel(concept.labels, language);\n \n // Build fields for this concept (if not abstract)\n const fields: FormField[] = [];\n if (!concept.elementAbstract) {\n // Use available column IDs if provided, otherwise fall back to period-based logic\n let columnIds: string[] = [];\n \n if (roleInfo?.availableColumnIds && roleInfo.availableColumnIds.length > 0) {\n // Multi-dimensional or complex column scenario - filter by concept's period type\n columnIds = roleInfo.availableColumnIds.filter(colId => {\n if (concept.periodType === 'instant') {\n return colId.includes('instant') || colId === 'instant';\n } else if (concept.periodType === 'duration') {\n return colId.includes('duration') || colId === 'duration';\n } else {\n // If concept has no period type, include all columns\n return true;\n }\n });\n \n // If no columns match the period type, fall back to all available columns\n if (columnIds.length === 0) {\n columnIds = roleInfo.availableColumnIds;\n }\n } else {\n // Fallback to original period-based logic\n if (!roleInfo?.periodTypes || roleInfo.periodTypes.size === 0) {\n columnIds = ['default'];\n } else if (roleInfo.periodTypes.size === 1 && roleInfo.periodTypes.has('instant')) {\n columnIds = ['instant'];\n } else if (roleInfo.periodTypes.size === 1 && roleInfo.periodTypes.has('duration')) {\n columnIds = ['duration'];\n } else {\n // Mixed period types - create fields for both duration and instant columns\n // based on the concept's own period type\n if (concept.periodType === 'instant') {\n columnIds = ['instant'];\n } else if (concept.periodType === 'duration') {\n columnIds = ['duration'];\n } else {\n // Fallback if period type is not specified\n columnIds = ['duration', 'instant'];\n }\n }\n }\n \n // Create fields for appropriate column IDs\n columnIds.forEach(columnId => {\n const field = this.createFieldFromConcept(concept, periodStartDate, periodEndDate, columnId, language);\n if (field) fields.push(field);\n });\n }\n\n // Process children recursively\n const children: ConceptTree[] = [];\n if (concept.children && concept.children.length > 0) {\n concept.children.forEach(child => {\n const childTree = this.buildConceptTree(child, level + 1, periodStartDate, periodEndDate, roleInfo, sectionId, language);\n if (childTree) {\n children.push(childTree);\n }\n });\n }\n\n // Check if this concept should be included in the tree\n // For abstract concepts: only include if they have fields OR have children with content\n // For non-abstract concepts: always include if they have fields\n const hasContent = fields.length > 0 || children.length > 0;\n \n if (!hasContent) {\n // Abstract concept with no fields and no children with content - omit from tree\n return null;\n }\n\n return {\n id: this.createUniqueConceptId(concept, sectionId), // Use unique ID for form management\n originalConceptId: concept.id, // Store original for submission data\n name: concept.conceptName,\n label: label,\n description: `${concept.conceptName} (${concept.type})`,\n level: level,\n children: children,\n fields: fields,\n collapsed: level > 0, // Collapse nested levels by default\n abstract: concept.elementAbstract,\n periodType: concept.periodType as 'instant' | 'duration'\n };\n }\n\n /**\n * Create form field from XBRL concept\n */\n private static createFieldFromConcept(\n concept: XBRLPresentationConcept, \n periodStartDate?: string, \n periodEndDate?: string,\n forcedColumnId?: string,\n language: string = 'en'\n ): FormField | null {\n const fieldType = this.mapXBRLTypeToFieldType(concept.type);\n const label = this.getPreferredLabel(concept.labels, language);\n\n // Determine appropriate column ID based on concept's period type or forced value\n let columnId: string;\n \n if (forcedColumnId) {\n // Use the forced column ID if provided\n columnId = forcedColumnId;\n } else {\n // Determine column ID based on period type\n if (concept.periodType === 'instant') {\n columnId = 'instant';\n } else if (concept.periodType === 'duration') {\n columnId = 'duration'; // Single column for duration\n } else {\n columnId = 'default';\n }\n } const field: FormField = {\n id: `${concept.id}_${columnId}_field`,\n conceptId: concept.id,\n columnId: columnId,\n type: fieldType,\n label: label,\n placeholder: `Enter ${label.toLowerCase()}`,\n required: false, // Will be determined by validation rules\n disabled: concept.elementAbstract,\n defaultValue: null\n };\n\n // Add period information if the concept is period-specific\n if (concept.periodType === 'duration' || concept.periodType === 'instant') {\n field.periodStartDate = periodStartDate || '2025-01-01';\n field.periodEndDate = periodEndDate || '2025-12-31';\n }\n\n return field;\n }\n\n /**\n * Map XBRL data type to form field type\n */\n private static mapXBRLTypeToFieldType(xbrlType: string): FieldType {\n const typeMap: Record<string, FieldType> = {\n 'xbrli:stringItemType': 'text',\n 'xbrli:monetaryItemType': 'currency',\n 'xbrli:integerItemType': 'number',\n 'xbrli:decimalItemType': 'decimal',\n 'xbrli:percentItemType': 'percentage',\n 'xbrli:dateItemType': 'date',\n 'xbrli:booleanItemType': 'boolean',\n 'dtr-types:domainItemType': 'select',\n 'bw2-titel9:chamberOfCommerceRegistrationNumberItemType': 'text'\n };\n\n return typeMap[xbrlType] || 'text';\n }\n\n /**\n * Get preferred label from labels array with language support\n * @param labels - Array of XBRL labels\n * @param language - ISO language code (e.g., 'en', 'nl', 'de')\n */\n private static getPreferredLabel(labels: XBRLLabel[], language: string = 'en'): string {\n if (!labels || labels.length === 0) return 'Unnamed Concept';\n\n // Filter labels by language\n const languageLabels = labels.filter(l => l.lang === language);\n \n // If no labels found for the specified language, fall back to all labels\n const labelsToSearch = languageLabels.length > 0 ? languageLabels : labels;\n\n // Try to find preferred label\n const preferred = labelsToSearch.find(l => l.preferredLabel);\n if (preferred) return preferred.label;\n\n // Try to find standard label\n const standard = labelsToSearch.find(l => l.role === 'http://www.xbrl.org/2003/role/label');\n if (standard) return standard.label;\n\n // Try to find terse label\n const terse = labelsToSearch.find(l => l.role === 'http://www.xbrl.org/2003/role/terseLabel');\n if (terse) return terse.label;\n\n // Return first available label from language-specific labels or fallback to any label\n return labelsToSearch.length > 0 ? labelsToSearch[0].label : labels[0].label;\n }\n\n /**\n * Assign appropriate column IDs to fields based on section's generated columns\n */\n private static assignFieldColumnIds(section: FormSection): void {\n if (!section.columns || section.columns.length === 0) {\n return;\n }\n\n // Get available column IDs\n const columnIds = section.columns.map(col => col.id);\n \n // Process all fields in all concept trees\n section.concepts.forEach(conceptTree => {\n this.assignColumnIdsToConceptFields(conceptTree, columnIds);\n });\n }\n\n /**\n * Recursively assign column IDs to fields in a concept tree\n */\n private static assignColumnIdsToConceptFields(conceptTree: ConceptTree, columnIds: string[]): void {\n // Filter fields to only keep those that match available columns\n conceptTree.fields = conceptTree.fields.filter(field => {\n return columnIds.includes(field.columnId);\n });\n\n // Process children recursively\n if (conceptTree.children) {\n conceptTree.children.forEach(child => {\n this.assignColumnIdsToConceptFields(child, columnIds);\n });\n }\n }\n\n /**\n * Count total fields in a concept tree recursively\n */\n private static countFieldsInTree(conceptTree: ConceptTree): number {\n let count = conceptTree.fields.length;\n if (conceptTree.children) {\n conceptTree.children.forEach(child => {\n count += this.countFieldsInTree(child);\n });\n }\n return count;\n }\n\n /**\n * Get all non-abstract concepts from a role recursively\n */\n static getAllNonAbstractConcepts(role: XBRLPresentationRole): XBRLPresentationConcept[] {\n const nonAbstractConcepts: XBRLPresentationConcept[] = [];\n \n if (role.presentationLinkbase?.concepts) {\n role.presentationLinkbase.concepts.forEach(concept => {\n this.collectNonAbstractConcepts(concept, nonAbstractConcepts);\n });\n }\n \n return nonAbstractConcepts;\n }\n\n /**\n * Recursively collect non-abstract concepts from a concept tree\n */\n private static collectNonAbstractConcepts(\n concept: XBRLPresentationConcept, \n collection: XBRLPresentationConcept[]\n ): void {\n // Add this concept if it's not abstract\n if (!concept.elementAbstract) {\n collection.push(concept);\n }\n \n // Recursively process children\n if (concept.children && concept.children.length > 0) {\n concept.children.forEach(child => {\n this.collectNonAbstractConcepts(child, collection);\n });\n }\n }\n\n /**\n * Generate default columns based on period types of non-abstract concepts in a role\n */\n static generateDefaultColumnsForRole(\n role: XBRLPresentationRole, \n periodStartDate: string, \n periodEndDate: string,\n hypercubeRole?: XBRLHypercubeRole,\n nonAbstractConcepts?: XBRLPresentationConcept[],\n rolePeriodTypes?: Set<string>\n ): FormColumn[] {\n // Use pre-calculated values if provided, otherwise calculate them\n const concepts = nonAbstractConcepts || this.getAllNonAbstractConcepts(role);\n const periodTypes = rolePeriodTypes || new Set(\n concepts\n .filter(concept => concept.periodType) // Only concepts with period type\n .map(concept => concept.periodType)\n );\n \n //console.log(`📊 Analyzing role \"${role.role}\" with ${concepts.length} non-abstract concepts`);\n \n if (concepts.length === 0) {\n // No non-abstract concepts, return single default column\n //console.log('📊 No non-abstract concepts found, using default column');\n return [{\n id: 'default',\n title: 'Value',\n description: 'Default value column',\n type: 'base',\n order: 0,\n removable: false\n }];\n }\n \n // Check for hypercube dimensions and generate appropriate columns\n let dimensionColumns: FormColumn[] = [];\n if (hypercubeRole?.items?.length === 1) {\n const item = hypercubeRole.items[0];\n \n \n if (item.dimensions.length === 1) {\n // Single dimension - existing logic\n dimensionColumns = this.generateSingleDimensionColumns(item.dimensions[0], periodStartDate, periodEndDate, periodTypes);\n } else if (item.dimensions.length > 1) {\n // Multiple dimensions - generate combination columns\n dimensionColumns = this.generateMultiDimensionColumns(item.dimensions, periodStartDate, periodEndDate, periodTypes);\n }\n } else if (hypercubeRole?.items?.length && hypercubeRole.items.length > 1) {\n //console.log(`⚠️ Multiple items found (${hypercubeRole.items.length}), skipping for now`);\n }\n \n // Analyze period types (use the pre-calculated or newly calculated set)\n //console.log(`📅 Found period types: ${Array.from(periodTypes).join(', ')}`);\n \n const columns: FormColumn[] = [];\n \n // If we have dimension columns, use them\n if (dimensionColumns.length > 0) {\n columns.push(...dimensionColumns);\n } else {\n // Fallback to period-based columns\n if (periodTypes.size === 0) {\n // No period types specified, use single default column\n //console.log('📅 No period types found, using default column');\n columns.push({\n id: 'default',\n title: 'Value',\n description: 'Default value column',\n type: 'base',\n order: 0,\n removable: false\n });\n } else if (periodTypes.size === 1 && periodTypes.has('instant')) {\n // All concepts are instant - single column with start date\n //console.log('📅 All concepts are instant type, creating single column');\n columns.push({\n id: 'instant',\n title: `Current`,\n description: `Values as of ${periodStartDate}`,\n type: 'base',\n order: 0,\n removable: false\n });\n } else if (periodTypes.size === 1 && periodTypes.has('duration')) {\n // All concepts are duration - single column with period range\n //console.log('📅 All concepts are duration type, creating single column with period range');\n columns.push({\n id: 'duration',\n title: `Current Period`,\n description: `Period: ${periodStartDate} to ${periodEndDate}`,\n type: 'base',\n order: 0,\n removable: false\n });\n } else {\n // Mixed period types - create both duration and instant columns\n //console.log('📅 Mixed period types found, creating both duration and instant columns');\n \n // Duration column with period range\n columns.push({\n id: 'duration',\n title: `Current Period`,\n description: `Period: ${periodStartDate} to ${periodEndDate}`,\n type: 'base',\n order: 0,\n removable: false\n });\n \n // Instant column using periodStartDate as the instant date\n columns.push({\n id: 'instant',\n title: `Current`,\n description: `Values as of ${periodStartDate}`,\n type: 'base',\n order: 1,\n removable: false\n });\n }\n }\n \n //console.log(`📊 Generated ${columns.length} columns for role \"${role.role}\":`, columns.map(c => c.title));\n return columns;\n }\n\n /**\n * Generate columns for single dimension scenarios\n */\n private static generateSingleDimensionColumns(\n dimension: any, \n periodStartDate: string, \n periodEndDate: string, \n periodTypes: Set<string>\n ): FormColumn[] {\n // //console.log(`📊 Processing single dimension:`, {\n // id: dimension.id,\n // conceptName: dimension.conceptName,\n // hasMembers: !!(dimension.members && Array.isArray(dimension.members)),\n // membersCount: dimension.members?.length || 0,\n // hasTypedMember: !!dimension.typedMember,\n // typedMemberId: dimension.typedMember?.id\n // });\n\n // Handle typed dimensions (no explicit members)\n if (dimension.typedMember && (!dimension.members || dimension.members.length === 0)) {\n //console.log(`🔤 Processing typed dimension: ${dimension.id} with typed member: ${dimension.typedMember.id}`);\n \n const axisLabel = dimension.labels.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n \n const dimensionInfo = {\n axisId: dimension.id,\n axisLabel,\n typedMemberId: dimension.typedMember.id,\n dimensionKey: `${axisLabel} | [Typed Input]`,\n dimensionIdKey: `${dimension.id}|[typed]`\n };\n \n //console.log(`🔤 Generated typed dimension info:`, dimensionInfo);\n \n const columns: FormColumn[] = [];\n \n if (periodTypes.size === 0) {\n columns.push({\n id: 'typed-default',\n title: axisLabel,\n description: 'Typed dimension input column',\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-default',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false\n });\n } else if (periodTypes.size === 1 && periodTypes.has('instant')) {\n columns.push({\n id: 'typed-instant',\n title: `${axisLabel} [Typed Input Available]`,\n description: `Typed values as of ${periodStartDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-instant',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false\n });\n } else if (periodTypes.size === 1 && periodTypes.has('duration')) {\n columns.push({\n id: 'typed-duration',\n title: `${axisLabel} [Typed Input Available]`,\n description: `Typed values for period ${periodStartDate} to ${periodEndDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-duration',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false\n });\n } else {\n // Mixed period types - create both instant and duration columns\n columns.push({\n id: 'typed-duration',\n title: `${axisLabel} [Typed Input Available]`,\n description: `Typed values for period ${periodStartDate} to ${periodEndDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-duration',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false\n });\n \n columns.push({\n id: 'typed-instant',\n title: `${axisLabel} [Typed Input Available]`,\n description: `Typed values as of ${periodStartDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-instant',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 1,\n removable: false\n });\n }\n \n //console.log(`🔤 Generated ${columns.length} typed dimension columns`);\n return columns;\n }\n\n // Handle explicit dimensions (existing logic)\n if (!dimension.members || !Array.isArray(dimension.members)) {\n //console.log(`⚠️ Dimension ${dimension.id} has no members defined and no typed member, skipping column generation`);\n return [];\n }\n\n // //console.log(`📊 Found single dimension:`, {\n // id: dimension.id,\n // conceptName: dimension.conceptName,\n // membersCount: dimension.members.length\n // });\n \n if (dimension.members.length === 0) {\n return [];\n }\n \n const axisLabel = dimension.labels.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n const firstMember = dimension.members[0];\n const memberLabel = firstMember.labels.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || firstMember.conceptName;\n \n const dimensionInfo = {\n axisId: dimension.id,\n axisLabel,\n memberId: firstMember.id,\n memberLabel,\n dimensionKey: `${axisLabel} | ${memberLabel}`,\n dimensionIdKey: `${dimension.id} | ${firstMember.id}`\n };\n \n //console.log(`📊 Generated dimension info:`, dimensionInfo);\n \n const columns: FormColumn[] = [];\n \n if (periodTypes.size === 0) {\n columns.push({\n id: 'default',\n title: dimensionInfo.memberLabel,\n description: 'Default value column',\n type: 'dimension',\n dimensionData: {\n dimensionId: 'default',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false\n });\n } else if (periodTypes.size === 1 && periodTypes.has('instant')) {\n columns.push({\n id: 'instant',\n title: `${dimensionInfo.memberLabel}`,\n description: `Values as of ${periodStartDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'instant',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false\n });\n } else if (periodTypes.size === 1 && periodTypes.has('duration')) {\n columns.push({\n id: 'duration',\n title: `${dimensionInfo.memberLabel}`,\n description: `Period: ${periodStartDate} to ${periodEndDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'duration',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false\n });\n } else {\n // Mixed period types - create both duration and instant columns\n columns.push({\n id: 'duration',\n title: `${dimensionInfo.memberLabel}`,\n description: `Period: ${periodStartDate} to ${periodEndDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'duration',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false\n });\n \n columns.push({\n id: 'instant',\n title: `${dimensionInfo.memberLabel}`,\n description: `Values as of ${periodStartDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'instant',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 1,\n removable: false\n });\n }\n \n return columns;\n }\n\n /**\n * Generate columns for multi-dimension scenarios - creates combinations of all dimension members\n */\n private static generateMultiDimensionColumns(\n dimensions: any[], \n periodStartDate: string, \n periodEndDate: string, \n periodTypes: Set<string>\n ): FormColumn[] {\n //console.log(`📊 Processing ${dimensions.length} dimensions for multi-dimensional columns`);\n // console.log(`🔍 [DEBUG] Input dimensions:`, dimensions.map(d => ({\n // id: d.id,\n // label: d.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label,\n // membersCount: d.members?.length || 0,\n // hasTypedMember: !!d.typedMember\n // })));\n \n // Detect typed members for header indication\n const hasTypedMembers = dimensions.some(dimension => dimension.typedMember);\n if (hasTypedMembers) {\n //console.log(`🔤 Found typed members in dimensions - will indicate in column headers`);\n }\n \n // Filter out dimensions without members (but keep typed dimensions)\n const validDimensions = dimensions.filter(dimension => {\n // Keep dimensions with typed members even if they don't have domain members\n if (dimension.typedMember) {\n //console.log(`🔤 Keeping typed dimension: ${dimension.id} with typed member: ${dimension.typedMember.id}`);\n return true;\n }\n // Keep dimensions with domain members\n if (dimension.members && Array.isArray(dimension.members) && dimension.members.length > 0) {\n //console.log(`📂 Keeping domain dimension: ${dimension.id} with ${dimension.members.length} members`);\n return true;\n }\n // Skip dimensions without any members\n //console.log(`⚠️ Skipping dimension ${dimension.id} - no members or typed member defined`);\n return false;\n });\n\n if (validDimensions.length === 0) {\n //console.log(`⚠️ No valid dimensions with members found, skipping multi-dimensional column generation`);\n return [];\n }\n \n // Get all dimension information\n const dimensionInfos = validDimensions.map(dimension => {\n const axisLabel = dimension.labels.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n \n // Handle typed dimensions differently\n if (dimension.typedMember) {\n return {\n id: dimension.id,\n axisLabel,\n isTyped: true,\n typedMemberId: dimension.typedMember.id,\n members: [{\n id: '[typed]',\n label: `${axisLabel} [Typed Input Available]`\n }]\n };\n }\n \n // Handle domain dimensions (existing logic)\n const allMembers = this.getAllDimensionMembers(dimension.members);\n \n return {\n id: dimension.id,\n axisLabel,\n isTyped: false,\n members: allMembers.map(member => ({\n id: member.id,\n label: member.labels.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || member.conceptName\n }))\n };\n });\n \n // Generate all combinations of dimension members\n const combinations = this.generateDimensionCombinations(dimensionInfos);\n //console.log(`📊 Generated ${combinations.length} dimension combinations`);\n // //console.log(`🔍 [DEBUG] Generated combinations:`, combinations.map(combo => ({\n // memberLabels: combo.map((c: any) => c.memberLabel),\n // axisIds: combo.map((c: any) => c.axisId),\n // memberIds: combo.map((c: any) => c.memberId)\n // })));\n \n const columns: FormColumn[] = [];\n \n combinations.forEach((combination: any[], index: number) => {\n // Create column title from combination\n const columnTitle = combination.map((c: any) => c.memberLabel).join(' | ');\n \n // Identify typed and domain members in this combination\n const typedMembers = combination.filter((c: any) => c.isTyped);\n const domainMembers = combination.filter((c: any) => !c.isTyped);\n \n // console.log(`🔍 [Column ${index}] Combination analysis:`, {\n // totalMembers: combination.length,\n // typedMembers: typedMembers.length,\n // domainMembers: domainMembers.length,\n // hasTypedMembers: typedMembers.length > 0,\n // columnTitle: columnTitle,\n // memberLabels: combination.map((c: any) => c.memberLabel),\n // memberIds: combination.map((c: any) => c.memberId)\n // });\n \n // Create dimension data for this combination\n const dimensionData = {\n dimensionId: `multi_${index}`,\n memberValue: columnTitle, // Required field\n memberLabel: columnTitle, // Required field\n combinations: domainMembers.map((c: any) => ({\n axisId: c.axisId,\n axisLabel: c.axisLabel,\n memberId: c.memberId,\n memberLabel: c.memberLabel\n })),\n // Add typed member information for form fields\n typedMembers: typedMembers.map((c: any) => ({\n axisId: c.axisId,\n axisLabel: c.axisLabel,\n typedMemberId: c.typedMemberId,\n memberLabel: c.memberLabel\n })),\n hasTypedMembers: typedMembers.length > 0,\n memberKey: columnTitle,\n dimensionIdKey: [\n ...domainMembers.map((c: any) => `${c.axisId}|${c.memberId}`),\n ...typedMembers.map((c: any) => `${c.axisId}|[typed]`)\n ].join('::')\n };\n \n // console.log(`🔍 [Column ${index}] Final dimension data:`, {\n // dimensionId: dimensionData.dimensionId,\n // memberLabel: dimensionData.memberLabel,\n // dimensionIdKey: dimensionData.dimensionIdKey,\n // combinationsCount: dimensionData.combinations?.length,\n // typedMembersCount: dimensionData.typedMembers?.length\n // });\n \n // Create columns based on period types\n if (periodTypes.size === 0 || (periodTypes.size === 1 && periodTypes.has('duration'))) {\n columns.push({\n id: `duration_${index}`,\n title: `${columnTitle}`,\n description: `Period: ${periodStartDate} to ${periodEndDate}`,\n type: 'dimension',\n dimensionData: {\n ...dimensionData,\n dimensionId: `duration_${index}`\n },\n order: index * 2,\n removable: false\n });\n } else if (periodTypes.size === 1 && periodTypes.has('instant')) {\n columns.push({\n id: `instant_${index}`,\n title: `${columnTitle}`,\n description: `Values as of ${periodStartDate}`,\n type: 'dimension',\n dimensionData: {\n ...dimensionData,\n dimensionId: `instant_${index}`\n },\n order: index * 2,\n removable: false\n });\n } else {\n // Mixed period types - create both duration and instant columns for each combination\n columns.push({\n id: `duration_${index}`,\n title: `${columnTitle}`,\n description: `Period: ${periodStartDate} to ${periodEndDate}`,\n type: 'dimension',\n dimensionData: {\n ...dimensionData,\n dimensionId: `duration_${index}`\n },\n order: index * 2,\n removable: false\n });\n \n columns.push({\n id: `instant_${index}`,\n title: `${columnTitle}`,\n description: `Values as of ${periodStartDate}`,\n type: 'dimension',\n dimensionData: {\n ...dimensionData,\n dimensionId: `instant_${index}`\n },\n order: index * 2 + 1,\n removable: false\n });\n }\n });\n \n //console.log(`📊 Generated ${columns.length} multi-dimensional columns`);\n return columns;\n }\n\n /**\n * Get all members including children recursively\n */\n private static getAllDimensionMembers(members: any[]): any[] {\n if (!members || !Array.isArray(members)) {\n return [];\n }\n\n const allMembers: any[] = [];\n \n members.forEach(member => {\n allMembers.push(member);\n \n if (member.children && member.children.length > 0) {\n allMembers.push(...this.getAllDimensionMembers(member.children));\n }\n });\n \n return allMembers;\n }\n\n /**\n * Generate all combinations of dimension members\n */\n private static generateDimensionCombinations(dimensionInfos: any[]): any[] {\n if (dimensionInfos.length === 0) return [];\n if (dimensionInfos.length === 1) {\n return dimensionInfos[0].members.map((member: any) => [{\n axisId: dimensionInfos[0].id,\n axisLabel: dimensionInfos[0].axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: dimensionInfos[0].isTyped || false,\n typedMemberId: dimensionInfos[0].typedMemberId\n }]);\n }\n \n // Generate combinations recursively\n const [firstDimension, ...restDimensions] = dimensionInfos;\n const restCombinations = this.generateDimensionCombinations(restDimensions);\n \n const combinations: any[] = [];\n \n firstDimension.members.forEach((member: any) => {\n if (restCombinations.length === 0) {\n combinations.push([{\n axisId: firstDimension.id,\n axisLabel: firstDimension.axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: firstDimension.isTyped || false,\n typedMemberId: firstDimension.typedMemberId\n }]);\n } else {\n restCombinations.forEach(restCombination => {\n combinations.push([\n {\n axisId: firstDimension.id,\n axisLabel: firstDimension.axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: firstDimension.isTyped || false,\n typedMemberId: firstDimension.typedMemberId\n },\n ...restCombination\n ]);\n });\n }\n });\n \n return combinations;\n }\n\n /**\n * Format date for display in column headers\n */\n private static formatDateForDisplay(dateString: string): string {\n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n });\n } catch {\n return dateString;\n }\n }\n\n /**\n * Extract entity name from entrypoint URL\n */\n private static extractEntityName(entrypoint: string): string {\n try {\n const url = new URL(entrypoint);\n const pathParts = url.pathname.split('/');\n const filename = pathParts[pathParts.length - 1];\n return filename.replace('.xsd', '').replace(/[^a-zA-Z0-9]/g, ' ').trim() || 'Entity';\n } catch {\n return 'Entity';\n }\n }\n\n /**\n * Extract role title from role string\n */\n private static extractRoleTitle(role: string): string {\n // Remove role number prefix like \"[000001] \" and return the title\n const match = role.match(/^\\[[\\d]+\\]\\s*(.+)$/);\n return match ? match[1].trim() : role;\n }\n\n /**\n * Extract role order from role string\n */\n private static extractRoleOrder(role: string): number {\n const match = role.match(/^\\[([\\d]+)\\]/);\n return match ? parseInt(match[1], 10) : 0;\n }\n\n /**\n * Build columns from XBRL hypercube data (placeholder for now)\n */\n static buildColumnsFromHypercubes(/* _hypercubes: any[] */): any[] {\n // For now, return default column structure\n // This will be expanded when we implement hypercube support\n return [{\n id: 'default',\n label: 'Values',\n type: 'data'\n }];\n }\n}\n","import { LitElement, html, css, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { FormField, ValidationError } from '../schema/types';\nimport { FormValidator } from '../utils/validation';\n\n@customElement('jupiter-form-field')\nexport class JupiterFormField extends LitElement {\n @property({ type: Object }) field!: FormField;\n @property({ type: String }) conceptId!: string;\n @property({ type: String }) columnId!: string;\n @property() value: any = null;\n @property({ type: Boolean }) disabled = false;\n @property({ type: String }) locale = 'en-US';\n @property({ type: Boolean }) hideLabel = false;\n\n @state() private _errors: ValidationError[] = [];\n @state() private _touched = false;\n\n static styles = css`\n :host {\n display: block;\n margin-bottom: 0px; /* Remove bottom margin for table layout */\n }\n\n :host([hideLabel]) {\n margin-bottom: 0px;\n }\n\n .field-container {\n position: relative;\n }\n\n .field-label {\n display: block;\n font-weight: 500;\n margin-bottom: 4px;\n color: var(--jupiter-text-primary, #333);\n font-size: 14px;\n }\n\n .field-label.required::after {\n content: ' *';\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .field-input {\n width: 100%;\n padding: 6px 8px; /* Reduced padding for table cells */\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n font-size: 13px; /* Slightly smaller font for table */\n font-family: inherit;\n background: var(--jupiter-input-background, #fff);\n color: var(--jupiter-text-primary, #333);\n box-sizing: border-box;\n }\n\n .field-input:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 0 0 2px var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2));\n }\n\n .field-input:disabled {\n background: var(--jupiter-disabled-background, #f5f5f5);\n color: var(--jupiter-disabled-text, #999);\n cursor: not-allowed;\n }\n\n .field-input.error {\n border-color: var(--jupiter-error-color, #d32f2f);\n }\n\n .field-input.warning {\n border-color: var(--jupiter-warning-color, #ff9800);\n }\n\n .field-errors {\n margin-top: 4px;\n }\n\n .field-error {\n display: block;\n font-size: 12px;\n margin-bottom: 2px;\n }\n\n .field-error.error {\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .field-error.warning {\n color: var(--jupiter-warning-color, #ff9800);\n }\n\n .field-error.info {\n color: var(--jupiter-info-color, #2196f3);\n }\n\n select.field-input {\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e\");\n background-position: right 8px center;\n background-repeat: no-repeat;\n background-size: 16px;\n padding-right: 32px;\n }\n\n textarea.field-input {\n resize: vertical;\n min-height: 60px;\n }\n\n .checkbox-container {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .checkbox-container input[type=\"checkbox\"] {\n margin: 0;\n width: auto;\n }\n `;\n\n protected willUpdate(changedProperties: PropertyValues) {\n if (changedProperties.has('value') || changedProperties.has('field')) {\n this._validateField();\n }\n }\n\n private _validateField() {\n if (this.field?.validation) {\n this._errors = FormValidator.validateField(\n this.field.id,\n this.conceptId,\n this.columnId,\n this.value,\n this.field.type,\n this.field.validation\n );\n }\n }\n\n private _handleInput(event: Event) {\n const target = event.target as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n let value: any = target.value;\n\n // Convert value based on field type\n if (this.field.type === 'number' || this.field.type === 'decimal') {\n value = value === '' ? null : Number(value);\n } else if (this.field.type === 'boolean') {\n value = (target as HTMLInputElement).checked;\n }\n\n this.value = value;\n this._touched = true;\n \n this.dispatchEvent(new CustomEvent('field-change', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n value,\n oldValue: this.value\n },\n bubbles: true\n }));\n }\n\n private _handleFocus() {\n this.dispatchEvent(new CustomEvent('field-focus', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId\n },\n bubbles: true\n }));\n }\n\n private _handleBlur() {\n this._touched = true;\n this.dispatchEvent(new CustomEvent('field-blur', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId\n },\n bubbles: true\n }));\n }\n\n private _renderInput() {\n const hasErrors = this._errors.some(e => e.severity === 'error');\n const hasWarnings = this._errors.some(e => e.severity === 'warning');\n const cssClass = `field-input ${hasErrors ? 'error' : hasWarnings ? 'warning' : ''}`;\n \n // Generate unique field identifiers for form submission\n const fieldId = `${this.conceptId}__${this.columnId}`;\n const fieldName = `data[${this.conceptId}][${this.columnId}]`;\n\n switch (this.field.type) {\n case 'textarea':\n return html`\n <textarea\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n class=\"${cssClass}\"\n .value=\"${this.value || ''}\"\n ?disabled=\"${this.disabled || this.field.disabled}\"\n placeholder=\"${this.field.placeholder || ''}\"\n @input=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n ></textarea>\n `;\n\n case 'select':\n return html`\n <select\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n class=\"${cssClass}\"\n .value=\"${this.value || ''}\"\n ?disabled=\"${this.disabled || this.field.disabled}\"\n @change=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n >\n <option value=\"\">Select...</option>\n ${this.field.options?.map(option => html`\n <option \n value=\"${option.value}\"\n ?disabled=\"${option.disabled}\"\n ?selected=\"${this.value === option.value}\"\n >\n ${option.label}\n </option>\n `)}\n </select>\n `;\n\n case 'boolean':\n return html`\n <div class=\"checkbox-container\">\n <input\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n type=\"checkbox\"\n class=\"field-input\"\n .checked=\"${Boolean(this.value)}\"\n ?disabled=\"${this.disabled || this.field.disabled}\"\n @change=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n />\n <span>${this.field.label}</span>\n </div>\n `;\n\n default:\n return html`\n <input\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n type=\"${this._getInputType()}\"\n class=\"${cssClass}\"\n .value=\"${this.value || ''}\"\n ?disabled=\"${this.disabled || this.field.disabled}\"\n placeholder=\"${this.field.placeholder || ''}\"\n @input=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n />\n `;\n }\n }\n\n private _getInputType(): string {\n switch (this.field.type) {\n case 'number':\n case 'decimal':\n case 'currency':\n case 'percentage':\n return 'number';\n case 'date':\n return 'date';\n case 'datetime':\n return 'datetime-local';\n case 'email':\n return 'email';\n case 'url':\n return 'url';\n case 'tel':\n return 'tel';\n default:\n return 'text';\n }\n }\n\n render() {\n const showLabel = !this.hideLabel && this.field.type !== 'boolean';\n\n return html`\n <div class=\"field-container\">\n ${showLabel ? html`\n <label class=\"field-label ${this.field.required ? 'required' : ''}\">\n ${this.field.label}\n </label>\n ` : ''}\n \n ${this._renderInput()}\n \n ${this._errors.length > 0 && this._touched ? html`\n <div class=\"field-errors\">\n ${this._errors.map(error => html`\n <span class=\"field-error ${error.severity}\">\n ${error.message}\n </span>\n `)}\n </div>\n ` : ''}\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { ConceptTree, FormColumn, FormField } from '../schema/types';\nimport './form-field';\n\n@customElement('jupiter-concept-tree')\nexport class JupiterConceptTree extends LitElement {\n @property({ type: Object }) concept!: ConceptTree;\n @property({ type: Array }) columns: FormColumn[] = [];\n @property({ type: Object }) formData: Record<string, any> = {};\n @property({ type: Boolean }) disabled = false;\n @property({ type: String }) locale = 'en-US';\n @property({ type: Set }) expandedConcepts: Set<string> = new Set();\n\n @state() private _expanded = true;\n\n static styles = css`\n :host {\n /* Component renders table cells directly */\n display: contents;\n }\n\n .concept-name-cell {\n vertical-align: top;\n padding: 2px 4px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-bottom: none;\n background: var(--jupiter-concept-background, #f8f9fa);\n position: sticky;\n left: 0;\n z-index: 1;\n width: 300px;\n min-width: 300px;\n max-width: 300px;\n }\n\n .concept-name-cell.abstract {\n background: var(--jupiter-abstract-background, #f0f2f5);\n font-weight: 600;\n }\n\n .concept-name-cell.leaf {\n background: var(--jupiter-leaf-background, #fff);\n font-weight: 400;\n }\n\n .concept-content {\n display: flex;\n align-items: center;\n min-height: 28px;\n font-size: 13px;\n line-height: 1.3;\n width: 100%;\n overflow: hidden;\n }\n\n .concept-indent {\n width: calc(var(--level, 0) * 16px);\n flex-shrink: 0;\n }\n\n .concept-toggle {\n width: 14px;\n height: 14px;\n margin-right: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n transition: transform 0.2s ease;\n cursor: pointer;\n }\n\n .concept-toggle.expanded {\n transform: rotate(90deg);\n }\n\n .concept-toggle.no-children {\n visibility: hidden;\n }\n\n .concept-label {\n flex: 1;\n color: var(--jupiter-text-primary, #333);\n cursor: pointer;\n word-wrap: break-word;\n overflow-wrap: break-word;\n hyphens: auto;\n line-height: 1.3;\n min-width: 0; /* Allows flex item to shrink below content size */\n }\n\n .field-cell {\n vertical-align: middle;\n padding: 2px 6px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-bottom: none;\n background: var(--jupiter-cell-background, #fff);\n min-height: 28px;\n text-align: center;\n min-width: 180px;\n width: 180px;\n }\n\n .field-cell.empty {\n background: var(--jupiter-empty-cell-background, #f8f9fa);\n }\n\n .field-cell.abstract-row {\n background: var(--jupiter-abstract-cell-background, #f0f2f5);\n }\n\n /* Children are rendered as separate table rows, not nested */\n .children-wrapper {\n display: none;\n }\n\n\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._expanded = this.expandedConcepts.has(this.concept.id);\n }\n\n willUpdate(changedProperties: Map<string, unknown>) {\n super.willUpdate(changedProperties);\n if (changedProperties.has('expandedConcepts')) {\n this._expanded = this.expandedConcepts.has(this.concept.id);\n }\n }\n\n private _toggleExpanded() {\n this._expanded = !this._expanded;\n \n this.dispatchEvent(new CustomEvent('concept-expand', {\n detail: {\n conceptId: this.concept.id,\n expanded: this._expanded\n },\n bubbles: true\n }));\n }\n\n private _getFieldForColumn(columnId: string): FormField | undefined {\n return this.concept.fields?.find(field => field.columnId === columnId);\n }\n\n private _getFieldValue(field: FormField): any {\n return this.formData[this.concept.id]?.[field.columnId];\n }\n\n private _handleFieldChange(event: CustomEvent) {\n event.stopPropagation();\n // Re-dispatch with updated detail\n this.dispatchEvent(new CustomEvent('field-change', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n render() {\n const hasChildren = this.concept.children && this.concept.children.length > 0;\n const level = this.concept.level || 0;\n const isAbstract = this.concept.abstract || false;\n\n return html`\n <!-- Concept Name Cell (Left Column) -->\n <td class=\"concept-name-cell ${isAbstract ? 'abstract' : (hasChildren ? '' : 'leaf')}\">\n <div class=\"concept-content\" style=\"--level: ${level}\">\n <div class=\"concept-indent\"></div>\n <div class=\"concept-toggle ${hasChildren ? (this._expanded ? 'expanded' : '') : 'no-children'}\"\n @click=\"${this._toggleExpanded}\">\n ${hasChildren ? '▶' : ''}\n </div>\n <div class=\"concept-label\" \n @click=\"${this._toggleExpanded}\"\n title=\"${this.concept.id}${this.concept.description ? ' - ' + this.concept.description : ''}\">\n ${this.concept.label}\n </div>\n </div>\n </td>\n\n <!-- Input Field Cells (Period Columns) - Only for non-abstract concepts -->\n ${this.columns.map(column => {\n const field = this._getFieldForColumn(column.id);\n const shouldShowField = !isAbstract && field;\n \n return html`\n <td class=\"field-cell ${!shouldShowField ? 'empty' : ''} ${isAbstract ? 'abstract-row' : ''}\">\n ${shouldShowField ? html`\n <jupiter-form-field\n .field=\"${field}\"\n .conceptId=\"${this.concept.id}\"\n .columnId=\"${column.id}\"\n .value=\"${this._getFieldValue(field)}\"\n .disabled=\"${this.disabled}\"\n .locale=\"${this.locale}\"\n .hideLabel=\"${true}\"\n @field-change=\"${this._handleFieldChange}\"\n ></jupiter-form-field>\n ` : ''}\n </td>\n `;\n })}\n `;\n }\n}\n","import { LitElement, html, css, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nexport interface AddColumnRequest {\n periodType: 'duration' | 'instant' | 'mixed';\n startDate?: string;\n endDate?: string;\n instantDate?: string;\n selectedDimensions?: DimensionSelection[];\n}\n\nexport interface DimensionSelection {\n axisId: string;\n axisLabel: string;\n memberId?: string;\n memberLabel?: string;\n isTyped?: boolean;\n typedValue?: string;\n}\n\nexport interface AvailableDimension {\n id: string;\n conceptName: string;\n axisLabel: string;\n members?: AvailableDimensionMember[];\n typedMember?: {\n id: string;\n dataType: string;\n };\n}\n\nexport interface AvailableDimensionMember {\n id: string;\n label: string;\n}\n\n@customElement('jupiter-add-column-dialog')\nexport class JupiterAddColumnDialog extends LitElement {\n @property({ type: String }) periodType: 'duration' | 'instant' | 'mixed' = 'duration';\n @property({ type: Boolean }) open = false;\n @property({ type: Array }) availableDimensions: AvailableDimension[] = [];\n\n @state() private _startDate = '';\n @state() private _endDate = '';\n @state() private _instantDate = '';\n @state() private _selectedType: 'duration' | 'instant' = 'duration';\n @state() private _selectedDimensions: Map<string, DimensionSelection> = new Map();\n\n updated(changedProperties: PropertyValues) {\n if (changedProperties.has('open') && this.open) {\n // Reset form when dialog opens\n this._resetForm();\n }\n \n if (changedProperties.has('availableDimensions')) {\n //////console.log(`🎯 Add Column Dialog received ${this.availableDimensions.length} dimensions:`, this.availableDimensions.map(d => d.axisLabel));\n }\n }\n\n static styles = css`\n :host {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.3s ease, visibility 0.3s ease;\n }\n\n :host([open]) {\n opacity: 1;\n visibility: visible;\n }\n\n .dialog {\n background: white;\n border-radius: 8px;\n padding: 24px;\n min-width: 400px;\n max-width: 500px;\n max-height: 90vh;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n transform: scale(0.9);\n transition: transform 0.3s ease;\n display: flex;\n flex-direction: column;\n }\n\n :host([open]) .dialog {\n transform: scale(1);\n }\n\n .dialog-header {\n margin-bottom: 20px;\n flex-shrink: 0;\n }\n\n .dialog-title {\n font-size: 20px;\n font-weight: 600;\n color: var(--jupiter-text-primary, #333);\n margin: 0 0 8px 0;\n }\n\n .dialog-description {\n font-size: 14px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0;\n }\n\n .dialog-content {\n margin-bottom: 24px;\n flex: 1;\n overflow-y: auto;\n max-height: calc(90vh - 160px);\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group.date-row {\n display: flex;\n gap: 12px;\n }\n\n .form-group.date-row .date-field {\n flex: 1;\n }\n\n .form-label {\n display: block;\n font-weight: 500;\n margin-bottom: 6px;\n color: var(--jupiter-text-primary, #333);\n font-size: 14px;\n }\n\n .form-label.required::after {\n content: ' *';\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .form-input {\n width: 100%;\n box-sizing: border-box;\n padding: 10px 12px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n font-size: 14px;\n font-family: inherit;\n transition: border-color 0.2s ease;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #007bff);\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n }\n\n select.form-input {\n cursor: pointer;\n background-color: white;\n }\n\n .dialog-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n flex-shrink: 0;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n padding-top: 16px;\n margin-top: 16px;\n }\n\n .btn {\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .btn-cancel {\n background: var(--jupiter-neutral-background, #f5f5f5);\n color: var(--jupiter-text-primary, #333);\n }\n\n .btn-cancel:hover {\n background: var(--jupiter-neutral-background-hover, #e0e0e0);\n }\n\n .btn-primary {\n background: var(--jupiter-primary-color, #667eea);\n color: white;\n }\n\n .btn-primary:hover {\n background: var(--jupiter-primary-color-dark, #5a6fd8);\n }\n\n .btn-primary:disabled {\n background: var(--jupiter-disabled-background, #ccc);\n cursor: not-allowed;\n }\n\n /* Dimension Selection Styles */\n .dimensions-section {\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .dimensions-section h3 {\n margin: 0 0 16px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n }\n\n .dimension-item {\n margin-bottom: 16px;\n padding: 16px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n background: var(--jupiter-card-background, #fafafa);\n }\n\n .dimension-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n }\n\n .dimension-checkbox {\n margin: 0;\n }\n\n .dimension-label {\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n flex: 1;\n }\n\n .dimension-details {\n margin-left: 24px;\n }\n\n .member-selection {\n margin-top: 12px;\n }\n\n .member-selection label {\n display: block;\n margin-bottom: 4px;\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n }\n\n .typed-input {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n font-size: 14px;\n }\n\n .member-list {\n max-height: 120px;\n overflow-y: auto;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n padding: 8px;\n }\n\n .member-option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n }\n\n .member-option input[type=\"radio\"] {\n margin: 0;\n }\n\n .member-option label {\n margin: 0;\n font-size: 13px;\n color: var(--jupiter-text-primary, #333);\n cursor: pointer;\n }\n\n .no-dimensions {\n text-align: center;\n color: var(--jupiter-text-secondary, #666);\n font-style: italic;\n padding: 20px;\n }\n\n .form-description {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0 0 12px 0;\n line-height: 1.4;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._resetForm();\n }\n\n willUpdate(changedProperties: Map<string, unknown>) {\n super.willUpdate(changedProperties);\n if (changedProperties.has('open') && this.open) {\n this._resetForm();\n }\n }\n\n private _handleCancel() {\n this.open = false;\n this.dispatchEvent(new CustomEvent('dialog-cancel', { bubbles: true }));\n }\n\n private _handleConfirm() {\n if (!this._isFormValid()) return;\n\n const request: AddColumnRequest = {\n periodType: this.periodType === 'mixed' ? this._selectedType : this.periodType\n };\n\n if (this.periodType === 'instant' || (this.periodType === 'mixed' && this._selectedType === 'instant')) {\n request.instantDate = this._instantDate;\n } else {\n request.startDate = this._startDate;\n request.endDate = this._endDate;\n }\n\n // Add selected dimensions\n if (this._selectedDimensions.size > 0) {\n request.selectedDimensions = Array.from(this._selectedDimensions.values());\n }\n\n this.dispatchEvent(new CustomEvent('column-add', {\n detail: request,\n bubbles: true\n }));\n }\n\n private _isFormValid(): boolean {\n if (this.periodType === 'mixed') {\n if (this._selectedType === 'instant') {\n return !!this._instantDate;\n } else {\n return !!this._startDate && !!this._endDate && this._startDate <= this._endDate;\n }\n } else if (this.periodType === 'duration') {\n return !!this._startDate && !!this._endDate && this._startDate <= this._endDate;\n } else if (this.periodType === 'instant') {\n return !!this._instantDate;\n }\n return false;\n }\n\n private _handleStartDateChange(e: Event) {\n this._startDate = (e.target as HTMLInputElement).value;\n }\n\n private _handleEndDateChange(e: Event) {\n this._endDate = (e.target as HTMLInputElement).value;\n }\n\n private _handleSelectedTypeChange(e: Event) {\n this._selectedType = (e.target as HTMLSelectElement).value as 'duration' | 'instant';\n }\n\n private _handleInstantDateChange(e: Event) {\n this._instantDate = (e.target as HTMLInputElement).value;\n }\n\n private _handleDimensionToggle(dimensionId: string, event: Event) {\n const checkbox = event.target as HTMLInputElement;\n \n if (checkbox.checked) {\n const dimension = this.availableDimensions.find(d => d.id === dimensionId);\n if (dimension) {\n const selection: DimensionSelection = {\n axisId: dimension.id,\n axisLabel: dimension.axisLabel,\n isTyped: !!(dimension.typedMember && (!dimension.members || dimension.members.length === 0))\n };\n \n this._selectedDimensions.set(dimensionId, selection);\n }\n } else {\n this._selectedDimensions.delete(dimensionId);\n }\n \n this.requestUpdate();\n }\n\n private _handleMemberSelection(dimensionId: string, memberId: string, memberLabel: string) {\n const existing = this._selectedDimensions.get(dimensionId);\n if (existing) {\n existing.memberId = memberId;\n existing.memberLabel = memberLabel;\n this._selectedDimensions.set(dimensionId, existing);\n this.requestUpdate();\n }\n }\n\n private _handleTypedValueChange(dimensionId: string, event: Event) {\n const input = event.target as HTMLInputElement;\n const existing = this._selectedDimensions.get(dimensionId);\n if (existing) {\n existing.typedValue = input.value;\n this._selectedDimensions.set(dimensionId, existing);\n }\n }\n\n private _resetForm() {\n const today = new Date().toISOString().split('T')[0];\n this._startDate = today;\n this._endDate = today;\n this._instantDate = today;\n this._selectedType = this.periodType === 'instant' ? 'instant' : 'duration';\n this._selectedDimensions.clear();\n \n // Auto-select dimensions with only one member\n this._autoSelectSingleMemberDimensions();\n \n this.requestUpdate();\n }\n\n private _autoSelectSingleMemberDimensions() {\n this.availableDimensions.forEach(dimension => {\n // Auto-select if dimension has exactly one member\n if (dimension.members && dimension.members.length === 1) {\n const member = dimension.members[0];\n const selection: DimensionSelection = {\n axisId: dimension.id,\n axisLabel: dimension.axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: false\n };\n this._selectedDimensions.set(dimension.id, selection);\n ////console.log(`🎯 Auto-selected single member: ${dimension.axisLabel} -> ${member.label}`);\n }\n // Auto-select typed dimensions (no domain members, only typed input)\n else if (dimension.typedMember && (!dimension.members || dimension.members.length === 0)) {\n const selection: DimensionSelection = {\n axisId: dimension.id,\n axisLabel: dimension.axisLabel,\n isTyped: true\n // Note: typedValue will be entered in column header, not here\n };\n this._selectedDimensions.set(dimension.id, selection);\n ////console.log(`🎯 Auto-selected typed dimension: ${dimension.axisLabel} (value will be entered in column header)`);\n }\n });\n }\n\n render() {\n if (!this.open) return html``;\n\n const isValid = this._isFormValid();\n\n return html`\n <div class=\"dialog\" @click=\"${(e: Event) => e.stopPropagation()}\">\n <div class=\"dialog-header\">\n <h2 class=\"dialog-title\">Add Column</h2>\n\n </div>\n\n <div class=\"dialog-content\">\n ${this.periodType === 'mixed' ? html`\n <div class=\"form-group\">\n <label class=\"form-label required\">Column Type</label>\n <select \n class=\"form-input\"\n .value=\"${this._selectedType}\"\n @change=\"${this._handleSelectedTypeChange}\"\n required\n >\n <option value=\"instant\">Instant (single date)</option>\n <option value=\"duration\">Duration (start and end dates)</option>\n </select>\n </div>\n ` : ''}\n\n ${(this.periodType === 'instant' || (this.periodType === 'mixed' && this._selectedType === 'instant')) ? html`\n <div class=\"form-group\">\n <label class=\"form-label required\">Instant Date</label>\n <input \n type=\"date\" \n class=\"form-input\"\n .value=\"${this._instantDate}\"\n @change=\"${this._handleInstantDateChange}\"\n required\n />\n </div>\n ` : html`\n <div class=\"form-group date-row\">\n <div class=\"date-field\">\n <label class=\"form-label required\">Start Period Date</label>\n <input \n type=\"date\" \n class=\"form-input\"\n .value=\"${this._startDate}\"\n @change=\"${this._handleStartDateChange}\"\n required\n />\n </div>\n <div class=\"date-field\">\n <label class=\"form-label required\">End Period Date</label>\n <input \n type=\"date\" \n class=\"form-input\"\n .value=\"${this._endDate}\"\n @change=\"${this._handleEndDateChange}\"\n required\n />\n </div>\n </div>\n `}\n\n <!-- Dimensions Section -->\n ${this.availableDimensions.length > 0 ? html`\n <div class=\"dimensions-section\">\n <h3>Available Dimensions</h3>\n <p class=\"form-description\">Select dimensions to include in the column. Domain members can be selected here, while typed dimension values will be entered directly in the column header.</p>\n \n ${this.availableDimensions.map(dimension => {\n const isSelected = this._selectedDimensions.has(dimension.id);\n const selection = this._selectedDimensions.get(dimension.id);\n const isTypedDimension = !!(dimension.typedMember && (!dimension.members || dimension.members.length === 0));\n \n return html`\n <div class=\"dimension-item\">\n <div class=\"dimension-header\">\n <input \n type=\"checkbox\" \n class=\"dimension-checkbox\"\n .checked=\"${isSelected}\"\n @change=\"${(e: Event) => this._handleDimensionToggle(dimension.id, e)}\"\n id=\"dim-${dimension.id}\"\n />\n <label for=\"dim-${dimension.id}\" class=\"dimension-label\">\n ${dimension.axisLabel || dimension.conceptName}\n </label>\n </div>\n \n ${isSelected ? html`\n <div class=\"dimension-details\">\n ${isTypedDimension ? html`\n <!-- Typed Dimension Input -->\n <div class=\"member-selection\">\n <label>Enter value for ${dimension.conceptName}:</label>\n <input\n type=\"text\"\n class=\"typed-input\"\n .value=\"${selection?.typedValue || ''}\"\n @input=\"${(e: Event) => this._handleTypedValueChange(dimension.id, e)}\"\n placeholder=\"Enter value...\"\n />\n </div>\n ` : html`\n <!-- Domain Members Selection -->\n ${dimension.members && dimension.members.length > 0 ? html`\n <div class=\"member-selection\">\n <label>Select member:</label>\n <div class=\"member-list\">\n ${dimension.members.map(member => html`\n <div class=\"member-option\">\n <input\n type=\"radio\"\n name=\"member-${dimension.id}\"\n .checked=\"${selection?.memberId === member.id}\"\n @change=\"${() => this._handleMemberSelection(dimension.id, member.id, member.label)}\"\n id=\"member-${dimension.id}-${member.id}\"\n />\n <label for=\"member-${dimension.id}-${member.id}\">\n ${member.label}\n </label>\n </div>\n `)}\n </div>\n </div>\n ` : html`\n <p class=\"form-description\">No members available for this dimension</p>\n `}\n `}\n </div>\n ` : ''}\n </div>\n `;\n })}\n </div>\n ` : ''}\n </div>\n\n <div class=\"dialog-actions\">\n <button class=\"btn btn-cancel\" @click=\"${this._handleCancel}\">\n Cancel\n </button>\n <button \n class=\"btn btn-primary\" \n ?disabled=\"${!isValid}\"\n @click=\"${this._handleConfirm}\"\n >\n Add Column\n </button>\n </div>\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { FormSection, FormColumn, ConceptTree } from '../schema/types';\nimport './concept-tree';\nimport './add-column-dialog';\nimport { AddColumnRequest, AvailableDimension } from './add-column-dialog';\n\n@customElement('jupiter-form-section')\nexport class JupiterFormSection extends LitElement {\n @property({ type: Object }) section!: FormSection;\n @property({ type: Array }) columns: FormColumn[] = [];\n @property({ type: Object }) formData: Record<string, any> = {};\n @property({ type: Object }) typedMemberData: Record<string, Record<string, string>> = {};\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean }) collapsible = true;\n @property({ type: String }) locale = 'en-US';\n @property({ type: Boolean }) isFirstSection = false;\n @property({ type: Array }) availableDimensions: AvailableDimension[] = [];\n\n @state() private _expanded = true;\n @state() private _showAddColumnDialog = false;\n @state() private _sectionPeriodType: 'duration' | 'instant' | 'mixed' = 'duration';\n\n static styles = css`\n :host {\n display: block;\n margin-bottom: 16px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .section-header {\n background: var(--jupiter-section-header-background, #f0f2f5);\n padding: 16px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n cursor: pointer;\n user-select: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .section-header:hover {\n background: var(--jupiter-section-header-hover-background, #e4e7ea);\n }\n\n .section-header.not-collapsible {\n cursor: default;\n }\n\n .section-header.not-collapsible:hover {\n background: var(--jupiter-section-header-background, #f0f2f5);\n }\n\n .section-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--jupiter-text-primary, #333);\n margin: 0;\n }\n\n .section-description {\n font-size: 14px;\n color: var(--jupiter-text-secondary, #666);\n margin: 4px 0 0 0;\n }\n\n .section-toggle {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n transition: transform 0.2s ease;\n color: var(--jupiter-text-secondary, #666);\n }\n\n .section-toggle.expanded {\n transform: rotate(90deg);\n }\n\n .section-toggle.hidden {\n visibility: hidden;\n }\n\n .section-header-controls {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .tree-control {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--jupiter-text-secondary, #666);\n background: var(--jupiter-button-background, #fff);\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n padding: 4px 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .tree-control:hover {\n background: var(--jupiter-button-hover-background, #f5f5f5);\n border-color: var(--jupiter-primary-color, #007bff);\n }\n\n .tree-control-checkbox {\n width: 14px;\n height: 14px;\n cursor: pointer;\n }\n\n .tree-control-label {\n cursor: pointer;\n font-weight: 500;\n white-space: nowrap;\n }\n\n .section-content {\n display: block;\n transition: max-height 0.3s ease;\n overflow: hidden;\n }\n\n .section-content.collapsed {\n display: none;\n }\n\n .table-container {\n overflow-x: auto;\n }\n\n .form-table {\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n background: var(--jupiter-table-background, #fff);\n }\n\n .table-header {\n background: var(--jupiter-header-background, #f8f9fa);\n position: sticky;\n top: 0;\n z-index: 1;\n }\n\n .header-row {\n /* Table row - no special display needed */\n }\n\n .header-cell {\n padding: 8px 12px;\n text-align: left;\n font-weight: 600;\n color: var(--jupiter-text-primary, #333);\n border: 1px solid var(--jupiter-border-color, #ddd);\n background: var(--jupiter-header-background, #f8f9fa);\n min-width: 180px;\n width: 180px;\n font-size: 14px;\n vertical-align: middle;\n }\n\n .header-cell.concept-column {\n width: 300px;\n min-width: 300px;\n max-width: 300px;\n position: sticky;\n left: 0;\n z-index: 2;\n }\n\n .header-cell.removable {\n position: relative;\n }\n\n .remove-column-btn {\n position: absolute;\n top: 4px;\n right: 4px;\n width: 20px;\n height: 20px;\n border: none;\n background: var(--jupiter-error-color, #d32f2f);\n color: white;\n border-radius: 50%;\n font-size: 12px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .remove-column-btn:hover {\n background: var(--jupiter-error-color-dark, #b71c1c);\n }\n\n .add-column-btn {\n background: var(--jupiter-primary-color, #667eea);\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n margin: 8px;\n }\n\n .add-column-btn:hover {\n background: var(--jupiter-primary-color-dark, #5a6fd8);\n }\n\n /* Column header content styling */\n .column-header-content {\n display: flex;\n flex-direction: column;\n gap: 8px;\n align-items: center;\n }\n\n .column-title {\n text-align: center;\n }\n\n /* Typed member header input styles */\n .typed-members-header {\n display: flex;\n flex-direction: column;\n gap: 4px;\n width: 100%;\n padding: 8px;\n background: var(--jupiter-typed-member-header-background, #f8f9fa);\n border-radius: 4px;\n border: 1px solid var(--jupiter-border-color, #e0e0e0);\n }\n\n .typed-member-header-input {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .typed-member-header-label {\n font-size: 11px;\n font-weight: 500;\n color: var(--jupiter-text-secondary, #666);\n text-align: left;\n }\n\n .typed-member-header-field {\n width: 100%;\n padding: 4px 6px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 3px;\n font-size: 12px;\n background: var(--jupiter-input-background, #fff);\n }\n\n .typed-member-header-field:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 0 0 1px var(--jupiter-primary-color, #1976d2);\n }\n\n .typed-member-header-field::placeholder {\n color: var(--jupiter-text-placeholder, #999);\n font-size: 11px;\n }\n\n .empty-section {\n padding: 24px;\n text-align: center;\n color: var(--jupiter-text-secondary, #666);\n font-style: italic;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._expanded = this.section.expanded !== false;\n this._determinePeriodType();\n this._checkAndExpandFirstSection();\n }\n \n updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n \n // Check if this became the first section or if section/isFirstSection properties changed\n if (changedProperties.has('isFirstSection') || changedProperties.has('section')) {\n this._checkAndExpandFirstSection();\n }\n }\n \n private _checkAndExpandFirstSection() {\n // If this is the first section, expand it and its tree by default\n if (this.isFirstSection && this.section && this.section.concepts) {\n this._expanded = true;\n // Use setTimeout to ensure the DOM is ready for tree expansion\n setTimeout(() => {\n this._expandAllTrees();\n console.log('🎯 First section detected - expanded section and tree by default');\n }, 0);\n }\n }\n\n private _determinePeriodType() {\n // Get all non-abstract concepts\n const nonAbstractConcepts = this._getAllNonAbstractConcepts(this.section.concepts);\n \n if (nonAbstractConcepts.length === 0) {\n this._sectionPeriodType = 'duration';\n console.log(`📊 Section ${this.section.id}: No concepts, defaulting to duration`);\n return;\n }\n\n // Check period types\n const periodTypes = new Set(nonAbstractConcepts.map(c => c.periodType).filter(Boolean));\n \n console.log(`🏷️ Section ${this.section.id}: Found period types:`, Array.from(periodTypes));\n console.log(`📝 Section ${this.section.id}: Non-abstract concepts and their period types:`, \n nonAbstractConcepts.map(c => ({ name: c.name, periodType: c.periodType, abstract: c.abstract }))\n );\n \n if (periodTypes.size === 0) {\n this._sectionPeriodType = 'duration';\n console.log(`📊 Section ${this.section.id}: No period types defined, defaulting to duration`);\n } else if (periodTypes.size === 1) {\n const singleType = Array.from(periodTypes)[0];\n this._sectionPeriodType = singleType === 'instant' ? 'instant' : 'duration';\n console.log(`📊 Section ${this.section.id}: Single period type '${singleType}', setting to '${this._sectionPeriodType}'`);\n } else {\n this._sectionPeriodType = 'mixed';\n console.log(`📊 Section ${this.section.id}: Mixed period types, setting to 'mixed'`);\n }\n \n console.log(`✅ Section ${this.section.id}: Final period type: ${this._sectionPeriodType}`);\n }\n\n private _getAllNonAbstractConcepts(concepts: ConceptTree[]): ConceptTree[] {\n const result: ConceptTree[] = [];\n \n for (const concept of concepts) {\n if (!concept.abstract) {\n result.push(concept);\n }\n if (concept.children) {\n result.push(...this._getAllNonAbstractConcepts(concept.children));\n }\n }\n \n return result;\n }\n\n private _toggleExpanded() {\n if (!this.collapsible) return;\n \n this._expanded = !this._expanded;\n \n this.dispatchEvent(new CustomEvent('section-expand', {\n detail: {\n sectionId: this.section.id,\n expanded: this._expanded\n },\n bubbles: true\n }));\n }\n\n private _handleRemoveColumn(columnId: string) {\n this.dispatchEvent(new CustomEvent('column-remove', {\n detail: { \n columnId,\n sectionId: this.section.id \n },\n bubbles: true\n }));\n }\n\n private _handleAddColumn() {\n // Determine period type specifically for this add column action\n const buttonPeriodType = this._determineButtonPeriodType();\n \n // Override the section period type for this dialog\n this._sectionPeriodType = buttonPeriodType;\n this._showAddColumnDialog = true;\n }\n\n private _determineButtonPeriodType(): 'duration' | 'instant' | 'mixed' {\n // Get all non-abstract concepts in the section (not just those with fields)\n // This ensures we correctly identify mixed period sections even when some concepts\n // don't have fields in the default column due to period type filtering\n const allNonAbstractConcepts = this._getAllNonAbstractConcepts(this.section.concepts);\n \n if (allNonAbstractConcepts.length === 0) {\n return 'duration';\n }\n\n // Check period types of all non-abstract concepts in the section\n const periodTypes = new Set(\n allNonAbstractConcepts\n .map(c => c.periodType)\n .filter(periodType => periodType !== undefined && periodType !== null)\n );\n \n if (periodTypes.size === 0) {\n return 'duration';\n } else if (periodTypes.size === 1) {\n const singleType = Array.from(periodTypes)[0];\n return singleType === 'instant' ? 'instant' : 'duration';\n } else {\n return 'mixed';\n }\n }\n\n private _getConceptsWithFields(concepts: ConceptTree[]): ConceptTree[] {\n const result: ConceptTree[] = [];\n \n for (const concept of concepts) {\n // Include concepts that have fields and are not abstract\n if (!concept.abstract && concept.fields && concept.fields.length > 0) {\n result.push(concept);\n }\n \n // Recursively check children\n if (concept.children) {\n result.push(...this._getConceptsWithFields(concept.children));\n }\n }\n \n return result;\n }\n\n private _handleDialogCancel() {\n this._showAddColumnDialog = false;\n }\n\n private _handleColumnAdd(event: CustomEvent<AddColumnRequest>) {\n event.stopPropagation();\n this._showAddColumnDialog = false;\n \n // Dispatch event to parent component with the column request\n this.dispatchEvent(new CustomEvent('column-add-request', {\n detail: {\n sectionId: this.section.id,\n columnRequest: event.detail\n },\n bubbles: true\n }));\n }\n\n private _handleFieldChange(event: CustomEvent) {\n event.stopPropagation();\n this.dispatchEvent(new CustomEvent('field-change', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _flattenConcepts(concepts: ConceptTree[], expanded: Set<string> = new Set()): ConceptTree[] {\n const result: ConceptTree[] = [];\n \n for (const concept of concepts) {\n result.push(concept);\n \n // If concept is expanded and has children, include them\n if (concept.children && concept.children.length > 0 && expanded.has(concept.id)) {\n const childrenFlattened = this._flattenConcepts(concept.children, expanded);\n result.push(...childrenFlattened);\n }\n }\n \n return result;\n }\n\n @state() private _expandedConcepts = new Set<string>();\n @state() private _allTreeExpanded = false;\n\n private _getAllConceptIds(concepts: ConceptTree[]): string[] {\n const result: string[] = [];\n \n for (const concept of concepts) {\n if (concept.children && concept.children.length > 0) {\n result.push(concept.id);\n result.push(...this._getAllConceptIds(concept.children));\n }\n }\n \n return result;\n }\n\n private _expandAllTrees() {\n const allConceptIds = this._getAllConceptIds(this.section.concepts || []);\n allConceptIds.forEach(id => this._expandedConcepts.add(id));\n this._allTreeExpanded = true;\n this.requestUpdate();\n }\n\n private _collapseAllTrees() {\n this._expandedConcepts.clear();\n this._allTreeExpanded = false;\n this.requestUpdate();\n }\n\n private _toggleAllTrees(event: Event) {\n event.stopPropagation(); // Prevent triggering accordion toggle\n \n // Auto-expand the accordion if it's collapsed\n if (!this._expanded) {\n this._expanded = true;\n }\n \n if (this._allTreeExpanded) {\n this._collapseAllTrees();\n } else {\n this._expandAllTrees();\n }\n }\n\n private _handleTreeCheckboxChange(event: Event) {\n event.stopPropagation(); // Prevent triggering accordion toggle\n const checkbox = event.target as HTMLInputElement;\n \n // Auto-expand the accordion if it's collapsed\n if (!this._expanded) {\n this._expanded = true;\n }\n \n if (checkbox.checked) {\n this._expandAllTrees();\n } else {\n this._collapseAllTrees();\n }\n }\n\n private _handleConceptExpand(event: CustomEvent) {\n event.stopPropagation();\n const { conceptId, expanded } = event.detail;\n \n if (expanded) {\n this._expandedConcepts.add(conceptId);\n } else {\n this._expandedConcepts.delete(conceptId);\n }\n \n // Update the allTreeExpanded state based on whether all concepts are expanded\n const allConceptIds = this._getAllConceptIds(this.section.concepts || []);\n this._allTreeExpanded = allConceptIds.length > 0 && allConceptIds.every(id => this._expandedConcepts.has(id));\n \n // Force re-render\n this.requestUpdate();\n \n this.dispatchEvent(new CustomEvent('concept-expand', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _getTypedMemberHeaderValue(columnId: string, axisId: string): string {\n // Get typed member value from the dedicated typed member data structure\n return this.typedMemberData[columnId]?.[axisId] || '';\n }\n\n private _handleTypedMemberHeaderChange(event: Event, columnId: string, axisId: string) {\n const target = event.target as HTMLInputElement;\n const value = target.value;\n \n console.log(`🔍 [FormSection] Typed member header change: columnId=${columnId}, axisId=${axisId}, value=${value}`);\n \n // Dispatch typed member change event (matches what dynamic form expects)\n this.dispatchEvent(new CustomEvent('typed-member-change', {\n detail: {\n columnId: columnId,\n axisId: axisId,\n value: value\n },\n bubbles: true\n }));\n }\n\n render() {\n if (!this.section.concepts || this.section.concepts.length === 0) {\n return html`\n <div class=\"section-header ${!this.collapsible ? 'not-collapsible' : ''}\" \n @click=\"${this._toggleExpanded}\">\n <div>\n <h3 class=\"section-title\">${this.section.title}</h3>\n ${this.section.description ? html`\n <p class=\"section-description\">${this.section.description}</p>\n ` : ''}\n </div>\n <div class=\"section-header-controls\">\n <div class=\"section-toggle ${this.collapsible ? (this._expanded ? 'expanded' : '') : 'hidden'}\">\n ${this.collapsible ? '▶' : ''}\n </div>\n </div>\n </div>\n \n <div class=\"section-content ${!this._expanded ? 'collapsed' : ''}\">\n <div class=\"empty-section\">\n No concepts defined for this section.\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"section-header ${!this.collapsible ? 'not-collapsible' : ''}\" \n @click=\"${this._toggleExpanded}\">\n <div>\n <h3 class=\"section-title\">${this.section.title}</h3>\n ${this.section.description ? html`\n <p class=\"section-description\">${this.section.description}</p>\n ` : ''}\n </div>\n <div class=\"section-header-controls\">\n <div class=\"tree-control\">\n <input\n type=\"checkbox\"\n class=\"tree-control-checkbox\"\n .checked=\"${this._allTreeExpanded}\"\n @change=\"${this._handleTreeCheckboxChange}\"\n />\n <span class=\"tree-control-label\" @click=\"${this._toggleAllTrees}\">${this._allTreeExpanded ? 'Collapse Tree' : 'Expand Tree'}</span>\n </div>\n <div class=\"section-toggle ${this.collapsible ? (this._expanded ? 'expanded' : '') : 'hidden'}\">\n ${this.collapsible ? '▶' : ''}\n </div>\n </div>\n </div>\n\n <div class=\"section-content ${!this._expanded ? 'collapsed' : ''}\">\n <div class=\"table-container\">\n <table class=\"form-table\">\n <thead class=\"table-header\">\n <tr class=\"header-row\">\n <th class=\"header-cell concept-column\">Concept</th>\n ${this.columns.map(column => html`\n <th class=\"header-cell ${column.removable ? 'removable' : ''}\">\n <div class=\"column-header-content\">\n <div class=\"column-title\">\n ${column.title}\n ${column.description ? html`<div style=\"font-weight: normal; font-size: 12px; color: var(--jupiter-text-secondary, #666);\">${column.description}</div>` : ''}\n </div>\n \n <!-- Typed member input fields in column header -->\n ${column.dimensionData?.hasTypedMembers ? html`\n <div class=\"typed-members-header\">\n ${column.dimensionData?.typedMembers?.map((typedMember: any) => html`\n <div class=\"typed-member-header-input\">\n <input\n type=\"text\"\n class=\"typed-member-header-field\"\n placeholder=\"Enter ${typedMember.axisLabel}\"\n .value=\"${this._getTypedMemberHeaderValue(column.id, typedMember.axisId)}\"\n @input=\"${(e: Event) => this._handleTypedMemberHeaderChange(e, column.id, typedMember.axisId)}\"\n />\n </div>\n `)}\n </div>\n ` : ''}\n \n ${column.removable ? html`\n <button \n class=\"remove-column-btn\"\n @click=\"${(e: Event) => {\n e.stopPropagation();\n this._handleRemoveColumn(column.id);\n }}\"\n title=\"Remove column\"\n >×</button>\n ` : ''}\n </div>\n </th>\n `)}\n <th class=\"header-cell\">\n <button class=\"add-column-btn\" @click=\"${(e: Event) => {\n e.stopPropagation();\n this._handleAddColumn();\n }}\" title=\"Add Column\">\n + Add Column\n </button>\n </th>\n </tr>\n </thead>\n <tbody class=\"table-body\">\n ${this._flattenConcepts(this.section.concepts, this._expandedConcepts).map(concept => html`\n <tr>\n <jupiter-concept-tree\n .concept=\"${concept}\"\n .columns=\"${this.columns}\"\n .formData=\"${this.formData}\"\n .disabled=\"${this.disabled}\"\n .locale=\"${this.locale}\"\n .expandedConcepts=\"${this._expandedConcepts}\"\n @field-change=\"${this._handleFieldChange}\"\n @concept-expand=\"${this._handleConceptExpand}\"\n ></jupiter-concept-tree>\n </tr>\n `)}\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- Add Column Dialog -->\n <jupiter-add-column-dialog\n .periodType=\"${this._sectionPeriodType}\"\n ?open=\"${this._showAddColumnDialog}\"\n .availableDimensions=\"${this.availableDimensions}\"\n @dialog-cancel=\"${this._handleDialogCancel}\"\n @column-add=\"${this._handleColumnAdd}\"\n ></jupiter-add-column-dialog>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { FormSection } from '../schema/types';\n\nexport interface FilterRolesRequest {\n availableRoles: FormSection[];\n currentSelectedRoles: string[];\n}\n\n@customElement('jupiter-filter-roles-dialog')\nexport class JupiterFilterRolesDialog extends LitElement {\n @property({ type: Boolean, reflect: true }) open = false;\n @property({ type: Array }) availableRoles: FormSection[] = [];\n @property({ type: Array }) selectedRoleIds: string[] = [];\n\n @state() private _tempSelectedRoles = new Set<string>();\n @state() private _searchQuery = '';\n @state() private _filteredRoles: FormSection[] = [];\n\n static styles = css`\n :host {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 10000;\n display: none;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.5);\n font-family: var(--jupiter-font-family, system-ui, -apple-system, sans-serif);\n }\n\n :host([open]) {\n display: flex;\n }\n\n .dialog {\n background: var(--jupiter-background, #fff);\n border-radius: 8px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n \n width: 90vw;\n max-height: 80vh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .dialog-header {\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .dialog-title {\n font-size: 18px;\n font-weight: 600;\n margin: 0;\n color: var(--jupiter-text-primary, #333);\n flex: 1;\n }\n\n .filter-icon {\n width: 20px;\n height: 20px;\n fill: var(--jupiter-primary-color, #1976d2);\n }\n\n .close-button {\n background: none;\n border: none;\n font-size: 24px;\n cursor: pointer;\n padding: 4px;\n color: var(--jupiter-text-secondary, #666);\n border-radius: 4px;\n transition: background-color 0.2s ease;\n }\n\n .close-button:hover {\n background: var(--jupiter-hover-background, #f5f5f5);\n }\n\n .dialog-content {\n flex: 1;\n overflow-y: auto;\n padding: 20px 24px;\n }\n\n .description {\n color: var(--jupiter-text-secondary, #666);\n font-size: 14px;\n margin: 0 0 20px 0;\n line-height: 1.5;\n }\n\n .selection-controls {\n display: flex;\n gap: 12px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n }\n\n .search-container {\n margin-bottom: 16px;\n position: relative;\n }\n\n .search-input {\n width: 100%;\n padding: 10px 40px 10px 12px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n font-size: 14px;\n font-family: inherit;\n background: var(--jupiter-background, #fff);\n color: var(--jupiter-text-primary, #333);\n transition: border-color 0.2s ease;\n }\n\n .search-input:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.1);\n }\n\n .search-input::placeholder {\n color: var(--jupiter-text-secondary, #666);\n }\n\n .search-icon {\n position: absolute;\n right: 12px;\n top: 50%;\n transform: translateY(-50%);\n width: 16px;\n height: 16px;\n fill: var(--jupiter-text-secondary, #666);\n pointer-events: none;\n }\n\n .clear-search {\n position: absolute;\n right: 12px;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n cursor: pointer;\n padding: 2px;\n border-radius: 2px;\n color: var(--jupiter-text-secondary, #666);\n font-size: 16px;\n line-height: 1;\n transition: color 0.2s ease;\n }\n\n .clear-search:hover {\n color: var(--jupiter-text-primary, #333);\n }\n\n .search-results-info {\n font-size: 12px;\n color: var(--jupiter-text-secondary, #666);\n margin-bottom: 8px;\n text-align: center;\n }\n\n .no-results {\n text-align: center;\n padding: 40px 20px;\n color: var(--jupiter-text-secondary, #666);\n font-style: italic;\n }\n\n mark {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: 500;\n }\n\n .selection-control {\n background: none;\n border: 1px solid var(--jupiter-primary-color, #1976d2);\n color: var(--jupiter-primary-color, #1976d2);\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .selection-control:hover {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n }\n\n .roles-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n max-height: 300px;\n overflow-y: auto;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n padding: 12px;\n }\n\n .role-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 8px;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n }\n\n .role-item:hover {\n background: var(--jupiter-hover-background, #f5f5f5);\n }\n\n .role-checkbox {\n margin-top: 2px;\n cursor: pointer;\n }\n\n .role-info {\n flex: 1;\n min-width: 0;\n }\n\n .role-title {\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n margin: 0 0 4px 0;\n word-wrap: break-word;\n line-height: 1.3;\n }\n\n .role-description {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0;\n line-height: 1.4;\n word-break: break-all; /* Allow URI breaking */\n }\n\n .role-description:last-child {\n margin-bottom: 4px;\n }\n\n .selected-count {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n margin-top: 16px;\n text-align: center;\n }\n\n .dialog-actions {\n padding: 16px 24px;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n background: var(--jupiter-form-actions-background, #f8f9fa);\n }\n\n .dialog-actions button {\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .btn-primary {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--jupiter-primary-color-dark, #1565c0);\n }\n\n .btn-secondary {\n background: transparent;\n color: var(--jupiter-text-secondary, #666);\n border: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--jupiter-hover-background, #f5f5f5);\n }\n\n button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._initializeTempSelection();\n }\n\n updated(changedProperties: Map<string, any>) {\n if (changedProperties.has('selectedRoleIds') || changedProperties.has('open')) {\n this._initializeTempSelection();\n }\n if (changedProperties.has('availableRoles') || changedProperties.has('_searchQuery')) {\n this._updateFilteredRoles();\n }\n }\n\n private _updateFilteredRoles() {\n if (!this._searchQuery.trim()) {\n // Sort roles by title in ascending order\n this._filteredRoles = [...this.availableRoles].sort((a, b) => {\n return a.title.localeCompare(b.title);\n });\n return;\n }\n\n const query = this._searchQuery.toLowerCase().trim();\n const filtered = this.availableRoles.filter(role => {\n // Search in role title\n const titleMatch = role.title.toLowerCase().includes(query);\n \n // Search in role ID\n const idMatch = role.id.toLowerCase().includes(query);\n \n // Search in role description if available\n const descriptionMatch = role.description?.toLowerCase().includes(query) || false;\n \n // Search in roleURI if available (from metadata or if stored separately)\n // For now, we'll search in the title for URI-like patterns or check if role has URI-like structure\n const uriMatch = this._searchInRoleURI(role, query);\n \n return titleMatch || idMatch || descriptionMatch || uriMatch;\n });\n\n // Sort filtered results by title in ascending order\n this._filteredRoles = filtered.sort((a, b) => {\n return a.title.localeCompare(b.title);\n });\n }\n\n private _searchInRoleURI(role: FormSection, query: string): boolean {\n // If the role has metadata that contains roleURI\n if (role.metadata?.roleURI) {\n return role.metadata.roleURI.toLowerCase().includes(query);\n }\n \n // Look for URI patterns in title or ID\n const uriPattern = /https?:\\/\\/[^\\s]+/i;\n const titleHasURI = uriPattern.test(role.title);\n const idHasURI = uriPattern.test(role.id);\n \n if (titleHasURI || idHasURI) {\n return role.title.toLowerCase().includes(query) || role.id.toLowerCase().includes(query);\n }\n \n // If role ID follows URI-like pattern (contains dots, slashes, etc.)\n if (role.id.includes('.') || role.id.includes('/') || role.id.includes(':')) {\n return role.id.toLowerCase().includes(query);\n }\n \n return false;\n }\n\n private _handleSearchInput(event: Event) {\n const input = event.target as HTMLInputElement;\n this._searchQuery = input.value;\n }\n\n private _clearSearch() {\n this._searchQuery = '';\n const searchInput = this.shadowRoot?.querySelector('.search-input') as HTMLInputElement;\n if (searchInput) {\n searchInput.value = '';\n searchInput.focus();\n }\n }\n\n private _highlightSearchTerm(text: string): string {\n if (!this._searchQuery.trim()) {\n return text;\n }\n\n const query = this._searchQuery.trim();\n const regex = new RegExp(`(${query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})`, 'gi');\n return text.replace(regex, '<mark>$1</mark>');\n }\n\n private _renderHighlightedText(text: string) {\n // For compatibility, just return the text without highlighting for now\n return text;\n }\n\n private _getSelectedFilteredCount(): number {\n return this._filteredRoles.filter(role => this._tempSelectedRoles.has(role.id)).length;\n }\n\n private _initializeTempSelection() {\n this._tempSelectedRoles = new Set(this.selectedRoleIds);\n }\n\n private _handleCheckboxChange(event: Event, roleId: string) {\n const checkbox = event.target as HTMLInputElement;\n const newSelection = new Set(this._tempSelectedRoles);\n \n if (checkbox.checked) {\n newSelection.add(roleId);\n } else {\n newSelection.delete(roleId);\n }\n \n this._tempSelectedRoles = newSelection;\n this.requestUpdate();\n }\n\n private _selectAll() {\n // Select all currently filtered roles\n const newSelection = new Set(this._tempSelectedRoles);\n this._filteredRoles.forEach(role => newSelection.add(role.id));\n this._tempSelectedRoles = newSelection;\n this.requestUpdate();\n }\n\n private _selectNone() {\n // Deselect all currently filtered roles\n const newSelection = new Set(this._tempSelectedRoles);\n this._filteredRoles.forEach(role => newSelection.delete(role.id));\n this._tempSelectedRoles = newSelection;\n this.requestUpdate();\n }\n\n private _selectAllGlobal() {\n // Select all available roles (ignore filter)\n this._tempSelectedRoles = new Set(this.availableRoles.map(role => role.id));\n this.requestUpdate();\n }\n\n private _selectNoneGlobal() {\n // Deselect all roles (ignore filter)\n this._tempSelectedRoles = new Set();\n this.requestUpdate();\n }\n\n private _resetToOriginal() {\n this._tempSelectedRoles = new Set(this.selectedRoleIds);\n this.requestUpdate();\n }\n\n private _handleCancel() {\n this._initializeTempSelection();\n this.dispatchEvent(new CustomEvent('dialog-cancel', {\n bubbles: true\n }));\n }\n\n private _handleApply() {\n const selectedRoles = Array.from(this._tempSelectedRoles);\n this.dispatchEvent(new CustomEvent('roles-filter-apply', {\n detail: { selectedRoleIds: selectedRoles },\n bubbles: true\n }));\n }\n\n private _handleBackdropClick(event: Event) {\n if (event.target === this) {\n this._handleCancel();\n }\n }\n\n render() {\n const selectedCount = this._tempSelectedRoles.size;\n const totalCount = this.availableRoles.length;\n const filteredCount = this._filteredRoles.length;\n const hasSearchQuery = this._searchQuery.trim().length > 0;\n\n return html`\n <div class=\"dialog\" @click=\"${(e: Event) => e.stopPropagation()}\">\n <!-- Dialog Header -->\n <div class=\"dialog-header\">\n <svg class=\"filter-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"/>\n </svg>\n <h2 class=\"dialog-title\">Filter Roles</h2>\n <button class=\"close-button\" @click=\"${this._handleCancel}\">×</button>\n </div>\n\n <!-- Dialog Content -->\n <div class=\"dialog-content\">\n <p class=\"description\">\n Select the roles you want to display in the form. You can search and choose specific roles \n to focus on or manage all ${totalCount} available roles.\n </p>\n\n <!-- Search Input -->\n <div class=\"search-container\">\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search roles by name, ID, or URI...\"\n .value=\"${this._searchQuery}\"\n @input=\"${this._handleSearchInput}\"\n />\n ${this._searchQuery ? html`\n <button class=\"clear-search\" @click=\"${this._clearSearch}\" title=\"Clear search\">\n ×\n </button>\n ` : html`\n <svg class=\"search-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>\n </svg>\n `}\n </div>\n\n <!-- Search Results Info -->\n ${hasSearchQuery ? html`\n <div class=\"search-results-info\">\n Showing ${filteredCount} of ${totalCount} roles\n ${filteredCount !== totalCount ? html`matching \"${this._searchQuery}\"` : ''}\n </div>\n ` : ''}\n\n <!-- Selection Controls -->\n <div class=\"selection-controls\">\n ${hasSearchQuery ? html`\n <button class=\"selection-control\" @click=\"${this._selectAll}\">\n Select Filtered (${filteredCount})\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNone}\">\n Deselect Filtered\n </button>\n <button class=\"selection-control\" @click=\"${this._selectAllGlobal}\">\n Select All (${totalCount})\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNoneGlobal}\">\n Deselect All\n </button>\n ` : html`\n <button class=\"selection-control\" @click=\"${this._selectAll}\">\n Select All\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNone}\">\n Select None\n </button>\n `}\n <button class=\"selection-control\" @click=\"${this._resetToOriginal}\">\n Reset\n </button>\n </div>\n\n <!-- Roles List -->\n <div class=\"roles-list\">\n ${this._filteredRoles.length === 0 ? html`\n <div class=\"no-results\">\n ${hasSearchQuery ? html`\n No roles found matching \"${this._searchQuery}\".<br>\n Try a different search term or clear the search.\n ` : html`\n No roles available.\n `}\n </div>\n ` : html`\n ${this._filteredRoles.map(role => {\n const isSelected = this._tempSelectedRoles.has(role.id);\n return html`\n <div class=\"role-item\">\n <input\n type=\"checkbox\"\n class=\"role-checkbox\"\n .checked=\"${isSelected}\"\n @change=\"${(e: Event) => this._handleCheckboxChange(e, role.id)}\"\n />\n <div class=\"role-info\">\n <h4 class=\"role-title\">${role.title}</h4>\n ${role.metadata?.roleURI ? html`\n <p class=\"role-description\">URI: ${role.metadata.roleURI}</p>\n ` : ''}\n </div>\n </div>\n `;\n })}\n `}\n </div>\n\n <div class=\"selected-count\">\n ${selectedCount} of ${totalCount} roles selected\n ${hasSearchQuery && filteredCount !== totalCount ? html`\n <br><small>(${this._getSelectedFilteredCount()} of ${filteredCount} filtered roles selected)</small>\n ` : ''}\n </div>\n </div>\n\n <!-- Dialog Actions -->\n <div class=\"dialog-actions\">\n <button class=\"btn-secondary\" @click=\"${this._handleCancel}\">\n Cancel\n </button>\n <button \n class=\"btn-primary\" \n @click=\"${this._handleApply}\"\n ?disabled=\"${selectedCount === 0}\"\n >\n Apply Filter (${selectedCount})\n </button>\n </div>\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { \n XBRLFormSchema, \n FormData, \n FormColumn, \n ValidationError, \n FormState,\n ComponentConfig,\n ConceptTree,\n FormField,\n FieldType,\n SubmissionData,\n SubmissionEntry,\n FormSection\n} from '../schema/types';\nimport { XBRLFormInput } from '../schema/xbrl-types';\nimport { FormValidator } from '../utils/validation';\nimport { XBRLFormBuilder } from '../utils/xbrl-form-builder';\nimport { AddColumnRequest, AvailableDimension } from './add-column-dialog';\nimport './form-section';\nimport './filter-roles-dialog';\n\n@customElement('jupiter-dynamic-form')\nexport class JupiterDynamicForm extends LitElement {\n @property({ type: Object }) schema?: XBRLFormSchema;\n @property({ type: Object }) xbrlInput?: XBRLFormInput;\n @property({ type: Object }) config: ComponentConfig = {};\n @property({ type: Object }) initialData: FormData = {};\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean }) readonly = false;\n @property({ type: String }) periodStartDate = '2025-01-01';\n @property({ type: String }) periodEndDate = '2025-12-31';\n @property({ type: String }) language = 'en';\n\n @state() private _formData: FormData = {};\n @state() private _preservedFormData: FormData = {}; // Preserve data for hidden sections\n @state() private _typedMemberData: { [columnId: string]: { [axisId: string]: string } } = {};\n @state() private _preservedTypedMemberData: { [columnId: string]: { [axisId: string]: string } } = {}; // Preserve typed data for hidden sections\n @state() private _columns: FormColumn[] = [];\n @state() private _errors: ValidationError[] = [];\n @state() private _touched = new Set<string>();\n @state() private _dirty = false;\n @state() private _valid = true;\n @state() private _submitted = false;\n @state() private _currentSchema?: XBRLFormSchema;\n @state() private _allSections: FormSection[] = [];\n @state() private _selectedRoleIds: string[] = [];\n @state() private _showFilterDialog = false;\n\n static styles = css`\n :host {\n display: block;\n font-family: var(--jupiter-font-family, system-ui, -apple-system, sans-serif);\n color: var(--jupiter-text-primary, #333);\n background: var(--jupiter-background, #fff);\n }\n\n .form-container {\n width: 100%;\n max-width: var(--jupiter-max-width, none);\n margin: 0 auto;\n }\n\n .form-header {\n padding: 24px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n background: var(--jupiter-form-header-background, #fff);\n }\n\n .form-title {\n font-size: 24px;\n font-weight: 600;\n margin: 0 0 8px 0;\n color: var(--jupiter-text-primary, #333);\n }\n\n .form-description {\n font-size: 16px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0;\n line-height: 1.5;\n }\n\n .form-actions {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n padding: 16px 24px;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n background: var(--jupiter-form-actions-background, #f8f9fa);\n display: flex;\n gap: 12px;\n align-items: center;\n z-index: 1000;\n box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .form-sections {\n padding: 24px;\n padding-bottom: 100px; /* Add space for fixed footer */\n }\n\n .validation-summary {\n margin-bottom: 16px;\n padding: 16px;\n border-radius: 4px;\n background: var(--jupiter-error-background, #ffebee);\n border: 1px solid var(--jupiter-error-color, #d32f2f);\n }\n\n .validation-summary-title {\n font-weight: 600;\n color: var(--jupiter-error-color, #d32f2f);\n margin: 0 0 8px 0;\n }\n\n .validation-summary-list {\n margin: 0;\n padding-left: 20px;\n }\n\n .validation-summary-item {\n color: var(--jupiter-error-color, #d32f2f);\n margin-bottom: 4px;\n }\n\n .form-actions button {\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .btn-primary {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--jupiter-primary-color-dark, #1565c0);\n }\n\n .btn-secondary {\n background: var(--jupiter-secondary-color, #757575);\n color: white;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--jupiter-secondary-color-dark, #616161);\n }\n\n .btn-outline {\n background: transparent;\n color: var(--jupiter-primary-color, #1976d2);\n border: 1px solid var(--jupiter-primary-color, #1976d2);\n }\n\n .btn-outline:hover:not(:disabled) {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n }\n\n button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .form-meta {\n display: flex;\n gap: 16px;\n align-items: center;\n font-size: 12px;\n color: var(--jupiter-text-secondary, #666);\n margin-left: auto;\n }\n\n .filter-roles-button {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: transparent;\n border: 1px solid var(--jupiter-primary-color, #1976d2);\n color: var(--jupiter-primary-color, #1976d2);\n border-radius: 4px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n margin-right: auto;\n }\n\n .filter-roles-button:hover:not(:disabled) {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n }\n\n .filter-roles-button .filter-icon {\n width: 16px;\n height: 16px;\n fill: currentColor;\n }\n\n .roles-count {\n display: inline-flex;\n align-items: center;\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n padding: 2px 6px;\n margin-left: 4px;\n min-width: 18px;\n justify-content: center;\n }\n\n .no-roles-message {\n padding: 40px;\n text-align: center;\n color: var(--jupiter-text-secondary, #666);\n background: var(--jupiter-background-light, #f8f9fa);\n border-radius: 8px;\n margin: 20px 0;\n }\n\n .no-roles-message h3 {\n margin: 0 0 16px 0;\n color: var(--jupiter-text-primary, #333);\n }\n\n .no-roles-message p {\n margin: 8px 0;\n line-height: 1.5;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._initializeForm();\n }\n\n updated(changedProperties: Map<string, any>) {\n if (changedProperties.has('xbrlInput') || changedProperties.has('schema')) {\n this._initializeForm();\n } else if (changedProperties.has('language')) {\n // Language changed - rebuild schema with new language while preserving form data\n console.log('🌐 Language changed from', changedProperties.get('language'), 'to', this.language);\n this._handleLanguageChange();\n }\n }\n\n /**\n * Handle language change - rebuild schema with new language while preserving form data\n */\n private _handleLanguageChange() {\n if (!this.xbrlInput) {\n console.warn('⚠️ Cannot change language without XBRL input data');\n return;\n }\n\n try {\n // Preserve current form data and state\n const currentFormData = { ...this._formData };\n const currentPreservedData = { ...this._preservedFormData };\n const currentTypedMemberData = { ...this._typedMemberData };\n const currentPreservedTypedMemberData = { ...this._preservedTypedMemberData };\n const currentSelectedRoles = [...this._selectedRoleIds];\n\n console.log('💾 Preserving form data during language change:', currentFormData);\n\n // Rebuild schema with new language\n console.log('🔄 Rebuilding form schema with language:', this.language);\n this._currentSchema = XBRLFormBuilder.buildFormSchema(\n this.xbrlInput,\n this.periodStartDate,\n this.periodEndDate,\n this.language\n );\n\n // Update all sections\n this._allSections = [...this._currentSchema.sections];\n\n // Restore selected roles and apply filter\n this._selectedRoleIds = currentSelectedRoles;\n this._applyRoleFilter();\n\n // Restore all form data\n this._formData = currentFormData;\n this._preservedFormData = currentPreservedData;\n this._typedMemberData = currentTypedMemberData;\n this._preservedTypedMemberData = currentPreservedTypedMemberData;\n\n console.log('✅ Language changed successfully, form data preserved');\n \n // Trigger re-render\n this.requestUpdate();\n } catch (error) {\n console.error('❌ Error changing language:', error);\n }\n }\n\n private _initializeForm() {\n // Generate schema from XBRL input if provided, otherwise use provided schema\n if (this.xbrlInput) {\n try {\n console.log('🔄 Initializing form from XBRL input:', this.xbrlInput);\n console.log('📅 Using period dates:', this.periodStartDate, 'to', this.periodEndDate);\n console.log('🌐 Using language:', this.language);\n this._currentSchema = XBRLFormBuilder.buildFormSchema(\n this.xbrlInput, \n this.periodStartDate, \n this.periodEndDate,\n this.language\n );\n console.log('✅ Generated schema with sections:', this._currentSchema.sections.length);\n \n // Store all sections for filtering\n this._allSections = [...this._currentSchema.sections];\n \n // Initialize selected roles - always let user choose which roles to display\n if (this._selectedRoleIds.length === 0) {\n // Don't preselect any roles - let user choose\n this._selectedRoleIds = [];\n // Show dialog by default to let user choose\n this._showFilterDialog = true;\n // Immediately set empty sections for consistency\n this._currentSchema = {\n ...this._currentSchema,\n sections: []\n };\n }\n \n // Apply current role filter - this will show empty form if no roles selected\n this._applyRoleFilter();\n \n // Use simple column structure for now\n this._columns = [\n {\n id: 'base',\n title: 'Value',\n description: 'Base values for concepts',\n type: 'base',\n order: 0,\n removable: false\n }\n ];\n } catch (error) {\n console.error('❌ Error building form from XBRL input:', error);\n this._currentSchema = this._getDefaultSchema();\n this._allSections = [];\n this._selectedRoleIds = [];\n this._columns = this._getDefaultColumns();\n }\n } else if (this.schema) {\n this._currentSchema = this.schema;\n this._allSections = [...this.schema.sections];\n this._selectedRoleIds = this._allSections.map(section => section.id);\n this._columns = this._getDefaultColumns();\n } else {\n this._currentSchema = this._getDefaultSchema();\n this._allSections = [];\n this._selectedRoleIds = [];\n this._columns = this._getDefaultColumns();\n }\n\n // Initialize form data\n this._formData = { ...this.initialData };\n if (this.xbrlInput?.initialData) {\n this._formData = { ...this._formData, ...this.xbrlInput.initialData };\n }\n \n // Validate initial data\n this._validateForm();\n }\n\n private _getDefaultSchema(): XBRLFormSchema {\n return {\n version: '1.0',\n formId: 'default-form',\n title: 'Dynamic Form',\n description: 'Please provide form schema or XBRL input data',\n sections: []\n };\n }\n\n private _getDefaultColumns(): FormColumn[] {\n return [\n {\n id: 'base',\n title: 'Value',\n description: 'Base values for concepts',\n type: 'base',\n order: 0,\n removable: false\n }\n ];\n }\n\n private _applyRoleFilter() {\n if (!this._currentSchema || !this._allSections.length) return;\n \n console.log(`🔍 Applying role filter: ${this._selectedRoleIds.length} selected out of ${this._allSections.length} total`);\n \n // If no roles are selected, show empty form (user needs to select roles)\n if (this._selectedRoleIds.length === 0) {\n console.log(`📝 No roles selected - showing empty form`);\n this._currentSchema = {\n ...this._currentSchema,\n sections: []\n };\n return;\n }\n \n // Before filtering, preserve data from sections that will be hidden\n this._preserveDataForHiddenSections();\n \n // Filter sections based on selected role IDs\n const filteredSections = this._allSections.filter(section => \n this._selectedRoleIds.includes(section.id)\n );\n \n // Restore data for sections that are now being shown\n this._restoreDataForVisibleSections(filteredSections);\n \n // Update current schema with filtered sections\n this._currentSchema = {\n ...this._currentSchema,\n sections: filteredSections\n };\n }\n\n private _preserveDataForHiddenSections() {\n // Get currently visible section IDs\n const currentlyVisibleSectionIds = this._currentSchema?.sections.map(s => s.id) || [];\n \n // Find sections that will be hidden after filter is applied\n const sectionsThatWillBeHidden = currentlyVisibleSectionIds.filter(\n sectionId => !this._selectedRoleIds.includes(sectionId)\n );\n \n // Preserve form data for concepts in hidden sections\n sectionsThatWillBeHidden.forEach(sectionId => {\n const section = this._allSections.find(s => s.id === sectionId);\n if (section) {\n this._preserveSectionData(section);\n }\n });\n \n console.log(`📦 Preserved data for ${sectionsThatWillBeHidden.length} hidden sections:`, sectionsThatWillBeHidden);\n }\n\n private _restoreDataForVisibleSections(visibleSections: FormSection[]) {\n // Restore data for sections that are now being shown\n visibleSections.forEach(section => {\n this._restoreSectionData(section);\n });\n \n console.log(`🔄 Restored data for ${visibleSections.length} visible sections`);\n }\n\n private _preserveSectionData(section: FormSection) {\n // Preserve form data for all concepts in this section\n section.concepts.forEach(concept => {\n this._preserveConceptData(concept);\n });\n }\n\n private _preserveConceptData(concept: ConceptTree) {\n // Preserve data for this concept\n if (this._formData[concept.id]) {\n this._preservedFormData[concept.id] = { ...this._formData[concept.id] };\n console.log(`💾 Preserved form data for concept: ${concept.id}`);\n }\n \n // Preserve typed member data for columns related to this concept\n concept.fields.forEach(field => {\n if (this._typedMemberData[field.columnId]) {\n this._preservedTypedMemberData[field.columnId] = { ...this._typedMemberData[field.columnId] };\n console.log(`💾 Preserved typed data for column: ${field.columnId}`);\n }\n });\n \n // Recursively preserve data for child concepts\n if (concept.children) {\n concept.children.forEach(child => {\n this._preserveConceptData(child);\n });\n }\n }\n\n private _restoreSectionData(section: FormSection) {\n // Restore form data for all concepts in this section\n section.concepts.forEach(concept => {\n this._restoreConceptData(concept);\n });\n }\n\n private _restoreConceptData(concept: ConceptTree) {\n // Restore data for this concept if it was preserved\n if (this._preservedFormData[concept.id]) {\n this._formData[concept.id] = { ...this._preservedFormData[concept.id] };\n console.log(`🔄 Restored form data for concept: ${concept.id}`);\n }\n \n // Restore typed member data for columns related to this concept\n concept.fields.forEach(field => {\n if (this._preservedTypedMemberData[field.columnId]) {\n this._typedMemberData[field.columnId] = { ...this._preservedTypedMemberData[field.columnId] };\n console.log(`🔄 Restored typed data for column: ${field.columnId}`);\n }\n });\n \n // Recursively restore data for child concepts\n if (concept.children) {\n concept.children.forEach(child => {\n this._restoreConceptData(child);\n });\n }\n }\n\n private _shouldShowFilterButton(): boolean {\n return true; // Always show filter button to allow role selection\n }\n\n private _handleFilterRolesClick() {\n this._showFilterDialog = true;\n }\n\n private _handleFilterDialogCancel() {\n this._showFilterDialog = false;\n \n // If no roles were previously selected (first time opening), \n // and user cancels, keep empty selection for consistency\n console.log(`🚫 Filter dialog cancelled. Current selection: ${this._selectedRoleIds.length}/${this._allSections.length}`);\n }\n\n private _handleRoleFilterApply(event: CustomEvent) {\n const { selectedRoleIds } = event.detail;\n this._selectedRoleIds = selectedRoleIds;\n this._applyRoleFilter();\n this._showFilterDialog = false;\n \n console.log(`🎯 Applied role filter: ${selectedRoleIds.length}/${this._allSections.length} roles selected`);\n \n // Dispatch event for external listeners\n this.dispatchEvent(new CustomEvent('roles-filter-changed', {\n detail: { \n selectedRoleIds, \n totalRoles: this._allSections.length,\n visibleRoles: selectedRoleIds.length\n },\n bubbles: true\n }));\n }\n\n private _validateForm() {\n const errors: ValidationError[] = [];\n \n // Use current schema for validation\n const schema = this._currentSchema;\n if (!schema) return;\n \n // Validate each section and its concepts\n for (const section of schema.sections) {\n for (const concept of section.concepts) {\n for (const field of concept.fields) {\n const value = this._formData[concept.id]?.[field.columnId];\n const fieldErrors = FormValidator.validateField(\n field.id,\n concept.id,\n field.columnId,\n value,\n field.type,\n field.validation || []\n );\n errors.push(...fieldErrors);\n }\n }\n }\n\n this._errors = errors;\n this._valid = errors.filter(e => e.severity === 'error').length === 0;\n }\n\n private _handleFieldChange(event: CustomEvent) {\n const { fieldId, conceptId, columnId, value } = event.detail;\n \n // Update form data with proper immutable update to trigger Lit reactivity\n const updatedFormData = { ...this._formData };\n if (!updatedFormData[conceptId]) {\n updatedFormData[conceptId] = {};\n }\n const oldValue = updatedFormData[conceptId][columnId];\n updatedFormData[conceptId] = { ...updatedFormData[conceptId], [columnId]: value };\n this._formData = updatedFormData;\n \n // Mark as touched and dirty\n this._touched.add(`${conceptId}-${columnId}`);\n this._dirty = true;\n \n // Re-validate\n this._validateForm();\n \n // Trigger update (should be automatic with the new object reference)\n this.requestUpdate();\n \n // Dispatch change event\n this.dispatchEvent(new CustomEvent('field-change', {\n detail: { fieldId, conceptId, columnId, value, oldValue },\n bubbles: true\n }));\n }\n\n /**\n * Generate a unique concept key that includes section context\n */\n private _generateUniqueConceptKey(sectionId: string, conceptId: string): string {\n return `${sectionId}::${conceptId}`;\n }\n\n /**\n * Extract the original concept ID from a unique concept key\n */\n private _extractOriginalConceptId(uniqueConceptKey: string): string {\n const parts = uniqueConceptKey.split('::');\n return parts.length > 1 ? parts[1] : uniqueConceptKey;\n }\n\n private _handleTypedMemberChange(event: CustomEvent) {\n const { columnId, axisId, value } = event.detail;\n \n console.log(`🔍 [DynamicForm] Typed member change: columnId=${columnId}, axisId=${axisId}, value=${value}`);\n \n // Update typed member data with immutable update\n const updatedTypedMemberData = { ...this._typedMemberData };\n if (!updatedTypedMemberData[columnId]) {\n updatedTypedMemberData[columnId] = {};\n }\n updatedTypedMemberData[columnId] = { ...updatedTypedMemberData[columnId], [axisId]: value };\n this._typedMemberData = updatedTypedMemberData;\n \n // Mark as dirty\n this._dirty = true;\n \n // Trigger update\n this.requestUpdate();\n \n // Dispatch change event\n this.dispatchEvent(new CustomEvent('typed-member-change', {\n detail: { columnId, axisId, value },\n bubbles: true\n }));\n }\n\n private _handleSectionExpand(event: CustomEvent) {\n this.dispatchEvent(new CustomEvent('section-expand', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _handleConceptExpand(event: CustomEvent) {\n this.dispatchEvent(new CustomEvent('concept-expand', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _handleColumnRemove(event: CustomEvent) {\n const { columnId, sectionId } = event.detail;\n \n // Remove column from ONLY the specific section\n if (this._currentSchema && sectionId) {\n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection && targetSection.columns) {\n targetSection.columns = targetSection.columns.filter(col => col.id !== columnId);\n }\n } else {\n // Fallback: remove from all sections (for backward compatibility)\n this._columns = this._columns.filter(col => col.id !== columnId);\n \n if (this._currentSchema) {\n this._currentSchema.sections.forEach(section => {\n if (section.columns) {\n section.columns = section.columns.filter(col => col.id !== columnId);\n }\n });\n }\n }\n \n // Remove data for this column from the specific section's concepts\n this._removeColumnData(columnId, sectionId);\n \n this._dirty = true;\n this._validateForm();\n this.requestUpdate();\n \n this.dispatchEvent(new CustomEvent('column-remove', {\n detail: { columnId, sectionId },\n bubbles: true\n }));\n }\n\n private _handleColumnAddRequest(event: CustomEvent) {\n const { sectionId, columnRequest } = event.detail;\n this._addColumnFromRequest(columnRequest, sectionId);\n }\n\n private _getAvailableDimensionsForSection(sectionId: string): AvailableDimension[] {\n console.log(`🔍 Getting dimensions for section: ${sectionId}`);\n \n if (!this.xbrlInput?.hypercubes?.[0]) {\n console.log('❌ No hypercubes data available');\n return [];\n }\n\n //console.log(`📊 Available hypercube roles:`, this.xbrlInput.hypercubes[0].roles.map(r => r.roleId));\n \n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === sectionId);\n \n if (!hypercubeRole?.items?.length) {\n console.log(`❌ No hypercube items found for role: ${sectionId}`);\n return [];\n }\n\n console.log(`✅ Found hypercube role with ${hypercubeRole.items.length} items`);\n \n const availableDimensions: AvailableDimension[] = [];\n\n // Process all hypercube items to find unique dimensions\n hypercubeRole.items.forEach(item => {\n if (item.dimensions && item.dimensions.length > 0) {\n item.dimensions.forEach(dimension => {\n // Check if we already have this dimension\n if (!availableDimensions.find(d => d.id === dimension.id)) {\n const axisLabel = dimension.labels.find(l => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n \n const availableDimension: AvailableDimension = {\n id: dimension.id,\n conceptName: dimension.conceptName,\n axisLabel: axisLabel\n };\n\n // Add members if available\n if (dimension.members && dimension.members.length > 0) {\n availableDimension.members = dimension.members.map(member => ({\n id: member.id,\n label: member.labels?.find(l => l.role === 'http://www.xbrl.org/2003/role/label')?.label || member.conceptName || member.id\n }));\n }\n\n // Add typed member if available\n if (dimension.typedMember) {\n availableDimension.typedMember = {\n id: dimension.typedMember.id,\n dataType: 'string' // Default to string for now\n };\n }\n\n availableDimensions.push(availableDimension);\n }\n });\n }\n });\n\n console.log(`📈 Found ${availableDimensions.length} dimensions for section ${sectionId}:`, availableDimensions.map(d => d.axisLabel));\n return availableDimensions;\n }\n\n private _addColumnFromRequest(request: AddColumnRequest, sectionId: string) {\n const timestamp = Date.now();\n const newColumnId = `col-${timestamp}`;\n \n let title = '';\n let description = '';\n \n if (request.periodType === 'instant') {\n title = 'Current';\n description = `Values as of ${request.instantDate}`;\n } else if (request.periodType === 'duration' || request.periodType === 'mixed') {\n title = 'Current Period';\n description = `Period: ${request.startDate} to ${request.endDate}`;\n }\n \n // Process selected dimensions from the dialog\n let dimensionData: any = {\n dimensionId: 'period',\n memberValue: request.periodType === 'instant' ? \n `instant-${request.instantDate}` : \n `duration-${request.startDate}-${request.endDate}`,\n memberLabel: title,\n };\n \n // If dimensions were selected in the dialog, use them\n if (request.selectedDimensions && request.selectedDimensions.length > 0) {\n const dimensionParts: string[] = [];\n const dimensionKeys: string[] = [];\n \n for (const dimSelection of request.selectedDimensions) {\n if (dimSelection.isTyped && dimSelection.typedValue) {\n // Typed dimension\n dimensionParts.push(`${dimSelection.axisLabel}: ${dimSelection.typedValue}`);\n dimensionKeys.push(`${dimSelection.axisId}|${dimSelection.typedValue}`);\n } else if (dimSelection.memberId && dimSelection.memberLabel) {\n // Domain dimension with selected member\n dimensionParts.push(dimSelection.memberLabel);\n dimensionKeys.push(`${dimSelection.axisId}|${dimSelection.memberId}`);\n }\n }\n \n // Build combined title with dimensions\n const periodPart = request.periodType === 'instant' ? \n `(${request.instantDate})` : \n `(${request.startDate} / ${request.endDate})`;\n \n if (dimensionParts.length > 0) {\n title = `${dimensionParts.join(' | ')} ${periodPart}`;\n \n dimensionData = {\n dimensionId: newColumnId,\n memberValue: dimensionParts.join(' | '),\n memberLabel: dimensionParts.join(' | '),\n memberKey: dimensionParts.join(' | '),\n dimensionIdKey: dimensionKeys.join('::'),\n selectedDimensions: request.selectedDimensions\n };\n \n console.log(`📊 Applied selected dimensions to new column: ${dimensionData.memberKey}`);\n }\n } else {\n // Fallback to existing hypercube logic for backwards compatibility\n if (this.xbrlInput?.hypercubes?.[0]) {\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === sectionId);\n \n if (hypercubeRole?.items?.length === 1) {\n const item = hypercubeRole.items[0];\n if (item.dimensions.length === 1) {\n const dimension = item.dimensions[0];\n if (dimension.members && dimension.members.length > 0) {\n // Find axis label\n const axisLabel = dimension.labels.find(l => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n \n // For manually added columns, we could offer choice or use first member\n // For now, using first member as specified in requirements\n const firstMember = dimension.members[0];\n const memberLabel = firstMember.labels.find(l => l.role === 'http://www.xbrl.org/2003/role/label')?.label || firstMember.conceptName;\n \n // Update title to include dimension information\n const periodPart = request.periodType === 'instant' ? \n `(${request.instantDate})` : \n `(${request.startDate} / ${request.endDate})`;\n title = `${memberLabel} ${periodPart}`;\n \n dimensionData = {\n dimensionId: newColumnId,\n axisId: dimension.id,\n memberId: firstMember.id,\n memberValue: memberLabel,\n memberLabel: memberLabel,\n axis: axisLabel,\n axisLabel: axisLabel,\n memberKey: `${axisLabel} | ${memberLabel}`,\n dimensionIdKey: `${dimension.id} | ${firstMember.id}`\n };\n \n console.log(`📊 Applied hypercube dimension to new column: ${dimensionData.memberKey}`);\n }\n }\n }\n }\n }\n \n const newColumn: FormColumn = {\n id: newColumnId,\n title,\n description,\n type: dimensionData.memberKey ? 'dimension' : 'dimension',\n order: this._columns.length,\n removable: true,\n dimensionData\n };\n\n // Store typed member data for the new column if typed dimensions were selected\n if (request.selectedDimensions && request.selectedDimensions.length > 0) {\n const typedMembers: { [axisId: string]: string } = {};\n let hasTypedDimensions = false;\n \n for (const dimSelection of request.selectedDimensions) {\n if (dimSelection.isTyped) {\n // Initialize typed member data with provided value or empty string\n typedMembers[dimSelection.axisId] = dimSelection.typedValue || '';\n hasTypedDimensions = true;\n console.log(`💾 Initializing typed member data: ${dimSelection.axisLabel} = \"${dimSelection.typedValue || '(empty - will be entered in column header)'}\"`);\n }\n }\n \n if (hasTypedDimensions) {\n this._typedMemberData[newColumnId] = typedMembers;\n // Update dimension data to indicate it has typed members and include the typed member info\n if (newColumn.dimensionData) {\n newColumn.dimensionData.hasTypedMembers = true;\n // Create typedMembers array for the form-section template\n newColumn.dimensionData.typedMembers = request.selectedDimensions\n .filter(dim => dim.isTyped)\n .map(dim => ({\n axisId: dim.axisId,\n axisLabel: dim.axisLabel,\n typedMemberId: dim.axisId, // Use axisId as typedMemberId for typed dimensions\n memberLabel: dim.axisLabel // Use axisLabel as memberLabel\n }));\n console.log(`� Added typed members to column dimension data:`, newColumn.dimensionData.typedMembers);\n }\n console.log(`� Initialized typed member data for column ${newColumnId}:`, typedMembers);\n }\n }\n \n // Add column ONLY to the specific section that requested it\n if (this._currentSchema) {\n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection) {\n if (!targetSection.columns) {\n targetSection.columns = [...this._columns];\n }\n targetSection.columns = [...targetSection.columns, newColumn];\n }\n }\n \n // Replicate form fields for existing concepts in ONLY the target section\n this._replicateFieldsForNewColumn(newColumnId, request, sectionId);\n \n this._dirty = true;\n this.requestUpdate();\n \n this.dispatchEvent(new CustomEvent('column-add', {\n detail: { column: newColumn },\n bubbles: true\n }));\n }\n\n private _removeColumnData(columnId: string, sectionId?: string) {\n if (!this._currentSchema) return;\n \n if (sectionId) {\n // Remove data only for concepts in the specific section\n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection) {\n this._removeColumnDataFromConcepts(targetSection.concepts, columnId);\n }\n } else {\n // Remove data for all concepts in all sections\n for (const conceptId in this._formData) {\n if (this._formData[conceptId][columnId] !== undefined) {\n delete this._formData[conceptId][columnId];\n }\n }\n }\n }\n\n private _removeColumnDataFromConcepts(concepts: ConceptTree[], columnId: string) {\n concepts.forEach(concept => {\n // Remove form data for this concept and column\n if (this._formData[concept.id] && this._formData[concept.id][columnId] !== undefined) {\n delete this._formData[concept.id][columnId];\n }\n \n // Remove field from concept's fields array\n if (concept.fields) {\n concept.fields = concept.fields.filter(field => field.columnId !== columnId);\n }\n \n // Recursively process children\n if (concept.children) {\n this._removeColumnDataFromConcepts(concept.children, columnId);\n }\n });\n }\n\n private _shouldCreateFieldForConcept(concept: ConceptTree, request: AddColumnRequest): boolean {\n // Don't create fields for abstract concepts\n if (concept.abstract) {\n return false;\n }\n \n // Check period type compatibility\n if (concept.periodType) {\n if (request.periodType === 'instant' && concept.periodType !== 'instant') {\n return false;\n }\n if (request.periodType === 'duration' && concept.periodType !== 'duration') {\n return false;\n }\n }\n \n return true;\n }\n\n private _replicateFieldsForNewColumn(columnId: string, request: AddColumnRequest, sectionId: string) {\n if (!this._currentSchema) return;\n \n // Build fields for the new column for ONLY the specific section\n const formBuilder = new XBRLFormBuilder();\n \n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection) {\n this._replicateFieldsForSection(targetSection.concepts, columnId, request, formBuilder);\n }\n }\n\n private _replicateFieldsForSection(concepts: ConceptTree[], columnId: string, request: AddColumnRequest, formBuilder: XBRLFormBuilder) {\n concepts.forEach(concept => {\n // Check if we should create a field for this concept in the new column\n if (this._shouldCreateFieldForConcept(concept, request)) {\n // Create a new field manually based on existing field structure or from scratch\n const existingField = concept.fields?.[0]; // Use first existing field as template\n \n let field: FormField;\n if (existingField) {\n // Template from existing field\n field = {\n id: `${concept.id}_${columnId}`,\n conceptId: concept.id,\n columnId: columnId,\n type: existingField.type,\n label: existingField.label,\n placeholder: existingField.placeholder,\n required: existingField.required,\n disabled: existingField.disabled,\n validation: existingField.validation,\n defaultValue: existingField.defaultValue,\n // Set period dates from the add column request\n periodStartDate: request.periodType === 'instant' ? request.instantDate : request.startDate,\n periodEndDate: request.periodType === 'instant' ? request.instantDate : request.endDate\n };\n } else {\n // Create field from scratch for concepts without existing fields\n field = {\n id: `${concept.id}_${columnId}`,\n conceptId: concept.id,\n columnId: columnId,\n type: 'text' as FieldType,\n label: concept.label || concept.name,\n placeholder: `Enter ${concept.name}`,\n required: false,\n disabled: false,\n validation: [],\n defaultValue: '',\n // Set period dates from the add column request\n periodStartDate: request.periodType === 'instant' ? request.instantDate : request.startDate,\n periodEndDate: request.periodType === 'instant' ? request.instantDate : request.endDate\n };\n }\n \n // Add field to concept's fields array\n if (!concept.fields) {\n concept.fields = [];\n }\n concept.fields.push(field);\n }\n \n // Recursively process children\n if (concept.children) {\n this._replicateFieldsForSection(concept.children, columnId, request, formBuilder);\n }\n });\n }\n\n private _addColumn() {\n // This would typically open a dialog to configure the new dimension column\n // For now, we'll add a generic dimension column\n const newColumnId = `dim-${Date.now()}`;\n const newColumn: FormColumn = {\n id: newColumnId,\n title: `Dimension ${this._columns.length}`,\n description: 'Additional dimension column',\n type: 'dimension',\n order: this._columns.length,\n removable: true,\n dimensionData: {\n dimensionId: 'custom',\n memberValue: 'default',\n memberLabel: 'Default Member',\n }\n };\n \n this._columns = [...this._columns, newColumn];\n this.requestUpdate();\n \n this.dispatchEvent(new CustomEvent('column-add', {\n detail: { column: newColumn },\n bubbles: true\n }));\n }\n\n private _handleSubmit() {\n console.log('📝 Form submission started...');\n this._submitted = true;\n this._validateForm();\n \n // Generate submission data in the required format\n const submissionData = this._generateSubmissionData();\n \n // Log final submission data for debugging\n console.log('📊 Form Submission Data:', JSON.stringify(submissionData, null, 2));\n \n this.dispatchEvent(new CustomEvent('form-submit', {\n detail: {\n data: this._formData,\n submissionData: submissionData,\n valid: this._valid,\n errors: this._errors\n },\n bubbles: true\n }));\n \n console.log('✅ Form submit event dispatched');\n }\n\n private _handleSaveDraft() {\n // Generate draft data in the same format as submission\n const draftData = this._generateSubmissionData();\n \n this.dispatchEvent(new CustomEvent('form-save-draft', {\n detail: {\n data: this._formData,\n draftData: draftData,\n valid: this._valid,\n errors: this._errors\n },\n bubbles: true\n }));\n }\n\n private _generateSubmissionData(): SubmissionData {\n const submissionData: SubmissionData = [];\n \n if (!this._currentSchema) {\n return submissionData;\n }\n\n // Include data from currently visible sections\n this._currentSchema.sections.forEach(section => {\n this._processConceptsForSubmission(section.concepts, submissionData, section);\n });\n\n // IMPORTANT: Also include data from preserved (hidden) sections\n this._includePreservedDataInSubmission(submissionData);\n\n // Remove duplicates from submission data\n const uniqueSubmissionData = this._removeDuplicateSubmissions(submissionData);\n \n return uniqueSubmissionData;\n }\n\n private _includePreservedDataInSubmission(submissionData: SubmissionData) {\n // Process preserved form data\n Object.keys(this._preservedFormData).forEach(conceptId => {\n const conceptData = this._preservedFormData[conceptId];\n if (conceptData) {\n Object.keys(conceptData).forEach(columnId => {\n const value = conceptData[columnId];\n if (value !== undefined && value !== null && value !== '') {\n // Find the original concept from all sections to get proper submission data\n const originalConcept = this._findConceptInAllSections(conceptId);\n if (originalConcept) {\n const originalSection = this._findSectionForConcept(conceptId);\n this._addConceptDataToSubmission(originalConcept, columnId, value, submissionData, originalSection || undefined);\n }\n }\n });\n }\n });\n\n console.log(`📤 Included preserved data in submission. Total entries: ${submissionData.length}`);\n }\n\n private _findConceptInAllSections(conceptId: string): ConceptTree | null {\n for (const section of this._allSections) {\n const concept = this._findConceptInSection(section.concepts, conceptId);\n if (concept) {\n return concept;\n }\n }\n return null;\n }\n\n private _findConceptInSection(concepts: ConceptTree[], conceptId: string): ConceptTree | null {\n for (const concept of concepts) {\n if (concept.id === conceptId) {\n return concept;\n }\n if (concept.children) {\n const found = this._findConceptInSection(concept.children, conceptId);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n\n private _findSectionForConcept(conceptId: string): FormSection | null {\n for (const section of this._allSections) {\n const concept = this._findConceptInSection(section.concepts, conceptId);\n if (concept) {\n return section;\n }\n }\n return null;\n }\n\n private _addConceptDataToSubmission(concept: ConceptTree, columnId: string, value: any, submissionData: SubmissionData, section?: FormSection) {\n // Find the matching field for this column\n const field = concept.fields.find(f => f.columnId === columnId);\n if (!field) return;\n\n // Determine period type for submission\n const isInstant = concept.periodType === 'instant';\n \n const entry: SubmissionEntry = {\n conceptId: concept.originalConceptId || concept.id,\n value: value,\n period: {\n type: concept.periodType || 'duration',\n ...(isInstant \n ? { date: field.periodStartDate || this.periodStartDate }\n : { \n startDate: field.periodStartDate || this.periodStartDate,\n endDate: field.periodEndDate || this.periodEndDate\n })\n }\n };\n\n // Add dimension information if available\n const column = this._findColumnByIdInAllSections(columnId);\n if (column?.dimensionData?.memberLabel) {\n entry.dimension = column.dimensionData.memberLabel;\n }\n\n submissionData.push(entry);\n }\n\n private _findColumnByIdInAllSections(columnId: string): FormColumn | undefined {\n for (const section of this._allSections) {\n if (section.columns) {\n const column = section.columns.find(col => col.id === columnId);\n if (column) {\n return column;\n }\n }\n }\n return undefined;\n }\n\n private _removeDuplicateSubmissions(submissionData: SubmissionData): SubmissionData {\n const uniqueEntries = new Map<string, any>();\n \n submissionData.forEach(entry => {\n // Create a unique key based on concept ID, value, and dimension\n const key = `${entry.conceptId}_${entry.value}_${entry.dimension || 'no-dimension'}`;\n \n // Only keep the first occurrence of each unique entry\n if (!uniqueEntries.has(key)) {\n uniqueEntries.set(key, entry);\n }\n });\n \n return Array.from(uniqueEntries.values());\n }\n\n private _findColumnById(columnId: string): FormColumn | undefined {\n if (!this._currentSchema) {\n return undefined;\n }\n\n for (const section of this._currentSchema.sections) {\n if (section.columns) {\n const column = section.columns.find(col => col.id === columnId);\n if (column) {\n return column;\n }\n }\n }\n return undefined;\n }\n\n private _findColumnByIdInSection(columnId: string, section?: FormSection): FormColumn | undefined {\n if (!section?.columns) {\n return undefined;\n }\n\n return section.columns.find(col => col.id === columnId);\n }\n\n private _getTypedMemberNameForAxis(axisId: string, section?: FormSection): string | null {\n // Look for the typed member name in the hypercube data\n if (!this.xbrlInput?.hypercubes?.[0]) {\n return null;\n }\n\n const sectionRoleId = section?.id;\n if (!sectionRoleId) {\n return null;\n }\n\n // Find the role in hypercubes\n const hypercube = this.xbrlInput.hypercubes[0];\n const role = hypercube.roles?.find((r: any) => r.roleId === sectionRoleId);\n if (!role?.items) {\n return null;\n }\n\n // Search through all items for dimensions matching the axis\n for (const item of role.items) {\n if (item.dimensions) {\n const dimension = item.dimensions.find((d: any) => d.id === axisId);\n if (dimension?.typedMember?.id) {\n return dimension.typedMember.id;\n }\n }\n }\n\n return null;\n }\n\n private _doesConceptApplyToTypedDimension(concept: ConceptTree, section?: FormSection, columnId?: string): boolean {\n // Check if this concept is part of a hypercube that has typed dimensions\n if (!this.xbrlInput?.hypercubes?.[0]) {\n return false;\n }\n\n const sectionRoleId = section?.id;\n if (!sectionRoleId) {\n return false;\n }\n\n // Find the hypercube role that matches this section\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === sectionRoleId);\n if (!hypercubeRole?.items?.length) {\n return false;\n }\n\n // Check if any hypercube item contains this concept and has typed dimensions\n for (const item of hypercubeRole.items) {\n // Check if this concept is in the conceptIds list for this hypercube item\n const conceptIdToCheck = concept.originalConceptId || concept.id;\n if (item.conceptIds && item.conceptIds.includes(conceptIdToCheck)) {\n // Check if this hypercube item has typed dimensions\n const hasTypedDimensions = item.dimensions.some(dim => dim.typedMember);\n console.log(`🔍 [DynamicForm] Concept ${conceptIdToCheck} found in hypercube item. Has typed dimensions:`, hasTypedDimensions);\n return hasTypedDimensions;\n }\n }\n\n console.log(`🔍 [DynamicForm] Concept ${concept.originalConceptId || concept.id} not found in any hypercube items for role ${sectionRoleId}`);\n return false;\n }\n\n /**\n * Get the specific typed dimensions that apply to a concept in its role\n */\n private _getApplicableTypedDimensions(concept: ConceptTree, section?: FormSection): string[] {\n if (!this.xbrlInput?.hypercubes?.[0] || !section?.id) {\n return [];\n }\n\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === section.id);\n if (!hypercubeRole?.items?.length) {\n return [];\n }\n\n const conceptIdToCheck = concept.originalConceptId || concept.id;\n \n // Find the hypercube item that contains this concept\n for (const item of hypercubeRole.items) {\n if (item.conceptIds && item.conceptIds.includes(conceptIdToCheck)) {\n // Return the IDs of typed dimensions in this hypercube item\n const typedDimensions = item.dimensions\n .filter(dim => dim.typedMember)\n .map(dim => dim.id);\n \n console.log(`🔍 [DynamicForm] Found applicable typed dimensions for concept ${conceptIdToCheck}:`, typedDimensions);\n return typedDimensions;\n }\n }\n\n return [];\n }\n\n private _processConceptsForSubmission(concepts: ConceptTree[], submissionData: SubmissionData, section?: FormSection) {\n const targetRole = \"Toelichting op de geconsolideerde jaarrekening - Financiële vaste activa: Deelnemingen: Volledig geconsolideerd: Specificatie\";\n const sectionTitle = section?.title || 'Unknown';\n \n concepts.forEach(concept => {\n // Enhanced debug logging for target role\n if (sectionTitle === targetRole) {\n console.warn(`[DUPLICATE DEBUG] Processing concept ${concept.originalConceptId || concept.id} in target role`);\n if (concept.fields) {\n console.warn(`[DUPLICATE DEBUG] Concept has ${concept.fields.length} fields`);\n concept.fields.forEach((field, index) => {\n console.warn(`[DUPLICATE DEBUG] Field ${index}: columnId=${field.columnId}, current value=${this._formData[concept.id]?.[field.columnId]}`);\n });\n }\n }\n \n // Debug log for any concept with multiple fields\n if (concept.fields && concept.fields.length > 1) {\n console.log(`🔍 [DEBUG] Processing concept ${concept.originalConceptId}, fields count: ${concept.fields.length}`);\n concept.fields.forEach((field, index) => {\n console.log(` Field ${index}: columnId=${field.columnId}, value=${this._formData[concept.id]?.[field.columnId]}`);\n });\n }\n \n // Process fields for this concept\n if (concept.fields && concept.fields.length > 0) {\n concept.fields.forEach(field => {\n // Get the value from the nested form data structure\n const conceptData = this._formData[concept.id];\n const fieldValue = conceptData?.[field.columnId];\n \n // Only include fields that have values\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n // Log submission entry creation for target role\n if (sectionTitle === targetRole) {\n console.warn(`[DUPLICATE DEBUG] Creating submission entry for concept ${concept.originalConceptId || concept.id}, field columnId=${field.columnId}, value=${fieldValue}`);\n }\n \n // Find the column information from the SPECIFIC section to check for dimension data\n const column = this._findColumnByIdInSection(field.columnId, section);\n console.log(`🔍 [DynamicForm] Processing field for concept ${concept.originalConceptId || concept.id}, field columnId: ${field.columnId}, found column in section ${section?.id}: ${!!column}, column title: ${column?.title}`);\n \n const submissionEntry: any = {\n conceptId: concept.id,\n value: fieldValue,\n period: {\n type: concept.periodType || 'duration'\n } as { type: 'instant' | 'duration'; date?: string; startDate?: string; endDate?: string; }\n };\n\n // Determine period structure based on concept's period type\n if (concept.periodType === 'instant') {\n // For instant concepts, use a single date\n submissionEntry.period.date = field.periodStartDate || this.periodStartDate;\n } else {\n // For duration concepts, use start and end dates\n submissionEntry.period.startDate = field.periodStartDate || this.periodStartDate;\n submissionEntry.period.endDate = field.periodEndDate || this.periodEndDate;\n }\n\n // Add dimension information\n // Only use dimension data from the specific column that this field is linked to\n if (column?.type === 'dimension' && column.dimensionData?.dimensionIdKey) {\n submissionEntry.dimension = column.dimensionData.dimensionIdKey;\n console.log(`🔍 [DynamicForm] Using dimension key from field's column (${field.columnId}):`, column.dimensionData.dimensionIdKey);\n } else {\n console.log(`🔍 [DynamicForm] No dimension data found for field column ${field.columnId}. Column type: ${column?.type}, has dimensionData: ${!!column?.dimensionData}`);\n }\n\n // Add typed member values if they exist for this column AND the concept is part of the hypercube\n if (this._typedMemberData[field.columnId]) {\n const applicableTypedDimensions = this._getApplicableTypedDimensions(concept, section);\n console.log(`🔍 [DynamicForm] Concept ${concept.id} applicable typed dimensions:`, applicableTypedDimensions);\n \n if (applicableTypedDimensions.length > 0) {\n // Filter typed member data to only include dimensions applicable to this concept\n const filteredTypedMembers: { [axisId: string]: { value: string; memberName: string } } = {};\n const allTypedMemberData = this._typedMemberData[field.columnId];\n \n applicableTypedDimensions.forEach(dimensionId => {\n if (allTypedMemberData[dimensionId]) {\n const memberName = this._getTypedMemberNameForAxis(dimensionId, section);\n filteredTypedMembers[dimensionId] = {\n value: allTypedMemberData[dimensionId],\n memberName: memberName || 'Unknown'\n };\n }\n });\n \n if (Object.keys(filteredTypedMembers).length > 0) {\n submissionEntry.typedMembers = filteredTypedMembers;\n console.log(`🔍 [DynamicForm] Adding filtered typed members to submission:`, filteredTypedMembers);\n } else {\n console.log(`🔍 [DynamicForm] No typed member values found for applicable dimensions:`, applicableTypedDimensions);\n }\n } else {\n console.log(`🔍 [DynamicForm] Skipping typed members for concept ${concept.id} - not applicable to this hypercube`);\n }\n } else {\n console.log(`🔍 [DynamicForm] No typed member data found for column ${field.columnId}. Available columns:`, Object.keys(this._typedMemberData));\n if (column) {\n console.log(`🔍 [DynamicForm] Column details:`, {\n id: column.id,\n type: column.type,\n hasTypedMembers: column.dimensionData?.hasTypedMembers,\n dimensionData: column.dimensionData\n });\n }\n }\n\n // Log final submission entry for target role\n if (sectionTitle === targetRole) {\n console.warn(`[DUPLICATE DEBUG] Final submission entry:`, submissionEntry);\n }\n\n submissionData.push(submissionEntry);\n }\n });\n }\n\n // Recursively process children\n if (concept.children) {\n this._processConceptsForSubmission(concept.children, submissionData, section);\n }\n });\n }\n\n private _handleReset() {\n this._formData = { ...this.initialData };\n this._touched.clear();\n this._dirty = false;\n this._submitted = false;\n\n // Clear preserved data when form is reset\n this._preservedFormData = {};\n this._preservedTypedMemberData = {};\n\n console.log('🔄 Form reset - all data and preserved data cleared');\n\n this._validateForm();\n this.requestUpdate();\n \n this.dispatchEvent(new CustomEvent('form-reset', {\n detail: {},\n bubbles: true\n }));\n }\n\n private _getFormState(): FormState {\n return {\n data: this._formData,\n errors: this._errors,\n touched: this._touched,\n dirty: this._dirty,\n valid: this._valid,\n submitted: this._submitted\n };\n }\n\n // Public API methods\n public getData(): FormData {\n return { ...this._formData };\n }\n\n public setData(data: FormData) {\n this._formData = { ...data };\n this._dirty = true;\n this._validateForm();\n this.requestUpdate();\n }\n\n public validate(): boolean {\n this._validateForm();\n return this._valid;\n }\n\n public reset() {\n this._handleReset();\n }\n\n public getState(): FormState {\n return this._getFormState();\n }\n\n /**\n * Change the form language and re-render labels while preserving data\n * @param newLanguage - ISO language code (e.g., 'en', 'nl', 'de')\n */\n public changeLanguage(newLanguage: string): void {\n if (this.language === newLanguage) {\n console.log('🌐 Language already set to', newLanguage);\n return;\n }\n \n console.log('🌐 Changing language from', this.language, 'to', newLanguage);\n this.language = newLanguage;\n // The updated() lifecycle will handle the rebuild\n }\n\n render() {\n const errorCount = this._errors.filter(e => e.severity === 'error').length;\n const config = this.config || {};\n const showValidationSummary = config.showValidationSummary !== false && \n errorCount > 0 && \n this._submitted;\n\n const schema = this._currentSchema;\n if (!schema) {\n return html`<div>Loading form...</div>`;\n }\n\n return html`\n <div class=\"form-container\">\n <!-- Form Header -->\n <div class=\"form-header\">\n <h1 class=\"form-title\">${schema.title}</h1>\n ${schema.description ? html`\n <p class=\"form-description\">${schema.description}</p>\n ` : ''}\n </div>\n\n <!-- Form Content -->\n <div class=\"form-sections\">\n <!-- Validation Summary -->\n ${showValidationSummary ? html`\n <div class=\"validation-summary\">\n <h4 class=\"validation-summary-title\">Please fix the following errors:</h4>\n <ul class=\"validation-summary-list\">\n ${this._errors\n .filter(e => e.severity === 'error')\n .map(error => html`\n <li class=\"validation-summary-item\">${error.message}</li>\n `)}\n </ul>\n </div>\n ` : ''}\n\n <!-- Form Sections or No Selection Message -->\n ${schema.sections.length === 0 ? html`\n <div class=\"no-roles-message\">\n <h3>No Roles Selected</h3>\n <p>Please use the \"Filter Roles\" button below to select which sections you want to work with.</p>\n <p>Available roles: ${this._allSections.length}</p>\n </div>\n ` : schema.sections.map((section, index) => html`\n <jupiter-form-section\n .section=\"${section}\"\n .columns=\"${section.columns || this._columns}\"\n .formData=\"${this._formData}\"\n .typedMemberData=\"${this._typedMemberData}\"\n .disabled=\"${this.disabled || this.readonly}\"\n .collapsible=\"${config.collapsibleSections !== false}\"\n .locale=\"${config.locale || 'en-US'}\"\n .isFirstSection=\"${index === 0}\"\n .availableDimensions=\"${this._getAvailableDimensionsForSection(section.id)}\"\n @field-change=\"${this._handleFieldChange}\"\n @typed-member-change=\"${this._handleTypedMemberChange}\"\n @section-expand=\"${this._handleSectionExpand}\"\n @concept-expand=\"${this._handleConceptExpand}\"\n @column-remove=\"${this._handleColumnRemove}\"\n @column-add-request=\"${this._handleColumnAddRequest}\"\n ></jupiter-form-section>\n `)}\n </div>\n\n <!-- Form Actions - Fixed Footer -->\n <div class=\"form-actions\">\n <!-- Filter Roles Button (shown when more than 10 roles) -->\n ${this._shouldShowFilterButton() ? html`\n <button \n class=\"filter-roles-button\"\n @click=\"${this._handleFilterRolesClick}\"\n ?disabled=\"${this.disabled || this.readonly}\"\n >\n <svg class=\"filter-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"/>\n </svg>\n ${this._selectedRoleIds.length === 0 ? 'Select Roles' : 'Filter Roles'}\n <span class=\"roles-count\">${this._selectedRoleIds.length}/${this._allSections.length}</span>\n </button>\n ` : ''}\n \n <button \n class=\"btn-secondary\"\n @click=\"${this._handleSaveDraft}\"\n ?disabled=\"${this.disabled || this.readonly}\"\n >\n Save Draft\n </button>\n \n <button \n class=\"btn-primary\"\n @click=\"${this._handleSubmit}\"\n ?disabled=\"${this.disabled || this.readonly}\"\n >\n Submit\n </button>\n\n <div class=\"form-meta\">\n <span>Errors: ${errorCount}</span>\n <span>Modified: ${this._dirty ? 'Yes' : 'No'}</span>\n <span>Valid: ${this._valid ? 'Yes' : 'No'}</span>\n </div>\n </div>\n\n <!-- Filter Roles Dialog -->\n ${this._showFilterDialog ? html`\n <jupiter-filter-roles-dialog\n ?open=\"${this._showFilterDialog}\"\n .availableRoles=\"${this._allSections}\"\n .selectedRoleIds=\"${this._selectedRoleIds}\"\n @dialog-cancel=\"${this._handleFilterDialogCancel}\"\n @roles-filter-apply=\"${this._handleRoleFilterApply}\"\n @click=\"${this._handleFilterDialogCancel}\"\n ></jupiter-filter-roles-dialog>\n ` : ''}\n </div>\n `;\n }\n}\n","// Main entry point for Jupiter Dynamic Forms\nexport * from './core/dynamic-form';\nexport * from './core/form-section';\nexport * from './core/concept-tree';\nexport * from './core/form-field';\nexport * from './core/add-column-dialog';\nexport * from './core/filter-roles-dialog';\nexport * from './schema/types';\nexport * from './utils/validation';\n\n// Register all custom elements\nimport './core/dynamic-form';\nimport './core/form-section';\nimport './core/concept-tree';\nimport './core/form-field';\nimport './core/add-column-dialog';\nimport './core/filter-roles-dialog';\n\n// Version export\nexport const version = '1.5.0';\n"],"names":["t","e","o","addInitializer","customElements","define","globalThis","ShadowRoot","ShadyCSS","nativeShadow","Document","prototype","CSSStyleSheet","s","Symbol","WeakMap","n$2","constructor","this","_$cssResult$","Error","cssText","styleSheet","length","get","replaceSync","set","toString","c","cssRules","n","r","is","i","defineProperty","getOwnPropertyDescriptor","h","getOwnPropertyNames","getOwnPropertySymbols","getPrototypeOf","Object","a","trustedTypes","l","emptyScript","p","reactiveElementPolyfillSupport","d","u","toAttribute","Boolean","Array","JSON","stringify","fromAttribute","Number","parse","f","b","attribute","type","String","converter","reflect","useDefault","hasChanged","metadata","litPropertyMetadata","y","HTMLElement","_$Ei","push","observedAttributes","finalize","_$Eh","keys","createProperty","state","hasOwnProperty","create","wrapped","elementProperties","noAccessor","getPropertyDescriptor","call","requestUpdate","configurable","enumerable","getPropertyOptions","Map","finalized","properties","_$Eu","elementStyles","finalizeStyles","styles","isArray","Set","flat","reverse","unshift","toLowerCase","super","_$Ep","isUpdatePending","hasUpdated","_$Em","_$Ev","_$ES","Promise","enableUpdating","_$AL","_$E_","_a","forEach","addController","_$EO","add","renderRoot","isConnected","hostConnected","removeController","delete","size","createRenderRoot","shadowRoot","attachShadow","shadowRootOptions","adoptedStyleSheets","map","document","createElement","litNonce","setAttribute","textContent","appendChild","connectedCallback","disconnectedCallback","hostDisconnected","attributeChangedCallback","_$AK","_$ET","removeAttribute","_b","_$Ej","hasAttribute","C","_$EP","has","_$Eq","reject","scheduleUpdate","performUpdate","shouldUpdate","willUpdate","hostUpdate","update","_$EM","_$AE","hostUpdated","firstUpdated","updated","updateComplete","getUpdateComplete","mode","ReactiveElement","reactiveElementVersions","kind","name","init","FormValidator","validateField","fieldId","conceptId","columnId","value","fieldType","rules","errors","rule","error","validateRule","_fieldType","isEmpty","createError","RegExp","test","URL","console","warn","message","severity","validateDataType","valid","convertedValue","numValue","isNaN","dateValue","Date","getTime","toISOString","split","datetimeValue","boolValue","formatValue","locale","Intl","NumberFormat","format","minimumFractionDigits","maximumFractionDigits","style","currency","toLocaleDateString","toLocaleString","XBRLFormBuilder","createUniqueConceptId","concept","sectionId","baseId","id","preferredLabel","trim","roleMatch","match","roleSuffix","replace","createSectionHash","hash","charCodeAt","Math","abs","substr","buildFormSchema","xbrlInput","periodStartDate","periodEndDate","language","presentation","presentationData","hypercubeData","hypercubes","sections","roles","sort","role","localeCompare","section","buildSectionFromRole","assignFieldColumnIds","formId","now","title","extractEntityName","entrypoint","description","version","extractRoleTitle","nonAbstractConcepts","getAllNonAbstractConcepts","periodTypes","filter","periodType","hypercubeRole","find","hr","roleId","columns","generateDefaultColumnsForRole","roleInfo","availableColumnIds","col","conceptTrees","presentationLinkbase","concepts","conceptTree","buildConceptTree","expanded","roleURI","originalRole","level","label","getPreferredLabel","labels","fields","elementAbstract","columnIds","colId","includes","field","createFieldFromConcept","children","child","childTree","originalConceptId","conceptName","collapsed","abstract","forcedColumnId","mapXBRLTypeToFieldType","placeholder","required","disabled","defaultValue","xbrlType","languageLabels","lang","labelsToSearch","preferred","standard","terse","assignColumnIdsToConceptFields","countFieldsInTree","count","collectNonAbstractConcepts","collection","rolePeriodTypes","order","removable","dimensionColumns","items","item","dimensions","generateSingleDimensionColumns","generateMultiDimensionColumns","dimension","typedMember","members","axisLabel","dimensionInfo","axisId","typedMemberId","dimensionKey","dimensionIdKey","dimensionData","dimensionId","memberId","memberValue","memberLabel","axis","memberKey","hasTypedMembers","typedMembers","firstMember","_c","some","validDimensions","dimensionInfos","isTyped","allMembers","getAllDimensionMembers","member","combinations","generateDimensionCombinations","combination","index","columnTitle","join","domainMembers","firstDimension","restDimensions","restCombinations","restCombination","formatDateForDisplay","dateString","year","month","day","pathParts","pathname","extractRoleOrder","parseInt","buildColumnsFromHypercubes","JupiterFormField","LitElement","arguments","hideLabel","_errors","_touched","changedProperties","_validateField","validation","_handleInput","event","target","checked","dispatchEvent","CustomEvent","detail","oldValue","bubbles","_handleFocus","_handleBlur","_renderInput","hasErrors","hasWarnings","cssClass","fieldName","html","options","option","_getInputType","render","showLabel","css","__decorateClass","property","customElement","JupiterConceptTree","formData","expandedConcepts","_expanded","_toggleExpanded","_getFieldForColumn","_getFieldValue","_handleFieldChange","stopPropagation","hasChildren","isAbstract","column","shouldShowField","JupiterAddColumnDialog","open","availableDimensions","_startDate","_endDate","_instantDate","_selectedType","_selectedDimensions","_resetForm","_handleCancel","_handleConfirm","_isFormValid","request","instantDate","startDate","endDate","selectedDimensions","from","values","_handleStartDateChange","_handleEndDateChange","_handleSelectedTypeChange","_handleInstantDateChange","_handleDimensionToggle","selection","_handleMemberSelection","existing","_handleTypedValueChange","input","typedValue","today","clear","_autoSelectSingleMemberDimensions","isValid","isSelected","isTypedDimension","JupiterFormSection","typedMemberData","collapsible","isFirstSection","_showAddColumnDialog","_sectionPeriodType","_expandedConcepts","_allTreeExpanded","_determinePeriodType","_checkAndExpandFirstSection","setTimeout","_expandAllTrees","log","_getAllNonAbstractConcepts","singleType","result","_handleRemoveColumn","_handleAddColumn","buttonPeriodType","_determineButtonPeriodType","allNonAbstractConcepts","_getConceptsWithFields","_handleDialogCancel","_handleColumnAdd","columnRequest","_flattenConcepts","childrenFlattened","_getAllConceptIds","_collapseAllTrees","_toggleAllTrees","_handleTreeCheckboxChange","checkbox","_handleConceptExpand","allConceptIds","every","_getTypedMemberHeaderValue","_handleTypedMemberHeaderChange","JupiterFilterRolesDialog","availableRoles","selectedRoleIds","_tempSelectedRoles","_searchQuery","_filteredRoles","_initializeTempSelection","_updateFilteredRoles","query","filtered","titleMatch","idMatch","descriptionMatch","uriMatch","_searchInRoleURI","uriPattern","titleHasURI","idHasURI","_handleSearchInput","_clearSearch","searchInput","querySelector","focus","_highlightSearchTerm","text","regex","_renderHighlightedText","_getSelectedFilteredCount","_handleCheckboxChange","newSelection","_selectAll","_selectNone","_selectAllGlobal","_selectNoneGlobal","_resetToOriginal","_handleApply","selectedRoles","_handleBackdropClick","selectedCount","totalCount","filteredCount","hasSearchQuery","JupiterDynamicForm","config","initialData","readonly","_formData","_preservedFormData","_typedMemberData","_preservedTypedMemberData","_columns","_dirty","_valid","_submitted","_allSections","_selectedRoleIds","_showFilterDialog","_initializeForm","_handleLanguageChange","currentFormData","currentPreservedData","currentTypedMemberData","currentPreservedTypedMemberData","currentSelectedRoles","_currentSchema","_applyRoleFilter","_getDefaultSchema","_getDefaultColumns","schema","_validateForm","_preserveDataForHiddenSections","filteredSections","_restoreDataForVisibleSections","sectionsThatWillBeHidden","_preserveSectionData","visibleSections","_restoreSectionData","_preserveConceptData","_restoreConceptData","_shouldShowFilterButton","_handleFilterRolesClick","_handleFilterDialogCancel","_handleRoleFilterApply","totalRoles","visibleRoles","fieldErrors","updatedFormData","_generateUniqueConceptKey","_extractOriginalConceptId","uniqueConceptKey","parts","_handleTypedMemberChange","updatedTypedMemberData","_handleSectionExpand","_handleColumnRemove","targetSection","_removeColumnData","_handleColumnAddRequest","_addColumnFromRequest","_getAvailableDimensionsForSection","availableDimension","dataType","newColumnId","dimensionParts","dimensionKeys","dimSelection","periodPart","_d","_e","newColumn","hasTypedDimensions","dim","_replicateFieldsForNewColumn","_removeColumnDataFromConcepts","_shouldCreateFieldForConcept","formBuilder","_replicateFieldsForSection","existingField","_addColumn","_handleSubmit","submissionData","_generateSubmissionData","data","_handleSaveDraft","draftData","_processConceptsForSubmission","_includePreservedDataInSubmission","_removeDuplicateSubmissions","conceptData","originalConcept","_findConceptInAllSections","originalSection","_findSectionForConcept","_addConceptDataToSubmission","_findConceptInSection","found","isInstant","entry","period","date","_findColumnByIdInAllSections","uniqueEntries","key","_findColumnById","_findColumnByIdInSection","_getTypedMemberNameForAxis","sectionRoleId","_doesConceptApplyToTypedDimension","conceptIdToCheck","conceptIds","_getApplicableTypedDimensions","typedDimensions","targetRole","sectionTitle","fieldValue","submissionEntry","applicableTypedDimensions","filteredTypedMembers","allTypedMemberData","memberName","_handleReset","_getFormState","touched","dirty","submitted","getData","setData","validate","reset","getState","changeLanguage","newLanguage","errorCount","showValidationSummary","collapsibleSections"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4]}