jupiter-dynamic-forms 1.18.1 → 1.18.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -620,7 +620,14 @@ class XBRLFormBuilder {
620
620
  */
621
621
  static buildSectionFromRole(role, periodStartDate, periodEndDate, hypercubeData, language = "en", periodPreferences) {
622
622
  var _a, _b;
623
- const title = this.extractRoleTitle(role.role || role.id || "Unknown Role");
623
+ let title;
624
+ if (role.labels && role.labels.length > 0) {
625
+ const langLabel = role.labels.find((l2) => l2.lang === language);
626
+ const fallbackLabel = role.labels.find((l2) => l2.lang === "en") || role.labels[0];
627
+ title = (langLabel || fallbackLabel).label;
628
+ } else {
629
+ title = this.extractRoleTitle(role.role || role.id || "Unknown Role");
630
+ }
624
631
  const nonAbstractConcepts = this.getAllNonAbstractConcepts(role);
625
632
  const periodTypes = new Set(
626
633
  nonAbstractConcepts.filter((concept) => concept.periodType).map((concept) => concept.periodType)
@@ -631,7 +638,7 @@ class XBRLFormBuilder {
631
638
  console.log(`🔍 Filtering dimensions for role ${role.id} based on user selections`);
632
639
  hypercubeRole = this.filterHypercubeDimensionsBySelection(hypercubeRole, rolePreferences.dimensionSelections);
633
640
  }
634
- const columns = this.generateDefaultColumnsForRole(role, periodStartDate || "2025-01-01", periodEndDate || "2025-12-31", hypercubeRole, nonAbstractConcepts, periodTypes, rolePreferences);
641
+ const columns = this.generateDefaultColumnsForRole(role, periodStartDate || "2025-01-01", periodEndDate || "2025-12-31", hypercubeRole, nonAbstractConcepts, periodTypes, rolePreferences, language);
635
642
  const availableColumnIds = columns.map((col) => col.id);
636
643
  const roleInfo = { periodTypes, availableColumnIds, availableColumns: columns };
637
644
  const conceptTrees = [];
@@ -1010,7 +1017,7 @@ class XBRLFormBuilder {
1010
1017
  /**
1011
1018
  * Generate default columns based on period types of non-abstract concepts in a role
1012
1019
  */
1013
- static generateDefaultColumnsForRole(role, periodStartDate, periodEndDate, hypercubeRole, nonAbstractConcepts, rolePeriodTypes, periodPreferences) {
1020
+ static generateDefaultColumnsForRole(role, periodStartDate, periodEndDate, hypercubeRole, nonAbstractConcepts, rolePeriodTypes, periodPreferences, language = "en") {
1014
1021
  var _a, _b;
1015
1022
  const concepts = nonAbstractConcepts || this.getAllNonAbstractConcepts(role);
1016
1023
  const periodTypes = rolePeriodTypes || new Set(
@@ -1030,9 +1037,9 @@ class XBRLFormBuilder {
1030
1037
  if (((_a = hypercubeRole == null ? void 0 : hypercubeRole.items) == null ? void 0 : _a.length) === 1) {
1031
1038
  const item = hypercubeRole.items[0];
1032
1039
  if (item.dimensions.length === 1) {
1033
- dimensionColumns = this.generateSingleDimensionColumns(item.dimensions[0], periodStartDate, periodEndDate, periodTypes);
1040
+ dimensionColumns = this.generateSingleDimensionColumns(item.dimensions[0], periodStartDate, periodEndDate, periodTypes, language);
1034
1041
  } else if (item.dimensions.length > 1) {
1035
- dimensionColumns = this.generateMultiDimensionColumns(item.dimensions, periodStartDate, periodEndDate, periodTypes);
1042
+ dimensionColumns = this.generateMultiDimensionColumns(item.dimensions, periodStartDate, periodEndDate, periodTypes, language);
1036
1043
  }
1037
1044
  if (periodPreferences) {
1038
1045
  dimensionColumns = this.filterColumnsByPeriodPreferences(dimensionColumns, periodPreferences);
@@ -1164,10 +1171,9 @@ class XBRLFormBuilder {
1164
1171
  /**
1165
1172
  * Generate columns for single dimension scenarios
1166
1173
  */
1167
- static generateSingleDimensionColumns(dimension, periodStartDate, periodEndDate, periodTypes) {
1168
- var _a, _b, _c;
1174
+ static generateSingleDimensionColumns(dimension, periodStartDate, periodEndDate, periodTypes, language = "en") {
1169
1175
  if (dimension.typedMember && (!dimension.members || dimension.members.length === 0)) {
1170
- const axisLabel2 = ((_a = dimension.labels.find((l2) => l2.role === "http://www.xbrl.org/2003/role/label")) == null ? void 0 : _a.label) || dimension.conceptName;
1176
+ const axisLabel2 = this.getPreferredLabel(dimension.labels, language) || dimension.conceptName;
1171
1177
  const dimensionInfo2 = {
1172
1178
  axisId: dimension.id,
1173
1179
  axisLabel: axisLabel2,
@@ -1305,9 +1311,9 @@ class XBRLFormBuilder {
1305
1311
  if (dimension.members.length === 0) {
1306
1312
  return [];
1307
1313
  }
1308
- const axisLabel = ((_b = dimension.labels.find((l2) => l2.role === "http://www.xbrl.org/2003/role/label")) == null ? void 0 : _b.label) || dimension.conceptName;
1314
+ const axisLabel = this.getPreferredLabel(dimension.labels, language) || dimension.conceptName;
1309
1315
  const firstMember = dimension.members[0];
1310
- const memberLabel = ((_c = firstMember.labels.find((l2) => l2.role === "http://www.xbrl.org/2003/role/label")) == null ? void 0 : _c.label) || firstMember.conceptName;
1316
+ const memberLabel = this.getPreferredLabel(firstMember.labels, language) || firstMember.conceptName;
1311
1317
  const dimensionInfo = {
1312
1318
  axisId: dimension.id,
1313
1319
  axisLabel,
@@ -1411,7 +1417,7 @@ class XBRLFormBuilder {
1411
1417
  /**
1412
1418
  * Generate columns for multi-dimension scenarios - creates combinations of all dimension members
1413
1419
  */
1414
- static generateMultiDimensionColumns(dimensions, periodStartDate, periodEndDate, periodTypes) {
1420
+ static generateMultiDimensionColumns(dimensions, periodStartDate, periodEndDate, periodTypes, language = "en") {
1415
1421
  dimensions.some((dimension) => dimension.typedMember);
1416
1422
  const validDimensions = dimensions.filter((dimension) => {
1417
1423
  if (dimension.typedMember) {
@@ -1426,8 +1432,7 @@ class XBRLFormBuilder {
1426
1432
  return [];
1427
1433
  }
1428
1434
  const dimensionInfos = validDimensions.map((dimension) => {
1429
- var _a;
1430
- const axisLabel = ((_a = dimension.labels.find((l2) => l2.role === "http://www.xbrl.org/2003/role/label")) == null ? void 0 : _a.label) || dimension.conceptName;
1435
+ const axisLabel = this.getPreferredLabel(dimension.labels, language) || dimension.conceptName;
1431
1436
  if (dimension.typedMember) {
1432
1437
  return {
1433
1438
  id: dimension.id,
@@ -1445,13 +1450,10 @@ class XBRLFormBuilder {
1445
1450
  id: dimension.id,
1446
1451
  axisLabel,
1447
1452
  isTyped: false,
1448
- members: allMembers.map((member) => {
1449
- var _a2;
1450
- return {
1451
- id: member.id,
1452
- label: ((_a2 = member.labels.find((l2) => l2.role === "http://www.xbrl.org/2003/role/label")) == null ? void 0 : _a2.label) || member.conceptName
1453
- };
1454
- })
1453
+ members: allMembers.map((member) => ({
1454
+ id: member.id,
1455
+ label: this.getPreferredLabel(member.labels, language) || member.conceptName
1456
+ }))
1455
1457
  };
1456
1458
  });
1457
1459
  const combinations = this.generateDimensionCombinations(dimensionInfos);
@@ -2695,7 +2697,8 @@ const TYPE_INPUT_MAP = {
2695
2697
  // Monetary values without decimals (whole numbers only)
2696
2698
  "nl-types:monetaryNoDecimals20ItemType": {
2697
2699
  fieldType: "number",
2698
- htmlInputType: "number",
2700
+ htmlInputType: "text",
2701
+ inputMode: "decimal",
2699
2702
  allowDecimals: false,
2700
2703
  step: 1,
2701
2704
  placeholder: I18n.t("field.enterAmountNoDecimals")
@@ -2706,7 +2709,8 @@ const TYPE_INPUT_MAP = {
2706
2709
  // Monetary with decimals
2707
2710
  "xbrli:monetaryItemType": {
2708
2711
  fieldType: "currency",
2709
- htmlInputType: "number",
2712
+ htmlInputType: "text",
2713
+ inputMode: "decimal",
2710
2714
  allowDecimals: true,
2711
2715
  step: 0.01,
2712
2716
  placeholder: I18n.t("field.enterCurrency")
@@ -2729,14 +2733,16 @@ const TYPE_INPUT_MAP = {
2729
2733
  // Numeric types - integers
2730
2734
  "xbrli:integerItemType": {
2731
2735
  fieldType: "integer",
2732
- htmlInputType: "number",
2736
+ htmlInputType: "text",
2737
+ inputMode: "numeric",
2733
2738
  allowDecimals: false,
2734
2739
  step: 1,
2735
2740
  placeholder: I18n.t("field.enterWholeNumber")
2736
2741
  },
2737
2742
  "xbrli:nonNegativeIntegerItemType": {
2738
2743
  fieldType: "integer",
2739
- htmlInputType: "number",
2744
+ htmlInputType: "text",
2745
+ inputMode: "numeric",
2740
2746
  allowDecimals: false,
2741
2747
  min: 0,
2742
2748
  step: 1,
@@ -2744,7 +2750,8 @@ const TYPE_INPUT_MAP = {
2744
2750
  },
2745
2751
  "xbrli:positiveIntegerItemType": {
2746
2752
  fieldType: "integer",
2747
- htmlInputType: "number",
2753
+ htmlInputType: "text",
2754
+ inputMode: "numeric",
2748
2755
  allowDecimals: false,
2749
2756
  min: 1,
2750
2757
  step: 1,
@@ -2753,7 +2760,8 @@ const TYPE_INPUT_MAP = {
2753
2760
  // Numeric types - decimals
2754
2761
  "xbrli:decimalItemType": {
2755
2762
  fieldType: "decimal",
2756
- htmlInputType: "number",
2763
+ htmlInputType: "text",
2764
+ inputMode: "decimal",
2757
2765
  allowDecimals: true,
2758
2766
  step: "any",
2759
2767
  placeholder: I18n.t("field.enterDecimalValue")
@@ -2761,7 +2769,8 @@ const TYPE_INPUT_MAP = {
2761
2769
  // Shares (typically whole numbers or with limited decimals)
2762
2770
  "xbrli:sharesItemType": {
2763
2771
  fieldType: "number",
2764
- htmlInputType: "number",
2772
+ htmlInputType: "text",
2773
+ inputMode: "decimal",
2765
2774
  allowDecimals: true,
2766
2775
  min: 0,
2767
2776
  step: 0.01,
@@ -2769,7 +2778,8 @@ const TYPE_INPUT_MAP = {
2769
2778
  },
2770
2779
  "xbrli:shares": {
2771
2780
  fieldType: "number",
2772
- htmlInputType: "number",
2781
+ htmlInputType: "text",
2782
+ inputMode: "decimal",
2773
2783
  allowDecimals: true,
2774
2784
  min: 0,
2775
2785
  step: 0.01,
@@ -2778,7 +2788,8 @@ const TYPE_INPUT_MAP = {
2778
2788
  // Year (gYear)
2779
2789
  "xbrli:gYearItemType": {
2780
2790
  fieldType: "number",
2781
- htmlInputType: "number",
2791
+ htmlInputType: "text",
2792
+ inputMode: "numeric",
2782
2793
  allowDecimals: false,
2783
2794
  min: 1900,
2784
2795
  max: 2100,
@@ -2794,14 +2805,16 @@ const TYPE_INPUT_MAP = {
2794
2805
  // ==========================================
2795
2806
  "xbrli:pureItemType": {
2796
2807
  fieldType: "percentage",
2797
- htmlInputType: "number",
2808
+ htmlInputType: "text",
2809
+ inputMode: "decimal",
2798
2810
  allowDecimals: true,
2799
2811
  step: 0.01,
2800
2812
  placeholder: I18n.t("field.enterPercentage")
2801
2813
  },
2802
2814
  "xbrli:percentItemType": {
2803
2815
  fieldType: "percentage",
2804
- htmlInputType: "number",
2816
+ htmlInputType: "text",
2817
+ inputMode: "decimal",
2805
2818
  allowDecimals: true,
2806
2819
  step: 0.01,
2807
2820
  placeholder: I18n.t("field.enterPercentage")
@@ -2849,7 +2862,8 @@ function getInputTypeForConceptType(conceptType, datatypes) {
2849
2862
  if (lowerType.includes("nodecimals") || lowerType.includes("no-decimals")) {
2850
2863
  return {
2851
2864
  fieldType: "number",
2852
- htmlInputType: "number",
2865
+ htmlInputType: "text",
2866
+ inputMode: "decimal",
2853
2867
  allowDecimals: false,
2854
2868
  step: 1,
2855
2869
  placeholder: I18n.t("field.enterAmountNoDecimals")
@@ -2857,7 +2871,8 @@ function getInputTypeForConceptType(conceptType, datatypes) {
2857
2871
  }
2858
2872
  return {
2859
2873
  fieldType: "currency",
2860
- htmlInputType: "number",
2874
+ htmlInputType: "text",
2875
+ inputMode: "decimal",
2861
2876
  allowDecimals: true,
2862
2877
  step: 0.01,
2863
2878
  placeholder: I18n.t("field.enterCurrency")
@@ -2891,7 +2906,8 @@ function getInputTypeForConceptType(conceptType, datatypes) {
2891
2906
  const isPositive = lowerType.includes("positive");
2892
2907
  return {
2893
2908
  fieldType: "integer",
2894
- htmlInputType: "number",
2909
+ htmlInputType: "text",
2910
+ inputMode: "numeric",
2895
2911
  allowDecimals: false,
2896
2912
  min: isPositive ? 1 : isNonNegative ? 0 : void 0,
2897
2913
  step: 1,
@@ -2901,7 +2917,8 @@ function getInputTypeForConceptType(conceptType, datatypes) {
2901
2917
  if (lowerType.includes("decimal") || lowerType.includes("numeric") || lowerType.includes("number")) {
2902
2918
  return {
2903
2919
  fieldType: "decimal",
2904
- htmlInputType: "number",
2920
+ htmlInputType: "text",
2921
+ inputMode: "decimal",
2905
2922
  allowDecimals: true,
2906
2923
  step: "any",
2907
2924
  placeholder: I18n.t("field.enterDecimalValue")
@@ -2910,7 +2927,8 @@ function getInputTypeForConceptType(conceptType, datatypes) {
2910
2927
  if (lowerType.includes("percent") || lowerType.includes("pure")) {
2911
2928
  return {
2912
2929
  fieldType: "percentage",
2913
- htmlInputType: "number",
2930
+ htmlInputType: "text",
2931
+ inputMode: "decimal",
2914
2932
  allowDecimals: true,
2915
2933
  step: 0.01,
2916
2934
  placeholder: I18n.t("field.enterPercentage")
@@ -3026,7 +3044,8 @@ function determineInputTypeFromBaseChain(baseTypeChain, datatypes) {
3026
3044
  const isPositive = chainString.includes("positive");
3027
3045
  return {
3028
3046
  fieldType: "integer",
3029
- htmlInputType: "number",
3047
+ htmlInputType: "text",
3048
+ inputMode: "numeric",
3030
3049
  allowDecimals: false,
3031
3050
  min: isPositive ? 1 : isNonNegative ? 0 : void 0,
3032
3051
  step: 1,
@@ -3038,7 +3057,8 @@ function determineInputTypeFromBaseChain(baseTypeChain, datatypes) {
3038
3057
  if (chainString.includes("nodecimals") || chainString.includes("no-decimals") || chainString.includes("nodecimals20")) {
3039
3058
  return {
3040
3059
  fieldType: "number",
3041
- htmlInputType: "number",
3060
+ htmlInputType: "text",
3061
+ inputMode: "decimal",
3042
3062
  allowDecimals: false,
3043
3063
  step: 1,
3044
3064
  placeholder: I18n.t("field.enterAmountNoDecimals")
@@ -3046,7 +3066,8 @@ function determineInputTypeFromBaseChain(baseTypeChain, datatypes) {
3046
3066
  }
3047
3067
  return {
3048
3068
  fieldType: "currency",
3049
- htmlInputType: "number",
3069
+ htmlInputType: "text",
3070
+ inputMode: "decimal",
3050
3071
  allowDecimals: true,
3051
3072
  step: 0.01,
3052
3073
  placeholder: I18n.t("field.enterCurrency")
@@ -3054,7 +3075,8 @@ function determineInputTypeFromBaseChain(baseTypeChain, datatypes) {
3054
3075
  }
3055
3076
  return {
3056
3077
  fieldType: "decimal",
3057
- htmlInputType: "number",
3078
+ htmlInputType: "text",
3079
+ inputMode: "decimal",
3058
3080
  allowDecimals: true,
3059
3081
  step: "any",
3060
3082
  placeholder: I18n.t("field.enterDecimalValue")
@@ -3244,7 +3266,7 @@ let JupiterFormField = class extends LitElement {
3244
3266
  */
3245
3267
  _handleKeyDown(event) {
3246
3268
  const target = event.target;
3247
- if (target.type !== "number") {
3269
+ if (!this._isNumericField()) {
3248
3270
  return;
3249
3271
  }
3250
3272
  const allowedKeys = [
@@ -3266,10 +3288,12 @@ let JupiterFormField = class extends LitElement {
3266
3288
  if (event.ctrlKey || event.metaKey) {
3267
3289
  return;
3268
3290
  }
3269
- if (event.key === "-" && !target.value.includes("-") && (target.selectionStart === 0 || target.selectionStart === null || target.value.length === 0)) {
3291
+ const typeConfig = getInputTypeForConceptType(this.conceptType, this.datatypes);
3292
+ const allowNegative = typeConfig.min === void 0 || typeConfig.min < 0;
3293
+ if (event.key === "-" && allowNegative && !target.value.includes("-") && (target.selectionStart === 0 || target.value.length === 0)) {
3270
3294
  return;
3271
3295
  }
3272
- if (event.key === "." && !target.value.includes(".")) {
3296
+ if (event.key === "." && typeConfig.allowDecimals !== false && !target.value.includes(".")) {
3273
3297
  return;
3274
3298
  }
3275
3299
  if (event.key >= "0" && event.key <= "9") {
@@ -3757,6 +3781,7 @@ let JupiterFormField = class extends LitElement {
3757
3781
  id="${fieldId}"
3758
3782
  name="${fieldName}"
3759
3783
  type="${inputType}"
3784
+ inputmode="${typeConfig.inputMode || ""}"
3760
3785
  class="${cssClass}"
3761
3786
  .value="${renderedInputValue}"
3762
3787
  ?disabled="${effectiveDisabled || this.field.disabled}"
@@ -3777,7 +3802,7 @@ let JupiterFormField = class extends LitElement {
3777
3802
  case "decimal":
3778
3803
  case "currency":
3779
3804
  case "percentage":
3780
- return "number";
3805
+ return "text";
3781
3806
  case "date":
3782
3807
  return "date";
3783
3808
  case "datetime":
@@ -5495,7 +5520,7 @@ JupiterAddColumnDialog.styles = css`
5495
5520
  width: 100%;
5496
5521
  height: 100%;
5497
5522
  background: rgba(0, 0, 0, 0.5);
5498
- z-index: 1000;
5523
+ z-index: 1100;
5499
5524
  display: flex;
5500
5525
  align-items: center;
5501
5526
  justify-content: center;
@@ -5549,7 +5574,7 @@ JupiterAddColumnDialog.styles = css`
5549
5574
  margin-bottom: 24px;
5550
5575
  flex: 1;
5551
5576
  overflow-y: auto;
5552
- max-height: calc(90vh - 160px);
5577
+ min-height: 0;
5553
5578
  }
5554
5579
 
5555
5580
  .date-wrapper {
@@ -7242,21 +7267,78 @@ let JupiterFilterRolesDialog = class extends LitElement {
7242
7267
  this._tempPeriodPreferences = newPreferences;
7243
7268
  this.requestUpdate();
7244
7269
  }
7270
+ _enforceSingleMemberSelectionsForRole(roleId, preferences) {
7271
+ const dimensions = this._getDimensionsForRole(roleId);
7272
+ if (dimensions.length === 0) {
7273
+ return preferences;
7274
+ }
7275
+ const nextPreferences = { ...preferences };
7276
+ const rolePreferences = nextPreferences[roleId] ? { ...nextPreferences[roleId] } : {
7277
+ showDuration: true,
7278
+ showInstant: true,
7279
+ showPreviousYear: false,
7280
+ dimensionSelections: []
7281
+ };
7282
+ const selections = rolePreferences.dimensionSelections ? [...rolePreferences.dimensionSelections] : [];
7283
+ dimensions.forEach((dimension) => {
7284
+ var _a, _b;
7285
+ if (!this._isSingleMemberDimension(dimension)) {
7286
+ return;
7287
+ }
7288
+ const allMembers = this._getAllDimensionMembers(dimension.members);
7289
+ if (allMembers.length !== 1) {
7290
+ return;
7291
+ }
7292
+ const onlyMemberId = allMembers[0].id;
7293
+ const dimensionLabel = ((_b = (_a = dimension.labels) == null ? void 0 : _a.find((l2) => l2.role === "http://www.xbrl.org/2003/role/label")) == null ? void 0 : _b.label) || dimension.conceptName || dimension.id;
7294
+ const selectionIndex = selections.findIndex((ds) => ds.dimensionId === dimension.id);
7295
+ if (selectionIndex === -1) {
7296
+ selections.push({
7297
+ dimensionId: dimension.id,
7298
+ dimensionLabel,
7299
+ selectedMemberIds: [onlyMemberId]
7300
+ });
7301
+ return;
7302
+ }
7303
+ selections[selectionIndex] = {
7304
+ ...selections[selectionIndex],
7305
+ dimensionLabel,
7306
+ selectedMemberIds: [onlyMemberId]
7307
+ };
7308
+ });
7309
+ rolePreferences.dimensionSelections = selections;
7310
+ nextPreferences[roleId] = rolePreferences;
7311
+ return nextPreferences;
7312
+ }
7313
+ _enforceSingleMemberSelectionsForSelectedRoles(preferences, selectedRoles = this._tempSelectedRoles) {
7314
+ let nextPreferences = { ...preferences };
7315
+ for (const roleId of selectedRoles) {
7316
+ nextPreferences = this._enforceSingleMemberSelectionsForRole(roleId, nextPreferences);
7317
+ }
7318
+ return nextPreferences;
7319
+ }
7245
7320
  _handleCheckboxChange(event, roleId) {
7246
7321
  const checkbox = event.target;
7247
7322
  const newSelection = new Set(this._tempSelectedRoles);
7323
+ let newPreferences = { ...this._tempPeriodPreferences };
7248
7324
  if (checkbox.checked) {
7249
7325
  newSelection.add(roleId);
7326
+ newPreferences = this._enforceSingleMemberSelectionsForRole(roleId, newPreferences);
7250
7327
  } else {
7251
7328
  newSelection.delete(roleId);
7252
7329
  }
7253
7330
  this._tempSelectedRoles = newSelection;
7331
+ this._tempPeriodPreferences = newPreferences;
7254
7332
  this.requestUpdate();
7255
7333
  }
7256
7334
  _selectAll() {
7257
7335
  const newSelection = new Set(this._tempSelectedRoles);
7258
7336
  this._filteredRoles.forEach((role) => newSelection.add(role.id));
7259
7337
  this._tempSelectedRoles = newSelection;
7338
+ this._tempPeriodPreferences = this._enforceSingleMemberSelectionsForSelectedRoles(
7339
+ this._tempPeriodPreferences,
7340
+ newSelection
7341
+ );
7260
7342
  this.requestUpdate();
7261
7343
  }
7262
7344
  _selectNone() {
@@ -7266,7 +7348,12 @@ let JupiterFilterRolesDialog = class extends LitElement {
7266
7348
  this.requestUpdate();
7267
7349
  }
7268
7350
  _selectAllGlobal() {
7269
- this._tempSelectedRoles = new Set(this.availableRoles.map((role) => role.id));
7351
+ const newSelection = new Set(this.availableRoles.map((role) => role.id));
7352
+ this._tempSelectedRoles = newSelection;
7353
+ this._tempPeriodPreferences = this._enforceSingleMemberSelectionsForSelectedRoles(
7354
+ this._tempPeriodPreferences,
7355
+ newSelection
7356
+ );
7270
7357
  this.requestUpdate();
7271
7358
  }
7272
7359
  _selectNoneGlobal() {
@@ -7275,6 +7362,10 @@ let JupiterFilterRolesDialog = class extends LitElement {
7275
7362
  }
7276
7363
  _resetToOriginal() {
7277
7364
  this._tempSelectedRoles = new Set(this.selectedRoleIds);
7365
+ this._tempPeriodPreferences = this._enforceSingleMemberSelectionsForSelectedRoles(
7366
+ this._tempPeriodPreferences,
7367
+ this._tempSelectedRoles
7368
+ );
7278
7369
  this.requestUpdate();
7279
7370
  }
7280
7371
  _handleCancel() {
@@ -7284,6 +7375,11 @@ let JupiterFilterRolesDialog = class extends LitElement {
7284
7375
  }));
7285
7376
  }
7286
7377
  _handleApply() {
7378
+ const normalizedPreferences = this._enforceSingleMemberSelectionsForSelectedRoles(
7379
+ this._tempPeriodPreferences,
7380
+ this._tempSelectedRoles
7381
+ );
7382
+ this._tempPeriodPreferences = normalizedPreferences;
7287
7383
  const orderedSelected = this._chosenRoleOrder.filter((id) => this._tempSelectedRoles.has(id));
7288
7384
  const notInOrder = Array.from(this._tempSelectedRoles).filter((id) => !this._chosenRoleOrder.includes(id));
7289
7385
  this._chosenRoleOrder = [...orderedSelected, ...notInOrder];
@@ -7298,11 +7394,11 @@ let JupiterFilterRolesDialog = class extends LitElement {
7298
7394
  });
7299
7395
  console.log("✅ Apply Filter - Enhanced structure being emitted:", orderedRolesWithMetadata);
7300
7396
  console.log("📋 Order array:", this._chosenRoleOrder);
7301
- console.log("📊 Dimension preferences being emitted:", this._tempPeriodPreferences);
7397
+ console.log("📊 Dimension preferences being emitted:", normalizedPreferences);
7302
7398
  this.dispatchEvent(new CustomEvent("roles-filter-apply", {
7303
7399
  detail: {
7304
7400
  selectedRoleIds: orderedRolesWithMetadata,
7305
- periodPreferences: this._tempPeriodPreferences
7401
+ periodPreferences: normalizedPreferences
7306
7402
  },
7307
7403
  bubbles: true
7308
7404
  }));
@@ -7408,9 +7504,9 @@ let JupiterFilterRolesDialog = class extends LitElement {
7408
7504
  (ds) => ds.dimensionId === dimensionId
7409
7505
  );
7410
7506
  if (!dimensionSelection) {
7411
- const dimensions = this._getDimensionsForRole(roleId);
7412
- const dimension = dimensions.find((d2) => d2.id === dimensionId);
7413
- const dimensionLabel = ((_b = (_a = dimension == null ? void 0 : dimension.labels) == null ? void 0 : _a.find((l2) => l2.role === "http://www.xbrl.org/2003/role/label")) == null ? void 0 : _b.label) || dimensionId;
7507
+ const dimensions2 = this._getDimensionsForRole(roleId);
7508
+ const dimension2 = dimensions2.find((d2) => d2.id === dimensionId);
7509
+ const dimensionLabel = ((_b = (_a = dimension2 == null ? void 0 : dimension2.labels) == null ? void 0 : _a.find((l2) => l2.role === "http://www.xbrl.org/2003/role/label")) == null ? void 0 : _b.label) || dimensionId;
7414
7510
  dimensionSelection = {
7415
7511
  dimensionId,
7416
7512
  dimensionLabel,
@@ -7427,6 +7523,15 @@ let JupiterFilterRolesDialog = class extends LitElement {
7427
7523
  (id) => id !== memberId
7428
7524
  );
7429
7525
  }
7526
+ const dimensions = this._getDimensionsForRole(roleId);
7527
+ const dimension = dimensions.find((d2) => d2.id === dimensionId);
7528
+ if (dimension && this._tempSelectedRoles.has(roleId) && this._isSingleMemberDimension(dimension)) {
7529
+ const allMembers = this._getAllDimensionMembers(dimension.members);
7530
+ if (allMembers.length === 1) {
7531
+ dimensionSelection.selectedMemberIds = [allMembers[0].id];
7532
+ checkbox.checked = true;
7533
+ }
7534
+ }
7430
7535
  this._tempPeriodPreferences = newPreferences;
7431
7536
  console.log("📊 Updated dimension selections:", newPreferences[roleId].dimensionSelections);
7432
7537
  this.requestUpdate();
@@ -7540,6 +7645,10 @@ let JupiterFilterRolesDialog = class extends LitElement {
7540
7645
  const newSelection = new Set(this._tempSelectedRoles);
7541
7646
  newSelection.add(this._selectedAvailableRole);
7542
7647
  this._tempSelectedRoles = newSelection;
7648
+ this._tempPeriodPreferences = this._enforceSingleMemberSelectionsForRole(
7649
+ this._selectedAvailableRole,
7650
+ this._tempPeriodPreferences
7651
+ );
7543
7652
  if (!this._chosenRoleOrder.includes(this._selectedAvailableRole)) {
7544
7653
  this._chosenRoleOrder = [...this._chosenRoleOrder, this._selectedAvailableRole];
7545
7654
  }
@@ -7565,6 +7674,10 @@ let JupiterFilterRolesDialog = class extends LitElement {
7565
7674
  }
7566
7675
  });
7567
7676
  this._tempSelectedRoles = newSelection;
7677
+ this._tempPeriodPreferences = this._enforceSingleMemberSelectionsForSelectedRoles(
7678
+ this._tempPeriodPreferences,
7679
+ newSelection
7680
+ );
7568
7681
  this._selectedAvailableRole = null;
7569
7682
  this.requestUpdate();
7570
7683
  }
@@ -7935,7 +8048,6 @@ let JupiterFilterRolesDialog = class extends LitElement {
7935
8048
  return html``;
7936
8049
  }
7937
8050
  const dimensionLabel = ((_b = (_a2 = dimension.labels) == null ? void 0 : _a2.find((l2) => l2.role === "http://www.xbrl.org/2003/role/label")) == null ? void 0 : _b.label) || dimension.conceptName;
7938
- const isSingleMember = this._isSingleMemberDimension(dimension);
7939
8051
  return html`
7940
8052
  <div class="dimension-group">
7941
8053
  <div class="dimension-label">${dimensionLabel}</div>
@@ -7950,7 +8062,6 @@ let JupiterFilterRolesDialog = class extends LitElement {
7950
8062
  type="checkbox"
7951
8063
  class="member-checkbox"
7952
8064
  .checked="${isChecked}"
7953
- ?disabled="${isSingleMember}"
7954
8065
  @change="${(e2) => this._handleDimensionMemberChange(e2, role.id, dimension.id, member.id)}"
7955
8066
  />
7956
8067
  <span class="member-checkbox-label">${memberLabel}</span>
@@ -7958,22 +8069,20 @@ let JupiterFilterRolesDialog = class extends LitElement {
7958
8069
  `;
7959
8070
  })}
7960
8071
  </div>
7961
- ${!isSingleMember ? html`
7962
- <div class="member-select-controls">
7963
- <button
7964
- class="member-select-btn"
7965
- @click="${() => this._selectAllDimensionMembers(role.id, dimension.id)}"
7966
- >
7967
- ${I18n.t("filter.selectAllMembers")}
7968
- </button>
7969
- <button
7970
- class="member-select-btn"
7971
- @click="${() => this._deselectAllDimensionMembers(role.id, dimension.id)}"
7972
- >
7973
- ${I18n.t("filter.clearMembers")}
7974
- </button>
7975
- </div>
7976
- ` : ""}
8072
+ <div class="member-select-controls">
8073
+ <button
8074
+ class="member-select-btn"
8075
+ @click="${() => this._selectAllDimensionMembers(role.id, dimension.id)}"
8076
+ >
8077
+ ${I18n.t("filter.selectAllMembers")}
8078
+ </button>
8079
+ <button
8080
+ class="member-select-btn"
8081
+ @click="${() => this._deselectAllDimensionMembers(role.id, dimension.id)}"
8082
+ >
8083
+ ${I18n.t("filter.clearMembers")}
8084
+ </button>
8085
+ </div>
7977
8086
  </div>
7978
8087
  `;
7979
8088
  })}
@@ -9440,6 +9549,8 @@ let JupiterDynamicForm = class extends LitElement {
9440
9549
  );
9441
9550
  this._draftStorageService.saveDraft(currentFormData, currentMetadata);
9442
9551
  console.log("✅ Current form data saved to draft storage with NEW preferences");
9552
+ this.dynaformsFacts = currentFormData;
9553
+ this.dynaformsMetadata = currentMetadata;
9443
9554
  this._skipPeriodPreferencesRestore = true;
9444
9555
  this._skipDraftLoading = true;
9445
9556
  console.log("🔄 Reinitializing form with new filter settings...");
@@ -10025,25 +10136,26 @@ let JupiterDynamicForm = class extends LitElement {
10025
10136
  return [];
10026
10137
  }
10027
10138
  const availableDimensions = [];
10139
+ const lang = this.language || "en";
10140
+ const pickLabel = (labels, fallback) => {
10141
+ var _a2;
10142
+ return ((_a2 = (labels == null ? void 0 : labels.find((l2) => l2.lang === lang && l2.role === "http://www.xbrl.org/2003/role/label")) || (labels == null ? void 0 : labels.find((l2) => l2.lang === "en" && l2.role === "http://www.xbrl.org/2003/role/label")) || (labels == null ? void 0 : labels.find((l2) => l2.role === "http://www.xbrl.org/2003/role/label"))) == null ? void 0 : _a2.label) || fallback;
10143
+ };
10028
10144
  hypercubeRole.items.forEach((item) => {
10029
10145
  if (item.dimensions && item.dimensions.length > 0) {
10030
10146
  item.dimensions.forEach((dimension) => {
10031
- var _a2;
10032
10147
  if (!availableDimensions.find((d2) => d2.id === dimension.id)) {
10033
- const axisLabel = ((_a2 = dimension.labels.find((l2) => l2.role === "http://www.xbrl.org/2003/role/label")) == null ? void 0 : _a2.label) || dimension.conceptName;
10148
+ const axisLabel = pickLabel(dimension.labels, dimension.conceptName);
10034
10149
  const availableDimension = {
10035
10150
  id: dimension.id,
10036
10151
  conceptName: dimension.conceptName,
10037
10152
  axisLabel
10038
10153
  };
10039
10154
  if (dimension.members && dimension.members.length > 0) {
10040
- availableDimension.members = dimension.members.map((member) => {
10041
- var _a3, _b2;
10042
- return {
10043
- id: member.id,
10044
- label: ((_b2 = (_a3 = member.labels) == null ? void 0 : _a3.find((l2) => l2.role === "http://www.xbrl.org/2003/role/label")) == null ? void 0 : _b2.label) || member.conceptName || member.id
10045
- };
10046
- });
10155
+ availableDimension.members = dimension.members.map((member) => ({
10156
+ id: member.id,
10157
+ label: pickLabel(member.labels, member.conceptName || member.id)
10158
+ }));
10047
10159
  }
10048
10160
  if (dimension.typedMember) {
10049
10161
  availableDimension.typedMember = {