ixbrl-viewer 1.4.9__tar.gz → 1.4.11__tar.gz

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.

Potentially problematic release.


This version of ixbrl-viewer might be problematic. Click here for more details.

Files changed (233) hide show
  1. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.github/workflows/node-tests.yml +1 -1
  2. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.github/workflows/npm-package.yml +6 -6
  3. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.github/workflows/puppeteer.yml +3 -3
  4. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.github/workflows/python-package.yml +6 -6
  5. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.github/workflows/python-tests.yml +7 -4
  6. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.gitignore +5 -0
  7. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/ARCHITECTURE.md +3 -2
  8. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/PKG-INFO +8 -4
  9. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/_version.py +2 -2
  10. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/iXBRLViewer.py +47 -52
  11. ixbrl-viewer-1.4.11/iXBRLViewerPlugin/viewer/dist/ixbrlviewer.js +2 -0
  12. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/html/inspector.html +2 -2
  13. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/i18n/en/translation.json +1 -1
  14. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/i18n/es/translation.json +1 -1
  15. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/aspect.js +1 -1
  16. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/aspect.test.js +2 -1
  17. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/chart.js +1 -1
  18. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/chart.test.js +2 -2
  19. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/concept.test.js +2 -2
  20. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/fact.js +11 -24
  21. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/fact.test.js +6 -11
  22. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/factset.test.js +2 -4
  23. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/inspector.js +3 -3
  24. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/inspector.test.js +2 -3
  25. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/outline.test.js +3 -3
  26. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/report.js +7 -3
  27. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/report.test.js +2 -1
  28. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/reportset.test.js +3 -3
  29. ixbrl-viewer-1.4.11/iXBRLViewerPlugin/viewer/src/js/unit.js +54 -0
  30. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/unit.test.js +17 -24
  31. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/util.js +21 -0
  32. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/viewer.js +58 -53
  33. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/ixbrl_viewer.egg-info/PKG-INFO +8 -4
  34. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/ixbrl_viewer.egg-info/SOURCES.txt +3 -0
  35. ixbrl-viewer-1.4.11/ixbrl_viewer.egg-info/requires.txt +12 -0
  36. ixbrl-viewer-1.4.11/jest.config.json +3 -0
  37. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/package-lock.json +311 -490
  38. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/package.json +4 -4
  39. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/pyproject.toml +39 -3
  40. ixbrl-viewer-1.4.11/setup.cfg +31 -0
  41. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/unit_tests/iXBRLViewerPlugin/test_iXBRLViewer.py +17 -12
  42. ixbrl-viewer-1.4.11/tox.ini +27 -0
  43. ixbrl-viewer-1.4.9/iXBRLViewerPlugin/viewer/dist/ixbrlviewer.js +0 -2
  44. ixbrl-viewer-1.4.9/iXBRLViewerPlugin/viewer/src/js/unit.js +0 -72
  45. ixbrl-viewer-1.4.9/ixbrl_viewer.egg-info/requires.txt +0 -7
  46. ixbrl-viewer-1.4.9/setup.cfg +0 -4
  47. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.babelrc +0 -0
  48. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  49. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  50. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.github/ISSUE_TEMPLATE/questions.yml +0 -0
  51. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.github/ISSUE_TEMPLATE/request.yml +0 -0
  52. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  53. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.github/dependabot.yml +0 -0
  54. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.github/release-drafter.yml +0 -0
  55. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.github/workflows/release-drafter.yml +0 -0
  56. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/.github/workflows/release.yml +0 -0
  57. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/CODEOWNERS +0 -0
  58. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/COPYRIGHT.md +0 -0
  59. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/LICENSE +0 -0
  60. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/MANIFEST.in +0 -0
  61. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/Makefile +0 -0
  62. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/NOTICE +0 -0
  63. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/PLUGINS.md +0 -0
  64. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/README.md +0 -0
  65. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/README.md +0 -0
  66. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/clorox-2022-10-K-ixbrl-viewer/clx-20220630.xsd +0 -0
  67. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/clorox-2022-10-K-ixbrl-viewer/clx-20220630_cal.xml +0 -0
  68. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/clorox-2022-10-K-ixbrl-viewer/clx-20220630_d2.htm +0 -0
  69. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/clorox-2022-10-K-ixbrl-viewer/clx-20220630_def.xml +0 -0
  70. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/clorox-2022-10-K-ixbrl-viewer/clx-20220630_g1.jpg +0 -0
  71. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/clorox-2022-10-K-ixbrl-viewer/clx-20220630_lab.xml +0 -0
  72. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/clorox-2022-10-K-ixbrl-viewer/clx-20220630_pre.xml +0 -0
  73. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/clorox-2022-10-K-ixbrl-viewer/fy22clxex21subsidiaries.htm +0 -0
  74. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/clorox-2022-10-K-ixbrl-viewer/fy22clxex23accountingfirmc.htm +0 -0
  75. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/clorox-2022-10-K-ixbrl-viewer/fy22clxex311ceocertificati.htm +0 -0
  76. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/clorox-2022-10-K-ixbrl-viewer/fy22clxex312cfocertificati.htm +0 -0
  77. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/clorox-2022-10-K-ixbrl-viewer/fy22clxex32ceocfocertifica.htm +0 -0
  78. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/clorox-2022-10-K-ixbrl-viewer/fy22clxex992reconofeconomi.htm +0 -0
  79. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/clorox-2022-10-K-ixbrl-viewer/ixbrl-viewer.htm +0 -0
  80. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/example_plugin/README.md +0 -0
  81. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/example_plugin/example-plugin.gif +0 -0
  82. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/example_plugin/extended-viewer.js +0 -0
  83. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/example_plugin/index.js +0 -0
  84. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/example_plugin/package-lock.json +0 -0
  85. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/example_plugin/package.json +0 -0
  86. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/example_plugin/webpack.config.js +0 -0
  87. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/ixbrl-viewer-demo.gif +0 -0
  88. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/review-mode.png +0 -0
  89. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/workiva-january-2023-8-k-ixbrl-viewer/exhibit31abylawsofworkivai.htm +0 -0
  90. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/workiva-january-2023-8-k-ixbrl-viewer/exhibit31bbylawsofworkivai.htm +0 -0
  91. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/workiva-january-2023-8-k-ixbrl-viewer/ixbrl-viewer.htm +0 -0
  92. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/workiva-january-2023-8-k-ixbrl-viewer/wk-20230109.xsd +0 -0
  93. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/workiva-january-2023-8-k-ixbrl-viewer/wk-20230109_lab.xml +0 -0
  94. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/examples/workiva-january-2023-8-k-ixbrl-viewer/wk-20230109_pre.xml +0 -0
  95. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/__init__.py +0 -0
  96. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/constants.py +0 -0
  97. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/featureConfig.py +0 -0
  98. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/stubviewer.html +0 -0
  99. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/ui.py +0 -0
  100. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/dist/ixbrlviewer.js.LICENSE.txt +0 -0
  101. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/i18next-parser.config.js +0 -0
  102. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/html/fact-details.html +0 -0
  103. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/html/footnote-details.html +0 -0
  104. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/i18n/en/currencies.json +0 -0
  105. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/i18n/en/referenceparts.json +0 -0
  106. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/i18n/es/currencies.json +0 -0
  107. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/i18n/es/referenceparts.json +0 -0
  108. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/arrow-down.svg +0 -0
  109. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/arrow-up.svg +0 -0
  110. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/chevron-down.svg +0 -0
  111. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/chevron-left.svg +0 -0
  112. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/chevron-right.svg +0 -0
  113. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/chevron-up.svg +0 -0
  114. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/clipboard.svg +0 -0
  115. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/close.svg +0 -0
  116. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/cog.svg +0 -0
  117. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/dimension-member.svg +0 -0
  118. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/dimension.svg +0 -0
  119. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/download.svg +0 -0
  120. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/filter.svg +0 -0
  121. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/graph.svg +0 -0
  122. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/member.svg +0 -0
  123. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/outline.svg +0 -0
  124. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/print.svg +0 -0
  125. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/question.svg +0 -0
  126. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/search.svg +0 -0
  127. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/select.svg +0 -0
  128. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/summary.svg +0 -0
  129. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/tag.svg +0 -0
  130. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/text-block.svg +0 -0
  131. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/tick.svg +0 -0
  132. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/icons/warning.svg +0 -0
  133. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/img/arelle.svg +0 -0
  134. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/img/favicon.ico +0 -0
  135. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/img/inline-viewer.png +0 -0
  136. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/img/inline-viewer.svg +0 -0
  137. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/img/powered-by-workiva.png +0 -0
  138. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/img/powered-by-workiva.svg +0 -0
  139. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/accordian.js +0 -0
  140. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/calculations.js +0 -0
  141. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/concept.js +0 -0
  142. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/dialog.js +0 -0
  143. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/docOrderIndex.js +0 -0
  144. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/factset.js +0 -0
  145. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/footnote.js +0 -0
  146. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/identifiers.js +0 -0
  147. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/identifiers.test.js +0 -0
  148. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/index.js +0 -0
  149. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/interact.min.js +0 -0
  150. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/ixbrlviewer.js +0 -0
  151. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/ixbrlviewer.test.js +0 -0
  152. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/ixnode.js +0 -0
  153. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/menu.js +0 -0
  154. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/messagebox.js +0 -0
  155. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/moment-jest.js +0 -0
  156. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/number-matcher-preprocess.test.js +0 -0
  157. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/number-matcher.js +0 -0
  158. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/number-matcher.test.js +0 -0
  159. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/outline.js +0 -0
  160. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/period.js +0 -0
  161. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/period.test.js +0 -0
  162. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/qname.js +0 -0
  163. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/reportset.js +0 -0
  164. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/search.js +0 -0
  165. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/search.test.js +0 -0
  166. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/summary.js +0 -0
  167. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/summary.test.js +0 -0
  168. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/tableExport.js +0 -0
  169. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/test-utils.js +0 -0
  170. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/textblockviewer.js +0 -0
  171. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/util.test.js +0 -0
  172. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/validationreport.js +0 -0
  173. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/js/viewerOptions.js +0 -0
  174. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/accordian.less +0 -0
  175. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/block-list.less +0 -0
  176. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/chart.less +0 -0
  177. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/clearfix.less +0 -0
  178. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/colours.less +0 -0
  179. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/common.less +0 -0
  180. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/components.less +0 -0
  181. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/core.less +0 -0
  182. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/dialog.less +0 -0
  183. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/fonts.less +0 -0
  184. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/form-controls.less +0 -0
  185. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/icons.less.njk +0 -0
  186. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/inspector.less +0 -0
  187. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/loader.less +0 -0
  188. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/menu.less +0 -0
  189. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/summary.less +0 -0
  190. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/tabs.less +0 -0
  191. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/text-block-viewer.less +0 -0
  192. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/text-mixins.less +0 -0
  193. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/validation-report.less +0 -0
  194. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/src/less/viewer.less +0 -0
  195. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/tools/build-font.js +0 -0
  196. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/version.js +0 -0
  197. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/webpack.common.js +0 -0
  198. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/webpack.dev.js +0 -0
  199. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/viewer/webpack.prod.js +0 -0
  200. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/iXBRLViewerPlugin/xhtmlserialize.py +0 -0
  201. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/ixbrl_viewer.egg-info/dependency_links.txt +0 -0
  202. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/ixbrl_viewer.egg-info/entry_points.txt +0 -0
  203. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/ixbrl_viewer.egg-info/top_level.txt +0 -0
  204. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/samples/Makefile +0 -0
  205. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/samples/Makefile-src +0 -0
  206. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/samples/build-viewer.py +0 -0
  207. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/samples/fetch-sample-files.py +0 -0
  208. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/samples/sample-files.list +0 -0
  209. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/samples/src/continuation/continuation.html +0 -0
  210. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/samples/src/ixds-test/document1.html +0 -0
  211. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/samples/src/ixds-test/faurecia.html +0 -0
  212. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/samples/src/ixds-test/valeo.html +0 -0
  213. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/samples/src/scrollable-div/scrollable-div.html +0 -0
  214. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/samples/src/xbrl-invalid-tests/xbrl-invalid-test.html +0 -0
  215. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/__init__.py +0 -0
  216. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/puppeteer/framework/core_elements.js +0 -0
  217. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/puppeteer/framework/page_objects/doc_frame.js +0 -0
  218. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/puppeteer/framework/page_objects/fact_details_panel.js +0 -0
  219. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/puppeteer/framework/page_objects/search_panel.js +0 -0
  220. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/puppeteer/framework/page_objects/toolbar.js +0 -0
  221. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/puppeteer/framework/utils.js +0 -0
  222. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/puppeteer/framework/viewer_page.js +0 -0
  223. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/puppeteer/puppeteer_test_run_via_intellij.jpg +0 -0
  224. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/puppeteer/test_filings/filing_documents_smoke_test.zip +0 -0
  225. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/puppeteer/test_filings/highlights.zip +0 -0
  226. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/puppeteer/tests/fact_properties.test.js +0 -0
  227. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/puppeteer/tests/highlight.test.js +0 -0
  228. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/puppeteer/tests/search.test.js +0 -0
  229. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/puppeteer/tools/generate.sh +0 -0
  230. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/unit_tests/__init__.py +0 -0
  231. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/unit_tests/iXBRLViewerPlugin/__init__.py +0 -0
  232. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/unit_tests/iXBRLViewerPlugin/mock_arelle.py +0 -0
  233. {ixbrl-viewer-1.4.9 → ixbrl-viewer-1.4.11}/tests/unit_tests/iXBRLViewerPlugin/test_xhtmlserialize.py +0 -0
@@ -24,7 +24,7 @@ jobs:
24
24
  runs-on: ${{ matrix.os }}
25
25
  steps:
26
26
  - uses: actions/checkout@v4.1.1
27
- - uses: actions/setup-node@v4.0.0
27
+ - uses: actions/setup-node@v4.0.1
28
28
  with:
29
29
  cache: 'npm'
30
30
  check-latest: true
@@ -27,7 +27,7 @@ jobs:
27
27
  with:
28
28
  fetch-depth: 0 # npm run prod requires tags, sadly this is the only way to get them.
29
29
  - name: Install Node.js
30
- uses: actions/setup-node@v4.0.0
30
+ uses: actions/setup-node@v4.0.1
31
31
  with:
32
32
  cache: 'npm'
33
33
  check-latest: true
@@ -42,13 +42,13 @@ jobs:
42
42
  npm version $(git describe --tags)
43
43
  npm pack
44
44
  - name: Upload ixbrlviewer.js artifact
45
- uses: actions/upload-artifact@v3.1.3
45
+ uses: actions/upload-artifact@v4.0.0
46
46
  with:
47
47
  name: ixbrlviewer.js
48
48
  if-no-files-found: error
49
49
  path: iXBRLViewerPlugin/viewer/dist/ixbrlviewer.js
50
50
  - name: Upload npm artifact
51
- uses: actions/upload-artifact@v3.1.3
51
+ uses: actions/upload-artifact@v4.0.0
52
52
  with:
53
53
  name: npm package
54
54
  if-no-files-found: error
@@ -63,17 +63,17 @@ jobs:
63
63
  if: startsWith(github.ref, 'refs/tags')
64
64
  steps:
65
65
  - name: Install Node.js
66
- uses: actions/setup-node@v4.0.0
66
+ uses: actions/setup-node@v4.0.1
67
67
  with:
68
68
  check-latest: true
69
69
  node-version: ${{ inputs.node_version }}
70
70
  registry-url: 'https://registry.npmjs.org' # Must explicitly set this for NODE_AUTH_TOKEN to work below
71
71
  - name: Download ixbrlviewer.js artifact
72
- uses: actions/download-artifact@v3.0.2
72
+ uses: actions/download-artifact@v4.1.0
73
73
  with:
74
74
  name: ixbrlviewer.js
75
75
  - name: Download npm artifact
76
- uses: actions/download-artifact@v3.0.2
76
+ uses: actions/download-artifact@v4.1.0
77
77
  with:
78
78
  name: npm package
79
79
  - name: Publish with npm
@@ -27,13 +27,13 @@ jobs:
27
27
  - uses: actions/checkout@v4.1.1
28
28
  with:
29
29
  fetch-depth: 0 # npm run prod requires tags, sadly this is the only way to get them.
30
- - uses: actions/setup-node@v4.0.0
30
+ - uses: actions/setup-node@v4.0.1
31
31
  with:
32
32
  cache: 'npm'
33
33
  check-latest: true
34
34
  node-version: ${{ matrix.node-version }}
35
35
  - name: Install Python 3
36
- uses: actions/setup-python@v4.7.1
36
+ uses: actions/setup-python@v5.0.0
37
37
  with:
38
38
  cache: 'pip'
39
39
  cache-dependency-path: '**/pyproject.toml'
@@ -53,7 +53,7 @@ jobs:
53
53
  run: npx http-server . &> tests/puppeteer/artifacts/http_server.log &
54
54
  - name: Run puppeteer tests
55
55
  run: npm run test:puppeteer
56
- - uses: actions/upload-artifact@v3.1.3
56
+ - uses: actions/upload-artifact@v4.0.0
57
57
  if: failure()
58
58
  with:
59
59
  name: ${{ github.run_id }}.${{ github.run_attempt }}_${{ matrix.os }}_${{ matrix.node-version }}_${{ matrix.python-version }}_artifacts
@@ -37,7 +37,7 @@ jobs:
37
37
  with:
38
38
  fetch-depth: 0
39
39
  - name: Install Node.js
40
- uses: actions/setup-node@v4.0.0
40
+ uses: actions/setup-node@v4.0.1
41
41
  with:
42
42
  cache: 'npm'
43
43
  check-latest: true
@@ -47,7 +47,7 @@ jobs:
47
47
  - name: Build ixbrlviewer.js
48
48
  run: make prod
49
49
  - name: Install Python
50
- uses: actions/setup-python@v4.7.1
50
+ uses: actions/setup-python@v5.0.0
51
51
  with:
52
52
  cache: 'pip'
53
53
  cache-dependency-path: '**/pyproject.toml'
@@ -60,13 +60,13 @@ jobs:
60
60
  - name: Build Python package
61
61
  run: python -m build
62
62
  - name: Upload source distribution artifact
63
- uses: actions/upload-artifact@v3.1.3
63
+ uses: actions/upload-artifact@v4.0.0
64
64
  with:
65
65
  name: source distribution
66
66
  if-no-files-found: error
67
67
  path: dist/*.tar.gz
68
68
  - name: Upload wheel artifact
69
- uses: actions/upload-artifact@v3.1.3
69
+ uses: actions/upload-artifact@v4.0.0
70
70
  with:
71
71
  name: wheel
72
72
  if-no-files-found: error
@@ -83,11 +83,11 @@ jobs:
83
83
  - name: Install twine
84
84
  run: pip install -U twine
85
85
  - name: Download source distribution artifact
86
- uses: actions/download-artifact@v3.0.2
86
+ uses: actions/download-artifact@v4.1.0
87
87
  with:
88
88
  name: source distribution
89
89
  - name: Download wheel artifact
90
- uses: actions/download-artifact@v3.0.2
90
+ uses: actions/download-artifact@v4.1.0
91
91
  with:
92
92
  name: wheel
93
93
  - name: Publish package on release
@@ -26,13 +26,16 @@ jobs:
26
26
  steps:
27
27
  - uses: actions/checkout@v4.1.1
28
28
  - name: Install Python 3
29
- uses: actions/setup-python@v4.7.1
29
+ uses: actions/setup-python@v5.0.0
30
30
  with:
31
31
  cache: 'pip'
32
32
  cache-dependency-path: '**/pyproject.toml'
33
33
  check-latest: true
34
34
  python-version: ${{ matrix.python-version }}
35
35
  - name: Install dependencies
36
- run: pip install .[dev]
37
- - name: Test with nose2
38
- run: nose2
36
+ run: |
37
+ python -m pip install --upgrade pip setuptools wheel
38
+ pip install .[arelle,dev]
39
+ pip install tox tox-gh-actions
40
+ - name: Test with tox
41
+ run: tox
@@ -1,5 +1,9 @@
1
1
  .idea
2
+ .mypy_cache
3
+ .pytest_cache
4
+ .tox
2
5
  .vscode
6
+ build
3
7
  node_modules/
4
8
  dist/
5
9
  __pycache__
@@ -8,3 +12,4 @@ iXBRLViewerPlugin/viewer/src/fonts/
8
12
  iXBRLViewerPlugin/viewer/src/less/generated/
9
13
  iXBRLViewerPlugin/_version.py
10
14
  /ixbrl-viewer*.tgz
15
+ ixbrl_viewer.egg-info
@@ -82,8 +82,9 @@ the viewer.
82
82
  ### docSetFiles
83
83
 
84
84
  `docSetFiles` is a list of files in the document set. It is used to load other
85
- documents in the document set into iframes in tabs in the viewer. For single
86
- file, non-stub viewers, this property is not present.
85
+ documents in the document set into iframes in tabs in the viewer.
86
+
87
+ `docSetFiles` is a list of relative URLs.
87
88
 
88
89
  ### targetReports
89
90
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ixbrl-viewer
3
- Version: 1.4.9
3
+ Version: 1.4.11
4
4
  Summary: The Arelle iXBRL Viewer allows iXBRL reports to be viewed interactively in a web browser.
5
5
  Author-email: "arelle.org" <support@arelle.org>
6
6
  License: Apache-2.0
@@ -29,12 +29,16 @@ Requires-Python: >=3.8
29
29
  Description-Content-Type: text/markdown
30
30
  License-File: LICENSE
31
31
  License-File: NOTICE
32
- Requires-Dist: arelle_release==2.*
33
32
  Requires-Dist: lxml==4.*
34
- Requires-Dist: pycountry==22.*
33
+ Requires-Dist: pycountry<24,>=22
34
+ Provides-Extra: arelle
35
+ Requires-Dist: arelle_release==2.*; extra == "arelle"
35
36
  Provides-Extra: dev
37
+ Requires-Dist: flake8==6.1.0; extra == "dev"
38
+ Requires-Dist: lxml-stubs==0.4.0; extra == "dev"
39
+ Requires-Dist: mypy==1.8.0; extra == "dev"
36
40
  Requires-Dist: nose2==0.14.0; extra == "dev"
37
- Requires-Dist: typing-extensions==4.8.0; extra == "dev"
41
+ Requires-Dist: typing-extensions==4.9.0; extra == "dev"
38
42
 
39
43
  # Arelle iXBRL Viewer
40
44
 
@@ -1,4 +1,4 @@
1
1
  # file generated by setuptools_scm
2
2
  # don't change, don't track in version control
3
- __version__ = version = '1.4.9'
4
- __version_tuple__ = version_tuple = (1, 4, 9)
3
+ __version__ = version = '1.4.11'
4
+ __version_tuple__ = version_tuple = (1, 4, 11)
@@ -95,6 +95,7 @@ class IXBRLViewerBuilder:
95
95
  "languages": {},
96
96
  }
97
97
  self.basenameSuffix = basenameSuffix
98
+ self.currentTargetReport = None
98
99
 
99
100
  def enableFeature(self, featureName: str):
100
101
  if featureName in self.taxonomyData["features"]:
@@ -148,21 +149,13 @@ class IXBRLViewerBuilder:
148
149
  if langCode not in self.taxonomyData["languages"]:
149
150
  self.taxonomyData["languages"][langCode] = self.makeLanguageName(langCode)
150
151
 
151
- @property
152
- def currentSourceReportData(self):
153
- return self.taxonomyData["sourceReports"][-1]
154
-
155
- @property
156
- def currentReportData(self):
157
- return self.currentSourceReportData["targetReports"][-1]
158
-
159
152
  def addELR(self, report: ModelXbrl, elr):
160
153
  prefix = self.roleMap.getPrefix(elr)
161
- if self.currentReportData.setdefault("roleDefs",{}).get(prefix, None) is None:
154
+ if self.currentTargetReport.setdefault("roleDefs",{}).get(prefix, None) is None:
162
155
  rts = report.roleTypes.get(elr, [])
163
156
  label = next((rt.definition for rt in rts if rt.definition is not None), None)
164
157
  if label is not None:
165
- self.currentReportData["roleDefs"].setdefault(prefix,{})["en"] = label
158
+ self.currentTargetReport["roleDefs"].setdefault(prefix,{})["en"] = label
166
159
 
167
160
  def addConcept(self, report: ModelXbrl, concept, dimensionType = None):
168
161
  if concept is None:
@@ -170,7 +163,7 @@ class IXBRLViewerBuilder:
170
163
  labelsRelationshipSet = report.relationshipSet(XbrlConst.conceptLabel)
171
164
  labels = labelsRelationshipSet.fromModelObject(concept)
172
165
  conceptName = self.nsmap.qname(concept.qname)
173
- if conceptName not in self.currentReportData["concepts"]:
166
+ if conceptName not in self.currentTargetReport["concepts"]:
174
167
  conceptData = {
175
168
  "labels": { }
176
169
  }
@@ -205,7 +198,7 @@ class IXBRLViewerBuilder:
205
198
  conceptData['td'] = typedDomainName
206
199
  self.addConcept(report, typedDomainElement)
207
200
 
208
- self.currentReportData["concepts"][conceptName] = conceptData
201
+ self.currentTargetReport["concepts"][conceptName] = conceptData
209
202
 
210
203
  def treeWalk(self, rels, item, indent = 0):
211
204
  for r in rels.fromModelObject(item):
@@ -324,7 +317,7 @@ class IXBRLViewerBuilder:
324
317
  if frel.toModelObject is not None:
325
318
  factData.setdefault("fn", []).append(frel.toModelObject.id)
326
319
 
327
- self.currentReportData["facts"][f.id] = factData
320
+ self.currentTargetReport["facts"][f.id] = factData
328
321
  self.addConcept(report, f.concept)
329
322
 
330
323
  def oimUnitString(self, unit):
@@ -348,10 +341,11 @@ class IXBRLViewerBuilder:
348
341
  return "{}/{}".format(numeratorsString, denominatorsString)
349
342
  return numeratorsString
350
343
 
351
- def addViewerToXMLDocument(self, xmlDocument, scriptUrl):
344
+ def addViewerData(self, viewerFile, scriptUrl):
345
+ viewerFile.xmlDocument = deepcopy(viewerFile.xmlDocument)
352
346
  taxonomyDataJSON = self.escapeJSONForScriptTag(json.dumps(self.taxonomyData, indent=1, allow_nan=False))
353
347
 
354
- for child in xmlDocument.getroot():
348
+ for child in viewerFile.xmlDocument.getroot():
355
349
  if child.tag == '{http://www.w3.org/1999/xhtml}body':
356
350
  for body_child in child:
357
351
  if body_child.tag == '{http://www.w3.org/1999/xhtml}script' and body_child.get('type','') == 'application/x.ixbrl-viewer+json':
@@ -383,15 +377,18 @@ class IXBRLViewerBuilder:
383
377
  with open(os.path.join(os.path.dirname(__file__),"stubviewer.html")) as fin:
384
378
  return etree.parse(fin)
385
379
 
386
- def addReport(self):
387
- self.taxonomyData["sourceReports"].append({
388
- "targetReports": [
389
- {
390
- "concepts": {},
391
- "facts": {},
392
- }
393
- ]
394
- })
380
+ def newTargetReport(self):
381
+ return {
382
+ "concepts": {},
383
+ "facts": {},
384
+ }
385
+
386
+ def addSourceReport(self):
387
+ sourceReport = {
388
+ "targetReports": []
389
+ }
390
+ self.taxonomyData["sourceReports"].append(sourceReport)
391
+ return sourceReport
395
392
 
396
393
  def createViewer(self, scriptUrl: str = DEFAULT_VIEWER_PATH, useStubViewer: bool = False, showValidations: bool = True, packageDownloadURL: str = None) -> Optional[iXBRLViewer]:
397
394
  """
@@ -411,59 +408,56 @@ class IXBRLViewerBuilder:
411
408
  self.roleMap.getPrefix(XbrlConst.dimensionDefault, "d-d")
412
409
  self.roleMap.getPrefix(WIDER_NARROWER_ARCROLE, "w-n")
413
410
 
414
- # This is the document that we will embed the JSON taxonomy data in.
415
- # This will be either the first document processed, or the stub document
416
- xmlDocument = None
411
+ sourceReportsByFiles = dict()
412
+
413
+ if useStubViewer:
414
+ iv.addFile(iXBRLViewerFile(DEFAULT_OUTPUT_NAME, self.getStubDocument()))
417
415
 
418
416
  for n, report in enumerate(self.reports):
419
417
  self.footnoteRelationshipSet = ModelRelationshipSet(report, "XBRL-footnotes")
420
- self.addReport()
418
+ self.currentTargetReport = self.newTargetReport()
421
419
  for f in report.facts:
422
420
  self.addFact(report, f)
423
- self.currentReportData["rels"] = self.getRelationships(report)
421
+ self.currentTargetReport["rels"] = self.getRelationships(report)
424
422
 
425
423
  docSetFiles = None
426
424
  report.info("viewer:info", "Creating iXBRL viewer (%d of %d)" % (n+1, len(self.reports)))
427
425
  if report.modelDocument.type == Type.INLINEXBRLDOCUMENTSET:
428
426
  # Sort by object index to preserve order in which files were specified.
429
427
  xmlDocsByFilename = {
430
- os.path.basename(self.outputFilename(doc.filepath)): deepcopy(doc.xmlDocument)
428
+ os.path.basename(self.outputFilename(doc.filepath)): doc.xmlDocument
431
429
  for doc in sorted(report.modelDocument.referencesDocument.keys(), key=lambda x: x.objectIndex)
432
430
  if doc.type == Type.INLINEXBRL
433
431
  }
434
432
  docSetFiles = list(xmlDocsByFilename.keys())
435
433
 
436
- if xmlDocument is None:
437
- if useStubViewer:
438
- xmlDocument = self.getStubDocument()
439
- iv.addFile(iXBRLViewerFile(DEFAULT_OUTPUT_NAME, xmlDocument))
440
- else:
441
- xmlDocument = next(iter(xmlDocsByFilename.values()))
442
-
443
434
  for filename, docSetXMLDoc in xmlDocsByFilename.items():
444
435
  iv.addFile(iXBRLViewerFile(filename, docSetXMLDoc))
445
436
 
446
437
  elif useStubViewer:
447
- if xmlDocument is None:
448
- xmlDocument = self.getStubDocument()
449
- iv.addFile(iXBRLViewerFile(DEFAULT_OUTPUT_NAME, xmlDocument))
450
438
  filename = self.outputFilename(os.path.basename(report.modelDocument.filepath))
451
439
  docSetFiles = [ filename ]
452
440
  iv.addFile(iXBRLViewerFile(filename, report.modelDocument.xmlDocument))
453
441
 
454
442
  else:
443
+ srcFilename = self.outputFilename(os.path.basename(report.modelDocument.filepath))
444
+ docSetFiles = [ srcFilename ]
455
445
  if len(self.reports) == 1:
456
446
  # If there is only a single report, call the output file "xbrlviewer.html"
457
447
  filename = "xbrlviewer.html"
458
448
  else:
459
449
  # Otherwise, preserve filenames
460
- filename = self.outputFilename(os.path.basename(report.modelDocument.filepath))
461
- docSetFiles = [ filename ]
462
- if xmlDocument is None:
463
- xmlDocument = deepcopy(report.modelDocument.xmlDocument)
464
- iv.addFile(iXBRLViewerFile(filename, xmlDocument))
465
- else:
466
- iv.addFile(iXBRLViewerFile(filename, report.modelDocument.xmlDocument))
450
+ filename = srcFilename
451
+ iv.addFile(iXBRLViewerFile(filename, report.modelDocument.xmlDocument))
452
+
453
+ docSetKey = frozenset(docSetFiles)
454
+ sourceReport = sourceReportsByFiles.get(docSetKey)
455
+ if sourceReport is None:
456
+ sourceReport = self.addSourceReport()
457
+ sourceReportsByFiles[docSetKey] = sourceReport
458
+ sourceReport["docSetFiles"] = list(urllib.parse.quote(f) for f in docSetFiles)
459
+
460
+ sourceReport["targetReports"].append(self.currentTargetReport)
467
461
 
468
462
  localDocs = defaultdict(set)
469
463
  for path, doc in report.urlDocs.items():
@@ -482,14 +476,11 @@ class IXBRLViewerBuilder:
482
476
  linkbaseIdentifed = True
483
477
  if not linkbaseIdentifed:
484
478
  localDocs[doc.basename].add(UNRECOGNIZED_LINKBASE_LOCAL_DOCUMENTS_TYPE)
485
- self.currentReportData["localDocs"] = {
479
+ self.currentTargetReport["localDocs"] = {
486
480
  localDoc: sorted(docTypes)
487
481
  for localDoc, docTypes in localDocs.items()
488
482
  }
489
483
 
490
- if docSetFiles is not None:
491
- self.currentSourceReportData["docSetFiles"] = list(urllib.parse.quote(f) for f in docSetFiles)
492
-
493
484
  self.taxonomyData["prefixes"] = self.nsmap.prefixmap
494
485
  self.taxonomyData["roles"] = self.roleMap.prefixmap
495
486
 
@@ -504,7 +495,7 @@ class IXBRLViewerBuilder:
504
495
  iv.addFilingDoc(filingDocZipPath)
505
496
  self.taxonomyData["filingDocuments"] = filingDocZipName
506
497
 
507
- if not self.addViewerToXMLDocument(xmlDocument, scriptUrl):
498
+ if not self.addViewerData(iv.files[0], scriptUrl):
508
499
  return None
509
500
 
510
501
  return iv
@@ -524,9 +515,13 @@ class iXBRLViewer:
524
515
  self.filingDocuments = None
525
516
  # This is an arbitrary ModelXbrl used for logging only
526
517
  self.logger_model = logger_model
518
+ self.filenames = set()
527
519
 
528
520
  def addFile(self, ivf):
521
+ if ivf.filename in self.filenames:
522
+ return
529
523
  self.files.append(ivf)
524
+ self.filenames.add(ivf.filename)
530
525
 
531
526
  def addFilingDoc(self, filingDocuments):
532
527
  self.filingDocuments = filingDocuments