drf-to-mkdoc 0.3.1__tar.gz → 0.3.2__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 drf-to-mkdoc might be problematic. Click here for more details.

Files changed (136) hide show
  1. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/PKG-INFO +1 -1
  2. drf_to_mkdoc-0.3.2/drf_to_mkdoc/static/drf-to-mkdoc/javascripts/settings-modal.js +361 -0
  3. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/form-manager.js +136 -17
  4. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/filter-section.css +10 -5
  5. drf_to_mkdoc-0.3.2/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/settings-modal.css +555 -0
  6. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/endpoints/list/base.html +1 -0
  7. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/endpoints/list/filter_section.html +3 -1
  8. drf_to_mkdoc-0.3.2/drf_to_mkdoc/templates/endpoints/list/settings_modal.html +138 -0
  9. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/try-out/form.html +1 -1
  10. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/endpoint_list_generator.py +2 -0
  11. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc.egg-info/PKG-INFO +1 -1
  12. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc.egg-info/SOURCES.txt +3 -0
  13. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/.github/workflows/publish.yaml +0 -0
  14. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/.pre-commit-config.yaml +0 -0
  15. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/CONTRIBUTING.md +0 -0
  16. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/LICENSE +0 -0
  17. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/MANIFEST.in +0 -0
  18. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/README.md +0 -0
  19. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/conf/__init__.py +0 -0
  20. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/conf/defaults.py +0 -0
  21. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/conf/settings.py +0 -0
  22. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/docs/customizing_endpoints.md +0 -0
  23. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/docs/mkdocs.yml +0 -0
  24. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/docs/serving_docs_with_django.md +0 -0
  25. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/docs/serving_mkdocs_with_django.md +0 -0
  26. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/__init__.py +0 -0
  27. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/apps.py +0 -0
  28. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/conf/__init__.py +0 -0
  29. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/conf/defaults.py +0 -0
  30. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/conf/settings.py +0 -0
  31. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/management/__init__.py +0 -0
  32. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/management/commands/__init__.py +0 -0
  33. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/management/commands/build_docs.py +0 -0
  34. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/management/commands/build_endpoint_docs.py +0 -0
  35. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/management/commands/build_model_docs.py +0 -0
  36. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/management/commands/extract_model_data.py +0 -0
  37. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/management/commands/generate_doc_json.py +0 -0
  38. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/management/commands/update_doc_schema.py +0 -0
  39. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/javascripts/endpoints-filter.js +0 -0
  40. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/javascripts/field-sections-loader.js +0 -0
  41. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/javascripts/query-parameters-loader.js +0 -0
  42. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/field-extractor.js +0 -0
  43. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/main.js +0 -0
  44. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/modal.js +0 -0
  45. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/query-parameters-extractor.js +0 -0
  46. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/request-executor.js +0 -0
  47. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/response-modal.js +0 -0
  48. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/suggestions.js +0 -0
  49. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out/tabs.js +0 -0
  50. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/accessibility.css +0 -0
  51. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/animations.css +0 -0
  52. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/badges.css +0 -0
  53. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/base.css +0 -0
  54. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/endpoint-content.css +0 -0
  55. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/endpoints-grid.css +0 -0
  56. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/fixes.css +0 -0
  57. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/layout.css +0 -0
  58. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/loading.css +0 -0
  59. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/responsive.css +0 -0
  60. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/sections.css +0 -0
  61. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/stats.css +0 -0
  62. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/tags.css +0 -0
  63. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/theme-toggle.css +0 -0
  64. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/try-out/fab.css +0 -0
  65. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/try-out/response.css +0 -0
  66. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/try-out/variables.css +0 -0
  67. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/variables.css +0 -0
  68. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/field-sections.css +0 -0
  69. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/animations.css +0 -0
  70. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/base.css +0 -0
  71. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/model-cards.css +0 -0
  72. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/model-tables.css +0 -0
  73. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/responsive.css +0 -0
  74. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/variables.css +0 -0
  75. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/buttons.css +0 -0
  76. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/fab.css +0 -0
  77. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/form.css +0 -0
  78. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/key-value.css +0 -0
  79. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/main.css +0 -0
  80. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/modal.css +0 -0
  81. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/response.css +0 -0
  82. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/tabs.css +0 -0
  83. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/try-out/variables.css +0 -0
  84. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/endpoints/detail/base.html +0 -0
  85. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/endpoints/detail/path_parameters.html +0 -0
  86. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/endpoints/detail/query_parameters.html +0 -0
  87. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/endpoints/detail/request_body.html +0 -0
  88. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/endpoints/detail/responses.html +0 -0
  89. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/endpoints/list/endpoint_card.html +0 -0
  90. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/endpoints/list/filters/app.html +0 -0
  91. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/endpoints/list/filters/method.html +0 -0
  92. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/endpoints/list/filters/path.html +0 -0
  93. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/endpoints/list/filters/search.html +0 -0
  94. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/er_diagrams/app.html +0 -0
  95. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/er_diagrams/index.html +0 -0
  96. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/er_diagrams/main.html +0 -0
  97. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/model_detail/base.html +0 -0
  98. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/model_detail/choices.html +0 -0
  99. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/model_detail/fields.html +0 -0
  100. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/model_detail/meta.html +0 -0
  101. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/model_detail/methods.html +0 -0
  102. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/model_detail/relationships.html +0 -0
  103. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/models_index.html +0 -0
  104. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/try-out/fab.html +0 -0
  105. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/try-out/main.html +0 -0
  106. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/try-out/modal.html +0 -0
  107. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templates/try-out/response-modal.html +0 -0
  108. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/templatetags/custom_filters.py +0 -0
  109. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/__init__.py +0 -0
  110. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/ai_tools/__init__.py +0 -0
  111. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/ai_tools/enums.py +0 -0
  112. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/ai_tools/exceptions.py +0 -0
  113. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/ai_tools/providers/__init__.py +0 -0
  114. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/ai_tools/providers/base_provider.py +0 -0
  115. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/ai_tools/providers/gemini_provider.py +0 -0
  116. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/ai_tools/types.py +0 -0
  117. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/commons/__init__.py +0 -0
  118. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/commons/code_extractor.py +0 -0
  119. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/commons/file_utils.py +0 -0
  120. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/commons/model_utils.py +0 -0
  121. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/commons/operation_utils.py +0 -0
  122. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/commons/path_utils.py +0 -0
  123. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/commons/schema_utils.py +0 -0
  124. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/endpoint_detail_generator.py +0 -0
  125. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/er_diagram_generator.py +0 -0
  126. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/extractors/__init__.py +0 -0
  127. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/extractors/query_parameter_extractors.py +0 -0
  128. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/model_detail_generator.py +0 -0
  129. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/model_list_generator.py +0 -0
  130. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc/utils/schema.py +0 -0
  131. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc.egg-info/dependency_links.txt +0 -0
  132. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc.egg-info/requires.txt +0 -0
  133. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/drf_to_mkdoc.egg-info/top_level.txt +0 -0
  134. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/pyproject.toml +0 -0
  135. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/setup.cfg +0 -0
  136. {drf_to_mkdoc-0.3.1 → drf_to_mkdoc-0.3.2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drf-to-mkdoc
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: Generate Markdown API docs from Django/DRF OpenAPI schema for MkDocs
5
5
  Author-email: Hossein Shayesteh <shayestehhs1@gmail.com>
6
6
  Maintainer-email: Hossein Shayesteh <shayestehhs1@gmail.com>
@@ -0,0 +1,361 @@
1
+ // Settings Modal Management
2
+ const SettingsManager = {
3
+ storageKey: 'drfToMkdocSettings',
4
+ headersStorageKey: 'drfToMkdocHeaders', // Separate key for headers
5
+ usePersistentHeaders: false, // Track whether user opted in to persistent storage
6
+
7
+ // Open settings modal
8
+ openSettingsModal: function() {
9
+ const modal = document.getElementById('settingsModal');
10
+ if (!modal) return;
11
+
12
+ // Load and populate current settings
13
+ this.loadSettings();
14
+
15
+ // Show modal
16
+ modal.classList.add('show');
17
+ document.body.style.overflow = 'hidden';
18
+
19
+ // Focus on first input after modal transition
20
+ const firstInput = modal.querySelector('#settingsHost');
21
+ if (firstInput) {
22
+ // Wait for CSS transition to complete before focusing
23
+ modal.addEventListener('transitionend', () => firstInput.focus(), { once: true });
24
+ }
25
+ },
26
+
27
+ // Close settings modal
28
+ closeSettingsModal: function() {
29
+ const modal = document.getElementById('settingsModal');
30
+ if (!modal) return;
31
+
32
+ modal.classList.remove('show');
33
+ document.body.style.overflow = '';
34
+ },
35
+
36
+ // Get current browser host
37
+ getDefaultHost: function() {
38
+ return window.location.origin;
39
+ },
40
+
41
+ // Helper to load host and headers from storage
42
+ _loadStoredSettings: function() {
43
+ // Load host from localStorage (non-sensitive)
44
+ let host = this.getDefaultHost();
45
+ let usePersistentHeaders = false;
46
+
47
+ try {
48
+ const savedHost = localStorage.getItem(this.storageKey);
49
+ if (savedHost) {
50
+ const parsed = JSON.parse(savedHost);
51
+ host = parsed.host || this.getDefaultHost();
52
+ usePersistentHeaders = parsed.persistHeaders === true;
53
+ this.usePersistentHeaders = usePersistentHeaders;
54
+ }
55
+ } catch (e) {
56
+ console.warn('Failed to parse saved host settings:', e);
57
+ }
58
+
59
+ // Load headers from sessionStorage by default (sensitive)
60
+ // Fall back to localStorage if persistHeaders was enabled
61
+ let headers = {};
62
+ try {
63
+ const sessionHeaders = sessionStorage.getItem(this.headersStorageKey);
64
+ if (sessionHeaders) {
65
+ headers = JSON.parse(sessionHeaders);
66
+ }
67
+
68
+ // Also check localStorage if persistHeaders was enabled
69
+ if (usePersistentHeaders) {
70
+ const saved = localStorage.getItem(this.storageKey);
71
+ if (saved) {
72
+ const parsed = JSON.parse(saved);
73
+ if (parsed.headers) {
74
+ // Merge: sessionStorage takes precedence, then localStorage
75
+ headers = { ...parsed.headers, ...headers };
76
+ }
77
+ }
78
+ }
79
+ } catch (e) {
80
+ console.warn('Failed to parse saved headers:', e);
81
+ }
82
+
83
+ return {
84
+ host: host,
85
+ headers: headers,
86
+ usePersistentHeaders: usePersistentHeaders
87
+ };
88
+ },
89
+
90
+ // Load settings from storage and populate UI
91
+ loadSettings: function() {
92
+ // Load stored settings using helper
93
+ const settings = this._loadStoredSettings();
94
+
95
+ // Populate host input
96
+ const hostInput = document.getElementById('settingsHost');
97
+ if (hostInput) {
98
+ hostInput.value = settings.host;
99
+ }
100
+
101
+ // Populate persist headers checkbox
102
+ const persistCheckbox = document.getElementById('persistHeaders');
103
+ if (persistCheckbox) {
104
+ persistCheckbox.checked = settings.usePersistentHeaders;
105
+ }
106
+
107
+ // Clear all header items
108
+ const headerList = document.querySelector('#settingsHeaders .header-list');
109
+ if (headerList) {
110
+ headerList.innerHTML = '';
111
+
112
+ // Add saved headers or one empty item
113
+ const headerEntries = Object.entries(settings.headers);
114
+ if (headerEntries.length > 0) {
115
+ headerEntries.forEach(([name, value]) => {
116
+ const headerItem = this.createHeaderItem(name, value);
117
+ headerList.appendChild(headerItem);
118
+ });
119
+ } else {
120
+ // Add one empty header item
121
+ headerList.appendChild(this.createHeaderItem('', ''));
122
+ }
123
+ }
124
+
125
+ return settings;
126
+ },
127
+
128
+ // Save settings to storage
129
+ saveSettings: function() {
130
+ const hostInput = document.getElementById('settingsHost');
131
+ const host = hostInput?.value.trim() || this.getDefaultHost();
132
+
133
+ // Get persist headers preference
134
+ const persistCheckbox = document.getElementById('persistHeaders');
135
+ this.usePersistentHeaders = persistCheckbox?.checked === true;
136
+
137
+ // Collect headers
138
+ const headers = {};
139
+ const headerItems = document.querySelectorAll('#settingsHeaders .header-item');
140
+ headerItems.forEach(item => {
141
+ const nameInput = item.querySelector('.name-input');
142
+ const valueInput = item.querySelector('.value-input');
143
+ const name = nameInput?.value.trim();
144
+ const value = valueInput?.value.trim();
145
+
146
+ if (name && value) {
147
+ headers[name] = value;
148
+ }
149
+ });
150
+
151
+ try {
152
+ // Save host to localStorage (non-sensitive)
153
+ const hostSettings = {
154
+ host: host,
155
+ persistHeaders: this.usePersistentHeaders
156
+ };
157
+ localStorage.setItem(this.storageKey, JSON.stringify(hostSettings));
158
+
159
+ // Save headers based on user preference
160
+ if (this.usePersistentHeaders) {
161
+ // Save to localStorage (less secure, but user opted in)
162
+ const allSettings = {
163
+ ...hostSettings,
164
+ headers: headers
165
+ };
166
+ localStorage.setItem(this.storageKey, JSON.stringify(allSettings));
167
+ // Also save to sessionStorage for immediate use
168
+ sessionStorage.setItem(this.headersStorageKey, JSON.stringify(headers));
169
+ } else {
170
+ // Save to sessionStorage only (more secure, cleared on tab close)
171
+ sessionStorage.setItem(this.headersStorageKey, JSON.stringify(headers));
172
+ // Remove headers from localStorage if they were there
173
+ const existing = localStorage.getItem(this.storageKey);
174
+ if (existing) {
175
+ try {
176
+ const parsed = JSON.parse(existing);
177
+ delete parsed.headers;
178
+ localStorage.setItem(this.storageKey, JSON.stringify({
179
+ ...parsed,
180
+ ...hostSettings
181
+ }));
182
+ } catch (e) {
183
+ // If parsing fails, just save host settings
184
+ localStorage.setItem(this.storageKey, JSON.stringify(hostSettings));
185
+ }
186
+ }
187
+ }
188
+
189
+ // Close modal
190
+ this.closeSettingsModal();
191
+
192
+ // Show success feedback
193
+ const storageType = this.usePersistentHeaders ? 'localStorage' : 'sessionStorage';
194
+ this.showToast(`Settings saved (headers in ${storageType})`, 'success');
195
+
196
+ // Reload settings in try-out form if it exists
197
+ if (window.FormManager && typeof window.FormManager.loadSettings === 'function') {
198
+ window.FormManager.loadSettings();
199
+ }
200
+ } catch (e) {
201
+ console.error('Failed to save settings:', e);
202
+ this.showToast('Failed to save settings', 'error');
203
+ }
204
+ },
205
+
206
+ // Get saved settings (reads from both storage locations)
207
+ getSettings: function() {
208
+ // Use helper method to load settings
209
+ const settings = this._loadStoredSettings();
210
+ return {
211
+ host: settings.host,
212
+ headers: settings.headers
213
+ };
214
+ },
215
+
216
+ // Add header field
217
+ addHeaderField: function(name = '', value = '') {
218
+ const headerList = document.querySelector('#settingsHeaders .header-list');
219
+ if (!headerList) return;
220
+
221
+ const headerItem = this.createHeaderItem(name, value);
222
+ headerList.appendChild(headerItem);
223
+
224
+ // Focus on the first input
225
+ const nameInput = headerItem.querySelector('.name-input');
226
+ if (nameInput) {
227
+ nameInput.focus();
228
+ }
229
+ },
230
+
231
+ // Create header item element (using DOM creation to prevent XSS)
232
+ createHeaderItem: function(name = '', value = '') {
233
+ const headerItem = document.createElement('div');
234
+ headerItem.className = 'header-item';
235
+
236
+ // Create header-inputs container
237
+ const headerInputs = document.createElement('div');
238
+ headerInputs.className = 'header-inputs';
239
+
240
+ // Create name input
241
+ const nameInput = document.createElement('input');
242
+ nameInput.type = 'text';
243
+ nameInput.className = 'modern-input name-input';
244
+ nameInput.placeholder = 'Header name';
245
+ nameInput.setAttribute('list', 'settingsHeaderSuggestions');
246
+ nameInput.value = name;
247
+
248
+ // Create value input
249
+ const valueInput = document.createElement('input');
250
+ valueInput.type = 'text';
251
+ valueInput.className = 'modern-input value-input';
252
+ valueInput.placeholder = 'Header value';
253
+ valueInput.value = value;
254
+
255
+ // Create remove button
256
+ const removeBtn = document.createElement('button');
257
+ removeBtn.className = 'remove-btn';
258
+ removeBtn.setAttribute('aria-label', 'Remove header');
259
+
260
+ // Create icon span
261
+ const iconSpan = document.createElement('span');
262
+ iconSpan.className = 'icon';
263
+ iconSpan.textContent = '✕';
264
+
265
+ // Append icon to button
266
+ removeBtn.appendChild(iconSpan);
267
+
268
+ // Attach click handler with addEventListener
269
+ removeBtn.addEventListener('click', () => {
270
+ SettingsManager.removeHeaderField(removeBtn);
271
+ });
272
+
273
+ // Append inputs and button to header-inputs
274
+ headerInputs.appendChild(nameInput);
275
+ headerInputs.appendChild(valueInput);
276
+ headerInputs.appendChild(removeBtn);
277
+
278
+ // Append header-inputs to header-item
279
+ headerItem.appendChild(headerInputs);
280
+
281
+ return headerItem;
282
+ },
283
+
284
+ // Remove header field
285
+ removeHeaderField: function(button) {
286
+ const headerItem = button.closest('.header-item');
287
+ if (headerItem) {
288
+ const headerList = document.querySelector('#settingsHeaders .header-list');
289
+ const remainingItems = headerList?.querySelectorAll('.header-item') || [];
290
+
291
+ // Don't allow removing if it's the last item
292
+ if (remainingItems.length > 1) {
293
+ headerItem.remove();
294
+ } else {
295
+ // If it's the last item, just clear the inputs
296
+ const nameInput = headerItem.querySelector('.name-input');
297
+ const valueInput = headerItem.querySelector('.value-input');
298
+ if (nameInput) nameInput.value = '';
299
+ if (valueInput) valueInput.value = '';
300
+ }
301
+ }
302
+ },
303
+
304
+ // Show toast notification
305
+ showToast: function(message, type = 'success') {
306
+ // Create or get toast element
307
+ let toast = document.getElementById('settingsToast');
308
+ if (!toast) {
309
+ toast = document.createElement('div');
310
+ toast.id = 'settingsToast';
311
+ toast.className = 'settings-toast';
312
+ document.body.appendChild(toast);
313
+ }
314
+
315
+ toast.textContent = message;
316
+ toast.className = `settings-toast toast-${type}`;
317
+ toast.classList.add('show');
318
+
319
+ setTimeout(() => {
320
+ toast.classList.remove('show');
321
+ }, 3000);
322
+ },
323
+
324
+ // Initialize
325
+ init: function() {
326
+ // Close modal on overlay click
327
+ const modal = document.getElementById('settingsModal');
328
+ if (modal) {
329
+ const overlay = modal.querySelector('.modal-overlay');
330
+ if (overlay) {
331
+ overlay.addEventListener('click', (e) => {
332
+ if (e.target === overlay) {
333
+ this.closeSettingsModal();
334
+ }
335
+ });
336
+ }
337
+
338
+ // Close modal on Escape key (with stored handler to prevent duplicates)
339
+ if (!this._onKeydown) {
340
+ this._onKeydown = function(e) {
341
+ if (e.key === 'Escape' && modal && modal.classList.contains('show')) {
342
+ SettingsManager.closeSettingsModal();
343
+ }
344
+ }.bind(this);
345
+ document.addEventListener('keydown', this._onKeydown);
346
+ }
347
+ }
348
+ }
349
+ };
350
+
351
+ // Initialize on DOM load
352
+ document.addEventListener('DOMContentLoaded', function() {
353
+ SettingsManager.init();
354
+ });
355
+
356
+ // Global functions for onclick handlers
357
+ window.openSettingsModal = () => SettingsManager.openSettingsModal();
358
+ window.closeSettingsModal = () => SettingsManager.closeSettingsModal();
359
+
360
+ // Export for global access
361
+ window.SettingsManager = SettingsManager;
@@ -5,6 +5,113 @@ const FormManager = {
5
5
  this.setupEventListeners();
6
6
  this.setupFormValidation();
7
7
  this.initializeRequestBody();
8
+ this.loadSettings();
9
+ },
10
+
11
+ // Load settings and pre-fill form
12
+ loadSettings: function() {
13
+ // Get saved settings if available - try SettingsManager first, then storage as fallback
14
+ let settings = { host: null, headers: {} };
15
+
16
+ if (window.SettingsManager) {
17
+ settings = window.SettingsManager.getSettings();
18
+ } else {
19
+ // Fallback: read from storage (host from localStorage, headers from sessionStorage)
20
+ try {
21
+ // Get host from localStorage
22
+ const savedHost = localStorage.getItem('drfToMkdocSettings');
23
+ if (savedHost) {
24
+ const parsed = JSON.parse(savedHost);
25
+ settings.host = parsed.host || null;
26
+ }
27
+
28
+ // Get headers from sessionStorage (secure by default)
29
+ const savedHeaders = sessionStorage.getItem('drfToMkdocHeaders');
30
+ if (savedHeaders) {
31
+ settings.headers = JSON.parse(savedHeaders);
32
+ } else {
33
+ // Fallback: check localStorage if persistHeaders was enabled
34
+ if (savedHost) {
35
+ const parsed = JSON.parse(savedHost);
36
+ if (parsed.persistHeaders === true && parsed.headers) {
37
+ settings.headers = parsed.headers;
38
+ }
39
+ }
40
+ }
41
+ } catch (e) {
42
+ console.warn('Failed to parse settings from storage:', e);
43
+ }
44
+ }
45
+
46
+ // Set host in baseUrl input
47
+ const baseUrlInput = document.getElementById('baseUrl');
48
+ if (baseUrlInput) {
49
+ // Priority: settings.host > browser origin > localhost:8000
50
+ if (settings.host && settings.host.trim()) {
51
+ let hostValue = settings.host.trim();
52
+ // Ensure host has protocol (add https:// if missing for secure default)
53
+ if (!hostValue.match(/^https?:\/\//)) {
54
+ hostValue = 'https://' + hostValue;
55
+ }
56
+ baseUrlInput.value = hostValue;
57
+ } else {
58
+ const browserOrigin = window.location.origin;
59
+ if (browserOrigin) {
60
+ baseUrlInput.value = browserOrigin;
61
+ } else {
62
+ baseUrlInput.value = 'http://localhost:8000';
63
+ }
64
+ }
65
+ }
66
+
67
+ // Add headers from settings - update existing ones or add new ones
68
+ if (settings.headers && Object.keys(settings.headers).length > 0) {
69
+ const headerList = document.querySelector('#requestHeaders .header-list');
70
+ if (headerList) {
71
+ // Create a map of existing headers by name (case-insensitive)
72
+ const existingHeadersMap = new Map();
73
+ headerList.querySelectorAll('.header-item').forEach(item => {
74
+ const nameInput = item.querySelector('.name-input');
75
+ const valueInput = item.querySelector('.value-input');
76
+ if (nameInput && nameInput.value.trim()) {
77
+ const headerName = nameInput.value.trim();
78
+ existingHeadersMap.set(headerName.toLowerCase(), {
79
+ item: item,
80
+ nameInput: nameInput,
81
+ valueInput: valueInput
82
+ });
83
+ }
84
+ });
85
+
86
+ // Process headers from settings
87
+ Object.entries(settings.headers).forEach(([name, value]) => {
88
+ if (!name.trim() || !value || !String(value).trim()) {
89
+ return; // Skip empty names or values
90
+ }
91
+
92
+ const normalizedName = name.trim().toLowerCase();
93
+ const headerValue = String(value).trim();
94
+
95
+ // Check if header already exists (case-insensitive)
96
+ const existing = existingHeadersMap.get(normalizedName);
97
+
98
+ if (existing) {
99
+ // Update existing header value
100
+ if (existing.valueInput) {
101
+ existing.valueInput.value = headerValue;
102
+ }
103
+ } else {
104
+ // Add new header item
105
+ const headerItem = this.createHeaderItem();
106
+ const nameInput = headerItem.querySelector('.name-input');
107
+ const valueInput = headerItem.querySelector('.value-input');
108
+ if (nameInput) nameInput.value = name.trim();
109
+ if (valueInput) valueInput.value = headerValue;
110
+ headerList.appendChild(headerItem);
111
+ }
112
+ });
113
+ }
114
+ }
8
115
  },
9
116
 
10
117
  initializeRequestBody: function() {
@@ -203,24 +310,36 @@ const FormManager = {
203
310
  const headerItem = document.createElement('div');
204
311
  headerItem.className = 'header-item';
205
312
 
206
- headerItem.innerHTML = `
207
- <div class="header-inputs">
208
- <input type="text"
209
- class="modern-input name-input"
210
- placeholder="Header name"
211
- list="headerSuggestions">
212
- <input type="text"
213
- class="modern-input value-input"
214
- placeholder="Header value">
215
- <button class="remove-btn"
216
- aria-label="Remove header">
217
- <span class="icon">✕</span>
218
- </button>
219
- </div>
220
- `;
313
+ const headerInputs = document.createElement('div');
314
+ headerInputs.className = 'header-inputs';
315
+
316
+ const nameInput = document.createElement('input');
317
+ nameInput.type = 'text';
318
+ nameInput.className = 'modern-input name-input';
319
+ nameInput.placeholder = 'Header name';
320
+ nameInput.setAttribute('list', 'headerSuggestions');
321
+
322
+ const valueInput = document.createElement('input');
323
+ valueInput.type = 'text';
324
+ valueInput.className = 'modern-input value-input';
325
+ valueInput.placeholder = 'Header value';
326
+
327
+ const removeBtn = document.createElement('button');
328
+ removeBtn.className = 'remove-btn';
329
+ removeBtn.setAttribute('aria-label', 'Remove header');
330
+
331
+ const iconSpan = document.createElement('span');
332
+ iconSpan.className = 'icon';
333
+ iconSpan.textContent = '✕';
334
+
335
+ removeBtn.appendChild(iconSpan);
336
+
337
+ headerInputs.appendChild(nameInput);
338
+ headerInputs.appendChild(valueInput);
339
+ headerInputs.appendChild(removeBtn);
340
+
341
+ headerItem.appendChild(headerInputs);
221
342
 
222
- // Attach the removal handler programmatically
223
- const removeBtn = headerItem.querySelector('.remove-btn');
224
343
  removeBtn.addEventListener('click', (e) => FormManager.removeKvItem(e.currentTarget));
225
344
 
226
345
  return headerItem;
@@ -99,7 +99,7 @@
99
99
  margin-top: 20px;
100
100
  }
101
101
 
102
- .filter-apply,
102
+ .filter-settings,
103
103
  .filter-clear {
104
104
  padding: 10px 20px;
105
105
  border-radius: 8px;
@@ -112,20 +112,25 @@
112
112
  display: inline-flex;
113
113
  align-items: center;
114
114
  justify-content: center;
115
+ gap: 6px;
115
116
  }
116
117
 
117
- .filter-apply {
118
+ .filter-settings {
118
119
  background: var(--accent-primary);
119
120
  color: #fff;
120
121
  }
121
122
 
123
+ .filter-settings .icon {
124
+ font-size: 16px;
125
+ }
126
+
122
127
  .filter-clear {
123
128
  background: transparent;
124
129
  color: var(--text-secondary);
125
130
  border: 1px solid var(--border-color);
126
131
  }
127
132
 
128
- .filter-apply:hover {
133
+ .filter-settings:hover {
129
134
  background: var(--accent-secondary);
130
135
  transform: translateY(-1px);
131
136
  }
@@ -136,7 +141,7 @@
136
141
  background: rgba(59, 130, 246, 0.05);
137
142
  }
138
143
 
139
- .filter-apply:active,
144
+ .filter-settings:active,
140
145
  .filter-clear:active {
141
146
  transform: translateY(0);
142
147
  }
@@ -169,7 +174,7 @@
169
174
  gap: 8px;
170
175
  }
171
176
 
172
- .filter-apply,
177
+ .filter-settings,
173
178
  .filter-clear {
174
179
  width: 100%;
175
180
  }