jupiter-dynamic-forms 1.18.1 → 1.18.2
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/core/dynamic-form.d.ts.map +1 -1
- package/dist/core/filter-roles-dialog.d.ts +2 -0
- package/dist/core/filter-roles-dialog.d.ts.map +1 -1
- package/dist/core/form-field.d.ts.map +1 -1
- package/dist/index.js +122 -124
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +189 -79
- package/dist/index.mjs.map +1 -1
- package/dist/schema/xbrl-types.d.ts +1 -0
- package/dist/schema/xbrl-types.d.ts.map +1 -1
- package/dist/utils/type-input-mapping.d.ts +2 -0
- package/dist/utils/type-input-mapping.d.ts.map +1 -1
- package/dist/utils/xbrl-form-builder.d.ts +1 -1
- package/dist/utils/xbrl-form-builder.d.ts.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
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 = (
|
|
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 = (
|
|
1314
|
+
const axisLabel = this.getPreferredLabel(dimension.labels, language) || dimension.conceptName;
|
|
1309
1315
|
const firstMember = dimension.members[0];
|
|
1310
|
-
const memberLabel = (
|
|
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
|
-
|
|
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
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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 (
|
|
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
|
-
|
|
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 "
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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:",
|
|
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:
|
|
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
|
|
7412
|
-
const
|
|
7413
|
-
const dimensionLabel = ((_b = (_a =
|
|
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
|
-
|
|
7962
|
-
<
|
|
7963
|
-
|
|
7964
|
-
|
|
7965
|
-
|
|
7966
|
-
|
|
7967
|
-
|
|
7968
|
-
|
|
7969
|
-
|
|
7970
|
-
|
|
7971
|
-
|
|
7972
|
-
|
|
7973
|
-
|
|
7974
|
-
|
|
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
|
})}
|
|
@@ -10025,25 +10134,26 @@ let JupiterDynamicForm = class extends LitElement {
|
|
|
10025
10134
|
return [];
|
|
10026
10135
|
}
|
|
10027
10136
|
const availableDimensions = [];
|
|
10137
|
+
const lang = this.language || "en";
|
|
10138
|
+
const pickLabel = (labels, fallback) => {
|
|
10139
|
+
var _a2;
|
|
10140
|
+
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;
|
|
10141
|
+
};
|
|
10028
10142
|
hypercubeRole.items.forEach((item) => {
|
|
10029
10143
|
if (item.dimensions && item.dimensions.length > 0) {
|
|
10030
10144
|
item.dimensions.forEach((dimension) => {
|
|
10031
|
-
var _a2;
|
|
10032
10145
|
if (!availableDimensions.find((d2) => d2.id === dimension.id)) {
|
|
10033
|
-
const axisLabel = (
|
|
10146
|
+
const axisLabel = pickLabel(dimension.labels, dimension.conceptName);
|
|
10034
10147
|
const availableDimension = {
|
|
10035
10148
|
id: dimension.id,
|
|
10036
10149
|
conceptName: dimension.conceptName,
|
|
10037
10150
|
axisLabel
|
|
10038
10151
|
};
|
|
10039
10152
|
if (dimension.members && dimension.members.length > 0) {
|
|
10040
|
-
availableDimension.members = dimension.members.map((member) => {
|
|
10041
|
-
|
|
10042
|
-
|
|
10043
|
-
|
|
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
|
-
});
|
|
10153
|
+
availableDimension.members = dimension.members.map((member) => ({
|
|
10154
|
+
id: member.id,
|
|
10155
|
+
label: pickLabel(member.labels, member.conceptName || member.id)
|
|
10156
|
+
}));
|
|
10047
10157
|
}
|
|
10048
10158
|
if (dimension.typedMember) {
|
|
10049
10159
|
availableDimension.typedMember = {
|