Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions bindings/csharp/FusionFramework/Swagger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -392,18 +392,22 @@ static string UiHtml(SwaggerConfig swagger, string openapiUrl, string? primaryNa
: "null";
var title = JsonSerializer.Serialize(swagger.PageTitle).Trim('"');
var navbarEnabled = swagger.NavbarEnabled;
var versionUrls = swagger.Urls?.Count > 0;
var needsStandalone = navbarEnabled || versionUrls;
var hideUrlCss = navbarEnabled && !swagger.ShowUrlInput
? """
<style>
.swagger-ui .topbar .download-url-input,
.swagger-ui .topbar .download-url-button { display: none !important; }
.swagger-ui .topbar .download-url-wrapper input[type=text],
.swagger-ui .topbar .download-url-wrapper .download-url-button {
display: none !important;
}
</style>
"""
: "";
var standalone = navbarEnabled
var standalone = needsStandalone && File.Exists(Path.Combine(AssetsDirectory(), "swagger-ui-standalone-preset.js"))
? $"""<script src="{AssetUrl(swagger.Path, "swagger-ui-standalone-preset.js")}"></script>"""
: "";
var navbarJs = navbarEnabled ? "true" : "false";
var navbarJs = needsStandalone ? "true" : "false";

return $$"""
<!doctype html>
Expand Down
11 changes: 7 additions & 4 deletions crates/fusion-node/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -956,6 +956,8 @@ function swaggerUiHtml(swagger, openapiUrl, primaryName = null) {

const navbarEnabled = !!swagger.navbar?.enabled
const showUrlInput = swagger.navbar?.showUrlInput !== false
const versionUrls = swagger.navbar?.urls?.length > 0
const needsStandalone = navbarEnabled || versionUrls
const hideUrlCss =
navbarEnabled && !showUrlInput
? `<style>
Expand All @@ -965,9 +967,10 @@ function swaggerUiHtml(swagger, openapiUrl, primaryName = null) {
}
</style>`
: ''
const standaloneScript = navbarEnabled
? `<script src="${swaggerAssetUrl(swagger.path, 'swagger-ui-standalone-preset.js')}"></script>`
: ''
const standaloneScript =
needsStandalone && SWAGGER_ASSETS['swagger-ui-standalone-preset.js']
? `<script src="${swaggerAssetUrl(swagger.path, 'swagger-ui-standalone-preset.js')}"></script>`
: ''

return `<!doctype html>
<html>
Expand All @@ -987,7 +990,7 @@ function swaggerUiHtml(swagger, openapiUrl, primaryName = null) {
var opts = ${uiJson};
opts.presets = [SwaggerUIBundle.presets.apis];
opts.plugins = [SwaggerUIBundle.plugins.DownloadUrl];
if (${navbarEnabled ? 'true' : 'false'} && typeof SwaggerUIStandalonePreset !== 'undefined') {
if (${needsStandalone ? 'true' : 'false'} && typeof SwaggerUIStandalonePreset !== 'undefined') {
opts.presets.push(SwaggerUIStandalonePreset);
opts.layout = 'StandaloneLayout';
} else {
Expand Down
12 changes: 8 additions & 4 deletions crates/fusion-py/python/fusion_framework/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,17 +257,21 @@ def _swagger_ui_html(swagger: dict[str, Any], openapi_url: str, primary_name: st

navbar_enabled = bool(navbar.get("enabled"))
show_url_input = bool(navbar.get("showUrlInput", True))
version_urls = navbar.get("urls") or []
needs_standalone = navbar_enabled or bool(version_urls)
hide_url_css = ""
if navbar_enabled and not show_url_input:
# Keep the version <select>; hide only the free-text Explore box + button.
hide_url_css = """
<style>
.swagger-ui .topbar .download-url-input,
.swagger-ui .topbar .download-url-button { display: none !important; }
.swagger-ui .topbar .download-url-wrapper input[type=text],
.swagger-ui .topbar .download-url-wrapper .download-url-button {
display: none !important;
}
</style>"""

standalone_script = ""
if navbar_enabled:
if needs_standalone and "swagger-ui-standalone-preset.js" in _SWAGGER_ASSETS:
standalone_script = (
f'<script src="{_swagger_asset_url(prefix, "swagger-ui-standalone-preset.js")}"></script>'
)
Expand All @@ -277,7 +281,7 @@ def _swagger_ui_html(swagger: dict[str, Any], openapi_url: str, primary_name: st
var opts = {ui_json};
opts.presets = [SwaggerUIBundle.presets.apis];
opts.plugins = [SwaggerUIBundle.plugins.DownloadUrl];
if ({str(navbar_enabled).lower()} && typeof SwaggerUIStandalonePreset !== 'undefined') {{
if ({str(needs_standalone).lower()} && typeof SwaggerUIStandalonePreset !== 'undefined') {{
opts.presets.push(SwaggerUIStandalonePreset);
opts.layout = 'StandaloneLayout';
}} else {{
Expand Down
34 changes: 33 additions & 1 deletion crates/fusion-py/python/fusion_framework/test_swagger.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,14 @@

from fusion_framework._fusion import has_unversioned_routes, openapi_spec, route_versions
from fusion_framework.api import FusionBaseApi
from fusion_framework.app import UNVERSIONED_SWAGGER_NAME, _swagger_version_urls
from fusion_framework.app import (
UNVERSIONED_SWAGGER_NAME,
_apply_version_navbar,
_swagger_settings,
_swagger_ui_html,
_swagger_version_urls,
)
from fusion_framework.config import Settings
from fusion_framework.route import clear_registry, route


Expand Down Expand Up @@ -83,3 +90,28 @@ def get(self):
{"url": "/swagger/v2/openapi.json", "name": "v2"},
{"url": "/swagger/default/openapi.json", "name": "default"},
]


def test_swagger_ui_html_version_navbar():
@route("/hello", version="v1")
class V1Hello(FusionBaseApi):
def get(self):
return {"v": 1}

@route("/hello", version="v2")
class V2Hello(FusionBaseApi):
def get(self):
return {"v": 2}

swagger = _swagger_settings(Settings())
labels = _apply_version_navbar(swagger)
assert labels == ["v1", "v2"]

html = _swagger_ui_html(swagger, "/swagger/openapi.json", primary_name="v1")
assert "/swagger/v1/openapi.json" in html
assert "/swagger/v2/openapi.json" in html
assert '"urls"' in html
assert "StandaloneLayout" in html
assert "swagger-ui-standalone-preset.js" in html
assert ".download-url-wrapper input[type=text]" in html
assert ".download-url-input" not in html
Loading