jupiter-dynamic-forms 1.9.7 → 1.9.9

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/utils/type-input-mapping.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 * @param periodPreferences - User preferences for which period columns to show per role\n */\n static buildFormSchema(\n xbrlInput: XBRLFormInput, \n periodStartDate?: string, \n periodEndDate?: string,\n language: string = 'en',\n periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }>\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, periodPreferences);\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 periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }>\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 rolePreferences = periodPreferences?.[role.id];\n const columns = this.generateDefaultColumnsForRole(role, periodStartDate || '2025-01-01', periodEndDate || '2025-12-31', hypercubeRole, nonAbstractConcepts, periodTypes, rolePreferences);\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 showPeriodControl: periodTypes.size > 1,\n showPreviousYear: (role as any).showPreviousYear === true, // Read from presentation.json\n instant: (role as any).instant === true, // Read from presentation.json\n duration: (role as any).duration === true // Read from presentation.json\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 // Check if this column matches the concept's period type\n const isInstantColumn = colId.includes('instant') || colId === 'instant';\n const isDurationColumn = colId.includes('duration') || colId === 'duration';\n \n if (concept.periodType === 'instant') {\n // Instant concept should only appear in instant columns\n return isInstantColumn;\n } else if (concept.periodType === 'duration') {\n // Duration concept should only appear in duration columns\n return isDurationColumn;\n } else {\n // If concept has no period type, include columns that are neither instant nor duration\n // or include all if none of the columns have period type indicators\n return !isInstantColumn && !isDurationColumn;\n }\n });\n \n // If no columns match the period type but columns exist, don't create any fields\n // This prevents showing duration concepts in instant columns and vice versa\n if (columnIds.length === 0 && roleInfo.availableColumnIds.length > 0) {\n // Check if available columns are period-specific\n const hasPeriodColumns = roleInfo.availableColumnIds.some(colId => \n colId.includes('instant') || colId.includes('duration')\n );\n \n // Only fall back if there are no period-specific columns\n if (!hasPeriodColumns) {\n columnIds = roleInfo.availableColumnIds;\n }\n // Otherwise, keep columnIds empty to prevent creating fields\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 type: concept.type, // XBRL concept type for input field rendering\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 periodPreferences?: { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }\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 \n // Filter columns based on period preferences\n if (periodPreferences) {\n dimensionColumns = this.filterColumnsByPeriodPreferences(dimensionColumns, periodPreferences);\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 end date\n //console.log('📅 All concepts are instant type, creating single column');\n columns.push({\n id: 'instant',\n title: periodEndDate,\n description: '',\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: `${periodStartDate} / ${periodEndDate}`,\n description: '',\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: `${periodStartDate} / ${periodEndDate}`,\n description: '',\n type: 'base',\n order: 0,\n removable: false\n });\n \n // Instant column using periodEndDate as the instant date\n columns.push({\n id: 'instant',\n title: periodEndDate,\n description: '',\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 \n // Apply period preferences filter if provided\n let filteredColumns = columns;\n if (periodPreferences) {\n filteredColumns = this.filterColumnsByPeriodPreferences(columns, periodPreferences);\n }\n \n // Generate previous year columns if requested\n if (periodPreferences?.showPreviousYear) {\n const previousYearColumns = this.generatePreviousYearColumns(filteredColumns, periodStartDate, periodEndDate);\n filteredColumns = [...filteredColumns, ...previousYearColumns];\n }\n \n return filteredColumns;\n }\n\n /**\n * Calculate previous year date by subtracting one year\n */\n private static getPreviousYearDate(dateString: string): string {\n try {\n const date = new Date(dateString);\n date.setFullYear(date.getFullYear() - 1);\n return date.toISOString().split('T')[0];\n } catch (error) {\n console.error(`Error calculating previous year for date ${dateString}:`, error);\n return dateString;\n }\n }\n\n /**\n * Generate previous year columns based on current year columns\n */\n private static generatePreviousYearColumns(\n currentYearColumns: FormColumn[],\n periodStartDate: string,\n periodEndDate: string\n ): FormColumn[] {\n const previousYearColumns: FormColumn[] = [];\n const prevStartDate = this.getPreviousYearDate(periodStartDate);\n const prevEndDate = this.getPreviousYearDate(periodEndDate);\n\n currentYearColumns.forEach((column, index) => {\n // Create a previous year version of each column\n let prevTitle = column.title; // Keep original title (dimension labels)\n let prevDescription = '';\n let prevId = '';\n\n // Determine the description and ID based on column type\n if (column.dimensionData) {\n // Column has dimensions - keep the title (dimension labels), update description (date)\n prevTitle = column.title; // Keep dimension labels like \"Commercial\" or \"Commercial | Separate\"\n \n // Update description with previous year dates\n if (column.description && column.description.includes('/')) {\n // Duration column\n prevDescription = `${prevStartDate} / ${prevEndDate}`;\n } else {\n // Instant column\n prevDescription = prevEndDate;\n }\n \n prevId = `${column.id}_prev`;\n } else {\n // Column has no dimensions - title contains the date\n if (column.id === 'instant' || column.id.includes('instant')) {\n prevTitle = prevEndDate;\n prevDescription = '';\n prevId = `instant_prev_${index}`;\n } else if (column.id === 'duration' || column.id.includes('duration')) {\n prevTitle = `${prevStartDate} / ${prevEndDate}`;\n prevDescription = '';\n prevId = `duration_prev_${index}`;\n } else if (column.title.includes('/')) {\n // Duration column with period range\n prevTitle = `${prevStartDate} / ${prevEndDate}`;\n prevDescription = '';\n prevId = `${column.id}_prev`;\n } else {\n // Instant column with single date\n prevTitle = prevEndDate;\n prevDescription = '';\n prevId = `${column.id}_prev`;\n }\n }\n\n previousYearColumns.push({\n ...column,\n id: prevId,\n title: prevTitle,\n description: prevDescription,\n order: column.order + 100, // Place after current year columns\n removable: true,\n periodStartDate: prevStartDate, // Set previous year start date\n periodEndDate: prevEndDate, // Set previous year end date\n dimensionData: column.dimensionData ? {\n ...column.dimensionData,\n dimensionId: `${column.dimensionData.dimensionId}_prev`\n } : undefined\n });\n });\n\n return previousYearColumns;\n }\n\n /**\n * Filter columns based on user's period preferences\n */\n private static filterColumnsByPeriodPreferences(\n columns: FormColumn[],\n preferences: { showDuration: boolean; showInstant: boolean; showPreviousYear?: boolean }\n ): FormColumn[] {\n return columns.filter(column => {\n // Check if column is duration or instant based on its ID or dimensionData\n const isDuration = column.id.includes('duration') || \n column.dimensionData?.dimensionId?.includes('duration');\n const isInstant = column.id.includes('instant') || \n column.dimensionData?.dimensionId?.includes('instant');\n \n // If column is neither duration nor instant, keep it (default columns)\n if (!isDuration && !isInstant) {\n return true;\n }\n \n // Filter based on preferences\n if (isDuration && !preferences.showDuration) {\n return false;\n }\n if (isInstant && !preferences.showInstant) {\n return false;\n }\n \n return true;\n });\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: periodEndDate,\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: `${periodStartDate} / ${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: `${periodStartDate} / ${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: periodEndDate,\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: periodEndDate,\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: `${periodStartDate} / ${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: `${periodStartDate} / ${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: periodEndDate,\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: `${periodStartDate} / ${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: periodEndDate,\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: `${periodStartDate} / ${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: periodEndDate,\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","/**\n * Type-to-Input Field Mapping Configuration\n * \n * This module defines the mapping between XBRL concept types and HTML input field types.\n * The mapping determines which UI control should be rendered for each XBRL data type.\n * \n * Usage:\n * 1. Add new type mappings to the TYPE_INPUT_MAP constant\n * 2. Use getInputTypeForConceptType() to get the appropriate field type\n * 3. Mapping is extensible - add more types as needed\n */\n\nexport type InputFieldType = \n | 'text'\n | 'textarea'\n | 'number'\n | 'decimal'\n | 'integer'\n | 'currency'\n | 'percentage'\n | 'date'\n | 'datetime'\n | 'email'\n | 'url'\n | 'tel'\n | 'boolean'\n | 'select';\n\nexport interface TypeMapping {\n /** The input field type to render */\n fieldType: InputFieldType;\n /** Optional HTML input type attribute (for input elements) */\n htmlInputType?: string;\n /** Whether to allow decimal values (for number fields) */\n allowDecimals?: boolean;\n /** Minimum allowed value (for number fields) */\n min?: number;\n /** Maximum allowed value (for number fields) */\n max?: number;\n /** Step value for number inputs */\n step?: string | number;\n /** Placeholder text suggestion */\n placeholder?: string;\n}\n\n/**\n * Type-to-Input Field Mapping\n * \n * Maps XBRL concept types to appropriate input field configurations.\n * Types are matched in order of specificity (most specific first).\n */\nexport const TYPE_INPUT_MAP: Record<string, TypeMapping> = {\n // ==========================================\n // Dutch XBRL Types (nl-types namespace)\n // ==========================================\n \n // Text area for long-form explanations\n 'nl-types:formattedExplanationItemType': {\n fieldType: 'textarea',\n placeholder: 'Enter detailed explanation...',\n },\n \n // Monetary values without decimals (whole numbers only)\n 'nl-types:monetaryNoDecimals20ItemType': {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: false,\n step: 1,\n placeholder: 'Enter amount (no decimals)',\n },\n \n // ==========================================\n // Standard XBRL Types (xbrli namespace)\n // ==========================================\n \n // Monetary with decimals\n 'xbrli:monetaryItemType': {\n fieldType: 'currency',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: '0.00',\n },\n \n // String/text types\n 'xbrli:stringItemType': {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: 'Enter text',\n },\n \n // Date types\n 'xbrli:dateItemType': {\n fieldType: 'date',\n htmlInputType: 'date',\n },\n \n 'xbrli:dateTimeItemType': {\n fieldType: 'datetime',\n htmlInputType: 'datetime-local',\n },\n \n // Numeric types - integers\n 'xbrli:integerItemType': {\n fieldType: 'integer',\n htmlInputType: 'number',\n allowDecimals: false,\n step: 1,\n placeholder: 'Enter whole number',\n },\n \n 'xbrli:nonNegativeIntegerItemType': {\n fieldType: 'integer',\n htmlInputType: 'number',\n allowDecimals: false,\n min: 0,\n step: 1,\n placeholder: 'Enter positive number',\n },\n \n 'xbrli:positiveIntegerItemType': {\n fieldType: 'integer',\n htmlInputType: 'number',\n allowDecimals: false,\n min: 1,\n step: 1,\n placeholder: 'Enter positive number',\n },\n \n // Numeric types - decimals\n 'xbrli:decimalItemType': {\n fieldType: 'decimal',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 'any',\n placeholder: 'Enter decimal value',\n },\n \n // Shares (typically whole numbers or with limited decimals)\n 'xbrli:sharesItemType': {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: true,\n min: 0,\n step: 0.01,\n placeholder: 'Enter number of shares',\n },\n \n 'xbrli:shares': {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: true,\n min: 0,\n step: 0.01,\n placeholder: 'Enter number of shares',\n },\n \n // Year (gYear)\n 'xbrli:gYearItemType': {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: false,\n min: 1900,\n max: 2100,\n step: 1,\n placeholder: 'YYYY',\n },\n \n // Boolean types\n 'xbrli:booleanItemType': {\n fieldType: 'boolean',\n },\n \n // ==========================================\n // Percentage types\n // ==========================================\n \n 'xbrli:pureItemType': {\n fieldType: 'percentage',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: 'Enter percentage',\n },\n \n 'xbrli:percentItemType': {\n fieldType: 'percentage',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: 'Enter percentage',\n },\n \n // ==========================================\n // Contact/Communication types\n // ==========================================\n \n 'xbrli:emailItemType': {\n fieldType: 'email',\n htmlInputType: 'email',\n placeholder: 'email@example.com',\n },\n \n 'xbrli:urlItemType': {\n fieldType: 'url',\n htmlInputType: 'url',\n placeholder: 'https://example.com',\n },\n \n 'xbrli:telephoneItemType': {\n fieldType: 'tel',\n htmlInputType: 'tel',\n placeholder: '+1 (555) 000-0000',\n },\n};\n\n/**\n * Get input field configuration for a given XBRL concept type\n * \n * @param conceptType - The XBRL concept type (e.g., \"nl-types:monetaryNoDecimals20ItemType\")\n * @returns TypeMapping configuration or default text input\n */\nexport function getInputTypeForConceptType(conceptType: string | undefined): TypeMapping {\n if (!conceptType) {\n return {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: 'Enter value',\n };\n }\n \n // Direct match\n if (TYPE_INPUT_MAP[conceptType]) {\n return TYPE_INPUT_MAP[conceptType];\n }\n \n // Pattern matching for common suffixes\n const lowerType = conceptType.toLowerCase();\n \n // Monetary types\n if (lowerType.includes('monetary')) {\n if (lowerType.includes('nodecimals') || lowerType.includes('no-decimals')) {\n return {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: false,\n step: 1,\n placeholder: 'Enter amount (no decimals)',\n };\n }\n return {\n fieldType: 'currency',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: '0.00',\n };\n }\n \n // Text area types (explanation, description, notes)\n if (lowerType.includes('explanation') || \n lowerType.includes('description') || \n lowerType.includes('notes') ||\n lowerType.includes('formatted')) {\n return {\n fieldType: 'textarea',\n placeholder: 'Enter detailed information...',\n };\n }\n \n // Date types\n if (lowerType.includes('date')) {\n if (lowerType.includes('time')) {\n return {\n fieldType: 'datetime',\n htmlInputType: 'datetime-local',\n };\n }\n return {\n fieldType: 'date',\n htmlInputType: 'date',\n };\n }\n \n // Boolean types\n if (lowerType.includes('boolean') || lowerType.includes('bool')) {\n return {\n fieldType: 'boolean',\n };\n }\n \n // Integer types\n if (lowerType.includes('integer') || lowerType.includes('int')) {\n const isNonNegative = lowerType.includes('nonnegative') || lowerType.includes('non-negative');\n const isPositive = lowerType.includes('positive');\n \n return {\n fieldType: 'integer',\n htmlInputType: 'number',\n allowDecimals: false,\n min: isPositive ? 1 : isNonNegative ? 0 : undefined,\n step: 1,\n placeholder: 'Enter whole number',\n };\n }\n \n // Decimal/numeric types\n if (lowerType.includes('decimal') || \n lowerType.includes('numeric') || \n lowerType.includes('number')) {\n return {\n fieldType: 'decimal',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 'any',\n placeholder: 'Enter decimal value',\n };\n }\n \n // Percentage types\n if (lowerType.includes('percent') || lowerType.includes('pure')) {\n return {\n fieldType: 'percentage',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: 'Enter percentage',\n };\n }\n \n // Default to text input\n return {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: 'Enter value',\n };\n}\n\n/**\n * Check if a field type should display as a textarea\n */\nexport function isTextareaType(fieldType: InputFieldType): boolean {\n return fieldType === 'textarea';\n}\n\n/**\n * Check if a field type should display as a checkbox\n */\nexport function isCheckboxType(fieldType: InputFieldType): boolean {\n return fieldType === 'boolean';\n}\n\n/**\n * Check if a field type is numeric\n */\nexport function isNumericType(fieldType: InputFieldType): boolean {\n return ['number', 'decimal', 'integer', 'currency', 'percentage'].includes(fieldType);\n}\n\n/**\n * Check if a field type should display as a select dropdown\n */\nexport function isSelectType(fieldType: InputFieldType): boolean {\n return fieldType === 'select';\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';\nimport { getInputTypeForConceptType, isTextareaType, isCheckboxType, isNumericType } from '../utils/type-input-mapping';\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 }) conceptType?: string; // XBRL concept type for input type determination\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 // Get type mapping configuration based on concept type\n const typeConfig = getInputTypeForConceptType(this.conceptType);\n \n // Debug logging\n if (this.conceptType) {\n //console.log(`🔍 [FormField] Concept: ${this.conceptId}, Type: ${this.conceptType}, Config:`, typeConfig);\n }\n \n // Determine which field type to use (from type mapping or field.type)\n const effectiveFieldType = typeConfig.fieldType || this.field.type || 'text';\n \n // Handle textarea based on type mapping\n if (effectiveFieldType === 'textarea' || isTextareaType(effectiveFieldType)) {\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=\"${typeConfig.placeholder || this.field.placeholder || ''}\"\n @input=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n ></textarea>\n `;\n }\n\n // Handle select dropdown\n if (effectiveFieldType === 'select' || this.field.type === '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\n // Handle checkbox/boolean based on type mapping\n if (effectiveFieldType === 'boolean' || isCheckboxType(effectiveFieldType)) {\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\n // Handle all other input types (text, number, date, etc.)\n const inputType = typeConfig.htmlInputType || this._getInputType();\n const step = typeConfig.step !== undefined ? typeConfig.step : \n isNumericType(effectiveFieldType) ? 'any' : undefined;\n const min = typeConfig.min;\n const max = typeConfig.max;\n \n return html`\n <input\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n type=\"${inputType}\"\n class=\"${cssClass}\"\n .value=\"${this.value || ''}\"\n ?disabled=\"${this.disabled || this.field.disabled}\"\n placeholder=\"${typeConfig.placeholder || this.field.placeholder || ''}\"\n step=\"${step !== undefined ? step : ''}\"\n min=\"${min !== undefined ? min : ''}\"\n max=\"${max !== undefined ? max : ''}\"\n @input=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\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 .conceptType=\"${this.concept.type}\"\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 @property({ type: Boolean }) hideHeader = false;\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 .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 /* Special styling for the Add Column button-only column */\n .header-cell.add-column-only {\n width: 15%;\n min-width: 100px;\n max-width: 150px;\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 // When expanding the accordion, also expand all trees\n if (this._expanded) {\n this._expandAllTrees();\n }\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 _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 ${!this.hideHeader ? 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\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\"></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 add-column-only\">\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, ConceptTree } from '../schema/types';\n\nexport interface FilterRolesRequest {\n availableRoles: FormSection[];\n currentSelectedRoles: string[];\n}\n\nexport interface RolePeriodPreferences {\n [roleId: string]: {\n showDuration: boolean;\n showInstant: boolean;\n showPreviousYear: boolean;\n };\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 @property({ type: Object }) periodPreferences: RolePeriodPreferences = {};\n\n @state() private _tempSelectedRoles = new Set<string>();\n @state() private _searchQuery = '';\n @state() private _filteredRoles: FormSection[] = [];\n @state() private _tempPeriodPreferences: RolePeriodPreferences = {};\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 .period-controls {\n margin-top: 8px;\n padding: 8px;\n background: var(--jupiter-background-light, #f8f9fa);\n border-radius: 4px;\n border: 1px solid var(--jupiter-border-color, #e0e0e0);\n }\n\n .period-controls-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--jupiter-text-primary, #333);\n margin: 0 0 6px 0;\n }\n\n .period-checkboxes {\n display: flex;\n gap: 16px;\n flex-wrap: wrap;\n }\n\n .period-checkbox-item {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .period-checkbox {\n cursor: pointer;\n }\n\n .period-checkbox-label {\n font-size: 13px;\n color: var(--jupiter-text-primary, #333);\n cursor: pointer;\n user-select: none;\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 this._initializePeriodPreferences();\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 if (changedProperties.has('availableRoles') || changedProperties.has('periodPreferences') || changedProperties.has('open')) {\n this._initializePeriodPreferences();\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 _initializePeriodPreferences() {\n // Initialize period preferences for all roles, preserving existing preferences\n const preferences: RolePeriodPreferences = {};\n this.availableRoles.forEach(role => {\n // Check if we have existing preferences for this role\n const existingPrefs = this.periodPreferences[role.id];\n \n if (existingPrefs) {\n // Preserve existing user preferences\n preferences[role.id] = { ...existingPrefs };\n } else {\n // Initialize defaults for new roles\n // For mixed-period roles, use preset values from presentation data or detect from concepts\n const hasMixedPeriods = role.showPeriodControl === true;\n \n // Read preset values from role data if available, otherwise detect from concepts\n let showDuration: boolean;\n let showInstant: boolean;\n \n if (role.duration !== undefined || role.instant !== undefined) {\n // Use preset values from presentation.json\n showDuration = role.duration === true;\n showInstant = role.instant === true;\n } else {\n // Fallback: detect from concepts\n showDuration = hasMixedPeriods || this._hasConceptsWithPeriodType(role, 'duration');\n showInstant = hasMixedPeriods || this._hasConceptsWithPeriodType(role, 'instant');\n }\n \n preferences[role.id] = {\n showDuration: showDuration,\n showInstant: showInstant,\n showPreviousYear: role.showPreviousYear === true // Read from role data in presentation.json\n };\n }\n });\n this._tempPeriodPreferences = preferences;\n }\n\n private _hasConceptsWithPeriodType(role: FormSection, periodType: 'instant' | 'duration'): boolean {\n const checkConcepts = (concepts: ConceptTree[]): boolean => {\n return concepts.some(concept => {\n if (!concept.abstract && concept.periodType === periodType) {\n return true;\n }\n if (concept.children) {\n return checkConcepts(concept.children);\n }\n return false;\n });\n };\n return checkConcepts(role.concepts);\n }\n\n private _handlePeriodCheckboxChange(event: Event, roleId: string, periodType: 'duration' | 'instant' | 'previousYear') {\n event.stopPropagation();\n const checkbox = event.target as HTMLInputElement;\n \n const newPreferences = { ...this._tempPeriodPreferences };\n if (!newPreferences[roleId]) {\n newPreferences[roleId] = { showDuration: true, showInstant: true, showPreviousYear: false };\n }\n \n if (periodType === 'duration') {\n newPreferences[roleId].showDuration = checkbox.checked;\n } else if (periodType === 'instant') {\n newPreferences[roleId].showInstant = checkbox.checked;\n } else if (periodType === 'previousYear') {\n newPreferences[roleId].showPreviousYear = checkbox.checked;\n }\n \n this._tempPeriodPreferences = newPreferences;\n this.requestUpdate();\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: { \n selectedRoleIds: selectedRoles,\n periodPreferences: this._tempPeriodPreferences\n },\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 const showPeriodControls = role.showPeriodControl === true;\n const preferences = this._tempPeriodPreferences[role.id] || { showDuration: true, showInstant: true };\n \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 \n ${showPeriodControls ? html`\n <div class=\"period-controls\">\n <p class=\"period-controls-label\">Show Period Column:</p>\n <div class=\"period-checkboxes\">\n <label class=\"period-checkbox-item\">\n <input\n type=\"checkbox\"\n class=\"period-checkbox\"\n .checked=\"${preferences.showDuration}\"\n @change=\"${(e: Event) => this._handlePeriodCheckboxChange(e, role.id, 'duration')}\"\n />\n <span class=\"period-checkbox-label\">Duration</span>\n </label>\n <label class=\"period-checkbox-item\">\n <input\n type=\"checkbox\"\n class=\"period-checkbox\"\n .checked=\"${preferences.showInstant}\"\n @change=\"${(e: Event) => this._handlePeriodCheckboxChange(e, role.id, 'instant')}\"\n />\n <span class=\"period-checkbox-label\">Instant</span>\n </label>\n </div>\n </div>\n ` : ''}\n \n <div class=\"period-controls\">\n <p class=\"period-controls-label\">Additional Options:</p>\n <div class=\"period-checkboxes\">\n <label class=\"period-checkbox-item\">\n <input\n type=\"checkbox\"\n class=\"period-checkbox\"\n .checked=\"${preferences.showPreviousYear}\"\n @change=\"${(e: Event) => this._handlePeriodCheckboxChange(e, role.id, 'previousYear')}\"\n />\n <span class=\"period-checkbox-label\">Show previous year</span>\n </label>\n </div>\n </div>\n </div>\n </div>\n `;\n })}\n `}\n </div>\n\n \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 @property({ type: String }) display: 'accordion' | 'sidePanel' = 'accordion';\n @property({ type: String }) mode: 'inputForm' | 'admin' = 'inputForm';\n @property({ type: Array }) \n financialStatementsTypeAxis: string[] = [];\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 @state() private _periodPreferences: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }> = {};\n @state() private _activeSidePanelRoleId: string | null = null;\n @state() private _adminRoleConfigs: Record<string, { showPreviousYear: boolean; instant?: boolean; duration?: boolean }> = {};\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 /* Side Panel Layout Styles */\n .side-panel-layout {\n display: flex;\n height: calc(100vh - 80px); /* Account for footer only */\n gap: 0;\n }\n\n .side-panel-roles-list {\n width: 280px;\n min-width: 280px;\n border-right: 1px solid var(--jupiter-border-color, #ddd);\n overflow-y: auto;\n background: var(--jupiter-background-light, #f8f9fa);\n }\n\n .side-panel-role-item {\n padding: 12px 16px;\n cursor: pointer;\n border-bottom: 1px solid var(--jupiter-border-color, #e0e0e0);\n transition: background-color 0.2s ease;\n font-size: 14px;\n color: var(--jupiter-text-primary, #333);\n line-height: 1.4;\n }\n\n .side-panel-role-item:hover {\n background: var(--jupiter-hover-background, #e8e8e8);\n }\n\n .side-panel-role-item.active {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n font-weight: 500;\n }\n\n .side-panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n }\n\n .side-panel-content .form-sections {\n padding: 24px;\n padding-bottom: 24px;\n }\n\n /* Admin Mode Styles */\n .admin-mode-placeholder {\n padding: 0;\n background: white;\n min-height: 300px;\n }\n\n .admin-mode-container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 24px;\n }\n\n .admin-mode-title {\n font-size: 20px;\n font-weight: 600;\n margin: 0 0 24px 0;\n color: var(--jupiter-text-primary, #333);\n }\n\n .admin-roles-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .admin-role-item {\n display: flex;\n align-items: center;\n padding: 16px;\n background: var(--jupiter-background-light, #f8f9fa);\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 6px;\n transition: background-color 0.2s ease;\n }\n\n .admin-role-item:hover {\n background: var(--jupiter-hover-background, #e8e8e8);\n }\n\n .admin-role-title {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n }\n\n .admin-role-checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: 16px;\n }\n\n .admin-role-checkbox input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n }\n\n .admin-role-checkbox label {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n cursor: pointer;\n user-select: none;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._initializeForm();\n }\n\n updated(changedProperties: Map<string, any>) {\n // Log when financialStatementsTypeAxis changes\n if (changedProperties.has('financialStatementsTypeAxis')) {\n console.log('🔄 financialStatementsTypeAxis changed:', this.financialStatementsTypeAxis);\n }\n \n // Reinitialize form when any of these critical properties change\n if (\n changedProperties.has('xbrlInput') || \n changedProperties.has('schema') ||\n changedProperties.has('language') ||\n changedProperties.has('periodStartDate') ||\n changedProperties.has('periodEndDate') ||\n changedProperties.has('financialStatementsTypeAxis')\n ) {\n this._initializeForm();\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 \n // Initialize period preferences from presentation data BEFORE building schema\n this._initializePeriodPreferencesFromData();\n \n console.log('⚙️ Using period preferences:', this._periodPreferences);\n this._currentSchema = XBRLFormBuilder.buildFormSchema(\n this.xbrlInput, \n this.periodStartDate, \n this.periodEndDate,\n this.language,\n this._periodPreferences\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 // Apply financialStatementsTypeAxis filter if provided\n if (this.financialStatementsTypeAxis && this.financialStatementsTypeAxis.length > 0) {\n console.log('🔍 Applying financialStatementsTypeAxis filter:', this.financialStatementsTypeAxis);\n console.log('📊 Sections before filter:', this._allSections.length);\n this._allSections = this._filterRolesByFinancialStatementsType(this._allSections);\n console.log('📊 Sections after filter:', this._allSections.length);\n }\n \n // Initialize selected roles - select all filtered sections by default\n if (this._selectedRoleIds.length === 0) {\n // Preselect all filtered roles by default\n this._selectedRoleIds = this._allSections.map(section => section.id);\n console.log('✅ Auto-selected all roles:', this._selectedRoleIds.length);\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 /**\n * Initialize period preferences from presentation data\n * Reads showPreviousYear, instant, and duration attributes from each role to set initial preferences\n */\n private _initializePeriodPreferencesFromData() {\n if (!this.xbrlInput?.presentation?.[0]?.roles) {\n return;\n }\n\n const preferences: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }> = {};\n \n this.xbrlInput.presentation[0].roles.forEach(role => {\n // Read preset values from role data, with defaults\n const showPreviousYear = (role as any).showPreviousYear === true;\n const instant = (role as any).instant !== undefined ? (role as any).instant === true : true;\n const duration = (role as any).duration !== undefined ? (role as any).duration === true : true;\n \n preferences[role.id] = {\n showDuration: duration,\n showInstant: instant,\n showPreviousYear: showPreviousYear\n };\n \n const presets: string[] = [];\n if (showPreviousYear) presets.push('previous year');\n if (instant) presets.push('instant');\n if (duration) presets.push('duration');\n \n if (presets.length > 0) {\n //console.log(`✅ Auto-configured role \"${role.role}\" with presets: ${presets.join(', ')}`);\n }\n });\n \n this._periodPreferences = preferences;\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 this.requestUpdate();\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 console.log(`📊 Filtered sections: ${filteredSections.length} (IDs: ${filteredSections.map(s => s.id).join(', ')})`);\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 console.log(`✅ Schema updated. Current sections count: ${this._currentSchema.sections.length}`);\n \n // Force re-render to update the UI\n this.requestUpdate();\n }\n\n /**\n * Filter roles based on financialStatementsTypeAxis property\n * Rules:\n * 1. Show roles that have no entry in hypercubes.json\n * 2. Show roles that don't have financialStatementsTypeAxis dimension\n * 3. For roles with financialStatementsTypeAxis, show only if at least one member matches the provided values\n */\n private _filterRolesByFinancialStatementsType(sections: FormSection[]): FormSection[] {\n // If no filter is provided, return all sections\n if (!this.financialStatementsTypeAxis || this.financialStatementsTypeAxis.length === 0) {\n return sections;\n }\n\n if (!this.xbrlInput?.hypercubes || this.xbrlInput.hypercubes.length === 0) {\n return sections;\n }\n\n const hypercubeData = this.xbrlInput.hypercubes[0];\n const financialStatementsAxisId = 'bw2-titel9_FinancialStatementsTypeAxis';\n\n console.log('🔍 Filter values:', this.financialStatementsTypeAxis);\n\n return sections.filter(section => {\n // Find matching hypercube role\n const hypercubeRole = hypercubeData.roles?.find(r => r.roleId === section.id);\n\n // Rule 1: If no hypercube entry exists for this role, show it\n if (!hypercubeRole || !hypercubeRole.items || hypercubeRole.items.length === 0) {\n console.log(`✅ ${section.title}: No hypercube entry - INCLUDED`);\n return true;\n }\n\n // Check if any item has financialStatementsTypeAxis dimension\n let hasFinancialStatementsAxis = false;\n let hasMatchingMember = false;\n\n for (const item of hypercubeRole.items) {\n if (!item.dimensions || item.dimensions.length === 0) {\n // No dimensions means this role should be shown\n continue;\n }\n\n // Find the financialStatementsTypeAxis dimension\n const financialStatementsTypeDimension = item.dimensions.find(\n dim => dim.id === financialStatementsAxisId || dim.conceptName?.includes('FinancialStatementsTypeAxis')\n );\n\n // If this item has the financialStatementsTypeAxis dimension\n if (financialStatementsTypeDimension) {\n hasFinancialStatementsAxis = true;\n\n // Check if any member matches the provided values\n if (financialStatementsTypeDimension.members && financialStatementsTypeDimension.members.length > 0) {\n const itemHasMatch = financialStatementsTypeDimension.members.some(member => {\n // Extract the part after the colon from conceptName\n if (member.conceptName) {\n const conceptNameParts = member.conceptName.split(':');\n const memberValue = conceptNameParts.length > 1 ? conceptNameParts[1] : member.conceptName;\n \n// console.log(` 🔎 Checking member: ${member.conceptName} -> ${memberValue}`);\n \n // Check if this memberValue matches any of our filter values\n const matches = this.financialStatementsTypeAxis.some(filterValue => {\n const filterParts = filterValue.split(':');\n const filterMemberValue = filterParts.length > 1 ? filterParts[1] : filterValue;\n const isMatch = memberValue === filterMemberValue;\n // console.log(` Comparing ${memberValue} === ${filterMemberValue}: ${isMatch}`);\n return isMatch;\n });\n \n return matches;\n }\n \n // Fallback to checking member.id\n return this.financialStatementsTypeAxis.includes(member.id);\n });\n\n if (itemHasMatch) {\n hasMatchingMember = true;\n break; // Found a match, no need to check other items\n }\n }\n }\n }\n\n // Rule 2: If no items have financialStatementsTypeAxis, show the role\n if (!hasFinancialStatementsAxis) {\n //console.log(`✅ ${section.title}: No financial statements axis - INCLUDED`);\n return true;\n }\n\n // Rule 3: If has financialStatementsTypeAxis, show only if at least one member matches\n if (hasMatchingMember) {\n // console.log(`✅ ${section.title}: Has matching member - INCLUDED`);\n } else {\n //console.log(`❌ ${section.title}: Has axis but no matching member - EXCLUDED`);\n }\n return hasMatchingMember;\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 }\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 }\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 }\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 }\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, periodPreferences } = event.detail;\n this._selectedRoleIds = selectedRoleIds;\n \n // Store period preferences and reinitialize form if preferences changed\n const preferencesChanged = JSON.stringify(this._periodPreferences) !== JSON.stringify(periodPreferences);\n if (preferencesChanged) {\n this._periodPreferences = periodPreferences;\n console.log('📊 Period preferences updated:', this._periodPreferences);\n // Reinitialize the form with new preferences\n this._initializeForm();\n } else {\n this._applyRoleFilter();\n }\n \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 periodPreferences\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 = request.instantDate || '';\n description = '';\n } else if (request.periodType === 'duration' || request.periodType === 'mixed') {\n title = `${request.startDate} / ${request.endDate}`;\n description = '';\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\n // Admin mode: Update and print presentation data\n if (this.mode === 'admin') {\n this._handleAdminModeSubmit();\n return;\n }\n\n // Input form mode: Regular validation and submission\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 // Get column to check for period dates (for previous year columns)\n const column = this._findColumnByIdInAllSections(columnId);\n alert('hi');\n console.log(`🔍 [Submission] Concept: ${concept.id}, Column: ${columnId}, Column Period: ${column?.periodStartDate || 'none'} - ${column?.periodEndDate || 'none'}`);\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: column?.periodEndDate || field.periodStartDate || this.periodStartDate }\n : { \n startDate: column?.periodStartDate || field.periodStartDate || this.periodStartDate,\n endDate: column?.periodEndDate || field.periodEndDate || this.periodEndDate\n })\n }\n };\n\n // Add dimension information if available\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, dimension, AND period\n const periodKey = entry.period.type === 'instant' \n ? entry.period.date \n : `${entry.period.startDate}_${entry.period.endDate}`;\n const key = `${entry.conceptId}_${entry.value}_${entry.dimension || 'no-dimension'}_${periodKey}`;\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 // Priority: column period dates > field period dates > form default dates\n if (concept.periodType === 'instant') {\n // For instant concepts, use a single date\n submissionEntry.period.date = column?.periodEndDate || field.periodStartDate || this.periodStartDate;\n } else {\n // For duration concepts, use start and end dates\n submissionEntry.period.startDate = column?.periodStartDate || field.periodStartDate || this.periodStartDate;\n submissionEntry.period.endDate = column?.periodEndDate || field.periodEndDate || this.periodEndDate;\n }\n \n // Debug log period dates\n console.log(`🔍 [Submission] Concept: ${concept.id}, Column: ${field.columnId}, Column Period: ${column?.periodStartDate || 'none'} - ${column?.periodEndDate || 'none'}, Used Period: ${submissionEntry.period.type === 'instant' ? submissionEntry.period.date : `${submissionEntry.period.startDate} - ${submissionEntry.period.endDate}`}`);\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 private _handleSidePanelRoleClick(roleId: string) {\n this._activeSidePanelRoleId = roleId;\n }\n\n private _renderAdminModeContent(section?: FormSection) {\n if (!section) {\n return html`\n <div class=\"admin-mode-container\">\n <p>No role selected</p>\n </div>\n `;\n }\n\n const showPreviousYearChecked = this._adminRoleConfigs[section.id]?.showPreviousYear ?? section.showPreviousYear ?? false;\n const instantChecked = this._adminRoleConfigs[section.id]?.instant ?? section.instant ?? false;\n const durationChecked = this._adminRoleConfigs[section.id]?.duration ?? section.duration ?? false;\n \n // Check if role has mixed period types\n const hasMixedPeriodTypes = section.showPeriodControl === true;\n \n return html`\n <div class=\"admin-mode-container\">\n <h2 class=\"admin-mode-title\">Role Configuration: ${section.title}</h2>\n <div class=\"admin-roles-list\">\n <div class=\"admin-role-item\">\n <div class=\"admin-role-checkbox\">\n <input\n type=\"checkbox\"\n id=\"admin-prev-year-${section.id}\"\n .checked=\"${showPreviousYearChecked}\"\n @change=\"${(e: Event) => this._handleAdminCheckboxChange(section.id, 'showPreviousYear', (e.target as HTMLInputElement).checked)}\"\n />\n <label for=\"admin-prev-year-${section.id}\">Show Previous Year Column</label>\n </div>\n </div>\n \n ${hasMixedPeriodTypes ? html`\n <div class=\"admin-role-item\">\n <div class=\"admin-role-checkbox\">\n <input\n type=\"checkbox\"\n id=\"admin-instant-${section.id}\"\n .checked=\"${instantChecked}\"\n @change=\"${(e: Event) => this._handleAdminCheckboxChange(section.id, 'instant', (e.target as HTMLInputElement).checked)}\"\n />\n <label for=\"admin-instant-${section.id}\">Show Instant Column</label>\n </div>\n </div>\n \n <div class=\"admin-role-item\">\n <div class=\"admin-role-checkbox\">\n <input\n type=\"checkbox\"\n id=\"admin-duration-${section.id}\"\n .checked=\"${durationChecked}\"\n @change=\"${(e: Event) => this._handleAdminCheckboxChange(section.id, 'duration', (e.target as HTMLInputElement).checked)}\"\n />\n <label for=\"admin-duration-${section.id}\">Show Duration Column</label>\n </div>\n </div>\n ` : ''}\n </div>\n </div>\n `;\n }\n\n private _handleAdminCheckboxChange(roleId: string, field: 'showPreviousYear' | 'instant' | 'duration', checked: boolean) {\n const currentConfig = this._adminRoleConfigs[roleId] || { showPreviousYear: false };\n this._adminRoleConfigs = {\n ...this._adminRoleConfigs,\n [roleId]: {\n ...currentConfig,\n [field]: checked\n }\n };\n }\n\n private _handleAdminModeSubmit() {\n if (!this.xbrlInput?.presentation?.[0]?.roles) {\n console.error('No presentation data available');\n return;\n }\n\n // Create a deep copy of the presentation data\n const updatedPresentationData = JSON.parse(JSON.stringify(this.xbrlInput.presentation[0]));\n\n // Get IDs of selected roles (roles that user can configure in admin mode)\n const selectedRoleIds = new Set(\n this._currentSchema?.sections.map(s => s.id) || []\n );\n\n // Update each role with the new settings\n updatedPresentationData.roles = updatedPresentationData.roles.map((role: any) => {\n const isSelected = selectedRoleIds.has(role.id);\n const config = this._adminRoleConfigs[role.id];\n \n const updatedRole: any = {\n ...role,\n display: isSelected ? 'yes' : 'no'\n };\n \n // Only update configuration for selected roles\n if (config !== undefined && isSelected) {\n updatedRole.showPreviousYear = config.showPreviousYear;\n \n // Only add instant and duration if they were explicitly set\n if (config.instant !== undefined) {\n updatedRole.instant = config.instant;\n }\n if (config.duration !== undefined) {\n updatedRole.duration = config.duration;\n }\n }\n \n return updatedRole;\n });\n\n // Print the updated presentation data\n //console.log('📋 Updated Presentation Data:'+updatedPresentationData.roles[0].display);\n \n //console.log(JSON.stringify(updatedPresentationData, null, 2));\n\n // Emit custom event with updated data\n this.dispatchEvent(new CustomEvent('admin-config-updated', {\n detail: {\n presentationData: updatedPresentationData,\n roleConfigs: this._adminRoleConfigs\n },\n bubbles: true,\n composed: true\n }));\n\n console.log('✅ Admin configuration saved successfully');\n }\n\n private _renderAccordionLayout(schema: XBRLFormSchema, config: ComponentConfig, showValidationSummary: boolean, errorCount: number) {\n return html`\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 (hidden in admin mode) -->\n ${this.mode === 'admin' ? schema.sections.map((section, index) => html`\n <div class=\"admin-mode-placeholder\">\n ${this._renderAdminModeContent(section)}\n </div>\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 }\n\n private _renderSidePanelLayout(schema: XBRLFormSchema, config: ComponentConfig, showValidationSummary: boolean, errorCount: number) {\n // Use filtered sections instead of all sections\n const visibleSections = schema.sections;\n \n // Select first visible role by default if none selected or if current selection is not visible\n if (!this._activeSidePanelRoleId || !visibleSections.find(s => s.id === this._activeSidePanelRoleId)) {\n this._activeSidePanelRoleId = visibleSections.length > 0 ? visibleSections[0].id : null;\n }\n\n const activeSection = visibleSections.find(s => s.id === this._activeSidePanelRoleId);\n\n return html`\n <div class=\"side-panel-layout\">\n <!-- Left: Roles List (filtered) -->\n <div class=\"side-panel-roles-list\">\n ${visibleSections.map(section => html`\n <div \n class=\"side-panel-role-item ${section.id === this._activeSidePanelRoleId ? 'active' : ''}\"\n @click=\"${() => this._handleSidePanelRoleClick(section.id)}\"\n >\n ${section.title}\n </div>\n `)}\n </div>\n\n <!-- Right: Active Section Content -->\n <div class=\"side-panel-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 <!-- Active Section (hidden in admin mode) -->\n ${this.mode === 'admin' ? html`\n <div class=\"admin-mode-placeholder\">\n ${this._renderAdminModeContent(activeSection)}\n </div>\n ` : activeSection ? html`\n <jupiter-form-section\n .section=\"${activeSection}\"\n .columns=\"${activeSection.columns || this._columns}\"\n .formData=\"${this._formData}\"\n .typedMemberData=\"${this._typedMemberData}\"\n .disabled=\"${this.disabled || this.readonly}\"\n .collapsible=\"${false}\"\n .hideHeader=\"${true}\"\n .locale=\"${config.locale || 'en-US'}\"\n .isFirstSection=\"${true}\"\n .availableDimensions=\"${this._getAvailableDimensionsForSection(activeSection.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 ` : html`\n <div class=\"no-roles-message\">\n <h3>No Role Selected</h3>\n <p>Please select a role from the list on the left.</p>\n </div>\n `}\n </div>\n </div>\n </div>\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 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 - Hidden in side panel mode -->\n ${this.display !== 'sidePanel' ? html`\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\n <!-- Form Content -->\n ${this.display === 'sidePanel' ? this._renderSidePanelLayout(schema, config, showValidationSummary, errorCount) : this._renderAccordionLayout(schema, config, showValidationSummary, errorCount)}\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 .periodPreferences=\"${this._periodPreferences}\"\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';\nexport * from './utils/type-input-mapping';\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","periodPreferences","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","rolePreferences","columns","generateDefaultColumnsForRole","roleInfo","availableColumnIds","col","conceptTrees","presentationLinkbase","concepts","conceptTree","buildConceptTree","expanded","roleURI","originalRole","showPeriodControl","showPreviousYear","instant","duration","level","label","getPreferredLabel","labels","fields","elementAbstract","columnIds","colId","isInstantColumn","includes","isDurationColumn","some","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","filterColumnsByPeriodPreferences","filteredColumns","previousYearColumns","generatePreviousYearColumns","getPreviousYearDate","dateString","date","setFullYear","getFullYear","currentYearColumns","prevStartDate","prevEndDate","column","index","prevTitle","prevDescription","prevId","dimensionData","dimensionId","preferences","isDuration","isInstant","_d","_c","showDuration","showInstant","dimension","typedMember","members","axisLabel","dimensionInfo","axisId","typedMemberId","dimensionKey","dimensionIdKey","memberId","memberValue","memberLabel","axis","memberKey","hasTypedMembers","typedMembers","firstMember","validDimensions","dimensionInfos","isTyped","allMembers","getAllDimensionMembers","member","combinations","generateDimensionCombinations","combination","columnTitle","join","domainMembers","firstDimension","restDimensions","restCombinations","restCombination","formatDateForDisplay","year","month","day","pathParts","pathname","extractRoleOrder","parseInt","buildColumnsFromHypercubes","TYPE_INPUT_MAP","htmlInputType","allowDecimals","step","min","max","getInputTypeForConceptType","conceptType","lowerType","isNonNegative","isTextareaType","isCheckboxType","isNumericType","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","typeConfig","effectiveFieldType","html","options","option","inputType","_getInputType","render","showLabel","css","__decorateClass","property","customElement","JupiterConceptTree","formData","expandedConcepts","_expanded","_toggleExpanded","_getFieldForColumn","_getFieldValue","_handleFieldChange","stopPropagation","hasChildren","isAbstract","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","hideHeader","_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","_handleConceptExpand","allConceptIds","every","_getTypedMemberHeaderValue","_handleTypedMemberHeaderChange","JupiterFilterRolesDialog","availableRoles","selectedRoleIds","_tempSelectedRoles","_searchQuery","_filteredRoles","_tempPeriodPreferences","_initializeTempSelection","_initializePeriodPreferences","_updateFilteredRoles","query","filtered","titleMatch","idMatch","descriptionMatch","uriMatch","_searchInRoleURI","uriPattern","titleHasURI","idHasURI","_handleSearchInput","_clearSearch","searchInput","querySelector","focus","_highlightSearchTerm","text","regex","_renderHighlightedText","_getSelectedFilteredCount","existingPrefs","hasMixedPeriods","_hasConceptsWithPeriodType","checkConcepts","_handlePeriodCheckboxChange","checkbox","newPreferences","_handleCheckboxChange","newSelection","_selectAll","_selectNone","_selectAllGlobal","_selectNoneGlobal","_resetToOriginal","_handleApply","selectedRoles","_handleBackdropClick","selectedCount","totalCount","filteredCount","hasSearchQuery","showPeriodControls","JupiterDynamicForm","config","initialData","readonly","display","financialStatementsTypeAxis","_formData","_preservedFormData","_typedMemberData","_preservedTypedMemberData","_columns","_dirty","_valid","_submitted","_allSections","_selectedRoleIds","_showFilterDialog","_periodPreferences","_activeSidePanelRoleId","_adminRoleConfigs","_initializeForm","_initializePeriodPreferencesFromData","_currentSchema","_filterRolesByFinancialStatementsType","_applyRoleFilter","_getDefaultSchema","_getDefaultColumns","schema","_validateForm","_preserveDataForHiddenSections","filteredSections","_restoreDataForVisibleSections","hasFinancialStatementsAxis","hasMatchingMember","financialStatementsTypeDimension","dim","conceptNameParts","filterValue","filterParts","filterMemberValue","_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","_e","newColumn","hasTypedDimensions","_replicateFieldsForNewColumn","_removeColumnDataFromConcepts","_shouldCreateFieldForConcept","formBuilder","_replicateFieldsForSection","existingField","_addColumn","_handleSubmit","_handleAdminModeSubmit","submissionData","_generateSubmissionData","data","_handleSaveDraft","draftData","_processConceptsForSubmission","_includePreservedDataInSubmission","_removeDuplicateSubmissions","conceptData","originalConcept","_findConceptInAllSections","originalSection","_findSectionForConcept","_addConceptDataToSubmission","_findConceptInSection","found","_findColumnByIdInAllSections","alert","entry","period","uniqueEntries","periodKey","key","_findColumnById","_findColumnByIdInSection","_getTypedMemberNameForAxis","sectionRoleId","_doesConceptApplyToTypedDimension","conceptIdToCheck","conceptIds","_getApplicableTypedDimensions","typedDimensions","targetRole","sectionTitle","fieldValue","submissionEntry","applicableTypedDimensions","filteredTypedMembers","allTypedMemberData","memberName","_handleReset","_getFormState","touched","dirty","submitted","_handleSidePanelRoleClick","_renderAdminModeContent","showPreviousYearChecked","instantChecked","durationChecked","hasMixedPeriodTypes","_handleAdminCheckboxChange","currentConfig","updatedPresentationData","updatedRole","roleConfigs","composed","_renderAccordionLayout","showValidationSummary","errorCount","collapsibleSections","_renderSidePanelLayout","activeSection","getData","setData","validate","reset","getState"],"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/utils/type-input-mapping.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 * @param periodPreferences - User preferences for which period columns to show per role\n */\n static buildFormSchema(\n xbrlInput: XBRLFormInput, \n periodStartDate?: string, \n periodEndDate?: string,\n language: string = 'en',\n periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }>\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, periodPreferences);\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 periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }>\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 rolePreferences = periodPreferences?.[role.id];\n const columns = this.generateDefaultColumnsForRole(role, periodStartDate || '2025-01-01', periodEndDate || '2025-12-31', hypercubeRole, nonAbstractConcepts, periodTypes, rolePreferences);\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 showPeriodControl: periodTypes.size > 1,\n showPreviousYear: (role as any).showPreviousYear === true, // Read from presentation.json\n instant: (role as any).instant === true, // Read from presentation.json\n duration: (role as any).duration === true // Read from presentation.json\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 // Check if this column matches the concept's period type\n const isInstantColumn = colId.includes('instant') || colId === 'instant';\n const isDurationColumn = colId.includes('duration') || colId === 'duration';\n \n if (concept.periodType === 'instant') {\n // Instant concept should only appear in instant columns\n return isInstantColumn;\n } else if (concept.periodType === 'duration') {\n // Duration concept should only appear in duration columns\n return isDurationColumn;\n } else {\n // If concept has no period type, include columns that are neither instant nor duration\n // or include all if none of the columns have period type indicators\n return !isInstantColumn && !isDurationColumn;\n }\n });\n \n // If no columns match the period type but columns exist, don't create any fields\n // This prevents showing duration concepts in instant columns and vice versa\n if (columnIds.length === 0 && roleInfo.availableColumnIds.length > 0) {\n // Check if available columns are period-specific\n const hasPeriodColumns = roleInfo.availableColumnIds.some(colId => \n colId.includes('instant') || colId.includes('duration')\n );\n \n // Only fall back if there are no period-specific columns\n if (!hasPeriodColumns) {\n columnIds = roleInfo.availableColumnIds;\n }\n // Otherwise, keep columnIds empty to prevent creating fields\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 type: concept.type, // XBRL concept type for input field rendering\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 periodPreferences?: { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }\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 \n // Filter columns based on period preferences\n if (periodPreferences) {\n dimensionColumns = this.filterColumnsByPeriodPreferences(dimensionColumns, periodPreferences);\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 end date\n //console.log('📅 All concepts are instant type, creating single column');\n columns.push({\n id: 'instant',\n title: periodEndDate,\n description: '',\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: `${periodStartDate} / ${periodEndDate}`,\n description: '',\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: `${periodStartDate} / ${periodEndDate}`,\n description: '',\n type: 'base',\n order: 0,\n removable: false\n });\n \n // Instant column using periodEndDate as the instant date\n columns.push({\n id: 'instant',\n title: periodEndDate,\n description: '',\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 \n // Apply period preferences filter if provided\n let filteredColumns = columns;\n if (periodPreferences) {\n filteredColumns = this.filterColumnsByPeriodPreferences(columns, periodPreferences);\n }\n \n // Generate previous year columns if requested\n if (periodPreferences?.showPreviousYear) {\n const previousYearColumns = this.generatePreviousYearColumns(filteredColumns, periodStartDate, periodEndDate);\n filteredColumns = [...filteredColumns, ...previousYearColumns];\n }\n \n return filteredColumns;\n }\n\n /**\n * Calculate previous year date by subtracting one year\n */\n private static getPreviousYearDate(dateString: string): string {\n try {\n const date = new Date(dateString);\n date.setFullYear(date.getFullYear() - 1);\n return date.toISOString().split('T')[0];\n } catch (error) {\n console.error(`Error calculating previous year for date ${dateString}:`, error);\n return dateString;\n }\n }\n\n /**\n * Generate previous year columns based on current year columns\n */\n private static generatePreviousYearColumns(\n currentYearColumns: FormColumn[],\n periodStartDate: string,\n periodEndDate: string\n ): FormColumn[] {\n const previousYearColumns: FormColumn[] = [];\n const prevStartDate = this.getPreviousYearDate(periodStartDate);\n const prevEndDate = this.getPreviousYearDate(periodEndDate);\n\n currentYearColumns.forEach((column, index) => {\n // Create a previous year version of each column\n let prevTitle = column.title; // Keep original title (dimension labels)\n let prevDescription = '';\n let prevId = '';\n\n // Determine the description and ID based on column type\n if (column.dimensionData) {\n // Column has dimensions - keep the title (dimension labels), update description (date)\n prevTitle = column.title; // Keep dimension labels like \"Commercial\" or \"Commercial | Separate\"\n \n // Update description with previous year dates\n if (column.description && column.description.includes('/')) {\n // Duration column\n prevDescription = `${prevStartDate} / ${prevEndDate}`;\n } else {\n // Instant column\n prevDescription = prevEndDate;\n }\n \n prevId = `${column.id}_prev`;\n } else {\n // Column has no dimensions - title contains the date\n if (column.id === 'instant' || column.id.includes('instant')) {\n prevTitle = prevEndDate;\n prevDescription = '';\n prevId = `instant_prev_${index}`;\n } else if (column.id === 'duration' || column.id.includes('duration')) {\n prevTitle = `${prevStartDate} / ${prevEndDate}`;\n prevDescription = '';\n prevId = `duration_prev_${index}`;\n } else if (column.title.includes('/')) {\n // Duration column with period range\n prevTitle = `${prevStartDate} / ${prevEndDate}`;\n prevDescription = '';\n prevId = `${column.id}_prev`;\n } else {\n // Instant column with single date\n prevTitle = prevEndDate;\n prevDescription = '';\n prevId = `${column.id}_prev`;\n }\n }\n\n previousYearColumns.push({\n ...column,\n id: prevId,\n title: prevTitle,\n description: prevDescription,\n order: column.order + 100, // Place after current year columns\n removable: true,\n periodStartDate: prevStartDate, // Set previous year start date\n periodEndDate: prevEndDate, // Set previous year end date\n dimensionData: column.dimensionData ? {\n ...column.dimensionData,\n dimensionId: `${column.dimensionData.dimensionId}_prev`\n } : undefined\n });\n });\n\n return previousYearColumns;\n }\n\n /**\n * Filter columns based on user's period preferences\n */\n private static filterColumnsByPeriodPreferences(\n columns: FormColumn[],\n preferences: { showDuration: boolean; showInstant: boolean; showPreviousYear?: boolean }\n ): FormColumn[] {\n return columns.filter(column => {\n // Check if column is duration or instant based on its ID or dimensionData\n const isDuration = column.id.includes('duration') || \n column.dimensionData?.dimensionId?.includes('duration');\n const isInstant = column.id.includes('instant') || \n column.dimensionData?.dimensionId?.includes('instant');\n \n // If column is neither duration nor instant, keep it (default columns)\n if (!isDuration && !isInstant) {\n return true;\n }\n \n // Filter based on preferences\n if (isDuration && !preferences.showDuration) {\n return false;\n }\n if (isInstant && !preferences.showInstant) {\n return false;\n }\n \n return true;\n });\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: periodEndDate,\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: `${periodStartDate} / ${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: `${periodStartDate} / ${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: periodEndDate,\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: periodEndDate,\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: `${periodStartDate} / ${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: `${periodStartDate} / ${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: periodEndDate,\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: `${periodStartDate} / ${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: periodEndDate,\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: `${periodStartDate} / ${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: periodEndDate,\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","/**\n * Type-to-Input Field Mapping Configuration\n * \n * This module defines the mapping between XBRL concept types and HTML input field types.\n * The mapping determines which UI control should be rendered for each XBRL data type.\n * \n * Usage:\n * 1. Add new type mappings to the TYPE_INPUT_MAP constant\n * 2. Use getInputTypeForConceptType() to get the appropriate field type\n * 3. Mapping is extensible - add more types as needed\n */\n\nexport type InputFieldType = \n | 'text'\n | 'textarea'\n | 'number'\n | 'decimal'\n | 'integer'\n | 'currency'\n | 'percentage'\n | 'date'\n | 'datetime'\n | 'email'\n | 'url'\n | 'tel'\n | 'boolean'\n | 'select';\n\nexport interface TypeMapping {\n /** The input field type to render */\n fieldType: InputFieldType;\n /** Optional HTML input type attribute (for input elements) */\n htmlInputType?: string;\n /** Whether to allow decimal values (for number fields) */\n allowDecimals?: boolean;\n /** Minimum allowed value (for number fields) */\n min?: number;\n /** Maximum allowed value (for number fields) */\n max?: number;\n /** Step value for number inputs */\n step?: string | number;\n /** Placeholder text suggestion */\n placeholder?: string;\n}\n\n/**\n * Type-to-Input Field Mapping\n * \n * Maps XBRL concept types to appropriate input field configurations.\n * Types are matched in order of specificity (most specific first).\n */\nexport const TYPE_INPUT_MAP: Record<string, TypeMapping> = {\n // ==========================================\n // Dutch XBRL Types (nl-types namespace)\n // ==========================================\n \n // Text area for long-form explanations\n 'nl-types:formattedExplanationItemType': {\n fieldType: 'textarea',\n placeholder: 'Enter detailed explanation...',\n },\n \n // Monetary values without decimals (whole numbers only)\n 'nl-types:monetaryNoDecimals20ItemType': {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: false,\n step: 1,\n placeholder: 'Enter amount (no decimals)',\n },\n \n // ==========================================\n // Standard XBRL Types (xbrli namespace)\n // ==========================================\n \n // Monetary with decimals\n 'xbrli:monetaryItemType': {\n fieldType: 'currency',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: '0.00',\n },\n \n // String/text types\n 'xbrli:stringItemType': {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: 'Enter text',\n },\n \n // Date types\n 'xbrli:dateItemType': {\n fieldType: 'date',\n htmlInputType: 'date',\n },\n \n 'xbrli:dateTimeItemType': {\n fieldType: 'datetime',\n htmlInputType: 'datetime-local',\n },\n \n // Numeric types - integers\n 'xbrli:integerItemType': {\n fieldType: 'integer',\n htmlInputType: 'number',\n allowDecimals: false,\n step: 1,\n placeholder: 'Enter whole number',\n },\n \n 'xbrli:nonNegativeIntegerItemType': {\n fieldType: 'integer',\n htmlInputType: 'number',\n allowDecimals: false,\n min: 0,\n step: 1,\n placeholder: 'Enter positive number',\n },\n \n 'xbrli:positiveIntegerItemType': {\n fieldType: 'integer',\n htmlInputType: 'number',\n allowDecimals: false,\n min: 1,\n step: 1,\n placeholder: 'Enter positive number',\n },\n \n // Numeric types - decimals\n 'xbrli:decimalItemType': {\n fieldType: 'decimal',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 'any',\n placeholder: 'Enter decimal value',\n },\n \n // Shares (typically whole numbers or with limited decimals)\n 'xbrli:sharesItemType': {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: true,\n min: 0,\n step: 0.01,\n placeholder: 'Enter number of shares',\n },\n \n 'xbrli:shares': {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: true,\n min: 0,\n step: 0.01,\n placeholder: 'Enter number of shares',\n },\n \n // Year (gYear)\n 'xbrli:gYearItemType': {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: false,\n min: 1900,\n max: 2100,\n step: 1,\n placeholder: 'YYYY',\n },\n \n // Boolean types\n 'xbrli:booleanItemType': {\n fieldType: 'boolean',\n },\n \n // ==========================================\n // Percentage types\n // ==========================================\n \n 'xbrli:pureItemType': {\n fieldType: 'percentage',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: 'Enter percentage',\n },\n \n 'xbrli:percentItemType': {\n fieldType: 'percentage',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: 'Enter percentage',\n },\n \n // ==========================================\n // Contact/Communication types\n // ==========================================\n \n 'xbrli:emailItemType': {\n fieldType: 'email',\n htmlInputType: 'email',\n placeholder: 'email@example.com',\n },\n \n 'xbrli:urlItemType': {\n fieldType: 'url',\n htmlInputType: 'url',\n placeholder: 'https://example.com',\n },\n \n 'xbrli:telephoneItemType': {\n fieldType: 'tel',\n htmlInputType: 'tel',\n placeholder: '+1 (555) 000-0000',\n },\n};\n\n/**\n * Get input field configuration for a given XBRL concept type\n * \n * @param conceptType - The XBRL concept type (e.g., \"nl-types:monetaryNoDecimals20ItemType\")\n * @returns TypeMapping configuration or default text input\n */\nexport function getInputTypeForConceptType(conceptType: string | undefined): TypeMapping {\n if (!conceptType) {\n return {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: 'Enter value',\n };\n }\n \n // Direct match\n if (TYPE_INPUT_MAP[conceptType]) {\n return TYPE_INPUT_MAP[conceptType];\n }\n \n // Pattern matching for common suffixes\n const lowerType = conceptType.toLowerCase();\n \n // Monetary types\n if (lowerType.includes('monetary')) {\n if (lowerType.includes('nodecimals') || lowerType.includes('no-decimals')) {\n return {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: false,\n step: 1,\n placeholder: 'Enter amount (no decimals)',\n };\n }\n return {\n fieldType: 'currency',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: '0.00',\n };\n }\n \n // Text area types (explanation, description, notes)\n if (lowerType.includes('explanation') || \n lowerType.includes('description') || \n lowerType.includes('notes') ||\n lowerType.includes('formatted')) {\n return {\n fieldType: 'textarea',\n placeholder: 'Enter detailed information...',\n };\n }\n \n // Date types\n if (lowerType.includes('date')) {\n if (lowerType.includes('time')) {\n return {\n fieldType: 'datetime',\n htmlInputType: 'datetime-local',\n };\n }\n return {\n fieldType: 'date',\n htmlInputType: 'date',\n };\n }\n \n // Boolean types\n if (lowerType.includes('boolean') || lowerType.includes('bool')) {\n return {\n fieldType: 'boolean',\n };\n }\n \n // Integer types\n if (lowerType.includes('integer') || lowerType.includes('int')) {\n const isNonNegative = lowerType.includes('nonnegative') || lowerType.includes('non-negative');\n const isPositive = lowerType.includes('positive');\n \n return {\n fieldType: 'integer',\n htmlInputType: 'number',\n allowDecimals: false,\n min: isPositive ? 1 : isNonNegative ? 0 : undefined,\n step: 1,\n placeholder: 'Enter whole number',\n };\n }\n \n // Decimal/numeric types\n if (lowerType.includes('decimal') || \n lowerType.includes('numeric') || \n lowerType.includes('number')) {\n return {\n fieldType: 'decimal',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 'any',\n placeholder: 'Enter decimal value',\n };\n }\n \n // Percentage types\n if (lowerType.includes('percent') || lowerType.includes('pure')) {\n return {\n fieldType: 'percentage',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: 'Enter percentage',\n };\n }\n \n // Default to text input\n return {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: 'Enter value',\n };\n}\n\n/**\n * Check if a field type should display as a textarea\n */\nexport function isTextareaType(fieldType: InputFieldType): boolean {\n return fieldType === 'textarea';\n}\n\n/**\n * Check if a field type should display as a checkbox\n */\nexport function isCheckboxType(fieldType: InputFieldType): boolean {\n return fieldType === 'boolean';\n}\n\n/**\n * Check if a field type is numeric\n */\nexport function isNumericType(fieldType: InputFieldType): boolean {\n return ['number', 'decimal', 'integer', 'currency', 'percentage'].includes(fieldType);\n}\n\n/**\n * Check if a field type should display as a select dropdown\n */\nexport function isSelectType(fieldType: InputFieldType): boolean {\n return fieldType === 'select';\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';\nimport { getInputTypeForConceptType, isTextareaType, isCheckboxType, isNumericType } from '../utils/type-input-mapping';\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 }) conceptType?: string; // XBRL concept type for input type determination\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 // Get type mapping configuration based on concept type\n const typeConfig = getInputTypeForConceptType(this.conceptType);\n \n // Debug logging\n if (this.conceptType) {\n //console.log(`🔍 [FormField] Concept: ${this.conceptId}, Type: ${this.conceptType}, Config:`, typeConfig);\n }\n \n // Determine which field type to use (from type mapping or field.type)\n const effectiveFieldType = typeConfig.fieldType || this.field.type || 'text';\n \n // Handle textarea based on type mapping\n if (effectiveFieldType === 'textarea' || isTextareaType(effectiveFieldType)) {\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=\"${typeConfig.placeholder || this.field.placeholder || ''}\"\n @input=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n ></textarea>\n `;\n }\n\n // Handle select dropdown\n if (effectiveFieldType === 'select' || this.field.type === '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\n // Handle checkbox/boolean based on type mapping\n if (effectiveFieldType === 'boolean' || isCheckboxType(effectiveFieldType)) {\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\n // Handle all other input types (text, number, date, etc.)\n const inputType = typeConfig.htmlInputType || this._getInputType();\n const step = typeConfig.step !== undefined ? typeConfig.step : \n isNumericType(effectiveFieldType) ? 'any' : undefined;\n const min = typeConfig.min;\n const max = typeConfig.max;\n \n return html`\n <input\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n type=\"${inputType}\"\n class=\"${cssClass}\"\n .value=\"${this.value || ''}\"\n ?disabled=\"${this.disabled || this.field.disabled}\"\n placeholder=\"${typeConfig.placeholder || this.field.placeholder || ''}\"\n step=\"${step !== undefined ? step : ''}\"\n min=\"${min !== undefined ? min : ''}\"\n max=\"${max !== undefined ? max : ''}\"\n @input=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\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 .conceptType=\"${this.concept.type}\"\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 @property({ type: Boolean }) hideHeader = false;\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 .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 /* Special styling for the Add Column button-only column */\n .header-cell.add-column-only {\n width: 15%;\n min-width: 100px;\n max-width: 150px;\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 // When expanding the accordion, also expand all trees\n if (this._expanded) {\n this._expandAllTrees();\n }\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 _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 ${!this.hideHeader ? 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\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\"></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 add-column-only\">\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, ConceptTree } from '../schema/types';\n\nexport interface FilterRolesRequest {\n availableRoles: FormSection[];\n currentSelectedRoles: string[];\n}\n\nexport interface RolePeriodPreferences {\n [roleId: string]: {\n showDuration: boolean;\n showInstant: boolean;\n showPreviousYear: boolean;\n };\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 @property({ type: Object }) periodPreferences: RolePeriodPreferences = {};\n\n @state() private _tempSelectedRoles = new Set<string>();\n @state() private _searchQuery = '';\n @state() private _filteredRoles: FormSection[] = [];\n @state() private _tempPeriodPreferences: RolePeriodPreferences = {};\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 .period-controls {\n margin-top: 8px;\n padding: 8px;\n background: var(--jupiter-background-light, #f8f9fa);\n border-radius: 4px;\n border: 1px solid var(--jupiter-border-color, #e0e0e0);\n }\n\n .period-controls-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--jupiter-text-primary, #333);\n margin: 0 0 6px 0;\n }\n\n .period-checkboxes {\n display: flex;\n gap: 16px;\n flex-wrap: wrap;\n }\n\n .period-checkbox-item {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .period-checkbox {\n cursor: pointer;\n }\n\n .period-checkbox-label {\n font-size: 13px;\n color: var(--jupiter-text-primary, #333);\n cursor: pointer;\n user-select: none;\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 this._initializePeriodPreferences();\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 if (changedProperties.has('availableRoles') || changedProperties.has('periodPreferences') || changedProperties.has('open')) {\n this._initializePeriodPreferences();\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 _initializePeriodPreferences() {\n // Initialize period preferences for all roles, preserving existing preferences\n const preferences: RolePeriodPreferences = {};\n this.availableRoles.forEach(role => {\n // Check if we have existing preferences for this role\n const existingPrefs = this.periodPreferences[role.id];\n \n if (existingPrefs) {\n // Preserve existing user preferences\n preferences[role.id] = { ...existingPrefs };\n } else {\n // Initialize defaults for new roles\n // For mixed-period roles, use preset values from presentation data or detect from concepts\n const hasMixedPeriods = role.showPeriodControl === true;\n \n // Read preset values from role data if available, otherwise detect from concepts\n let showDuration: boolean;\n let showInstant: boolean;\n \n if (role.duration !== undefined || role.instant !== undefined) {\n // Use preset values from presentation.json\n showDuration = role.duration === true;\n showInstant = role.instant === true;\n } else {\n // Fallback: detect from concepts\n showDuration = hasMixedPeriods || this._hasConceptsWithPeriodType(role, 'duration');\n showInstant = hasMixedPeriods || this._hasConceptsWithPeriodType(role, 'instant');\n }\n \n preferences[role.id] = {\n showDuration: showDuration,\n showInstant: showInstant,\n showPreviousYear: role.showPreviousYear === true // Read from role data in presentation.json\n };\n }\n });\n this._tempPeriodPreferences = preferences;\n }\n\n private _hasConceptsWithPeriodType(role: FormSection, periodType: 'instant' | 'duration'): boolean {\n const checkConcepts = (concepts: ConceptTree[]): boolean => {\n return concepts.some(concept => {\n if (!concept.abstract && concept.periodType === periodType) {\n return true;\n }\n if (concept.children) {\n return checkConcepts(concept.children);\n }\n return false;\n });\n };\n return checkConcepts(role.concepts);\n }\n\n private _handlePeriodCheckboxChange(event: Event, roleId: string, periodType: 'duration' | 'instant' | 'previousYear') {\n event.stopPropagation();\n const checkbox = event.target as HTMLInputElement;\n \n const newPreferences = { ...this._tempPeriodPreferences };\n if (!newPreferences[roleId]) {\n newPreferences[roleId] = { showDuration: true, showInstant: true, showPreviousYear: false };\n }\n \n if (periodType === 'duration') {\n newPreferences[roleId].showDuration = checkbox.checked;\n } else if (periodType === 'instant') {\n newPreferences[roleId].showInstant = checkbox.checked;\n } else if (periodType === 'previousYear') {\n newPreferences[roleId].showPreviousYear = checkbox.checked;\n }\n \n this._tempPeriodPreferences = newPreferences;\n this.requestUpdate();\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: { \n selectedRoleIds: selectedRoles,\n periodPreferences: this._tempPeriodPreferences\n },\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 const showPeriodControls = role.showPeriodControl === true;\n const preferences = this._tempPeriodPreferences[role.id] || { showDuration: true, showInstant: true };\n \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 \n ${showPeriodControls ? html`\n <div class=\"period-controls\">\n <p class=\"period-controls-label\">Show Period Column:</p>\n <div class=\"period-checkboxes\">\n <label class=\"period-checkbox-item\">\n <input\n type=\"checkbox\"\n class=\"period-checkbox\"\n .checked=\"${preferences.showDuration}\"\n @change=\"${(e: Event) => this._handlePeriodCheckboxChange(e, role.id, 'duration')}\"\n />\n <span class=\"period-checkbox-label\">Duration</span>\n </label>\n <label class=\"period-checkbox-item\">\n <input\n type=\"checkbox\"\n class=\"period-checkbox\"\n .checked=\"${preferences.showInstant}\"\n @change=\"${(e: Event) => this._handlePeriodCheckboxChange(e, role.id, 'instant')}\"\n />\n <span class=\"period-checkbox-label\">Instant</span>\n </label>\n </div>\n </div>\n ` : ''}\n \n <div class=\"period-controls\">\n <p class=\"period-controls-label\">Additional Options:</p>\n <div class=\"period-checkboxes\">\n <label class=\"period-checkbox-item\">\n <input\n type=\"checkbox\"\n class=\"period-checkbox\"\n .checked=\"${preferences.showPreviousYear}\"\n @change=\"${(e: Event) => this._handlePeriodCheckboxChange(e, role.id, 'previousYear')}\"\n />\n <span class=\"period-checkbox-label\">Show previous year</span>\n </label>\n </div>\n </div>\n </div>\n </div>\n `;\n })}\n `}\n </div>\n\n \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 @property({ type: String }) display: 'accordion' | 'sidePanel' = 'accordion';\n @property({ type: String }) mode: 'inputForm' | 'admin' = 'inputForm';\n @property({ type: Array }) \n financialStatementsTypeAxis: string[] = [];\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 @state() private _periodPreferences: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }> = {};\n @state() private _activeSidePanelRoleId: string | null = null;\n @state() private _adminRoleConfigs: Record<string, { showPreviousYear: boolean; instant?: boolean; duration?: boolean }> = {};\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 /* Side Panel Layout Styles */\n .side-panel-layout {\n display: flex;\n height: calc(100vh - 80px); /* Account for footer only */\n gap: 0;\n }\n\n .side-panel-roles-list {\n width: 280px;\n min-width: 280px;\n border-right: 1px solid var(--jupiter-border-color, #ddd);\n overflow-y: auto;\n background: var(--jupiter-background-light, #f8f9fa);\n }\n\n .side-panel-role-item {\n padding: 12px 16px;\n cursor: pointer;\n border-bottom: 1px solid var(--jupiter-border-color, #e0e0e0);\n transition: background-color 0.2s ease;\n font-size: 14px;\n color: var(--jupiter-text-primary, #333);\n line-height: 1.4;\n }\n\n .side-panel-role-item:hover {\n background: var(--jupiter-hover-background, #e8e8e8);\n }\n\n .side-panel-role-item.active {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n font-weight: 500;\n }\n\n .side-panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n }\n\n .side-panel-content .form-sections {\n padding: 24px;\n padding-bottom: 24px;\n }\n\n /* Admin Mode Styles */\n .admin-mode-placeholder {\n padding: 0;\n background: white;\n min-height: 300px;\n }\n\n .admin-mode-container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 24px;\n }\n\n .admin-mode-title {\n font-size: 20px;\n font-weight: 600;\n margin: 0 0 24px 0;\n color: var(--jupiter-text-primary, #333);\n }\n\n .admin-roles-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .admin-role-item {\n display: flex;\n align-items: center;\n padding: 16px;\n background: var(--jupiter-background-light, #f8f9fa);\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 6px;\n transition: background-color 0.2s ease;\n }\n\n .admin-role-item:hover {\n background: var(--jupiter-hover-background, #e8e8e8);\n }\n\n .admin-role-title {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n }\n\n .admin-role-checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: 16px;\n }\n\n .admin-role-checkbox input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n }\n\n .admin-role-checkbox label {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n cursor: pointer;\n user-select: none;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._initializeForm();\n }\n\n updated(changedProperties: Map<string, any>) {\n // Log when financialStatementsTypeAxis changes\n if (changedProperties.has('financialStatementsTypeAxis')) {\n console.log('🔄 financialStatementsTypeAxis changed:', this.financialStatementsTypeAxis);\n }\n \n // Reinitialize form when any of these critical properties change\n if (\n changedProperties.has('xbrlInput') || \n changedProperties.has('schema') ||\n changedProperties.has('language') ||\n changedProperties.has('periodStartDate') ||\n changedProperties.has('periodEndDate') ||\n changedProperties.has('financialStatementsTypeAxis')\n ) {\n this._initializeForm();\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 \n // Initialize period preferences from presentation data BEFORE building schema\n this._initializePeriodPreferencesFromData();\n \n console.log('⚙️ Using period preferences:', this._periodPreferences);\n this._currentSchema = XBRLFormBuilder.buildFormSchema(\n this.xbrlInput, \n this.periodStartDate, \n this.periodEndDate,\n this.language,\n this._periodPreferences\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 // Apply financialStatementsTypeAxis filter if provided\n if (this.financialStatementsTypeAxis && this.financialStatementsTypeAxis.length > 0) {\n console.log('🔍 Applying financialStatementsTypeAxis filter:', this.financialStatementsTypeAxis);\n console.log('📊 Sections before filter:', this._allSections.length);\n this._allSections = this._filterRolesByFinancialStatementsType(this._allSections);\n console.log('📊 Sections after filter:', this._allSections.length);\n }\n \n // Initialize selected roles - select all filtered sections by default\n if (this._selectedRoleIds.length === 0) {\n // Preselect all filtered roles by default\n this._selectedRoleIds = this._allSections.map(section => section.id);\n console.log('✅ Auto-selected all roles:', this._selectedRoleIds.length);\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 /**\n * Initialize period preferences from presentation data\n * Reads showPreviousYear, instant, and duration attributes from each role to set initial preferences\n * Only sets defaults for roles that don't have existing user preferences\n */\n private _initializePeriodPreferencesFromData() {\n if (!this.xbrlInput?.presentation?.[0]?.roles) {\n return;\n }\n\n const preferences: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }> = { ...this._periodPreferences };\n \n this.xbrlInput.presentation[0].roles.forEach(role => {\n // Only set defaults if this role doesn't already have preferences (preserve user selections)\n if (!preferences[role.id]) {\n // Read preset values from role data, with defaults\n const showPreviousYear = (role as any).showPreviousYear === true;\n const instant = (role as any).instant !== undefined ? (role as any).instant === true : true;\n const duration = (role as any).duration !== undefined ? (role as any).duration === true : true;\n \n preferences[role.id] = {\n showDuration: duration,\n showInstant: instant,\n showPreviousYear: showPreviousYear\n };\n \n const presets: string[] = [];\n if (showPreviousYear) presets.push('previous year');\n if (instant) presets.push('instant');\n if (duration) presets.push('duration');\n \n if (presets.length > 0) {\n //console.log(`✅ Auto-configured role \"${role.role}\" with presets: ${presets.join(', ')}`);\n }\n }\n });\n \n this._periodPreferences = preferences;\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 this.requestUpdate();\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 console.log(`📊 Filtered sections: ${filteredSections.length} (IDs: ${filteredSections.map(s => s.id).join(', ')})`);\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 console.log(`✅ Schema updated. Current sections count: ${this._currentSchema.sections.length}`);\n \n // Force re-render to update the UI\n this.requestUpdate();\n }\n\n /**\n * Filter roles based on financialStatementsTypeAxis property\n * Rules:\n * 1. Show roles that have no entry in hypercubes.json\n * 2. Show roles that don't have financialStatementsTypeAxis dimension\n * 3. For roles with financialStatementsTypeAxis, show only if at least one member matches the provided values\n */\n private _filterRolesByFinancialStatementsType(sections: FormSection[]): FormSection[] {\n // If no filter is provided, return all sections\n if (!this.financialStatementsTypeAxis || this.financialStatementsTypeAxis.length === 0) {\n return sections;\n }\n\n if (!this.xbrlInput?.hypercubes || this.xbrlInput.hypercubes.length === 0) {\n return sections;\n }\n\n const hypercubeData = this.xbrlInput.hypercubes[0];\n const financialStatementsAxisId = 'bw2-titel9_FinancialStatementsTypeAxis';\n\n console.log('🔍 Filter values:', this.financialStatementsTypeAxis);\n\n return sections.filter(section => {\n // Find matching hypercube role\n const hypercubeRole = hypercubeData.roles?.find(r => r.roleId === section.id);\n\n // Rule 1: If no hypercube entry exists for this role, show it\n if (!hypercubeRole || !hypercubeRole.items || hypercubeRole.items.length === 0) {\n console.log(`✅ ${section.title}: No hypercube entry - INCLUDED`);\n return true;\n }\n\n // Check if any item has financialStatementsTypeAxis dimension\n let hasFinancialStatementsAxis = false;\n let hasMatchingMember = false;\n\n for (const item of hypercubeRole.items) {\n if (!item.dimensions || item.dimensions.length === 0) {\n // No dimensions means this role should be shown\n continue;\n }\n\n // Find the financialStatementsTypeAxis dimension\n const financialStatementsTypeDimension = item.dimensions.find(\n dim => dim.id === financialStatementsAxisId || dim.conceptName?.includes('FinancialStatementsTypeAxis')\n );\n\n // If this item has the financialStatementsTypeAxis dimension\n if (financialStatementsTypeDimension) {\n hasFinancialStatementsAxis = true;\n\n // Check if any member matches the provided values\n if (financialStatementsTypeDimension.members && financialStatementsTypeDimension.members.length > 0) {\n const itemHasMatch = financialStatementsTypeDimension.members.some(member => {\n // Extract the part after the colon from conceptName\n if (member.conceptName) {\n const conceptNameParts = member.conceptName.split(':');\n const memberValue = conceptNameParts.length > 1 ? conceptNameParts[1] : member.conceptName;\n \n// console.log(` 🔎 Checking member: ${member.conceptName} -> ${memberValue}`);\n \n // Check if this memberValue matches any of our filter values\n const matches = this.financialStatementsTypeAxis.some(filterValue => {\n const filterParts = filterValue.split(':');\n const filterMemberValue = filterParts.length > 1 ? filterParts[1] : filterValue;\n const isMatch = memberValue === filterMemberValue;\n // console.log(` Comparing ${memberValue} === ${filterMemberValue}: ${isMatch}`);\n return isMatch;\n });\n \n return matches;\n }\n \n // Fallback to checking member.id\n return this.financialStatementsTypeAxis.includes(member.id);\n });\n\n if (itemHasMatch) {\n hasMatchingMember = true;\n break; // Found a match, no need to check other items\n }\n }\n }\n }\n\n // Rule 2: If no items have financialStatementsTypeAxis, show the role\n if (!hasFinancialStatementsAxis) {\n //console.log(`✅ ${section.title}: No financial statements axis - INCLUDED`);\n return true;\n }\n\n // Rule 3: If has financialStatementsTypeAxis, show only if at least one member matches\n if (hasMatchingMember) {\n // console.log(`✅ ${section.title}: Has matching member - INCLUDED`);\n } else {\n //console.log(`❌ ${section.title}: Has axis but no matching member - EXCLUDED`);\n }\n return hasMatchingMember;\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 }\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 }\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 }\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 }\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, periodPreferences } = event.detail;\n this._selectedRoleIds = selectedRoleIds;\n \n // Store period preferences and reinitialize form if preferences changed\n const preferencesChanged = JSON.stringify(this._periodPreferences) !== JSON.stringify(periodPreferences);\n if (preferencesChanged) {\n this._periodPreferences = periodPreferences;\n console.log('📊 Period preferences updated:', this._periodPreferences);\n // Reinitialize the form with new preferences\n this._initializeForm();\n } else {\n this._applyRoleFilter();\n }\n \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 periodPreferences\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 = request.instantDate || '';\n description = '';\n } else if (request.periodType === 'duration' || request.periodType === 'mixed') {\n title = `${request.startDate} / ${request.endDate}`;\n description = '';\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\n // Admin mode: Update and print presentation data\n if (this.mode === 'admin') {\n this._handleAdminModeSubmit();\n return;\n }\n\n // Input form mode: Regular validation and submission\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 // Get column to check for period dates (for previous year columns)\n const column = this._findColumnByIdInAllSections(columnId);\n alert('hi');\n console.log(`🔍 [Submission] Concept: ${concept.id}, Column: ${columnId}, Column Period: ${column?.periodStartDate || 'none'} - ${column?.periodEndDate || 'none'}`);\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: column?.periodEndDate || field.periodStartDate || this.periodStartDate }\n : { \n startDate: column?.periodStartDate || field.periodStartDate || this.periodStartDate,\n endDate: column?.periodEndDate || field.periodEndDate || this.periodEndDate\n })\n }\n };\n\n // Add dimension information if available\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, dimension, AND period\n const periodKey = entry.period.type === 'instant' \n ? entry.period.date \n : `${entry.period.startDate}_${entry.period.endDate}`;\n const key = `${entry.conceptId}_${entry.value}_${entry.dimension || 'no-dimension'}_${periodKey}`;\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 // Priority: column period dates > field period dates > form default dates\n if (concept.periodType === 'instant') {\n // For instant concepts, use a single date\n submissionEntry.period.date = column?.periodEndDate || field.periodStartDate || this.periodStartDate;\n } else {\n // For duration concepts, use start and end dates\n submissionEntry.period.startDate = column?.periodStartDate || field.periodStartDate || this.periodStartDate;\n submissionEntry.period.endDate = column?.periodEndDate || field.periodEndDate || this.periodEndDate;\n }\n \n // Debug log period dates\n console.log(`🔍 [Submission] Concept: ${concept.id}, Column: ${field.columnId}, Column Period: ${column?.periodStartDate || 'none'} - ${column?.periodEndDate || 'none'}, Used Period: ${submissionEntry.period.type === 'instant' ? submissionEntry.period.date : `${submissionEntry.period.startDate} - ${submissionEntry.period.endDate}`}`);\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 private _handleSidePanelRoleClick(roleId: string) {\n this._activeSidePanelRoleId = roleId;\n }\n\n private _renderAdminModeContent(section?: FormSection) {\n if (!section) {\n return html`\n <div class=\"admin-mode-container\">\n <p>No role selected</p>\n </div>\n `;\n }\n\n const showPreviousYearChecked = this._adminRoleConfigs[section.id]?.showPreviousYear ?? section.showPreviousYear ?? false;\n const instantChecked = this._adminRoleConfigs[section.id]?.instant ?? section.instant ?? false;\n const durationChecked = this._adminRoleConfigs[section.id]?.duration ?? section.duration ?? false;\n \n // Check if role has mixed period types\n const hasMixedPeriodTypes = section.showPeriodControl === true;\n \n return html`\n <div class=\"admin-mode-container\">\n <h2 class=\"admin-mode-title\">Role Configuration: ${section.title}</h2>\n <div class=\"admin-roles-list\">\n <div class=\"admin-role-item\">\n <div class=\"admin-role-checkbox\">\n <input\n type=\"checkbox\"\n id=\"admin-prev-year-${section.id}\"\n .checked=\"${showPreviousYearChecked}\"\n @change=\"${(e: Event) => this._handleAdminCheckboxChange(section.id, 'showPreviousYear', (e.target as HTMLInputElement).checked)}\"\n />\n <label for=\"admin-prev-year-${section.id}\">Show Previous Year Column</label>\n </div>\n </div>\n \n ${hasMixedPeriodTypes ? html`\n <div class=\"admin-role-item\">\n <div class=\"admin-role-checkbox\">\n <input\n type=\"checkbox\"\n id=\"admin-instant-${section.id}\"\n .checked=\"${instantChecked}\"\n @change=\"${(e: Event) => this._handleAdminCheckboxChange(section.id, 'instant', (e.target as HTMLInputElement).checked)}\"\n />\n <label for=\"admin-instant-${section.id}\">Show Instant Column</label>\n </div>\n </div>\n \n <div class=\"admin-role-item\">\n <div class=\"admin-role-checkbox\">\n <input\n type=\"checkbox\"\n id=\"admin-duration-${section.id}\"\n .checked=\"${durationChecked}\"\n @change=\"${(e: Event) => this._handleAdminCheckboxChange(section.id, 'duration', (e.target as HTMLInputElement).checked)}\"\n />\n <label for=\"admin-duration-${section.id}\">Show Duration Column</label>\n </div>\n </div>\n ` : ''}\n </div>\n </div>\n `;\n }\n\n private _handleAdminCheckboxChange(roleId: string, field: 'showPreviousYear' | 'instant' | 'duration', checked: boolean) {\n const currentConfig = this._adminRoleConfigs[roleId] || { showPreviousYear: false };\n this._adminRoleConfigs = {\n ...this._adminRoleConfigs,\n [roleId]: {\n ...currentConfig,\n [field]: checked\n }\n };\n }\n\n private _handleAdminModeSubmit() {\n if (!this.xbrlInput?.presentation?.[0]?.roles) {\n console.error('No presentation data available');\n return;\n }\n\n // Create a deep copy of the presentation data\n const updatedPresentationData = JSON.parse(JSON.stringify(this.xbrlInput.presentation[0]));\n\n // Get IDs of selected roles (roles that user can configure in admin mode)\n const selectedRoleIds = new Set(\n this._currentSchema?.sections.map(s => s.id) || []\n );\n\n // Update each role with the new settings\n updatedPresentationData.roles = updatedPresentationData.roles.map((role: any) => {\n const isSelected = selectedRoleIds.has(role.id);\n const config = this._adminRoleConfigs[role.id];\n \n const updatedRole: any = {\n ...role,\n display: isSelected ? 'yes' : 'no'\n };\n \n // Only update configuration for selected roles\n if (config !== undefined && isSelected) {\n updatedRole.showPreviousYear = config.showPreviousYear;\n \n // Only add instant and duration if they were explicitly set\n if (config.instant !== undefined) {\n updatedRole.instant = config.instant;\n }\n if (config.duration !== undefined) {\n updatedRole.duration = config.duration;\n }\n }\n \n return updatedRole;\n });\n\n // Print the updated presentation data\n //console.log('📋 Updated Presentation Data:'+updatedPresentationData.roles[0].display);\n \n //console.log(JSON.stringify(updatedPresentationData, null, 2));\n\n // Emit custom event with updated data\n this.dispatchEvent(new CustomEvent('admin-config-updated', {\n detail: {\n presentationData: updatedPresentationData,\n roleConfigs: this._adminRoleConfigs\n },\n bubbles: true,\n composed: true\n }));\n\n console.log('✅ Admin configuration saved successfully');\n }\n\n private _renderAccordionLayout(schema: XBRLFormSchema, config: ComponentConfig, showValidationSummary: boolean, errorCount: number) {\n return html`\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 (hidden in admin mode) -->\n ${this.mode === 'admin' ? schema.sections.map((section, index) => html`\n <div class=\"admin-mode-placeholder\">\n ${this._renderAdminModeContent(section)}\n </div>\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 }\n\n private _renderSidePanelLayout(schema: XBRLFormSchema, config: ComponentConfig, showValidationSummary: boolean, errorCount: number) {\n // Use filtered sections instead of all sections\n const visibleSections = schema.sections;\n \n // Select first visible role by default if none selected or if current selection is not visible\n if (!this._activeSidePanelRoleId || !visibleSections.find(s => s.id === this._activeSidePanelRoleId)) {\n this._activeSidePanelRoleId = visibleSections.length > 0 ? visibleSections[0].id : null;\n }\n\n const activeSection = visibleSections.find(s => s.id === this._activeSidePanelRoleId);\n\n return html`\n <div class=\"side-panel-layout\">\n <!-- Left: Roles List (filtered) -->\n <div class=\"side-panel-roles-list\">\n ${visibleSections.map(section => html`\n <div \n class=\"side-panel-role-item ${section.id === this._activeSidePanelRoleId ? 'active' : ''}\"\n @click=\"${() => this._handleSidePanelRoleClick(section.id)}\"\n >\n ${section.title}\n </div>\n `)}\n </div>\n\n <!-- Right: Active Section Content -->\n <div class=\"side-panel-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 <!-- Active Section (hidden in admin mode) -->\n ${this.mode === 'admin' ? html`\n <div class=\"admin-mode-placeholder\">\n ${this._renderAdminModeContent(activeSection)}\n </div>\n ` : activeSection ? html`\n <jupiter-form-section\n .section=\"${activeSection}\"\n .columns=\"${activeSection.columns || this._columns}\"\n .formData=\"${this._formData}\"\n .typedMemberData=\"${this._typedMemberData}\"\n .disabled=\"${this.disabled || this.readonly}\"\n .collapsible=\"${false}\"\n .hideHeader=\"${true}\"\n .locale=\"${config.locale || 'en-US'}\"\n .isFirstSection=\"${true}\"\n .availableDimensions=\"${this._getAvailableDimensionsForSection(activeSection.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 ` : html`\n <div class=\"no-roles-message\">\n <h3>No Role Selected</h3>\n <p>Please select a role from the list on the left.</p>\n </div>\n `}\n </div>\n </div>\n </div>\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 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 - Hidden in side panel mode -->\n ${this.display !== 'sidePanel' ? html`\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\n <!-- Form Content -->\n ${this.display === 'sidePanel' ? this._renderSidePanelLayout(schema, config, showValidationSummary, errorCount) : this._renderAccordionLayout(schema, config, showValidationSummary, errorCount)}\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 .periodPreferences=\"${this._periodPreferences}\"\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';\nexport * from './utils/type-input-mapping';\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","periodPreferences","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","rolePreferences","columns","generateDefaultColumnsForRole","roleInfo","availableColumnIds","col","conceptTrees","presentationLinkbase","concepts","conceptTree","buildConceptTree","expanded","roleURI","originalRole","showPeriodControl","showPreviousYear","instant","duration","level","label","getPreferredLabel","labels","fields","elementAbstract","columnIds","colId","isInstantColumn","includes","isDurationColumn","some","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","filterColumnsByPeriodPreferences","filteredColumns","previousYearColumns","generatePreviousYearColumns","getPreviousYearDate","dateString","date","setFullYear","getFullYear","currentYearColumns","prevStartDate","prevEndDate","column","index","prevTitle","prevDescription","prevId","dimensionData","dimensionId","preferences","isDuration","isInstant","_d","_c","showDuration","showInstant","dimension","typedMember","members","axisLabel","dimensionInfo","axisId","typedMemberId","dimensionKey","dimensionIdKey","memberId","memberValue","memberLabel","axis","memberKey","hasTypedMembers","typedMembers","firstMember","validDimensions","dimensionInfos","isTyped","allMembers","getAllDimensionMembers","member","combinations","generateDimensionCombinations","combination","columnTitle","join","domainMembers","firstDimension","restDimensions","restCombinations","restCombination","formatDateForDisplay","year","month","day","pathParts","pathname","extractRoleOrder","parseInt","buildColumnsFromHypercubes","TYPE_INPUT_MAP","htmlInputType","allowDecimals","step","min","max","getInputTypeForConceptType","conceptType","lowerType","isNonNegative","isTextareaType","isCheckboxType","isNumericType","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","typeConfig","effectiveFieldType","html","options","option","inputType","_getInputType","render","showLabel","css","__decorateClass","property","customElement","JupiterConceptTree","formData","expandedConcepts","_expanded","_toggleExpanded","_getFieldForColumn","_getFieldValue","_handleFieldChange","stopPropagation","hasChildren","isAbstract","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","hideHeader","_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","_handleConceptExpand","allConceptIds","every","_getTypedMemberHeaderValue","_handleTypedMemberHeaderChange","JupiterFilterRolesDialog","availableRoles","selectedRoleIds","_tempSelectedRoles","_searchQuery","_filteredRoles","_tempPeriodPreferences","_initializeTempSelection","_initializePeriodPreferences","_updateFilteredRoles","query","filtered","titleMatch","idMatch","descriptionMatch","uriMatch","_searchInRoleURI","uriPattern","titleHasURI","idHasURI","_handleSearchInput","_clearSearch","searchInput","querySelector","focus","_highlightSearchTerm","text","regex","_renderHighlightedText","_getSelectedFilteredCount","existingPrefs","hasMixedPeriods","_hasConceptsWithPeriodType","checkConcepts","_handlePeriodCheckboxChange","checkbox","newPreferences","_handleCheckboxChange","newSelection","_selectAll","_selectNone","_selectAllGlobal","_selectNoneGlobal","_resetToOriginal","_handleApply","selectedRoles","_handleBackdropClick","selectedCount","totalCount","filteredCount","hasSearchQuery","showPeriodControls","JupiterDynamicForm","config","initialData","readonly","display","financialStatementsTypeAxis","_formData","_preservedFormData","_typedMemberData","_preservedTypedMemberData","_columns","_dirty","_valid","_submitted","_allSections","_selectedRoleIds","_showFilterDialog","_periodPreferences","_activeSidePanelRoleId","_adminRoleConfigs","_initializeForm","_initializePeriodPreferencesFromData","_currentSchema","_filterRolesByFinancialStatementsType","_applyRoleFilter","_getDefaultSchema","_getDefaultColumns","schema","_validateForm","_preserveDataForHiddenSections","filteredSections","_restoreDataForVisibleSections","hasFinancialStatementsAxis","hasMatchingMember","financialStatementsTypeDimension","dim","conceptNameParts","filterValue","filterParts","filterMemberValue","_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","_e","newColumn","hasTypedDimensions","_replicateFieldsForNewColumn","_removeColumnDataFromConcepts","_shouldCreateFieldForConcept","formBuilder","_replicateFieldsForSection","existingField","_addColumn","_handleSubmit","_handleAdminModeSubmit","submissionData","_generateSubmissionData","data","_handleSaveDraft","draftData","_processConceptsForSubmission","_includePreservedDataInSubmission","_removeDuplicateSubmissions","conceptData","originalConcept","_findConceptInAllSections","originalSection","_findSectionForConcept","_addConceptDataToSubmission","_findConceptInSection","found","_findColumnByIdInAllSections","alert","entry","period","uniqueEntries","periodKey","key","_findColumnById","_findColumnByIdInSection","_getTypedMemberNameForAxis","sectionRoleId","_doesConceptApplyToTypedDimension","conceptIdToCheck","conceptIds","_getApplicableTypedDimensions","typedDimensions","targetRole","sectionTitle","fieldValue","submissionEntry","applicableTypedDimensions","filteredTypedMembers","allTypedMemberData","memberName","_handleReset","_getFormState","touched","dirty","submitted","_handleSidePanelRoleClick","_renderAdminModeContent","showPreviousYearChecked","instantChecked","durationChecked","hasMixedPeriodTypes","_handleAdminCheckboxChange","currentConfig","updatedPresentationData","updatedRole","roleConfigs","composed","_renderAccordionLayout","showValidationSummary","errorCount","collapsibleSections","_renderSidePanelLayout","activeSection","getData","setData","validate","reset","getState"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4]}