ixbrl-viewer 1.4.1__py3-none-any.whl → 1.4.86__py3-none-any.whl

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.
Files changed (190) hide show
  1. iXBRLViewerPlugin/__init__.py +231 -127
  2. iXBRLViewerPlugin/_version.py +33 -3
  3. iXBRLViewerPlugin/constants.py +96 -2
  4. iXBRLViewerPlugin/featureConfig.py +8 -1
  5. iXBRLViewerPlugin/iXBRLViewer.py +356 -214
  6. iXBRLViewerPlugin/plugin.py +12 -0
  7. iXBRLViewerPlugin/ui.py +81 -50
  8. iXBRLViewerPlugin/viewer/dist/ixbrlviewer.js +1 -1
  9. iXBRLViewerPlugin/viewer/dist/ixbrlviewer.js.LICENSE.txt +12 -5
  10. iXBRLViewerPlugin/viewer/i18next-parser.config.js +1 -1
  11. iXBRLViewerPlugin/viewer/src/data/utr.json +1244 -0
  12. iXBRLViewerPlugin/viewer/src/html/fact-details.html +69 -38
  13. iXBRLViewerPlugin/viewer/src/html/footer-logo.html +4 -0
  14. iXBRLViewerPlugin/viewer/src/html/footnote-details.html +2 -2
  15. iXBRLViewerPlugin/viewer/src/html/inspector.html +352 -197
  16. iXBRLViewerPlugin/viewer/src/i18n/cy/balancetypes.json +1 -0
  17. iXBRLViewerPlugin/viewer/src/i18n/cy/currencies.json +13 -0
  18. iXBRLViewerPlugin/viewer/src/i18n/cy/datatypes.json +9 -0
  19. iXBRLViewerPlugin/viewer/src/i18n/cy/labelroles.json +24 -0
  20. iXBRLViewerPlugin/viewer/src/i18n/cy/referenceparts.json +10 -0
  21. iXBRLViewerPlugin/viewer/src/i18n/cy/scale.json +16 -0
  22. iXBRLViewerPlugin/viewer/src/i18n/cy/tooltips.json +17 -0
  23. iXBRLViewerPlugin/viewer/src/i18n/cy/translation.json +179 -0
  24. iXBRLViewerPlugin/viewer/src/i18n/da/balancetypes.json +4 -0
  25. iXBRLViewerPlugin/viewer/src/i18n/da/currencies.json +13 -0
  26. iXBRLViewerPlugin/viewer/src/i18n/da/datatypes.json +9 -0
  27. iXBRLViewerPlugin/viewer/src/i18n/da/labelroles.json +24 -0
  28. iXBRLViewerPlugin/viewer/src/i18n/da/referenceparts.json +10 -0
  29. iXBRLViewerPlugin/viewer/src/i18n/da/scale.json +15 -0
  30. iXBRLViewerPlugin/viewer/src/i18n/da/tooltips.json +17 -0
  31. iXBRLViewerPlugin/viewer/src/i18n/da/translation.json +179 -0
  32. iXBRLViewerPlugin/viewer/src/i18n/de/balancetypes.json +4 -0
  33. iXBRLViewerPlugin/viewer/src/i18n/de/currencies.json +13 -0
  34. iXBRLViewerPlugin/viewer/src/i18n/de/datatypes.json +9 -0
  35. iXBRLViewerPlugin/viewer/src/i18n/de/labelroles.json +24 -0
  36. iXBRLViewerPlugin/viewer/src/i18n/de/referenceparts.json +10 -0
  37. iXBRLViewerPlugin/viewer/src/i18n/de/scale.json +15 -0
  38. iXBRLViewerPlugin/viewer/src/i18n/de/tooltips.json +17 -0
  39. iXBRLViewerPlugin/viewer/src/i18n/de/translation.json +179 -0
  40. iXBRLViewerPlugin/viewer/src/i18n/en/balancetypes.json +4 -0
  41. iXBRLViewerPlugin/viewer/src/i18n/en/datatypes.json +10 -0
  42. iXBRLViewerPlugin/viewer/src/i18n/en/labelroles.json +4 -0
  43. iXBRLViewerPlugin/viewer/src/i18n/en/scale.json +16 -0
  44. iXBRLViewerPlugin/viewer/src/i18n/en/tooltips.json +17 -0
  45. iXBRLViewerPlugin/viewer/src/i18n/en/translation.json +73 -23
  46. iXBRLViewerPlugin/viewer/src/i18n/es/balancetypes.json +4 -0
  47. iXBRLViewerPlugin/viewer/src/i18n/es/datatypes.json +10 -0
  48. iXBRLViewerPlugin/viewer/src/i18n/es/labelroles.json +24 -0
  49. iXBRLViewerPlugin/viewer/src/i18n/es/scale.json +16 -0
  50. iXBRLViewerPlugin/viewer/src/i18n/es/tooltips.json +17 -0
  51. iXBRLViewerPlugin/viewer/src/i18n/es/translation.json +87 -37
  52. iXBRLViewerPlugin/viewer/src/i18n/fr/balancetypes.json +4 -0
  53. iXBRLViewerPlugin/viewer/src/i18n/fr/currencies.json +13 -0
  54. iXBRLViewerPlugin/viewer/src/i18n/fr/datatypes.json +9 -0
  55. iXBRLViewerPlugin/viewer/src/i18n/fr/labelroles.json +24 -0
  56. iXBRLViewerPlugin/viewer/src/i18n/fr/referenceparts.json +10 -0
  57. iXBRLViewerPlugin/viewer/src/i18n/fr/scale.json +15 -0
  58. iXBRLViewerPlugin/viewer/src/i18n/fr/tooltips.json +17 -0
  59. iXBRLViewerPlugin/viewer/src/i18n/fr/translation.json +179 -0
  60. iXBRLViewerPlugin/viewer/src/i18n/nl/balancetypes.json +4 -0
  61. iXBRLViewerPlugin/viewer/src/i18n/nl/currencies.json +13 -0
  62. iXBRLViewerPlugin/viewer/src/i18n/nl/datatypes.json +9 -0
  63. iXBRLViewerPlugin/viewer/src/i18n/nl/labelroles.json +24 -0
  64. iXBRLViewerPlugin/viewer/src/i18n/nl/referenceparts.json +10 -0
  65. iXBRLViewerPlugin/viewer/src/i18n/nl/scale.json +15 -0
  66. iXBRLViewerPlugin/viewer/src/i18n/nl/tooltips.json +17 -0
  67. iXBRLViewerPlugin/viewer/src/i18n/nl/translation.json +179 -0
  68. iXBRLViewerPlugin/viewer/src/i18n/uk/balancetypes.json +4 -0
  69. iXBRLViewerPlugin/viewer/src/i18n/uk/currencies.json +13 -0
  70. iXBRLViewerPlugin/viewer/src/i18n/uk/datatypes.json +9 -0
  71. iXBRLViewerPlugin/viewer/src/i18n/uk/labelroles.json +24 -0
  72. iXBRLViewerPlugin/viewer/src/i18n/uk/referenceparts.json +10 -0
  73. iXBRLViewerPlugin/viewer/src/i18n/uk/scale.json +15 -0
  74. iXBRLViewerPlugin/viewer/src/i18n/uk/tooltips.json +17 -0
  75. iXBRLViewerPlugin/viewer/src/i18n/uk/translation.json +179 -0
  76. iXBRLViewerPlugin/viewer/src/icons/calculator.svg +13 -0
  77. iXBRLViewerPlugin/viewer/src/icons/circle-cross.svg +11 -0
  78. iXBRLViewerPlugin/viewer/src/icons/circle-tick.svg +11 -0
  79. iXBRLViewerPlugin/viewer/src/icons/dark-mode.svg +4 -0
  80. iXBRLViewerPlugin/viewer/src/icons/dimension.svg +1 -5
  81. iXBRLViewerPlugin/viewer/src/icons/member.svg +2 -5
  82. iXBRLViewerPlugin/viewer/src/icons/multi-tag.svg +10 -0
  83. iXBRLViewerPlugin/viewer/src/img/arelle-dark.svg +179 -0
  84. iXBRLViewerPlugin/viewer/src/img/inline-viewer-dark.svg +59 -0
  85. iXBRLViewerPlugin/viewer/src/js/accordian.js +5 -4
  86. iXBRLViewerPlugin/viewer/src/js/aspect.js +29 -10
  87. iXBRLViewerPlugin/viewer/src/js/aspect.test.js +40 -31
  88. iXBRLViewerPlugin/viewer/src/js/balance.js +14 -0
  89. iXBRLViewerPlugin/viewer/src/js/calculation.js +213 -0
  90. iXBRLViewerPlugin/viewer/src/js/calculation.test.js +306 -0
  91. iXBRLViewerPlugin/viewer/src/js/calculationInspector.js +187 -0
  92. iXBRLViewerPlugin/viewer/src/js/chart.js +26 -24
  93. iXBRLViewerPlugin/viewer/src/js/chart.test.js +10 -9
  94. iXBRLViewerPlugin/viewer/src/js/concept.js +37 -4
  95. iXBRLViewerPlugin/viewer/src/js/concept.test.js +30 -6
  96. iXBRLViewerPlugin/viewer/src/js/datatype.js +20 -0
  97. iXBRLViewerPlugin/viewer/src/js/datatype.test.js +62 -0
  98. iXBRLViewerPlugin/viewer/src/js/dialog.js +6 -4
  99. iXBRLViewerPlugin/viewer/src/js/docOrderIndex.js +7 -7
  100. iXBRLViewerPlugin/viewer/src/js/fact.js +156 -59
  101. iXBRLViewerPlugin/viewer/src/js/fact.test.js +160 -29
  102. iXBRLViewerPlugin/viewer/src/js/factset.js +64 -15
  103. iXBRLViewerPlugin/viewer/src/js/factset.test.js +102 -31
  104. iXBRLViewerPlugin/viewer/src/js/footnote.js +8 -2
  105. iXBRLViewerPlugin/viewer/src/js/index.js +11 -3
  106. iXBRLViewerPlugin/viewer/src/js/inspector.js +747 -221
  107. iXBRLViewerPlugin/viewer/src/js/inspector.test.js +143 -25
  108. iXBRLViewerPlugin/viewer/src/js/interval.js +70 -0
  109. iXBRLViewerPlugin/viewer/src/js/interval.test.js +153 -0
  110. iXBRLViewerPlugin/viewer/src/js/ixbrlviewer.js +391 -262
  111. iXBRLViewerPlugin/viewer/src/js/ixbrlviewer.test.js +134 -20
  112. iXBRLViewerPlugin/viewer/src/js/ixnode.js +1 -1
  113. iXBRLViewerPlugin/viewer/src/js/menu.js +25 -7
  114. iXBRLViewerPlugin/viewer/src/js/number-matcher.js +7 -3
  115. iXBRLViewerPlugin/viewer/src/js/number-matcher.test.js +4 -0
  116. iXBRLViewerPlugin/viewer/src/js/outline.js +34 -13
  117. iXBRLViewerPlugin/viewer/src/js/outline.test.js +97 -91
  118. iXBRLViewerPlugin/viewer/src/js/period.js +0 -1
  119. iXBRLViewerPlugin/viewer/src/js/report.js +260 -351
  120. iXBRLViewerPlugin/viewer/src/js/report.test.js +95 -27
  121. iXBRLViewerPlugin/viewer/src/js/reportset.js +264 -0
  122. iXBRLViewerPlugin/viewer/src/js/reportset.test.js +357 -0
  123. iXBRLViewerPlugin/viewer/src/js/search.js +72 -38
  124. iXBRLViewerPlugin/viewer/src/js/search.test.js +184 -84
  125. iXBRLViewerPlugin/viewer/src/js/summary.js +34 -8
  126. iXBRLViewerPlugin/viewer/src/js/summary.test.js +69 -25
  127. iXBRLViewerPlugin/viewer/src/js/tableExport.js +9 -9
  128. iXBRLViewerPlugin/viewer/src/js/taxonomynamer.js +34 -0
  129. iXBRLViewerPlugin/viewer/src/js/taxonomynamer.test.js +32 -0
  130. iXBRLViewerPlugin/viewer/src/js/test-utils.js +46 -0
  131. iXBRLViewerPlugin/viewer/src/js/theme.js +50 -0
  132. iXBRLViewerPlugin/viewer/src/js/unit.js +90 -32
  133. iXBRLViewerPlugin/viewer/src/js/unit.test.js +62 -25
  134. iXBRLViewerPlugin/viewer/src/js/util.js +94 -0
  135. iXBRLViewerPlugin/viewer/src/js/util.test.js +33 -1
  136. iXBRLViewerPlugin/viewer/src/js/utr.js +27 -0
  137. iXBRLViewerPlugin/viewer/src/js/viewer.js +205 -181
  138. iXBRLViewerPlugin/viewer/src/js/viewerOptions.js +0 -2
  139. iXBRLViewerPlugin/viewer/src/less/accordian.less +10 -6
  140. iXBRLViewerPlugin/viewer/src/less/block-list.less +16 -5
  141. iXBRLViewerPlugin/viewer/src/less/calculation-inspector.less +83 -0
  142. iXBRLViewerPlugin/viewer/src/less/chart.less +8 -5
  143. iXBRLViewerPlugin/viewer/src/less/colours-dark-mode.less +40 -0
  144. iXBRLViewerPlugin/viewer/src/less/colours.less +32 -20
  145. iXBRLViewerPlugin/viewer/src/less/common.less +3 -3
  146. iXBRLViewerPlugin/viewer/src/less/components.less +6 -4
  147. iXBRLViewerPlugin/viewer/src/less/core.less +2 -0
  148. iXBRLViewerPlugin/viewer/src/less/dialog.less +21 -14
  149. iXBRLViewerPlugin/viewer/src/less/form-controls.less +33 -11
  150. iXBRLViewerPlugin/viewer/src/less/inspector.less +1045 -726
  151. iXBRLViewerPlugin/viewer/src/less/loader.less +2 -2
  152. iXBRLViewerPlugin/viewer/src/less/menu.less +33 -15
  153. iXBRLViewerPlugin/viewer/src/less/summary.less +16 -6
  154. iXBRLViewerPlugin/viewer/src/less/tabs.less +9 -9
  155. iXBRLViewerPlugin/viewer/src/less/text-block-viewer.less +2 -0
  156. iXBRLViewerPlugin/viewer/src/less/text-mixins.less +2 -1
  157. iXBRLViewerPlugin/viewer/src/less/validation-report.less +2 -3
  158. iXBRLViewerPlugin/viewer/src/less/viewer.less +105 -74
  159. iXBRLViewerPlugin/viewer/webpack.common.js +19 -9
  160. iXBRLViewerPlugin/xhtmlserialize.py +59 -45
  161. {ixbrl_viewer-1.4.1.dist-info → ixbrl_viewer-1.4.86.dist-info}/METADATA +181 -50
  162. ixbrl_viewer-1.4.86.dist-info/RECORD +217 -0
  163. {ixbrl_viewer-1.4.1.dist-info → ixbrl_viewer-1.4.86.dist-info}/WHEEL +1 -1
  164. ixbrl_viewer-1.4.1.dist-info/LICENSE → ixbrl_viewer-1.4.86.dist-info/licenses/LICENSE.md +8 -14
  165. {ixbrl_viewer-1.4.1.dist-info → ixbrl_viewer-1.4.86.dist-info}/top_level.txt +0 -1
  166. iXBRLViewerPlugin/viewer/src/js/calculations.js +0 -111
  167. iXBRLViewerPlugin/viewer/src/js/interact.min.js +0 -6
  168. ixbrl_viewer-1.4.1.dist-info/RECORD +0 -155
  169. tests/__init__.py +0 -0
  170. tests/puppeteer/framework/core_elements.js +0 -117
  171. tests/puppeteer/framework/page_objects/doc_frame.js +0 -105
  172. tests/puppeteer/framework/page_objects/fact_details_panel.js +0 -80
  173. tests/puppeteer/framework/page_objects/search_panel.js +0 -76
  174. tests/puppeteer/framework/page_objects/toolbar.js +0 -18
  175. tests/puppeteer/framework/utils.js +0 -3
  176. tests/puppeteer/framework/viewer_page.js +0 -103
  177. tests/puppeteer/puppeteer_test_run_via_intellij.jpg +0 -0
  178. tests/puppeteer/test_filings/filing_documents_smoke_test.zip +0 -0
  179. tests/puppeteer/test_filings/highlights.zip +0 -0
  180. tests/puppeteer/tests/fact_properties.test.js +0 -78
  181. tests/puppeteer/tests/highlight.test.js +0 -186
  182. tests/puppeteer/tests/search.test.js +0 -86
  183. tests/puppeteer/tools/generate.sh +0 -15
  184. tests/unit_tests/__init__.py +0 -0
  185. tests/unit_tests/iXBRLViewerPlugin/__init__.py +0 -0
  186. tests/unit_tests/iXBRLViewerPlugin/mock_arelle.py +0 -39
  187. tests/unit_tests/iXBRLViewerPlugin/test_iXBRLViewer.py +0 -641
  188. tests/unit_tests/iXBRLViewerPlugin/test_xhtmlserialize.py +0 -310
  189. {ixbrl_viewer-1.4.1.dist-info → ixbrl_viewer-1.4.86.dist-info}/entry_points.txt +0 -0
  190. {ixbrl_viewer-1.4.1.dist-info → ixbrl_viewer-1.4.86.dist-info/licenses}/NOTICE +0 -0
@@ -0,0 +1,357 @@
1
+ // See COPYRIGHT.md for copyright information
2
+
3
+ import { ReportSet } from "./reportset.js";
4
+ import { ViewerOptions } from "./viewerOptions.js";
5
+ import { NAMESPACE_ISO4217, viewerUniqueId } from "./util.js";
6
+ import { createNumericFact } from "./test-utils.js";
7
+
8
+ function anchoringRelationShips(include) {
9
+ if (include) {
10
+ return {
11
+ "w-n": {
12
+ "role1": {
13
+ "eg:Concept1": [{"t": "eg:Concept2"}],
14
+ }
15
+ }
16
+ }
17
+ }
18
+ return {}
19
+ }
20
+
21
+ function multiReportTestData(withAnchoring) {
22
+ return {
23
+ "features": [],
24
+ "languages": {
25
+ "en-us": "English (US)",
26
+ "en": "English",
27
+ "fr": "French",
28
+ },
29
+ "prefixes": {
30
+ "eg": "http://www.example.com",
31
+ "iso4217": NAMESPACE_ISO4217
32
+ },
33
+ "roles": {
34
+ "role1": "https://www.example.com/role1",
35
+ "role2": "https://www.example.com/role2",
36
+ "role3": "https://www.example.com/role3",
37
+ "role4": "https://www.example.com/role4"
38
+ },
39
+ "sourceReports": [
40
+ {
41
+ "targetReports": [
42
+ {
43
+ "roleDefs": {
44
+ "role1": { "en": "Role 1 Label" },
45
+ "role2": { "en": null },
46
+ "role3": {}
47
+ },
48
+ "concepts": {
49
+ "eg:Concept1": {
50
+ "labels": {
51
+ "std": {
52
+ "en": "English label"
53
+ }
54
+ }
55
+ },
56
+ "eg:Concept2": {
57
+ "labels": {
58
+ "std": {
59
+ "en": "English label for concept two",
60
+ "en-us": "English (US) label for concept two",
61
+ }
62
+ }
63
+ },
64
+ "eg:Concept3": {
65
+ "labels": {
66
+ "std": {
67
+ "en": "Concept three"
68
+ }
69
+ }
70
+ }
71
+ },
72
+
73
+ "facts": {
74
+ ...createNumericFact("f1", "eg:Concept1", "iso2417:USD", "2018-01-01/2019-01-01", 1000, -3),
75
+ ...createNumericFact("f2", "eg:Concept2", "iso2417:USD", "2018-01-01/2019-01-01", 1000, -3),
76
+ },
77
+
78
+
79
+ "softwareCredits": ["Example credit text C", "Example credit text B"],
80
+ },
81
+ ]
82
+ },
83
+ {
84
+ "targetReports": [
85
+ {
86
+ "roleDefs": {
87
+ },
88
+ "concepts": {
89
+ "eg:Concept1": {
90
+ "labels": {
91
+ "std": {
92
+ "en": "English label"
93
+ }
94
+ }
95
+ },
96
+ "eg:Concept2": {
97
+ "labels": {
98
+ "std": {
99
+ "en": "Report 2 English label for concept two",
100
+ }
101
+ }
102
+ },
103
+ "eg:Concept3": {
104
+ "labels": {
105
+ "std": {
106
+ "en-gb": "Concept three"
107
+ }
108
+ }
109
+ }
110
+ },
111
+
112
+ "facts": {
113
+ ...createNumericFact("f1", "eg:Concept1", "iso2417:USD", "2018-01-01/2019-01-01", 2000, -3),
114
+ },
115
+
116
+ "rels": {
117
+ ...anchoringRelationShips(withAnchoring)
118
+ },
119
+
120
+ "softwareCredits": ["Example credit text A"],
121
+ }
122
+ ]
123
+ }
124
+ ]
125
+ };
126
+ }
127
+
128
+ // Legacy report data format - no "sourceReports" array
129
+ function singleReportTestData() {
130
+ return {
131
+ "features": [],
132
+ "languages": {
133
+ "en-us": "English (US)",
134
+ "en": "English",
135
+ "fr": "French",
136
+ },
137
+ "prefixes": {
138
+ "eg": "http://www.example.com",
139
+ "iso4217": NAMESPACE_ISO4217
140
+ },
141
+ "roles": {
142
+ "role1": "https://www.example.com/role1",
143
+ "role2": "https://www.example.com/role2",
144
+ "role3": "https://www.example.com/role3",
145
+ "role4": "https://www.example.com/role4"
146
+ },
147
+ "roleDefs": {
148
+ "role1": { "en": "Role 1 Label" },
149
+ "role2": { "en": null },
150
+ "role3": {}
151
+ },
152
+ "concepts": {
153
+ "eg:Concept1": {
154
+ "labels": {
155
+ "std": {
156
+ "en": "English label"
157
+ }
158
+ }
159
+ },
160
+ "eg:Concept2": {
161
+ "labels": {
162
+ "std": {
163
+ "en": "English label for concept two",
164
+ "en-us": "English (US) label for concept two",
165
+ }
166
+ }
167
+ },
168
+ },
169
+
170
+ "facts": {
171
+ ...createNumericFact("f1", "eg:Concept1", "iso2417:USD", "2018-01-01/2019-01-01", 1000, -3),
172
+ ...createNumericFact("f2", "eg:Concept2", "iso2417:USD", "2018-01-01/2019-01-01", 1000, -3),
173
+ },
174
+
175
+ "softwareCredits": ["Example credit text"],
176
+ };
177
+ }
178
+
179
+ describe("Multi report - basic", () => {
180
+ const testReportSet = new ReportSet(multiReportTestData());
181
+ testReportSet._initialize();
182
+ test("Report count", () => {
183
+ expect(testReportSet.reports).toHaveLength(2);
184
+ });
185
+ });
186
+
187
+ describe("Multi report - Language options", () => {
188
+ const testReportSet = new ReportSet(multiReportTestData());
189
+ testReportSet._initialize();
190
+ test("Available languages", () => {
191
+ const al = testReportSet.availableLanguages();
192
+ expect(al).toHaveLength(3);
193
+ expect(al).toEqual(expect.arrayContaining(["en", "en-us", "en-gb"]));
194
+ });
195
+ });
196
+
197
+ describe("Multi report - Fetching facts", () => {
198
+ const testReportSet = new ReportSet(multiReportTestData());
199
+ testReportSet._initialize();
200
+
201
+ test("Successful f1 (report 1)", () => {
202
+ const f = testReportSet.getItemById(viewerUniqueId(0, "f1"));
203
+ expect(f).not.toBeNull();
204
+ expect(f.decimals()).toEqual(-3);
205
+ });
206
+ test("Successful f2 (report 1)", () => {
207
+ const f = testReportSet.getItemById(viewerUniqueId(0, "f2"));
208
+ expect(f).not.toBeNull();
209
+ expect(f.decimals()).toEqual(-3);
210
+ });
211
+ test("Successful f1 (report 2)", () => {
212
+ const f = testReportSet.getItemById(viewerUniqueId(1, "f1"));
213
+ expect(f).not.toBeNull();
214
+ expect(f.decimals()).toEqual(-3);
215
+ });
216
+
217
+ test("Non-existent fact", () => {
218
+ const f = testReportSet.getItemById(viewerUniqueId(1, "f2"));
219
+ expect(f).toBeUndefined();
220
+ });
221
+ });
222
+
223
+ describe("Multi report - Concept labels", () => {
224
+ const testReportSet = new ReportSet(multiReportTestData());
225
+ testReportSet._initialize();
226
+ const testReport = testReportSet.reports[0];
227
+ const vo = new ViewerOptions();
228
+ testReportSet.viewerOptions = vo;
229
+ test("Label fallback", () => {
230
+ vo.language = 'en-us';
231
+ expect(testReportSet.reports[0].getLabel('eg:Concept2', 'std')).toBe("English (US) label for concept two");
232
+ // No en-US label in report 2, so fall back on en label
233
+ expect(testReportSet.reports[1].getLabel('eg:Concept2', 'std')).toBe("Report 2 English label for concept two");
234
+ });
235
+ });
236
+
237
+ describe("Multi report - ELR labels", () => {
238
+ const testReportSet = new ReportSet(multiReportTestData());
239
+ testReportSet._initialize();
240
+
241
+ test("Present", () => {
242
+ // Role 1 only has a label in report 1
243
+ expect(testReportSet.reports[0].getRoleLabelOrURI("role1")).toBe("Role 1 Label");
244
+ expect(testReportSet.reports[1].getRoleLabelOrURI("role1")).toBe("https://www.example.com/role1");
245
+ });
246
+ });
247
+
248
+ describe("Multi report - anchoring", () => {
249
+ test("Without anchoring", () => {
250
+ const testReportSet = new ReportSet(multiReportTestData(false));
251
+ testReportSet._initialize();
252
+ expect(testReportSet.usesAnchoring()).toBe(false);
253
+ });
254
+ test("With anchoring", () => {
255
+ const testReportSet = new ReportSet(multiReportTestData(true));
256
+ testReportSet._initialize();
257
+ expect(testReportSet.usesAnchoring()).toBe(true);
258
+ });
259
+ });
260
+
261
+ describe("Multi report - doc set files", () => {
262
+ test("Not overlapping", () => {
263
+ const data = multiReportTestData(false);
264
+ data.sourceReports[0].docSetFiles = ["a.html", "b.html"];
265
+ data.sourceReports[1].docSetFiles = ["c.html", "d.html"];
266
+ const testReportSet = new ReportSet(data);
267
+ testReportSet._initialize();
268
+ expect(testReportSet.reportFiles()).toStrictEqual([{"index": 0, "file": "a.html"}, {"index": 0, "file": "b.html"}, {"index": 1, "file": "c.html"}, {"index": 1, "file": "d.html"}]);
269
+ });
270
+ test("Repeated document set", () => {
271
+ const data = multiReportTestData(false);
272
+ data.sourceReports[0].docSetFiles = ["a.html", "b.html"];
273
+ data.sourceReports[1].docSetFiles = ["a.html", "b.html"];
274
+ const testReportSet = new ReportSet(data);
275
+ testReportSet._initialize();
276
+ expect(testReportSet.reportFiles()).toStrictEqual([{"index": 0, "file": "a.html"}, {"index": 0, "file": "b.html"}, {"index": 1, "file": "a.html"}, {"index": 1, "file": "b.html"}]);
277
+ });
278
+ });
279
+
280
+ describe("Single report - basic", () => {
281
+ const testReportSet = new ReportSet(singleReportTestData());
282
+ testReportSet._initialize();
283
+ test("Report count", () => {
284
+ expect(testReportSet.reports).toHaveLength(1);
285
+ });
286
+ });
287
+
288
+ describe("Single report - Language options", () => {
289
+ const testReportSet = new ReportSet(singleReportTestData());
290
+ testReportSet._initialize();
291
+ test("Available languages", () => {
292
+ const al = testReportSet.availableLanguages();
293
+ expect(al).toHaveLength(2);
294
+ expect(al).toEqual(expect.arrayContaining(["en", "en-us"]));
295
+ });
296
+ });
297
+
298
+ describe("Single report - Fetching facts", () => {
299
+ const testReportSet = new ReportSet(singleReportTestData());
300
+ testReportSet._initialize();
301
+
302
+ test("Successful f1", () => {
303
+ const f = testReportSet.getItemById(viewerUniqueId(0, "f1"));
304
+ expect(f).not.toBeNull();
305
+ expect(f.decimals()).toEqual(-3);
306
+ });
307
+ test("Successful f2", () => {
308
+ const f = testReportSet.getItemById(viewerUniqueId(0, "f2"));
309
+ expect(f).not.toBeNull();
310
+ expect(f.decimals()).toEqual(-3);
311
+ });
312
+ // There is no second report
313
+ test("Successful f1 (report 2)", () => {
314
+ const f = testReportSet.getItemById(viewerUniqueId(1, "f1"));
315
+ expect(f).toBeUndefined();
316
+ });
317
+ });
318
+
319
+ describe("Single report - Concept labels", () => {
320
+ const testReportSet = new ReportSet(singleReportTestData());
321
+ testReportSet._initialize();
322
+ const testReport = testReportSet.reports[0];
323
+ const vo = new ViewerOptions();
324
+ testReportSet.viewerOptions = vo;
325
+ test("Label fallback", () => {
326
+ vo.language = 'en-us';
327
+ expect(testReportSet.reports[0].getLabel('eg:Concept2', 'std')).toBe("English (US) label for concept two");
328
+ });
329
+ });
330
+
331
+ describe("ELR labels", () => {
332
+ const testReportSet = new ReportSet(singleReportTestData());
333
+ testReportSet._initialize();
334
+
335
+ test("Present", () => {
336
+ expect(testReportSet.reports[0].getRoleLabelOrURI("role1")).toBe("Role 1 Label");
337
+ });
338
+ });
339
+
340
+ describe("Fetching software credit", () => {
341
+
342
+ test("Single", () => {
343
+ const testReportSet = new ReportSet(singleReportTestData());
344
+ testReportSet._initialize();
345
+
346
+ const softwareCredits = testReportSet.getSoftwareCredits();
347
+ expect(softwareCredits).toEqual(["Example credit text"]);
348
+ });
349
+
350
+ test("Multiple", () => {
351
+ const testReportSet = new ReportSet(multiReportTestData(true));
352
+ testReportSet._initialize();
353
+
354
+ const softwareCredits = testReportSet.getSoftwareCredits();
355
+ expect(softwareCredits).toEqual(["Example credit text A", "Example credit text B", "Example credit text C"]);
356
+ });
357
+ });
@@ -1,56 +1,61 @@
1
1
  // See COPYRIGHT.md for copyright information
2
2
 
3
3
  import lunr from 'lunr'
4
- import $ from 'jquery'
5
- import Decimal from "decimal.js";
6
4
 
7
5
  export class ReportSearch {
8
- constructor(report) {
9
- this._report = report;
6
+ constructor(reportSet) {
7
+ this._reportSet = reportSet;
10
8
  this.ready = false;
11
9
  }
12
10
 
13
11
  * buildSearchIndex(doneCallback) {
14
12
  var docs = [];
15
13
  var dims = {};
16
- var facts = this._report.facts();
14
+ var facts = this._reportSet.facts();
17
15
  this.periods = {};
18
- for (var i = 0; i < facts.length; i++) {
19
- var f = facts[i];
20
- var doc = { "id": f.id };
21
- var l = f.getLabel("std");
22
- doc.concept = f.conceptQName().localname;
23
- doc.doc = f.getLabel("doc");
24
- doc.date = f.periodTo();
25
- doc.startDate = f.periodFrom();
26
- var dims = f.dimensions();
27
- for (var d in dims) {
28
- if (this._report.getConcept(d).isTypedDimension()) {
29
- if (dims[d] !== null) {
30
- l += " " + dims[d];
16
+ // Add hidden facts to index later, so that they appear later in the
17
+ // default search
18
+ for (const hidden of [false, true]) {
19
+ for (var i = 0; i < facts.length; i++) {
20
+ var f = facts[i];
21
+ if (f.isHidden() !== hidden) {
22
+ continue;
23
+ }
24
+ var doc = { "id": f.vuid };
25
+ var l = f.getLabel("std");
26
+ doc.concept = f.conceptQName().localname;
27
+ doc.doc = f.getLabel("doc");
28
+ doc.date = f.periodTo();
29
+ doc.startDate = f.periodFrom();
30
+ var dims = f.dimensions();
31
+ for (var d in dims) {
32
+ if (f.report.getConcept(d).isTypedDimension()) {
33
+ if (dims[d] !== null) {
34
+ l += " " + dims[d];
35
+ }
36
+ }
37
+ else {
38
+ l += " " + f.report.getLabel(dims[d], "std");
31
39
  }
32
40
  }
33
- else {
34
- l += " " + this._report.getLabel(dims[d], "std");
41
+ doc.label = l;
42
+ doc.ref = f.concept().referenceValuesAsString();
43
+ const wider = f.widerConcepts();
44
+ if (wider.length > 0) {
45
+ doc.widerConcept = f.report.qname(wider[0]).localname;
46
+ doc.widerLabel = f.report.getLabel(wider[0], "std");
47
+ doc.widerDoc = f.report.getLabel(wider[0], "doc");
35
48
  }
36
- }
37
- doc.label = l;
38
- doc.ref = f.concept().referenceValuesAsString();
39
- const wider = f.widerConcepts();
40
- if (wider.length > 0) {
41
- doc.widerConcept = this._report.qname(wider[0]).localname;
42
- doc.widerLabel = this._report.getLabel(wider[0], "std");
43
- doc.widerDoc = this._report.getLabel(wider[0], "doc");
44
- }
45
- docs.push(doc);
49
+ docs.push(doc);
46
50
 
47
- var p = f.period();
48
- if (p) {
49
- this.periods[p.key()] = p.toString();
50
- }
51
+ var p = f.period();
52
+ if (p) {
53
+ this.periods[p.key()] = p.toString();
54
+ }
51
55
 
52
- if (i % 100 === 0) {
53
- yield;
56
+ if (i % 100 === 0) {
57
+ yield;
58
+ }
54
59
  }
55
60
  }
56
61
  const builder = new lunr.Builder();
@@ -88,7 +93,11 @@ export class ReportSearch {
88
93
  }
89
94
 
90
95
  visibilityFilter(s, item) {
91
- return item.isHidden() ? s.showHiddenFacts : s.showVisibleFacts;
96
+ return (
97
+ s.visibilityFilter === '*' ||
98
+ s.visibilityFilter === 'visible' && !item.isHidden() ||
99
+ s.visibilityFilter === 'hidden' && item.isHidden()
100
+ )
92
101
  }
93
102
 
94
103
  periodFilter(s, item) {
@@ -140,6 +149,14 @@ export class ReportSearch {
140
149
  );
141
150
  }
142
151
 
152
+ dataTypesFilter(s, item) {
153
+ return (
154
+ s.dataTypesFilter == null ||
155
+ s.dataTypesFilter.length === 0 ||
156
+ s.dataTypesFilter.some(p => item.concept().dataType()?.name === p)
157
+ );
158
+ }
159
+
143
160
  unitsFilter(s, item) {
144
161
  return (
145
162
  s.unitsFilter.length === 0 ||
@@ -154,6 +171,20 @@ export class ReportSearch {
154
171
  );
155
172
  }
156
173
 
174
+ targetDocumentFilter(s, item) {
175
+ return (
176
+ s.targetDocumentFilter.length === 0 ||
177
+ s.targetDocumentFilter.some(t => (item.targetDocument() ?? ':default') === t)
178
+ );
179
+ }
180
+
181
+ mandatoryFactFilter(s, item) {
182
+ if(!s.showMandatoryFacts) {
183
+ return true;
184
+ }
185
+ return item.isMandatory();
186
+ }
187
+
157
188
  search(s) {
158
189
  if (!this.ready) {
159
190
  return;
@@ -170,12 +201,15 @@ export class ReportSearch {
170
201
  this.factValueFilter,
171
202
  this.calculationsFilter,
172
203
  this.namespacesFilter,
204
+ this.dataTypesFilter,
173
205
  this.unitsFilter,
174
206
  this.scalesFilter,
207
+ this.targetDocumentFilter,
208
+ this.mandatoryFactFilter
175
209
  ];
176
210
 
177
211
  rr.forEach((r,_) => {
178
- const item = searchIndex._report.getItemById(r.ref);
212
+ const item = searchIndex._reportSet.getItemById(r.ref);
179
213
  if (filters.every(f => f(s, item))) {
180
214
  results.push({
181
215
  "fact": item,