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
2 changes: 2 additions & 0 deletions helm/spritz/templates/ui-deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ spec:
value: {{ .Values.ui.repoDefaults.branch | quote }}
- name: SPRITZ_UI_HIDE_REPO_INPUTS
value: {{ .Values.ui.repoDefaults.hideInputs | quote }}
- name: SPRITZ_UI_LAUNCH_QUERY_PARAMS
value: {{ .Values.ui.launch.queryParams | toJson | quote }}
{{- if .Values.ui.assetVersion }}
- name: SPRITZ_UI_ASSET_VERSION
value: {{ .Values.ui.assetVersion | quote }}
Expand Down
2 changes: 2 additions & 0 deletions helm/spritz/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,8 @@ ui:
dir: ""
branch: ""
hideInputs: false
launch:
queryParams: {}
auth:
mode: none
tokenStorage: localStorage
Expand Down
3 changes: 3 additions & 0 deletions ui/entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ DEFAULT_REPO_URL="${SPRITZ_UI_DEFAULT_REPO_URL:-}"
DEFAULT_REPO_DIR="${SPRITZ_UI_DEFAULT_REPO_DIR:-}"
DEFAULT_REPO_BRANCH="${SPRITZ_UI_DEFAULT_REPO_BRANCH:-}"
HIDE_REPO_INPUTS="${SPRITZ_UI_HIDE_REPO_INPUTS:-}"
LAUNCH_QUERY_PARAMS="${SPRITZ_UI_LAUNCH_QUERY_PARAMS:-}"
ASSET_VERSION="${SPRITZ_UI_ASSET_VERSION:-}"

if [ -z "$API_BASE_URL" ]; then
Expand Down Expand Up @@ -60,6 +61,7 @@ DEFAULT_REPO_URL_ESCAPED="$(escape_sed "$DEFAULT_REPO_URL")"
DEFAULT_REPO_DIR_ESCAPED="$(escape_sed "$DEFAULT_REPO_DIR")"
DEFAULT_REPO_BRANCH_ESCAPED="$(escape_sed "$DEFAULT_REPO_BRANCH")"
HIDE_REPO_INPUTS_ESCAPED="$(escape_sed "$HIDE_REPO_INPUTS")"
LAUNCH_QUERY_PARAMS_ESCAPED="$(escape_sed "$LAUNCH_QUERY_PARAMS")"
ASSET_VERSION_ESCAPED="$(escape_sed "$ASSET_VERSION")"

sed "s|__SPRITZ_API_BASE_URL__|${API_BASE_URL_ESCAPED}|g" /usr/share/nginx/html/config.js \
Expand All @@ -73,6 +75,7 @@ sed "s|__SPRITZ_API_BASE_URL__|${API_BASE_URL_ESCAPED}|g" /usr/share/nginx/html/
| sed "s|__SPRITZ_UI_DEFAULT_REPO_DIR__|${DEFAULT_REPO_DIR_ESCAPED}|g" \
| sed "s|__SPRITZ_UI_DEFAULT_REPO_BRANCH__|${DEFAULT_REPO_BRANCH_ESCAPED}|g" \
| sed "s|__SPRITZ_UI_HIDE_REPO_INPUTS__|${HIDE_REPO_INPUTS_ESCAPED}|g" \
| sed "s|__SPRITZ_UI_LAUNCH_QUERY_PARAMS__|${LAUNCH_QUERY_PARAMS_ESCAPED}|g" \
| sed "s|__SPRITZ_UI_AUTH_LOGIN_URL__|${AUTH_LOGIN_URL_ESCAPED}|g" \
| sed "s|__SPRITZ_UI_AUTH_RETURN_TO_MODE__|${AUTH_RETURN_TO_MODE_ESCAPED}|g" \
| sed "s|__SPRITZ_UI_AUTH_RETURN_TO_PARAM__|${AUTH_RETURN_TO_PARAM_ESCAPED}|g" \
Expand Down
77 changes: 76 additions & 1 deletion ui/public/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ const defaultRepoUrl = String(repoDefaults.url || '').trim();
const defaultRepoDir = String(repoDefaults.dir || '').trim();
const defaultRepoBranch = String(repoDefaults.branch || '').trim();
const hideRepoInputs = parseBoolean(repoDefaults.hideInputs, false);
const launchQueryParamsPlaceholder = '__SPRITZ_UI_LAUNCH_QUERY_PARAMS__';
const launchConfig = config.launch || {};
const launchQueryParams = parseTemplateMap(launchConfig.queryParams);
const authReturnToPlaceholder = '__SPRITZ_RETURN_TO__';
const noticeEl = document.getElementById('notice');
const listEl = document.getElementById('list');
Expand Down Expand Up @@ -421,6 +424,33 @@ function parseStorageKeys(value) {
.filter(Boolean);
}

function normalizeTemplateMap(value) {
if (!value || typeof value !== 'object' || Array.isArray(value)) return {};
const normalized = {};
for (const [key, raw] of Object.entries(value)) {
const name = String(key || '').trim();
if (!name) continue;
if (raw === undefined || raw === null) continue;
normalized[name] = String(raw);
}
return normalized;
}

function parseTemplateMap(value) {
if (!value) return {};
if (typeof value === 'object') {
return normalizeTemplateMap(value);
}
const trimmed = String(value).trim();
if (!trimmed || trimmed === launchQueryParamsPlaceholder) return {};
try {
const parsed = JSON.parse(trimmed);
return normalizeTemplateMap(parsed);
} catch {
return {};
}
}

function parsePresets(raw) {
if (Array.isArray(raw)) return raw;
if (typeof raw === 'string') {
Expand Down Expand Up @@ -863,6 +893,51 @@ async function fetchSpritzes() {
}
}

function applyTemplatePlaceholders(template, context) {
if (!template) return '';
return String(template).replace(/\{([a-zA-Z0-9_]+)\}/g, (_, key) => {
const value = context[key];
if (value === undefined || value === null) return '';
return String(value);
});
}

function buildOpenUrl(rawUrl, spritz) {
const input = String(rawUrl || '').trim();
if (!input) return '';
let url;
try {
url = new URL(input, window.location.href);
} catch {
return input;
}
const queryEntries = Object.entries(launchQueryParams);
if (!queryEntries.length) {
return url.href;
}
const name = String(spritz?.metadata?.name || '').trim();
const namespace = String(spritz?.metadata?.namespace || '').trim();
const context = {
origin: url.origin,
host: url.host,
hostname: url.hostname,
path: url.pathname,
query: url.search,
name,
namespace,
name_encoded: encodeURIComponent(name),
namespace_encoded: encodeURIComponent(namespace),
path_encoded: encodeURIComponent(url.pathname),
ui_origin: window.location.origin,
ws_origin: url.origin.replace(/^http/i, 'ws'),
};
for (const [param, template] of queryEntries) {
const value = applyTemplatePlaceholders(template, context);
url.searchParams.set(param, value);
}
return url.href;
}

function renderList(items) {
updateKnownSpritzNames(items);
if (!items.length) {
Expand Down Expand Up @@ -891,7 +966,7 @@ function renderList(items) {
const openBtn = document.createElement('button');
openBtn.textContent = 'Open';
openBtn.onclick = () => {
const url = spritz.status?.url;
const url = buildOpenUrl(spritz.status?.url, spritz);
if (url) window.open(url, '_blank');
};

Expand Down
3 changes: 3 additions & 0 deletions ui/public/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ window.SPRITZ_CONFIG = {
branch: '__SPRITZ_UI_DEFAULT_REPO_BRANCH__',
hideInputs: '__SPRITZ_UI_HIDE_REPO_INPUTS__',
},
launch: {
queryParams: '__SPRITZ_UI_LAUNCH_QUERY_PARAMS__',
},
auth: {
mode: '__SPRITZ_UI_AUTH_MODE__',
tokenStorage: '__SPRITZ_UI_AUTH_TOKEN_STORAGE__',
Expand Down