@profoundlogic/coderflow-server 0.4.4 → 0.4.6
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.
- package/dist/base-image/entrypoint.sh +2 -1
- package/dist/coder-server.js +1 -1
- package/dist/config.js +1 -1
- package/dist/lib/agent-keepalive.js +1 -1
- package/dist/lib/agent-models.js +1 -1
- package/dist/lib/api-keys.js +1 -1
- package/dist/lib/apiKeys.js +1 -1
- package/dist/lib/app-server-ports.js +1 -1
- package/dist/lib/auto-judge.js +1 -1
- package/dist/lib/automation-service.js +1 -0
- package/dist/lib/basic-auth.js +1 -1
- package/dist/lib/bindings.js +1 -0
- package/dist/lib/build-history.js +1 -1
- package/dist/lib/build-output-service.js +1 -1
- package/dist/lib/build-scheduler.js +1 -1
- package/dist/lib/build-service.js +1 -1
- package/dist/lib/ca-certificates.js +1 -1
- package/dist/lib/claude-oauth-refresh.js +1 -1
- package/dist/lib/cli/build.js +1 -1
- package/dist/lib/cli/config-command.js +1 -1
- package/dist/lib/cli/config.js +1 -1
- package/dist/lib/cli/create-user.js +1 -1
- package/dist/lib/cli/init.js +1 -1
- package/dist/lib/cli/jira.js +1 -1
- package/dist/lib/cli/license.js +1 -1
- package/dist/lib/cli/server-manager.js +1 -1
- package/dist/lib/config-migration.js +1 -1
- package/dist/lib/container-credential-sync.js +1 -1
- package/dist/lib/container-tokens.js +1 -1
- package/dist/lib/data-dir.js +1 -1
- package/dist/lib/deployment-history.js +1 -1
- package/dist/lib/deployment-service.js +1 -1
- package/dist/lib/docker-utils.js +1 -1
- package/dist/lib/email.js +1 -1
- package/dist/lib/emailTemplates.js +1 -1
- package/dist/lib/entitlement.js +1 -1
- package/dist/lib/fetch-utils.js +1 -1
- package/dist/lib/git-commit-details-route.js +1 -1
- package/dist/lib/git-history-diff-guardrails.js +1 -1
- package/dist/lib/git-provider-service.js +1 -1
- package/dist/lib/git-provider-setup/github-setup-handler.js +1 -1
- package/dist/lib/git-provider-setup/index.js +1 -1
- package/dist/lib/git-provider-setup/setup-factory.js +1 -1
- package/dist/lib/git-provider-setup/setup-interface.js +1 -1
- package/dist/lib/git-providers/azure-devops-provider.js +1 -1
- package/dist/lib/git-providers/github-app-provider.js +1 -1
- package/dist/lib/git-providers/index.js +1 -1
- package/dist/lib/git-providers/provider-factory.js +1 -1
- package/dist/lib/git-providers/provider-interface.js +1 -1
- package/dist/lib/github-urls.js +1 -1
- package/dist/lib/group-objective-linking.js +1 -1
- package/dist/lib/jira-client.js +1 -1
- package/dist/lib/judge-blinding.js +1 -1
- package/dist/lib/logger.js +1 -1
- package/dist/lib/migration-to-scoped-rbac.js +1 -0
- package/dist/lib/model-fetcher.js +1 -1
- package/dist/lib/notifications.js +1 -1
- package/dist/lib/objective-context.js +1 -1
- package/dist/lib/oidc-auth.js +1 -1
- package/dist/lib/oidc-device-flow.js +1 -1
- package/dist/lib/passwordTokens.js +1 -1
- package/dist/lib/permission-resolver.js +1 -0
- package/dist/lib/pin-cascade.js +1 -1
- package/dist/lib/provider-accounts.js +1 -1
- package/dist/lib/provider-oauth.js +1 -1
- package/dist/lib/provider-profile.js +1 -1
- package/dist/lib/provider-token-refresh.js +1 -1
- package/dist/lib/request-url.js +1 -1
- package/dist/lib/rewind.js +1 -1
- package/dist/lib/role-definitions.js +1 -0
- package/dist/lib/roles.js +1 -1
- package/dist/lib/secrets.js +1 -1
- package/dist/lib/setup-repo-git-auth.js +1 -1
- package/dist/lib/state-capture.js +1 -1
- package/dist/lib/static-files.js +1 -1
- package/dist/lib/task-name-format.js +1 -1
- package/dist/lib/task-name-generator.js +1 -1
- package/dist/lib/task-source-metadata.js +1 -0
- package/dist/lib/teams.js +1 -0
- package/dist/lib/user-git-oauth.js +1 -1
- package/dist/lib/user-git-tokens.js +1 -1
- package/dist/lib/users.js +1 -1
- package/dist/middleware/requireAuth.js +1 -1
- package/dist/middleware/requireInit.js +1 -1
- package/dist/middleware/requirePermission.js +1 -1
- package/dist/package-lock.json +211 -21
- package/dist/package.json +2 -1
- package/dist/playwright.config.js +1 -0
- package/dist/routes/apiKeys.js +1 -1
- package/dist/routes/auth-oidc.js +1 -1
- package/dist/routes/auth.js +1 -1
- package/dist/routes/automations.js +1 -0
- package/dist/routes/bindings.js +1 -0
- package/dist/routes/build.js +1 -1
- package/dist/routes/containers.js +1 -1
- package/dist/routes/deploy-task.js +1 -1
- package/dist/routes/environment-management.js +1 -1
- package/dist/routes/environments.js +1 -1
- package/dist/routes/external-skills.js +1 -1
- package/dist/routes/git-credentials.js +1 -1
- package/dist/routes/git-oauth.js +1 -1
- package/dist/routes/git-provider-setup.js +1 -1
- package/dist/routes/health.js +1 -1
- package/dist/routes/jira.js +1 -1
- package/dist/routes/objective-management.js +1 -1
- package/dist/routes/password.js +1 -1
- package/dist/routes/prompt.js +1 -1
- package/dist/routes/provider-auth.js +1 -1
- package/dist/routes/qa.js +1 -1
- package/dist/routes/roles.js +1 -0
- package/dist/routes/settings.js +1 -1
- package/dist/routes/skill-management.js +1 -1
- package/dist/routes/skills.js +1 -1
- package/dist/routes/tasks.js +1 -1
- package/dist/routes/teams.js +1 -0
- package/dist/routes/templates.js +1 -1
- package/dist/routes/test-task.js +1 -1
- package/dist/routes/test.js +1 -1
- package/dist/routes/users.js +1 -1
- package/dist/routes/visualizations.js +1 -1
- package/dist/scripts/create-user.js +1 -1
- package/dist/scripts/migrate-config-to-data-dir.js +1 -1
- package/dist/scripts/migrate-to-scoped-rbac.js +2 -0
- package/dist/start.js +1 -1
- package/dist/start.js.bak +1381 -0
- package/dist/web-ui/public/activity-detail-modal.js +1 -1
- package/dist/web-ui/public/activity-feed.js +1 -1
- package/dist/web-ui/public/activity-formatters.js +1 -1
- package/dist/web-ui/public/agent-event-parser.js +1 -1
- package/dist/web-ui/public/app.js +1 -1
- package/dist/web-ui/public/approve-dialog.js +1 -1
- package/dist/web-ui/public/automation-links.js +1 -0
- package/dist/web-ui/public/automation-schedule.js +1 -0
- package/dist/web-ui/public/comments-widget.js +1 -1
- package/dist/web-ui/public/diff-utils.js +1 -1
- package/dist/web-ui/public/docs/_sidebar.md +1 -0
- package/dist/web-ui/public/docs/admin/automations.md +75 -0
- package/dist/web-ui/public/docs/admin/users-and-roles.md +14 -4
- package/dist/web-ui/public/environments.css +247 -125
- package/dist/web-ui/public/environments.html +346 -2
- package/dist/web-ui/public/environments.js +1 -1
- package/dist/web-ui/public/feedback-widget.css +42 -0
- package/dist/web-ui/public/feedback-widget.js +1 -1
- package/dist/web-ui/public/git-history-lazy-utils.js +1 -1
- package/dist/web-ui/public/git-history.html +15 -0
- package/dist/web-ui/public/git-history.js +1 -1
- package/dist/web-ui/public/git-status.js +1 -1
- package/dist/web-ui/public/index.html +27 -0
- package/dist/web-ui/public/index.js +1 -1
- package/dist/web-ui/public/login.js +1 -1
- package/dist/web-ui/public/markdown-editor.js +1 -1
- package/dist/web-ui/public/markdown-file-editor.js +1 -1
- package/dist/web-ui/public/modal-maximize.js +1 -1
- package/dist/web-ui/public/notifications.js +1 -1
- package/dist/web-ui/public/pr-dialog.js +1 -1
- package/dist/web-ui/public/roles.html +247 -0
- package/dist/web-ui/public/roles.js +1 -0
- package/dist/web-ui/public/server-health.js +1 -1
- package/dist/web-ui/public/settings.html +62 -0
- package/dist/web-ui/public/settings.js +1 -1
- package/dist/web-ui/public/setup-password.js +1 -1
- package/dist/web-ui/public/skills.html +15 -0
- package/dist/web-ui/public/skills.js +1 -1
- package/dist/web-ui/public/sse-client.js +1 -1
- package/dist/web-ui/public/sse-shared-worker.js +1 -1
- package/dist/web-ui/public/styles.css +198 -161
- package/dist/web-ui/public/task.html +2 -2
- package/dist/web-ui/public/task.js +1 -1
- package/dist/web-ui/public/teams.html +285 -0
- package/dist/web-ui/public/teams.js +1 -0
- package/dist/web-ui/public/terminal.js +1 -1
- package/dist/web-ui/public/theme.js +1 -1
- package/dist/web-ui/public/users.html +87 -29
- package/dist/web-ui/public/users.js +1 -1
- package/dist/web-ui/public/variant-grouping.js +1 -1
- package/package.json +6 -3
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Teams · CoderFlow</title>
|
|
7
|
+
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
|
8
|
+
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
|
9
|
+
<link rel="icon" href="/favicon-16.png" type="image/png" sizes="16x16">
|
|
10
|
+
<link rel="icon" href="/favicon.ico">
|
|
11
|
+
<script>
|
|
12
|
+
(() => {
|
|
13
|
+
const key = 'profound-coder-theme';
|
|
14
|
+
try {
|
|
15
|
+
const stored = localStorage.getItem(key);
|
|
16
|
+
const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
17
|
+
const theme = stored === 'dark' || stored === 'light' ? stored : (prefersDark ? 'dark' : 'light');
|
|
18
|
+
document.documentElement.dataset.theme = theme;
|
|
19
|
+
document.documentElement.style.colorScheme = theme === 'dark' ? 'dark' : 'light';
|
|
20
|
+
} catch (error) {
|
|
21
|
+
document.documentElement.dataset.theme = 'light';
|
|
22
|
+
}
|
|
23
|
+
})();
|
|
24
|
+
</script>
|
|
25
|
+
<link rel="stylesheet" href="styles.css?v=83">
|
|
26
|
+
<script type="module" src="teams.js"></script>
|
|
27
|
+
<!-- Dev QA shortcut: Ctrl+Shift+Q to launch current page in QA mode -->
|
|
28
|
+
</head>
|
|
29
|
+
<body>
|
|
30
|
+
<main class="task-detail">
|
|
31
|
+
<div class="task-hero">
|
|
32
|
+
<div class="hero-top">
|
|
33
|
+
<nav class="breadcrumb" aria-label="Breadcrumb">
|
|
34
|
+
<a class="breadcrumb-link" href="index.html">
|
|
35
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
36
|
+
<path d="M3 11.5L12 4l9 7.5"></path>
|
|
37
|
+
<path d="M5 10.5V20h5v-5h4v5h5v-9.5"></path>
|
|
38
|
+
</svg>
|
|
39
|
+
<span>Home</span>
|
|
40
|
+
</a>
|
|
41
|
+
<span class="breadcrumb-separator" aria-hidden="true">/</span>
|
|
42
|
+
<span class="breadcrumb-current">Teams</span>
|
|
43
|
+
</nav>
|
|
44
|
+
<span class="task-context">Administration</span>
|
|
45
|
+
<!-- Admin Menu (gear icon) -->
|
|
46
|
+
<div class="admin-menu-container" id="admin-menu-container" hidden>
|
|
47
|
+
<button class="btn-icon-admin" id="admin-menu-btn" title="Admin">
|
|
48
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
49
|
+
<circle cx="12" cy="12" r="3"></circle>
|
|
50
|
+
<path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>
|
|
51
|
+
</svg>
|
|
52
|
+
</button>
|
|
53
|
+
<div class="dropdown-menu admin-dropdown" id="admin-menu" hidden>
|
|
54
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='users.html'">
|
|
55
|
+
<svg class="option-icon icon-users" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
56
|
+
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
|
|
57
|
+
<circle cx="9" cy="7" r="4"></circle>
|
|
58
|
+
<path d="M23 21v-2a4 4 0 0 0-3-3.87"></path>
|
|
59
|
+
<path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
|
|
60
|
+
</svg>
|
|
61
|
+
<span class="option-text">Users</span>
|
|
62
|
+
</button>
|
|
63
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='environments.html'">
|
|
64
|
+
<svg class="option-icon icon-environments" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
65
|
+
<circle cx="12" cy="12" r="10"></circle>
|
|
66
|
+
<line x1="2" y1="12" x2="22" y2="12"></line>
|
|
67
|
+
<path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"></path>
|
|
68
|
+
</svg>
|
|
69
|
+
<span class="option-text">Environments</span>
|
|
70
|
+
</button>
|
|
71
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='roles.html'">
|
|
72
|
+
<svg class="option-icon icon-roles" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
73
|
+
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path>
|
|
74
|
+
</svg>
|
|
75
|
+
<span class="option-text">Roles</span>
|
|
76
|
+
</button>
|
|
77
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='skills.html'">
|
|
78
|
+
<svg class="option-icon icon-skills" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
79
|
+
<path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"></path>
|
|
80
|
+
</svg>
|
|
81
|
+
<span class="option-text">Skills</span>
|
|
82
|
+
</button>
|
|
83
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='settings.html'">
|
|
84
|
+
<svg class="option-icon icon-server-settings" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
85
|
+
<line x1="4" y1="21" x2="4" y2="14"></line>
|
|
86
|
+
<line x1="4" y1="10" x2="4" y2="3"></line>
|
|
87
|
+
<line x1="12" y1="21" x2="12" y2="12"></line>
|
|
88
|
+
<line x1="12" y1="8" x2="12" y2="3"></line>
|
|
89
|
+
<line x1="20" y1="21" x2="20" y2="16"></line>
|
|
90
|
+
<line x1="20" y1="12" x2="20" y2="3"></line>
|
|
91
|
+
<line x1="1" y1="14" x2="7" y2="14"></line>
|
|
92
|
+
<line x1="9" y1="8" x2="15" y2="8"></line>
|
|
93
|
+
<line x1="17" y1="16" x2="23" y2="16"></line>
|
|
94
|
+
</svg>
|
|
95
|
+
<span class="option-text">Server Settings</span>
|
|
96
|
+
</button>
|
|
97
|
+
<button type="button" class="dropdown-item admin-menu-item" id="server-health-btn">
|
|
98
|
+
<svg class="option-icon icon-health" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
99
|
+
<path d="M22 12h-4l-3 9L9 3l-3 9H2"></path>
|
|
100
|
+
</svg>
|
|
101
|
+
<span class="option-text">Server Health</span>
|
|
102
|
+
</button>
|
|
103
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='git-history.html'">
|
|
104
|
+
<svg class="option-icon icon-git-history" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
105
|
+
<circle cx="6" cy="6" r="2"></circle>
|
|
106
|
+
<circle cx="6" cy="18" r="2"></circle>
|
|
107
|
+
<circle cx="18" cy="12" r="2"></circle>
|
|
108
|
+
<path d="M6 8v8"></path>
|
|
109
|
+
<path d="M6 12h10"></path>
|
|
110
|
+
</svg>
|
|
111
|
+
<span class="option-text">Git History</span>
|
|
112
|
+
</button>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
<div id="theme-toggle-container"></div>
|
|
116
|
+
</div>
|
|
117
|
+
<div class="status-hero">
|
|
118
|
+
<div class="status-copy">
|
|
119
|
+
<h1>Team Management</h1>
|
|
120
|
+
<p class="task-subtitle">Manage teams and their environment access bindings</p>
|
|
121
|
+
</div>
|
|
122
|
+
<div class="status-actions">
|
|
123
|
+
<button class="btn-primary btn-small" id="create-team-btn" hidden>Create Team</button>
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
|
|
128
|
+
<div id="teams-loading" class="loading">Loading teams…</div>
|
|
129
|
+
<div id="teams-error" class="empty-state" hidden>
|
|
130
|
+
<h3>Failed to load teams</h3>
|
|
131
|
+
<p id="teams-error-message" class="text-muted"></p>
|
|
132
|
+
<button class="btn-primary" id="retry-teams-btn">Try Again</button>
|
|
133
|
+
</div>
|
|
134
|
+
|
|
135
|
+
<section id="teams-content" class="detail-stack" hidden>
|
|
136
|
+
<article class="detail-card">
|
|
137
|
+
<header class="detail-card-header">
|
|
138
|
+
<h2>Teams</h2>
|
|
139
|
+
<span id="team-count" class="tag">0 teams</span>
|
|
140
|
+
</header>
|
|
141
|
+
<div class="detail-card-content">
|
|
142
|
+
<div class="users-table-container">
|
|
143
|
+
<table class="users-table">
|
|
144
|
+
<thead>
|
|
145
|
+
<tr>
|
|
146
|
+
<th>Name</th>
|
|
147
|
+
<th>Members</th>
|
|
148
|
+
<th>Managers</th>
|
|
149
|
+
<th>Actions</th>
|
|
150
|
+
</tr>
|
|
151
|
+
</thead>
|
|
152
|
+
<tbody id="teams-table-body">
|
|
153
|
+
<!-- Teams populated by JS -->
|
|
154
|
+
</tbody>
|
|
155
|
+
</table>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
</article>
|
|
159
|
+
</section>
|
|
160
|
+
</main>
|
|
161
|
+
|
|
162
|
+
<!-- Create/Edit Team Modal -->
|
|
163
|
+
<div id="team-modal" class="modal" hidden>
|
|
164
|
+
<div class="modal-overlay"></div>
|
|
165
|
+
<div class="modal-content" style="max-width: 640px;">
|
|
166
|
+
<div class="modal-header">
|
|
167
|
+
<h2 id="team-modal-title">Create Team</h2>
|
|
168
|
+
<button class="modal-close" id="close-team-modal">×</button>
|
|
169
|
+
</div>
|
|
170
|
+
<!-- Tab bar (hidden when creating) -->
|
|
171
|
+
<div id="team-modal-tabs" hidden style="display: flex; gap: 0; border-bottom: 2px solid var(--color-border); margin: 0 1.5rem;">
|
|
172
|
+
<button type="button" class="modal-tab-btn active" data-tab="details" style="padding: 0.625rem 1.25rem; background: none; border: none; border-bottom: 2px solid transparent; cursor: pointer; font-size: 0.9rem; margin-bottom: -2px; color: var(--color-text-secondary);">Details</button>
|
|
173
|
+
<button type="button" class="modal-tab-btn" data-tab="bindings" style="padding: 0.625rem 1.25rem; background: none; border: none; border-bottom: 2px solid transparent; cursor: pointer; font-size: 0.9rem; margin-bottom: -2px; color: var(--color-text-secondary);">Access Bindings</button>
|
|
174
|
+
</div>
|
|
175
|
+
<div class="modal-body">
|
|
176
|
+
|
|
177
|
+
<!-- Details Tab -->
|
|
178
|
+
<div id="team-tab-details">
|
|
179
|
+
<div class="modal-section">
|
|
180
|
+
<label for="team-name">Name *</label>
|
|
181
|
+
<input type="text" id="team-name" class="form-input" required placeholder="e.g. Frontend Team">
|
|
182
|
+
</div>
|
|
183
|
+
<div class="modal-section">
|
|
184
|
+
<label for="team-description">Description</label>
|
|
185
|
+
<input type="text" id="team-description" class="form-input" placeholder="Optional description">
|
|
186
|
+
</div>
|
|
187
|
+
|
|
188
|
+
<!-- Members section (shown when editing) -->
|
|
189
|
+
<div id="members-section" hidden>
|
|
190
|
+
<div class="modal-section">
|
|
191
|
+
<label>Members</label>
|
|
192
|
+
<div id="members-list" style="margin-bottom: 0.5rem;"></div>
|
|
193
|
+
<div id="add-member-row" style="display: flex; gap: 0.5rem; margin-top: 0.5rem;">
|
|
194
|
+
<select id="add-member-select" class="form-input" style="flex: 1; font-size: 0.875rem;">
|
|
195
|
+
<option value="">Add a member…</option>
|
|
196
|
+
</select>
|
|
197
|
+
<button type="button" class="btn-secondary btn-small" id="add-member-btn">Add</button>
|
|
198
|
+
</div>
|
|
199
|
+
</div>
|
|
200
|
+
|
|
201
|
+
<!-- Managers section (admin only) -->
|
|
202
|
+
<div id="managers-section" class="modal-section" hidden>
|
|
203
|
+
<label>Managers <span style="font-weight: normal; font-size: 0.8em; color: var(--color-text-secondary);">(admin only)</span></label>
|
|
204
|
+
<div id="managers-list" style="margin-bottom: 0.5rem;"></div>
|
|
205
|
+
<div id="add-manager-row" style="display: flex; gap: 0.5rem; margin-top: 0.5rem;">
|
|
206
|
+
<select id="add-manager-select" class="form-input" style="flex: 1; font-size: 0.875rem;">
|
|
207
|
+
<option value="">Promote a member to manager…</option>
|
|
208
|
+
</select>
|
|
209
|
+
<button type="button" class="btn-secondary btn-small" id="add-manager-btn">Add</button>
|
|
210
|
+
</div>
|
|
211
|
+
</div>
|
|
212
|
+
</div>
|
|
213
|
+
|
|
214
|
+
<div id="team-form-error" class="login-error" hidden></div>
|
|
215
|
+
</div>
|
|
216
|
+
|
|
217
|
+
<!-- Bindings Tab -->
|
|
218
|
+
<div id="team-tab-bindings" hidden>
|
|
219
|
+
<div id="bindings-loading" class="loading" hidden>Loading bindings…</div>
|
|
220
|
+
<div id="bindings-empty" hidden style="padding: 1.5rem 0; text-align: center; color: var(--color-text-secondary);">
|
|
221
|
+
No environment access bindings for this team yet.
|
|
222
|
+
</div>
|
|
223
|
+
<div id="bindings-list-container">
|
|
224
|
+
<table class="users-table" id="bindings-table">
|
|
225
|
+
<thead>
|
|
226
|
+
<tr>
|
|
227
|
+
<th>Environment</th>
|
|
228
|
+
<th>Role</th>
|
|
229
|
+
<th>Actions</th>
|
|
230
|
+
</tr>
|
|
231
|
+
</thead>
|
|
232
|
+
<tbody id="bindings-table-body"></tbody>
|
|
233
|
+
</table>
|
|
234
|
+
</div>
|
|
235
|
+
<div id="bindings-actions" style="margin-top: 1rem;">
|
|
236
|
+
<button type="button" class="btn-secondary btn-small" id="add-binding-btn" hidden>+ Add Binding</button>
|
|
237
|
+
</div>
|
|
238
|
+
<!-- Inline add-binding form -->
|
|
239
|
+
<div id="add-binding-form" hidden style="margin-top: 0.75rem; padding: 1rem; border: 1px solid var(--color-border); border-radius: 8px; background: var(--color-surface-elevated);">
|
|
240
|
+
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-bottom: 0.75rem;">
|
|
241
|
+
<div>
|
|
242
|
+
<label style="font-size: 0.8rem; margin-bottom: 0.25rem; display: block;">Environment</label>
|
|
243
|
+
<select id="binding-environment" class="form-input" style="font-size: 0.875rem;"></select>
|
|
244
|
+
</div>
|
|
245
|
+
<div>
|
|
246
|
+
<label style="font-size: 0.8rem; margin-bottom: 0.25rem; display: block;">Role</label>
|
|
247
|
+
<select id="binding-role" class="form-input" style="font-size: 0.875rem;"></select>
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
250
|
+
<div style="display: flex; gap: 0.5rem;">
|
|
251
|
+
<button type="button" class="btn-primary btn-small" id="save-binding-btn">Add Binding</button>
|
|
252
|
+
<button type="button" class="btn-ghost btn-small" id="cancel-binding-btn">Cancel</button>
|
|
253
|
+
</div>
|
|
254
|
+
</div>
|
|
255
|
+
</div>
|
|
256
|
+
|
|
257
|
+
</div>
|
|
258
|
+
<div class="modal-footer" id="team-modal-footer">
|
|
259
|
+
<button class="btn-ghost" id="cancel-team">Cancel</button>
|
|
260
|
+
<button class="btn-primary" id="save-team">Save Team</button>
|
|
261
|
+
</div>
|
|
262
|
+
</div>
|
|
263
|
+
</div>
|
|
264
|
+
|
|
265
|
+
<!-- Delete Team Confirmation Modal -->
|
|
266
|
+
<div id="delete-team-modal" class="modal" hidden>
|
|
267
|
+
<div class="modal-overlay"></div>
|
|
268
|
+
<div class="modal-content">
|
|
269
|
+
<div class="modal-header">
|
|
270
|
+
<h2>Delete Team</h2>
|
|
271
|
+
<button class="modal-close" id="close-delete-team-modal">×</button>
|
|
272
|
+
</div>
|
|
273
|
+
<div class="modal-body">
|
|
274
|
+
<p>Are you sure you want to delete team <strong id="delete-team-name"></strong>?</p>
|
|
275
|
+
<p class="field-hint">All environment access bindings for this team will also be removed. This action cannot be undone.</p>
|
|
276
|
+
</div>
|
|
277
|
+
<div class="modal-footer">
|
|
278
|
+
<button class="btn-ghost" id="cancel-delete-team">Cancel</button>
|
|
279
|
+
<button class="btn-primary" id="confirm-delete-team" style="background: var(--color-danger);">Delete Team</button>
|
|
280
|
+
</div>
|
|
281
|
+
</div>
|
|
282
|
+
</div>
|
|
283
|
+
|
|
284
|
+
</body>
|
|
285
|
+
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const _0x3de7a2=_0x5562;(function(_0x140dee,_0xd68aec){const _0x1e1fdd=_0x5562,_0x26cda3=_0x140dee();while(!![]){try{const _0x4ab9fe=parseInt(_0x1e1fdd(0x138))/0x1*(parseInt(_0x1e1fdd(0x157))/0x2)+parseInt(_0x1e1fdd(0x102))/0x3+parseInt(_0x1e1fdd(0x13f))/0x4*(parseInt(_0x1e1fdd(0x189))/0x5)+parseInt(_0x1e1fdd(0xfd))/0x6+parseInt(_0x1e1fdd(0x12e))/0x7*(-parseInt(_0x1e1fdd(0x140))/0x8)+parseInt(_0x1e1fdd(0x17b))/0x9+parseInt(_0x1e1fdd(0x14e))/0xa*(-parseInt(_0x1e1fdd(0x14a))/0xb);if(_0x4ab9fe===_0xd68aec)break;else _0x26cda3['push'](_0x26cda3['shift']());}catch(_0x1cee43){_0x26cda3['push'](_0x26cda3['shift']());}}}(_0x59f6,0x255ea));import{API,Utils,initializeAdminMenu}from'./app.js';import{initTheme,mountThemeToggle}from'./theme.js';function _0x5562(_0x5beb6e,_0x1449a4){_0x5beb6e=_0x5beb6e-0xfb;const _0x59f638=_0x59f6();let _0x55621a=_0x59f638[_0x5beb6e];if(_0x5562['FhqbpB']===undefined){var _0x46d23d=function(_0x11913a){const _0x3833a8='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xc05f09='',_0x177bcd='';for(let _0x86d85a=0x0,_0x5097b1,_0x4c38f9,_0x328c44=0x0;_0x4c38f9=_0x11913a['charAt'](_0x328c44++);~_0x4c38f9&&(_0x5097b1=_0x86d85a%0x4?_0x5097b1*0x40+_0x4c38f9:_0x4c38f9,_0x86d85a++%0x4)?_0xc05f09+=String['fromCharCode'](0xff&_0x5097b1>>(-0x2*_0x86d85a&0x6)):0x0){_0x4c38f9=_0x3833a8['indexOf'](_0x4c38f9);}for(let _0x329f6d=0x0,_0x11e7de=_0xc05f09['length'];_0x329f6d<_0x11e7de;_0x329f6d++){_0x177bcd+='%'+('00'+_0xc05f09['charCodeAt'](_0x329f6d)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x177bcd);};_0x5562['vJzAEc']=_0x46d23d,_0x5562['VqKOwk']={},_0x5562['FhqbpB']=!![];}const _0x250aeb=_0x59f638[0x0],_0x46137c=_0x5beb6e+_0x250aeb,_0x3ce3c9=_0x5562['VqKOwk'][_0x46137c];return!_0x3ce3c9?(_0x55621a=_0x5562['vJzAEc'](_0x55621a),_0x5562['VqKOwk'][_0x46137c]=_0x55621a):_0x55621a=_0x3ce3c9,_0x55621a;}const state={'teams':[],'users':[],'roles':[],'environments':[],'teamBindings':[],'currentUser':null,'editingTeamId':null,'deletingTeamId':null,'activeTab':_0x3de7a2(0x196)};document[_0x3de7a2(0x17f)](_0x3de7a2(0x116),async()=>{const _0x1f9123=_0x3de7a2;initTheme(),mountThemeToggle();try{state[_0x1f9123(0x1a4)]=await API[_0x1f9123(0x131)]();}catch{window[_0x1f9123(0x11b)][_0x1f9123(0x100)]=_0x1f9123(0x129);return;}await initializeAdminMenu(state[_0x1f9123(0x1a4)]),state['currentUser'][_0x1f9123(0x17c)]&&(document[_0x1f9123(0x132)](_0x1f9123(0x123))[_0x1f9123(0x187)]=![]),bindEventListeners(),await Promise[_0x1f9123(0x197)]([loadTeams(),loadUsers(),loadRoles(),loadEnvironments()]),renderTeams();});async function loadTeams(){const _0x4a555f=_0x3de7a2,_0xc05f09=document[_0x4a555f(0x132)]('teams-loading'),_0x177bcd=document[_0x4a555f(0x132)](_0x4a555f(0x186)),_0x86d85a=document[_0x4a555f(0x132)]('teams-content');try{_0xc05f09['hidden']=![],_0x177bcd[_0x4a555f(0x187)]=!![],_0x86d85a['hidden']=!![];const {teams:_0x5097b1}=await API[_0x4a555f(0x144)]();state['teams']=_0x5097b1||[],renderTeams(),_0xc05f09['hidden']=!![],_0x86d85a['hidden']=![];}catch(_0x4c38f9){_0xc05f09[_0x4a555f(0x187)]=!![],_0x177bcd[_0x4a555f(0x187)]=![],document[_0x4a555f(0x132)](_0x4a555f(0x18f))[_0x4a555f(0x12f)]=_0x4c38f9[_0x4a555f(0x166)];}}async function loadUsers(){const _0x147147=_0x3de7a2;try{const {users:_0x328c44}=await API[_0x147147(0x162)]();state['users']=_0x328c44||[];}catch{state[_0x147147(0x173)]=[];}}async function loadRoles(){const _0x33fa36=_0x3de7a2;try{const {roles:_0x329f6d}=await API[_0x33fa36(0x19a)]();state[_0x33fa36(0x190)]=_0x329f6d||[];}catch{state['roles']=[];}}async function loadEnvironments(){const _0x5b7094=_0x3de7a2;try{const _0x11e7de=await API[_0x5b7094(0x105)]();state[_0x5b7094(0x13b)]=_0x11e7de[_0x5b7094(0x13b)]||[];}catch{state[_0x5b7094(0x13b)]=[];}}function renderTeams(){const _0x24a0d3=_0x3de7a2,_0x580457=document[_0x24a0d3(0x132)]('teams-table-body'),_0x597f6e=document[_0x24a0d3(0x132)](_0x24a0d3(0x13c));if(!_0x580457)return;_0x597f6e&&(_0x597f6e[_0x24a0d3(0x12f)]=state[_0x24a0d3(0x108)]['length']+_0x24a0d3(0x198)+(state['teams'][_0x24a0d3(0xfc)]===0x1?'':'s'));if(state['teams'][_0x24a0d3(0xfc)]===0x0){_0x580457[_0x24a0d3(0x16c)]=_0x24a0d3(0x14b)+(state[_0x24a0d3(0x1a4)]?.[_0x24a0d3(0x17c)]?_0x24a0d3(0x142):'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20</tr>';return;}const _0x2e7e0b=state[_0x24a0d3(0x1a4)]?.[_0x24a0d3(0x17c)];_0x580457['innerHTML']=state[_0x24a0d3(0x108)][_0x24a0d3(0x151)](_0x231334=>{const _0x482ada=_0x24a0d3,_0x21be05=(_0x231334[_0x482ada(0x167)]||[])[_0x482ada(0x10b)](state['currentUser']?.['id']),_0x524de4=_0x2e7e0b||_0x21be05,_0x15dc0c=(_0x231334[_0x482ada(0x167)]||[])[_0x482ada(0x151)](_0x445bf4=>{const _0x11c711=_0x482ada;if(_0x231334[_0x11c711(0x111)]&&_0x231334[_0x11c711(0x111)][_0x445bf4])return _0x231334[_0x11c711(0x111)][_0x445bf4];const _0x33af98=state['users']['find'](_0x15d1eb=>_0x15d1eb['id']===_0x445bf4);return _0x33af98?_0x33af98['name']||_0x33af98[_0x11c711(0x11c)]:_0x445bf4;})['join'](',\x20')||'—',_0x268289=(_0x231334[_0x482ada(0x17d)]||[])[_0x482ada(0xfc)];return _0x482ada(0x183)+_0x231334['id']+'\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+Utils['escapeHtml'](_0x231334[_0x482ada(0x13d)])+_0x482ada(0x191)+(_0x231334[_0x482ada(0x11e)]?_0x482ada(0x104)+Utils['escapeHtml'](_0x231334[_0x482ada(0x11e)])+'</div>':'')+_0x482ada(0x174)+_0x268289+_0x482ada(0x18a)+Utils[_0x482ada(0x141)](_0x15dc0c)+_0x482ada(0x136)+(_0x524de4?_0x482ada(0x106)+_0x231334['id']+'\x27)\x22>Edit</button>':'')+_0x482ada(0x199)+(_0x2e7e0b?_0x482ada(0x180)+_0x231334['id']+_0x482ada(0x193):'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20</tr>';})['join']('');}function bindEventListeners(){const _0x39bbac=_0x3de7a2;document[_0x39bbac(0x132)](_0x39bbac(0x123))?.[_0x39bbac(0x17f)](_0x39bbac(0x165),showCreateTeamModal),document[_0x39bbac(0x132)](_0x39bbac(0x13a))?.['addEventListener'](_0x39bbac(0x165),loadTeams),document[_0x39bbac(0x132)](_0x39bbac(0x15a))?.['addEventListener'](_0x39bbac(0x165),hideTeamModal),document[_0x39bbac(0x132)](_0x39bbac(0x110))?.[_0x39bbac(0x17f)](_0x39bbac(0x165),hideTeamModal),document[_0x39bbac(0x132)](_0x39bbac(0x19c))?.[_0x39bbac(0x17f)](_0x39bbac(0x165),saveTeam),document[_0x39bbac(0x14d)](_0x39bbac(0x11a))?.[_0x39bbac(0x17f)](_0x39bbac(0x165),hideTeamModal),document['querySelectorAll']('.modal-tab-btn')['forEach'](_0x22c699=>{const _0x5b6be8=_0x39bbac;_0x22c699['addEventListener']('click',()=>switchTab(_0x22c699[_0x5b6be8(0x19f)]['tab']));}),document[_0x39bbac(0x132)](_0x39bbac(0x114))?.['addEventListener']('click',addMember),document[_0x39bbac(0x132)](_0x39bbac(0x19e))?.[_0x39bbac(0x17f)](_0x39bbac(0x165),addManager),document[_0x39bbac(0x132)](_0x39bbac(0x17a))?.['addEventListener'](_0x39bbac(0x165),()=>{const _0x11fc82=_0x39bbac;document[_0x11fc82(0x132)]('add-binding-form')[_0x11fc82(0x187)]=![],document['getElementById'](_0x11fc82(0x17a))[_0x11fc82(0x187)]=!![],populateBindingForm();}),document[_0x39bbac(0x132)](_0x39bbac(0x118))?.['addEventListener'](_0x39bbac(0x165),()=>{const _0x30f10e=_0x39bbac;document[_0x30f10e(0x132)](_0x30f10e(0xfb))[_0x30f10e(0x187)]=!![],document[_0x30f10e(0x132)]('add-binding-btn')[_0x30f10e(0x187)]=![];}),document[_0x39bbac(0x132)](_0x39bbac(0x185))?.['addEventListener'](_0x39bbac(0x165),saveBinding),document[_0x39bbac(0x132)](_0x39bbac(0x163))?.['addEventListener'](_0x39bbac(0x165),hideDeleteModal),document[_0x39bbac(0x132)](_0x39bbac(0x14f))?.[_0x39bbac(0x17f)](_0x39bbac(0x165),hideDeleteModal),document['getElementById']('confirm-delete-team')?.[_0x39bbac(0x17f)](_0x39bbac(0x165),confirmDeleteTeam),document[_0x39bbac(0x14d)](_0x39bbac(0x161))?.[_0x39bbac(0x17f)]('click',hideDeleteModal);}function showCreateTeamModal(){const _0x52a022=_0x3de7a2;state[_0x52a022(0x139)]=null,state[_0x52a022(0x154)]=_0x52a022(0x196),document[_0x52a022(0x132)]('team-modal-title')[_0x52a022(0x12f)]='Create\x20Team',document[_0x52a022(0x132)](_0x52a022(0x177))['value']='',document[_0x52a022(0x132)]('team-name')[_0x52a022(0x159)]=![],document['getElementById'](_0x52a022(0x15e))[_0x52a022(0x18e)]='',document[_0x52a022(0x132)](_0x52a022(0x15e))[_0x52a022(0x159)]=![],document[_0x52a022(0x132)](_0x52a022(0x168))[_0x52a022(0x187)]=!![],document[_0x52a022(0x132)](_0x52a022(0x145))[_0x52a022(0x187)]=!![],document['getElementById'](_0x52a022(0x130))['hidden']=!![],document[_0x52a022(0x132)](_0x52a022(0x19c))[_0x52a022(0x187)]=![],document['getElementById']('team-modal-footer')[_0x52a022(0x187)]=![],showTab('details'),document['getElementById']('team-modal')[_0x52a022(0x187)]=![],setTimeout(()=>document[_0x52a022(0x132)](_0x52a022(0x177))['focus'](),0x64);}window[_0x3de7a2(0x12a)]=function(_0x39bf72){const _0x1d532e=_0x3de7a2,_0x4433a1=state[_0x1d532e(0x108)][_0x1d532e(0x115)](_0xaf9a8b=>_0xaf9a8b['id']===_0x39bf72);if(!_0x4433a1)return;state[_0x1d532e(0x139)]=_0x39bf72,state[_0x1d532e(0x154)]=_0x1d532e(0x196);const _0x1bfa21=state['currentUser']?.[_0x1d532e(0x17c)],_0x45a1a8=(_0x4433a1['managers']||[])[_0x1d532e(0x10b)](state['currentUser']?.['id']),_0xd8c86c=_0x1bfa21||_0x45a1a8;document[_0x1d532e(0x132)]('team-modal-title')[_0x1d532e(0x12f)]=_0x4433a1['name'],document[_0x1d532e(0x132)](_0x1d532e(0x177))[_0x1d532e(0x18e)]=_0x4433a1[_0x1d532e(0x13d)],document[_0x1d532e(0x132)]('team-name')[_0x1d532e(0x159)]=!_0xd8c86c,document[_0x1d532e(0x132)](_0x1d532e(0x15e))[_0x1d532e(0x18e)]=_0x4433a1[_0x1d532e(0x11e)]||'',document[_0x1d532e(0x132)](_0x1d532e(0x15e))[_0x1d532e(0x159)]=!_0xd8c86c,document[_0x1d532e(0x132)](_0x1d532e(0x168))['hidden']=!![],document['getElementById']('team-modal-tabs')[_0x1d532e(0x187)]=![],document[_0x1d532e(0x132)](_0x1d532e(0x130))[_0x1d532e(0x187)]=![],document[_0x1d532e(0x132)](_0x1d532e(0x19c))[_0x1d532e(0x187)]=!_0xd8c86c,document['getElementById']('managers-section')[_0x1d532e(0x187)]=!_0x1bfa21,setActiveTabButton('details'),renderMembersList(_0x4433a1),updateMemberSelect(_0x4433a1),_0x1bfa21&&(renderManagersList(_0x4433a1),updateManagerSelect(_0x4433a1)),showTab(_0x1d532e(0x196)),document[_0x1d532e(0x132)](_0x1d532e(0x126))[_0x1d532e(0x187)]=![];};function hideTeamModal(){const _0x231b95=_0x3de7a2;document['getElementById'](_0x231b95(0x126))['hidden']=!![],document[_0x231b95(0x132)](_0x231b95(0x177))[_0x231b95(0x159)]=![],document[_0x231b95(0x132)](_0x231b95(0x15e))['disabled']=![],state['editingTeamId']=null;}function switchTab(_0x21fe7b){const _0x59cc3b=_0x3de7a2;state[_0x59cc3b(0x154)]=_0x21fe7b,setActiveTabButton(_0x21fe7b),showTab(_0x21fe7b),_0x21fe7b===_0x59cc3b(0x192)&&state[_0x59cc3b(0x139)]&&loadTeamBindings(state[_0x59cc3b(0x139)]);}function setActiveTabButton(_0xa3c8c7){const _0x3e2060=_0x3de7a2;document[_0x3e2060(0x121)](_0x3e2060(0x152))[_0x3e2060(0x160)](_0x47d362=>{const _0x2e8814=_0x3e2060,_0x3d00d2=_0x47d362[_0x2e8814(0x19f)][_0x2e8814(0x194)]===_0xa3c8c7;_0x47d362['style'][_0x2e8814(0x15f)]=_0x3d00d2?_0x2e8814(0x170):'transparent',_0x47d362['style'][_0x2e8814(0x18b)]=_0x3d00d2?_0x2e8814(0x170):_0x2e8814(0x153),_0x47d362[_0x2e8814(0x11f)][_0x2e8814(0x16e)]=_0x3d00d2?_0x2e8814(0x19b):_0x2e8814(0x125);});}function showTab(_0x4b18b5){const _0x3a46f2=_0x3de7a2;document[_0x3a46f2(0x132)]('team-tab-details')['hidden']=_0x4b18b5!==_0x3a46f2(0x196),document[_0x3a46f2(0x132)](_0x3a46f2(0x143))[_0x3a46f2(0x187)]=_0x4b18b5!==_0x3a46f2(0x192),document[_0x3a46f2(0x132)](_0x3a46f2(0x15c))[_0x3a46f2(0x187)]=_0x4b18b5===_0x3a46f2(0x192);}function renderMembersList(_0x4ea057){const _0x505c87=_0x3de7a2,_0xbeaf67=state[_0x505c87(0x1a4)]?.[_0x505c87(0x17c)],_0x2a6dcd=(_0x4ea057[_0x505c87(0x167)]||[])[_0x505c87(0x10b)](state[_0x505c87(0x1a4)]?.['id']),_0x230485=_0xbeaf67||_0x2a6dcd,_0x260c31=_0x4ea057[_0x505c87(0x17d)]||[],_0x56ba3a=document[_0x505c87(0x132)](_0x505c87(0x10c));if(_0x260c31[_0x505c87(0xfc)]===0x0){_0x56ba3a[_0x505c87(0x16c)]=_0x505c87(0x109);return;}_0x56ba3a[_0x505c87(0x16c)]=_0x260c31[_0x505c87(0x151)](_0xc8ad14=>{const _0xeaa038=_0x505c87,_0x244648=state[_0xeaa038(0x173)][_0xeaa038(0x115)](_0x1cb9ff=>_0x1cb9ff['id']===_0xc8ad14),_0x3364ed=_0x244648?''+Utils[_0xeaa038(0x141)](_0x244648[_0xeaa038(0x11c)])+(_0x244648[_0xeaa038(0x13d)]?'\x20<span\x20style=\x22color:\x20var(--color-text-secondary);\x20font-size:\x200.85em;\x22>('+Utils[_0xeaa038(0x141)](_0x244648[_0xeaa038(0x13d)])+_0xeaa038(0x195):''):Utils[_0xeaa038(0x141)](_0xc8ad14),_0x348ff5=(_0x4ea057[_0xeaa038(0x167)]||[])[_0xeaa038(0x10b)](_0xc8ad14);return _0xeaa038(0x122)+_0x3364ed+_0xeaa038(0x13e)+(_0x348ff5?'<span\x20class=\x22tag\x22\x20style=\x22margin-left:\x200.4rem;\x20font-size:\x200.7em;\x20padding:\x200.1em\x200.4em;\x22>manager</span>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x230485?_0xeaa038(0x148)+_0xc8ad14+_0xeaa038(0x149):'')+'\x0a\x20\x20\x20\x20\x20\x20</div>';})[_0x505c87(0x11d)]('');const _0x2a8f73=document[_0x505c87(0x132)]('add-member-row');if(_0x2a8f73)_0x2a8f73[_0x505c87(0x11f)][_0x505c87(0x128)]=_0x230485?_0x505c87(0x169):_0x505c87(0x10a);}function renderManagersList(_0x587ccf){const _0x2165dd=_0x3de7a2,_0x23ee3e=_0x587ccf[_0x2165dd(0x167)]||[],_0x152ab1=document[_0x2165dd(0x132)](_0x2165dd(0x135));if(_0x23ee3e[_0x2165dd(0xfc)]===0x0){_0x152ab1[_0x2165dd(0x16c)]=_0x2165dd(0x1a1);return;}_0x152ab1[_0x2165dd(0x16c)]=_0x23ee3e[_0x2165dd(0x151)](_0x3ca3d1=>{const _0x4fad66=_0x2165dd,_0x7b9840=state[_0x4fad66(0x173)][_0x4fad66(0x115)](_0x3806e8=>_0x3806e8['id']===_0x3ca3d1),_0x1e98dc=_0x7b9840?Utils[_0x4fad66(0x141)](_0x7b9840[_0x4fad66(0x11c)]):Utils[_0x4fad66(0x141)](_0x3ca3d1);return _0x4fad66(0x178)+_0x1e98dc+_0x4fad66(0x16d)+_0x3ca3d1+'\x27)\x22\x20style=\x22color:\x20var(--color-danger);\x20padding:\x200.15rem\x200.4rem;\x20font-size:\x200.8rem;\x22>Remove</button>\x0a\x20\x20\x20\x20\x20\x20</div>';})[_0x2165dd(0x11d)]('');}function updateMemberSelect(_0x4f9e95){const _0x5acac0=_0x3de7a2,_0x3d8cb3=document[_0x5acac0(0x132)](_0x5acac0(0x10e));if(!_0x3d8cb3)return;const _0x2a505a=new Set(_0x4f9e95[_0x5acac0(0x17d)]||[]),_0x3bcaf1=state[_0x5acac0(0x173)]['filter'](_0x29ad2a=>!_0x2a505a[_0x5acac0(0x181)](_0x29ad2a['id']));_0x3d8cb3[_0x5acac0(0x16c)]='<option\x20value=\x22\x22>Add\x20a\x20member…</option>'+_0x3bcaf1[_0x5acac0(0x151)](_0x895cd7=>'<option\x20value=\x22'+_0x895cd7['id']+'\x22>'+Utils[_0x5acac0(0x141)](_0x895cd7[_0x5acac0(0x11c)])+(_0x895cd7[_0x5acac0(0x13d)]?'\x20('+Utils[_0x5acac0(0x141)](_0x895cd7[_0x5acac0(0x13d)])+')':'')+'</option>')[_0x5acac0(0x11d)]('');}function updateManagerSelect(_0x2331df){const _0x17fe78=_0x3de7a2,_0x1c01de=document[_0x17fe78(0x132)](_0x17fe78(0x1a7));if(!_0x1c01de)return;const _0x2c2e72=new Set(_0x2331df[_0x17fe78(0x167)]||[]),_0x10d951=(_0x2331df['members']||[])['filter'](_0x3cc1e1=>!_0x2c2e72[_0x17fe78(0x181)](_0x3cc1e1))[_0x17fe78(0x151)](_0x454fb8=>state['users'][_0x17fe78(0x115)](_0xa4fa3c=>_0xa4fa3c['id']===_0x454fb8))['filter'](Boolean);_0x1c01de[_0x17fe78(0x16c)]='<option\x20value=\x22\x22>Promote\x20a\x20member\x20to\x20manager…</option>'+_0x10d951[_0x17fe78(0x151)](_0x4d6eb7=>_0x17fe78(0x14c)+_0x4d6eb7['id']+'\x22>'+Utils['escapeHtml'](_0x4d6eb7[_0x17fe78(0x11c)])+_0x17fe78(0x175))[_0x17fe78(0x11d)]('');}async function addMember(){const _0x3084ea=_0x3de7a2,_0x2dd864=document['getElementById'](_0x3084ea(0x10e)),_0x29f640=_0x2dd864[_0x3084ea(0x18e)];if(!_0x29f640||!state[_0x3084ea(0x139)])return;try{const {team:_0x4aace2}=await API[_0x3084ea(0x164)](state[_0x3084ea(0x139)],_0x29f640);syncTeamInState(_0x4aace2),renderMembersList(_0x4aace2),updateMemberSelect(_0x4aace2),state[_0x3084ea(0x1a4)]?.[_0x3084ea(0x17c)]&&(renderManagersList(_0x4aace2),updateManagerSelect(_0x4aace2)),_0x2dd864[_0x3084ea(0x18e)]='',Utils[_0x3084ea(0x10d)]('Member\x20added',_0x3084ea(0x176));}catch(_0x3826e9){Utils['showToast'](_0x3826e9[_0x3084ea(0x166)],_0x3084ea(0x113));}}async function addManager(){const _0x408833=_0x3de7a2,_0x3f2bee=document['getElementById'](_0x408833(0x1a7)),_0x452d42=_0x3f2bee[_0x408833(0x18e)];if(!_0x452d42||!state[_0x408833(0x139)])return;try{const {team:_0x4bd1c2}=await API[_0x408833(0x10f)](state[_0x408833(0x139)],_0x452d42);syncTeamInState(_0x4bd1c2),renderMembersList(_0x4bd1c2),renderManagersList(_0x4bd1c2),updateManagerSelect(_0x4bd1c2),_0x3f2bee[_0x408833(0x18e)]='',Utils[_0x408833(0x10d)]('Manager\x20added','success');}catch(_0x207ad7){Utils[_0x408833(0x10d)](_0x207ad7[_0x408833(0x166)],_0x408833(0x113));}}window['removeMemberClick']=async function(_0x132052){const _0x514bb1=_0x3de7a2;if(!state[_0x514bb1(0x139)])return;try{const {team:_0x55ca8c}=await API[_0x514bb1(0x1a6)](state['editingTeamId'],_0x132052);syncTeamInState(_0x55ca8c),renderMembersList(_0x55ca8c),updateMemberSelect(_0x55ca8c),state[_0x514bb1(0x1a4)]?.[_0x514bb1(0x17c)]&&(renderManagersList(_0x55ca8c),updateManagerSelect(_0x55ca8c)),Utils['showToast']('Member\x20removed',_0x514bb1(0x176));}catch(_0x5e073e){Utils[_0x514bb1(0x10d)](_0x5e073e[_0x514bb1(0x166)],_0x514bb1(0x113));}},window['removeManagerClick']=async function(_0x249b5a){const _0x35a1b6=_0x3de7a2;if(!state['editingTeamId'])return;try{const {team:_0x290f0b}=await API[_0x35a1b6(0x17e)](state[_0x35a1b6(0x139)],_0x249b5a);syncTeamInState(_0x290f0b),renderManagersList(_0x290f0b),updateManagerSelect(_0x290f0b),Utils[_0x35a1b6(0x10d)]('Manager\x20removed',_0x35a1b6(0x176));}catch(_0x29f7e5){Utils['showToast'](_0x29f7e5['message'],_0x35a1b6(0x113));}};async function loadTeamBindings(_0x13c73a){const _0x22f768=_0x3de7a2,_0x1adb2c=document[_0x22f768(0x132)](_0x22f768(0x16f)),_0x5e2b9b=document[_0x22f768(0x132)](_0x22f768(0x103)),_0x2b1864=document['getElementById'](_0x22f768(0x147)),_0xdee0d=document[_0x22f768(0x132)](_0x22f768(0x17a));_0x1adb2c[_0x22f768(0x187)]=![],_0x5e2b9b[_0x22f768(0x187)]=!![],_0x2b1864[_0x22f768(0x11f)][_0x22f768(0x128)]=_0x22f768(0x10a),_0xdee0d[_0x22f768(0x187)]=!![],document[_0x22f768(0x132)](_0x22f768(0xfb))[_0x22f768(0x187)]=!![];try{const {bindings:_0x2e8f26}=await API[_0x22f768(0x137)]({'subject_type':_0x22f768(0x127),'subject_id':_0x13c73a});state[_0x22f768(0x171)]=_0x2e8f26||[],_0x1adb2c[_0x22f768(0x187)]=!![],state[_0x22f768(0x171)]['length']===0x0?_0x5e2b9b['hidden']=![]:(_0x2b1864[_0x22f768(0x11f)][_0x22f768(0x128)]='',renderBindingsTable()),state[_0x22f768(0x1a4)]?.[_0x22f768(0x17c)]&&(_0xdee0d['hidden']=![]);}catch(_0x203438){_0x1adb2c['hidden']=!![],Utils['showToast'](_0x22f768(0x120)+_0x203438['message'],_0x22f768(0x113));}}function _0x59f6(){const _0x2c128d=['pc9VChrPB24+','C3vJy2vZCW','DgvHBs1Uyw1L','cIaGicaGidXKAxyGC3r5Bgu9iMrPC3bSyxK6igzSzxG7igfSAwDUlwL0zw1ZoIbJzw50zxi7igP1C3rPzNKTy29UDgvUDdOGC3bHy2uTyMv0D2vLBJSGCgfKzgLUzZOGmc4ZnxjLBsaWoYbIB3jKzxiTyM90Dg9ToIaXChGGC29SAwqGDMfYkc0Ty29SB3iTyM9YzgvYktSIpGOGicaGicaGidXZCgfUihn0EwXLpsjMB250lxnPEMu6idaUodC1CMvToYi+','zgvSzxrPBMDuzwfTswq','ywrKlwjPBMrPBMCTyNrU','ntm1mJy2wwrxwfDg','Axntzxj2zxjbzg1PBG','BwvTyMvYCW','CMvTB3zLvgvHBu1HBMfNzxi','ywrKrxzLBNrmAxn0zw5LCG','pgj1DhrVBIbJBgfZCZ0IyNrUlwDOB3n0igj0BI1ZBwfSBciGB25JBgLJAZ0ID2LUzg93lMrLBgv0zvrLyw0OjW','AgfZ','yMLUzgLUzY1LBNzPCM9UBwvUDa','cIaGicaGidX0CJ4kicaGicaGica8Dgq+cIaGicaGicaGica8yNv0Dg9UignSyxnZpsjIDg4Tz2HVC3qGyNrUlxnTywXSiIbZDhLSzt0IzM9UDc13zwLNAhq6idyWmdSGCgfKzgLUzZOGmdSGDgv4Dc1KzwnVCMf0Aw9UoIb1BMrLCMXPBMu7ihrLEhqTzgvJB3jHDgLVBI1ZDhLSztOGzg90DgvKoYikicaGicaGicaGicaGB25JBgLJAZ0ID2LUzg93lM9Wzw5uzwfTtw9KywWOjW','zMLUzeLUzgv4','C2f2zs1IAw5KAw5Nlwj0BG','DgvHBxmTzxjYB3i','AgLKzgvU','vgvHBsbUyw1LigLZihjLCxvPCMvK','mtCYmdy1s2DxC3PT','pc90zd4kicaGicaGica8Dgq+','y29SB3i','qMLUzgLUzYbYzw1VDMvK','yMLUzgLUz3mTDgfIBguTyM9KEq','DMfSDwu','DgvHBxmTzxjYB3iTBwvZC2fNzq','CM9Szxm','cIaGicaGicaGica8l2j1DhrVBJ4kicaGicaGicaGia','yMLUzgLUz3m','jYKIpKrLBgv0ztWVyNv0Dg9UpG','DgfI','ktWVC3bHBJ4','zgv0ywLSCW','ywXS','ihrLyw0','cIaGicaGicaGicaGia','z2v0uM9SzurLzMLUAxrPB25Z','nJaW','C2f2zs10zwfT','zgvSzxrLlxrLyw0TBMfTzq','ywrKlw1HBMfNzxiTyNrU','zgf0yxnLDa','DhjPBq','phaGC3r5Bgu9iMzVBNqTC2L6ztOGmc44nZvYzw07ignVBg9YoIb2yxiOls1JB2XVCI10zxH0lxnLy29UzgfYEsK7ig1HCMDPBJOGmc4YnxjLBsaWoYi+tM8GBwfUywDLCNm8l3a+','zgvSzxrLqMLUzgLUz0nSAwnR','pc90zd4kicaGicaGphrKpG','y3vYCMvUDfvZzxi','DgvHBs1TB2rHBc10AxrSzq','CMvTB3zLvgvHBu1LBwjLCG','ywrKlw1HBMfNzxiTC2vSzwn0','ywrKlwjPBMrPBMCTzM9YBq','BgvUz3rO','mtm0mJmZog9wC2fdBq','rgvSzxrPBMFIGky','u2f2Aw5N4OcM','AhjLzG','zgvSzxrLlxrLyw0TBw9KywW','nti0ntuZsuP2t0v5','yMLUzgLUz3mTzw1WDhK','pgrPDIbZDhLSzt0IzM9UDc1ZAxPLoIaWlJHLBtSGy29SB3i6ihzHCIGTlwnVBg9YlxrLEhqTC2vJB25Kyxj5ktSGBwfYz2LUlxrVCdOGmc4XnxjLBtSIpG','z2v0rw52AxjVBM1LBNrZ','pgj1DhrVBIbJBgfZCZ0IyNrUlxnLy29UzgfYEsbIDg4TC21HBgWIig9Uy2XPy2S9iNDPBMrVDY5VCgvUvgvHBu1VzgfSkcC','zgvSzxrLvgvHBq','DgvHBxm','phaGC3r5Bgu9iMzVBNqTC2L6ztOGmc44nZvYzw07ignVBg9YoIb2yxiOls1JB2XVCI10zxH0lxnLy29UzgfYEsK7ig1HCMDPBJOGmc4YnxjLBsaWoYi+tM8GBwvTyMvYCYb5zxq8l3a+','BM9Uzq','Aw5JBhvKzxm','BwvTyMvYCY1SAxn0','C2HVD1rVyxn0','ywrKlw1LBwjLCI1ZzwXLy3q','ywrKvgvHBu1HBMfNzxi','y2fUy2vSlxrLyw0','BwfUywDLCL9Uyw1LCW','pg9WDgLVBIb2ywX1zt0IiJ5bBgWGzw52AxjVBM1LBNrZigfSCMvHzhKGyM91BMq8l29WDgLVBJ4','zxjYB3i','ywrKlw1LBwjLCI1IDg4','zMLUza','re9nq29UDgvUDeXVywrLza','cIaGicaGidWVDgq+cIaGica8l3rYpG','y2fUy2vSlwjPBMrPBMCTyNrU','zMLSDgvY','i3rLyw0TBw9KywWGlM1VzgfSlw92zxjSyxK','Bg9JyxrPB24','DxnLCM5HBwu','AM9PBG','zgvZy3jPChrPB24','C3r5Bgu','rMfPBgvKihrVigXVywqGyMLUzgLUz3m6ia','CxvLCNLtzwXLy3rVCKfSBa','cIaGicaGidXKAxyGC3r5Bgu9iMrPC3bSyxK6igzSzxG7igfSAwDUlwL0zw1ZoIbJzw50zxi7igP1C3rPzNKTy29UDgvUDdOGC3bHy2uTyMv0D2vLBJSGCgfKzgLUzZOGmc4ZnxjLBsaWoYbIB3jKzxiTyM90Dg9ToIaXChGGC29SAwqGDMfYkc0Ty29SB3iTyM9YzgvYktSIpGOGicaGicaGidXZCgfUihn0EwXLpsjMB250lxnPEMu6idaUodC1CMvToYi+cIaGicaGicaGica','y3jLyxrLlxrLyw0TyNrU','yMLUzgLUzY1YB2XL','BM9YBwfS','DgvHBs1TB2rHBa','DgvHBq','zgLZCgXHEq','Bg9NAw4UAhrTBa','B3bLBLrLyw1nB2rHBa','vgvHBsbKzwXLDgvK','y3jLyxrLqMLUzgLUzW','zw52AxjVBM1LBNq','mZy0nJnjt2ntBwK','Dgv4DenVBNrLBNq','BwvTyMvYCY1Zzwn0Aw9U','z2v0q3vYCMvUDfvZzxi','z2v0rwXLBwvUDej5swq','qwrKAw5N4OcM','DxbKyxrLvgvHBq','BwfUywDLCNmTBgLZDa','pc90zd4kicaGicaGica8Dgq+cIaGicaGicaGica8zgL2ignSyxnZpsj1C2vYlwfJDgLVBNmIpGOGicaGicaGicaGica','z2v0qMLUzgLUz3m','mxH1tgvttG','zwrPDgLUz1rLyw1jza','CMv0CNKTDgvHBxmTyNrU','zw52AxjVBM1LBNrZ','DgvHBs1JB3vUDa','BMfTzq','cIaGicaGicaGica','mJbJuevVzw8','ntzHu29osKi','zxnJyxbLshrTBa','q2XPy2SGphn0CM9UzZ5dCMvHDguGvgvHBtWVC3rYB25NpIb0BYbNzxqGC3rHCNrLzc4','DgvHBs10ywiTyMLUzgLUz3m','z2v0vgvHBxm','DgvHBs1TB2rHBc10ywjZ','pgj1DhrVBIbJBgfZCZ0IyNrUlwDOB3n0igj0BI1ZBwfSBciGB25JBgLJAZ0ID2LUzg93lMrLBgv0zujPBMrPBMDdBgLJAYGN','yMLUzgLUz3mTBgLZDc1JB250ywLUzxi','pgj1DhrVBIb0ExbLpsjIDxr0B24IignSyxnZpsjIDg4Tz2HVC3qGyNrUlxnTywXSiIbVBMnSAwnRpsj3Aw5KB3CUCMvTB3zLtwvTyMvYq2XPy2SOjW','jYKIihn0EwXLpsjJB2XVCJOGDMfYkc0Ty29SB3iTzgfUz2vYktSGCgfKzgLUzZOGmc4XnxjLBsaWlJrYzw07igzVBNqTC2L6ztOGmc44CMvToYi+uMvTB3zLpc9IDxr0B24+','ndK0odeZrvj5zfLL','cIaGicaGidX0CJ4kicaGicaGica8DgqGy29SC3bHBJ0InciGC3r5Bgu9iNrLEhqTywXPz246ignLBNrLCJSGy29SB3i6ihzHCIGTlwnVBg9YlxrLEhqTC2vJB25Kyxj5ktSGCgfKzgLUzZOGmNjLBtSIpGOGicaGicaGicaGtM8GDgvHBxmGEwv0lGOGicaGicaGicaG','pg9WDgLVBIb2ywX1zt0I','CxvLCNLtzwXLy3rVCG','mtuWBK5fs0Px','y2fUy2vSlwrLBgv0zs10zwfT','rMfPBgvKihrVigrLBgv0zsb0zwfToIa','BwfW','lM1VzgfSlxrHyI1IDg4','DMfYkc0Ty29SB3iTDgv4Dc1ZzwnVBMrHCNKP','ywn0AxzLvgfI','q3jLyxrPBMFIGky','qMLUzgLUzYbHzgrLza','ndy4mZiYqKftAvLu','vgvHBsbJCMvHDgvK','zgLZywjSzwq','y2XVC2uTDgvHBs1TB2rHBa','y29UzMLYBs1KzwXLDguTDgvHBq','DgvHBs1TB2rHBc1MB290zxi','CM9Szv9Uyw1L','DgvHBs1KzxnJCMLWDgLVBG','yM9YzgvYqM90Dg9Tq29SB3i','zM9YrwfJAa','i2rLBgv0zs10zwfTlw1VzgfSic5TB2rHBc1VDMvYBgf5','z2v0vxnLCNm','y2XVC2uTzgvSzxrLlxrLyw0TBw9KywW','ywrKvgvHBu1LBwjLCG','y2XPy2S','BwvZC2fNzq','BwfUywDLCNm','DgvHBs1MB3jTlwvYCM9Y','zMXLEa','zgvSzxrLqMLUzgLUzW','rgvSzxrLifrLyw0','Aw5Uzxjive1m','pc9ZCgfUpGOGicaGicaGidXIDxr0B24GDhLWzt0IyNv0Dg9UiIbJBgfZCZ0IyNrUlwDOB3n0igj0BI1ZBwfSBciGB25JBgLJAZ0ID2LUzg93lNjLBw92zu1HBMfNzxjdBgLJAYGN','zM9UDfDLAwDODa','yMLUzgLUz3mTBg9HzgLUzW','DMfYkc0Ty29SB3iTChjPBwfYEsK','DgvHBujPBMrPBMDZ','pc90zd4kicaGicaGphrKpGOGicaGicaGia','DxnLCNm','cIaGicaGicaGpc90zd4kicaGicaGica8Dgq+'];_0x59f6=function(){return _0x2c128d;};return _0x59f6();}function renderBindingsTable(){const _0x1200a9=_0x3de7a2,_0x16886d=document[_0x1200a9(0x132)](_0x1200a9(0x18d));if(!_0x16886d)return;const _0x539d8e=state['currentUser']?.['isServerAdmin'];_0x16886d[_0x1200a9(0x16c)]=state['teamBindings'][_0x1200a9(0x151)](_0x390bab=>'\x0a\x20\x20\x20\x20<tr>\x0a\x20\x20\x20\x20\x20\x20<td>'+Utils['escapeHtml'](_0x390bab[_0x1200a9(0x12d)])+_0x1200a9(0x1a3)+Utils[_0x1200a9(0x141)](_0x390bab[_0x1200a9(0x15d)]||_0x390bab['role_id'])+_0x1200a9(0x172)+(_0x539d8e?_0x1200a9(0x146)+_0x390bab['id']+'\x27)\x22\x20style=\x22color:\x20var(--color-danger);\x22>Remove</button>':'—')+_0x1200a9(0x117))['join']('');}function populateBindingForm(){const _0x128ef3=_0x3de7a2,_0x301473=document['getElementById'](_0x128ef3(0x182)),_0x2a79e0=document[_0x128ef3(0x132)](_0x128ef3(0x124)),_0x237612=new Set(state[_0x128ef3(0x171)][_0x128ef3(0x151)](_0x50253e=>_0x50253e[_0x128ef3(0x12d)])),_0x19c859=state[_0x128ef3(0x13b)][_0x128ef3(0x119)](_0xa66872=>!_0x237612[_0x128ef3(0x181)](_0xa66872[_0x128ef3(0x13d)]));_0x301473[_0x128ef3(0x16c)]=_0x19c859[_0x128ef3(0xfc)]?_0x19c859[_0x128ef3(0x151)](_0x398ff7=>_0x128ef3(0x14c)+Utils[_0x128ef3(0x141)](_0x398ff7[_0x128ef3(0x13d)])+'\x22>'+Utils['escapeHtml'](_0x398ff7[_0x128ef3(0x13d)])+_0x128ef3(0x175))[_0x128ef3(0x11d)](''):_0x128ef3(0x112),_0x2a79e0[_0x128ef3(0x16c)]=state['roles'][_0x128ef3(0x151)](_0x42c972=>_0x128ef3(0x14c)+_0x42c972['id']+'\x22>'+Utils['escapeHtml'](_0x42c972['name'])+'</option>')[_0x128ef3(0x11d)]('');}async function saveBinding(){const _0x484808=_0x3de7a2,_0x1d8cdf=document[_0x484808(0x132)](_0x484808(0x182))[_0x484808(0x18e)],_0x134d98=document[_0x484808(0x132)](_0x484808(0x124))['value'];if(!_0x1d8cdf||!_0x134d98||!state[_0x484808(0x139)])return;const _0x196c47=document['getElementById'](_0x484808(0x185));_0x196c47[_0x484808(0x159)]=!![],_0x196c47[_0x484808(0x12f)]=_0x484808(0x133);try{await API[_0x484808(0x12c)]({'subject_type':'team','subject_id':state['editingTeamId'],'role_id':_0x134d98,'environment':_0x1d8cdf}),Utils[_0x484808(0x10d)](_0x484808(0x156),_0x484808(0x176)),document[_0x484808(0x132)]('add-binding-form')[_0x484808(0x187)]=!![],document[_0x484808(0x132)](_0x484808(0x17a))[_0x484808(0x187)]=![],await loadTeamBindings(state[_0x484808(0x139)]);}catch(_0x44a331){Utils['showToast'](_0x44a331[_0x484808(0x166)],_0x484808(0x113));}finally{_0x196c47[_0x484808(0x159)]=![],_0x196c47[_0x484808(0x12f)]='Add\x20Binding';}}window[_0x3de7a2(0x1a2)]=async function(_0x860b92){const _0x5b0017=_0x3de7a2;try{await API[_0x5b0017(0x16a)](_0x860b92),Utils[_0x5b0017(0x10d)](_0x5b0017(0x18c),'success'),await loadTeamBindings(state[_0x5b0017(0x139)]);}catch(_0xf24c03){Utils[_0x5b0017(0x10d)](_0xf24c03['message'],_0x5b0017(0x113));}};async function saveTeam(){const _0x3e5152=_0x3de7a2,_0x1d6da2=document[_0x3e5152(0x132)](_0x3e5152(0x177))['value'][_0x3e5152(0x1a0)](),_0x4edc66=document[_0x3e5152(0x132)](_0x3e5152(0x15e))['value']['trim'](),_0x9b7ef3=document[_0x3e5152(0x132)](_0x3e5152(0x168)),_0x12ef3a=document['getElementById'](_0x3e5152(0x19c));if(!_0x1d6da2){_0x9b7ef3[_0x3e5152(0x12f)]=_0x3e5152(0x188),_0x9b7ef3['hidden']=![];return;}_0x9b7ef3['hidden']=!![];const _0x20c196=_0x12ef3a['textContent'];_0x12ef3a[_0x3e5152(0x159)]=!![],_0x12ef3a[_0x3e5152(0x12f)]=state[_0x3e5152(0x139)]?_0x3e5152(0xff):_0x3e5152(0x155);try{if(state[_0x3e5152(0x139)]){const {team:_0x9061b1}=await API[_0x3e5152(0x134)](state[_0x3e5152(0x139)],{'name':_0x1d6da2,'description':_0x4edc66});syncTeamInState(_0x9061b1),document[_0x3e5152(0x132)](_0x3e5152(0x1a5))[_0x3e5152(0x12f)]=_0x9061b1[_0x3e5152(0x13d)],Utils[_0x3e5152(0x10d)]('Team\x20updated',_0x3e5152(0x176));}else await API['createTeam']({'name':_0x1d6da2,'description':_0x4edc66}),Utils[_0x3e5152(0x10d)](_0x3e5152(0x158),_0x3e5152(0x176)),hideTeamModal(),await loadTeams();state[_0x3e5152(0x139)]&&(_0x12ef3a[_0x3e5152(0x159)]=![],_0x12ef3a['textContent']=_0x20c196);}catch(_0xdd7cce){_0x9b7ef3[_0x3e5152(0x12f)]=_0xdd7cce[_0x3e5152(0x166)],_0x9b7ef3[_0x3e5152(0x187)]=![],_0x12ef3a[_0x3e5152(0x159)]=![],_0x12ef3a[_0x3e5152(0x12f)]=_0x20c196;}}window[_0x3de7a2(0x107)]=function(_0x35ae22){const _0xc93db7=_0x3de7a2,_0x94d7c7=state['teams'][_0xc93db7(0x115)](_0x32c464=>_0x32c464['id']===_0x35ae22);if(!_0x94d7c7)return;state[_0xc93db7(0x179)]=_0x35ae22,document[_0xc93db7(0x132)](_0xc93db7(0x19d))[_0xc93db7(0x12f)]=_0x94d7c7['name'],document['getElementById'](_0xc93db7(0x101))[_0xc93db7(0x187)]=![];};function hideDeleteModal(){const _0x2a837e=_0x3de7a2;document[_0x2a837e(0x132)](_0x2a837e(0x101))[_0x2a837e(0x187)]=!![],state[_0x2a837e(0x179)]=null;}async function confirmDeleteTeam(){const _0x57212c=_0x3de7a2;if(!state[_0x57212c(0x179)])return;const _0x433db7=document[_0x57212c(0x132)](_0x57212c(0x15b));_0x433db7['disabled']=!![],_0x433db7[_0x57212c(0x12f)]=_0x57212c(0xfe);try{await API[_0x57212c(0x107)](state[_0x57212c(0x179)]),Utils['showToast'](_0x57212c(0x12b),_0x57212c(0x176)),hideDeleteModal(),await loadTeams();}catch(_0x5da6ce){Utils[_0x57212c(0x10d)](_0x57212c(0x150)+_0x5da6ce[_0x57212c(0x166)],_0x57212c(0x113)),_0x433db7[_0x57212c(0x159)]=![],_0x433db7[_0x57212c(0x12f)]=_0x57212c(0x16b);}}function syncTeamInState(_0x7e7189){const _0x2b55d8=_0x3de7a2,_0x33564e=state['teams'][_0x2b55d8(0x184)](_0x58479a=>_0x58479a['id']===_0x7e7189['id']);if(_0x33564e>=0x0)state[_0x2b55d8(0x108)][_0x33564e]=_0x7e7189;renderTeams();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const _0x3703c1=_0x36ad;(function(_0x2bbc1a,_0x3cc71d){const _0x5afab6=_0x36ad,_0x2ab3f9=_0x2bbc1a();while(!![]){try{const _0x1d845a=-parseInt(_0x5afab6(0x222))/0x1*(parseInt(_0x5afab6(0x233))/0x2)+parseInt(_0x5afab6(0x237))/0x3*(-parseInt(_0x5afab6(0x23a))/0x4)+-parseInt(_0x5afab6(0x236))/0x5+parseInt(_0x5afab6(0x212))/0x6+parseInt(_0x5afab6(0x23b))/0x7+-parseInt(_0x5afab6(0x1f2))/0x8+-parseInt(_0x5afab6(0x21b))/0x9*(-parseInt(_0x5afab6(0x1e6))/0xa);if(_0x1d845a===_0x3cc71d)break;else _0x2ab3f9['push'](_0x2ab3f9['shift']());}catch(_0x585737){_0x2ab3f9['push'](_0x2ab3f9['shift']());}}}(_0xa62e,0x8a070));import{API,Utils}from'./app.js';import{Terminal}from'https://cdn.jsdelivr.net/npm/xterm@5.3.0/+esm';function _0xa62e(){const _0xe05b40=['DgvYBwLUywWTC3rHDhvZ','zgf0yq','B25eyxrH','zw52AxjVBM1LBNq','DgvYBwLUywWTDgL0Bgu','C3rHCNrZv2L0Aa','Aw5MBW','D3jPDgu','imk3ienVBw1HBMqG','rw52AxjVBM1LBNqG','C2nYB2XSvg9cB3r0B20','y29UDgfPBMvY','zMLUza','C2vUza','C2v0','C3rYAw5NAwz5','ChjVDg9JB2W','D3nZ','DgvYBwLUywWTC3vIDgL0Bgu','ndqYmZG0oe5lt0ruDa','y29UDgfPBMvYswq','BMfTzq','DgvYBwLUywWTy29UDgfPBMvY','q29UBMvJDgLVBIbJBg9Zzwq','CMvZAxPL','D2fZq2XLyw4','B3bLBG','zxjYB3i','mtHUCMPPzMK','C3vJy2vZCW','BwvZC2fNzq','B2jZzxj2zq','C3rHDhvZ','z2v0rwXLBwvUDej5swq','C3rYAw5N','ndiWndCZEefmBwHU','zML0','uNvUBMLUzZOG','z2v0uxvLCNLqyxjHBxm','z2v0q29UDgfPBMvY','t1bftG','C2XPy2u','u2vZC2LVBIa','q29UDgfPBMvYia','rMfPBgvKihrVihbHCNnLihrLCM1PBMfSig1LC3nHz2u','imk3iefNzw50ia','CM93CW','DMfYAwfUDa','y29UDgfPBMvYihbHCMfTzxrLCIbPCYbYzxf1AxjLza','C3vIC3rYAw5N','uhjLCgfYAw5NoIa','rw52AxjVBM1LBNqGDw5RBM93BG','mLLwqwXzwG','imk3ifn0yxj0zwqG','i2uYztHMma','nde3mdG2nxPZEvH6rG','nMPlD2vzzq','zgvMyxvSDefNzw50','y29UBMvJDgvK','mtu0mJm3nM1kAhz2sa','nZmWmtq4m2rWA05zva','zM9YBwf0uMvSyxrPDMvuAw1L','z2v0q29UDgfPBMvYCW','CMvHzhLtDgf0zq','Dg9tDhjPBMC','odeXndaZmhb1BNDprq','y2XVC2uTDgvYBwLUywW','Ahr0Chm6','Dhj1zq','iZbMmtCYyq','DgL0Bgu','C2vHCMnOugfYyw1Z','lNrLCM1PBMfSlwfJDgLVBNm','DhjPBq','ywrKrxzLBNrmAxn0zw5LCG','DhLWzq','y2XVC2u','nJq5ntKXmML3zuHYsq','Bg9JyxrPB24','y3jLyxrLzef0','q29UBMvJDgLVBIbLCNjVCG','Dgv4DenVBNrLBNq','zNvSBenVBNrHAw5LCKLK','twLZC2LUzYbJB250ywLUzxiGAwrLBNrPzMLLCG','zgf0yxnLDa','zM9JDxm','y29SCW','y21K','vgvYBwLUywWGWRCG','vgvYBwLUywWGD2vIC29JA2v0igvYCM9Y'];_0xa62e=function(){return _0xe05b40;};return _0xa62e();}import{FitAddon}from'https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.7.0/+esm';import{getCurrentTheme,initTheme,mountThemeToggle,onThemeChange}from'./theme.js';const params=Utils[_0x3703c1(0x225)](),containerId=params[_0x3703c1(0x20a)],command=(params['cmd']||'')[_0x3703c1(0x1ee)](),useServerExec=params['server_exec']===_0x3703c1(0x1e9),titleEl=document[_0x3703c1(0x220)](_0x3703c1(0x203)),subtitleEl=document[_0x3703c1(0x220)](_0x3703c1(0x211)),statusEl=document[_0x3703c1(0x220)](_0x3703c1(0x1ff)),terminalEl=document['getElementById'](_0x3703c1(0x215)),closeBtn=document[_0x3703c1(0x220)](_0x3703c1(0x1e7));initTheme(),mountThemeToggle({'targetSelectors':[_0x3703c1(0x1ed)]});const getXtermTheme=()=>{const _0x258ddc=_0x3703c1;return{'background':'#0f172a','foreground':_0x258ddc(0x235),'cursor':_0x258ddc(0x235),'cursorAccent':_0x258ddc(0x1ea)};};closeBtn&&closeBtn[_0x3703c1(0x1ef)]('click',()=>{window['close']();});if(!containerId){updateStatus(_0x3703c1(0x1f8),_0x3703c1(0x21a));throw new Error(_0x3703c1(0x22f));}document[_0x3703c1(0x1eb)]=_0x3703c1(0x1fd)+containerId[_0x3703c1(0x228)](0x0,0xc),enrichContainerDetails(containerId)['catch'](()=>{const _0x19a3e7=_0x3703c1;subtitleEl[_0x19a3e7(0x1f6)]=_0x19a3e7(0x22a)+containerId[_0x19a3e7(0x230)](0x0,0xc);});const term=new Terminal({'convertEol':!![],'cursorBlink':!![],'fontFamily':'JetBrains\x20Mono,\x20SFMono-Regular,\x20Consolas,\x20monospace','fontSize':0x10,'theme':getXtermTheme()}),fitAddon=new FitAddon();term['loadAddon'](fitAddon),term[_0x3703c1(0x219)](terminalEl),term['focus']();let isFitting=![];const doFit=()=>{const _0x3a6925=_0x3703c1;if(isFitting)return;isFitting=!![],fitAddon[_0x3a6925(0x223)](),sendResize(),term[_0x3a6925(0x209)](),setTimeout(()=>{isFitting=![];},0x32);};window[_0x3703c1(0x1ef)](_0x3703c1(0x217),()=>{requestAnimationFrame(()=>{!isFitting&&doFit();});});const resizeObserver=new ResizeObserver(()=>{requestAnimationFrame(()=>{!isFitting&&doFit();});});resizeObserver[_0x3703c1(0x21e)](terminalEl);const socketProtocol=window[_0x3703c1(0x1f3)][_0x3703c1(0x20f)]===_0x3703c1(0x1e8)?_0x3703c1(0x210):'ws',socketUrl=new URL('/ws/containers/'+encodeURIComponent(containerId),window[_0x3703c1(0x1f3)]['href']);command&&useServerExec&&socketUrl[_0x3703c1(0x1ec)][_0x3703c1(0x20d)](_0x3703c1(0x1fc),command);socketUrl[_0x3703c1(0x20f)]=socketProtocol+':';const socket=new WebSocket(socketUrl[_0x3703c1(0x1e5)]());term[_0x3703c1(0x201)](_0x2ffcf9=>{const _0x9767a1=_0x3703c1;socket[_0x9767a1(0x23e)]===WebSocket['OPEN']&&socket[_0x9767a1(0x20c)](JSON[_0x9767a1(0x20e)]({'type':'data','data':_0x2ffcf9}));});let commandSent=![],hasReceivedOutput=![];socket['addEventListener']('message',_0x4f5d18=>{const _0x47a760=_0x3703c1;try{const _0x1f7972=JSON['parse'](_0x4f5d18[_0x47a760(0x200)]);if(_0x1f7972[_0x47a760(0x1f0)]===_0x47a760(0x200)&&typeof _0x1f7972[_0x47a760(0x200)]===_0x47a760(0x221))term[_0x47a760(0x206)](_0x1f7972[_0x47a760(0x200)]),!hasReceivedOutput&&_0x1f7972[_0x47a760(0x200)]['length']>0x0&&(hasReceivedOutput=!![],command&&!useServerExec&&!commandSent&&(commandSent=!![],setTimeout(()=>{const _0x36f819=_0x47a760;socket[_0x36f819(0x23e)]===WebSocket[_0x36f819(0x227)]&&socket[_0x36f819(0x20c)](JSON[_0x36f819(0x20e)]({'type':_0x36f819(0x200),'data':command+'\x0d'}));},0xc8)));else{if(_0x1f7972[_0x47a760(0x1f0)]===_0x47a760(0x21f)&&_0x1f7972['status']){if(_0x1f7972[_0x47a760(0x21f)]===_0x47a760(0x239)){if(command&&useServerExec)updateStatus(_0x47a760(0x224)+command,'info');else command?updateStatus(_0x47a760(0x231)+command,_0x47a760(0x205)):updateStatus('Terminal\x20connected',_0x47a760(0x21c));doFit(),term[_0x47a760(0x1fa)](),command&&!useServerExec&&!commandSent&&setTimeout(()=>{const _0x195ea6=_0x47a760;!commandSent&&socket[_0x195ea6(0x23e)]===WebSocket[_0x195ea6(0x227)]&&(commandSent=!![],socket[_0x195ea6(0x20c)](JSON[_0x195ea6(0x20e)]({'type':_0x195ea6(0x200),'data':command+'\x0d'})),updateStatus('Running:\x20'+command,'info'));},0x7d0);}else updateStatus(_0x47a760(0x229)+_0x1f7972[_0x47a760(0x21f)],_0x1f7972['status']===_0x47a760(0x239)?_0x47a760(0x21c):'info');}else _0x1f7972[_0x47a760(0x1f0)]===_0x47a760(0x21a)&&_0x1f7972[_0x47a760(0x21d)]&&updateStatus(_0x1f7972[_0x47a760(0x21d)],'error');}}catch(_0x11a8d2){console[_0x47a760(0x21a)](_0x47a760(0x22b),_0x11a8d2);}}),socket[_0x3703c1(0x1ef)](_0x3703c1(0x1f1),_0x3439b6=>{const _0x3857fb=_0x3703c1,_0x2ceb1e=_0x3439b6['reason']||_0x3857fb(0x216);updateStatus(_0x2ceb1e,_0x3439b6[_0x3857fb(0x218)]?_0x3857fb(0x205):_0x3857fb(0x21a));}),socket[_0x3703c1(0x1ef)](_0x3703c1(0x21a),_0x4068a3=>{const _0x540aaf=_0x3703c1;console[_0x540aaf(0x21a)](_0x540aaf(0x1fe),_0x4068a3),updateStatus(_0x540aaf(0x1f5),'error');});function sendResize(){const _0x6b98f1=_0x3703c1;if(socket[_0x6b98f1(0x23e)]!==WebSocket[_0x6b98f1(0x227)])return;const _0x3e3e1f=term[_0x6b98f1(0x1fb)],_0x7ea5cb=term[_0x6b98f1(0x22d)];socket['send'](JSON['stringify']({'type':_0x6b98f1(0x217),'cols':_0x3e3e1f,'rows':_0x7ea5cb}));}function updateStatus(_0x31d0cf,_0x44f094='info'){const _0x312cb1=_0x3703c1;if(!statusEl)return;statusEl[_0x312cb1(0x1f6)]=_0x31d0cf,statusEl[_0x312cb1(0x1f9)][_0x312cb1(0x22e)]=_0x44f094;}function _0x36ad(_0x50d74e,_0x33e72f){_0x50d74e=_0x50d74e-0x1e5;const _0xa62e96=_0xa62e();let _0x36ad66=_0xa62e96[_0x50d74e];if(_0x36ad['mwKeof']===undefined){var _0x97ca8b=function(_0x55db32){const _0x3646c3='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2ffcf9='',_0x4f5d18='';for(let _0x1f7972=0x0,_0x11a8d2,_0x3439b6,_0x2ceb1e=0x0;_0x3439b6=_0x55db32['charAt'](_0x2ceb1e++);~_0x3439b6&&(_0x11a8d2=_0x1f7972%0x4?_0x11a8d2*0x40+_0x3439b6:_0x3439b6,_0x1f7972++%0x4)?_0x2ffcf9+=String['fromCharCode'](0xff&_0x11a8d2>>(-0x2*_0x1f7972&0x6)):0x0){_0x3439b6=_0x3646c3['indexOf'](_0x3439b6);}for(let _0x4068a3=0x0,_0x3e3e1f=_0x2ffcf9['length'];_0x4068a3<_0x3e3e1f;_0x4068a3++){_0x4f5d18+='%'+('00'+_0x2ffcf9['charCodeAt'](_0x4068a3)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4f5d18);};_0x36ad['gIifIg']=_0x97ca8b,_0x36ad['jGMopD']={},_0x36ad['mwKeof']=!![];}const _0x3b7f8d=_0xa62e96[0x0],_0x45b27c=_0x50d74e+_0x3b7f8d,_0x43192a=_0x36ad['jGMopD'][_0x45b27c];return!_0x43192a?(_0x36ad66=_0x36ad['gIifIg'](_0x36ad66),_0x36ad['jGMopD'][_0x45b27c]=_0x36ad66):_0x36ad66=_0x43192a,_0x36ad66;}async function enrichContainerDetails(_0x3a7efb){const _0x47af2e=_0x3703c1;try{const _0x58da03=await API[_0x47af2e(0x226)](_0x3a7efb);updateTerminalDetails(_0x58da03);}catch{try{const _0x36bd2a=await API[_0x47af2e(0x23d)](),_0x20922e=(_0x36bd2a['containers']||[])[_0x47af2e(0x20b)](_0x2bf4d5=>_0x2bf4d5[_0x47af2e(0x213)]===_0x3a7efb||_0x2bf4d5[_0x47af2e(0x214)]===_0x3a7efb||_0x2bf4d5[_0x47af2e(0x1f7)]?.[_0x47af2e(0x204)](_0x3a7efb));if(_0x20922e){updateTerminalDetails(_0x20922e);return;}subtitleEl[_0x47af2e(0x1f6)]='Container\x20'+_0x3a7efb[_0x47af2e(0x230)](0x0,0xc);}catch{subtitleEl[_0x47af2e(0x1f6)]=_0x47af2e(0x22a)+_0x3a7efb[_0x47af2e(0x230)](0x0,0xc);}}}function updateTerminalDetails(_0xb7b9a3){const _0x1c466b=_0x3703c1,_0x2f67f7=_0xb7b9a3[_0x1c466b(0x213)]||_0xb7b9a3[_0x1c466b(0x214)]||_0xb7b9a3[_0x1c466b(0x1f7)]||containerId,_0x11c0c6=_0xb7b9a3[_0x1c466b(0x202)]?_0x1c466b(0x208)+_0xb7b9a3[_0x1c466b(0x202)]:_0x1c466b(0x232),_0x1bdba0=_0xb7b9a3[_0x1c466b(0x238)]?_0x1c466b(0x22c)+_0xb7b9a3['defaultAgent']:'',_0x260747=_0xb7b9a3[_0x1c466b(0x1f4)]?_0x1c466b(0x234)+Utils[_0x1c466b(0x23c)](_0xb7b9a3[_0x1c466b(0x1f4)]):'';titleEl[_0x1c466b(0x1f6)]='Terminal\x20·\x20'+_0x2f67f7[_0x1c466b(0x230)](0x0,0xc);const _0xf7da97=command?_0x1c466b(0x207)+command:'';subtitleEl[_0x1c466b(0x1f6)]=''+_0x11c0c6+_0x1bdba0+_0x260747+_0xf7da97;}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const _0x35fe04=_0x4233;function _0x3bf4(){const _0x16502f=['oeLfz1rLuq','zgLZCgXHEq','lNrVCc1Iyxi','D2LKDgG','zgfYAW','BwfW','ywXPz25jDgvTCW','nZyZndK3n2TJtxfOyq','Bwf0y2HnzwrPyq','nZCWotq3mLLHs1bcAG','mtq4nZC1nK5hqK9rEG','phn2zYb4BwXUCZ0IAhr0CdOVl3D3DY53mY5VCMCVmJaWmc9ZDMCIihDPzhrOpsiYmciGAgvPz2H0psiYmciGDMLLD0jVEd0ImcaWidi0idi0iIbMAwXSpsjUB25LiIbZDhjVA2u9iMn1CNjLBNrdB2XVCIiGC3rYB2TLlxDPzhrOpsiYiIbZDhjVA2uTBgLUzwnHCd0ICM91BMqIihn0CM9Rzs1SAw5LAM9PBJ0ICM91BMqIpJXJAxjJBguGy3G9iJeYiIbJEt0ImtiIihi9iJuIpJWVy2LYy2XLpJXSAw5LihGXpsiXmIiGEte9iJeIihGYpsiXmIiGEti9iJmIpJWVBgLUzt48BgLUzsb4mt0ImtiIihKXpsiYmsiGEdi9iJeYiIb5mJ0ImJmIpJWVBgLUzt48BgLUzsb4mt0Inc4YmIiGEte9iJqUmJiIihGYpsi1lJy0iIb5mJ0Ins42nci+pc9SAw5LpJXSAw5LihGXpsiXoc4ZnIiGEte9iJe4lJm2iIb4mJ0ImtKUnZGIihKYpsiXos43oci+pc9SAw5LpJXSAw5LihGXpsiXiIb5mt0ImtiIihGYpsiZiIb5mJ0ImtiIpJWVBgLUzt48BgLUzsb4mt0ImJeIihKXpsiXmIiGEdi9iJiZiIb5mJ0ImtiIpJWVBgLUzt48BgLUzsb4mt0Inc4YmIiGEte9iJe5lJC4iIb4mJ0Ins42nciGEti9iJe4lJm2iJ48l2XPBMu+pgXPBMuGEde9iJe4lJm2iIb5mt0Ins42nciGEdi9iJe5lJC4iIb5mJ0Inc4YmIi+pc9SAw5LpJWVC3zNpG','zMfSC2u','DgHLBwuTAwnVBG','y3jLyxrLrwXLBwvUDa','Aw5Uzxjive1m','ChjVzM91BMqTDgHLBwuTy2HHBMDL','DgHLBwuTDg9Nz2XLlwzSB2f0Aw5N','DgHLBwu','y2XHC3nmAxn0','zgf0yxnLDa','zg9JDw1LBNrfBgvTzw50','ywrKrxzLBNrmAxn0zw5LCG','CxvLCNLtzwXLy3rVCG','yxbWzw5K','AgvPz2H0','yxbWzw5Kq2HPBgq','mta4ntu0mfjst1vqra','lNrLCM1PBMfSlwfJDgLVBNm','D2fYBG','Bwf0y2HLCW','y2XHC3noyw1L','yNv0Dg9U','BgLUzuHLAwDODa','i3rOzw1LlxrVz2DSzs1JB250ywLUzxi','zMLUza','m0vUAKfcsa','y2vUDgvY','nZu3nJC0mZzmALbRANe','zMXLEa','CgfKzgLUzW','yNrUlwDOB3n0ihrOzw1LlxrVz2DSzs1IDg4','mZzWEa','ohb4','zgv0ywLS','AgfZ','C2v0sxrLBq','C2v0qxr0CMLIDxrL','w1rOzw1LxsbgywLSzwqGDg8GCgvYC2LZDcb0AgvTzsbWCMvMzxjLBMnLoG','lNn0yxr1CY1Hy3rPB25Z','yxjPys1WCMvZC2vK','yM9KEq','CMvTB3zLrxzLBNrmAxn0zw5LCG','nteXmde4mfzltwHxwq','C3r5Bgu','BgLNAhq','ode4mte2mKLbrKvjqq','ANvZDgLMEunVBNrLBNq','khbYzwzLCNmTy29SB3iTC2nOzw1LoIbKyxjRkq'];_0x3bf4=function(){return _0x16502f;};return _0x3bf4();}(function(_0x307b7c,_0x2a9290){const _0xbb06=_0x4233,_0x138566=_0x307b7c();while(!![]){try{const _0x45c92f=-parseInt(_0xbb06(0xd5))/0x1+parseInt(_0xbb06(0xab))/0x2*(-parseInt(_0xbb06(0xb4))/0x3)+-parseInt(_0xbb06(0xd4))/0x4+-parseInt(_0xbb06(0xc5))/0x5+-parseInt(_0xbb06(0xc8))/0x6+-parseInt(_0xbb06(0xd2))/0x7*(parseInt(_0xbb06(0xcb))/0x8)+parseInt(_0xbb06(0xb6))/0x9;if(_0x45c92f===_0x2a9290)break;else _0x138566['push'](_0x138566['shift']());}catch(_0x1f7c3e){_0x138566['push'](_0x138566['shift']());}}}(_0x3bf4,0xf0574));const THEME_STORAGE_KEY='profound-coder-theme',THEME_CHANGE_EVENT=_0x35fe04(0xdb),VALID_THEMES=new Set(['light',_0x35fe04(0xcf)]),DEFAULT_TARGET_SELECTORS=[_0x35fe04(0xb2),'.header-actions',_0x35fe04(0xc1),_0x35fe04(0xac),_0x35fe04(0xcd)];function readStoredTheme(){const _0x20836a=_0x35fe04;try{const _0xfba72d=localStorage['getItem'](THEME_STORAGE_KEY);if(_0xfba72d&&VALID_THEMES[_0x20836a(0xbd)](_0xfba72d))return _0xfba72d;}catch(_0x47706b){console[_0x20836a(0xad)]('[Theme]\x20Failed\x20to\x20read\x20stored\x20theme\x20preference:',_0x47706b);}return null;}function _0x4233(_0x28f331,_0x3fbf81){_0x28f331=_0x28f331-0xa9;const _0x3bf460=_0x3bf4();let _0x4233e5=_0x3bf460[_0x28f331];if(_0x4233['gCvgco']===undefined){var _0x2d7ba6=function(_0x58c797){const _0x39b8ba='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xfba72d='',_0x47706b='';for(let _0x25aa2e=0x0,_0x5aaa62,_0xa6ab3d,_0x21bb93=0x0;_0xa6ab3d=_0x58c797['charAt'](_0x21bb93++);~_0xa6ab3d&&(_0x5aaa62=_0x25aa2e%0x4?_0x5aaa62*0x40+_0xa6ab3d:_0xa6ab3d,_0x25aa2e++%0x4)?_0xfba72d+=String['fromCharCode'](0xff&_0x5aaa62>>(-0x2*_0x25aa2e&0x6)):0x0){_0xa6ab3d=_0x39b8ba['indexOf'](_0xa6ab3d);}for(let _0xa27878=0x0,_0x1fbb2a=_0xfba72d['length'];_0xa27878<_0x1fbb2a;_0xa27878++){_0x47706b+='%'+('00'+_0xfba72d['charCodeAt'](_0xa27878)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x47706b);};_0x4233['VYBktz']=_0x2d7ba6,_0x4233['jBWCmW']={},_0x4233['gCvgco']=!![];}const _0x3a1c29=_0x3bf460[0x0],_0x1459e7=_0x28f331+_0x3a1c29,_0x251572=_0x4233['jBWCmW'][_0x1459e7];return!_0x251572?(_0x4233e5=_0x4233['VYBktz'](_0x4233e5),_0x4233['jBWCmW'][_0x1459e7]=_0x4233e5):_0x4233e5=_0x251572,_0x4233e5;}export function getPreferredTheme(){const _0x22ac33=_0x35fe04,_0x25aa2e=readStoredTheme();if(_0x25aa2e)return _0x25aa2e;const _0x5aaa62=window[_0x22ac33(0xd3)]&&window['matchMedia'](_0x22ac33(0xca))[_0x22ac33(0xae)];return _0x5aaa62?_0x22ac33(0xcf):'light';}export function getCurrentTheme(){const _0x47a070=_0x35fe04,_0xa6ab3d=document[_0x47a070(0xe0)][_0x47a070(0xdf)][_0x47a070(0xdd)];if(_0xa6ab3d&&VALID_THEMES[_0x47a070(0xbd)](_0xa6ab3d))return _0xa6ab3d;return getPreferredTheme();}export function applyTheme(_0x21bb93,{persist:persist=!![],emitEvent:emitEvent=!![]}={}){const _0x35b016=_0x35fe04,_0xa27878=VALID_THEMES[_0x35b016(0xbd)](_0x21bb93)?_0x21bb93:_0x35b016(0xc7);document['documentElement'][_0x35b016(0xdf)][_0x35b016(0xdd)]=_0xa27878,document[_0x35b016(0xe0)][_0x35b016(0xc6)]['colorScheme']=_0xa27878===_0x35b016(0xcf)?'dark':'light';if(persist)try{localStorage[_0x35b016(0xbe)](THEME_STORAGE_KEY,_0xa27878);}catch(_0x1fbb2a){console[_0x35b016(0xad)](_0x35b016(0xc0),_0x1fbb2a);}return emitEvent&&window['dispatchEvent'](new CustomEvent(THEME_CHANGE_EVENT,{'detail':{'theme':_0xa27878}})),_0xa27878;}export function initTheme(_0x4633df={}){const {emitEvent:emitEvent=![]}=_0x4633df;return applyTheme(getPreferredTheme(),{'persist':![],'emitEvent':emitEvent});}export function toggleTheme(){const _0x4adb4f=_0x35fe04,_0x4fb7ba=getCurrentTheme()===_0x4adb4f(0xcf)?'light':_0x4adb4f(0xcf);return applyTheme(_0x4fb7ba);}export function onThemeChange(_0x5a481a,{runImmediately:runImmediately=![]}={}){const _0xca9500=_0x35fe04,_0x37c8ab=_0xc34d30=>{const _0x3773e6=_0x4233;_0x5a481a(_0xc34d30[_0x3773e6(0xbc)][_0x3773e6(0xdd)]);};return window[_0xca9500(0xe1)](THEME_CHANGE_EVENT,_0x37c8ab),runImmediately&&_0x5a481a(getCurrentTheme()),()=>window[_0xca9500(0xc4)](THEME_CHANGE_EVENT,_0x37c8ab);}export function mountThemeToggle(_0x7aad74={}){const _0x147e81=_0x35fe04,{targetSelectors:targetSelectors=DEFAULT_TARGET_SELECTORS}=_0x7aad74,_0x1df8a8=targetSelectors[_0x147e81(0xd0)](_0x49c5b3=>document[_0x147e81(0xe2)](_0x49c5b3))[_0x147e81(0xb3)](Boolean),_0x525da5=document[_0x147e81(0xd9)]('button');_0x525da5['type']=_0x147e81(0xb0),_0x525da5[_0x147e81(0xaf)]=_0x147e81(0xb9),_0x525da5['id']='theme-toggle-btn',_0x525da5[_0x147e81(0xbf)]('aria-pressed',_0x147e81(0xd7)),_0x525da5[_0x147e81(0xc6)][_0x147e81(0xb8)]=_0x147e81(0xbb),_0x525da5[_0x147e81(0xc6)][_0x147e81(0xb1)]='0',_0x525da5['style'][_0x147e81(0xce)]=_0x147e81(0xba),_0x525da5[_0x147e81(0xc6)][_0x147e81(0xa9)]=_0x147e81(0xba),_0x525da5[_0x147e81(0xc6)][_0x147e81(0xcc)]='flex',_0x525da5[_0x147e81(0xc6)][_0x147e81(0xd1)]=_0x147e81(0xb5),_0x525da5[_0x147e81(0xc6)][_0x147e81(0xc9)]=_0x147e81(0xb5);const _0x44771f=document['createElement']('span');_0x44771f[_0x147e81(0xaf)]=_0x147e81(0xd8),_0x44771f[_0x147e81(0xc6)][_0x147e81(0xcc)]=_0x147e81(0xb7),_0x525da5[_0x147e81(0xe3)](_0x44771f);const _0x3faf38='<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20width=\x2220\x22\x20height=\x2220\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22><path\x20d=\x22M21\x2012.79A9\x209\x200\x201\x201\x2011.21\x203\x207\x207\x200\x200\x200\x2021\x2012.79z\x22></path></svg>',_0x353243=_0x147e81(0xd6),_0x4f39c5=_0x538e6d=>{const _0x5a36a5=_0x147e81,_0x54c106=_0x538e6d===_0x5a36a5(0xcf);_0x44771f[_0x5a36a5(0xda)]=_0x54c106?_0x3faf38:_0x353243,_0x525da5['title']=_0x54c106?'Switch\x20to\x20light\x20mode':'Switch\x20to\x20dark\x20mode',_0x525da5['dataset']['theme']=_0x538e6d,_0x525da5[_0x5a36a5(0xbf)](_0x5a36a5(0xc2),String(_0x54c106));};return _0x525da5[_0x147e81(0xe1)]('click',()=>{const _0x48f0f2=_0x147e81,_0x4f5cf7=getCurrentTheme()===_0x48f0f2(0xcf)?'light':_0x48f0f2(0xcf);applyTheme(_0x4f5cf7);}),_0x1df8a8?_0x1df8a8[_0x147e81(0xaa)](_0x525da5):(_0x525da5[_0x147e81(0xde)]['add'](_0x147e81(0xdc)),document[_0x147e81(0xc3)][_0x147e81(0xaa)](_0x525da5)),_0x4f39c5(initTheme()),onThemeChange(_0x4f39c5),_0x525da5;}export{THEME_STORAGE_KEY,THEME_CHANGE_EVENT};
|