jupiter-dynamic-forms 1.16.2 → 1.16.4

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
@@ -607,11 +607,12 @@ class XBRLFormBuilder {
607
607
  };
608
608
  }
609
609
  /**
610
- * Build a form section from a presentation role
610
+ * Extract section title from role name (remove role number prefix)
611
+ * Handle missing role property gracefully by using role ID as fallback
611
612
  */
612
613
  static buildSectionFromRole(role, periodStartDate, periodEndDate, hypercubeData, language = "en", periodPreferences) {
613
- var _a;
614
- const title = this.extractRoleTitle(role.role);
614
+ var _a, _b;
615
+ const title = this.extractRoleTitle(role.role || role.id || "Unknown Role");
615
616
  const nonAbstractConcepts = this.getAllNonAbstractConcepts(role);
616
617
  const periodTypes = new Set(
617
618
  nonAbstractConcepts.filter((concept) => concept.periodType).map((concept) => concept.periodType)
@@ -634,6 +635,11 @@ class XBRLFormBuilder {
634
635
  }
635
636
  });
636
637
  }
638
+ if ((!hypercubeRole || !((_b = hypercubeRole.items) == null ? void 0 : _b.length)) && hypercubeData) {
639
+ conceptTrees.forEach(
640
+ (conceptTree) => this.applyCrossRoleDimensions(conceptTree, role.id, hypercubeData, language)
641
+ );
642
+ }
637
643
  return {
638
644
  id: role.id,
639
645
  title,
@@ -894,6 +900,73 @@ class XBRLFormBuilder {
894
900
  });
895
901
  return filtered;
896
902
  }
903
+ /**
904
+ * Find typed dimension members from another role that shares the same concept.
905
+ * Called when the current role has no hypercube dimensions.
906
+ * Returns typed member info only when EXACTLY ONE other role matches.
907
+ */
908
+ static findCrossRoleDimensions(conceptId, currentRoleId, hypercubeData, language = "en") {
909
+ var _a, _b;
910
+ const matchingRoles = [];
911
+ for (const role of hypercubeData.roles) {
912
+ if (role.roleId === currentRoleId)
913
+ continue;
914
+ for (const item2 of role.items) {
915
+ if (!((_a = item2.conceptIds) == null ? void 0 : _a.includes(conceptId)))
916
+ continue;
917
+ if (!((_b = item2.dimensions) == null ? void 0 : _b.some((d2) => d2.typedMember)))
918
+ continue;
919
+ matchingRoles.push(role);
920
+ break;
921
+ }
922
+ }
923
+ if (matchingRoles.length !== 1)
924
+ return null;
925
+ const matchingRole = matchingRoles[0];
926
+ const item = matchingRole.items.find((i2) => {
927
+ var _a2;
928
+ return (_a2 = i2.conceptIds) == null ? void 0 : _a2.includes(conceptId);
929
+ });
930
+ if (!item)
931
+ return null;
932
+ const result = [];
933
+ for (const dimension of item.dimensions) {
934
+ if (!dimension.typedMember)
935
+ continue;
936
+ const labelObj = dimension.labels.find((l2) => l2.lang === language) || dimension.labels.find((l2) => l2.lang === "en") || dimension.labels[0];
937
+ const axisLabel = (labelObj == null ? void 0 : labelObj.label) || dimension.id;
938
+ result.push({
939
+ axisId: dimension.id,
940
+ axisLabel,
941
+ typedMemberId: dimension.typedMember.id,
942
+ memberLabel: axisLabel
943
+ });
944
+ }
945
+ return result.length > 0 ? result : null;
946
+ }
947
+ /**
948
+ * Recursively walk a concept tree and set crossRoleTypedMembers on every field
949
+ * whose concept appears in exactly one other hypercube role with typed dimensions.
950
+ */
951
+ static applyCrossRoleDimensions(conceptTree, currentRoleId, hypercubeData, language) {
952
+ var _a;
953
+ if (!conceptTree.abstract && conceptTree.fields && conceptTree.fields.length > 0) {
954
+ const crossRoleTypedMembers = this.findCrossRoleDimensions(
955
+ conceptTree.originalConceptId,
956
+ currentRoleId,
957
+ hypercubeData,
958
+ language
959
+ );
960
+ if (crossRoleTypedMembers) {
961
+ conceptTree.fields.forEach((field2) => {
962
+ field2.crossRoleTypedMembers = crossRoleTypedMembers;
963
+ });
964
+ }
965
+ }
966
+ (_a = conceptTree.children) == null ? void 0 : _a.forEach(
967
+ (child) => this.applyCrossRoleDimensions(child, currentRoleId, hypercubeData, language)
968
+ );
969
+ }
897
970
  /**
898
971
  * Generate default columns based on period types of non-abstract concepts in a role
899
972
  */
@@ -1473,10 +1546,21 @@ class XBRLFormBuilder {
1473
1546
  }
1474
1547
  /**
1475
1548
  * Extract role title from role string
1549
+ * Handles various role formats and missing data gracefully
1476
1550
  */
1477
1551
  static extractRoleTitle(role) {
1552
+ if (!role)
1553
+ return "Unnamed Section";
1478
1554
  const match = role.match(/^\[[\d]+\]\s*(.+)$/);
1479
- return match ? match[1].trim() : role;
1555
+ if (match) {
1556
+ return match[1].trim();
1557
+ }
1558
+ if (role.match(/^[a-z]+:[^:]*$/i) || role.match(/^urn:[^:]+:[^:]+/i)) {
1559
+ const parts = role.split(/[:\-]/);
1560
+ const lastPart = parts[parts.length - 1];
1561
+ return lastPart.replace(/[_\-]/g, " ").replace(/\b\w/g, (l2) => l2.toUpperCase());
1562
+ }
1563
+ return role.trim() || "Unnamed Section";
1480
1564
  }
1481
1565
  /**
1482
1566
  * Extract role order from role string
@@ -2024,11 +2108,12 @@ class DraftStorageService {
2024
2108
  /**
2025
2109
  * Create metadata snapshot from current form state
2026
2110
  */
2027
- createMetadataSnapshot(periodStartDate, periodEndDate, language, selectedRoleIds, allSections, typedMemberData, periodPreferences, periodData, unitData) {
2111
+ createMetadataSnapshot(periodStartDate, periodEndDate, language, selectedRoleIds, allSections, typedMemberData, periodPreferences, periodData, unitData, reportingLanguage = "en", repeatCounts) {
2028
2112
  return {
2029
2113
  periodStartDate,
2030
2114
  periodEndDate,
2031
2115
  language,
2116
+ reportingLanguage,
2032
2117
  selectedRoleIds,
2033
2118
  // Store enhanced structure (with roleURI and order) or legacy string array
2034
2119
  customColumns: this.extractCustomColumns(allSections),
@@ -2036,6 +2121,7 @@ class DraftStorageService {
2036
2121
  periodPreferences,
2037
2122
  periodData,
2038
2123
  unitData,
2124
+ repeatCounts,
2039
2125
  schemaVersion: this.STORAGE_VERSION
2040
2126
  };
2041
2127
  }
@@ -2645,7 +2731,6 @@ function getInputTypeForConceptType(conceptType, datatypes) {
2645
2731
  const baseTypeChain = resolveBaseTypeChain(conceptType, datatypes);
2646
2732
  if (baseTypeChain.length > 0) {
2647
2733
  const config = determineInputTypeFromBaseChain(baseTypeChain, datatypes);
2648
- console.log(`🔍 [Type Resolution] ${conceptType} → Chain:`, baseTypeChain, "→ Type:", config.fieldType, config.enumerations ? `(${config.enumerations.length} options)` : "");
2649
2734
  return config;
2650
2735
  }
2651
2736
  }
@@ -2902,6 +2987,7 @@ let JupiterFormField = class extends LitElement {
2902
2987
  this.locale = "en-US";
2903
2988
  this.hideLabel = false;
2904
2989
  this.mode = "inputForm";
2990
+ this.typedMemberValues = {};
2905
2991
  this._errors = [];
2906
2992
  this._xbrlErrors = [];
2907
2993
  this._touched = false;
@@ -3240,6 +3326,20 @@ let JupiterFormField = class extends LitElement {
3240
3326
  periodType: this.field.periodType
3241
3327
  });
3242
3328
  }
3329
+ _handleCrossRoleTypedMemberChange(event, axisId) {
3330
+ const value = event.target.value;
3331
+ this.typedMemberValues = { ...this.typedMemberValues, [axisId]: value };
3332
+ this.dispatchEvent(new CustomEvent("typed-member-change", {
3333
+ detail: {
3334
+ columnId: this.columnId,
3335
+ conceptId: this.conceptId,
3336
+ axisId,
3337
+ value
3338
+ },
3339
+ bubbles: true,
3340
+ composed: true
3341
+ }));
3342
+ }
3243
3343
  /**
3244
3344
  * Renders a plain text label for readonly mode instead of an interactive input.
3245
3345
  * Resolves the display value for selects (shows label, not raw id) and
@@ -3497,6 +3597,21 @@ let JupiterFormField = class extends LitElement {
3497
3597
  </select>
3498
3598
  </div>
3499
3599
  ` : ""}
3600
+
3601
+ ${this.field.crossRoleTypedMembers && this.field.crossRoleTypedMembers.length > 0 ? html`
3602
+ ${this.field.crossRoleTypedMembers.map((tm) => html`
3603
+ <div class="period-controls">
3604
+ <label>${tm.axisLabel}:</label>
3605
+ <input
3606
+ type="text"
3607
+ class="typed-member-input"
3608
+ .value="${this.typedMemberValues[tm.axisId] || ""}"
3609
+ @input="${(e2) => this._handleCrossRoleTypedMemberChange(e2, tm.axisId)}"
3610
+ ?disabled="${this.disabled}"
3611
+ />
3612
+ </div>
3613
+ `)}
3614
+ ` : ""}
3500
3615
  </div>
3501
3616
  </div>
3502
3617
  </div>
@@ -3685,7 +3800,7 @@ JupiterFormField.styles = css`
3685
3800
  border-radius: 8px;
3686
3801
  padding: 24px;
3687
3802
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
3688
- max-width: 400px;
3803
+ max-width: 800px;
3689
3804
  width: 90%;
3690
3805
  }
3691
3806
 
@@ -3729,7 +3844,7 @@ JupiterFormField.styles = css`
3729
3844
 
3730
3845
  .period-popup-content .period-controls {
3731
3846
  display: grid;
3732
- grid-template-columns: 60px 1fr;
3847
+ grid-template-columns: 200px 1fr;
3733
3848
  gap: 12px;
3734
3849
  align-items: center;
3735
3850
  margin-top: 0;
@@ -3740,6 +3855,8 @@ JupiterFormField.styles = css`
3740
3855
  font-weight: 500;
3741
3856
  color: var(--jupiter-text-primary, #333);
3742
3857
  text-align: right;
3858
+ white-space: normal;
3859
+ word-break: break-word;
3743
3860
  }
3744
3861
 
3745
3862
  .period-popup-content .period-controls input[type="date"] {
@@ -3777,22 +3894,44 @@ JupiterFormField.styles = css`
3777
3894
  cursor: not-allowed;
3778
3895
  }
3779
3896
 
3897
+ .period-popup-content .period-controls .typed-member-input {
3898
+ flex: 1;
3899
+ padding: 6px 8px;
3900
+ border: 1px solid var(--jupiter-border-color, #ddd);
3901
+ border-radius: 4px;
3902
+ font-size: 13px;
3903
+ font-family: inherit;
3904
+ background: var(--jupiter-input-background, #fff);
3905
+ }
3906
+
3907
+ .period-popup-content .period-controls .typed-member-input:focus {
3908
+ outline: none;
3909
+ border-color: var(--jupiter-primary-color, #1976d2);
3910
+ box-shadow: 0 0 0 2px var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2));
3911
+ }
3912
+
3913
+ .period-popup-content .period-controls .typed-member-input:disabled {
3914
+ background: var(--jupiter-disabled-background, #f5f5f5);
3915
+ color: var(--jupiter-disabled-text, #999);
3916
+ cursor: not-allowed;
3917
+ }
3918
+
3780
3919
  .field-input {
3781
3920
  width: 100%;
3782
3921
  padding: 6px 8px; /* Reduced padding for table cells */
3783
- border: 1px solid var(--jupiter-border-color, #ddd);
3922
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
3784
3923
  border-radius: 4px;
3785
3924
  font-size: 13px; /* Slightly smaller font for table */
3786
3925
  font-family: inherit;
3787
- background: var(--jupiter-input-background, #fff);
3788
- color: var(--jupiter-text-primary, #333);
3926
+ background: transparent !important;
3927
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
3789
3928
  box-sizing: border-box;
3790
3929
  }
3791
3930
 
3792
3931
  .field-input:focus {
3793
3932
  outline: none;
3794
- border-color: var(--jupiter-primary-color, #1976d2);
3795
- box-shadow: 0 0 0 2px var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2));
3933
+ border-color: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));
3934
+ box-shadow: 0 0 0 2px var(--boxShadowColor, var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2)));
3796
3935
  }
3797
3936
 
3798
3937
  .field-input:disabled {
@@ -3963,6 +4102,9 @@ __decorateClass$5([
3963
4102
  __decorateClass$5([
3964
4103
  n2({ type: String })
3965
4104
  ], JupiterFormField.prototype, "unit", 2);
4105
+ __decorateClass$5([
4106
+ n2({ type: Object })
4107
+ ], JupiterFormField.prototype, "typedMemberValues", 2);
3966
4108
  __decorateClass$5([
3967
4109
  r()
3968
4110
  ], JupiterFormField.prototype, "_errors", 2);
@@ -4004,6 +4146,9 @@ let JupiterConceptTree = class extends LitElement {
4004
4146
  this.locale = "en-US";
4005
4147
  this.expandedConcepts = /* @__PURE__ */ new Set();
4006
4148
  this.mode = "inputForm";
4149
+ this.typedMemberData = {};
4150
+ this.showAddButton = false;
4151
+ this.showRemoveButton = false;
4007
4152
  this._expanded = true;
4008
4153
  }
4009
4154
  connectedCallback() {
@@ -4041,6 +4186,20 @@ let JupiterConceptTree = class extends LitElement {
4041
4186
  bubbles: true
4042
4187
  }));
4043
4188
  }
4189
+ _handleAddRepeat() {
4190
+ this.dispatchEvent(new CustomEvent("add-concept-repeat", {
4191
+ detail: { conceptId: this.concept.id },
4192
+ bubbles: true,
4193
+ composed: true
4194
+ }));
4195
+ }
4196
+ _handleRemoveRepeat() {
4197
+ this.dispatchEvent(new CustomEvent("remove-concept-repeat", {
4198
+ detail: { conceptId: this.concept.id },
4199
+ bubbles: true,
4200
+ composed: true
4201
+ }));
4202
+ }
4044
4203
  _handlePeriodChange(event) {
4045
4204
  console.log(`🌲 [ConceptTree] Received period-change event:`, event.detail);
4046
4205
  event.stopPropagation();
@@ -4065,11 +4224,19 @@ let JupiterConceptTree = class extends LitElement {
4065
4224
  @click="${this._toggleExpanded}">
4066
4225
  ${hasChildren ? "▶" : ""}
4067
4226
  </div>
4068
- <div class="concept-label"
4227
+ <div class="concept-label"
4069
4228
  @click="${this._toggleExpanded}"
4070
4229
  title="${this.concept.id}${this.concept.description ? " - " + this.concept.description : ""}">
4071
4230
  ${this.concept.label}
4072
4231
  </div>
4232
+ ${this.showAddButton ? html`
4233
+ <button class="repeat-btn" type="button" title="Add row"
4234
+ @click="${this._handleAddRepeat}">+</button>
4235
+ ` : ""}
4236
+ ${this.showRemoveButton ? html`
4237
+ <button class="repeat-btn remove" type="button" title="Remove row"
4238
+ @click="${this._handleRemoveRepeat}">−</button>
4239
+ ` : ""}
4073
4240
  </div>
4074
4241
  </td>
4075
4242
 
@@ -4101,6 +4268,7 @@ let JupiterConceptTree = class extends LitElement {
4101
4268
  .masterData="${this.masterData}"
4102
4269
  .facts="${this.facts}"
4103
4270
  .column="${column2}"
4271
+ .typedMemberValues="${this.typedMemberData[`${this.concept.id}__${column2.id}`] || {}}"
4104
4272
  @field-change="${this._handleFieldChange}"
4105
4273
  @period-change="${this._handlePeriodChange}"
4106
4274
  ></jupiter-form-field>
@@ -4120,7 +4288,7 @@ JupiterConceptTree.styles = css`
4120
4288
  .concept-name-cell {
4121
4289
  vertical-align: top;
4122
4290
  padding: 2px 4px;
4123
- border: 1px solid var(--jupiter-border-color, #ddd);
4291
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
4124
4292
  border-bottom: none;
4125
4293
  background: var(--jupiter-concept-background, #f8f9fa);
4126
4294
  position: sticky;
@@ -4132,12 +4300,13 @@ JupiterConceptTree.styles = css`
4132
4300
  }
4133
4301
 
4134
4302
  .concept-name-cell.abstract {
4135
- background: var(--jupiter-abstract-background, #f0f2f5);
4303
+ background: var(--bg-color-1, var(--jupiter-abstract-background, #f0f2f5));
4136
4304
  font-weight: 600;
4305
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
4137
4306
  }
4138
4307
 
4139
4308
  .concept-name-cell.leaf {
4140
- background: var(--jupiter-leaf-background, #fff);
4309
+ background: var(--bg-color-2, var(--jupiter-leaf-background, #fff));
4141
4310
  font-weight: 400;
4142
4311
  }
4143
4312
 
@@ -4178,7 +4347,7 @@ JupiterConceptTree.styles = css`
4178
4347
 
4179
4348
  .concept-label {
4180
4349
  flex: 1;
4181
- color: var(--jupiter-text-primary, #333);
4350
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
4182
4351
  cursor: pointer;
4183
4352
  word-wrap: break-word;
4184
4353
  overflow-wrap: break-word;
@@ -4190,9 +4359,9 @@ JupiterConceptTree.styles = css`
4190
4359
  .field-cell {
4191
4360
  vertical-align: middle;
4192
4361
  padding: 2px 6px;
4193
- border: 1px solid var(--jupiter-border-color, #ddd);
4362
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
4194
4363
  border-bottom: none;
4195
- background: var(--jupiter-cell-background, #fff);
4364
+ background: var(--bg-color-2, var(--jupiter-cell-background, #fff));
4196
4365
  min-height: 28px;
4197
4366
  text-align: center;
4198
4367
  min-width: 180px;
@@ -4200,11 +4369,11 @@ JupiterConceptTree.styles = css`
4200
4369
  }
4201
4370
 
4202
4371
  .field-cell.empty {
4203
- background: var(--jupiter-empty-cell-background, #f8f9fa);
4372
+ background: var(--bg-color-2, var(--jupiter-empty-cell-background, #f8f9fa));
4204
4373
  }
4205
4374
 
4206
4375
  .field-cell.abstract-row {
4207
- background: var(--jupiter-abstract-cell-background, #f0f2f5);
4376
+ background: var(--bg-color-2, var(--jupiter-abstract-cell-background, #f0f2f5));
4208
4377
  }
4209
4378
 
4210
4379
  /* Children are rendered as separate table rows, not nested */
@@ -4212,6 +4381,38 @@ JupiterConceptTree.styles = css`
4212
4381
  display: none;
4213
4382
  }
4214
4383
 
4384
+ .repeat-btn {
4385
+ flex-shrink: 0;
4386
+ margin-left: 4px;
4387
+ width: 20px;
4388
+ height: 20px;
4389
+ padding: 0;
4390
+ border-radius: 3px;
4391
+ border: 1px solid var(--jupiter-primary-color, #1976d2);
4392
+ color: var(--jupiter-primary-color, #1976d2);
4393
+ background: transparent;
4394
+ cursor: pointer;
4395
+ font-size: 14px;
4396
+ line-height: 1;
4397
+ display: flex;
4398
+ align-items: center;
4399
+ justify-content: center;
4400
+ }
4401
+
4402
+ .repeat-btn:hover {
4403
+ background: var(--jupiter-primary-color, #1976d2);
4404
+ color: #fff;
4405
+ }
4406
+
4407
+ .repeat-btn.remove {
4408
+ border-color: var(--jupiter-error-color, #d32f2f);
4409
+ color: var(--jupiter-error-color, #d32f2f);
4410
+ }
4411
+
4412
+ .repeat-btn.remove:hover {
4413
+ background: var(--jupiter-error-color, #d32f2f);
4414
+ color: #fff;
4415
+ }
4215
4416
 
4216
4417
  `;
4217
4418
  __decorateClass$4([
@@ -4253,6 +4454,15 @@ __decorateClass$4([
4253
4454
  __decorateClass$4([
4254
4455
  n2({ type: Array })
4255
4456
  ], JupiterConceptTree.prototype, "facts", 2);
4457
+ __decorateClass$4([
4458
+ n2({ type: Object })
4459
+ ], JupiterConceptTree.prototype, "typedMemberData", 2);
4460
+ __decorateClass$4([
4461
+ n2({ type: Boolean })
4462
+ ], JupiterConceptTree.prototype, "showAddButton", 2);
4463
+ __decorateClass$4([
4464
+ n2({ type: Boolean })
4465
+ ], JupiterConceptTree.prototype, "showRemoveButton", 2);
4256
4466
  __decorateClass$4([
4257
4467
  r()
4258
4468
  ], JupiterConceptTree.prototype, "_expanded", 2);
@@ -4574,7 +4784,7 @@ JupiterAddColumnDialog.styles = css`
4574
4784
  }
4575
4785
 
4576
4786
  .dialog {
4577
- background: white;
4787
+ background: var(--bg-color-2, var(--jupiter-card-background, #fff));
4578
4788
  border-radius: 8px;
4579
4789
  padding: 24px;
4580
4790
  min-width: 400px;
@@ -4599,7 +4809,7 @@ JupiterAddColumnDialog.styles = css`
4599
4809
  .dialog-title {
4600
4810
  font-size: 20px;
4601
4811
  font-weight: 600;
4602
- color: var(--jupiter-text-primary, #333);
4812
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
4603
4813
  margin: 0 0 8px 0;
4604
4814
  }
4605
4815
 
@@ -4633,7 +4843,7 @@ JupiterAddColumnDialog.styles = css`
4633
4843
  display: block;
4634
4844
  font-weight: 500;
4635
4845
  margin-bottom: 6px;
4636
- color: var(--jupiter-text-primary, #333);
4846
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
4637
4847
  font-size: 14px;
4638
4848
  }
4639
4849
 
@@ -4646,18 +4856,20 @@ JupiterAddColumnDialog.styles = css`
4646
4856
  width: 100%;
4647
4857
  box-sizing: border-box;
4648
4858
  padding: 10px 12px;
4649
- border: 1px solid var(--jupiter-border-color, #ddd);
4859
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
4650
4860
  border-radius: 4px;
4651
4861
  font-size: 14px;
4652
4862
  font-family: inherit;
4653
4863
  transition: border-color 0.2s ease;
4864
+ background-color: transparent;
4865
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
4654
4866
  }
4655
4867
 
4656
- .form-input:focus {
4657
- outline: none;
4658
- border-color: var(--jupiter-primary-color, #007bff);
4659
- box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
4660
- }
4868
+ // .form-input:focus {
4869
+ // outline: none;
4870
+ // border-color: var(--jupiter-primary-color, #007bff);
4871
+ // box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
4872
+ // }
4661
4873
 
4662
4874
  select.form-input {
4663
4875
  cursor: pointer;
@@ -4685,27 +4897,28 @@ JupiterAddColumnDialog.styles = css`
4685
4897
  }
4686
4898
 
4687
4899
  .btn-cancel {
4688
- background: var(--jupiter-neutral-background, #f5f5f5);
4689
- color: var(--jupiter-text-primary, #333);
4900
+ color: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));
4901
+ border: 1px solid var(--buttonBgColor, var(--jupiter-primary-color, #1976d2)) !important;
4902
+ background: transparent;
4690
4903
  }
4691
4904
 
4692
- .btn-cancel:hover {
4693
- background: var(--jupiter-neutral-background-hover, #e0e0e0);
4694
- }
4905
+ // .btn-cancel:hover {
4906
+ // background: var(--jupiter-neutral-background-hover, #e0e0e0);
4907
+ // }
4695
4908
 
4696
4909
  .btn-primary {
4697
- background: var(--jupiter-primary-color, #667eea);
4698
- color: white;
4910
+ background: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));
4911
+ color: var(--buttonTextColor, white);
4699
4912
  }
4700
4913
 
4701
- .btn-primary:hover {
4702
- background: var(--jupiter-primary-color-dark, #5a6fd8);
4703
- }
4914
+ // .btn-primary:hover {
4915
+ // background: var(--jupiter-primary-color-dark, #5a6fd8);
4916
+ // }
4704
4917
 
4705
- .btn-primary:disabled {
4706
- background: var(--jupiter-disabled-background, #ccc);
4707
- cursor: not-allowed;
4708
- }
4918
+ // .btn-primary:disabled {
4919
+ // background: var(--jupiter-disabled-background, #ccc);
4920
+ // cursor: not-allowed;
4921
+ // }
4709
4922
 
4710
4923
  /* Dimension Selection Styles */
4711
4924
  .dimensions-section {
@@ -4861,6 +5074,7 @@ let JupiterFormSection = class extends LitElement {
4861
5074
  this.periodData = {};
4862
5075
  this.unitData = {};
4863
5076
  this.typedMemberData = {};
5077
+ this.repeatCounts = {};
4864
5078
  this.defaultUnits = [];
4865
5079
  this.disabled = false;
4866
5080
  this.collapsible = true;
@@ -5121,6 +5335,70 @@ let JupiterFormSection = class extends LitElement {
5121
5335
  bubbles: true
5122
5336
  }));
5123
5337
  }
5338
+ _handleAddRepeat(event) {
5339
+ event.stopPropagation();
5340
+ this.dispatchEvent(new CustomEvent("add-concept-repeat", {
5341
+ detail: event.detail,
5342
+ bubbles: true
5343
+ }));
5344
+ }
5345
+ _handleRemoveRepeat(event) {
5346
+ event.stopPropagation();
5347
+ this.dispatchEvent(new CustomEvent("remove-concept-repeat", {
5348
+ detail: event.detail,
5349
+ bubbles: true
5350
+ }));
5351
+ }
5352
+ /** Build the list of <tr> template results for a single flattened concept, including any repeat instances. */
5353
+ _renderConceptRows(concept) {
5354
+ var _a;
5355
+ const isRepeatable = this.mode !== "readonly" && !concept.abstract && ((_a = concept.fields) == null ? void 0 : _a.some((f2) => {
5356
+ var _a2;
5357
+ return ((_a2 = f2.crossRoleTypedMembers) == null ? void 0 : _a2.length) > 0;
5358
+ }));
5359
+ const repeatCount = isRepeatable ? this.repeatCounts[concept.id] || 0 : 0;
5360
+ const sharedProps = (instanceConcept, opts) => html`
5361
+ <jupiter-concept-tree
5362
+ .concept="${instanceConcept}"
5363
+ .columns="${this.columns}"
5364
+ .datatypes="${this.datatypes}"
5365
+ .formData="${this.formData}"
5366
+ .periodData="${this.periodData}"
5367
+ .unitData="${this.unitData}"
5368
+ .defaultUnits="${this.defaultUnits}"
5369
+ .disabled="${this.disabled}"
5370
+ .locale="${this.locale}"
5371
+ .expandedConcepts="${this._expandedConcepts}"
5372
+ .mode="${this.mode}"
5373
+ .masterData="${this.masterData}"
5374
+ .facts="${instanceConcept.facts}"
5375
+ .typedMemberData="${this.typedMemberData}"
5376
+ .showAddButton="${opts.showAdd || false}"
5377
+ .showRemoveButton="${opts.showRemove || false}"
5378
+ @field-change="${this._handleFieldChange}"
5379
+ @period-change="${this._handlePeriodChange}"
5380
+ @concept-expand="${this._handleConceptExpand}"
5381
+ @add-concept-repeat="${this._handleAddRepeat}"
5382
+ @remove-concept-repeat="${this._handleRemoveRepeat}"
5383
+ ></jupiter-concept-tree>
5384
+ `;
5385
+ const rows = [html`
5386
+ <tr>${sharedProps(concept, { showAdd: isRepeatable })}</tr>
5387
+ `];
5388
+ for (let n3 = 1; n3 <= repeatCount; n3++) {
5389
+ const instanceConcept = {
5390
+ ...concept,
5391
+ id: `${concept.id}__repeat_${n3}`,
5392
+ label: "",
5393
+ children: [],
5394
+ abstract: false
5395
+ };
5396
+ rows.push(html`
5397
+ <tr>${sharedProps(instanceConcept, { showRemove: true })}</tr>
5398
+ `);
5399
+ }
5400
+ return rows;
5401
+ }
5124
5402
  render() {
5125
5403
  if (!this.section.concepts || this.section.concepts.length === 0) {
5126
5404
  return html`
@@ -5241,28 +5519,7 @@ let JupiterFormSection = class extends LitElement {
5241
5519
  </tr>
5242
5520
  </thead>
5243
5521
  <tbody class="table-body">
5244
- ${this._flattenConcepts(this.section.concepts, this._expandedConcepts).filter((concept) => this.mode !== "readonly" || !this._isConceptRowBlank(concept)).map((concept) => html`
5245
- <tr>
5246
- <jupiter-concept-tree
5247
- .concept="${concept}"
5248
- .columns="${this.columns}"
5249
- .datatypes="${this.datatypes}"
5250
- .formData="${this.formData}"
5251
- .periodData="${this.periodData}"
5252
- .unitData="${this.unitData}"
5253
- .defaultUnits="${this.defaultUnits}"
5254
- .disabled="${this.disabled}"
5255
- .locale="${this.locale}"
5256
- .expandedConcepts="${this._expandedConcepts}"
5257
- .mode="${this.mode}"
5258
- .masterData="${this.masterData}"
5259
- .facts="${concept.facts}"
5260
- @field-change="${this._handleFieldChange}"
5261
- @period-change="${this._handlePeriodChange}"
5262
- @concept-expand="${this._handleConceptExpand}"
5263
- ></jupiter-concept-tree>
5264
- </tr>
5265
- `)}
5522
+ ${this._flattenConcepts(this.section.concepts, this._expandedConcepts).filter((concept) => this.mode !== "readonly" || !this._isConceptRowBlank(concept)).flatMap((concept) => this._renderConceptRows(concept))}
5266
5523
  </tbody>
5267
5524
  </table>
5268
5525
  </div>
@@ -5383,13 +5640,20 @@ JupiterFormSection.styles = css`
5383
5640
  /* Table row - no special display needed */
5384
5641
  }
5385
5642
 
5643
+ .header-cell:first-child {
5644
+ border-radius: 6px 0 0 0;
5645
+ }
5646
+ .header-cell:last-child {
5647
+ border-radius: 0 6px 0 0;
5648
+ }
5649
+
5386
5650
  .header-cell {
5387
5651
  padding: 8px 12px;
5388
5652
  text-align: left;
5389
5653
  font-weight: 600;
5390
- color: var(--jupiter-text-primary, #333);
5391
- border: 1px solid var(--jupiter-border-color, #ddd);
5392
- background: var(--jupiter-header-background, #f8f9fa);
5654
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
5655
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
5656
+ background: var(--bg-color-1, var(--jupiter-header-background, #f8f9fa));
5393
5657
  min-width: 180px;
5394
5658
  width: 180px;
5395
5659
  font-size: 14px;
@@ -5561,6 +5825,9 @@ __decorateClass$2([
5561
5825
  __decorateClass$2([
5562
5826
  n2({ type: Object })
5563
5827
  ], JupiterFormSection.prototype, "typedMemberData", 2);
5828
+ __decorateClass$2([
5829
+ n2({ type: Object })
5830
+ ], JupiterFormSection.prototype, "repeatCounts", 2);
5564
5831
  __decorateClass$2([
5565
5832
  n2({ type: Array })
5566
5833
  ], JupiterFormSection.prototype, "defaultUnits", 2);
@@ -6593,24 +6860,25 @@ JupiterFilterRolesDialog.styles = css`
6593
6860
 
6594
6861
  .dialog-header {
6595
6862
  padding: 20px 24px 16px;
6596
- border-bottom: 1px solid var(--jupiter-border-color, #ddd);
6863
+ border-bottom: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
6597
6864
  display: flex;
6598
6865
  align-items: center;
6599
6866
  gap: 12px;
6867
+ background: var(--bg-color-1, var(--jupiter-header-background, #f8f9fa));
6600
6868
  }
6601
6869
 
6602
6870
  .dialog-title {
6603
6871
  font-size: 18px;
6604
6872
  font-weight: 600;
6605
6873
  margin: 0;
6606
- color: var(--jupiter-text-primary, #333);
6874
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
6607
6875
  flex: 1;
6608
6876
  }
6609
6877
 
6610
6878
  .filter-icon {
6611
6879
  width: 20px;
6612
6880
  height: 20px;
6613
- fill: var(--jupiter-primary-color, #1976d2);
6881
+ fill: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));
6614
6882
  }
6615
6883
 
6616
6884
  .close-button {
@@ -6619,23 +6887,24 @@ JupiterFilterRolesDialog.styles = css`
6619
6887
  font-size: 24px;
6620
6888
  cursor: pointer;
6621
6889
  padding: 4px;
6622
- color: var(--jupiter-text-secondary, #666);
6890
+ color: var(--primaryTextColor, var(--jupiter-text-secondary, #666));
6623
6891
  border-radius: 4px;
6624
6892
  transition: background-color 0.2s ease;
6625
6893
  }
6626
6894
 
6627
- .close-button:hover {
6628
- background: var(--jupiter-hover-background, #f5f5f5);
6629
- }
6895
+ // .close-button:hover {
6896
+ // background: var(--jupiter-hover-background, #f5f5f5);
6897
+ // }
6630
6898
 
6631
6899
  .dialog-content {
6900
+ background: var(--bg-color-2, var(--jupiter-form-content-background, #fff));
6632
6901
  flex: 1;
6633
6902
  overflow-y: auto;
6634
6903
  padding: 20px 24px;
6635
6904
  }
6636
6905
 
6637
6906
  .description {
6638
- color: var(--jupiter-text-secondary, #666);
6907
+ color: var(--primaryTextColor, var(--secondaryTextColor, var(--jupiter-text-secondary, #666))) ;
6639
6908
  font-size: 14px;
6640
6909
  margin: 0 0 20px 0;
6641
6910
  line-height: 1.5;
@@ -6654,25 +6923,25 @@ JupiterFilterRolesDialog.styles = css`
6654
6923
  }
6655
6924
 
6656
6925
  .search-input {
6657
- width: 100%;
6926
+ width: stretch;
6658
6927
  padding: 10px 40px 10px 12px;
6659
- border: 1px solid var(--jupiter-border-color, #ddd);
6928
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
6660
6929
  border-radius: 4px;
6661
6930
  font-size: 14px;
6662
6931
  font-family: inherit;
6663
- background: var(--jupiter-background, #fff);
6664
- color: var(--jupiter-text-primary, #333);
6932
+ background: transparent;
6933
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
6665
6934
  transition: border-color 0.2s ease;
6666
6935
  }
6667
6936
 
6668
- .search-input:focus {
6669
- outline: none;
6670
- border-color: var(--jupiter-primary-color, #1976d2);
6671
- box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.1);
6672
- }
6937
+ // .search-input:focus {
6938
+ // outline: none;
6939
+ // border-color: var(--jupiter-primary-color, #1976d2);
6940
+ // box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.1);
6941
+ // }
6673
6942
 
6674
6943
  .search-input::placeholder {
6675
- color: var(--jupiter-text-secondary, #666);
6944
+ color: var(--primaryTextColor, var(--jupiter-text-secondary, #666));
6676
6945
  }
6677
6946
 
6678
6947
  .search-icon {
@@ -6730,8 +6999,8 @@ JupiterFilterRolesDialog.styles = css`
6730
6999
 
6731
7000
  .selection-control {
6732
7001
  background: none;
6733
- border: 1px solid var(--jupiter-primary-color, #1976d2);
6734
- color: var(--jupiter-primary-color, #1976d2);
7002
+ border: 1px solid var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));
7003
+ color: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));
6735
7004
  padding: 6px 12px;
6736
7005
  border-radius: 4px;
6737
7006
  font-size: 12px;
@@ -6740,7 +7009,7 @@ JupiterFilterRolesDialog.styles = css`
6740
7009
  }
6741
7010
 
6742
7011
  .selection-control:hover {
6743
- background: var(--jupiter-primary-color, #1976d2);
7012
+ background: var(--menuBgColorLighter, var(--jupiter-primary-color, #1976d2));
6744
7013
  color: white;
6745
7014
  }
6746
7015
 
@@ -6750,7 +7019,7 @@ JupiterFilterRolesDialog.styles = css`
6750
7019
  gap: 8px;
6751
7020
  max-height: 300px;
6752
7021
  overflow-y: auto;
6753
- border: 1px solid var(--jupiter-border-color, #ddd);
7022
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
6754
7023
  border-radius: 4px;
6755
7024
  padding: 12px;
6756
7025
  }
@@ -6765,13 +7034,17 @@ JupiterFilterRolesDialog.styles = css`
6765
7034
  }
6766
7035
 
6767
7036
  .role-item:hover {
6768
- background: var(--jupiter-hover-background, #f5f5f5);
7037
+ background: var(--menuBgColorLighter, var(--jupiter-hover-background, #f5f5f5));
6769
7038
  }
6770
7039
 
6771
7040
  .role-checkbox {
6772
7041
  margin-top: 2px;
6773
7042
  cursor: pointer;
6774
7043
  }
7044
+
7045
+ .role-info * {
7046
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333)) !important;
7047
+ }
6775
7048
 
6776
7049
  .role-info {
6777
7050
  flex: 1;
@@ -6801,15 +7074,15 @@ JupiterFilterRolesDialog.styles = css`
6801
7074
  .period-controls {
6802
7075
  margin-top: 8px;
6803
7076
  padding: 8px;
6804
- background: var(--jupiter-background-light, #f8f9fa);
7077
+ background: var(--bg-color-1, var(--jupiter-background-light, #f8f9fa));
6805
7078
  border-radius: 4px;
6806
- border: 1px solid var(--jupiter-border-color, #e0e0e0);
7079
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #e0e0e0));
6807
7080
  }
6808
7081
 
6809
7082
  .period-controls-label {
6810
7083
  font-size: 12px;
6811
7084
  font-weight: 600;
6812
- color: var(--jupiter-text-primary, #333);
7085
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
6813
7086
  margin: 0 0 6px 0;
6814
7087
  }
6815
7088
 
@@ -6937,11 +7210,11 @@ JupiterFilterRolesDialog.styles = css`
6937
7210
 
6938
7211
  .dialog-actions {
6939
7212
  padding: 16px 24px;
6940
- border-top: 1px solid var(--jupiter-border-color, #ddd);
7213
+ border-top: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
6941
7214
  display: flex;
6942
7215
  gap: 12px;
6943
7216
  justify-content: flex-end;
6944
- background: var(--jupiter-form-actions-background, #f8f9fa);
7217
+ background: var(--bg-color-2, var(--jupiter-form-actions-background, #f8f9fa));
6945
7218
  }
6946
7219
 
6947
7220
  .dialog-actions button {
@@ -6955,23 +7228,23 @@ JupiterFilterRolesDialog.styles = css`
6955
7228
  }
6956
7229
 
6957
7230
  .btn-primary {
6958
- background: var(--jupiter-primary-color, #1976d2);
6959
- color: white;
7231
+ background: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));
7232
+ color: var(--buttonTextColor, white);
6960
7233
  }
6961
7234
 
6962
- .btn-primary:hover:not(:disabled) {
6963
- background: var(--jupiter-primary-color-dark, #1565c0);
6964
- }
7235
+ // .btn-primary:hover:not(:disabled) {
7236
+ // background: var(--jupiter-primary-color-dark, #1565c0);
7237
+ // }
6965
7238
 
6966
7239
  .btn-secondary {
7240
+ color: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));
7241
+ border: 1px solid var(--buttonBgColor, var(--jupiter-primary-color, #1976d2)) !important;
6967
7242
  background: transparent;
6968
- color: var(--jupiter-text-secondary, #666);
6969
- border: 1px solid var(--jupiter-border-color, #ddd);
6970
7243
  }
6971
7244
 
6972
- .btn-secondary:hover:not(:disabled) {
6973
- background: var(--jupiter-hover-background, #f5f5f5);
6974
- }
7245
+ // .btn-secondary:hover:not(:disabled) {
7246
+ // background: var(--jupiter-hover-background, #f5f5f5);
7247
+ // }
6975
7248
 
6976
7249
  button:disabled {
6977
7250
  opacity: 0.6;
@@ -7170,6 +7443,7 @@ let JupiterDynamicForm = class extends LitElement {
7170
7443
  this.periodStartDate = "2025-01-01";
7171
7444
  this.periodEndDate = "2025-12-31";
7172
7445
  this.language = "en";
7446
+ this.reportingLanguage = "en";
7173
7447
  this.display = "accordion";
7174
7448
  this.mode = "inputForm";
7175
7449
  this.roleFilterAxes = [];
@@ -7185,6 +7459,7 @@ let JupiterDynamicForm = class extends LitElement {
7185
7459
  this._preservedUnitData = {};
7186
7460
  this._typedMemberData = {};
7187
7461
  this._preservedTypedMemberData = {};
7462
+ this._repeatCounts = {};
7188
7463
  this._columns = [];
7189
7464
  this._errors = [];
7190
7465
  this._touched = /* @__PURE__ */ new Set();
@@ -7403,7 +7678,6 @@ let JupiterDynamicForm = class extends LitElement {
7403
7678
  if (!((_a = this._currentSchema) == null ? void 0 : _a.sections)) {
7404
7679
  return;
7405
7680
  }
7406
- console.log("🔍 [DynamicForm] Extracting typed member values from facts");
7407
7681
  this._currentSchema.sections.forEach((section2) => {
7408
7682
  this._extractTypedMembersFromConcepts(section2.concepts || [], section2);
7409
7683
  });
@@ -7846,6 +8120,10 @@ let JupiterDynamicForm = class extends LitElement {
7846
8120
  if (this._typedMemberData[field2.columnId]) {
7847
8121
  this._preservedTypedMemberData[field2.columnId] = { ...this._typedMemberData[field2.columnId] };
7848
8122
  }
8123
+ const crossRoleKey = `${concept.id}__${field2.columnId}`;
8124
+ if (this._typedMemberData[crossRoleKey]) {
8125
+ this._preservedTypedMemberData[crossRoleKey] = { ...this._typedMemberData[crossRoleKey] };
8126
+ }
7849
8127
  });
7850
8128
  if (concept.children) {
7851
8129
  concept.children.forEach((child) => {
@@ -7866,6 +8144,10 @@ let JupiterDynamicForm = class extends LitElement {
7866
8144
  if (this._preservedTypedMemberData[field2.columnId]) {
7867
8145
  this._typedMemberData[field2.columnId] = { ...this._preservedTypedMemberData[field2.columnId] };
7868
8146
  }
8147
+ const crossRoleKey = `${concept.id}__${field2.columnId}`;
8148
+ if (this._preservedTypedMemberData[crossRoleKey]) {
8149
+ this._typedMemberData[crossRoleKey] = { ...this._preservedTypedMemberData[crossRoleKey] };
8150
+ }
7869
8151
  });
7870
8152
  if (concept.children) {
7871
8153
  concept.children.forEach((child) => {
@@ -7906,7 +8188,9 @@ let JupiterDynamicForm = class extends LitElement {
7906
8188
  this._typedMemberData,
7907
8189
  this._periodPreferences,
7908
8190
  this._periodData,
7909
- this._unitData
8191
+ this._unitData,
8192
+ this.reportingLanguage,
8193
+ this._repeatCounts
7910
8194
  );
7911
8195
  this._draftStorageService.saveDraft(currentFormData, currentMetadata);
7912
8196
  console.log("✅ Current form data saved to draft storage with NEW preferences");
@@ -8077,14 +8361,72 @@ let JupiterDynamicForm = class extends LitElement {
8077
8361
  const parts = uniqueConceptKey.split("::");
8078
8362
  return parts.length > 1 ? parts[1] : uniqueConceptKey;
8079
8363
  }
8364
+ _handleAddConceptRepeat(event) {
8365
+ const { conceptId } = event.detail;
8366
+ this._repeatCounts = { ...this._repeatCounts, [conceptId]: (this._repeatCounts[conceptId] || 0) + 1 };
8367
+ this._dirty = true;
8368
+ }
8369
+ _handleRemoveConceptRepeat(event) {
8370
+ const { conceptId: rawConceptId } = event.detail;
8371
+ const repeatMatch = rawConceptId.match(/^(.+)__repeat_(\d+)$/);
8372
+ const baseConceptId = repeatMatch ? repeatMatch[1] : rawConceptId;
8373
+ const removeIndex = repeatMatch ? parseInt(repeatMatch[2]) : this._repeatCounts[rawConceptId] || 0;
8374
+ const current = this._repeatCounts[baseConceptId] || 0;
8375
+ if (current <= 0 || removeIndex < 1 || removeIndex > current)
8376
+ return;
8377
+ const newFormData = { ...this._formData };
8378
+ const newTypedData = { ...this._typedMemberData };
8379
+ const newUnitData = { ...this._unitData };
8380
+ const newPeriodData = { ...this._periodData };
8381
+ for (let n3 = removeIndex; n3 < current; n3++) {
8382
+ const fromId = `${baseConceptId}__repeat_${n3 + 1}`;
8383
+ const toId = `${baseConceptId}__repeat_${n3}`;
8384
+ if (newFormData[fromId] !== void 0) {
8385
+ newFormData[toId] = newFormData[fromId];
8386
+ } else {
8387
+ delete newFormData[toId];
8388
+ }
8389
+ const toPrefix = `${toId}__`;
8390
+ const fromPrefix = `${fromId}__`;
8391
+ const fromEntries = Object.keys(newTypedData).filter((k) => k.startsWith(fromPrefix));
8392
+ Object.keys(newTypedData).filter((k) => k.startsWith(toPrefix)).forEach((k) => delete newTypedData[k]);
8393
+ fromEntries.forEach((k) => {
8394
+ newTypedData[`${toId}__${k.slice(fromPrefix.length)}`] = newTypedData[k];
8395
+ });
8396
+ fromEntries.forEach((k) => delete newTypedData[k]);
8397
+ if (newUnitData[fromId] !== void 0) {
8398
+ newUnitData[toId] = newUnitData[fromId];
8399
+ } else {
8400
+ delete newUnitData[toId];
8401
+ }
8402
+ if (newPeriodData[fromId] !== void 0) {
8403
+ newPeriodData[toId] = newPeriodData[fromId];
8404
+ } else {
8405
+ delete newPeriodData[toId];
8406
+ }
8407
+ }
8408
+ const lastId = `${baseConceptId}__repeat_${current}`;
8409
+ delete newFormData[lastId];
8410
+ delete newUnitData[lastId];
8411
+ delete newPeriodData[lastId];
8412
+ const lastPrefix = `${lastId}__`;
8413
+ Object.keys(newTypedData).filter((k) => k.startsWith(lastPrefix)).forEach((k) => delete newTypedData[k]);
8414
+ this._formData = newFormData;
8415
+ this._typedMemberData = newTypedData;
8416
+ this._unitData = newUnitData;
8417
+ this._periodData = newPeriodData;
8418
+ this._repeatCounts = { ...this._repeatCounts, [baseConceptId]: current - 1 };
8419
+ this._dirty = true;
8420
+ }
8080
8421
  _handleTypedMemberChange(event) {
8081
- const { columnId, axisId, value } = event.detail;
8082
- console.log(`🔍 [DynamicForm] Typed member change: columnId=${columnId}, axisId=${axisId}, value=${value}`);
8422
+ const { columnId, axisId, value, conceptId } = event.detail;
8423
+ const storageKey = conceptId ? `${conceptId}__${columnId}` : columnId;
8424
+ console.log(`🔍 [DynamicForm] Typed member change: storageKey=${storageKey}, axisId=${axisId}, value=${value}`);
8083
8425
  const updatedTypedMemberData = { ...this._typedMemberData };
8084
- if (!updatedTypedMemberData[columnId]) {
8085
- updatedTypedMemberData[columnId] = {};
8426
+ if (!updatedTypedMemberData[storageKey]) {
8427
+ updatedTypedMemberData[storageKey] = {};
8086
8428
  }
8087
- updatedTypedMemberData[columnId] = { ...updatedTypedMemberData[columnId], [axisId]: value };
8429
+ updatedTypedMemberData[storageKey] = { ...updatedTypedMemberData[storageKey], [axisId]: value };
8088
8430
  this._typedMemberData = updatedTypedMemberData;
8089
8431
  this._dirty = true;
8090
8432
  this.requestUpdate();
@@ -8671,7 +9013,8 @@ let JupiterDynamicForm = class extends LitElement {
8671
9013
  data: this._formData,
8672
9014
  submissionData,
8673
9015
  valid: this._valid,
8674
- errors: this._errors
9016
+ errors: this._errors,
9017
+ reportingLanguage: this.reportingLanguage
8675
9018
  },
8676
9019
  bubbles: true
8677
9020
  }));
@@ -8710,7 +9053,9 @@ let JupiterDynamicForm = class extends LitElement {
8710
9053
  this._typedMemberData,
8711
9054
  this._periodPreferences,
8712
9055
  this._periodData,
8713
- this._unitData
9056
+ this._unitData,
9057
+ this.reportingLanguage,
9058
+ this._repeatCounts
8714
9059
  );
8715
9060
  const draftPayloadSnapshot = JSON.stringify({
8716
9061
  draftData,
@@ -8736,6 +9081,7 @@ let JupiterDynamicForm = class extends LitElement {
8736
9081
  // JSON data ready for external database storage
8737
9082
  dynaformsFacts: draftData,
8738
9083
  dynaformsMetadata: metadata,
9084
+ reportingLanguage: this.reportingLanguage,
8739
9085
  source: source == "auto" ? "auto" : "manual"
8740
9086
  },
8741
9087
  bubbles: true,
@@ -8823,6 +9169,10 @@ let JupiterDynamicForm = class extends LitElement {
8823
9169
  this._preservedTypedMemberData = {};
8824
9170
  console.log("🔄 Restored typed member data");
8825
9171
  }
9172
+ if (metadata.repeatCounts) {
9173
+ this._repeatCounts = metadata.repeatCounts;
9174
+ console.log("🔄 Restored repeat counts:", this._repeatCounts);
9175
+ }
8826
9176
  if (metadata.periodData) {
8827
9177
  this._periodData = metadata.periodData;
8828
9178
  console.log("🔄 Restored custom field-level period data:", Object.keys(this._periodData).length, "concepts");
@@ -8866,7 +9216,7 @@ let JupiterDynamicForm = class extends LitElement {
8866
9216
  const restoredPeriodData = {};
8867
9217
  const restoredUnitData = {};
8868
9218
  formData.forEach((entry) => {
8869
- let { conceptId, value, columnId, period, unit } = entry;
9219
+ let { conceptId, draftInstanceId, value, columnId, period, unit } = entry;
8870
9220
  if (!columnId && period) {
8871
9221
  columnId = this._inferColumnIdFromPeriod(period, conceptId);
8872
9222
  if (!columnId) {
@@ -8874,13 +9224,15 @@ let JupiterDynamicForm = class extends LitElement {
8874
9224
  return;
8875
9225
  }
8876
9226
  }
8877
- const actualConceptId = this._findActualConceptId(conceptId);
8878
- const conceptIdToUse = actualConceptId || conceptId;
9227
+ const instanceKey = draftInstanceId || conceptId;
9228
+ const baseConceptId = instanceKey.includes("__repeat_") ? instanceKey.split("__repeat_")[0] : instanceKey;
9229
+ const actualBaseId = this._findActualConceptId(baseConceptId);
9230
+ const conceptIdToUse = instanceKey.includes("__repeat_") ? `${actualBaseId || baseConceptId}__repeat_${instanceKey.split("__repeat_")[1]}` : actualBaseId || instanceKey;
8879
9231
  if (!restoredFormData[conceptIdToUse]) {
8880
9232
  restoredFormData[conceptIdToUse] = {};
8881
9233
  }
8882
9234
  restoredFormData[conceptIdToUse][columnId] = value;
8883
- console.log(`📦 Restored: ${conceptIdToUse}[${columnId}] = ${value}`);
9235
+ console.log(`📦 Restored: ${conceptIdToUse}[${columnId}] = ${value}${instanceKey !== conceptId ? ` (repeat instance)` : ""}`);
8884
9236
  if (period) {
8885
9237
  if (!restoredPeriodData[conceptIdToUse]) {
8886
9238
  restoredPeriodData[conceptIdToUse] = {};
@@ -9536,7 +9888,7 @@ let JupiterDynamicForm = class extends LitElement {
9536
9888
  }
9537
9889
  if (concept.fields && concept.fields.length > 0) {
9538
9890
  concept.fields.forEach((field2) => {
9539
- var _a, _b, _c, _d;
9891
+ var _a, _b, _c, _d, _e;
9540
9892
  const conceptData = this._formData[concept.id];
9541
9893
  let fieldValue = conceptData == null ? void 0 : conceptData[field2.columnId];
9542
9894
  if ((fieldValue === void 0 || fieldValue === null || fieldValue === "") && this.masterData) {
@@ -9552,6 +9904,8 @@ let JupiterDynamicForm = class extends LitElement {
9552
9904
  const fieldPeriodData = (_a = this._periodData[concept.id]) == null ? void 0 : _a[field2.columnId];
9553
9905
  const submissionEntry = {
9554
9906
  conceptId: concept.id,
9907
+ draftInstanceId: concept.id,
9908
+ // used during draft restoration to route value to the correct _formData slot
9555
9909
  columnId: field2.columnId,
9556
9910
  // CRITICAL: Include columnId for draft restoration
9557
9911
  value: fieldValue,
@@ -9617,12 +9971,90 @@ let JupiterDynamicForm = class extends LitElement {
9617
9971
  });
9618
9972
  }
9619
9973
  }
9974
+ if (!submissionEntry.typedMembers && ((_e = field2.crossRoleTypedMembers) == null ? void 0 : _e.length)) {
9975
+ const crossRoleKey = `${concept.id}__${field2.columnId}`;
9976
+ const crossRoleValues = this._typedMemberData[crossRoleKey];
9977
+ if (crossRoleValues) {
9978
+ const filteredTypedMembers = {};
9979
+ field2.crossRoleTypedMembers.forEach((tm) => {
9980
+ const val = crossRoleValues[tm.axisId];
9981
+ if (val !== void 0 && val !== null && val !== "") {
9982
+ filteredTypedMembers[tm.axisId] = {
9983
+ value: val,
9984
+ memberName: tm.typedMemberId
9985
+ };
9986
+ }
9987
+ });
9988
+ if (Object.keys(filteredTypedMembers).length > 0) {
9989
+ submissionEntry.typedMembers = filteredTypedMembers;
9990
+ console.log(`🔍 [Submission] Adding cross-role typed members for ${concept.id}/${field2.columnId}:`, filteredTypedMembers);
9991
+ }
9992
+ }
9993
+ }
9620
9994
  if (sectionTitle === targetRole) {
9621
9995
  console.warn(`[DUPLICATE DEBUG] Final submission entry:`, submissionEntry);
9622
9996
  }
9623
9997
  submissionData.push(submissionEntry);
9624
9998
  }
9625
9999
  });
10000
+ const repeatCount = this._repeatCounts[concept.id] || 0;
10001
+ if (repeatCount > 0 && concept.fields.some((f2) => {
10002
+ var _a;
10003
+ return (_a = f2.crossRoleTypedMembers) == null ? void 0 : _a.length;
10004
+ })) {
10005
+ for (let n3 = 1; n3 <= repeatCount; n3++) {
10006
+ const instanceId = `${concept.id}__repeat_${n3}`;
10007
+ concept.fields.forEach((field2) => {
10008
+ var _a, _b, _c, _d, _e;
10009
+ const instanceValue = (_a = this._formData[instanceId]) == null ? void 0 : _a[field2.columnId];
10010
+ if (instanceValue === void 0 || instanceValue === null || instanceValue === "")
10011
+ return;
10012
+ const column2 = this._findColumnByIdInSection(field2.columnId, section2);
10013
+ const fieldPeriodData = (_b = this._periodData[instanceId]) == null ? void 0 : _b[field2.columnId];
10014
+ const instanceEntry = {
10015
+ conceptId: concept.id,
10016
+ // original concept ID (not synthetic repeat ID)
10017
+ draftInstanceId: instanceId,
10018
+ // synthetic ID used during draft restoration to route to the correct _formData slot
10019
+ columnId: field2.columnId,
10020
+ value: instanceValue,
10021
+ period: {
10022
+ type: concept.periodType || "duration"
10023
+ }
10024
+ };
10025
+ if (concept.periodType === "instant") {
10026
+ instanceEntry.period.date = (fieldPeriodData == null ? void 0 : fieldPeriodData.instantDate) || (fieldPeriodData == null ? void 0 : fieldPeriodData.endDate) || (column2 == null ? void 0 : column2.periodEndDate) || field2.periodInstantDate || field2.periodEndDate || field2.periodStartDate || this.periodStartDate;
10027
+ } else {
10028
+ instanceEntry.period.startDate = (fieldPeriodData == null ? void 0 : fieldPeriodData.startDate) || (column2 == null ? void 0 : column2.periodStartDate) || field2.periodStartDate || this.periodStartDate;
10029
+ instanceEntry.period.endDate = (fieldPeriodData == null ? void 0 : fieldPeriodData.endDate) || (column2 == null ? void 0 : column2.periodEndDate) || field2.periodEndDate || this.periodEndDate;
10030
+ }
10031
+ const instanceUnit = (_c = this._unitData[instanceId]) == null ? void 0 : _c[field2.columnId];
10032
+ if (instanceUnit) {
10033
+ instanceEntry.unit = instanceUnit;
10034
+ }
10035
+ if ((column2 == null ? void 0 : column2.type) === "dimension" && ((_d = column2.dimensionData) == null ? void 0 : _d.dimensionIdKey)) {
10036
+ instanceEntry.dimension = column2.dimensionData.dimensionIdKey;
10037
+ }
10038
+ if ((_e = field2.crossRoleTypedMembers) == null ? void 0 : _e.length) {
10039
+ const crossRoleKey = `${instanceId}__${field2.columnId}`;
10040
+ const crossRoleValues = this._typedMemberData[crossRoleKey];
10041
+ if (crossRoleValues) {
10042
+ const filteredTypedMembers = {};
10043
+ field2.crossRoleTypedMembers.forEach((tm) => {
10044
+ const val = crossRoleValues[tm.axisId];
10045
+ if (val !== void 0 && val !== null && val !== "") {
10046
+ filteredTypedMembers[tm.axisId] = { value: val, memberName: tm.typedMemberId };
10047
+ }
10048
+ });
10049
+ if (Object.keys(filteredTypedMembers).length > 0) {
10050
+ instanceEntry.typedMembers = filteredTypedMembers;
10051
+ }
10052
+ }
10053
+ }
10054
+ submissionData.push(instanceEntry);
10055
+ });
10056
+ }
10057
+ }
9626
10058
  }
9627
10059
  if (concept.children) {
9628
10060
  this._processConceptsForSubmission(concept.children, submissionData, section2);
@@ -9752,13 +10184,6 @@ let JupiterDynamicForm = class extends LitElement {
9752
10184
  }
9753
10185
  const allFields = [];
9754
10186
  this._collectAllFields(section2.concepts || [], new Set((section2.columns || []).map((col) => col.id)), section2.columns || [], allFields);
9755
- console.warn(`📊 Total fields found: ${allFields.length}`);
9756
- console.warn(`
9757
- 📋 FIELD DETAILS:`);
9758
- allFields.forEach((field2, index) => {
9759
- const status = field2.isEmpty ? "❌ EMPTY" : "✅ FILLED";
9760
- console.warn(` ${index + 1}. ${field2.conceptId} [${field2.columnId}]: ${status} = ${JSON.stringify(field2.value)}`);
9761
- });
9762
10187
  const hasErrors = this._roleHasErrors(roleId);
9763
10188
  const emptyCount = allFields.filter((f2) => f2.isEmpty).length;
9764
10189
  const filledCount = allFields.filter((f2) => !f2.isEmpty).length;
@@ -9833,10 +10258,8 @@ let JupiterDynamicForm = class extends LitElement {
9833
10258
  if (matchedFact && matchedFact.value !== null && matchedFact.value !== void 0 && matchedFact.value !== "") {
9834
10259
  value = matchedFact.value;
9835
10260
  isEmpty = false;
9836
- console.warn(` ✨ FACT PRE-POPULATED: ${fieldConceptId} [${field2.columnId}] = ${JSON.stringify(value)}`);
9837
10261
  }
9838
10262
  }
9839
- console.warn(` 🔍 Field lookup: concept.id="${conceptIdWithSuffix}", field.conceptId="${fieldConceptId}", value=${JSON.stringify(value)}, isEmpty=${isEmpty}`);
9840
10263
  allFields.push({
9841
10264
  conceptId: fieldConceptId,
9842
10265
  columnId: field2.columnId,
@@ -10296,6 +10719,7 @@ let JupiterDynamicForm = class extends LitElement {
10296
10719
  .periodData="${this._periodData}"
10297
10720
  .unitData="${this._unitData}"
10298
10721
  .typedMemberData="${this._typedMemberData}"
10722
+ .repeatCounts="${this._repeatCounts}"
10299
10723
  .defaultUnits="${this.defaultUnits}"
10300
10724
  .disabled="${this.disabled || this.readonly}"
10301
10725
  .collapsible="${config.collapsibleSections !== false}"
@@ -10309,6 +10733,8 @@ let JupiterDynamicForm = class extends LitElement {
10309
10733
  @field-change="${this._handleFieldChange}"
10310
10734
  @period-change="${this._handlePeriodChange}"
10311
10735
  @typed-member-change="${this._handleTypedMemberChange}"
10736
+ @add-concept-repeat="${this._handleAddConceptRepeat}"
10737
+ @remove-concept-repeat="${this._handleRemoveConceptRepeat}"
10312
10738
  @section-expand="${this._handleSectionExpand}"
10313
10739
  @concept-expand="${this._handleConceptExpand}"
10314
10740
  @column-remove="${this._handleColumnRemove}"
@@ -10425,6 +10851,7 @@ let JupiterDynamicForm = class extends LitElement {
10425
10851
  .periodData="${this._periodData}"
10426
10852
  .unitData="${this._unitData}"
10427
10853
  .typedMemberData="${this._typedMemberData}"
10854
+ .repeatCounts="${this._repeatCounts}"
10428
10855
  .defaultUnits="${this.defaultUnits}"
10429
10856
  .disabled="${this.disabled || this.readonly}"
10430
10857
  .collapsible="${false}"
@@ -10438,6 +10865,8 @@ let JupiterDynamicForm = class extends LitElement {
10438
10865
  .periodEndDate="${this.periodEndDate}"
10439
10866
  @field-change="${this._handleFieldChange}"
10440
10867
  @typed-member-change="${this._handleTypedMemberChange}"
10868
+ @add-concept-repeat="${this._handleAddConceptRepeat}"
10869
+ @remove-concept-repeat="${this._handleRemoveConceptRepeat}"
10441
10870
  @section-expand="${this._handleSectionExpand}"
10442
10871
  @concept-expand="${this._handleConceptExpand}"
10443
10872
  @column-remove="${this._handleColumnRemove}"
@@ -10707,7 +11136,7 @@ JupiterDynamicForm.styles = css`
10707
11136
  right: 0;
10708
11137
  padding: 16px 24px;
10709
11138
  border-top: 1px solid var(--jupiter-border-color, #ddd);
10710
- background: var(--jupiter-form-actions-background, #f8f9fa);
11139
+ background: var(--bg-color-2, var(--jupiter-form-actions-background, #f8f9fa));
10711
11140
  display: flex;
10712
11141
  gap: 12px;
10713
11142
  align-items: center;
@@ -10718,6 +11147,7 @@ JupiterDynamicForm.styles = css`
10718
11147
  .form-sections {
10719
11148
  padding: 24px;
10720
11149
  padding-bottom: 100px; /* Add space for fixed footer */
11150
+ background: var(--bg-color-2);
10721
11151
  }
10722
11152
 
10723
11153
  .validation-summary {
@@ -10755,22 +11185,23 @@ JupiterDynamicForm.styles = css`
10755
11185
  }
10756
11186
 
10757
11187
  .btn-primary {
10758
- background: var(--jupiter-primary-color, #1976d2);
10759
- color: white;
11188
+ background: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));
11189
+ color: var(--buttonTextColor, white);
10760
11190
  }
10761
11191
 
10762
- .btn-primary:hover:not(:disabled) {
10763
- background: var(--jupiter-primary-color-dark, #1565c0);
10764
- }
11192
+ // .btn-primary:hover:not(:disabled) {
11193
+ // background: var(--jupiter-primary-color-dark, #1565c0);
11194
+ // }
10765
11195
 
10766
11196
  .btn-secondary {
10767
- background: var(--jupiter-secondary-color, #757575);
10768
- color: white;
11197
+ color: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));
11198
+ border: 1px solid var(--buttonBgColor, var(--jupiter-primary-color, #1976d2)) !important;
11199
+ background: transparent;
10769
11200
  }
10770
11201
 
10771
- .btn-secondary:hover:not(:disabled) {
10772
- background: var(--jupiter-secondary-color-dark, #616161);
10773
- }
11202
+ // .btn-secondary:hover:not(:disabled) {
11203
+ // background: var(--jupiter-secondary-color-dark, #616161);
11204
+ // }
10774
11205
 
10775
11206
  .btn-outline {
10776
11207
  background: transparent;
@@ -10848,7 +11279,7 @@ JupiterDynamicForm.styles = css`
10848
11279
  padding: 8px 16px;
10849
11280
  background: transparent;
10850
11281
  border: 1px solid var(--jupiter-primary-color, #1976d2);
10851
- color: var(--jupiter-primary-color, #1976d2);
11282
+ color: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));
10852
11283
  border-radius: 4px;
10853
11284
  font-size: 13px;
10854
11285
  font-weight: 500;
@@ -10857,10 +11288,10 @@ JupiterDynamicForm.styles = css`
10857
11288
  margin-right: auto;
10858
11289
  }
10859
11290
 
10860
- .filter-roles-button:hover:not(:disabled) {
10861
- background: var(--jupiter-primary-color, #1976d2);
10862
- color: white;
10863
- }
11291
+ // .filter-roles-button:hover:not(:disabled) {
11292
+ // background: var(--jupiter-primary-color, #1976d2);
11293
+ // color: white;
11294
+ // }
10864
11295
 
10865
11296
  .filter-roles-button .filter-icon {
10866
11297
  width: 16px;
@@ -10871,8 +11302,8 @@ JupiterDynamicForm.styles = css`
10871
11302
  .roles-count {
10872
11303
  display: inline-flex;
10873
11304
  align-items: center;
10874
- background: var(--jupiter-primary-color, #1976d2);
10875
- color: white;
11305
+ background: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));
11306
+ color: var(--headerBgColor, white) !important;
10876
11307
  border-radius: 10px;
10877
11308
  font-size: 11px;
10878
11309
  font-weight: 600;
@@ -10911,9 +11342,9 @@ JupiterDynamicForm.styles = css`
10911
11342
  .side-panel-roles-list {
10912
11343
  width: 280px;
10913
11344
  min-width: 280px;
10914
- border-right: 1px solid var(--jupiter-border-color, #ddd);
11345
+ border-right: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
10915
11346
  overflow-y: auto;
10916
- background: var(--jupiter-background-light, #f8f9fa);
11347
+ background: var(--bg-color-2, var(--jupiter-background-light, #f8f9fa));
10917
11348
  display: flex;
10918
11349
  flex-direction: column;
10919
11350
  transition: width 0.3s ease, min-width 0.3s ease;
@@ -10933,8 +11364,10 @@ JupiterDynamicForm.styles = css`
10933
11364
  right: 0px;
10934
11365
  width: 32px;
10935
11366
  height: 32px;
10936
- border: 1px solid var(--jupiter-border-color, #ddd);
10937
- background: var(--jupiter-background, #fff);
11367
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
11368
+ background: var(--bg-color-2, var(--jupiter-background, #fff));
11369
+ color: var(--primaryTextColor);
11370
+
10938
11371
  border-radius: 4px;
10939
11372
  cursor: pointer;
10940
11373
  display: flex;
@@ -10942,7 +11375,6 @@ JupiterDynamicForm.styles = css`
10942
11375
  justify-content: center;
10943
11376
  z-index: 100;
10944
11377
  transition: all 0.2s ease;
10945
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
10946
11378
  }
10947
11379
 
10948
11380
  .side-panel-toggle-btn:hover {
@@ -10966,7 +11398,7 @@ JupiterDynamicForm.styles = css`
10966
11398
  position: sticky;
10967
11399
  top: 0;
10968
11400
  z-index: 10;
10969
- background: var(--jupiter-background, #fff);
11401
+ background: var(--bg-color-2, var(--jupiter-background, #fff));
10970
11402
  padding: 16px;
10971
11403
  border-bottom: 1px solid var(--jupiter-border-color, #ddd);
10972
11404
  }
@@ -10974,21 +11406,21 @@ JupiterDynamicForm.styles = css`
10974
11406
  .side-panel-search-input {
10975
11407
  width: 100%;
10976
11408
  padding: 10px 40px 10px 12px;
10977
- border: 1px solid var(--jupiter-border-color, #ddd);
11409
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
10978
11410
  border-radius: 4px;
10979
11411
  font-size: 14px;
10980
11412
  font-family: inherit;
10981
- background: var(--jupiter-background, #fff);
10982
- color: var(--jupiter-text-primary, #333);
11413
+ background: transparent;
11414
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
10983
11415
  transition: border-color 0.2s ease;
10984
11416
  box-sizing: border-box;
10985
11417
  }
10986
11418
 
10987
- .side-panel-search-input:focus {
10988
- outline: none;
10989
- border-color: var(--jupiter-primary-color, #1976d2);
10990
- box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.1);
10991
- }
11419
+ // .side-panel-search-input:focus {
11420
+ // outline: none;
11421
+ // border-color: var(--jupiter-primary-color, #1976d2);
11422
+ // box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.1);
11423
+ // }
10992
11424
 
10993
11425
  .side-panel-search-input::placeholder {
10994
11426
  color: var(--jupiter-text-secondary, #666);
@@ -11048,16 +11480,16 @@ JupiterDynamicForm.styles = css`
11048
11480
  border-bottom: 1px solid var(--jupiter-border-color, #e0e0e0);
11049
11481
  transition: background-color 0.2s ease;
11050
11482
  font-size: 14px;
11051
- color: var(--jupiter-text-primary, #333);
11483
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
11052
11484
  line-height: 1.4;
11053
11485
  }
11054
11486
 
11055
- .side-panel-role-item:hover {
11056
- background: var(--jupiter-hover-background, #e8e8e8);
11057
- }
11487
+ // .side-panel-role-item:hover {
11488
+ // background: var(--jupiter-hover-background, #e8e8e8);
11489
+ // }
11058
11490
 
11059
11491
  .side-panel-role-item.active {
11060
- background: var(--jupiter-primary-color, #1976d2);
11492
+ background: var(--light-color-1, var(--jupiter-primary-color, #1976d2));
11061
11493
  color: white;
11062
11494
  font-weight: 500;
11063
11495
  }
@@ -11442,6 +11874,9 @@ __decorateClass([
11442
11874
  __decorateClass([
11443
11875
  n2({ type: String })
11444
11876
  ], JupiterDynamicForm.prototype, "language", 2);
11877
+ __decorateClass([
11878
+ n2({ type: String })
11879
+ ], JupiterDynamicForm.prototype, "reportingLanguage", 2);
11445
11880
  __decorateClass([
11446
11881
  n2({ type: String })
11447
11882
  ], JupiterDynamicForm.prototype, "display", 2);
@@ -11502,6 +11937,9 @@ __decorateClass([
11502
11937
  __decorateClass([
11503
11938
  r()
11504
11939
  ], JupiterDynamicForm.prototype, "_preservedTypedMemberData", 2);
11940
+ __decorateClass([
11941
+ r()
11942
+ ], JupiterDynamicForm.prototype, "_repeatCounts", 2);
11505
11943
  __decorateClass([
11506
11944
  r()
11507
11945
  ], JupiterDynamicForm.prototype, "_columns", 2);