jupiter-dynamic-forms 1.12.1 → 1.13.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","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/i18n.ts","../src/services/DraftStorageService.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","import enTranslations from '../i18n/en.json';\nimport nlTranslations from '../i18n/nl.json';\n\nexport type TranslationKey = string;\n\ninterface Translations {\n [key: string]: any;\n}\n\nconst translations: Record<string, Translations> = {\n en: enTranslations,\n nl: nlTranslations\n};\n\n/**\n * I18n utility class for managing translations\n */\nexport class I18n {\n private static currentLanguage: string = 'en';\n \n /**\n * Set the current language\n * @param language Language code ('en' or 'nl')\n */\n static setLanguage(language: string): void {\n if (translations[language]) {\n this.currentLanguage = language;\n } else {\n console.warn(`Language '${language}' not supported, falling back to 'en'`);\n this.currentLanguage = 'en';\n }\n }\n \n /**\n * Get the current language\n */\n static getLanguage(): string {\n return this.currentLanguage;\n }\n \n /**\n * Translate a key to the current language\n * @param key Translation key in dot notation (e.g., 'form.submit')\n * @param params Optional parameters to replace in the translation\n * @returns Translated string\n */\n static t(key: string, params?: Record<string, string | number>): string {\n const keys = key.split('.');\n let value: any = translations[this.currentLanguage];\n \n // Navigate through the nested object\n for (const k of keys) {\n if (value && typeof value === 'object' && k in value) {\n value = value[k];\n } else {\n console.warn(`Translation key '${key}' not found for language '${this.currentLanguage}'`);\n return key; // Return the key itself as fallback\n }\n }\n \n // If we have parameters, replace them in the string\n if (params && typeof value === 'string') {\n return this.interpolate(value, params);\n }\n \n return value;\n }\n \n /**\n * Interpolate parameters into a string\n * Supports {{paramName}} syntax\n */\n private static interpolate(str: string, params: Record<string, string | number>): string {\n return str.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) => {\n return key in params ? String(params[key]) : match;\n });\n }\n \n /**\n * Check if a translation exists for a key\n */\n static has(key: string): boolean {\n const keys = key.split('.');\n let value: any = translations[this.currentLanguage];\n \n for (const k of keys) {\n if (value && typeof value === 'object' && k in value) {\n value = value[k];\n } else {\n return false;\n }\n }\n \n return value !== undefined;\n }\n \n /**\n * Get all available languages\n */\n static getAvailableLanguages(): string[] {\n return Object.keys(translations);\n }\n}\n\n// Export a convenience function\nexport const t = (key: string, params?: Record<string, string | number>) => I18n.t(key, params);\n","import { \n FormData, \n FormSection, \n FormColumn, \n SubmissionData \n} from '../schema/types';\n\n/**\n * Interface for draft metadata - stores the current form state configuration\n */\nexport interface DraftMetadata {\n savedAt: string; // ISO timestamp\n periodStartDate: string;\n periodEndDate: string;\n language: string;\n selectedRoleIds: string[];\n customColumns: CustomColumnMetadata[];\n typedMemberData: { [columnId: string]: { [axisId: string]: string } };\n periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }>; // Period preferences for each role\n schemaVersion?: string;\n}\n\n/**\n * Interface for custom column metadata\n */\nexport interface CustomColumnMetadata {\n sectionId: string;\n columnId: string;\n label: string;\n periodType: 'instant' | 'duration';\n date?: string;\n startDate?: string;\n endDate?: string;\n dimensionData?: any;\n}\n\n/**\n * Interface for complete draft storage\n */\nexport interface DraftStorage {\n formData: SubmissionData; // Same format as submit\n metadata: DraftMetadata;\n version: string; // Storage format version\n}\n\n/**\n * DraftStorageService - Manages saving and loading form drafts\n * \n * Responsibilities:\n * - Save form data to localStorage/sessionStorage\n * - Save form metadata (columns, roles, configuration)\n * - Load saved drafts\n * - Clear draft storage\n * - Validate draft compatibility\n */\nexport class DraftStorageService {\n private readonly DRAFT_DATA_KEY = 'jupiter-form-draft-data';\n private readonly DRAFT_METADATA_KEY = 'jupiter-form-draft-metadata';\n private readonly STORAGE_VERSION = '1.0';\n \n // Use localStorage by default (survives browser restart)\n // Can be switched to sessionStorage if needed\n private _storage: Storage;\n\n constructor(useSessionStorage: boolean = false) {\n this._storage = useSessionStorage ? sessionStorage : localStorage;\n console.log(`💾 DraftStorageService initialized (using ${useSessionStorage ? 'sessionStorage' : 'localStorage'})`);\n }\n\n // ===========================================\n // Public API Methods\n // ===========================================\n\n /**\n * Save complete draft including data and metadata\n */\n saveDraft(\n submissionData: SubmissionData,\n metadata: Omit<DraftMetadata, 'savedAt'>\n ): boolean {\n try {\n const draft: DraftStorage = {\n formData: submissionData,\n metadata: {\n ...metadata,\n savedAt: new Date().toISOString()\n },\n version: this.STORAGE_VERSION\n };\n\n // Save to storage\n this._storage.setItem(this.DRAFT_DATA_KEY, JSON.stringify(draft.formData));\n this._storage.setItem(this.DRAFT_METADATA_KEY, JSON.stringify(draft.metadata));\n\n console.log('✅ Draft saved successfully', {\n entries: submissionData.length,\n timestamp: draft.metadata.savedAt,\n roles: metadata.selectedRoleIds.length,\n customColumns: metadata.customColumns.length\n });\n\n return true;\n } catch (error) {\n console.error('❌ Failed to save draft:', error);\n return false;\n }\n }\n\n /**\n * Load saved draft\n */\n loadDraft(): DraftStorage | null {\n try {\n const dataStr = this._storage.getItem(this.DRAFT_DATA_KEY);\n const metadataStr = this._storage.getItem(this.DRAFT_METADATA_KEY);\n\n if (!dataStr || !metadataStr) {\n console.log('ℹ️ No saved draft found');\n return null;\n }\n\n const formData = JSON.parse(dataStr) as SubmissionData;\n const metadata = JSON.parse(metadataStr) as DraftMetadata;\n\n console.log('✅ Draft loaded successfully', {\n entries: formData.length,\n savedAt: metadata.savedAt,\n roles: metadata.selectedRoleIds.length,\n customColumns: metadata.customColumns.length\n });\n\n return {\n formData,\n metadata,\n version: this.STORAGE_VERSION\n };\n } catch (error) {\n console.error('❌ Failed to load draft:', error);\n return null;\n }\n }\n\n /**\n * Check if a draft exists\n */\n hasDraft(): boolean {\n return this._storage.getItem(this.DRAFT_DATA_KEY) !== null &&\n this._storage.getItem(this.DRAFT_METADATA_KEY) !== null;\n }\n\n /**\n * Get draft metadata only (without full data)\n */\n getDraftMetadata(): DraftMetadata | null {\n try {\n const metadataStr = this._storage.getItem(this.DRAFT_METADATA_KEY);\n if (!metadataStr) return null;\n\n return JSON.parse(metadataStr) as DraftMetadata;\n } catch (error) {\n console.error('❌ Failed to load draft metadata:', error);\n return null;\n }\n }\n\n /**\n * Clear saved draft\n */\n clearDraft(): boolean {\n try {\n this._storage.removeItem(this.DRAFT_DATA_KEY);\n this._storage.removeItem(this.DRAFT_METADATA_KEY);\n console.log('🗑️ Draft cleared successfully');\n return true;\n } catch (error) {\n console.error('❌ Failed to clear draft:', error);\n return false;\n }\n }\n\n /**\n * Get draft age in milliseconds\n */\n getDraftAge(): number | null {\n const metadata = this.getDraftMetadata();\n if (!metadata) return null;\n\n const savedAt = new Date(metadata.savedAt);\n const now = new Date();\n return now.getTime() - savedAt.getTime();\n }\n\n /**\n * Check if draft is older than specified time (in milliseconds)\n */\n isDraftStale(maxAge: number): boolean {\n const age = this.getDraftAge();\n return age !== null && age > maxAge;\n }\n\n /**\n * Extract custom columns from all sections\n */\n extractCustomColumns(allSections: FormSection[]): CustomColumnMetadata[] {\n const customColumns: CustomColumnMetadata[] = [];\n\n allSections.forEach(section => {\n // Check if section has columns\n if (!section.columns || !Array.isArray(section.columns)) {\n return;\n }\n\n section.columns.forEach(column => {\n // Store all columns to preserve exact state\n customColumns.push({\n sectionId: section.id,\n columnId: column.id,\n label: column.title, // FormColumn uses 'title' not 'label'\n periodType: this._inferPeriodTypeFromColumn(column),\n date: column.periodStartDate, // Use periodStartDate for instant\n startDate: column.periodStartDate,\n endDate: column.periodEndDate,\n dimensionData: column.dimensionData\n });\n });\n });\n\n return customColumns;\n }\n\n /**\n * Infer period type from column data\n */\n private _inferPeriodTypeFromColumn(column: FormColumn): 'instant' | 'duration' {\n // If column has both start and end dates, it's duration\n if (column.periodStartDate && column.periodEndDate) {\n return 'duration';\n }\n // Otherwise default to instant\n return 'instant';\n }\n\n /**\n * Create metadata snapshot from current form state\n */\n createMetadataSnapshot(\n periodStartDate: string,\n periodEndDate: string,\n language: string,\n selectedRoleIds: string[],\n allSections: FormSection[],\n typedMemberData: { [columnId: string]: { [axisId: string]: string } },\n periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }>\n ): Omit<DraftMetadata, 'savedAt'> {\n return {\n periodStartDate,\n periodEndDate,\n language,\n selectedRoleIds,\n customColumns: this.extractCustomColumns(allSections),\n typedMemberData,\n periodPreferences,\n schemaVersion: this.STORAGE_VERSION\n };\n }\n\n /**\n * Validate draft compatibility with current schema\n */\n validateDraftCompatibility(draft: DraftStorage, currentPeriodStart: string, currentPeriodEnd: string): {\n compatible: boolean;\n warnings: string[];\n } {\n const warnings: string[] = [];\n\n // Check if period dates match\n if (draft.metadata.periodStartDate !== currentPeriodStart) {\n warnings.push(`Draft period start (${draft.metadata.periodStartDate}) differs from current (${currentPeriodStart})`);\n }\n\n if (draft.metadata.periodEndDate !== currentPeriodEnd) {\n warnings.push(`Draft period end (${draft.metadata.periodEndDate}) differs from current (${currentPeriodEnd})`);\n }\n\n // Check draft age\n const age = this.getDraftAge();\n if (age && age > 7 * 24 * 60 * 60 * 1000) { // 7 days\n warnings.push(`Draft is ${Math.floor(age / (24 * 60 * 60 * 1000))} days old`);\n }\n\n const compatible = warnings.length === 0;\n\n return { compatible, warnings };\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';\nimport { I18n } from '../utils/i18n';\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\">${I18n.t('column.addColumn')}</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\">${I18n.t('column.columnType')}</label>\n <select \n class=\"form-input\"\n .value=\"${this._selectedType}\"\n @change=\"${this._handleSelectedTypeChange}\"\n required\n >\n <option value=\"instant\">${I18n.t('column.instantSingleDate')}</option>\n <option value=\"duration\">${I18n.t('column.durationDates')}</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\">${I18n.t('column.instantDate')}</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\">${I18n.t('column.startPeriodDate')}</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\">${I18n.t('column.endPeriodDate')}</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>${I18n.t('column.availableDimensions')}</h3>\n <p class=\"form-description\">${I18n.t('column.dimensionsDescription')}</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>${I18n.t('column.enterValue')} ${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=\"${I18n.t('column.enterValuePlaceholder')}\"\n />\n </div>\n ` : html`\n <!-- Domain Members Selection -->\n ${dimension.members && dimension.members.length > 0 ? html`\n <div class=\"member-selection\">\n <label>${I18n.t('column.selectMember')}</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\">${I18n.t('column.noMembersAvailable')}</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 ${I18n.t('column.cancel')}\n </button>\n <button \n class=\"btn btn-primary\" \n ?disabled=\"${!isValid}\"\n @click=\"${this._handleConfirm}\"\n >\n ${I18n.t('column.addColumn')}\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 { I18n } from '../utils/i18n';\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: 96%;\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=\"${I18n.t('section.enterPlaceholder')} ${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=\"${I18n.t('column.removeColumn')}\"\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=\"${I18n.t('column.addColumn')}\">\n + ${I18n.t('column.addColumn')}\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';\nimport { I18n } from '../utils/i18n';\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\">${I18n.t('filter.title')}</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 ${I18n.t('filter.description')}\n </p>\n\n <!-- Search Input -->\n <div class=\"search-container\">\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"${I18n.t('filter.searchPlaceholder')}\"\n .value=\"${this._searchQuery}\"\n @input=\"${this._handleSearchInput}\"\n />\n ${this._searchQuery ? html`\n <button class=\"clear-search\" @click=\"${this._clearSearch}\" title=\"${I18n.t('filter.clearSearch')}\">\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 ${I18n.t('filter.showingResults')} ${filteredCount} ${I18n.t('filter.of')} ${totalCount} ${I18n.t('filter.roles')}\n ${filteredCount !== totalCount ? html`${I18n.t('filter.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 ${I18n.t('filter.selectFiltered')} (${filteredCount})\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNone}\">\n ${I18n.t('filter.deselectFiltered')}\n </button>\n <button class=\"selection-control\" @click=\"${this._selectAllGlobal}\">\n ${I18n.t('filter.selectAll')} (${totalCount})\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNoneGlobal}\">\n ${I18n.t('filter.deselectAll')}\n </button>\n ` : html`\n <button class=\"selection-control\" @click=\"${this._selectAll}\">\n ${I18n.t('filter.selectAll')}\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNone}\">\n ${I18n.t('filter.selectNone')}\n </button>\n `}\n <button class=\"selection-control\" @click=\"${this._resetToOriginal}\">\n ${I18n.t('filter.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 ${I18n.t('filter.noRolesFound')} \"${this._searchQuery}\".<br>\n ${I18n.t('filter.tryDifferentSearch')}\n ` : html`\n ${I18n.t('filter.noRolesAvailable')}\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\">${I18n.t('filter.uri')}: ${role.metadata.roleURI}</p>\n ` : ''}\n \n ${showPeriodControls ? html`\n <div class=\"period-controls\">\n <p class=\"period-controls-label\">${I18n.t('filter.showPeriodColumn')}</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\">${I18n.t('filter.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\">${I18n.t('filter.instant')}</span>\n </label>\n </div>\n </div>\n ` : ''}\n \n <div class=\"period-controls\">\n <p class=\"period-controls-label\">${I18n.t('filter.additionalOptions')}</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\">${I18n.t('filter.showPreviousYear')}</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 ${I18n.t('filter.cancel')}\n </button>\n <button \n class=\"btn-primary\" \n @click=\"${this._handleApply}\"\n ?disabled=\"${selectedCount === 0}\"\n >\n ${I18n.t('filter.applyFilter')} (${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 { I18n } from '../utils/i18n';\nimport { AddColumnRequest, AvailableDimension } from './add-column-dialog';\nimport { DraftStorageService } from '../services';\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 // External draft management - allows parent app to provide and receive draft data\n // These properties work bidirectionally:\n // - INPUT: Parent can set these to restore a saved draft\n // - OUTPUT: On save draft event, parent receives updated JSON data to persist\n @property({ type: Object, attribute: 'dynaforms-metadata' }) \n dynaformsMetadata?: any;\n @property({ type: Object, attribute: 'dynaforms-facts' }) \n dynaformsFacts?: any;\n\n @state() private _formData: FormData = {};\n @state() private _draftLoaded = false;\n @state() private _draftLoadedAt?: string;\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 // Draft storage service\n private _draftStorageService!: DraftStorageService;\n private _skipDraftLoading = false; // Flag to skip draft loading during reinitialization\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: 0 24px 24px 24px;\n padding-top: 0;\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 // Initialize I18n language\n if (changedProperties.has('language')) {\n I18n.setLanguage(this.language);\n }\n \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 // Initialize draft storage service\n if (!this._draftStorageService) {\n this._draftStorageService = new DraftStorageService(false); // Use localStorage\n }\n \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 // Check for and load saved draft (skip if reinitialization during preference update)\n if (!this._skipDraftLoading) {\n this._loadDraftIfExists();\n } else {\n console.log('⏭️ Skipping draft loading during preference update');\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 \n // CRITICAL: Capture current form data BEFORE reinitialization to preserve user input\n console.log('💾 Capturing current form data before reinitialization...');\n const currentFormData = this._generateSubmissionData();\n const currentMetadata = this._draftStorageService.createMetadataSnapshot(\n this.periodStartDate,\n this.periodEndDate,\n this.language,\n this._selectedRoleIds,\n this._allSections,\n this._typedMemberData,\n this._periodPreferences\n );\n \n // Save current state to draft storage\n this._draftStorageService.saveDraft(currentFormData, currentMetadata);\n console.log('✅ Current form data saved to draft storage');\n \n // CRITICAL: Skip draft loading during reinitialization to prevent old draft from overriding changes\n this._skipDraftLoading = true;\n this._initializeForm();\n this._skipDraftLoading = false;\n \n // CRITICAL: Restore form data from draft after reinitialization\n console.log('📥 Restoring form data from draft after reinitialization...');\n this._loadDraftIfExists().then(() => {\n console.log('✅ Form data restored successfully after reinitialization');\n }).catch((error) => {\n console.error('❌ Error restoring form data after reinitialization:', error);\n });\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 console.log(`📝 Field change: conceptId=${conceptId}, columnId=${columnId}, value=${value}, fieldId=${fieldId}`);\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 console.log(`💾 Updated formData[${conceptId}]:`, this._formData[conceptId]);\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 console.log('💾 Raw form data before submission generation:', this._formData);\n \n // Generate draft data in the same format as submission\n const draftData = this._generateSubmissionData();\n \n console.log('📤 Generated submission data:', draftData);\n console.log('📊 Submission data breakdown:');\n draftData.forEach((entry, index) => {\n console.log(` [${index}] conceptId: ${entry.conceptId}, columnId: ${entry.columnId}, value: ${entry.value}`);\n });\n \n // Create metadata snapshot\n const metadata = this._draftStorageService.createMetadataSnapshot(\n this.periodStartDate,\n this.periodEndDate,\n this.language,\n this._selectedRoleIds,\n this._allSections,\n this._typedMemberData,\n this._periodPreferences\n );\n\n // Save to localStorage (optional - for browser persistence)\n const saved = this._draftStorageService.saveDraft(draftData, metadata);\n \n // Update the @Input properties with current draft data\n // Consumer application can bind to these properties to persist to database\n this.dynaformsFacts = draftData;\n this.dynaformsMetadata = metadata;\n \n // Emit event with JSON data for consumer application to catch and persist\n this.dispatchEvent(new CustomEvent('form-save-draft', {\n detail: {\n data: this._formData,\n draftData: draftData,\n metadata: metadata,\n saved: saved,\n valid: this._valid,\n errors: this._errors,\n // JSON data ready for external database storage\n dynaformsFacts: draftData,\n dynaformsMetadata: metadata\n },\n bubbles: true,\n composed: true\n }));\n\n console.log('💾 Draft saved - localStorage + event emitted', { \n entries: draftData.length,\n saved: saved,\n roles: this._selectedRoleIds.length,\n customColumns: metadata.customColumns.length,\n eventEmitted: true\n });\n }\n\n // ===========================================\n // Draft Loading & Restoration\n // ===========================================\n\n private async _loadDraftIfExists() {\n console.log('📋 Checking for saved draft...');\n \n // Priority 1: Check if external draft data was provided via properties\n if (this.dynaformsFacts && this.dynaformsMetadata) {\n console.log('📦 Using external draft data from properties');\n const draft = {\n formData: this.dynaformsFacts,\n metadata: this.dynaformsMetadata\n };\n \n await this._restoreFromDraft(draft);\n \n // Set draft loaded state\n this._draftLoaded = true;\n this._draftLoadedAt = this.dynaformsMetadata.savedAt || new Date().toISOString();\n \n // Dispatch event\n this.dispatchEvent(new CustomEvent('form-draft-loaded', {\n detail: {\n draft: draft,\n source: 'external',\n compatible: true,\n warnings: []\n },\n bubbles: true,\n composed: true\n }));\n \n console.log('📥 External draft loaded successfully');\n return;\n }\n \n // Priority 2: Check localStorage\n if (!this._draftStorageService.hasDraft()) {\n console.log('ℹ️ No saved draft found');\n return;\n }\n\n const draft = this._draftStorageService.loadDraft();\n if (!draft) {\n console.warn('⚠️ Failed to load draft');\n return;\n }\n\n // Validate draft compatibility\n const { compatible, warnings } = this._draftStorageService.validateDraftCompatibility(\n draft,\n this.periodStartDate,\n this.periodEndDate\n );\n\n if (warnings.length > 0) {\n console.warn('⚠️ Draft compatibility warnings:', warnings);\n }\n\n // Restore the form state\n await this._restoreFromDraft(draft);\n\n // Dispatch event to notify parent application\n this.dispatchEvent(new CustomEvent('form-draft-loaded', {\n detail: {\n draft: draft,\n compatible: compatible,\n warnings: warnings\n },\n bubbles: true,\n composed: true\n }));\n\n console.log('📥 Draft loaded successfully', {\n entries: draft.formData.length,\n savedAt: draft.metadata.savedAt,\n age: this._draftStorageService.getDraftAge()\n });\n }\n\n private async _restoreFromDraft(draft: any) {\n const { formData, metadata } = draft;\n\n // 1. Restore metadata state\n if (metadata.selectedRoleIds && metadata.selectedRoleIds.length > 0) {\n this._selectedRoleIds = metadata.selectedRoleIds;\n console.log(`🔄 Restored ${this._selectedRoleIds.length} selected roles`);\n }\n\n if (metadata.typedMemberData) {\n this._typedMemberData = metadata.typedMemberData;\n this._preservedTypedMemberData = {}; // Clear preserved typed data when restoring\n console.log('🔄 Restored typed member data');\n }\n\n if (metadata.periodPreferences) {\n this._periodPreferences = metadata.periodPreferences;\n console.log('🔄 Restored period preferences (including previous year settings):', this._periodPreferences);\n \n // CRITICAL: Rebuild schema with restored period preferences\n // This ensures default columns (like previous year) are generated correctly\n if (this.xbrlInput) {\n console.log('🔄 Rebuilding schema with restored period preferences...');\n this._currentSchema = XBRLFormBuilder.buildFormSchema(\n this.xbrlInput,\n this.periodStartDate,\n this.periodEndDate,\n this.language,\n this._periodPreferences\n );\n \n // Update all sections with the rebuilt schema\n this._allSections = [...this._currentSchema.sections];\n \n // Apply financialStatementsTypeAxis filter if needed\n if (this.financialStatementsTypeAxis && this.financialStatementsTypeAxis.length > 0) {\n this._allSections = this._filterRolesByFinancialStatementsType(this._allSections);\n }\n \n console.log('✅ Schema rebuilt with restored period preferences');\n \n // IMPORTANT: After rebuilding, merge any additional custom columns that were manually added\n // (but DON'T replace default columns like duration, instant, previous year)\n if (metadata.customColumns && metadata.customColumns.length > 0) {\n this._mergeAdditionalCustomColumns(metadata.customColumns);\n console.log(`🔄 Merged ${metadata.customColumns.length} additional custom columns`);\n }\n }\n } else {\n // If no period preferences to restore, use the old logic of restoring columns directly\n // 2. Restore custom columns structure (only if schema wasn't rebuilt)\n if (metadata.customColumns && metadata.customColumns.length > 0) {\n this._restoreCustomColumns(metadata.customColumns);\n console.log(`🔄 Restored ${metadata.customColumns.length} custom columns`);\n }\n }\n\n // 2. Convert submission data back to FormData structure\n const restoredFormData: any = {};\n \n formData.forEach((entry: any) => {\n let { conceptId, value, columnId, period } = entry;\n \n // Fallback: Infer columnId from period data if missing (for old draft format)\n if (!columnId && period) {\n columnId = this._inferColumnIdFromPeriod(period, conceptId);\n if (!columnId) {\n console.warn(`⚠️ Could not infer columnId for concept ${conceptId}, skipping...`);\n return;\n }\n }\n \n // Find the actual concept in sections to get the correct ID (might have suffix)\n const actualConceptId = this._findActualConceptId(conceptId);\n const conceptIdToUse = actualConceptId || conceptId;\n \n if (!restoredFormData[conceptIdToUse]) {\n restoredFormData[conceptIdToUse] = {};\n }\n \n restoredFormData[conceptIdToUse][columnId] = value;\n console.log(`📦 Restored: ${conceptIdToUse}[${columnId}] = ${value}`);\n });\n\n // 3. Apply restored data to form data\n this._formData = { ...this._formData, ...restoredFormData };\n console.log(`🔄 Restored ${Object.keys(restoredFormData).length} concepts with data`);\n\n // 4. Apply role filter to show selected sections\n if (this._selectedRoleIds.length > 0) {\n this._applyRoleFilter();\n }\n\n // 5. Mark form as dirty since it has restored data\n this._dirty = true;\n this._touched.clear(); // Clear touched state since this is a restoration\n\n // 6. Validate restored data\n this._validateForm();\n\n // 7. Force a complete re-render by reassigning the sections array\n this._allSections = [...this._allSections];\n this.requestUpdate();\n \n // 8. Wait for the update to complete and all child components to render\n await this.updateComplete;\n \n // 9. Wait a bit more for nested components\n await new Promise(resolve => setTimeout(resolve, 100));\n \n // 10. Now populate the field values\n const fieldCount = this.shadowRoot?.querySelectorAll('input, textarea, select').length || 0;\n console.log(`🔍 Found ${fieldCount} fields in DOM after update`);\n \n if (fieldCount > 0) {\n this._populateFieldValues(restoredFormData);\n } else {\n console.error('❌ No fields found in DOM even after updateComplete');\n }\n\n console.log('✅ Draft restoration completed');\n }\n\n private _findActualConceptId(conceptId: string): string | null {\n // Try to find the concept in all sections\n // The concept might be stored with original ID but field uses suffixed ID\n for (const section of this._allSections) {\n const found = this._findActualConceptIdInTree(section.concepts, conceptId);\n if (found) return found;\n }\n return null;\n }\n\n private _findActualConceptIdInTree(concepts: ConceptTree[], conceptId: string): string | null {\n for (const concept of concepts) {\n // Match by originalConceptId or id\n if (concept.originalConceptId === conceptId || concept.id === conceptId) {\n return concept.id; // Return the actual ID used in fields\n }\n if (concept.children) {\n const found = this._findActualConceptIdInTree(concept.children, conceptId);\n if (found) return found;\n }\n }\n return null;\n }\n\n private _inferColumnIdFromPeriod(period: any, conceptId: string): string | null {\n // Find the concept in all sections\n for (const section of this._allSections) {\n const concept = this._findConceptInSection(section.concepts, conceptId);\n if (concept && section.columns) {\n // Try to match period with available columns\n for (const column of section.columns) {\n const isInstant = period.type === 'instant';\n const isDuration = period.type === 'duration';\n \n if (isInstant && period.date) {\n // Match instant period with column date\n if (column.periodStartDate === period.date || \n (column.periodStartDate === column.periodEndDate && column.periodStartDate === period.date)) {\n console.log(`✓ Inferred columnId: ${column.id} for concept ${conceptId}`);\n return column.id;\n }\n } else if (isDuration && period.startDate && period.endDate) {\n // Match duration period with column date range\n if (column.periodStartDate === period.startDate && column.periodEndDate === period.endDate) {\n console.log(`✓ Inferred columnId: ${column.id} for concept ${conceptId}`);\n return column.id;\n }\n }\n }\n \n // Fallback: Use default column based on period type\n if (period.type === 'instant') {\n const instantCol = section.columns.find(c => c.id === 'instant');\n if (instantCol) return instantCol.id;\n } else {\n const durationCol = section.columns.find(c => c.id === 'duration');\n if (durationCol) return durationCol.id;\n }\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 || concept.originalConceptId === conceptId) {\n return concept;\n }\n if (concept.children) {\n const found = this._findConceptInSection(concept.children, conceptId);\n if (found) return found;\n }\n }\n return null;\n }\n\n private _populateFieldValues(formData: any) {\n let populatedCount = 0;\n let notFoundCount = 0;\n \n console.log('🔍 Starting field population...');\n console.log('📦 Form data to populate:', formData);\n \n // Iterate through all concepts and columns to populate field values\n Object.keys(formData).forEach(conceptId => {\n const conceptData = formData[conceptId];\n \n Object.keys(conceptData).forEach(columnId => {\n const value = conceptData[columnId];\n \n // The field ID format is: conceptId__columnId (double underscore)\n const fieldId = `${conceptId}__${columnId}`;\n \n console.log(`🔍 Looking for field: ${fieldId}`);\n \n // Find the input element by ID\n const fieldElement = this.shadowRoot?.querySelector(`#${CSS.escape(fieldId)}`);\n \n if (fieldElement) {\n if (fieldElement instanceof HTMLInputElement || \n fieldElement instanceof HTMLTextAreaElement || \n fieldElement instanceof HTMLSelectElement) {\n \n if (fieldElement.type === 'checkbox') {\n (fieldElement as HTMLInputElement).checked = Boolean(value);\n } else {\n fieldElement.value = value !== null && value !== undefined ? String(value) : '';\n }\n \n console.log(` ✅ Populated field ${fieldId} with value:`, value);\n populatedCount++;\n }\n } else {\n console.warn(` ❌ Field element NOT FOUND: ${fieldId}`);\n console.warn(` Available fields in DOM:`, Array.from(this.shadowRoot?.querySelectorAll('input, textarea, select') || []).map(el => el.id).filter(id => id.includes(conceptId.split('__')[0])));\n notFoundCount++;\n }\n });\n });\n \n console.log(`✅ Field population complete: ${populatedCount} populated, ${notFoundCount} not found`);\n }\n\n private _restoreCustomColumns(customColumns: any[]) {\n // Group columns by section ID\n const columnsBySection = new Map<string, any[]>();\n \n customColumns.forEach(col => {\n if (!columnsBySection.has(col.sectionId)) {\n columnsBySection.set(col.sectionId, []);\n }\n columnsBySection.get(col.sectionId)!.push(col);\n });\n\n // Apply columns to each section\n this._allSections.forEach(section => {\n const savedColumns = columnsBySection.get(section.id);\n if (savedColumns) {\n // Reconstruct FormColumn objects from saved metadata\n section.columns = savedColumns.map(col => ({\n id: col.columnId,\n title: col.label,\n type: col.dimensionData ? 'dimension' : 'base',\n periodStartDate: col.startDate || col.date,\n periodEndDate: col.endDate || col.date,\n dimensionData: col.dimensionData,\n order: 0,\n removable: col.columnId !== 'duration' && col.columnId !== 'instant'\n }));\n \n // Regenerate fields for concepts to include the restored columns\n this._regenerateFieldsForSection(section);\n \n console.log(` └─ Restored ${savedColumns.length} columns for section ${section.id}`);\n }\n });\n\n // Update current schema with restored sections\n if (this._currentSchema) {\n this._currentSchema = {\n ...this._currentSchema,\n sections: this._allSections\n };\n }\n }\n\n /**\n * Merge additional custom columns that were manually added by user\n * This preserves default columns (duration, instant, previous year) generated by schema builder\n * and only adds custom columns that don't already exist\n */\n private _mergeAdditionalCustomColumns(customColumns: any[]) {\n // Group columns by section ID\n const columnsBySection = new Map<string, any[]>();\n \n customColumns.forEach(col => {\n // Only merge columns that were manually added (e.g., col-123456)\n // Skip default columns like 'duration', 'instant', 'duration_prev', 'instant_prev', 'duration_0', etc.\n const isManuallyAdded = col.columnId.startsWith('col-');\n if (isManuallyAdded) {\n if (!columnsBySection.has(col.sectionId)) {\n columnsBySection.set(col.sectionId, []);\n }\n columnsBySection.get(col.sectionId)!.push(col);\n }\n });\n\n // Add custom columns to each section without replacing existing columns\n this._allSections.forEach(section => {\n const customColumnsForSection = columnsBySection.get(section.id);\n if (customColumnsForSection && customColumnsForSection.length > 0) {\n if (!section.columns) {\n section.columns = [];\n }\n \n // Add each custom column if it doesn't already exist\n customColumnsForSection.forEach(col => {\n const existingColumn = section.columns!.find(c => c.id === col.columnId);\n if (!existingColumn) {\n const newColumn: FormColumn = {\n id: col.columnId,\n title: col.label,\n type: col.dimensionData ? 'dimension' : 'base',\n periodStartDate: col.startDate || col.date,\n periodEndDate: col.endDate || col.date,\n dimensionData: col.dimensionData,\n order: section.columns!.length,\n removable: true\n };\n section.columns!.push(newColumn);\n console.log(` └─ Added custom column ${col.columnId} to section ${section.id}`);\n }\n });\n \n // Regenerate fields for concepts to include the merged columns\n this._regenerateFieldsForSection(section);\n }\n });\n\n // Update current schema with merged sections\n if (this._currentSchema) {\n this._currentSchema = {\n ...this._currentSchema,\n sections: this._allSections\n };\n }\n }\n\n private _regenerateFieldsForSection(section: FormSection) {\n if (!section.columns) return;\n\n // Get period preferences for this section to respect concept filtering\n const sectionPreferences = this._periodPreferences[section.id] || {\n showDuration: true,\n showInstant: true,\n showPreviousYear: false\n };\n\n // Recursively regenerate fields for all concepts\n const regenerateConcepts = (concepts: ConceptTree[]) => {\n concepts.forEach(concept => {\n // Clear existing fields\n concept.fields = [];\n \n // Check if concept should be visible based on period preferences\n const shouldShowConcept = this._shouldShowConceptBasedOnPeriodPreferences(\n concept,\n sectionPreferences\n );\n \n // Only create fields if concept should be visible\n if (shouldShowConcept) {\n // Create fields for each column\n section.columns!.forEach(column => {\n // Only create field if period type matches or is compatible\n const conceptPeriodType = concept.periodType;\n const columnPeriodType = this._inferColumnPeriodType(column);\n \n // Skip abstract concepts without values\n if (concept.abstract) return;\n \n // Check period type compatibility\n if (conceptPeriodType && columnPeriodType) {\n // For instant concepts, only show in instant columns\n // For duration concepts, only show in duration columns\n if (conceptPeriodType !== columnPeriodType) {\n return;\n }\n }\n \n // Create the field\n concept.fields.push({\n id: `${concept.id}_${column.id}`,\n conceptId: concept.id,\n columnId: column.id,\n type: this._mapConceptTypeToFieldType(concept.type),\n label: concept.label,\n periodStartDate: column.periodStartDate,\n periodEndDate: column.periodEndDate\n });\n });\n }\n \n // Recursively process children\n if (concept.children) {\n regenerateConcepts(concept.children);\n }\n });\n };\n \n regenerateConcepts(section.concepts);\n }\n\n /**\n * Check if a concept should be shown based on period preferences\n */\n private _shouldShowConceptBasedOnPeriodPreferences(\n concept: ConceptTree,\n preferences: { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }\n ): boolean {\n // Always show abstract concepts (they're just headers)\n if (concept.abstract) {\n return true;\n }\n\n // If concept has no period type, show it\n if (!concept.periodType) {\n return true;\n }\n\n // Check if the concept's period type matches the preferences\n if (concept.periodType === 'duration' && !preferences.showDuration) {\n return false;\n }\n\n if (concept.periodType === 'instant' && !preferences.showInstant) {\n return false;\n }\n\n return true;\n }\n\n private _inferColumnPeriodType(column: FormColumn): 'instant' | 'duration' | undefined {\n // If both dates are same, it's instant\n if (column.periodStartDate && column.periodEndDate) {\n return column.periodStartDate === column.periodEndDate ? 'instant' : 'duration';\n }\n // If only start date, assume instant\n if (column.periodStartDate && !column.periodEndDate) {\n return 'instant';\n }\n return undefined;\n }\n\n private _mapConceptTypeToFieldType(conceptType?: string): FieldType {\n if (!conceptType) return 'text';\n \n if (conceptType.includes('monetary') || conceptType.includes('Monetary')) {\n return 'number';\n }\n if (conceptType.includes('date') || conceptType.includes('Date')) {\n return 'date';\n }\n if (conceptType.includes('boolean') || conceptType.includes('Boolean')) {\n return 'boolean';\n }\n if (conceptType.includes('integer') || conceptType.includes('Integer')) {\n return 'number';\n }\n if (conceptType.includes('decimal') || conceptType.includes('Decimal')) {\n return 'number';\n }\n \n return 'text';\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 _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 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 columnId: columnId,\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 columnId: field.columnId, // CRITICAL: Include columnId for draft restoration\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\">${I18n.t('validation.summary')}</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>${I18n.t('form.noRoleSelected')}</h3>\n <p>${I18n.t('filter.selectRoles')}</p>\n <p>${I18n.t('filter.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>${I18n.t('form.noRoleSelected')}</h3>\n <p>${I18n.t('form.pleaseSelectRole')}</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>${I18n.t('form.loading')}</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 ? I18n.t('filter.selectRoles') : I18n.t('filter.filterRoles')}\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 ${I18n.t('form.saveDraft')}\n </button>\n \n <button \n class=\"btn-primary\"\n @click=\"${this._handleSubmit}\"\n ?disabled=\"${this.disabled || this.readonly}\"\n >\n ${I18n.t('form.submit')}\n </button>\n\n <div class=\"form-meta\">\n <span>${I18n.t('form.errors')}: ${errorCount}</span>\n <span>${I18n.t('form.modified')}: ${this._dirty ? I18n.t('form.yes') : I18n.t('form.no')}</span>\n <span>${I18n.t('form.valid')}: ${this._valid ? I18n.t('form.yes') : I18n.t('form.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","s","r","n","c","i","h","_a","a","b","section","l","column","axisLabel","dimensionInfo","columns","__decorateClass","property","state","customElement","d","_b","draft","f"],"mappings":"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BAAkB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtC;AACF;AA/kBa,uBAsBJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","x_google_ignoreList":[0,1,2,3,4]}
1
+ {"version":3,"file":"index.mjs","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/i18n.ts","../src/services/DraftStorageService.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 * Format period range for display - shows only year when both dates are in same year\n * @param startDate - Period start date in YYYY-MM-DD format\n * @param endDate - Period end date in YYYY-MM-DD format\n * @returns Formatted period string (e.g., \"2025\" or \"2025-01-01 / 2026-12-31\")\n */\n private static formatPeriodDisplay(startDate: string, endDate: string): string {\n if (!startDate || !endDate) {\n return `${startDate} / ${endDate}`;\n }\n \n const startYear = startDate.substring(0, 4);\n const endYear = endDate.substring(0, 4);\n \n // If both dates are in the same year, show only the year\n if (startYear === endYear) {\n return startYear;\n }\n \n // Otherwise, show the full date range\n return `${startDate} / ${endDate}`;\n }\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 // Use all available columns - period type filtering removed since columns are now merged\n // Each field has its own period controls, so all concepts (instant/duration) can appear in the same column\n columnIds = roleInfo.availableColumnIds;\n } else {\n // Fallback to single default column\n // Since columns are now merged, we use 'duration' as the unified column ID\n columnIds = ['duration'];\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 // Always use 'duration' column since we merged instant and duration into one column per year\n // Each field now has its own period controls, so no need for separate columns\n columnId = 'duration';\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 // Add period information - each field has its own period (defaults from column)\n periodType: (concept.periodType === 'instant' || concept.periodType === 'duration') ? concept.periodType : undefined, // Validate and set the period type\n periodStartDate: periodStartDate || '2025-01-01',\n periodEndDate: periodEndDate || '2025-12-31',\n periodInstantDate: concept.periodType === 'instant' ? (periodEndDate || periodStartDate || '2025-01-01') : undefined\n };\n\n // Debug: Log field creation for specific concepts\n if (concept.id === 'nl-cd_DescriptionLocationNL__a64trl') {\n console.log(`🏗️ [Field Creation] Concept: ${concept.id}, periodType from concept: ${concept.periodType}, Field periodType: ${field.periodType}, ColumnId: ${columnId}`);\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 // Create ONE column per year regardless of period types\n // Since each field now has its own period controls, we don't need separate columns for duration/instant\n if (periodTypes.size === 0) {\n // No period types specified, use single default column\n columns.push({\n id: 'default',\n title: this.formatPeriodDisplay(periodStartDate, periodEndDate),\n description: '',\n type: 'base',\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n } else {\n // Create single column for all period types (duration and instant combined)\n columns.push({\n id: 'duration',\n title: this.formatPeriodDisplay(periodStartDate, periodEndDate),\n description: '',\n type: 'base',\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\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 (always use period range now)\n prevDescription = this.formatPeriodDisplay(prevStartDate, prevEndDate);\n prevId = `${column.id}_prev`;\n } else {\n // Column has no dimensions - always use period range format now\n prevTitle = this.formatPeriodDisplay(prevStartDate, prevEndDate);\n prevDescription = '';\n prevId = `duration_prev_${index}`;\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: false, // User explicitly chose this via filter dialog\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 periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\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 periodStartDate: periodEndDate,\n periodEndDate: periodEndDate\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: this.formatPeriodDisplay(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 periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n } else {\n // All period types - create only ONE column (field-level period controls handle the rest)\n columns.push({\n id: 'typed-duration',\n title: `${axisLabel} [Typed Input Available]`,\n description: this.formatPeriodDisplay(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 periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\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 periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\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 periodStartDate: periodEndDate,\n periodEndDate: periodEndDate\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 periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n } else {\n // All period types - create only ONE column (field-level period controls handle the rest)\n columns.push({\n id: 'duration',\n title: `${dimensionInfo.memberLabel}`,\n description: this.formatPeriodDisplay(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 periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\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 - always create ONE column per combination\n columns.push({\n id: `duration_${index}`,\n title: `${columnTitle}`,\n description: this.formatPeriodDisplay(periodStartDate, periodEndDate),\n type: 'dimension',\n dimensionData: {\n ...dimensionData,\n dimensionId: `duration_${index}`\n },\n order: index,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n });\n \n //console.log(`📊 Generated ${columns.length} multi-dimensional columns`);\n return columns;\n }\n\n /**\n * Get all members including children recursively\n */\n private static getAllDimensionMembers(members: any[]): any[] {\n if (!members || !Array.isArray(members)) {\n return [];\n }\n\n const allMembers: any[] = [];\n \n members.forEach(member => {\n allMembers.push(member);\n \n if (member.children && member.children.length > 0) {\n allMembers.push(...this.getAllDimensionMembers(member.children));\n }\n });\n \n return allMembers;\n }\n\n /**\n * Generate all combinations of dimension members\n */\n private static generateDimensionCombinations(dimensionInfos: any[]): any[] {\n if (dimensionInfos.length === 0) return [];\n if (dimensionInfos.length === 1) {\n return dimensionInfos[0].members.map((member: any) => [{\n axisId: dimensionInfos[0].id,\n axisLabel: dimensionInfos[0].axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: dimensionInfos[0].isTyped || false,\n typedMemberId: dimensionInfos[0].typedMemberId\n }]);\n }\n \n // Generate combinations recursively\n const [firstDimension, ...restDimensions] = dimensionInfos;\n const restCombinations = this.generateDimensionCombinations(restDimensions);\n \n const combinations: any[] = [];\n \n firstDimension.members.forEach((member: any) => {\n if (restCombinations.length === 0) {\n combinations.push([{\n axisId: firstDimension.id,\n axisLabel: firstDimension.axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: firstDimension.isTyped || false,\n typedMemberId: firstDimension.typedMemberId\n }]);\n } else {\n restCombinations.forEach(restCombination => {\n combinations.push([\n {\n axisId: firstDimension.id,\n axisLabel: firstDimension.axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: firstDimension.isTyped || false,\n typedMemberId: firstDimension.typedMemberId\n },\n ...restCombination\n ]);\n });\n }\n });\n \n return combinations;\n }\n\n /**\n * Format date for display in column headers\n */\n private static formatDateForDisplay(dateString: string): string {\n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n });\n } catch {\n return dateString;\n }\n }\n\n /**\n * Extract entity name from entrypoint URL\n */\n private static extractEntityName(entrypoint: string): string {\n try {\n const url = new URL(entrypoint);\n const pathParts = url.pathname.split('/');\n const filename = pathParts[pathParts.length - 1];\n return filename.replace('.xsd', '').replace(/[^a-zA-Z0-9]/g, ' ').trim() || 'Entity';\n } catch {\n return 'Entity';\n }\n }\n\n /**\n * Extract role title from role string\n */\n private static extractRoleTitle(role: string): string {\n // Remove role number prefix like \"[000001] \" and return the title\n const match = role.match(/^\\[[\\d]+\\]\\s*(.+)$/);\n return match ? match[1].trim() : role;\n }\n\n /**\n * Extract role order from role string\n */\n private static extractRoleOrder(role: string): number {\n const match = role.match(/^\\[([\\d]+)\\]/);\n return match ? parseInt(match[1], 10) : 0;\n }\n\n /**\n * Build columns from XBRL hypercube data (placeholder for now)\n */\n static buildColumnsFromHypercubes(/* _hypercubes: any[] */): any[] {\n // For now, return default column structure\n // This will be expanded when we implement hypercube support\n return [{\n id: 'default',\n label: 'Values',\n type: 'data'\n }];\n }\n}\n","import enTranslations from '../i18n/en.json';\nimport nlTranslations from '../i18n/nl.json';\n\nexport type TranslationKey = string;\n\ninterface Translations {\n [key: string]: any;\n}\n\nconst translations: Record<string, Translations> = {\n en: enTranslations,\n nl: nlTranslations\n};\n\n/**\n * I18n utility class for managing translations\n */\nexport class I18n {\n private static currentLanguage: string = 'en';\n \n /**\n * Set the current language\n * @param language Language code ('en' or 'nl')\n */\n static setLanguage(language: string): void {\n if (translations[language]) {\n this.currentLanguage = language;\n } else {\n console.warn(`Language '${language}' not supported, falling back to 'en'`);\n this.currentLanguage = 'en';\n }\n }\n \n /**\n * Get the current language\n */\n static getLanguage(): string {\n return this.currentLanguage;\n }\n \n /**\n * Translate a key to the current language\n * @param key Translation key in dot notation (e.g., 'form.submit')\n * @param params Optional parameters to replace in the translation\n * @returns Translated string\n */\n static t(key: string, params?: Record<string, string | number>): string {\n const keys = key.split('.');\n let value: any = translations[this.currentLanguage];\n \n // Navigate through the nested object\n for (const k of keys) {\n if (value && typeof value === 'object' && k in value) {\n value = value[k];\n } else {\n console.warn(`Translation key '${key}' not found for language '${this.currentLanguage}'`);\n return key; // Return the key itself as fallback\n }\n }\n \n // If we have parameters, replace them in the string\n if (params && typeof value === 'string') {\n return this.interpolate(value, params);\n }\n \n return value;\n }\n \n /**\n * Interpolate parameters into a string\n * Supports {{paramName}} syntax\n */\n private static interpolate(str: string, params: Record<string, string | number>): string {\n return str.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) => {\n return key in params ? String(params[key]) : match;\n });\n }\n \n /**\n * Check if a translation exists for a key\n */\n static has(key: string): boolean {\n const keys = key.split('.');\n let value: any = translations[this.currentLanguage];\n \n for (const k of keys) {\n if (value && typeof value === 'object' && k in value) {\n value = value[k];\n } else {\n return false;\n }\n }\n \n return value !== undefined;\n }\n \n /**\n * Get all available languages\n */\n static getAvailableLanguages(): string[] {\n return Object.keys(translations);\n }\n}\n\n// Export a convenience function\nexport const t = (key: string, params?: Record<string, string | number>) => I18n.t(key, params);\n","import { \n FormData, \n FormSection, \n FormColumn, \n SubmissionData \n} from '../schema/types';\n\n/**\n * Interface for draft metadata - stores the current form state configuration\n */\nexport interface DraftMetadata {\n savedAt: string; // ISO timestamp\n periodStartDate: string;\n periodEndDate: string;\n language: string;\n selectedRoleIds: string[];\n customColumns: CustomColumnMetadata[];\n typedMemberData: { [columnId: string]: { [axisId: string]: string } };\n periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }>; // Period preferences for each role\n periodData?: { [conceptId: string]: { [columnId: string]: { startDate?: string; endDate?: string; instantDate?: string } } }; // Custom field-level period dates\n schemaVersion?: string;\n}\n\n/**\n * Interface for custom column metadata\n */\nexport interface CustomColumnMetadata {\n sectionId: string;\n columnId: string;\n label: string;\n periodType: 'instant' | 'duration';\n date?: string;\n startDate?: string;\n endDate?: string;\n dimensionData?: any;\n}\n\n/**\n * Interface for complete draft storage\n */\nexport interface DraftStorage {\n formData: SubmissionData; // Same format as submit\n metadata: DraftMetadata;\n version: string; // Storage format version\n}\n\n/**\n * DraftStorageService - Manages saving and loading form drafts\n * \n * Responsibilities:\n * - Save form data to localStorage/sessionStorage\n * - Save form metadata (columns, roles, configuration)\n * - Load saved drafts\n * - Clear draft storage\n * - Validate draft compatibility\n */\nexport class DraftStorageService {\n private readonly DRAFT_DATA_KEY = 'jupiter-form-draft-data';\n private readonly DRAFT_METADATA_KEY = 'jupiter-form-draft-metadata';\n private readonly STORAGE_VERSION = '1.0';\n \n // Use localStorage by default (survives browser restart)\n // Can be switched to sessionStorage if needed\n private _storage: Storage;\n\n constructor(useSessionStorage: boolean = false) {\n this._storage = useSessionStorage ? sessionStorage : localStorage;\n console.log(`💾 DraftStorageService initialized (using ${useSessionStorage ? 'sessionStorage' : 'localStorage'})`);\n }\n\n // ===========================================\n // Public API Methods\n // ===========================================\n\n /**\n * Save complete draft including data and metadata\n */\n saveDraft(\n submissionData: SubmissionData,\n metadata: Omit<DraftMetadata, 'savedAt'>\n ): boolean {\n try {\n const draft: DraftStorage = {\n formData: submissionData,\n metadata: {\n ...metadata,\n savedAt: new Date().toISOString()\n },\n version: this.STORAGE_VERSION\n };\n\n // Save to storage\n this._storage.setItem(this.DRAFT_DATA_KEY, JSON.stringify(draft.formData));\n this._storage.setItem(this.DRAFT_METADATA_KEY, JSON.stringify(draft.metadata));\n\n console.log('✅ Draft saved successfully', {\n entries: submissionData.length,\n timestamp: draft.metadata.savedAt,\n roles: metadata.selectedRoleIds.length,\n customColumns: metadata.customColumns.length\n });\n\n return true;\n } catch (error) {\n console.error('❌ Failed to save draft:', error);\n return false;\n }\n }\n\n /**\n * Load saved draft\n */\n loadDraft(): DraftStorage | null {\n try {\n const dataStr = this._storage.getItem(this.DRAFT_DATA_KEY);\n const metadataStr = this._storage.getItem(this.DRAFT_METADATA_KEY);\n\n if (!dataStr || !metadataStr) {\n console.log('ℹ️ No saved draft found');\n return null;\n }\n\n const formData = JSON.parse(dataStr) as SubmissionData;\n const metadata = JSON.parse(metadataStr) as DraftMetadata;\n\n console.log('✅ Draft loaded successfully', {\n entries: formData.length,\n savedAt: metadata.savedAt,\n roles: metadata.selectedRoleIds.length,\n customColumns: metadata.customColumns.length\n });\n\n return {\n formData,\n metadata,\n version: this.STORAGE_VERSION\n };\n } catch (error) {\n console.error('❌ Failed to load draft:', error);\n return null;\n }\n }\n\n /**\n * Check if a draft exists\n */\n hasDraft(): boolean {\n return this._storage.getItem(this.DRAFT_DATA_KEY) !== null &&\n this._storage.getItem(this.DRAFT_METADATA_KEY) !== null;\n }\n\n /**\n * Get draft metadata only (without full data)\n */\n getDraftMetadata(): DraftMetadata | null {\n try {\n const metadataStr = this._storage.getItem(this.DRAFT_METADATA_KEY);\n if (!metadataStr) return null;\n\n return JSON.parse(metadataStr) as DraftMetadata;\n } catch (error) {\n console.error('❌ Failed to load draft metadata:', error);\n return null;\n }\n }\n\n /**\n * Clear saved draft\n */\n clearDraft(): boolean {\n try {\n this._storage.removeItem(this.DRAFT_DATA_KEY);\n this._storage.removeItem(this.DRAFT_METADATA_KEY);\n console.log('🗑️ Draft cleared successfully');\n return true;\n } catch (error) {\n console.error('❌ Failed to clear draft:', error);\n return false;\n }\n }\n\n /**\n * Get draft age in milliseconds\n */\n getDraftAge(): number | null {\n const metadata = this.getDraftMetadata();\n if (!metadata) return null;\n\n const savedAt = new Date(metadata.savedAt);\n const now = new Date();\n return now.getTime() - savedAt.getTime();\n }\n\n /**\n * Check if draft is older than specified time (in milliseconds)\n */\n isDraftStale(maxAge: number): boolean {\n const age = this.getDraftAge();\n return age !== null && age > maxAge;\n }\n\n /**\n * Extract custom columns from all sections\n */\n extractCustomColumns(allSections: FormSection[]): CustomColumnMetadata[] {\n const customColumns: CustomColumnMetadata[] = [];\n\n allSections.forEach(section => {\n // Check if section has columns\n if (!section.columns || !Array.isArray(section.columns)) {\n return;\n }\n\n section.columns.forEach(column => {\n // Store all columns to preserve exact state\n customColumns.push({\n sectionId: section.id,\n columnId: column.id,\n label: column.title, // FormColumn uses 'title' not 'label'\n periodType: this._inferPeriodTypeFromColumn(column),\n date: column.periodStartDate, // Use periodStartDate for instant\n startDate: column.periodStartDate,\n endDate: column.periodEndDate,\n dimensionData: column.dimensionData\n });\n });\n });\n\n return customColumns;\n }\n\n /**\n * Infer period type from column data\n */\n private _inferPeriodTypeFromColumn(column: FormColumn): 'instant' | 'duration' {\n // If column has both start and end dates, it's duration\n if (column.periodStartDate && column.periodEndDate) {\n return 'duration';\n }\n // Otherwise default to instant\n return 'instant';\n }\n\n /**\n * Create metadata snapshot from current form state\n */\n createMetadataSnapshot(\n periodStartDate: string,\n periodEndDate: string,\n language: string,\n selectedRoleIds: string[],\n allSections: FormSection[],\n typedMemberData: { [columnId: string]: { [axisId: string]: string } },\n periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }>,\n periodData?: { [conceptId: string]: { [columnId: string]: { startDate?: string; endDate?: string; instantDate?: string } } }\n ): Omit<DraftMetadata, 'savedAt'> {\n return {\n periodStartDate,\n periodEndDate,\n language,\n selectedRoleIds,\n customColumns: this.extractCustomColumns(allSections),\n typedMemberData,\n periodPreferences,\n periodData,\n schemaVersion: this.STORAGE_VERSION\n };\n }\n\n /**\n * Validate draft compatibility with current schema\n */\n validateDraftCompatibility(draft: DraftStorage, currentPeriodStart: string, currentPeriodEnd: string): {\n compatible: boolean;\n warnings: string[];\n } {\n const warnings: string[] = [];\n\n // Check if period dates match\n if (draft.metadata.periodStartDate !== currentPeriodStart) {\n warnings.push(`Draft period start (${draft.metadata.periodStartDate}) differs from current (${currentPeriodStart})`);\n }\n\n if (draft.metadata.periodEndDate !== currentPeriodEnd) {\n warnings.push(`Draft period end (${draft.metadata.periodEndDate}) differs from current (${currentPeriodEnd})`);\n }\n\n // Check draft age\n const age = this.getDraftAge();\n if (age && age > 7 * 24 * 60 * 60 * 1000) { // 7 days\n warnings.push(`Draft is ${Math.floor(age / (24 * 60 * 60 * 1000))} days old`);\n }\n\n const compatible = warnings.length === 0;\n\n return { compatible, warnings };\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 // Period properties for field-level period control\n @property({ type: String }) periodStartDate?: string;\n @property({ type: String }) periodEndDate?: string;\n @property({ type: String }) periodInstantDate?: string;\n\n @state() private _errors: ValidationError[] = [];\n @state() private _touched = false;\n @state() private _showPeriodPopup = 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-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .period-icon-btn {\n background: transparent;\n border: none;\n cursor: pointer;\n font-size: 16px;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: background-color 0.2s;\n opacity: 0.7;\n }\n\n .period-icon-btn:hover {\n background-color: rgba(0, 0, 0, 0.05);\n opacity: 1;\n }\n\n .period-popup-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n }\n\n .period-popup {\n background: white;\n border-radius: 8px;\n padding: 24px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);\n max-width: 400px;\n width: 90%;\n }\n\n .period-popup-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n }\n\n .period-popup-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--jupiter-text-primary, #333);\n }\n\n .period-popup-close {\n background: transparent;\n border: none;\n font-size: 24px;\n cursor: pointer;\n padding: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: background-color 0.2s;\n }\n\n .period-popup-close:hover {\n background-color: rgba(0, 0, 0, 0.05);\n }\n\n .period-popup-content {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .period-popup-content .period-controls {\n display: grid;\n grid-template-columns: 60px 1fr;\n gap: 12px;\n align-items: center;\n margin-top: 0;\n }\n\n .period-popup-content .period-controls label {\n font-size: 14px;\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n text-align: right;\n }\n\n .period-popup-content .period-controls input[type=\"date\"] {\n padding: 8px 10px;\n font-size: 14px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n }\n\n .period-popup-content .period-controls input[type=\"date\"]: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 {\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 .period-controls {\n margin-top: 4px;\n display: flex;\n gap: 8px;\n align-items: center;\n font-size: 12px;\n }\n\n .period-controls label {\n color: var(--jupiter-text-secondary, #666);\n font-weight: 500;\n font-size: 11px;\n margin: 0;\n }\n\n .period-controls input[type=\"date\"] {\n padding: 4px 6px;\n font-size: 11px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 3px;\n width: 120px;\n }\n\n .period-controls input[type=\"date\"]:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n }\n `;\n\n protected willUpdate(changedProperties: PropertyValues) {\n if (changedProperties.has('value') || changedProperties.has('field')) {\n this._validateField();\n }\n \n // Debug period date changes\n if (changedProperties.has('field') && this.field) {\n if (this.conceptId.includes('DescriptionLocationNL') || this.columnId.startsWith('col-')) {\n console.log(`📅 [FormField willUpdate] Concept ${this.conceptId}, Column ${this.columnId}: field.periodType=${this.field.periodType}, field.periodStartDate=${this.field.periodStartDate}, field.periodEndDate=${this.field.periodEndDate}, field.periodInstantDate=${this.field.periodInstantDate}`);\n }\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 _handlePeriodIconClick() {\n this._showPeriodPopup = true;\n }\n\n private _closePeriodPopup() {\n this._showPeriodPopup = false;\n }\n\n private _handlePopupOverlayClick(e: Event) {\n // Close popup if clicking outside the popup content\n if (e.target === e.currentTarget) {\n this._closePeriodPopup();\n }\n }\n\n private _handlePeriodChange(event: Event, type: 'start' | 'end' | 'instant') {\n const target = event.target as HTMLInputElement;\n const value = target.value;\n\n console.log(`📅 [FormField] Period change detected: type=${type}, value=${value}, conceptId=${this.conceptId}, columnId=${this.columnId}`);\n\n // Update local period values\n if (type === 'instant') {\n this.periodInstantDate = value;\n } else if (type === 'start') {\n this.periodStartDate = value;\n } else if (type === 'end') {\n this.periodEndDate = value;\n }\n\n console.log(`📅 [FormField] Updated local period values: startDate=${this.periodStartDate}, endDate=${this.periodEndDate}, instantDate=${this.periodInstantDate}`);\n\n // Dispatch period change event with composed:true to cross shadow DOM boundaries\n this.dispatchEvent(new CustomEvent('period-change', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n periodType: this.field.periodType,\n periodStartDate: this.periodStartDate,\n periodEndDate: this.periodEndDate,\n periodInstantDate: this.periodInstantDate\n },\n bubbles: true,\n composed: true // CRITICAL: Allows event to cross shadow DOM boundaries\n }));\n \n console.log(`🚀 [FormField] Dispatched period-change event with detail:`, {\n conceptId: this.conceptId,\n columnId: this.columnId,\n periodType: this.field.periodType\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 private _renderPeriodControls() {\n // Debug: Log field period info\n if (this.conceptId === 'nl-cd_DescriptionLocationNL__a64trl') {\n console.log(`🔍 [FormField Render] Concept: ${this.conceptId}, ColumnId: ${this.columnId}, Field periodType: ${this.field.periodType}, Field periodStartDate: ${this.field.periodStartDate}, Field periodEndDate: ${this.field.periodEndDate}`);\n }\n\n // Only show period controls if field has period type defined\n if (!this.field.periodType) {\n return html``;\n }\n\n if (this.field.periodType === 'instant') {\n return html`\n <div class=\"period-controls\">\n <label>Date:</label>\n <input\n type=\"date\"\n .value=\"${this.periodInstantDate || this.field.periodInstantDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'instant')}\"\n ?disabled=\"${this.disabled}\"\n />\n </div>\n `;\n } else if (this.field.periodType === 'duration') {\n return html`\n <div class=\"period-controls\">\n <label>From:</label>\n <input\n type=\"date\"\n .value=\"${this.periodStartDate || this.field.periodStartDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'start')}\"\n ?disabled=\"${this.disabled}\"\n />\n <label>To:</label>\n <input\n type=\"date\"\n .value=\"${this.periodEndDate || this.field.periodEndDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'end')}\"\n ?disabled=\"${this.disabled}\"\n />\n </div>\n `;\n }\n\n return html``;\n }\n\n private _renderPeriodPopup() {\n return html`\n <div class=\"period-popup-overlay\" @click=\"${this._handlePopupOverlayClick}\">\n <div class=\"period-popup\" @click=\"${(e: Event) => e.stopPropagation()}\">\n <div class=\"period-popup-header\">\n <div class=\"period-popup-title\">Edit Period</div>\n <button class=\"period-popup-close\" @click=\"${this._closePeriodPopup}\">\n ×\n </button>\n </div>\n \n <div class=\"period-popup-content\">\n ${this.field.periodType === 'instant' ? html`\n <div class=\"period-controls\">\n <label>Date:</label>\n <input\n type=\"date\"\n .value=\"${this.periodInstantDate || this.field.periodInstantDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'instant')}\"\n ?disabled=\"${this.disabled}\"\n />\n </div>\n ` : html`\n <div class=\"period-controls\">\n <label>From:</label>\n <input\n type=\"date\"\n .value=\"${this.periodStartDate || this.field.periodStartDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'start')}\"\n ?disabled=\"${this.disabled}\"\n />\n </div>\n <div class=\"period-controls\">\n <label>To:</label>\n <input\n type=\"date\"\n .value=\"${this.periodEndDate || this.field.periodEndDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'end')}\"\n ?disabled=\"${this.disabled}\"\n />\n </div>\n `}\n </div>\n </div>\n </div>\n `;\n }\n\n render() {\n const showLabel = !this.hideLabel && this.field.type !== 'boolean';\n const hasPeriodControl = this.field.periodType && (this.field.periodType === 'instant' || this.field.periodType === 'duration');\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 <div class=\"field-wrapper\">\n ${this._renderInput()}\n \n ${hasPeriodControl ? html`\n <button \n class=\"period-icon-btn\" \n type=\"button\"\n @click=\"${this._handlePeriodIconClick}\"\n title=\"Edit period\"\n >\n 📅\n </button>\n ` : ''}\n </div>\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 ${this._showPeriodPopup ? this._renderPeriodPopup() : ''}\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 private _handlePeriodChange(event: CustomEvent) {\n console.log(`🌲 [ConceptTree] Received period-change event:`, event.detail);\n event.stopPropagation();\n // Forward period change event to parent with composed:true for shadow DOM\n this.dispatchEvent(new CustomEvent('period-change', {\n detail: event.detail,\n bubbles: true,\n composed: true // CRITICAL: Allows event to cross shadow DOM boundaries\n }));\n console.log(`🌲 [ConceptTree] Forwarded period-change event to form-section`);\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 .periodStartDate=\"${field.periodStartDate || column.periodStartDate}\"\n .periodEndDate=\"${field.periodEndDate || column.periodEndDate}\"\n .periodInstantDate=\"${field.periodInstantDate || (field.periodType === 'instant' ? (field.periodEndDate || field.periodStartDate) : undefined)}\"\n .disabled=\"${this.disabled}\"\n .locale=\"${this.locale}\"\n .hideLabel=\"${true}\"\n @field-change=\"${this._handleFieldChange}\"\n @period-change=\"${this._handlePeriodChange}\"\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';\nimport { I18n } from '../utils/i18n';\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\">${I18n.t('column.addColumn')}</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\">${I18n.t('column.columnType')}</label>\n <select \n class=\"form-input\"\n .value=\"${this._selectedType}\"\n @change=\"${this._handleSelectedTypeChange}\"\n required\n >\n <option value=\"instant\">${I18n.t('column.instantSingleDate')}</option>\n <option value=\"duration\">${I18n.t('column.durationDates')}</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\">${I18n.t('column.instantDate')}</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\">${I18n.t('column.startPeriodDate')}</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\">${I18n.t('column.endPeriodDate')}</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>${I18n.t('column.availableDimensions')}</h3>\n <p class=\"form-description\">${I18n.t('column.dimensionsDescription')}</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>${I18n.t('column.enterValue')} ${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=\"${I18n.t('column.enterValuePlaceholder')}\"\n />\n </div>\n ` : html`\n <!-- Domain Members Selection -->\n ${dimension.members && dimension.members.length > 0 ? html`\n <div class=\"member-selection\">\n <label>${I18n.t('column.selectMember')}</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\">${I18n.t('column.noMembersAvailable')}</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 ${I18n.t('column.cancel')}\n </button>\n <button \n class=\"btn btn-primary\" \n ?disabled=\"${!isValid}\"\n @click=\"${this._handleConfirm}\"\n >\n ${I18n.t('column.addColumn')}\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 { I18n } from '../utils/i18n';\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 @state() private _openMenuColumnId: string | null = null;\n @state() private _insertAfterColumnId: string | null = null;\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 position: relative;\n overflow: visible;\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 .column-menu-icon {\n position: absolute;\n top: 8px;\n right: 0px;\n width: 24px;\n height: 24px;\n background: transparent;\n color: var(--jupiter-text-secondary, #666);\n border: none;\n font-size: 20px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n transition: all 0.2s ease;\n line-height: 1;\n font-weight: bold;\n padding: 0;\n border-radius: 4px;\n }\n\n .column-menu-icon:hover {\n background: var(--jupiter-background-light, #f0f0f0);\n color: var(--jupiter-text-primary, #333);\n }\n\n .column-context-menu {\n position: absolute;\n top: 32px;\n right: 4px;\n background: white;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n min-width: 150px;\n padding: 4px 0;\n }\n\n .column-context-menu-item {\n padding: 8px 16px;\n cursor: pointer;\n font-size: 14px;\n color: var(--jupiter-text-primary, #333);\n transition: background 0.2s ease;\n border: none;\n background: transparent;\n width: 100%;\n text-align: left;\n display: block;\n }\n\n .column-context-menu-item:hover {\n background: var(--jupiter-background-light, #f5f5f5);\n }\n\n .column-context-menu-item.remove {\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .column-context-menu-item.remove:hover {\n background: var(--jupiter-error-light, #ffebee);\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: 96%;\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 // Close menu when clicking outside\n document.addEventListener('click', () => this._closeColumnMenu());\n }\n \n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener('click', () => this._closeColumnMenu());\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._openMenuColumnId = null; // Close menu\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 _toggleColumnMenu(columnId: string, event: Event) {\n event.stopPropagation();\n this._openMenuColumnId = this._openMenuColumnId === columnId ? null : columnId;\n }\n\n private _closeColumnMenu() {\n this._openMenuColumnId = null;\n }\n\n private _handleAddColumnFromMenu(columnId: string, event: Event) {\n event.stopPropagation();\n this._openMenuColumnId = null; // Close menu\n this._insertAfterColumnId = columnId; // Track after which column to insert\n this._handleAddColumn();\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 and position info\n this.dispatchEvent(new CustomEvent('column-add-request', {\n detail: {\n sectionId: this.section.id,\n columnRequest: event.detail,\n insertAfterColumnId: this._insertAfterColumnId // Include position info\n },\n bubbles: true\n }));\n \n // Reset the insert position\n this._insertAfterColumnId = null;\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 composed: true\n }));\n }\n\n private _handlePeriodChange(event: CustomEvent) {\n console.log(`📋 [FormSection] Received period-change event:`, event.detail);\n event.stopPropagation();\n // Forward period change event to parent (dynamic-form) with composed:true\n this.dispatchEvent(new CustomEvent('period-change', {\n detail: event.detail,\n bubbles: true,\n composed: true // CRITICAL: Allows event to cross shadow DOM boundaries\n }));\n console.log(`📋 [FormSection] Forwarded period-change event to dynamic-form`);\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=\"${I18n.t('section.enterPlaceholder')} ${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 </div>\n \n <!-- Column menu icon (3 vertical dots) -->\n <div \n class=\"column-menu-icon\"\n @click=\"${(e: Event) => this._toggleColumnMenu(column.id, e)}\"\n title=\"${I18n.t('column.columnOptions')}\"\n >⋮</div>\n \n <!-- Context menu -->\n ${this._openMenuColumnId === column.id ? html`\n <div class=\"column-context-menu\">\n <button \n class=\"column-context-menu-item\"\n @click=\"${(e: Event) => this._handleAddColumnFromMenu(column.id, e)}\"\n >\n ${I18n.t('column.addColumn')}\n </button>\n ${column.removable ? html`\n <button \n class=\"column-context-menu-item remove\"\n @click=\"${(e: Event) => {\n e.stopPropagation();\n this._handleRemoveColumn(column.id);\n }}\"\n >\n ${I18n.t('column.removeColumn')}\n </button>\n ` : ''}\n </div>\n ` : ''}\n </th>\n `)}\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 @period-change=\"${this._handlePeriodChange}\"\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';\nimport { I18n } from '../utils/i18n';\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\">${I18n.t('filter.title')}</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 ${I18n.t('filter.description')}\n </p>\n\n <!-- Search Input -->\n <div class=\"search-container\">\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"${I18n.t('filter.searchPlaceholder')}\"\n .value=\"${this._searchQuery}\"\n @input=\"${this._handleSearchInput}\"\n />\n ${this._searchQuery ? html`\n <button class=\"clear-search\" @click=\"${this._clearSearch}\" title=\"${I18n.t('filter.clearSearch')}\">\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 ${I18n.t('filter.showingResults')} ${filteredCount} ${I18n.t('filter.of')} ${totalCount} ${I18n.t('filter.roles')}\n ${filteredCount !== totalCount ? html`${I18n.t('filter.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 ${I18n.t('filter.selectFiltered')} (${filteredCount})\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNone}\">\n ${I18n.t('filter.deselectFiltered')}\n </button>\n <button class=\"selection-control\" @click=\"${this._selectAllGlobal}\">\n ${I18n.t('filter.selectAll')} (${totalCount})\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNoneGlobal}\">\n ${I18n.t('filter.deselectAll')}\n </button>\n ` : html`\n <button class=\"selection-control\" @click=\"${this._selectAll}\">\n ${I18n.t('filter.selectAll')}\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNone}\">\n ${I18n.t('filter.selectNone')}\n </button>\n `}\n <button class=\"selection-control\" @click=\"${this._resetToOriginal}\">\n ${I18n.t('filter.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 ${I18n.t('filter.noRolesFound')} \"${this._searchQuery}\".<br>\n ${I18n.t('filter.tryDifferentSearch')}\n ` : html`\n ${I18n.t('filter.noRolesAvailable')}\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\">${I18n.t('filter.uri')}: ${role.metadata.roleURI}</p>\n ` : ''}\n \n <div class=\"period-controls\">\n <p class=\"period-controls-label\">${I18n.t('filter.additionalOptions')}</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\">${I18n.t('filter.showPreviousYear')}</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 ${I18n.t('filter.cancel')}\n </button>\n <button \n class=\"btn-primary\" \n @click=\"${this._handleApply}\"\n ?disabled=\"${selectedCount === 0}\"\n >\n ${I18n.t('filter.applyFilter')} (${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 { I18n } from '../utils/i18n';\nimport { AddColumnRequest, AvailableDimension } from './add-column-dialog';\nimport { DraftStorageService } from '../services';\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 // External draft management - allows parent app to provide and receive draft data\n // These properties work bidirectionally:\n // - INPUT: Parent can set these to restore a saved draft\n // - OUTPUT: On save draft event, parent receives updated JSON data to persist\n @property({ type: Object, attribute: 'dynaforms-metadata' }) \n dynaformsMetadata?: any;\n @property({ type: Object, attribute: 'dynaforms-facts' }) \n dynaformsFacts?: any;\n\n @state() private _formData: FormData = {};\n @state() private _draftLoaded = false;\n @state() private _draftLoadedAt?: string;\n @state() private _preservedFormData: FormData = {}; // Preserve data for hidden sections\n @state() private _periodData: { [conceptId: string]: { [columnId: string]: { startDate?: string; endDate?: string; instantDate?: string } } } = {}; // Store field-specific periods\n @state() private _preservedPeriodData: { [conceptId: string]: { [columnId: string]: { startDate?: string; endDate?: string; instantDate?: string } } } = {}; // Preserve period 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 _sidePanelSearchQuery = '';\n @state() private _sidePanelCollapsed = false;\n @state() private _adminRoleConfigs: Record<string, { showPreviousYear: boolean; instant?: boolean; duration?: boolean }> = {};\n\n // Draft storage service\n private _draftStorageService!: DraftStorageService;\n private _skipDraftLoading = false; // Flag to skip draft loading during reinitialization\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 display: flex;\n flex-direction: column;\n transition: width 0.3s ease, min-width 0.3s ease;\n position: relative;\n }\n\n .side-panel-roles-list.collapsed {\n width: 48px;\n min-width: 48px;\n overflow: visible;\n border-right: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .side-panel-toggle-btn {\n position: absolute;\n top: 0px;\n right: 0px;\n width: 32px;\n height: 32px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n background: var(--jupiter-background, #fff);\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 100;\n transition: all 0.2s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n\n .side-panel-toggle-btn:hover {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n border-color: var(--jupiter-primary-color, #1976d2);\n }\n\n .side-panel-toggle-btn svg {\n width: 20px;\n height: 20px;\n fill: currentColor;\n transition: transform 0.3s ease;\n }\n\n .side-panel-toggle-btn.collapsed svg {\n transform: rotate(180deg);\n }\n\n .side-panel-search-container {\n position: sticky;\n top: 0;\n z-index: 10;\n background: var(--jupiter-background, #fff);\n padding: 16px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .side-panel-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 box-sizing: border-box;\n }\n\n .side-panel-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 .side-panel-search-input::placeholder {\n color: var(--jupiter-text-secondary, #666);\n }\n\n .side-panel-search-icon {\n position: absolute;\n right: 28px;\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 .side-panel-clear-search {\n position: absolute;\n right: 28px;\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: 20px;\n line-height: 1;\n transition: color 0.2s ease;\n }\n\n .side-panel-clear-search:hover {\n color: var(--jupiter-text-primary, #333);\n }\n\n .side-panel-search-results-info {\n font-size: 12px;\n color: var(--jupiter-text-secondary, #666);\n padding: 8px 16px;\n text-align: center;\n border-bottom: 1px solid var(--jupiter-border-color, #e0e0e0);\n background: var(--jupiter-background-light, #f8f9fa);\n }\n\n .side-panel-no-results {\n padding: 40px 20px;\n text-align: center;\n color: var(--jupiter-text-secondary, #666);\n font-size: 14px;\n line-height: 1.6;\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: 0 24px 24px 24px;\n padding-top: 0;\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 \n // Listen for period-change events from child components\n this.addEventListener('period-change', (e: Event) => {\n console.log(`🌍 [GLOBAL DynamicForm] Caught period-change event on element:`, e);\n const customEvent = e as CustomEvent;\n console.log(`🌍 [GLOBAL DynamicForm] Event detail:`, customEvent.detail);\n // Call the handler directly since @period-change binding doesn't catch it\n this._handlePeriodChange(customEvent);\n });\n \n this._initializeForm();\n }\n\n updated(changedProperties: Map<string, any>) {\n // Initialize I18n language\n if (changedProperties.has('language')) {\n I18n.setLanguage(this.language);\n }\n \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 // Initialize draft storage service\n if (!this._draftStorageService) {\n this._draftStorageService = new DraftStorageService(false); // Use localStorage\n }\n \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 // Check for and load saved draft (skip if reinitialization during preference update)\n if (!this._skipDraftLoading) {\n this._loadDraftIfExists();\n } else {\n console.log('⏭️ Skipping draft loading during preference update');\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 \n // CRITICAL: Capture current form data BEFORE reinitialization to preserve user input\n console.log('💾 Capturing current form data before reinitialization...');\n const currentFormData = this._generateSubmissionData();\n const currentMetadata = this._draftStorageService.createMetadataSnapshot(\n this.periodStartDate,\n this.periodEndDate,\n this.language,\n this._selectedRoleIds,\n this._allSections,\n this._typedMemberData,\n this._periodPreferences\n );\n \n // Save current state to draft storage\n this._draftStorageService.saveDraft(currentFormData, currentMetadata);\n console.log('✅ Current form data saved to draft storage');\n \n // CRITICAL: Skip draft loading during reinitialization to prevent old draft from overriding changes\n this._skipDraftLoading = true;\n this._initializeForm();\n this._skipDraftLoading = false;\n \n // CRITICAL: Restore form data from draft after reinitialization\n console.log('📥 Restoring form data from draft after reinitialization...');\n this._loadDraftIfExists().then(() => {\n console.log('✅ Form data restored successfully after reinitialization');\n }).catch((error) => {\n console.error('❌ Error restoring form data after reinitialization:', error);\n });\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 console.log(`📝 Field change: conceptId=${conceptId}, columnId=${columnId}, value=${value}, fieldId=${fieldId}`);\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 console.log(`💾 Updated formData[${conceptId}]:`, this._formData[conceptId]);\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 private _handlePeriodChange(event: CustomEvent) {\n console.log(`🎯 [DynamicForm] _handlePeriodChange called with event:`, event);\n console.log(`🎯 [DynamicForm] Event detail:`, event.detail);\n const { conceptId, columnId, periodType, periodStartDate, periodEndDate, periodInstantDate } = event.detail;\n \n console.log(`📅 Period change received: conceptId=${conceptId}, columnId=${columnId}, periodType=${periodType}, startDate=${periodStartDate}, endDate=${periodEndDate}, instantDate=${periodInstantDate}`);\n \n // Update period data with proper immutable update\n const updatedPeriodData = { ...this._periodData };\n if (!updatedPeriodData[conceptId]) {\n updatedPeriodData[conceptId] = {};\n }\n \n updatedPeriodData[conceptId] = { \n ...updatedPeriodData[conceptId], \n [columnId]: {\n startDate: periodStartDate,\n endDate: periodEndDate,\n instantDate: periodInstantDate\n }\n };\n this._periodData = updatedPeriodData;\n \n console.log(`💾 Period data stored for [${conceptId}][${columnId}]:`, this._periodData[conceptId][columnId]);\n console.log(`📦 Full period data state:`, JSON.stringify(this._periodData, null, 2));\n \n // Mark as dirty\n this._dirty = true;\n \n // Trigger update\n this.requestUpdate();\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, insertAfterColumnId } = event.detail;\n this._addColumnFromRequest(columnRequest, sectionId, insertAfterColumnId);\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 /**\n * Format period range for display - shows only year when both dates are in same year\n * @param startDate - Period start date in YYYY-MM-DD format\n * @param endDate - Period end date in YYYY-MM-DD format\n * @returns Formatted period string (e.g., \"2025\" or \"2025-01-01 / 2026-12-31\")\n */\n private _formatPeriodDisplay(startDate?: string, endDate?: string): string {\n if (!startDate || !endDate) {\n return `${startDate || ''} / ${endDate || ''}`;\n }\n \n const startYear = startDate.substring(0, 4);\n const endYear = endDate.substring(0, 4);\n \n // If both dates are in the same year, show only the year\n if (startYear === endYear) {\n return startYear;\n }\n \n // Otherwise, show the full date range\n return `${startDate} / ${endDate}`;\n }\n\n private _addColumnFromRequest(request: AddColumnRequest, sectionId: string, insertAfterColumnId?: string | null) {\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 = this._formatPeriodDisplay(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 `(${this._formatPeriodDisplay(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 `(${this._formatPeriodDisplay(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 // CRITICAL: Add period dates so they can be saved to draft and restored\n periodStartDate: request.periodType === 'instant' ? request.instantDate : request.startDate,\n periodEndDate: request.periodType === 'instant' ? request.instantDate : request.endDate\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 \n // Insert column at the specified position or at the end\n if (insertAfterColumnId) {\n const insertIndex = targetSection.columns.findIndex(col => col.id === insertAfterColumnId);\n if (insertIndex !== -1) {\n // Insert after the specified column\n targetSection.columns = [\n ...targetSection.columns.slice(0, insertIndex + 1),\n newColumn,\n ...targetSection.columns.slice(insertIndex + 1)\n ];\n } else {\n // Column not found, add at the end\n targetSection.columns = [...targetSection.columns, newColumn];\n }\n } else {\n // No position specified, add at the end\n targetSection.columns = [...targetSection.columns, newColumn];\n }\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 periodType: concept.periodType, // Add periodType from concept\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 periodInstantDate: concept.periodType === 'instant' ? (request.instantDate || request.startDate) : undefined\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 periodType: concept.periodType, // Add periodType from concept\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 periodInstantDate: concept.periodType === 'instant' ? (request.instantDate || request.startDate) : undefined\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 console.log('💾 Raw form data before submission generation:', this._formData);\n \n // Generate draft data in the same format as submission\n const draftData = this._generateSubmissionData();\n \n console.log('📤 Generated submission data:', draftData);\n console.log('📊 Submission data breakdown:');\n draftData.forEach((entry, index) => {\n console.log(` [${index}] conceptId: ${entry.conceptId}, columnId: ${entry.columnId}, value: ${entry.value}`);\n });\n \n // Create metadata snapshot\n const metadata = this._draftStorageService.createMetadataSnapshot(\n this.periodStartDate,\n this.periodEndDate,\n this.language,\n this._selectedRoleIds,\n this._allSections,\n this._typedMemberData,\n this._periodPreferences,\n this._periodData\n );\n\n // Save to localStorage (optional - for browser persistence)\n const saved = this._draftStorageService.saveDraft(draftData, metadata);\n \n // Update the @Input properties with current draft data\n // Consumer application can bind to these properties to persist to database\n this.dynaformsFacts = draftData;\n this.dynaformsMetadata = metadata;\n \n // Emit event with JSON data for consumer application to catch and persist\n this.dispatchEvent(new CustomEvent('form-save-draft', {\n detail: {\n data: this._formData,\n draftData: draftData,\n metadata: metadata,\n saved: saved,\n valid: this._valid,\n errors: this._errors,\n // JSON data ready for external database storage\n dynaformsFacts: draftData,\n dynaformsMetadata: metadata\n },\n bubbles: true,\n composed: true\n }));\n\n console.log('💾 Draft saved - localStorage + event emitted', { \n entries: draftData.length,\n saved: saved,\n roles: this._selectedRoleIds.length,\n customColumns: metadata.customColumns.length,\n eventEmitted: true\n });\n }\n\n // ===========================================\n // Draft Loading & Restoration\n // ===========================================\n\n private async _loadDraftIfExists() {\n console.log('📋 Checking for saved draft...');\n \n // Priority 1: Check if external draft data was provided via properties\n if (this.dynaformsFacts && this.dynaformsMetadata) {\n console.log('📦 Using external draft data from properties');\n const draft = {\n formData: this.dynaformsFacts,\n metadata: this.dynaformsMetadata\n };\n \n await this._restoreFromDraft(draft);\n \n // Set draft loaded state\n this._draftLoaded = true;\n this._draftLoadedAt = this.dynaformsMetadata.savedAt || new Date().toISOString();\n \n // Dispatch event\n this.dispatchEvent(new CustomEvent('form-draft-loaded', {\n detail: {\n draft: draft,\n source: 'external',\n compatible: true,\n warnings: []\n },\n bubbles: true,\n composed: true\n }));\n \n console.log('📥 External draft loaded successfully');\n return;\n }\n \n // Priority 2: Check localStorage\n if (!this._draftStorageService.hasDraft()) {\n console.log('ℹ️ No saved draft found');\n return;\n }\n\n const draft = this._draftStorageService.loadDraft();\n if (!draft) {\n console.warn('⚠️ Failed to load draft');\n return;\n }\n\n // Validate draft compatibility\n const { compatible, warnings } = this._draftStorageService.validateDraftCompatibility(\n draft,\n this.periodStartDate,\n this.periodEndDate\n );\n\n if (warnings.length > 0) {\n console.warn('⚠️ Draft compatibility warnings:', warnings);\n }\n\n // Restore the form state\n await this._restoreFromDraft(draft);\n\n // Dispatch event to notify parent application\n this.dispatchEvent(new CustomEvent('form-draft-loaded', {\n detail: {\n draft: draft,\n compatible: compatible,\n warnings: warnings\n },\n bubbles: true,\n composed: true\n }));\n\n console.log('📥 Draft loaded successfully', {\n entries: draft.formData.length,\n savedAt: draft.metadata.savedAt,\n age: this._draftStorageService.getDraftAge()\n });\n }\n\n private async _restoreFromDraft(draft: any) {\n const { formData, metadata } = draft;\n\n // 1. Restore metadata state\n if (metadata.selectedRoleIds && metadata.selectedRoleIds.length > 0) {\n this._selectedRoleIds = metadata.selectedRoleIds;\n console.log(`🔄 Restored ${this._selectedRoleIds.length} selected roles`);\n }\n\n if (metadata.typedMemberData) {\n this._typedMemberData = metadata.typedMemberData;\n this._preservedTypedMemberData = {}; // Clear preserved typed data when restoring\n console.log('🔄 Restored typed member data');\n }\n\n if (metadata.periodData) {\n this._periodData = metadata.periodData;\n console.log('🔄 Restored custom field-level period data:', Object.keys(this._periodData).length, 'concepts');\n }\n\n if (metadata.periodPreferences) {\n this._periodPreferences = metadata.periodPreferences;\n console.log('🔄 Restored period preferences (including previous year settings):', this._periodPreferences);\n \n // CRITICAL: Rebuild schema with restored period preferences\n // This ensures default columns (like previous year) are generated correctly\n if (this.xbrlInput) {\n console.log('🔄 Rebuilding schema with restored period preferences...');\n this._currentSchema = XBRLFormBuilder.buildFormSchema(\n this.xbrlInput,\n this.periodStartDate,\n this.periodEndDate,\n this.language,\n this._periodPreferences\n );\n \n // Update all sections with the rebuilt schema\n this._allSections = [...this._currentSchema.sections];\n \n // Apply financialStatementsTypeAxis filter if needed\n if (this.financialStatementsTypeAxis && this.financialStatementsTypeAxis.length > 0) {\n this._allSections = this._filterRolesByFinancialStatementsType(this._allSections);\n }\n \n console.log('✅ Schema rebuilt with restored period preferences');\n \n // CRITICAL: Apply custom period data to fields after schema rebuild\n // This must happen BEFORE custom columns are merged\n console.log('🔄 Applying custom period data to schema fields...');\n this._applyCustomPeriodDataToFields();\n \n // IMPORTANT: After rebuilding, merge any additional custom columns that were manually added\n // (but DON'T replace default columns like duration, instant, previous year)\n if (metadata.customColumns && metadata.customColumns.length > 0) {\n this._mergeAdditionalCustomColumns(metadata.customColumns);\n console.log(`🔄 Merged ${metadata.customColumns.length} additional custom columns`);\n }\n }\n } else {\n // If no period preferences to restore, use the old logic of restoring columns directly\n // 2. Restore custom columns structure (only if schema wasn't rebuilt)\n if (metadata.customColumns && metadata.customColumns.length > 0) {\n this._restoreCustomColumns(metadata.customColumns);\n console.log(`🔄 Restored ${metadata.customColumns.length} custom columns`);\n }\n }\n\n // 2. Convert submission data back to FormData structure AND extract custom period data\n const restoredFormData: any = {};\n const restoredPeriodData: { [conceptId: string]: { [columnId: string]: { startDate?: string; endDate?: string; instantDate?: string } } } = {};\n \n formData.forEach((entry: any) => {\n let { conceptId, value, columnId, period } = entry;\n \n // Fallback: Infer columnId from period data if missing (for old draft format)\n if (!columnId && period) {\n columnId = this._inferColumnIdFromPeriod(period, conceptId);\n if (!columnId) {\n console.warn(`⚠️ Could not infer columnId for concept ${conceptId}, skipping...`);\n return;\n }\n }\n \n // Find the actual concept in sections to get the correct ID (might have suffix)\n const actualConceptId = this._findActualConceptId(conceptId);\n const conceptIdToUse = actualConceptId || conceptId;\n \n if (!restoredFormData[conceptIdToUse]) {\n restoredFormData[conceptIdToUse] = {};\n }\n \n restoredFormData[conceptIdToUse][columnId] = value;\n console.log(`📦 Restored: ${conceptIdToUse}[${columnId}] = ${value}`);\n \n // CRITICAL: Extract custom period data from submission entries\n if (period) {\n if (!restoredPeriodData[conceptIdToUse]) {\n restoredPeriodData[conceptIdToUse] = {};\n }\n \n if (period.type === 'instant') {\n restoredPeriodData[conceptIdToUse][columnId] = {\n instantDate: period.date\n };\n console.log(`📅 [Restore Period] Extracted instant date for ${conceptIdToUse}/${columnId}: ${period.date}`);\n } else if (period.type === 'duration') {\n restoredPeriodData[conceptIdToUse][columnId] = {\n startDate: period.startDate,\n endDate: period.endDate\n };\n console.log(`📅 [Restore Period] Extracted duration dates for ${conceptIdToUse}/${columnId}: ${period.startDate} - ${period.endDate}`);\n }\n }\n });\n\n // 3. Apply restored data to form data\n this._formData = { ...this._formData, ...restoredFormData };\n console.log(`🔄 Restored ${Object.keys(restoredFormData).length} concepts with data`);\n \n // 3a. CRITICAL: Merge restored period data from submission entries with metadata periodData\n // Priority: submission period data (most recent) > metadata periodData (backup)\n this._periodData = {\n ...this._periodData,\n ...(metadata.periodData || {}),\n ...restoredPeriodData\n };\n console.log(`📅 [Period Restore] Merged period data: ${Object.keys(this._periodData).length} concepts with custom periods`);\n console.log(`📅 [Period Restore] Full _periodData after merge:`, JSON.stringify(this._periodData, null, 2));\n\n // 4. Apply role filter to show selected sections\n if (this._selectedRoleIds.length > 0) {\n this._applyRoleFilter();\n }\n\n // 5. Mark form as dirty since it has restored data\n this._dirty = true;\n this._touched.clear(); // Clear touched state since this is a restoration\n\n // 6. Validate restored data\n this._validateForm();\n\n // 7. Force a complete re-render by reassigning the sections array\n this._allSections = [...this._allSections];\n this.requestUpdate();\n \n // 8. Wait for the update to complete and all child components to render\n await this.updateComplete;\n \n // 9. Wait a bit more for nested components\n await new Promise(resolve => setTimeout(resolve, 100));\n \n // 10. Now populate the field values\n const fieldCount = this.shadowRoot?.querySelectorAll('input, textarea, select').length || 0;\n console.log(`🔍 Found ${fieldCount} fields in DOM after update`);\n \n if (fieldCount > 0) {\n this._populateFieldValues(restoredFormData);\n } else {\n console.error('❌ No fields found in DOM even after updateComplete');\n }\n\n console.log('✅ Draft restoration completed');\n }\n\n private _findActualConceptId(conceptId: string): string | null {\n // Try to find the concept in all sections\n // The concept might be stored with original ID but field uses suffixed ID\n for (const section of this._allSections) {\n const found = this._findActualConceptIdInTree(section.concepts, conceptId);\n if (found) return found;\n }\n return null;\n }\n\n private _findActualConceptIdInTree(concepts: ConceptTree[], conceptId: string): string | null {\n for (const concept of concepts) {\n // Match by originalConceptId or id\n if (concept.originalConceptId === conceptId || concept.id === conceptId) {\n return concept.id; // Return the actual ID used in fields\n }\n if (concept.children) {\n const found = this._findActualConceptIdInTree(concept.children, conceptId);\n if (found) return found;\n }\n }\n return null;\n }\n\n private _inferColumnIdFromPeriod(period: any, conceptId: string): string | null {\n // Find the concept in all sections\n for (const section of this._allSections) {\n const concept = this._findConceptInSection(section.concepts, conceptId);\n if (concept && section.columns) {\n // Try to match period with available columns\n for (const column of section.columns) {\n const isInstant = period.type === 'instant';\n const isDuration = period.type === 'duration';\n \n if (isInstant && period.date) {\n // Match instant period with column date\n if (column.periodStartDate === period.date || \n (column.periodStartDate === column.periodEndDate && column.periodStartDate === period.date)) {\n console.log(`✓ Inferred columnId: ${column.id} for concept ${conceptId}`);\n return column.id;\n }\n } else if (isDuration && period.startDate && period.endDate) {\n // Match duration period with column date range\n if (column.periodStartDate === period.startDate && column.periodEndDate === period.endDate) {\n console.log(`✓ Inferred columnId: ${column.id} for concept ${conceptId}`);\n return column.id;\n }\n }\n }\n \n // Fallback: Use default column based on period type\n if (period.type === 'instant') {\n const instantCol = section.columns.find(c => c.id === 'instant');\n if (instantCol) return instantCol.id;\n } else {\n const durationCol = section.columns.find(c => c.id === 'duration');\n if (durationCol) return durationCol.id;\n }\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 || concept.originalConceptId === conceptId) {\n return concept;\n }\n if (concept.children) {\n const found = this._findConceptInSection(concept.children, conceptId);\n if (found) return found;\n }\n }\n return null;\n }\n\n private _populateFieldValues(formData: any) {\n let populatedCount = 0;\n let notFoundCount = 0;\n \n console.log('🔍 Starting field population...');\n console.log('📦 Form data to populate:', formData);\n \n // Iterate through all concepts and columns to populate field values\n Object.keys(formData).forEach(conceptId => {\n const conceptData = formData[conceptId];\n \n Object.keys(conceptData).forEach(columnId => {\n const value = conceptData[columnId];\n \n // The field ID format is: conceptId__columnId (double underscore)\n const fieldId = `${conceptId}__${columnId}`;\n \n console.log(`🔍 Looking for field: ${fieldId}`);\n \n // Find the input element by ID\n const fieldElement = this.shadowRoot?.querySelector(`#${CSS.escape(fieldId)}`);\n \n if (fieldElement) {\n if (fieldElement instanceof HTMLInputElement || \n fieldElement instanceof HTMLTextAreaElement || \n fieldElement instanceof HTMLSelectElement) {\n \n if (fieldElement.type === 'checkbox') {\n (fieldElement as HTMLInputElement).checked = Boolean(value);\n } else {\n fieldElement.value = value !== null && value !== undefined ? String(value) : '';\n }\n \n console.log(` ✅ Populated field ${fieldId} with value:`, value);\n populatedCount++;\n }\n } else {\n console.warn(` ❌ Field element NOT FOUND: ${fieldId}`);\n console.warn(` Available fields in DOM:`, Array.from(this.shadowRoot?.querySelectorAll('input, textarea, select') || []).map(el => el.id).filter(id => id.includes(conceptId.split('__')[0])));\n notFoundCount++;\n }\n });\n });\n \n console.log(`✅ Field population complete: ${populatedCount} populated, ${notFoundCount} not found`);\n }\n\n private _restoreCustomColumns(customColumns: any[]) {\n // Group columns by section ID\n const columnsBySection = new Map<string, any[]>();\n \n customColumns.forEach(col => {\n if (!columnsBySection.has(col.sectionId)) {\n columnsBySection.set(col.sectionId, []);\n }\n columnsBySection.get(col.sectionId)!.push(col);\n });\n\n // Apply columns to each section\n this._allSections.forEach(section => {\n const savedColumns = columnsBySection.get(section.id);\n if (savedColumns) {\n // Reconstruct FormColumn objects from saved metadata\n section.columns = savedColumns.map(col => {\n const column: FormColumn = {\n id: col.columnId,\n title: col.label,\n type: col.dimensionData ? 'dimension' : 'base',\n periodStartDate: col.startDate || col.date,\n periodEndDate: col.endDate || col.date,\n dimensionData: col.dimensionData,\n order: 0,\n removable: col.columnId !== 'duration' && col.columnId !== 'instant'\n };\n console.log(`📅 [Draft Restore] Restoring column ${col.columnId}: startDate=${column.periodStartDate}, endDate=${column.periodEndDate}`);\n return column;\n });\n \n // Regenerate fields for concepts to include the restored columns\n this._regenerateFieldsForSection(section);\n \n console.log(` └─ Restored ${savedColumns.length} columns for section ${section.id}`);\n }\n });\n\n // Update current schema with restored sections\n if (this._currentSchema) {\n this._currentSchema = {\n ...this._currentSchema,\n sections: this._allSections\n };\n }\n }\n\n /**\n * Merge additional custom columns that were manually added by user\n * This preserves default columns (duration, instant, previous year) generated by schema builder\n * and only adds custom columns that don't already exist\n */\n private _mergeAdditionalCustomColumns(customColumns: any[]) {\n // Group columns by section ID\n const columnsBySection = new Map<string, any[]>();\n \n customColumns.forEach(col => {\n // Only merge columns that were manually added (e.g., col-123456)\n // Skip default columns like 'duration', 'instant', 'duration_prev', 'instant_prev', 'duration_0', etc.\n const isManuallyAdded = col.columnId.startsWith('col-');\n if (isManuallyAdded) {\n if (!columnsBySection.has(col.sectionId)) {\n columnsBySection.set(col.sectionId, []);\n }\n columnsBySection.get(col.sectionId)!.push(col);\n }\n });\n\n // Add custom columns to each section without replacing existing columns\n this._allSections.forEach(section => {\n const customColumnsForSection = columnsBySection.get(section.id);\n if (customColumnsForSection && customColumnsForSection.length > 0) {\n if (!section.columns) {\n section.columns = [];\n }\n \n // Add each custom column if it doesn't already exist\n customColumnsForSection.forEach(col => {\n console.log(`📅 [Merge Custom Column] Column ${col.columnId}: col.startDate=${col.startDate}, col.endDate=${col.endDate}, col.date=${col.date}, col.periodType=${col.periodType}`);\n const existingColumn = section.columns!.find(c => c.id === col.columnId);\n if (!existingColumn) {\n const newColumn: FormColumn = {\n id: col.columnId,\n title: col.label,\n type: col.dimensionData ? 'dimension' : 'base',\n periodStartDate: col.startDate || col.date,\n periodEndDate: col.endDate || col.date,\n dimensionData: col.dimensionData,\n order: section.columns!.length,\n removable: true\n };\n console.log(`📅 [New Column Created] Column ${newColumn.id}: periodStartDate=${newColumn.periodStartDate}, periodEndDate=${newColumn.periodEndDate}`);\n section.columns!.push(newColumn);\n console.log(` └─ Added custom column ${col.columnId} to section ${section.id}`);\n }\n });\n \n // Regenerate fields for concepts to include the merged columns\n this._regenerateFieldsForSection(section);\n }\n });\n\n // Update current schema with merged sections\n if (this._currentSchema) {\n this._currentSchema = {\n ...this._currentSchema,\n sections: this._allSections\n };\n }\n }\n\n /**\n * Apply custom period data from _periodData to all existing fields\n * This is called after schema rebuild to preserve user-modified period dates\n */\n private _applyCustomPeriodDataToFields() {\n if (!this._periodData || Object.keys(this._periodData).length === 0) {\n console.log('ℹ️ No custom period data to apply');\n return;\n }\n\n let appliedCount = 0;\n \n // Recursive function to traverse concept trees\n const applyToConceptTree = (concepts: ConceptTree[]) => {\n concepts.forEach(concept => {\n // Check if this concept has custom period data\n if (this._periodData[concept.id]) {\n const conceptPeriodData = this._periodData[concept.id];\n \n // Apply to each field in this concept\n if (concept.fields) {\n concept.fields.forEach(field => {\n const customPeriod = conceptPeriodData[field.columnId];\n if (customPeriod) {\n // Apply custom period dates\n if (customPeriod.startDate) {\n field.periodStartDate = customPeriod.startDate;\n }\n if (customPeriod.endDate) {\n field.periodEndDate = customPeriod.endDate;\n }\n if (customPeriod.instantDate) {\n field.periodInstantDate = customPeriod.instantDate;\n }\n appliedCount++;\n console.log(`✅ [Apply Period] Updated field ${concept.id}/${field.columnId}: start=${field.periodStartDate}, end=${field.periodEndDate}, instant=${field.periodInstantDate}`);\n }\n });\n }\n }\n \n // Recursively apply to children\n if (concept.children && concept.children.length > 0) {\n applyToConceptTree(concept.children);\n }\n });\n };\n \n // Apply to all sections\n this._allSections.forEach(section => {\n if (section.concepts && section.concepts.length > 0) {\n applyToConceptTree(section.concepts);\n }\n });\n \n console.log(`📅 [Apply Period] Applied custom period data to ${appliedCount} fields`);\n }\n\n private _regenerateFieldsForSection(section: FormSection) {\n if (!section.columns) return;\n\n // Get period preferences for this section to respect concept filtering\n const sectionPreferences = this._periodPreferences[section.id] || {\n showDuration: true,\n showInstant: true,\n showPreviousYear: false\n };\n\n // Recursively regenerate fields for all concepts\n const regenerateConcepts = (concepts: ConceptTree[]) => {\n concepts.forEach(concept => {\n // Clear existing fields\n concept.fields = [];\n \n // Check if concept should be visible based on period preferences\n const shouldShowConcept = this._shouldShowConceptBasedOnPeriodPreferences(\n concept,\n sectionPreferences\n );\n \n // Only create fields if concept should be visible\n if (shouldShowConcept) {\n // Create fields for each column\n section.columns!.forEach(column => {\n // Only create field if period type matches or is compatible\n const conceptPeriodType = concept.periodType;\n const columnPeriodType = this._inferColumnPeriodType(column);\n \n // Skip abstract concepts without values\n if (concept.abstract) return;\n \n // CRITICAL FIX: For merged columns (where both duration and instant concepts appear),\n // we should NOT filter by period type since each field has its own period controls.\n // Only filter if we have explicit period-specific columns (like 'instant' or duration with typed dimensions)\n const shouldSkipPeriodCheck = !columnPeriodType || column.id === 'duration' || column.id === 'default';\n \n // Check period type compatibility (skip for merged columns)\n if (!shouldSkipPeriodCheck && conceptPeriodType && columnPeriodType) {\n // For instant concepts, only show in instant columns\n // For duration concepts, only show in duration columns\n if (conceptPeriodType !== columnPeriodType) {\n console.log(`⏭️ [Field Regeneration] Skipping field for ${concept.id} in column ${column.id}: conceptPeriodType=${conceptPeriodType}, columnPeriodType=${columnPeriodType}`);\n return;\n }\n }\n \n // Create the field\n const newField = {\n id: `${concept.id}_${column.id}`,\n conceptId: concept.id,\n columnId: column.id,\n type: this._mapConceptTypeToFieldType(concept.type),\n label: concept.label,\n periodType: conceptPeriodType, // Add periodType from concept\n periodStartDate: column.periodStartDate,\n periodEndDate: column.periodEndDate,\n periodInstantDate: conceptPeriodType === 'instant' ? (column.periodEndDate || column.periodStartDate) : undefined\n };\n \n // Apply custom period data if exists (user-modified period dates)\n if (this._periodData[concept.id]?.[column.id]) {\n const customPeriod = this._periodData[concept.id][column.id];\n if (customPeriod.startDate) newField.periodStartDate = customPeriod.startDate;\n if (customPeriod.endDate) newField.periodEndDate = customPeriod.endDate;\n if (customPeriod.instantDate) newField.periodInstantDate = customPeriod.instantDate;\n console.log(`✅ [Field Regeneration] Applied custom period data to ${concept.id}/${column.id}:`, customPeriod);\n console.log(`✅ [Field Regeneration] Field properties after apply: periodStartDate=${newField.periodStartDate}, periodEndDate=${newField.periodEndDate}, periodInstantDate=${newField.periodInstantDate}`);\n } else {\n console.log(`ℹ️ [Field Regeneration] No custom period data for ${concept.id}/${column.id}. Checking _periodData:`, this._periodData[concept.id]);\n }\n \n if (concept.id.includes('DescriptionLocationNL') || column.id.startsWith('col-')) {\n console.log(`📅 [Field Regeneration] Concept ${concept.id}, Column ${column.id}: field.periodStartDate=${newField.periodStartDate}, field.periodEndDate=${newField.periodEndDate}, column.periodStartDate=${column.periodStartDate}`);\n }\n concept.fields.push(newField);\n });\n }\n \n // Recursively process children\n if (concept.children) {\n regenerateConcepts(concept.children);\n }\n });\n };\n \n regenerateConcepts(section.concepts);\n }\n\n /**\n * Check if a concept should be shown based on period preferences\n */\n private _shouldShowConceptBasedOnPeriodPreferences(\n concept: ConceptTree,\n preferences: { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }\n ): boolean {\n // Always show abstract concepts (they're just headers)\n if (concept.abstract) {\n return true;\n }\n\n // If concept has no period type, show it\n if (!concept.periodType) {\n return true;\n }\n\n // Check if the concept's period type matches the preferences\n if (concept.periodType === 'duration' && !preferences.showDuration) {\n return false;\n }\n\n if (concept.periodType === 'instant' && !preferences.showInstant) {\n return false;\n }\n\n return true;\n }\n\n private _inferColumnPeriodType(column: FormColumn): 'instant' | 'duration' | undefined {\n // If both dates are same, it's instant\n if (column.periodStartDate && column.periodEndDate) {\n return column.periodStartDate === column.periodEndDate ? 'instant' : 'duration';\n }\n // If only start date, assume instant\n if (column.periodStartDate && !column.periodEndDate) {\n return 'instant';\n }\n return undefined;\n }\n\n private _mapConceptTypeToFieldType(conceptType?: string): FieldType {\n if (!conceptType) return 'text';\n \n if (conceptType.includes('monetary') || conceptType.includes('Monetary')) {\n return 'number';\n }\n if (conceptType.includes('date') || conceptType.includes('Date')) {\n return 'date';\n }\n if (conceptType.includes('boolean') || conceptType.includes('Boolean')) {\n return 'boolean';\n }\n if (conceptType.includes('integer') || conceptType.includes('Integer')) {\n return 'number';\n }\n if (conceptType.includes('decimal') || conceptType.includes('Decimal')) {\n return 'number';\n }\n \n return 'text';\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 _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 // Check if field has custom period data (user-modified)\n const fieldPeriodData = this._periodData[concept.id]?.[columnId];\n \n // Get column to check for period dates (for previous year columns as fallback)\n const column = this._findColumnByIdInAllSections(columnId);\n \n console.log(`🔍 [Submission] Concept: ${concept.id}, Column: ${columnId}, Field Period: ${fieldPeriodData ? JSON.stringify(fieldPeriodData) : 'none'}, Column Period: ${column?.periodStartDate || 'none'} - ${column?.periodEndDate || 'none'}`);\n \n // Priority: field-specific period > column period > form defaults\n const periodStartDate = fieldPeriodData?.startDate || column?.periodStartDate || field.periodStartDate || this.periodStartDate;\n const periodEndDate = fieldPeriodData?.endDate || column?.periodEndDate || field.periodEndDate || this.periodEndDate;\n const periodInstantDate = fieldPeriodData?.instantDate || field.periodInstantDate || periodEndDate || periodStartDate;\n \n const entry: SubmissionEntry = {\n conceptId: concept.originalConceptId || concept.id,\n columnId: columnId,\n value: value,\n period: {\n type: concept.periodType || 'duration',\n ...(isInstant \n ? { date: periodInstantDate }\n : { \n startDate: periodStartDate,\n endDate: 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 // Check if field has custom period data (user-modified)\n const fieldPeriodData = this._periodData[concept.id]?.[field.columnId];\n \n const submissionEntry: any = {\n conceptId: concept.id,\n columnId: field.columnId, // CRITICAL: Include columnId for draft restoration\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: field-specific period (user-modified) > column period dates > field defaults > form defaults\n if (concept.periodType === 'instant') {\n // For instant concepts, use a single date\n const instantDate = fieldPeriodData?.instantDate || fieldPeriodData?.endDate || column?.periodEndDate || field.periodInstantDate || field.periodEndDate || field.periodStartDate || this.periodStartDate;\n submissionEntry.period.date = instantDate;\n } else {\n // For duration concepts, use start and end dates\n const startDate = fieldPeriodData?.startDate || column?.periodStartDate || field.periodStartDate || this.periodStartDate;\n const endDate = fieldPeriodData?.endDate || column?.periodEndDate || field.periodEndDate || this.periodEndDate;\n submissionEntry.period.startDate = startDate;\n submissionEntry.period.endDate = endDate;\n }\n \n // Debug log period dates with field-specific info\n console.log(`🔍 [Submission] Concept: ${concept.id}, Column: ${field.columnId}, Field Period: ${fieldPeriodData ? JSON.stringify(fieldPeriodData) : 'none'}, 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 _handleSidePanelSearchInput(event: Event) {\n const input = event.target as HTMLInputElement;\n this._sidePanelSearchQuery = input.value;\n }\n\n private _clearSidePanelSearch() {\n this._sidePanelSearchQuery = '';\n const searchInput = this.shadowRoot?.querySelector('.side-panel-search-input') as HTMLInputElement;\n if (searchInput) {\n searchInput.value = '';\n searchInput.focus();\n }\n }\n\n private _toggleSidePanelCollapse() {\n this._sidePanelCollapsed = !this._sidePanelCollapsed;\n }\n\n private _filterSidePanelSections(sections: FormSection[]): FormSection[] {\n if (!this._sidePanelSearchQuery.trim()) {\n return sections;\n }\n\n const query = this._sidePanelSearchQuery.toLowerCase().trim();\n return sections.filter(section => {\n // Search in section title\n const titleMatch = section.title.toLowerCase().includes(query);\n \n // Search in section ID\n const idMatch = section.id.toLowerCase().includes(query);\n \n // Search in section description if available\n const descriptionMatch = section.description?.toLowerCase().includes(query) || false;\n \n // Search in roleURI if available\n const uriMatch = section.metadata?.roleURI?.toLowerCase().includes(query) || false;\n \n return titleMatch || idMatch || descriptionMatch || uriMatch;\n });\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\">${I18n.t('validation.summary')}</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>${I18n.t('form.noRoleSelected')}</h3>\n <p>${I18n.t('filter.selectRoles')}</p>\n <p>${I18n.t('filter.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 @period-change=\"${this._handlePeriodChange}\"\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 // Apply search filter to visible sections\n const filteredSections = this._filterSidePanelSections(visibleSections);\n \n // Select first visible role by default if none selected or if current selection is not visible\n if (!this._activeSidePanelRoleId || !filteredSections.find(s => s.id === this._activeSidePanelRoleId)) {\n this._activeSidePanelRoleId = filteredSections.length > 0 ? filteredSections[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 ${this._sidePanelCollapsed ? 'collapsed' : ''}\">\n <!-- Toggle Button -->\n <button \n class=\"side-panel-toggle-btn ${this._sidePanelCollapsed ? 'collapsed' : ''}\"\n @click=\"${this._toggleSidePanelCollapse}\"\n title=\"${this._sidePanelCollapsed ? I18n.t('form.expandPanel') : I18n.t('form.collapsePanel')}\"\n >\n <svg viewBox=\"0 0 24 24\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/>\n </svg>\n </button>\n \n ${!this._sidePanelCollapsed ? html`\n <!-- Search Input -->\n <div class=\"side-panel-search-container\">\n <input\n type=\"text\"\n class=\"side-panel-search-input\"\n placeholder=\"${I18n.t('filter.searchPlaceholder')}\"\n .value=\"${this._sidePanelSearchQuery}\"\n @input=\"${this._handleSidePanelSearchInput}\"\n />\n ${this._sidePanelSearchQuery ? html`\n <button class=\"side-panel-clear-search\" @click=\"${this._clearSidePanelSearch}\" title=\"${I18n.t('filter.clearSearch')}\">\n ×\n </button>\n ` : html`\n <svg class=\"side-panel-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 ${this._sidePanelSearchQuery.trim() && filteredSections.length !== visibleSections.length ? html`\n <div class=\"side-panel-search-results-info\">\n ${filteredSections.length} ${I18n.t('filter.of')} ${visibleSections.length} ${I18n.t('filter.roles')}\n </div>\n ` : ''}\n \n <!-- Roles List -->\n ${filteredSections.length === 0 ? html`\n <div class=\"side-panel-no-results\">\n ${I18n.t('filter.noRolesFound')} \"${this._sidePanelSearchQuery}\"<br>\n ${I18n.t('filter.tryDifferentSearch')}\n </div>\n ` : html`\n ${filteredSections.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 `}\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>${I18n.t('form.noRoleSelected')}</h3>\n <p>${I18n.t('form.pleaseSelectRole')}</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>${I18n.t('form.loading')}</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 ? I18n.t('filter.selectRoles') : I18n.t('filter.filterRoles')}\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 ${I18n.t('form.saveDraft')}\n </button>\n \n <button \n class=\"btn-primary\"\n @click=\"${this._handleSubmit}\"\n ?disabled=\"${this.disabled || this.readonly}\"\n >\n ${I18n.t('form.submit')}\n </button>\n\n <div class=\"form-meta\">\n <span>${I18n.t('form.errors')}: ${errorCount}</span>\n <span>${I18n.t('form.modified')}: ${this._dirty ? I18n.t('form.yes') : I18n.t('form.no')}</span>\n <span>${I18n.t('form.valid')}: ${this._valid ? I18n.t('form.yes') : I18n.t('form.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","s","r","n","c","i","h","_a","a","b","section","l","column","axisLabel","dimensionInfo","columns","__decorateClass","property","state","customElement","d","_b","draft","f"],"mappings":"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Ba,iBAmBJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","x_google_ignoreList":[0,1,2,3,4]}