jupiter-dynamic-forms 1.8.2 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -555,8 +555,12 @@ class XBRLFormBuilder {
555
555
  /**
556
556
  * Build form schema from XBRL input data
557
557
  * Creates accordion sections for each presentation role
558
+ * @param xbrlInput - XBRL taxonomy data
559
+ * @param periodStartDate - Start date for the reporting period
560
+ * @param periodEndDate - End date for the reporting period
561
+ * @param language - ISO language code for labels (e.g., 'en', 'nl', 'de')
558
562
  */
559
- static buildFormSchema(xbrlInput, periodStartDate, periodEndDate) {
563
+ static buildFormSchema(xbrlInput, periodStartDate, periodEndDate, language = "en") {
560
564
  var _a;
561
565
  if (!xbrlInput.presentation || xbrlInput.presentation.length === 0) {
562
566
  throw new Error("XBRL presentation data is required");
@@ -568,7 +572,7 @@ class XBRLFormBuilder {
568
572
  return a2.role.localeCompare(b2.role);
569
573
  });
570
574
  sortedRoles.forEach((role) => {
571
- const section = this.buildSectionFromRole(role, periodStartDate, periodEndDate, hypercubeData);
575
+ const section = this.buildSectionFromRole(role, periodStartDate, periodEndDate, hypercubeData, language);
572
576
  this.assignFieldColumnIds(section);
573
577
  sections.push(section);
574
578
  });
@@ -583,7 +587,7 @@ class XBRLFormBuilder {
583
587
  /**
584
588
  * Build a form section from a presentation role
585
589
  */
586
- static buildSectionFromRole(role, periodStartDate, periodEndDate, hypercubeData) {
590
+ static buildSectionFromRole(role, periodStartDate, periodEndDate, hypercubeData, language = "en") {
587
591
  var _a;
588
592
  const title = this.extractRoleTitle(role.role);
589
593
  const nonAbstractConcepts = this.getAllNonAbstractConcepts(role);
@@ -597,7 +601,7 @@ class XBRLFormBuilder {
597
601
  const conceptTrees = [];
598
602
  if ((_a = role.presentationLinkbase) == null ? void 0 : _a.concepts) {
599
603
  role.presentationLinkbase.concepts.forEach((concept) => {
600
- const conceptTree = this.buildConceptTree(concept, 0, periodStartDate, periodEndDate, roleInfo, role.id);
604
+ const conceptTree = this.buildConceptTree(concept, 0, periodStartDate, periodEndDate, roleInfo, role.id, language);
601
605
  if (conceptTree) {
602
606
  conceptTrees.push(conceptTree);
603
607
  }
@@ -619,8 +623,8 @@ class XBRLFormBuilder {
619
623
  /**
620
624
  * Build concept tree from XBRL presentation concept
621
625
  */
622
- static buildConceptTree(concept, level, periodStartDate, periodEndDate, roleInfo, sectionId) {
623
- const label = this.getPreferredLabel(concept.labels);
626
+ static buildConceptTree(concept, level, periodStartDate, periodEndDate, roleInfo, sectionId, language = "en") {
627
+ const label = this.getPreferredLabel(concept.labels, language);
624
628
  const fields = [];
625
629
  if (!concept.elementAbstract) {
626
630
  let columnIds = [];
@@ -663,7 +667,7 @@ class XBRLFormBuilder {
663
667
  const children = [];
664
668
  if (concept.children && concept.children.length > 0) {
665
669
  concept.children.forEach((child) => {
666
- const childTree = this.buildConceptTree(child, level + 1, periodStartDate, periodEndDate, roleInfo, sectionId);
670
+ const childTree = this.buildConceptTree(child, level + 1, periodStartDate, periodEndDate, roleInfo, sectionId, language);
667
671
  if (childTree) {
668
672
  children.push(childTree);
669
673
  }
@@ -744,21 +748,25 @@ class XBRLFormBuilder {
744
748
  return typeMap[xbrlType] || "text";
745
749
  }
746
750
  /**
747
- * Get preferred label from labels array
751
+ * Get preferred label from labels array with language support
752
+ * @param labels - Array of XBRL labels
753
+ * @param language - ISO language code (e.g., 'en', 'nl', 'de')
748
754
  */
749
- static getPreferredLabel(labels) {
755
+ static getPreferredLabel(labels, language = "en") {
750
756
  if (!labels || labels.length === 0)
751
757
  return "Unnamed Concept";
752
- const preferred = labels.find((l2) => l2.preferredLabel);
758
+ const languageLabels = labels.filter((l2) => l2.lang === language);
759
+ const labelsToSearch = languageLabels.length > 0 ? languageLabels : labels;
760
+ const preferred = labelsToSearch.find((l2) => l2.preferredLabel);
753
761
  if (preferred)
754
762
  return preferred.label;
755
- const standard = labels.find((l2) => l2.role === "http://www.xbrl.org/2003/role/label");
763
+ const standard = labelsToSearch.find((l2) => l2.role === "http://www.xbrl.org/2003/role/label");
756
764
  if (standard)
757
765
  return standard.label;
758
- const terse = labels.find((l2) => l2.role === "http://www.xbrl.org/2003/role/terseLabel");
766
+ const terse = labelsToSearch.find((l2) => l2.role === "http://www.xbrl.org/2003/role/terseLabel");
759
767
  if (terse)
760
768
  return terse.label;
761
- return labels[0].label;
769
+ return labelsToSearch.length > 0 ? labelsToSearch[0].label : labels[0].label;
762
770
  }
763
771
  /**
764
772
  * Assign appropriate column IDs to fields based on section's generated columns
@@ -3909,6 +3917,7 @@ let JupiterDynamicForm = class extends LitElement {
3909
3917
  this.readonly = false;
3910
3918
  this.periodStartDate = "2025-01-01";
3911
3919
  this.periodEndDate = "2025-12-31";
3920
+ this.language = "en";
3912
3921
  this._formData = {};
3913
3922
  this._preservedFormData = {};
3914
3923
  this._typedMemberData = {};
@@ -3930,6 +3939,44 @@ let JupiterDynamicForm = class extends LitElement {
3930
3939
  updated(changedProperties) {
3931
3940
  if (changedProperties.has("xbrlInput") || changedProperties.has("schema")) {
3932
3941
  this._initializeForm();
3942
+ } else if (changedProperties.has("language")) {
3943
+ console.log("🌐 Language changed from", changedProperties.get("language"), "to", this.language);
3944
+ this._handleLanguageChange();
3945
+ }
3946
+ }
3947
+ /**
3948
+ * Handle language change - rebuild schema with new language while preserving form data
3949
+ */
3950
+ _handleLanguageChange() {
3951
+ if (!this.xbrlInput) {
3952
+ console.warn("⚠️ Cannot change language without XBRL input data");
3953
+ return;
3954
+ }
3955
+ try {
3956
+ const currentFormData = { ...this._formData };
3957
+ const currentPreservedData = { ...this._preservedFormData };
3958
+ const currentTypedMemberData = { ...this._typedMemberData };
3959
+ const currentPreservedTypedMemberData = { ...this._preservedTypedMemberData };
3960
+ const currentSelectedRoles = [...this._selectedRoleIds];
3961
+ console.log("💾 Preserving form data during language change:", currentFormData);
3962
+ console.log("🔄 Rebuilding form schema with language:", this.language);
3963
+ this._currentSchema = XBRLFormBuilder.buildFormSchema(
3964
+ this.xbrlInput,
3965
+ this.periodStartDate,
3966
+ this.periodEndDate,
3967
+ this.language
3968
+ );
3969
+ this._allSections = [...this._currentSchema.sections];
3970
+ this._selectedRoleIds = currentSelectedRoles;
3971
+ this._applyRoleFilter();
3972
+ this._formData = currentFormData;
3973
+ this._preservedFormData = currentPreservedData;
3974
+ this._typedMemberData = currentTypedMemberData;
3975
+ this._preservedTypedMemberData = currentPreservedTypedMemberData;
3976
+ console.log("✅ Language changed successfully, form data preserved");
3977
+ this.requestUpdate();
3978
+ } catch (error) {
3979
+ console.error("❌ Error changing language:", error);
3933
3980
  }
3934
3981
  }
3935
3982
  _initializeForm() {
@@ -3938,10 +3985,12 @@ let JupiterDynamicForm = class extends LitElement {
3938
3985
  try {
3939
3986
  console.log("🔄 Initializing form from XBRL input:", this.xbrlInput);
3940
3987
  console.log("📅 Using period dates:", this.periodStartDate, "to", this.periodEndDate);
3988
+ console.log("🌐 Using language:", this.language);
3941
3989
  this._currentSchema = XBRLFormBuilder.buildFormSchema(
3942
3990
  this.xbrlInput,
3943
3991
  this.periodStartDate,
3944
- this.periodEndDate
3992
+ this.periodEndDate,
3993
+ this.language
3945
3994
  );
3946
3995
  console.log("✅ Generated schema with sections:", this._currentSchema.sections.length);
3947
3996
  this._allSections = [...this._currentSchema.sections];
@@ -4900,6 +4949,18 @@ let JupiterDynamicForm = class extends LitElement {
4900
4949
  getState() {
4901
4950
  return this._getFormState();
4902
4951
  }
4952
+ /**
4953
+ * Change the form language and re-render labels while preserving data
4954
+ * @param newLanguage - ISO language code (e.g., 'en', 'nl', 'de')
4955
+ */
4956
+ changeLanguage(newLanguage) {
4957
+ if (this.language === newLanguage) {
4958
+ console.log("🌐 Language already set to", newLanguage);
4959
+ return;
4960
+ }
4961
+ console.log("🌐 Changing language from", this.language, "to", newLanguage);
4962
+ this.language = newLanguage;
4963
+ }
4903
4964
  render() {
4904
4965
  const errorCount = this._errors.filter((e2) => e2.severity === "error").length;
4905
4966
  const config = this.config || {};
@@ -5230,6 +5291,9 @@ __decorateClass([
5230
5291
  __decorateClass([
5231
5292
  n2({ type: String })
5232
5293
  ], JupiterDynamicForm.prototype, "periodEndDate", 2);
5294
+ __decorateClass([
5295
+ n2({ type: String })
5296
+ ], JupiterDynamicForm.prototype, "language", 2);
5233
5297
  __decorateClass([
5234
5298
  r()
5235
5299
  ], JupiterDynamicForm.prototype, "_formData", 2);