ui: cache derived secrets views

This commit is contained in:
a.tolmachev
2026-05-02 15:01:27 +00:00
parent 96f2f20591
commit 9a83cee84d
+33 -9
View File
@@ -3,6 +3,11 @@ function initSecretsPage() {
workspaceId: null, workspaceId: null,
secrets: [], secrets: [],
profiles: [], profiles: [],
derived: {
activeSecretCount: 0,
secretsById: {},
usageBySecret: {},
},
search: '', search: '',
loading: false, loading: false,
error: '', error: '',
@@ -101,7 +106,7 @@ function initSecretsPage() {
return secret ? secret.name : secretId; return secret ? secret.name : secretId;
} }
function usageBySecret() { function buildUsageBySecret() {
var usage = {}; var usage = {};
state.profiles.forEach(function (profile) { state.profiles.forEach(function (profile) {
secretIdsForProfile(profile).forEach(function (secretId) { secretIdsForProfile(profile).forEach(function (secretId) {
@@ -113,6 +118,24 @@ function initSecretsPage() {
return usage; return usage;
} }
function recomputeDerivedState() {
var secretsById = {};
var activeSecretCount = 0;
state.secrets.forEach(function (secret) {
secretsById[secret.id] = secret;
if (secret.status === 'active') {
activeSecretCount += 1;
}
});
state.derived = {
activeSecretCount: activeSecretCount,
secretsById: secretsById,
usageBySecret: buildUsageBySecret(),
};
}
function resetModalFields() { function resetModalFields() {
modalName.value = ''; modalName.value = '';
modalKind.value = 'token'; modalKind.value = 'token';
@@ -213,15 +236,14 @@ function initSecretsPage() {
} }
function renderSecrets() { function renderSecrets() {
var usage = usageBySecret(); var usage = state.derived.usageBySecret;
var query = state.search.toLowerCase(); var query = state.search.toLowerCase();
var rows = state.secrets.filter(function (secret) { var rows = state.secrets.filter(function (secret) {
return !query || secret.name.toLowerCase().includes(query) || String(secret.kind || '').toLowerCase().includes(query); return !query || secret.name.toLowerCase().includes(query) || String(secret.kind || '').toLowerCase().includes(query);
}); });
var active = state.secrets.filter(function (secret) { return secret.status === 'active'; }).length;
summary.textContent = tfKey('secrets.active.subtitle', { summary.textContent = tfKey('secrets.active.subtitle', {
active: active, active: state.derived.activeSecretCount,
total: state.secrets.length, total: state.secrets.length,
}); });
@@ -321,11 +343,8 @@ function initSecretsPage() {
} }
function renderProfiles() { function renderProfiles() {
var usage = usageBySecret(); var usage = state.derived.usageBySecret;
var secretsById = {}; var secretsById = state.derived.secretsById;
state.secrets.forEach(function (secret) {
secretsById[secret.id] = secret;
});
profilesSummary.textContent = window.tPlural( profilesSummary.textContent = window.tPlural(
'secrets.profiles.subtitle_count', 'secrets.profiles.subtitle_count',
@@ -444,6 +463,9 @@ function initSecretsPage() {
renderProfiles(); renderProfiles();
if (!state.workspaceId) { if (!state.workspaceId) {
state.secrets = [];
state.profiles = [];
recomputeDerivedState();
state.loading = false; state.loading = false;
state.error = tKey('secrets.error.workspace'); state.error = tKey('secrets.error.workspace');
renderSecrets(); renderSecrets();
@@ -458,10 +480,12 @@ function initSecretsPage() {
]); ]);
state.secrets = (results[0] && results[0].items) || []; state.secrets = (results[0] && results[0].items) || [];
state.profiles = (results[1] && results[1].items) || []; state.profiles = (results[1] && results[1].items) || [];
recomputeDerivedState();
} catch (error) { } catch (error) {
state.error = error.message || tKey('secrets.error.load'); state.error = error.message || tKey('secrets.error.load');
state.secrets = []; state.secrets = [];
state.profiles = []; state.profiles = [];
recomputeDerivedState();
} finally { } finally {
state.loading = false; state.loading = false;
renderSecrets(); renderSecrets();