@profoundlogic/coderflow-server 0.5.0 → 0.5.2
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/README.md +15 -163
- package/dist/README.md +15 -163
- package/dist/base-image/agent-wrapper.sh +1 -1
- package/dist/capture-screenshot.mjs +34 -0
- package/dist/coder-server.js +1 -1
- package/dist/config/cli-models.json +4 -3
- 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 -1
- package/dist/lib/basic-auth.js +1 -1
- package/dist/lib/bindings.js +1 -1
- 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/cleanup-users.js +1 -0
- 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/grant-admin.js +1 -0
- 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/list-roles.js +1 -0
- package/dist/lib/cli/list-users.js +1 -0
- package/dist/lib/cli/server-manager.js +1 -1
- package/dist/lib/cli/set-password.js +1 -0
- 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/external-connections.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/ibmi-sync.js +1 -0
- 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 -1
- 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 -1
- 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/rbac-user-state.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 -1
- 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 -1
- package/dist/lib/teams.js +1 -1
- 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.json +1 -1
- package/dist/playwright.config.js +1 -1
- 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 -1
- package/dist/routes/bindings.js +1 -1
- 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 -1
- 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 -1
- 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/sync_to_ibmi.sh +204 -0
- package/dist/start.js +1 -1
- 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 -1
- package/dist/web-ui/public/automation-schedule.js +1 -1
- 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/admin/environments.md +1 -0
- package/dist/web-ui/public/docs/tasks/approval-and-deployment.md +36 -0
- package/dist/web-ui/public/environments.html +1 -1
- package/dist/web-ui/public/environments.js +1 -1
- 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.js +1 -1
- package/dist/web-ui/public/git-status.js +1 -1
- package/dist/web-ui/public/index.html +2 -2
- 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 +3 -2
- package/dist/web-ui/public/roles.js +1 -1
- package/dist/web-ui/public/server-health.js +1 -1
- package/dist/web-ui/public/settings.css +3 -2
- package/dist/web-ui/public/settings.html +0 -1
- 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.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 +39 -12
- package/dist/web-ui/public/task.html +56 -1
- package/dist/web-ui/public/task.js +1 -1
- package/dist/web-ui/public/teams.html +76 -81
- package/dist/web-ui/public/teams.js +1 -1
- 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 +12 -11
- package/dist/web-ui/public/users.js +1 -1
- package/dist/web-ui/public/variant-grouping.js +1 -1
- package/package.json +1 -1
- package/dist/lib/cli/migrate-rbac.js +0 -1
- package/dist/lib/scoped-rbac-migration-runner.js +0 -1
- package/dist/scripts/migrate-to-scoped-rbac.js +0 -2
|
@@ -145,7 +145,6 @@
|
|
|
145
145
|
<tr>
|
|
146
146
|
<th>Name</th>
|
|
147
147
|
<th>Members</th>
|
|
148
|
-
<th>Managers</th>
|
|
149
148
|
<th>Actions</th>
|
|
150
149
|
</tr>
|
|
151
150
|
</thead>
|
|
@@ -159,7 +158,7 @@
|
|
|
159
158
|
</section>
|
|
160
159
|
</main>
|
|
161
160
|
|
|
162
|
-
<!-- Create/Edit Team Modal -->
|
|
161
|
+
<!-- Create/Edit Team Details Modal -->
|
|
163
162
|
<div id="team-modal" class="modal" hidden>
|
|
164
163
|
<div class="modal-overlay"></div>
|
|
165
164
|
<div class="modal-content" style="max-width: 640px;">
|
|
@@ -167,97 +166,93 @@
|
|
|
167
166
|
<h2 id="team-modal-title">Create Team</h2>
|
|
168
167
|
<button class="modal-close" id="close-team-modal">×</button>
|
|
169
168
|
</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
169
|
<div class="modal-body">
|
|
170
|
+
<div class="modal-section">
|
|
171
|
+
<label for="team-name">Name *</label>
|
|
172
|
+
<input type="text" id="team-name" class="form-input" required placeholder="e.g. Frontend Team">
|
|
173
|
+
</div>
|
|
174
|
+
<div class="modal-section">
|
|
175
|
+
<label for="team-description">Description</label>
|
|
176
|
+
<input type="text" id="team-description" class="form-input" placeholder="Optional description">
|
|
177
|
+
</div>
|
|
176
178
|
|
|
177
|
-
|
|
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>
|
|
179
|
+
<div id="team-form-error" class="login-error" hidden></div>
|
|
187
180
|
|
|
188
|
-
|
|
189
|
-
<
|
|
190
|
-
|
|
191
|
-
|
|
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>
|
|
181
|
+
<div id="team-modal-footer" style="display: flex; gap: 0.75rem; justify-content: flex-end; margin-top: 1.5rem; margin-bottom: 0.5rem;">
|
|
182
|
+
<button class="btn-ghost" id="cancel-team">Cancel</button>
|
|
183
|
+
<button class="btn-primary" id="save-team">Save</button>
|
|
184
|
+
</div>
|
|
200
185
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
</
|
|
186
|
+
<!-- Members section (shown when editing) -->
|
|
187
|
+
<div id="members-section" hidden>
|
|
188
|
+
<div class="modal-section">
|
|
189
|
+
<label>Members</label>
|
|
190
|
+
<div id="members-list" style="margin-bottom: 0.5rem;"></div>
|
|
191
|
+
<div id="add-member-row" style="display: flex; gap: 0.5rem; margin-top: 0.5rem;">
|
|
192
|
+
<select id="add-member-select" class="form-input" style="flex: 1; font-size: 0.875rem;">
|
|
193
|
+
<option value="">Add a member…</option>
|
|
194
|
+
</select>
|
|
195
|
+
<button type="button" class="btn-secondary btn-small" id="add-member-btn">Add</button>
|
|
211
196
|
</div>
|
|
212
197
|
</div>
|
|
213
|
-
|
|
214
|
-
<div id="team-form-error" class="login-error" hidden></div>
|
|
215
198
|
</div>
|
|
199
|
+
</div>
|
|
200
|
+
</div>
|
|
201
|
+
</div>
|
|
216
202
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
203
|
+
<!-- Access Bindings Modal -->
|
|
204
|
+
<div id="bindings-modal" class="modal" hidden>
|
|
205
|
+
<div class="modal-overlay"></div>
|
|
206
|
+
<div class="modal-content" style="max-width: 640px;">
|
|
207
|
+
<div class="modal-header">
|
|
208
|
+
<h2 id="bindings-modal-title">Access Bindings</h2>
|
|
209
|
+
<button class="modal-close" id="close-bindings-modal">×</button>
|
|
210
|
+
</div>
|
|
211
|
+
<div class="modal-body">
|
|
212
|
+
<div id="bindings-loading" class="loading" hidden>Loading bindings…</div>
|
|
213
|
+
<div id="bindings-empty" hidden style="padding: 1.5rem 0; text-align: center; color: var(--color-text-secondary);">
|
|
214
|
+
No access bindings for this team yet.
|
|
215
|
+
</div>
|
|
216
|
+
<div id="bindings-list-container">
|
|
217
|
+
<table class="users-table" id="bindings-table">
|
|
218
|
+
<thead>
|
|
219
|
+
<tr>
|
|
220
|
+
<th>Resource</th>
|
|
221
|
+
<th>Role</th>
|
|
222
|
+
<th>Actions</th>
|
|
223
|
+
</tr>
|
|
224
|
+
</thead>
|
|
225
|
+
<tbody id="bindings-table-body"></tbody>
|
|
226
|
+
</table>
|
|
227
|
+
</div>
|
|
228
|
+
<div id="bindings-actions" style="margin-top: 1rem;">
|
|
229
|
+
<button type="button" class="btn-secondary btn-small" id="add-binding-btn" hidden>+ Add Binding</button>
|
|
230
|
+
</div>
|
|
231
|
+
<!-- Inline add-binding form -->
|
|
232
|
+
<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);">
|
|
233
|
+
<div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 0.75rem; margin-bottom: 0.75rem;">
|
|
234
|
+
<div>
|
|
235
|
+
<label style="font-size: 0.8rem; margin-bottom: 0.25rem; display: block;">Resource Type</label>
|
|
236
|
+
<select id="binding-resource-type" class="form-input" style="font-size: 0.875rem;">
|
|
237
|
+
<option value="environment">Environment</option>
|
|
238
|
+
<option value="team">Team</option>
|
|
239
|
+
<option value="server">Server</option>
|
|
240
|
+
</select>
|
|
249
241
|
</div>
|
|
250
|
-
<div
|
|
251
|
-
<
|
|
252
|
-
<
|
|
242
|
+
<div id="binding-resource-container">
|
|
243
|
+
<label style="font-size: 0.8rem; margin-bottom: 0.25rem; display: block;">Resource</label>
|
|
244
|
+
<select id="binding-resource" class="form-input" style="font-size: 0.875rem;"></select>
|
|
253
245
|
</div>
|
|
246
|
+
<div>
|
|
247
|
+
<label style="font-size: 0.8rem; margin-bottom: 0.25rem; display: block;">Role</label>
|
|
248
|
+
<select id="binding-role" class="form-input" style="font-size: 0.875rem;"></select>
|
|
249
|
+
</div>
|
|
250
|
+
</div>
|
|
251
|
+
<div style="display: flex; gap: 0.5rem;">
|
|
252
|
+
<button type="button" class="btn-primary btn-small" id="save-binding-btn">Add Binding</button>
|
|
253
|
+
<button type="button" class="btn-ghost btn-small" id="cancel-binding-btn">Cancel</button>
|
|
254
254
|
</div>
|
|
255
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
256
|
</div>
|
|
262
257
|
</div>
|
|
263
258
|
</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x4a1b45=_0x1ea7;(function(_0x4e1644,_0x46cfc2){const _0x351ed2=_0x1ea7,_0x550446=_0x4e1644();while(!![]){try{const _0x43c092=parseInt(_0x351ed2(0x1bb))/0x1+-parseInt(_0x351ed2(0x1f0))/0x2*(-parseInt(_0x351ed2(0x209))/0x3)+parseInt(_0x351ed2(0x1e5))/0x4+-parseInt(_0x351ed2(0x233))/0x5+parseInt(_0x351ed2(0x1c6))/0x6+parseInt(_0x351ed2(0x1f5))/0x7*(parseInt(_0x351ed2(0x23a))/0x8)+-parseInt(_0x351ed2(0x227))/0x9*(parseInt(_0x351ed2(0x1de))/0xa);if(_0x43c092===_0x46cfc2)break;else _0x550446['push'](_0x550446['shift']());}catch(_0x4005b6){_0x550446['push'](_0x550446['shift']());}}}(_0x3799,0x25720));import{API,Utils,initializeAdminMenu}from'./app.js';import{initTheme,mountThemeToggle}from'./theme.js';const state={'teams':[],'users':[],'roles':[],'environments':[],'teamBindings':[],'currentUser':null,'editingTeamId':null,'deletingTeamId':null,'activeTab':_0x4a1b45(0x19f)};document[_0x4a1b45(0x1f6)](_0x4a1b45(0x23f),async()=>{const _0x15aef8=_0x4a1b45;initTheme(),mountThemeToggle();try{state['currentUser']=await API['getCurrentUser']();}catch{window[_0x15aef8(0x191)][_0x15aef8(0x1e4)]=_0x15aef8(0x1f7);return;}await initializeAdminMenu(state['currentUser']),state[_0x15aef8(0x1fb)][_0x15aef8(0x211)]&&(document['getElementById'](_0x15aef8(0x22f))['hidden']=![]),bindEventListeners(),await Promise[_0x15aef8(0x1d1)]([loadTeams(),loadUsers(),loadRoles(),loadEnvironments()]),renderTeams();});async function loadTeams(){const _0x1f33cf=_0x4a1b45,_0x33ab41=document[_0x1f33cf(0x22b)](_0x1f33cf(0x1a7)),_0x5c9697=document[_0x1f33cf(0x22b)](_0x1f33cf(0x240)),_0x49c54f=document[_0x1f33cf(0x22b)](_0x1f33cf(0x19e));try{_0x33ab41[_0x1f33cf(0x1a2)]=![],_0x5c9697[_0x1f33cf(0x1a2)]=!![],_0x49c54f[_0x1f33cf(0x1a2)]=!![];const {teams:_0x298c61}=await API[_0x1f33cf(0x1ed)]();state[_0x1f33cf(0x223)]=_0x298c61||[],renderTeams(),_0x33ab41[_0x1f33cf(0x1a2)]=!![],_0x49c54f[_0x1f33cf(0x1a2)]=![];}catch(_0x31ff9f){_0x33ab41[_0x1f33cf(0x1a2)]=!![],_0x5c9697['hidden']=![],document['getElementById'](_0x1f33cf(0x1d4))[_0x1f33cf(0x21f)]=_0x31ff9f[_0x1f33cf(0x19b)];}}async function loadUsers(){const _0x5c6512=_0x4a1b45;try{const {users:_0x8677df}=await API[_0x5c6512(0x1fd)]();state[_0x5c6512(0x1b2)]=_0x8677df||[];}catch{state[_0x5c6512(0x1b2)]=[];}}async function loadRoles(){const _0x19b1e3=_0x4a1b45;try{const {roles:_0x340e34}=await API[_0x19b1e3(0x242)]();state['roles']=_0x340e34||[];}catch{state['roles']=[];}}async function loadEnvironments(){const _0x3ade2e=_0x4a1b45;try{const _0x2fe86f=await API[_0x3ade2e(0x236)]();state[_0x3ade2e(0x231)]=_0x2fe86f[_0x3ade2e(0x231)]||[];}catch{state[_0x3ade2e(0x231)]=[];}}function renderTeams(){const _0xb8b801=_0x4a1b45,_0x4a1452=document[_0xb8b801(0x22b)](_0xb8b801(0x1c7)),_0x98b7bc=document[_0xb8b801(0x22b)](_0xb8b801(0x1ff));if(!_0x4a1452)return;_0x98b7bc&&(_0x98b7bc['textContent']=state[_0xb8b801(0x223)][_0xb8b801(0x1c2)]+_0xb8b801(0x1dc)+(state['teams'][_0xb8b801(0x1c2)]===0x1?'':'s'));if(state[_0xb8b801(0x223)]['length']===0x0){_0x4a1452['innerHTML']=_0xb8b801(0x22c)+(state[_0xb8b801(0x1fb)]?.[_0xb8b801(0x211)]?_0xb8b801(0x1b0):'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20</tr>';return;}const _0x537c43=state[_0xb8b801(0x1fb)]?.[_0xb8b801(0x211)];_0x4a1452[_0xb8b801(0x222)]=state['teams'][_0xb8b801(0x23b)](_0x1a96c2=>{const _0x22c5d=_0xb8b801,_0x545b9c=(_0x1a96c2[_0x22c5d(0x1cd)]||[])['includes'](state[_0x22c5d(0x1fb)]?.['id']),_0x4f9724=_0x537c43||_0x545b9c,_0x4ee734=(_0x1a96c2['managers']||[])['map'](_0x2cc9e0=>{const _0x43d1d8=_0x22c5d;if(_0x1a96c2[_0x43d1d8(0x21e)]&&_0x1a96c2[_0x43d1d8(0x21e)][_0x2cc9e0])return _0x1a96c2['manager_names'][_0x2cc9e0];const _0x458e02=state['users']['find'](_0x2e242e=>_0x2e242e['id']===_0x2cc9e0);return _0x458e02?_0x458e02[_0x43d1d8(0x1c1)]||_0x458e02[_0x43d1d8(0x1c0)]:_0x2cc9e0;})['join'](',\x20')||'—',_0x21b644=(_0x1a96c2['members']||[])[_0x22c5d(0x1c2)];return _0x22c5d(0x198)+_0x1a96c2['id']+'\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+Utils[_0x22c5d(0x208)](_0x1a96c2[_0x22c5d(0x1c1)])+_0x22c5d(0x21c)+(_0x1a96c2['description']?_0x22c5d(0x1e7)+Utils['escapeHtml'](_0x1a96c2[_0x22c5d(0x1b1)])+_0x22c5d(0x1e9):'')+_0x22c5d(0x1f2)+_0x21b644+_0x22c5d(0x226)+Utils[_0x22c5d(0x208)](_0x4ee734)+_0x22c5d(0x1a3)+(_0x4f9724?_0x22c5d(0x220)+_0x1a96c2['id']+_0x22c5d(0x1aa):'')+_0x22c5d(0x219)+(_0x537c43?_0x22c5d(0x1e0)+_0x1a96c2['id']+_0x22c5d(0x199):'')+_0x22c5d(0x1dd);})['join']('');}function bindEventListeners(){const _0x42c36f=_0x4a1b45;document[_0x42c36f(0x22b)](_0x42c36f(0x22f))?.['addEventListener']('click',showCreateTeamModal),document['getElementById'](_0x42c36f(0x1b6))?.['addEventListener'](_0x42c36f(0x20f),loadTeams),document['getElementById'](_0x42c36f(0x1b8))?.['addEventListener'](_0x42c36f(0x20f),hideTeamModal),document[_0x42c36f(0x22b)](_0x42c36f(0x1bd))?.[_0x42c36f(0x1f6)](_0x42c36f(0x20f),hideTeamModal),document[_0x42c36f(0x22b)]('save-team')?.['addEventListener'](_0x42c36f(0x20f),saveTeam),document[_0x42c36f(0x206)](_0x42c36f(0x1b4))?.[_0x42c36f(0x1f6)](_0x42c36f(0x20f),hideTeamModal),document['querySelectorAll'](_0x42c36f(0x1cb))[_0x42c36f(0x1f8)](_0xf385f=>{const _0x275419=_0x42c36f;_0xf385f[_0x275419(0x1f6)]('click',()=>switchTab(_0xf385f[_0x275419(0x19c)][_0x275419(0x1ae)]));}),document[_0x42c36f(0x22b)](_0x42c36f(0x203))?.[_0x42c36f(0x1f6)]('click',addMember),document['getElementById'](_0x42c36f(0x1ce))?.[_0x42c36f(0x1f6)](_0x42c36f(0x20f),addManager),document[_0x42c36f(0x22b)]('add-binding-btn')?.[_0x42c36f(0x1f6)](_0x42c36f(0x20f),()=>{const _0x37bc84=_0x42c36f;document[_0x37bc84(0x22b)](_0x37bc84(0x210))[_0x37bc84(0x1a2)]=![],document['getElementById'](_0x37bc84(0x1af))[_0x37bc84(0x1a2)]=!![],populateBindingForm();}),document[_0x42c36f(0x22b)](_0x42c36f(0x225))?.[_0x42c36f(0x1f6)]('click',()=>{const _0x33abce=_0x42c36f;document[_0x33abce(0x22b)]('add-binding-form')[_0x33abce(0x1a2)]=!![],document['getElementById'](_0x33abce(0x1af))[_0x33abce(0x1a2)]=![];}),document[_0x42c36f(0x22b)](_0x42c36f(0x218))?.['addEventListener'](_0x42c36f(0x20f),saveBinding),document[_0x42c36f(0x22b)](_0x42c36f(0x1b9))?.[_0x42c36f(0x1f6)](_0x42c36f(0x20f),hideDeleteModal),document[_0x42c36f(0x22b)]('cancel-delete-team')?.['addEventListener']('click',hideDeleteModal),document[_0x42c36f(0x22b)](_0x42c36f(0x1eb))?.[_0x42c36f(0x1f6)](_0x42c36f(0x20f),confirmDeleteTeam),document['querySelector'](_0x42c36f(0x1b7))?.['addEventListener']('click',hideDeleteModal);}function _0x3799(){const _0x2f391a=['y2XVC2uTDgvHBs1TB2rHBa','y2XVC2uTzgvSzxrLlxrLyw0TBw9KywW','y3jLyxrLqMLUzgLUzW','mtiXmtqZt2v5uu1d','rMfPBgvKihrVigrLBgv0zsb0zwfToIa','y2fUy2vSlxrLyw0','BwvTyMvYCY1SAxn0','zMXLEa','DxnLCM5HBwu','BMfTzq','BgvUz3rO','BwfUywDLCNmTC2vJDgLVBG','pg9WDgLVBIb2ywX1zt0IiJ5qCM9TB3rLigeGBwvTyMvYihrVig1HBMfNzxlIGky8l29WDgLVBJ4','BwvTyMvYCW','mtiWoduYmeDJsKHNzq','DgvHBxmTDgfIBguTyM9KEq','yMLUzgLUz3m','DhjPBq','yMLUzgLUzY1LBNzPCM9UBwvUDa','lM1VzgfSlxrHyI1IDg4','vgvHBsbJCMvHDgvK','BwfUywDLCNm','ywrKlw1HBMfNzxiTyNrU','rgvSzxrLifrLyw0','DMfYkc0Ty29SB3iTDgv4Dc1ZzwnVBMrHCNKP','ywXS','zM9UDfDLAwDODa','qMLUzgLUzYbYzw1VDMvK','DgvHBxmTzxjYB3iTBwvZC2fNzq','DgvHBs1Uyw1L','vgvHBsbUyw1LigLZihjLCxvPCMvK','pg9WDgLVBIb2ywX1zt0IiJ5bzgqGysbTzw1IzxlIGky8l29WDgLVBJ4','nJaW','zMLUza','pc90zd4kicaGicaGphrKpG','CMvTB3zLvgvHBu1HBMfNzxi','ihrLyw0','cIaGicaGicaGica8l2rPDJ4kicaGicaGica8l3rKpGOGicaGica8l3rYpG','mtbkq2fty3q','yMLUzgLUz3mTDgfIBguTyM9KEq','pgj1DhrVBIbJBgfZCZ0IyNrUlwDOB3n0igj0BI1ZBwfSBciGB25JBgLJAZ0ID2LUzg93lMrLBgv0zvrLyw0OjW','vgvHBsbKzwXLDgvK','DgvHBs1TB2rHBc10AxrSzq','zM9JDxm','AhjLzG','ntGZndbZt09RAgy','zgvSzxrLvgvHBq','pgrPDIbZDhLSzt0IzM9UDc1ZAxPLoIaWlJHLBtSGy29SB3i6ihzHCIGTlwnVBg9YlxrLEhqTC2vJB25Kyxj5ktSGBwfYz2LUlxrVCdOGmc4XnxjLBtSIpG','DgvHBujPBMrPBMDZ','pc9KAxy+','twfUywDLCIbHzgrLza','y29UzMLYBs1KzwXLDguTDgvHBq','DgvHBs1TB2rHBc1MB290zxi','z2v0vgvHBxm','ywrKvgvHBu1HBMfNzxi','DgvHBs1KzxnJCMLWDgLVBG','nZj2uLjbCwu','vgvHBsb1CgrHDgvK','cIaGicaGicaGpc90zd4kicaGicaGica8Dgq+','AgfZ','zMLSDgvY','mtiZowXUBNbNAG','ywrKrxzLBNrmAxn0zw5LCG','Bg9NAw4UAhrTBa','zM9YrwfJAa','zMLUzeLUzgv4','AM9PBG','y3vYCMvUDfvZzxi','C3vJy2vZCW','z2v0vxnLCNm','pc9VChrPB24+','DgvHBs1JB3vUDa','CMvTB3zLtwvTyMvYq2XPy2S','C2HVD1rVyxn0','pg9WDgLVBIb2ywX1zt0I','ywrKlw1LBwjLCI1IDg4','C3r5Bgu','z2v0qMLUzgLUz3m','CxvLCNLtzwXLy3rVCG','twfUywDLCIbYzw1VDMvK','zxnJyxbLshrTBa','mty2otjOt2L5Dum','q3jLyxrPBMFIGky','ywrKlw1LBwjLCI1ZzwXLy3q','CxvLCNLtzwXLy3rVCKfSBa','zgvSzxrLqMLUzgLUz0nSAwnR','DgvHBs10ywiTyMLUzgLUz3m','y2XPy2S','ywrKlwjPBMrPBMCTzM9YBq','Axntzxj2zxjbzg1PBG','pc90zd4kicaGicaGphrKpGOGicaGicaGia','qwrKiejPBMrPBMC','BM9Uzq','zgvSzxrPBMDuzwfTswq','C2f2zs10zwfT','ywrKlw1HBMfNzxiTC2vSzwn0','C2f2zs1IAw5KAw5Nlwj0BG','cIaGicaGicaGicaGia','qMLUzgLUzYbHzgrLza','DMfSDwu','cIaGicaGicaGica8l2j1DhrVBJ4kicaGicaGicaGia','zgvSzxrLqMLUzgLUzW','BwfUywDLCL9Uyw1LCW','Dgv4DenVBNrLBNq','pgj1DhrVBIbJBgfZCZ0IyNrUlxnLy29UzgfYEsbIDg4TC21HBgWIig9Uy2XPy2S9iNDPBMrVDY5VCgvUvgvHBu1VzgfSkcC','rMfPBgvKihrVigXVywqGyMLUzgLUz3m6ia','Aw5Uzxjive1m','DgvHBxm','CMvTB3zLvgvHBu1LBwjLCG','y2fUy2vSlwjPBMrPBMCTyNrU','pc90zd4kicaGicaGica8Dgq+','mtK2ndm4nwLgzMz5vq','pc9ZCgfUpGOGicaGicaGidXIDxr0B24GDhLWzt0IyNv0Dg9UiIbJBgfZCZ0IyNrUlwDOB3n0igj0BI1ZBwfSBciGB25JBgLJAZ0ID2LUzg93lNjLBw92zu1HBMfNzxjdBgLJAYGN','pgj1DhrVBIbJBgfZCZ0IyNrUlwDOB3n0igj0BI1ZBwfSBciGB25JBgLJAZ0ID2LUzg93lMrLBgv0zujPBMrPBMDdBgLJAYGN','idXZCgfUihn0EwXLpsjJB2XVCJOGDMfYkc0Ty29SB3iTDgv4Dc1ZzwnVBMrHCNKPoYbMB250lxnPEMu6idaUodvLBtSIpIG','z2v0rwXLBwvUDej5swq','cIaGicaGidX0CJ4kicaGicaGica8DgqGy29SC3bHBJ0InciGC3r5Bgu9iNrLEhqTywXPz246ignLBNrLCJSGy29SB3i6ihzHCIGTlwnVBg9YlxrLEhqTC2vJB25Kyxj5ktSGCgfKzgLUzZOGmNjLBtSIpGOGicaGicaGicaGtM8GDgvHBxmGEwv0lGOGicaGicaGicaG','phaGC3r5Bgu9iMzVBNqTC2L6ztOGmc44nZvYzw07ignVBg9YoIb2yxiOls1JB2XVCI10zxH0lxnLy29UzgfYEsK7ig1HCMDPBJOGmc4YnxjLBsaWoYi+tM8GBwvTyMvYCYb5zxq8l3a+','yMLUzgLUzY1YB2XL','y3jLyxrLlxrLyw0TyNrU','cIaGica8Dhi+cIaGicaGidX0zd4','zw52AxjVBM1LBNrZ','zgLZywjSzwq','otu3mZGWtKz3svzh','zgLZCgXHEq','pgj1DhrVBIb0ExbLpsjIDxr0B24IignSyxnZpsjIDg4Tz2HVC3qGyNrUlxnTywXSiIbVBMnSAwnRpsj3Aw5KB3CUCMvTB3zLtwvTyMvYq2XPy2SOjW','z2v0rw52AxjVBM1LBNrZ','zxjYB3i','y29SB3i','u2f2Aw5N4OcM','mte2mfnZuw5PAa','BwfW','yMLUzgLUz3mTBgLZDc1JB250ywLUzxi','DgvHBs1TB2rHBa','y3jLyxrLvgvHBq','re9nq29UDgvUDeXVywrLza','DgvHBxmTzxjYB3i','DxbKyxrLvgvHBq','z2v0uM9SzurLzMLUAxrPB25Z','Bg9JyxrPB24','cIaGicaGicaGica','BM9YBwfS','jYKIihn0EwXLpsjJB2XVCJOGDMfYkc0Ty29SB3iTzgfUz2vYktSGCgfKzgLUzZOGmc4XnxjLBsaWlJrYzw07igzVBNqTC2L6ztOGmc44CMvToYi+uMvTB3zLpc9IDxr0B24+cIaGicaGidWVzgL2pG','DgvHBs1MB3jTlwvYCM9Y','zgvSzxrLlxrLyw0TBMfTzq','ywn0AxzLvgfI','cIaGicaGidX0CJ4kicaGicaGica8Dgq+cIaGicaGicaGica8yNv0Dg9UignSyxnZpsjIDg4Tz2HVC3qGyNrUlxnTywXSiIbZDhLSzt0IzM9UDc13zwLNAhq6idyWmdSGCgfKzgLUzZOGmdSGDgv4Dc1KzwnVCMf0Aw9UoIb1BMrLCMXPBMu7ihrLEhqTzgvJB3jHDgLVBI1ZDhLSztOGzg90DgvKoYikicaGicaGicaGicaGB25JBgLJAZ0ID2LUzg93lM9Wzw5uzwfTtw9KywWOjW','jYKIpKrLBgv0ztWVyNv0Dg9UpG','twvTyMvYigfKzgvK','BwvZC2fNzq','zgf0yxnLDa','DgvHBs1TB2rHBc10ywjZ','DgvHBxmTy29UDgvUDa','zgv0ywLSCW','ywrKlw1LBwjLCI1YB3C','yM9YzgvYqM90Dg9Tq29SB3i','AgLKzgvU','pc90zd4kicaGicaGica8Dgq+cIaGicaGicaGica8zgL2ignSyxnZpsj1C2vYlwfJDgLVBNmIpGOGicaGicaGicaGica','B3bLBLrLyw1nB2rHBa','DMfYkc0Ty29SB3iTChjPBwfYEsK','jYKIihn0EwXLpsjJB2XVCJOGDMfYkc0Ty29SB3iTzgfUz2vYktSIpLjLBw92ztWVyNv0Dg9UpG','DgvHBxmTBg9HzgLUzW','cIaGicaGidXKAxyGC3r5Bgu9iMrPC3bSyxK6igzSzxG7igfSAwDUlwL0zw1ZoIbJzw50zxi7igP1C3rPzNKTy29UDgvUDdOGC3bHy2uTyMv0D2vLBJSGCgfKzgLUzZOGmc4ZnxjLBsaWoYbIB3jKzxiTyM90Dg9ToIaXChGGC29SAwqGDMfYkc0Ty29SB3iTyM9YzgvYktSIpGOGicaGicaGidXZCgfUihn0EwXLpsjMB250lxnPEMu6idaUodC1CMvToYi+','DgvHBq','jYKIpKvKAxq8l2j1DhrVBJ4','zgvSzxrLlxrLyw0TBw9KywW','zwrPDgLUz1rLyw1jza','q3jLyxrLifrLyw0','DgfI','ywrKlwjPBMrPBMCTyNrU','q2XPy2SGphn0CM9UzZ5dCMvHDguGvgvHBtWVC3rYB25NpIb0BYbNzxqGC3rHCNrLzc4','zgvZy3jPChrPB24','DxnLCNm','CM9Szv9Uyw1L','i3rLyw0TBw9KywWGlM1VzgfSlw92zxjSyxK','Aw5JBhvKzxm','CMv0CNKTDgvHBxmTyNrU','i2rLBgv0zs10zwfTlw1VzgfSic5TB2rHBc1VDMvYBgf5'];_0x3799=function(){return _0x2f391a;};return _0x3799();}function showCreateTeamModal(){const _0x129ebe=_0x4a1b45;state[_0x129ebe(0x1ac)]=null,state[_0x129ebe(0x197)]=_0x129ebe(0x19f),document[_0x129ebe(0x22b)]('team-modal-title')[_0x129ebe(0x21f)]=_0x129ebe(0x1ad),document[_0x129ebe(0x22b)](_0x129ebe(0x1d5))['value']='',document['getElementById'](_0x129ebe(0x1d5))[_0x129ebe(0x232)]=![],document['getElementById']('team-description')[_0x129ebe(0x21b)]='',document[_0x129ebe(0x22b)](_0x129ebe(0x1ef))[_0x129ebe(0x232)]=![],document[_0x129ebe(0x22b)](_0x129ebe(0x195))['hidden']=!![],document[_0x129ebe(0x22b)]('team-modal-tabs')[_0x129ebe(0x1a2)]=!![],document[_0x129ebe(0x22b)]('members-section')[_0x129ebe(0x1a2)]=!![],document[_0x129ebe(0x22b)]('save-team')['hidden']=![],document[_0x129ebe(0x22b)](_0x129ebe(0x1ec))['hidden']=![],showTab(_0x129ebe(0x19f)),document[_0x129ebe(0x22b)](_0x129ebe(0x23d))['hidden']=![],setTimeout(()=>document['getElementById'](_0x129ebe(0x1d5))[_0x129ebe(0x1e3)](),0x64);}window[_0x4a1b45(0x1a4)]=function(_0x27d01e){const _0x3707ac=_0x4a1b45,_0xf5f08e=state[_0x3707ac(0x223)][_0x3707ac(0x1d9)](_0x5a64f4=>_0x5a64f4['id']===_0x27d01e);if(!_0xf5f08e)return;state[_0x3707ac(0x1ac)]=_0x27d01e,state[_0x3707ac(0x197)]=_0x3707ac(0x19f);const _0x53181f=state[_0x3707ac(0x1fb)]?.[_0x3707ac(0x211)],_0x2da6bc=(_0xf5f08e[_0x3707ac(0x1cd)]||[])[_0x3707ac(0x1b5)](state[_0x3707ac(0x1fb)]?.['id']),_0x8030a7=_0x53181f||_0x2da6bc;document[_0x3707ac(0x22b)]('team-modal-title')[_0x3707ac(0x21f)]=_0xf5f08e[_0x3707ac(0x1c1)],document[_0x3707ac(0x22b)](_0x3707ac(0x1d5))['value']=_0xf5f08e[_0x3707ac(0x1c1)],document[_0x3707ac(0x22b)](_0x3707ac(0x1d5))[_0x3707ac(0x232)]=!_0x8030a7,document[_0x3707ac(0x22b)]('team-description')['value']=_0xf5f08e[_0x3707ac(0x1b1)]||'',document['getElementById'](_0x3707ac(0x1ef))[_0x3707ac(0x232)]=!_0x8030a7,document[_0x3707ac(0x22b)](_0x3707ac(0x195))[_0x3707ac(0x1a2)]=!![],document[_0x3707ac(0x22b)](_0x3707ac(0x19d))['hidden']=![],document[_0x3707ac(0x22b)]('members-section')[_0x3707ac(0x1a2)]=![],document['getElementById'](_0x3707ac(0x216))[_0x3707ac(0x1a2)]=!_0x8030a7,document['getElementById'](_0x3707ac(0x1c3))[_0x3707ac(0x1a2)]=!_0x53181f,setActiveTabButton(_0x3707ac(0x19f)),renderMembersList(_0xf5f08e),updateMemberSelect(_0xf5f08e),_0x53181f&&(renderManagersList(_0xf5f08e),updateManagerSelect(_0xf5f08e)),showTab(_0x3707ac(0x19f)),document[_0x3707ac(0x22b)](_0x3707ac(0x23d))['hidden']=![];};function hideTeamModal(){const _0x14df40=_0x4a1b45;document[_0x14df40(0x22b)]('team-modal')[_0x14df40(0x1a2)]=!![],document[_0x14df40(0x22b)](_0x14df40(0x1d5))[_0x14df40(0x232)]=![],document[_0x14df40(0x22b)](_0x14df40(0x1ef))[_0x14df40(0x232)]=![],state['editingTeamId']=null;}function switchTab(_0x334c26){const _0x45b083=_0x4a1b45;state[_0x45b083(0x197)]=_0x334c26,setActiveTabButton(_0x334c26),showTab(_0x334c26),_0x334c26===_0x45b083(0x1c8)&&state[_0x45b083(0x1ac)]&&loadTeamBindings(state[_0x45b083(0x1ac)]);}function setActiveTabButton(_0x2ef80b){const _0x3d58f6=_0x4a1b45;document[_0x3d58f6(0x20c)](_0x3d58f6(0x1cb))[_0x3d58f6(0x1f8)](_0x317684=>{const _0x1a4aca=_0x3d58f6,_0x598802=_0x317684['dataset'][_0x1a4aca(0x1ae)]===_0x2ef80b;_0x317684[_0x1a4aca(0x204)][_0x1a4aca(0x1a1)]=_0x598802?'var(--color-primary)':'transparent',_0x317684[_0x1a4aca(0x204)][_0x1a4aca(0x238)]=_0x598802?_0x1a4aca(0x1a5):_0x1a4aca(0x1d0),_0x317684[_0x1a4aca(0x204)][_0x1a4aca(0x1d2)]=_0x598802?_0x1a4aca(0x1d8):_0x1a4aca(0x193);});}function showTab(_0x546567){const _0x52ee9d=_0x4a1b45;document[_0x52ee9d(0x22b)]('team-tab-details')[_0x52ee9d(0x1a2)]=_0x546567!=='details',document['getElementById'](_0x52ee9d(0x20e))[_0x52ee9d(0x1a2)]=_0x546567!==_0x52ee9d(0x1c8),document[_0x52ee9d(0x22b)](_0x52ee9d(0x1ec))['hidden']=_0x546567===_0x52ee9d(0x1c8);}function renderMembersList(_0x3b9717){const _0x23d472=_0x4a1b45,_0x4137a4=state['currentUser']?.[_0x23d472(0x211)],_0x443b28=(_0x3b9717['managers']||[])['includes'](state[_0x23d472(0x1fb)]?.['id']),_0x3ba710=_0x4137a4||_0x443b28,_0x3ebefa=_0x3b9717[_0x23d472(0x1c5)]||[],_0x362340=document[_0x23d472(0x22b)](_0x23d472(0x1be));if(_0x3ebefa[_0x23d472(0x1c2)]===0x0){_0x362340['innerHTML']=_0x23d472(0x22d);return;}_0x362340[_0x23d472(0x222)]=_0x3ebefa[_0x23d472(0x23b)](_0x29db8c=>{const _0x524ee2=_0x23d472,_0x176feb=state[_0x524ee2(0x1b2)]['find'](_0x50051a=>_0x50051a['id']===_0x29db8c),_0x48303f=_0x176feb?''+Utils[_0x524ee2(0x208)](_0x176feb['username'])+(_0x176feb[_0x524ee2(0x1c1)]?_0x524ee2(0x22a)+Utils['escapeHtml'](_0x176feb[_0x524ee2(0x1c1)])+')</span>':''):Utils['escapeHtml'](_0x29db8c),_0x4d78f3=(_0x3b9717[_0x524ee2(0x1cd)]||[])['includes'](_0x29db8c);return'\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:\x20flex;\x20align-items:\x20center;\x20justify-content:\x20space-between;\x20padding:\x200.35rem\x200;\x20border-bottom:\x201px\x20solid\x20var(--color-border);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:\x200.875rem;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x48303f+_0x524ee2(0x192)+(_0x4d78f3?'<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'+(_0x3ba710?_0x524ee2(0x235)+_0x29db8c+'\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>';})[_0x23d472(0x1fa)]('');const _0x259b38=document[_0x23d472(0x22b)](_0x23d472(0x1a0));if(_0x259b38)_0x259b38[_0x23d472(0x204)][_0x23d472(0x234)]=_0x3ba710?_0x23d472(0x1bf):_0x23d472(0x214);}function renderManagersList(_0x5118cc){const _0x1a5d83=_0x4a1b45,_0x520a64=_0x5118cc[_0x1a5d83(0x1cd)]||[],_0x466ccb=document[_0x1a5d83(0x22b)]('managers-list');if(_0x520a64[_0x1a5d83(0x1c2)]===0x0){_0x466ccb[_0x1a5d83(0x222)]='<p\x20style=\x22font-size:\x200.875rem;\x20color:\x20var(--color-text-secondary);\x20margin:\x200.25rem\x200;\x22>No\x20managers</p>';return;}_0x466ccb[_0x1a5d83(0x222)]=_0x520a64['map'](_0x4400b0=>{const _0x5b4874=_0x1a5d83,_0xe78455=state[_0x5b4874(0x1b2)][_0x5b4874(0x1d9)](_0x20f1ec=>_0x20f1ec['id']===_0x4400b0),_0x499858=_0xe78455?Utils[_0x5b4874(0x208)](_0xe78455[_0x5b4874(0x1c0)]):Utils[_0x5b4874(0x208)](_0x4400b0);return _0x5b4874(0x1a8)+_0x499858+_0x5b4874(0x228)+_0x4400b0+_0x5b4874(0x194);})[_0x1a5d83(0x1fa)]('');}function updateMemberSelect(_0x9f3deb){const _0x2e89f3=_0x4a1b45,_0x18b94e=document[_0x2e89f3(0x22b)](_0x2e89f3(0x20b));if(!_0x18b94e)return;const _0x1d4b35=new Set(_0x9f3deb[_0x2e89f3(0x1c5)]||[]),_0x3b468f=state[_0x2e89f3(0x1b2)][_0x2e89f3(0x1f4)](_0x40167b=>!_0x1d4b35[_0x2e89f3(0x1f3)](_0x40167b['id']));_0x18b94e[_0x2e89f3(0x222)]=_0x2e89f3(0x1d7)+_0x3b468f[_0x2e89f3(0x23b)](_0x51b854=>_0x2e89f3(0x202)+_0x51b854['id']+'\x22>'+Utils['escapeHtml'](_0x51b854[_0x2e89f3(0x1c0)])+(_0x51b854[_0x2e89f3(0x1c1)]?'\x20('+Utils[_0x2e89f3(0x208)](_0x51b854[_0x2e89f3(0x1c1)])+')':'')+'</option>')['join']('');}function updateManagerSelect(_0x4d5d1a){const _0x38e7ff=_0x4a1b45,_0x592af1=document[_0x38e7ff(0x22b)]('add-manager-select');if(!_0x592af1)return;const _0x315f44=new Set(_0x4d5d1a['managers']||[]),_0x1b0d2c=(_0x4d5d1a[_0x38e7ff(0x1c5)]||[])[_0x38e7ff(0x1f4)](_0x8e759e=>!_0x315f44['has'](_0x8e759e))[_0x38e7ff(0x23b)](_0x478f6e=>state['users'][_0x38e7ff(0x1d9)](_0x8138ac=>_0x8138ac['id']===_0x478f6e))[_0x38e7ff(0x1f4)](Boolean);_0x592af1['innerHTML']=_0x38e7ff(0x1c4)+_0x1b0d2c['map'](_0x4f6452=>_0x38e7ff(0x202)+_0x4f6452['id']+'\x22>'+Utils[_0x38e7ff(0x208)](_0x4f6452[_0x38e7ff(0x1c0)])+_0x38e7ff(0x1fe))[_0x38e7ff(0x1fa)]('');}async function addMember(){const _0x1146f3=_0x4a1b45,_0x350c=document[_0x1146f3(0x22b)]('add-member-select'),_0x316a70=_0x350c['value'];if(!_0x316a70||!state[_0x1146f3(0x1ac)])return;try{const {team:_0x3473ae}=await API['addTeamMember'](state[_0x1146f3(0x1ac)],_0x316a70);syncTeamInState(_0x3473ae),renderMembersList(_0x3473ae),updateMemberSelect(_0x3473ae),state[_0x1146f3(0x1fb)]?.[_0x1146f3(0x211)]&&(renderManagersList(_0x3473ae),updateManagerSelect(_0x3473ae)),_0x350c[_0x1146f3(0x21b)]='',Utils['showToast'](_0x1146f3(0x19a),_0x1146f3(0x1fc));}catch(_0x2a294e){Utils[_0x1146f3(0x201)](_0x2a294e[_0x1146f3(0x19b)],'error');}}async function addManager(){const _0x27cde7=_0x4a1b45,_0xff2354=document[_0x27cde7(0x22b)](_0x27cde7(0x217)),_0x1cd0af=_0xff2354[_0x27cde7(0x21b)];if(!_0x1cd0af||!state[_0x27cde7(0x1ac)])return;try{const {team:_0xb48dc2}=await API[_0x27cde7(0x1ee)](state[_0x27cde7(0x1ac)],_0x1cd0af);syncTeamInState(_0xb48dc2),renderMembersList(_0xb48dc2),renderManagersList(_0xb48dc2),updateManagerSelect(_0xb48dc2),_0xff2354[_0x27cde7(0x21b)]='',Utils[_0x27cde7(0x201)](_0x27cde7(0x1ea),_0x27cde7(0x1fc));}catch(_0x1d11ec){Utils[_0x27cde7(0x201)](_0x1d11ec['message'],_0x27cde7(0x237));}}window[_0x4a1b45(0x200)]=async function(_0x404b64){const _0x306ab9=_0x4a1b45;if(!state[_0x306ab9(0x1ac)])return;try{const {team:_0x40c0f2}=await API[_0x306ab9(0x224)](state[_0x306ab9(0x1ac)],_0x404b64);syncTeamInState(_0x40c0f2),renderMembersList(_0x40c0f2),updateMemberSelect(_0x40c0f2),state[_0x306ab9(0x1fb)]?.[_0x306ab9(0x211)]&&(renderManagersList(_0x40c0f2),updateManagerSelect(_0x40c0f2)),Utils[_0x306ab9(0x201)]('Member\x20removed',_0x306ab9(0x1fc));}catch(_0x369dad){Utils[_0x306ab9(0x201)](_0x369dad[_0x306ab9(0x19b)],'error');}},window['removeManagerClick']=async function(_0x9e59e2){const _0x23b6f6=_0x4a1b45;if(!state[_0x23b6f6(0x1ac)])return;try{const {team:_0x3ecc18}=await API[_0x23b6f6(0x1db)](state[_0x23b6f6(0x1ac)],_0x9e59e2);syncTeamInState(_0x3ecc18),renderManagersList(_0x3ecc18),updateManagerSelect(_0x3ecc18),Utils[_0x23b6f6(0x201)](_0x23b6f6(0x207),_0x23b6f6(0x1fc));}catch(_0x1e128b){Utils[_0x23b6f6(0x201)](_0x1e128b[_0x23b6f6(0x19b)],'error');}};async function loadTeamBindings(_0x472350){const _0x39625f=_0x4a1b45,_0x1d8c33=document[_0x39625f(0x22b)]('bindings-loading'),_0x14b83f=document[_0x39625f(0x22b)]('bindings-empty'),_0xfe22fe=document['getElementById'](_0x39625f(0x23c)),_0x4e7e7b=document[_0x39625f(0x22b)](_0x39625f(0x1af));_0x1d8c33[_0x39625f(0x1a2)]=![],_0x14b83f[_0x39625f(0x1a2)]=!![],_0xfe22fe['style'][_0x39625f(0x234)]=_0x39625f(0x214),_0x4e7e7b[_0x39625f(0x1a2)]=!![],document[_0x39625f(0x22b)]('add-binding-form')[_0x39625f(0x1a2)]=!![];try{const {bindings:_0x575a06}=await API[_0x39625f(0x205)]({'subject_type':'team','subject_id':_0x472350});state[_0x39625f(0x1e8)]=_0x575a06||[],_0x1d8c33['hidden']=!![],state[_0x39625f(0x1e8)]['length']===0x0?_0x14b83f[_0x39625f(0x1a2)]=![]:(_0xfe22fe[_0x39625f(0x204)][_0x39625f(0x234)]='',renderBindingsTable()),state[_0x39625f(0x1fb)]?.[_0x39625f(0x211)]&&(_0x4e7e7b[_0x39625f(0x1a2)]=![]);}catch(_0x545cf0){_0x1d8c33[_0x39625f(0x1a2)]=!![],Utils['showToast'](_0x39625f(0x221)+_0x545cf0[_0x39625f(0x19b)],_0x39625f(0x237));}}function renderBindingsTable(){const _0x23dd29=_0x4a1b45,_0x527c0f=document['getElementById'](_0x23dd29(0x1df));if(!_0x527c0f)return;const _0x1fdc0f=state['currentUser']?.[_0x23dd29(0x211)];_0x527c0f[_0x23dd29(0x222)]=state['teamBindings'][_0x23dd29(0x23b)](_0x1a2be5=>_0x23dd29(0x230)+Utils['escapeHtml'](_0x1a2be5['environment'])+_0x23dd29(0x1da)+Utils[_0x23dd29(0x208)](_0x1a2be5[_0x23dd29(0x1b3)]||_0x1a2be5['role_id'])+_0x23dd29(0x212)+(_0x1fdc0f?_0x23dd29(0x229)+_0x1a2be5['id']+_0x23dd29(0x1a6):'—')+'\x0a\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20</tr>')[_0x23dd29(0x1fa)]('');}function populateBindingForm(){const _0x3da83a=_0x4a1b45,_0x5afb00=document[_0x3da83a(0x22b)]('binding-environment'),_0x4defa1=document[_0x3da83a(0x22b)](_0x3da83a(0x22e)),_0x1a2b87=new Set(state[_0x3da83a(0x1e8)]['map'](_0x4245a3=>_0x4245a3['environment'])),_0x12f8fd=state[_0x3da83a(0x231)][_0x3da83a(0x1f4)](_0x2713ac=>!_0x1a2b87[_0x3da83a(0x1f3)](_0x2713ac[_0x3da83a(0x1c1)]));_0x5afb00[_0x3da83a(0x222)]=_0x12f8fd[_0x3da83a(0x1c2)]?_0x12f8fd[_0x3da83a(0x23b)](_0xa7fef9=>_0x3da83a(0x202)+Utils[_0x3da83a(0x208)](_0xa7fef9[_0x3da83a(0x1c1)])+'\x22>'+Utils[_0x3da83a(0x208)](_0xa7fef9[_0x3da83a(0x1c1)])+_0x3da83a(0x1fe))['join'](''):'<option\x20value=\x22\x22>All\x20environments\x20already\x20bound</option>',_0x4defa1['innerHTML']=state['roles'][_0x3da83a(0x23b)](_0x35a213=>'<option\x20value=\x22'+_0x35a213['id']+'\x22>'+Utils['escapeHtml'](_0x35a213[_0x3da83a(0x1c1)])+'</option>')['join']('');}function _0x1ea7(_0x36ff08,_0x2a4e1a){_0x36ff08=_0x36ff08-0x191;const _0x379988=_0x3799();let _0x1ea7be=_0x379988[_0x36ff08];if(_0x1ea7['ytlJfN']===undefined){var _0x2cb8e8=function(_0x30271f){const _0x1bd141='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x33ab41='',_0x5c9697='';for(let _0x49c54f=0x0,_0x298c61,_0x31ff9f,_0x8677df=0x0;_0x31ff9f=_0x30271f['charAt'](_0x8677df++);~_0x31ff9f&&(_0x298c61=_0x49c54f%0x4?_0x298c61*0x40+_0x31ff9f:_0x31ff9f,_0x49c54f++%0x4)?_0x33ab41+=String['fromCharCode'](0xff&_0x298c61>>(-0x2*_0x49c54f&0x6)):0x0){_0x31ff9f=_0x1bd141['indexOf'](_0x31ff9f);}for(let _0x340e34=0x0,_0x2fe86f=_0x33ab41['length'];_0x340e34<_0x2fe86f;_0x340e34++){_0x5c9697+='%'+('00'+_0x33ab41['charCodeAt'](_0x340e34)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5c9697);};_0x1ea7['jSRuuR']=_0x2cb8e8,_0x1ea7['uMDjrX']={},_0x1ea7['ytlJfN']=!![];}const _0x5b09e5=_0x379988[0x0],_0x899add=_0x36ff08+_0x5b09e5,_0x5e401d=_0x1ea7['uMDjrX'][_0x899add];return!_0x5e401d?(_0x1ea7be=_0x1ea7['jSRuuR'](_0x1ea7be),_0x1ea7['uMDjrX'][_0x899add]=_0x1ea7be):_0x1ea7be=_0x5e401d,_0x1ea7be;}async function saveBinding(){const _0x3813d0=_0x4a1b45,_0x322198=document[_0x3813d0(0x22b)](_0x3813d0(0x1ca))['value'],_0x277c5c=document['getElementById'](_0x3813d0(0x22e))[_0x3813d0(0x21b)];if(!_0x322198||!_0x277c5c||!state[_0x3813d0(0x1ac)])return;const _0x200b1d=document[_0x3813d0(0x22b)]('save-binding-btn');_0x200b1d[_0x3813d0(0x232)]=!![],_0x200b1d[_0x3813d0(0x21f)]='Adding…';try{await API[_0x3813d0(0x1ba)]({'subject_type':_0x3813d0(0x1a9),'subject_id':state[_0x3813d0(0x1ac)],'role_id':_0x277c5c,'environment':_0x322198}),Utils[_0x3813d0(0x201)](_0x3813d0(0x21a),_0x3813d0(0x1fc)),document[_0x3813d0(0x22b)](_0x3813d0(0x210))[_0x3813d0(0x1a2)]=!![],document[_0x3813d0(0x22b)](_0x3813d0(0x1af))['hidden']=![],await loadTeamBindings(state[_0x3813d0(0x1ac)]);}catch(_0x3de743){Utils[_0x3813d0(0x201)](_0x3de743['message'],'error');}finally{_0x200b1d[_0x3813d0(0x232)]=![],_0x200b1d['textContent']=_0x3813d0(0x213);}}window[_0x4a1b45(0x20d)]=async function(_0x1dc8fb){const _0x3a18fd=_0x4a1b45;try{await API[_0x3a18fd(0x21d)](_0x1dc8fb),Utils[_0x3a18fd(0x201)](_0x3a18fd(0x1d3),_0x3a18fd(0x1fc)),await loadTeamBindings(state[_0x3a18fd(0x1ac)]);}catch(_0x5be23a){Utils[_0x3a18fd(0x201)](_0x5be23a[_0x3a18fd(0x19b)],_0x3a18fd(0x237));}};async function saveTeam(){const _0x19e23c=_0x4a1b45,_0x50b84e=document[_0x19e23c(0x22b)]('team-name')['value']['trim'](),_0x386233=document[_0x19e23c(0x22b)]('team-description')[_0x19e23c(0x21b)][_0x19e23c(0x1c9)](),_0x2f6d28=document['getElementById'](_0x19e23c(0x195)),_0x5a823f=document[_0x19e23c(0x22b)](_0x19e23c(0x216));if(!_0x50b84e){_0x2f6d28[_0x19e23c(0x21f)]=_0x19e23c(0x1d6),_0x2f6d28['hidden']=![];return;}_0x2f6d28[_0x19e23c(0x1a2)]=!![];const _0x375f47=_0x5a823f[_0x19e23c(0x21f)];_0x5a823f['disabled']=!![],_0x5a823f[_0x19e23c(0x21f)]=state['editingTeamId']?_0x19e23c(0x239):_0x19e23c(0x20a);try{if(state[_0x19e23c(0x1ac)]){const {team:_0x5e131b}=await API[_0x19e23c(0x241)](state[_0x19e23c(0x1ac)],{'name':_0x50b84e,'description':_0x386233});syncTeamInState(_0x5e131b),document[_0x19e23c(0x22b)](_0x19e23c(0x1e2))[_0x19e23c(0x21f)]=_0x5e131b['name'],Utils[_0x19e23c(0x201)](_0x19e23c(0x1f1),_0x19e23c(0x1fc));}else await API[_0x19e23c(0x23e)]({'name':_0x50b84e,'description':_0x386233}),Utils[_0x19e23c(0x201)](_0x19e23c(0x1cc),'success'),hideTeamModal(),await loadTeams();state[_0x19e23c(0x1ac)]&&(_0x5a823f['disabled']=![],_0x5a823f[_0x19e23c(0x21f)]=_0x375f47);}catch(_0x5b7a00){_0x2f6d28[_0x19e23c(0x21f)]=_0x5b7a00[_0x19e23c(0x19b)],_0x2f6d28['hidden']=![],_0x5a823f[_0x19e23c(0x232)]=![],_0x5a823f['textContent']=_0x375f47;}}window[_0x4a1b45(0x1e6)]=function(_0x55e2ee){const _0x3dd710=_0x4a1b45,_0x428065=state['teams'][_0x3dd710(0x1d9)](_0x525907=>_0x525907['id']===_0x55e2ee);if(!_0x428065)return;state[_0x3dd710(0x215)]=_0x55e2ee,document[_0x3dd710(0x22b)](_0x3dd710(0x196))[_0x3dd710(0x21f)]=_0x428065[_0x3dd710(0x1c1)],document[_0x3dd710(0x22b)](_0x3dd710(0x1ab))[_0x3dd710(0x1a2)]=![];};function hideDeleteModal(){const _0x21dcf7=_0x4a1b45;document['getElementById']('delete-team-modal')[_0x21dcf7(0x1a2)]=!![],state[_0x21dcf7(0x215)]=null;}async function confirmDeleteTeam(){const _0x5ea829=_0x4a1b45;if(!state[_0x5ea829(0x215)])return;const _0x14ab53=document[_0x5ea829(0x22b)](_0x5ea829(0x1eb));_0x14ab53[_0x5ea829(0x232)]=!![],_0x14ab53['textContent']='Deleting…';try{await API[_0x5ea829(0x1e6)](state[_0x5ea829(0x215)]),Utils[_0x5ea829(0x201)](_0x5ea829(0x1e1),_0x5ea829(0x1fc)),hideDeleteModal(),await loadTeams();}catch(_0x261ed7){Utils['showToast'](_0x5ea829(0x1bc)+_0x261ed7[_0x5ea829(0x19b)],_0x5ea829(0x237)),_0x14ab53[_0x5ea829(0x232)]=![],_0x14ab53['textContent']=_0x5ea829(0x1cf);}}function syncTeamInState(_0x5ec009){const _0x1410df=_0x4a1b45,_0x18c758=state[_0x1410df(0x223)][_0x1410df(0x1f9)](_0x3328aa=>_0x3328aa['id']===_0x5ec009['id']);if(_0x18c758>=0x0)state['teams'][_0x18c758]=_0x5ec009;renderTeams();}
|
|
1
|
+
import{API,Utils,initializeAdminMenu}from'./app.js';import{initTheme,mountThemeToggle}from'./theme.js';const state={'teams':[],'users':[],'roles':[],'environments':[],'teamBindings':[],'currentUser':null,'editingTeamId':null,'bindingsTeamId':null,'deletingTeamId':null,'modalSnapshot':null};document['addEventListener']('DOMContentLoaded',async()=>{initTheme(),mountThemeToggle();try{state['currentUser']=await API['getCurrentUser']();}catch{window['location']['href']='login.html';return;}await initializeAdminMenu(state['currentUser']);const _0x452987=state['currentUser'];if(!_0x452987['hasAllPermissions']&&!_0x452987['canManageTeams']&&!_0x452987['hasEnvironmentBindings']&&!_0x452987['hasEnvironmentAdmin']){Utils['showToast']('Access\x20denied:\x20You\x20do\x20not\x20have\x20permission\x20to\x20view\x20teams','error'),setTimeout(()=>{window['location']['href']='index.html';},0x7d0);return;}(_0x452987['hasAllPermissions']||_0x452987['canManageTeams'])&&(document['getElementById']('create-team-btn')['hidden']=![]),bindEventListeners(),await Promise['all']([loadTeams(),loadUsers(),loadRoles(),loadEnvironments()]),renderTeams();});async function loadTeams(){const _0x36e362=document['getElementById']('teams-loading'),_0x465a34=document['getElementById']('teams-error'),_0x53a740=document['getElementById']('teams-content');try{_0x36e362['hidden']=![],_0x465a34['hidden']=!![],_0x53a740['hidden']=!![];const {teams:_0x34d0fb}=await API['getTeams']();state['teams']=_0x34d0fb||[],renderTeams(),_0x36e362['hidden']=!![],_0x53a740['hidden']=![];}catch(_0x200586){_0x36e362['hidden']=!![],_0x465a34['hidden']=![],document['getElementById']('teams-error-message')['textContent']=_0x200586['message'];}}async function loadUsers(){try{const {users:_0x23e207}=await API['getUsers']();state['users']=_0x23e207||[];}catch{state['users']=[];}}async function loadRoles(){try{const {roles:_0x1b3b01}=await API['getRoleDefinitions']();state['roles']=_0x1b3b01||[];}catch{state['roles']=[];}}async function loadEnvironments(){try{const _0x5075da=await API['getEnvironments']();state['environments']=_0x5075da['environments']||[];}catch{state['environments']=[];}}function renderTeams(){const _0x2d424f=document['getElementById']('teams-table-body'),_0x1db27e=document['getElementById']('team-count');if(!_0x2d424f)return;_0x1db27e&&(_0x1db27e['textContent']=state['teams']['length']+'\x20team'+(state['teams']['length']===0x1?'':'s'));if(state['teams']['length']===0x0){_0x2d424f['innerHTML']='\x0a\x20\x20\x20\x20\x20\x20<tr>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<td\x20colspan=\x223\x22\x20style=\x22text-align:\x20center;\x20color:\x20var(--color-text-secondary);\x20padding:\x202rem;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20No\x20teams\x20yet.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(state['currentUser']?.['hasAllPermissions']||state['currentUser']?.['canManageTeams']?'Click\x20<strong>Create\x20Team</strong>\x20to\x20get\x20started.':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20</tr>';return;}const _0x3d9cca=state['currentUser']?.['hasAllPermissions'];_0x2d424f['innerHTML']=state['teams']['map'](_0x1f7b1c=>{const _0xf726fc=_0x3d9cca||_0x1f7b1c['canManageTeam'],_0x535e08=_0x3d9cca||_0x1f7b1c['canManageMembers'],_0x3cdb4d=_0xf726fc||_0x535e08,_0x43792b=(_0x1f7b1c['members']||[])['length'];return'\x0a\x20\x20\x20\x20\x20\x20<tr>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-weight:\x20600;\x22>'+Utils['escapeHtml'](_0x1f7b1c['name'])+'</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x1f7b1c['description']?'<div\x20style=\x22font-size:\x200.8em;\x20color:\x20var(--color-text-secondary);\x20margin-top:\x200.15rem;\x22>'+Utils['escapeHtml'](_0x1f7b1c['description'])+'</div>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<td>'+_0x43792b+'</td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22user-actions\x22\x20style=\x22display:\x20flex;\x20gap:\x200.25rem;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x3cdb4d?'<button\x20class=\x22btn-icon\x22\x20title=\x22Edit\x20team\x22\x20onclick=\x22window.openTeamModal(\x27'+_0x1f7b1c['id']+'\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2216\x22\x20height=\x2216\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>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M11\x204H4a2\x202\x200\x200\x200-2\x202v14a2\x202\x200\x200\x200\x202\x202h14a2\x202\x200\x200\x200\x202-2v-7\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M18.5\x202.5a2.121\x202.121\x200\x200\x201\x203\x203L12\x2015l-4\x201\x201-4\x209.5-9.5z\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0xf726fc?'<button\x20class=\x22btn-icon\x22\x20title=\x22Access\x20bindings\x22\x20onclick=\x22window.openBindingsModal(\x27'+_0x1f7b1c['id']+'\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2216\x22\x20height=\x2216\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>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M12\x2022s8-4\x208-10V5l-8-3-8\x203v7c0\x206\x208\x2010\x208\x2010z\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0xf726fc?'<button\x20class=\x22btn-icon\x20btn-danger\x22\x20title=\x22Delete\x20team\x22\x20onclick=\x22window.deleteTeam(\x27'+_0x1f7b1c['id']+'\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2216\x22\x20height=\x2216\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>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<polyline\x20points=\x223\x206\x205\x206\x2021\x206\x22></polyline>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M19\x206v14a2\x202\x200\x200\x201-2\x202H7a2\x202\x200\x200\x201-2-2V6m3\x200V4a2\x202\x200\x200\x201\x202-2h4a2\x202\x200\x200\x201\x202\x202v2\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>':'')+'\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(){document['getElementById']('create-team-btn')?.['addEventListener']('click',showCreateTeamModal),document['getElementById']('retry-teams-btn')?.['addEventListener']('click',loadTeams),document['getElementById']('close-team-modal')?.['addEventListener']('click',requestHideTeamModal),document['getElementById']('cancel-team')?.['addEventListener']('click',requestHideTeamModal),document['getElementById']('save-team')?.['addEventListener']('click',saveTeam),document['querySelector']('#team-modal\x20.modal-overlay')?.['addEventListener']('click',requestHideTeamModal),document['getElementById']('add-member-btn')?.['addEventListener']('click',addMember),document['getElementById']('close-bindings-modal')?.['addEventListener']('click',hideBindingsModal),document['querySelector']('#bindings-modal\x20.modal-overlay')?.['addEventListener']('click',hideBindingsModal),document['getElementById']('add-binding-btn')?.['addEventListener']('click',()=>{document['getElementById']('add-binding-form')['hidden']=![],document['getElementById']('add-binding-btn')['hidden']=!![],populateBindingForm();}),document['getElementById']('cancel-binding-btn')?.['addEventListener']('click',()=>{document['getElementById']('add-binding-form')['hidden']=!![],document['getElementById']('add-binding-btn')['hidden']=![];}),document['getElementById']('save-binding-btn')?.['addEventListener']('click',saveBinding),document['getElementById']('binding-resource-type')?.['addEventListener']('change',onBindingResourceTypeChange),document['getElementById']('close-delete-team-modal')?.['addEventListener']('click',hideDeleteModal),document['getElementById']('cancel-delete-team')?.['addEventListener']('click',hideDeleteModal),document['getElementById']('confirm-delete-team')?.['addEventListener']('click',confirmDeleteTeam),document['querySelector']('#delete-team-modal\x20.modal-overlay')?.['addEventListener']('click',hideDeleteModal);}function showCreateTeamModal(){state['editingTeamId']=null,state['modalSnapshot']={'name':'','description':''},document['getElementById']('team-modal-title')['textContent']='Create\x20Team',document['getElementById']('team-name')['value']='',document['getElementById']('team-name')['disabled']=![],document['getElementById']('team-description')['value']='',document['getElementById']('team-description')['disabled']=![],document['getElementById']('team-form-error')['hidden']=!![],document['getElementById']('members-section')['hidden']=!![],document['getElementById']('save-team')['hidden']=![],document['getElementById']('team-modal-footer')['hidden']=![],document['getElementById']('team-modal')['hidden']=![],setTimeout(()=>document['getElementById']('team-name')['focus'](),0x64);}window['openTeamModal']=function(_0x1ffbcc){const _0x1fa3ce=state['teams']['find'](_0x1f2a1f=>_0x1f2a1f['id']===_0x1ffbcc);if(!_0x1fa3ce)return;state['editingTeamId']=_0x1ffbcc;const _0x483d9a=state['currentUser']?.['hasAllPermissions'],_0x451716=_0x483d9a||_0x1fa3ce['canManageTeam'],_0x522377=_0x483d9a||_0x1fa3ce['canManageMembers'],_0x3a5d3c=_0x451716,_0x14d85a=_0x451716||_0x522377,_0x19b273=_0x1fa3ce['name'],_0x44a436=_0x1fa3ce['description']||'';state['modalSnapshot']={'name':_0x19b273,'description':_0x44a436},document['getElementById']('team-modal-title')['textContent']=_0x19b273,document['getElementById']('team-name')['value']=_0x19b273,document['getElementById']('team-name')['disabled']=!_0x3a5d3c,document['getElementById']('team-description')['value']=_0x44a436,document['getElementById']('team-description')['disabled']=!_0x3a5d3c,document['getElementById']('team-form-error')['hidden']=!![],document['getElementById']('members-section')['hidden']=![],document['getElementById']('save-team')['hidden']=!_0x3a5d3c,renderMembersList(_0x1fa3ce),updateMemberSelect(_0x1fa3ce),document['getElementById']('team-modal')['hidden']=![];};function isTeamModalDirty(){if(!state['modalSnapshot'])return![];const _0x3e02f4=document['getElementById']('team-name')['value']['trim'](),_0x2c4f06=document['getElementById']('team-description')['value']['trim']();return _0x3e02f4!==state['modalSnapshot']['name']||_0x2c4f06!==state['modalSnapshot']['description'];}function requestHideTeamModal(){if(isTeamModalDirty()){if(!confirm('You\x20have\x20unsaved\x20changes.\x20Discard\x20them?'))return;}hideTeamModal();}function hideTeamModal(){document['getElementById']('team-modal')['hidden']=!![],document['getElementById']('team-name')['disabled']=![],document['getElementById']('team-description')['disabled']=![],state['editingTeamId']=null,state['modalSnapshot']=null;}window['openBindingsModal']=function(_0x1fc686){const _0x5a20e7=state['teams']['find'](_0xbb614b=>_0xbb614b['id']===_0x1fc686);if(!_0x5a20e7)return;state['bindingsTeamId']=_0x1fc686,document['getElementById']('bindings-modal-title')['textContent']='Access\x20Bindings\x20—\x20'+_0x5a20e7['name'],document['getElementById']('add-binding-form')['hidden']=!![],document['getElementById']('bindings-modal')['hidden']=![],loadTeamBindings(_0x1fc686);};function hideBindingsModal(){document['getElementById']('bindings-modal')['hidden']=!![],state['bindingsTeamId']=null;}function renderMembersList(_0x1e4cb2){const _0x172b93=state['currentUser']?.['hasAllPermissions'],_0x480699=_0x172b93||_0x1e4cb2['canManageMembers']||_0x1e4cb2['canManageTeam'],_0x1d2854=_0x1e4cb2['members']||[],_0xaa89b4=document['getElementById']('members-list');if(_0x1d2854['length']===0x0){_0xaa89b4['innerHTML']='<p\x20style=\x22font-size:\x200.875rem;\x20color:\x20var(--color-text-secondary);\x20margin:\x200.25rem\x200;\x22>No\x20members\x20yet</p>';return;}_0xaa89b4['innerHTML']=_0x1d2854['map'](_0x360751=>{const _0x40f32a=state['users']['find'](_0x1ed8d5=>_0x1ed8d5['id']===_0x360751),_0x1b7d0c=_0x40f32a?''+Utils['escapeHtml'](_0x40f32a['username'])+(_0x40f32a['name']?'\x20<span\x20style=\x22color:\x20var(--color-text-secondary);\x20font-size:\x200.85em;\x22>('+Utils['escapeHtml'](_0x40f32a['name'])+')</span>':''):Utils['escapeHtml'](_0x360751);return'\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:\x20flex;\x20align-items:\x20center;\x20justify-content:\x20space-between;\x20padding:\x200.35rem\x200;\x20border-bottom:\x201px\x20solid\x20var(--color-border);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:\x200.875rem;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x1b7d0c+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x480699?'<button\x20type=\x22button\x22\x20class=\x22btn-ghost\x20btn-small\x22\x20onclick=\x22window.removeMemberClick(\x27'+_0x360751+'\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>';})['join']('');const _0x3e1094=document['getElementById']('add-member-row');if(_0x3e1094)_0x3e1094['style']['display']=_0x480699?'flex':'none';}function updateMemberSelect(_0x5f17a6){const _0x4b42db=document['getElementById']('add-member-select');if(!_0x4b42db)return;const _0x1e13ac=new Set(_0x5f17a6['members']||[]),_0x160242=state['users']['filter'](_0x23f4cf=>!_0x1e13ac['has'](_0x23f4cf['id']));_0x4b42db['innerHTML']='<option\x20value=\x22\x22>Add\x20a\x20member…</option>'+_0x160242['map'](_0x4351d2=>'<option\x20value=\x22'+_0x4351d2['id']+'\x22>'+Utils['escapeHtml'](_0x4351d2['username'])+(_0x4351d2['name']?'\x20('+Utils['escapeHtml'](_0x4351d2['name'])+')':'')+'</option>')['join']('');}async function addMember(){const _0x53af2d=document['getElementById']('add-member-select'),_0x41f9e6=_0x53af2d['value'];if(!_0x41f9e6||!state['editingTeamId'])return;try{const {team:_0x285899}=await API['addTeamMember'](state['editingTeamId'],_0x41f9e6);syncTeamInState(_0x285899),renderMembersList(_0x285899),updateMemberSelect(_0x285899),_0x53af2d['value']='',Utils['showToast']('Member\x20added','success');}catch(_0x4ced2d){Utils['showToast'](_0x4ced2d['message'],'error');}}window['removeMemberClick']=async function(_0x56bfd3){if(!state['editingTeamId'])return;try{const {team:_0x269565}=await API['removeTeamMember'](state['editingTeamId'],_0x56bfd3);syncTeamInState(_0x269565),renderMembersList(_0x269565),updateMemberSelect(_0x269565),Utils['showToast']('Member\x20removed','success');}catch(_0x31626a){Utils['showToast'](_0x31626a['message'],'error');}};async function loadTeamBindings(_0x4b277d){const _0x4b1aac=document['getElementById']('bindings-loading'),_0x245a76=document['getElementById']('bindings-empty'),_0x33be13=document['getElementById']('bindings-list-container'),_0x192c15=document['getElementById']('add-binding-btn');_0x4b1aac['hidden']=![],_0x245a76['hidden']=!![],_0x33be13['style']['display']='none',_0x192c15['hidden']=!![],document['getElementById']('add-binding-form')['hidden']=!![];try{const {bindings:_0x55727c}=await API['getBindings']({'subject_type':'team','subject_id':_0x4b277d});state['teamBindings']=_0x55727c||[],_0x4b1aac['hidden']=!![],state['teamBindings']['length']===0x0?_0x245a76['hidden']=![]:(_0x33be13['style']['display']='',renderBindingsTable()),(state['currentUser']?.['hasAllPermissions']||state['currentUser']?.['canManageTeams'])&&(_0x192c15['hidden']=![]);}catch(_0x465f89){_0x4b1aac['hidden']=!![],Utils['showToast']('Failed\x20to\x20load\x20bindings:\x20'+_0x465f89['message'],'error');}}function renderBindingsTable(){const _0x2e6f49=document['getElementById']('bindings-table-body');if(!_0x2e6f49)return;const _0x212e07=state['currentUser']?.['hasAllPermissions']||state['currentUser']?.['canManageTeams'];_0x2e6f49['innerHTML']=state['teamBindings']['map'](_0x3c747c=>{const _0x54e9a6=_0x3c747c['resource_type']==='server'?'Server':_0x3c747c['resource_id']==='*'?'All\x20'+_0x3c747c['resource_type']+'s':Utils['escapeHtml'](_0x3c747c['resource_name']||_0x3c747c['resource_id']||'');return'\x0a\x20\x20\x20\x20<tr>\x0a\x20\x20\x20\x20\x20\x20<td>'+_0x54e9a6+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>'+Utils['escapeHtml'](_0x3c747c['role_name']||_0x3c747c['role_id'])+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x212e07?'<button\x20class=\x22btn-ghost\x20btn-small\x22\x20onclick=\x22window.deleteBindingClick(\x27'+_0x3c747c['id']+'\x27)\x22\x20style=\x22color:\x20var(--color-danger);\x22>Remove</button>':'—')+'\x0a\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20</tr>';})['join']('');}function populateBindingForm(){const _0x2db2cc=document['getElementById']('binding-resource-type');_0x2db2cc['value']='environment',updateBindingFormForResourceType('environment');}function onBindingResourceTypeChange(){const _0x53259a=document['getElementById']('binding-resource-type')['value'];updateBindingFormForResourceType(_0x53259a);}function updateBindingFormForResourceType(_0x4548c4){const _0xecf842=document['getElementById']('binding-resource-container'),_0x42e63a=document['getElementById']('binding-resource'),_0x185847=document['getElementById']('binding-role');if(_0x4548c4==='server')_0xecf842['style']['display']='none';else{_0xecf842['style']['display']='';if(_0x4548c4==='environment'){const _0x45c66b=new Set(state['teamBindings']['filter'](_0x18edc5=>_0x18edc5['resource_type']==='environment')['map'](_0x13fa9a=>_0x13fa9a['resource_id'])),_0xd86c63=state['environments']['filter'](_0x18ea3e=>!_0x45c66b['has'](_0x18ea3e['name']));_0x42e63a['innerHTML']=_0xd86c63['length']?_0xd86c63['map'](_0x211804=>'<option\x20value=\x22'+Utils['escapeHtml'](_0x211804['name'])+'\x22>'+Utils['escapeHtml'](_0x211804['name'])+'</option>')['join'](''):'<option\x20value=\x22\x22>All\x20environments\x20already\x20bound</option>';}else{if(_0x4548c4==='team'){const _0x2ec850=new Set(state['teamBindings']['filter'](_0x492a91=>_0x492a91['resource_type']==='team')['map'](_0x3b7331=>_0x3b7331['resource_id'])),_0x5cca65=state['teams']['filter'](_0x48a4de=>!_0x2ec850['has'](_0x48a4de['id']));_0x42e63a['innerHTML']=_0x5cca65['length']?_0x5cca65['map'](_0x2ee2ef=>'<option\x20value=\x22'+_0x2ee2ef['id']+'\x22>'+Utils['escapeHtml'](_0x2ee2ef['name'])+'</option>')['join'](''):'<option\x20value=\x22\x22>All\x20teams\x20already\x20bound</option>';}}}const _0x4bd7c9=state['roles']['filter'](_0x3cb314=>_0x3cb314['resource_type']===_0x4548c4);_0x185847['innerHTML']=_0x4bd7c9['length']?_0x4bd7c9['filter'](_0x43f5bd=>{const _0x1cb2f7=_0x4548c4==='server'?undefined:_0x42e63a['value'];return!state['teamBindings']['some'](_0x445ed4=>_0x445ed4['resource_type']===_0x4548c4&&_0x445ed4['role_id']===_0x43f5bd['id']&&(_0x4548c4==='server'||_0x445ed4['resource_id']===_0x1cb2f7));})['map'](_0x5b328d=>'<option\x20value=\x22'+_0x5b328d['id']+'\x22>'+Utils['escapeHtml'](_0x5b328d['name'])+'</option>')['join']('')||'<option\x20value=\x22\x22>No\x20available\x20roles</option>':'<option\x20value=\x22\x22>No\x20roles\x20for\x20this\x20resource\x20type</option>';}async function saveBinding(){const _0x402db9=document['getElementById']('binding-resource-type')['value'],_0xfc507d=document['getElementById']('binding-role')['value'];if(!_0xfc507d||!state['bindingsTeamId'])return;const _0x429380=_0x402db9==='server'?undefined:document['getElementById']('binding-resource')['value'];if(_0x402db9!=='server'&&!_0x429380)return;const _0x671cae=document['getElementById']('save-binding-btn');_0x671cae['disabled']=!![],_0x671cae['textContent']='Adding…';try{const _0x140d12={'subject_type':'team','subject_id':state['bindingsTeamId'],'role_id':_0xfc507d,'resource_type':_0x402db9};if(_0x429380)_0x140d12['resource_id']=_0x429380;await API['createBinding'](_0x140d12),Utils['showToast']('Binding\x20added','success'),document['getElementById']('add-binding-form')['hidden']=!![],document['getElementById']('add-binding-btn')['hidden']=![],await loadTeamBindings(state['bindingsTeamId']);}catch(_0x5d46aa){Utils['showToast'](_0x5d46aa['message'],'error');}finally{_0x671cae['disabled']=![],_0x671cae['textContent']='Add\x20Binding';}}window['deleteBindingClick']=async function(_0x4f046e){try{await API['deleteBinding'](_0x4f046e),Utils['showToast']('Binding\x20removed','success'),await loadTeamBindings(state['bindingsTeamId']);}catch(_0x3d23f2){Utils['showToast'](_0x3d23f2['message'],'error');}};async function saveTeam(){const _0x534448=document['getElementById']('team-name')['value']['trim'](),_0x544289=document['getElementById']('team-description')['value']['trim'](),_0x5cf38e=document['getElementById']('team-form-error'),_0x554a03=document['getElementById']('save-team');if(!_0x534448){_0x5cf38e['textContent']='Team\x20name\x20is\x20required',_0x5cf38e['hidden']=![];return;}_0x5cf38e['hidden']=!![];const _0x475f56=_0x554a03['textContent'];_0x554a03['disabled']=!![],_0x554a03['textContent']=state['editingTeamId']?'Saving…':'Creating…';try{if(state['editingTeamId']){const {team:_0x75f15f}=await API['updateTeam'](state['editingTeamId'],{'name':_0x534448,'description':_0x544289});syncTeamInState(_0x75f15f),document['getElementById']('team-modal-title')['textContent']=_0x75f15f['name'],Utils['showToast']('Team\x20updated','success');}else await API['createTeam']({'name':_0x534448,'description':_0x544289}),Utils['showToast']('Team\x20created','success');_0x554a03['disabled']=![],_0x554a03['textContent']=_0x475f56,hideTeamModal(),await loadTeams();}catch(_0x5df5fd){_0x5cf38e['textContent']=_0x5df5fd['message'],_0x5cf38e['hidden']=![],_0x554a03['disabled']=![],_0x554a03['textContent']=_0x475f56;}}window['deleteTeam']=function(_0xfb92aa){const _0x5e5774=state['teams']['find'](_0x2ded62=>_0x2ded62['id']===_0xfb92aa);if(!_0x5e5774)return;state['deletingTeamId']=_0xfb92aa,document['getElementById']('delete-team-name')['textContent']=_0x5e5774['name'],document['getElementById']('delete-team-modal')['hidden']=![];};function hideDeleteModal(){document['getElementById']('delete-team-modal')['hidden']=!![],state['deletingTeamId']=null;}async function confirmDeleteTeam(){if(!state['deletingTeamId'])return;const _0x10db0f=document['getElementById']('confirm-delete-team');_0x10db0f['disabled']=!![],_0x10db0f['textContent']='Deleting…';try{await API['deleteTeam'](state['deletingTeamId']),Utils['showToast']('Team\x20deleted','success'),_0x10db0f['disabled']=![],_0x10db0f['textContent']='Delete\x20Team',hideDeleteModal(),await loadTeams();}catch(_0x8a05fe){Utils['showToast']('Failed\x20to\x20delete\x20team:\x20'+_0x8a05fe['message'],'error'),_0x10db0f['disabled']=![],_0x10db0f['textContent']='Delete\x20Team';}}function syncTeamInState(_0x24b55){const _0x1f9156=state['teams']['findIndex'](_0x14645f=>_0x14645f['id']===_0x24b55['id']);if(_0x1f9156>=0x0)state['teams'][_0x1f9156]=_0x24b55;renderTeams();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x37e5e5=_0x3fd4;(function(_0x3231eb,_0x50e34b){const _0x2146e4=_0x3fd4,_0x1e5b18=_0x3231eb();while(!![]){try{const _0x3f0f59=-parseInt(_0x2146e4(0x162))/0x1*(parseInt(_0x2146e4(0x177))/0x2)+parseInt(_0x2146e4(0x124))/0x3+-parseInt(_0x2146e4(0x131))/0x4+parseInt(_0x2146e4(0x155))/0x5*(-parseInt(_0x2146e4(0x139))/0x6)+parseInt(_0x2146e4(0x161))/0x7*(-parseInt(_0x2146e4(0x164))/0x8)+-parseInt(_0x2146e4(0x13c))/0x9*(parseInt(_0x2146e4(0x129))/0xa)+parseInt(_0x2146e4(0x159))/0xb*(parseInt(_0x2146e4(0x15e))/0xc);if(_0x3f0f59===_0x50e34b)break;else _0x1e5b18['push'](_0x1e5b18['shift']());}catch(_0x4ea026){_0x1e5b18['push'](_0x1e5b18['shift']());}}}(_0x4505,0xe0ad2));import{API,Utils}from'./app.js';import{Terminal}from'https://cdn.jsdelivr.net/npm/xterm@5.3.0/+esm';import{FitAddon}from'https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.7.0/+esm';import{getCurrentTheme,initTheme,mountThemeToggle,onThemeChange}from'./theme.js';function _0x3fd4(_0x4deaf2,_0x129d49){_0x4deaf2=_0x4deaf2-0x123;const _0x450571=_0x4505();let _0x3fd41d=_0x450571[_0x4deaf2];if(_0x3fd4['XzMdvo']===undefined){var _0x1f5272=function(_0x2d837d){const _0x46509f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x588325='',_0x3acbf4='';for(let _0x2b6cf1=0x0,_0x3bbe0e,_0xbf76f1,_0x20adb4=0x0;_0xbf76f1=_0x2d837d['charAt'](_0x20adb4++);~_0xbf76f1&&(_0x3bbe0e=_0x2b6cf1%0x4?_0x3bbe0e*0x40+_0xbf76f1:_0xbf76f1,_0x2b6cf1++%0x4)?_0x588325+=String['fromCharCode'](0xff&_0x3bbe0e>>(-0x2*_0x2b6cf1&0x6)):0x0){_0xbf76f1=_0x46509f['indexOf'](_0xbf76f1);}for(let _0x2e492a=0x0,_0x4b38b9=_0x588325['length'];_0x2e492a<_0x4b38b9;_0x2e492a++){_0x3acbf4+='%'+('00'+_0x588325['charCodeAt'](_0x2e492a)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3acbf4);};_0x3fd4['yZivoC']=_0x1f5272,_0x3fd4['nLgHcS']={},_0x3fd4['XzMdvo']=!![];}const _0x255aea=_0x450571[0x0],_0x5e993b=_0x4deaf2+_0x255aea,_0x3ef3b5=_0x3fd4['nLgHcS'][_0x5e993b];return!_0x3ef3b5?(_0x3fd41d=_0x3fd4['yZivoC'](_0x3fd41d),_0x3fd4['nLgHcS'][_0x5e993b]=_0x3fd41d):_0x3fd41d=_0x3ef3b5,_0x3fd41d;}const params=Utils[_0x37e5e5(0x127)](),containerId=params[_0x37e5e5(0x140)],command=(params[_0x37e5e5(0x160)]||'')[_0x37e5e5(0x168)](),useServerExec=params['server_exec']===_0x37e5e5(0x16d),titleEl=document[_0x37e5e5(0x14a)](_0x37e5e5(0x143)),subtitleEl=document[_0x37e5e5(0x14a)](_0x37e5e5(0x175)),statusEl=document[_0x37e5e5(0x14a)](_0x37e5e5(0x16e)),terminalEl=document[_0x37e5e5(0x14a)]('terminal-container'),closeBtn=document[_0x37e5e5(0x14a)]('close-terminal');initTheme(),mountThemeToggle({'targetSelectors':[_0x37e5e5(0x133)]});const getXtermTheme=()=>{const _0x2cb86f=_0x37e5e5;return{'background':_0x2cb86f(0x147),'foreground':_0x2cb86f(0x144),'cursor':_0x2cb86f(0x144),'cursorAccent':_0x2cb86f(0x147)};};closeBtn&&closeBtn[_0x37e5e5(0x158)]('click',()=>{const _0x17053d=_0x37e5e5;window[_0x17053d(0x13d)]();});if(!containerId){updateStatus(_0x37e5e5(0x173),_0x37e5e5(0x12b));throw new Error(_0x37e5e5(0x157));}function _0x4505(){const _0x56e5a9=['DMfYAwfUDa','mJu4odbmBuXpve8','zMLUza','zxjYB3i','C2vUza','C3vIC3rYAw5N','zgf0yq','y29UDgfPBMvYswq','imk3ifn0yxj0zwqG','nJGYmJe1mLDZs0D3uG','DhLWzq','lNrLCM1PBMfSlwfJDgLVBNm','zgf0yxnLDa','zM9JDxm','q29UBMvJDgLVBIbLCNjVCG','CMvHzhLtDgf0zq','l3DZl2nVBNrHAw5LCNmV','mtqWmJjHtvniDwG','u2vZC2LVBIa','Aw5MBW','ndG2meDWDxfjtG','y2XVC2u','Dgv4DenVBNrLBNq','y3jLyxrLzef0','y29UDgfPBMvY','C2nYB2XSvg9cB3r0B20','zgvMyxvSDefNzw50','DgvYBwLUywWTDgL0Bgu','i2uYztHMma','BwvZC2fNzq','uhjLCgfYAw5NoIa','iZbMmtCYyq','DgL0Bgu','vgvYBwLUywWGWRCG','z2v0rwXLBwvUDej5swq','rMfPBgvKihrVihbHCNnLihrLCM1PBMfSig1LC3nHz2u','C3rYAw5NAwz5','vgvYBwLUywWGD2vIC29JA2v0igvYCM9Y','q29UBMvJDgLVBIbJBg9Zzwq','y2f0y2G','z2v0q29UDgfPBMvY','z2v0q29UDgfPBMvYCW','zw52AxjVBM1LBNq','y29UDgfPBMvYCW','B3bLBG','mtaWnxPltKjkDa','sMv0qNjHAw5Zie1VBM8Sifngtw9UBY1szwD1BgfYlcbdB25ZB2XHCYWGBw9UB3nWywnL','y29UDgfPBMvYihbHCMfTzxrLCIbPCYbYzxf1AxjLza','ywrKrxzLBNrmAxn0zw5LCG','mJmXmdK4odLOsenHyxi','rw52AxjVBM1LBNqGDw5RBM93BG','B25eyxrH','D2fZq2XLyw4','zML0','mZzhDwThD2C','rw52AxjVBM1LBNqG','y21K','mJeWndLwqKj5r1C','mJjmvfbyC1i','C2v0','mJy0oe1YqwPKvW','vgvYBwLUywWGy29UBMvJDgvK','B2jZzxj2zq','Bg9JyxrPB24','DhjPBq','zM9YBwf0uMvSyxrPDMvuAw1L','zNvSBenVBNrHAw5LCKLK','BMfTzq','y29UBMvJDgvK','Dhj1zq','DgvYBwLUywWTC3rHDhvZ','CgfYC2u','ChjVDg9JB2W','t1bftG','Bg9HzefKzg9U','twLZC2LUzYbJB250ywLUzxiGAwrLBNrPzMLLCG','imk3ienVBw1HBMqG','DgvYBwLUywWTC3vIDgL0Bgu','q29UDgfPBMvYia','mte5nJe4EefurLvd','C3rHDhvZ','CMvZAxPL','y29SCW','C2vHCMnOugfYyw1Z','mtuWndq2mxrtB01XuW','C3vJy2vZCW','uNvUBMLUzZOG','z2v0uxvLCNLqyxjHBxm'];_0x4505=function(){return _0x56e5a9;};return _0x4505();}document[_0x37e5e5(0x148)]=_0x37e5e5(0x149)+containerId['slice'](0x0,0xc),enrichContainerDetails(containerId)[_0x37e5e5(0x14f)](()=>{const _0x23b35b=_0x37e5e5;subtitleEl['textContent']=_0x23b35b(0x176)+containerId[_0x23b35b(0x12d)](0x0,0xc);});const term=new Terminal({'convertEol':!![],'cursorBlink':!![],'fontFamily':_0x37e5e5(0x156),'fontSize':0x10,'theme':getXtermTheme()}),fitAddon=new FitAddon();term[_0x37e5e5(0x172)](fitAddon),term[_0x37e5e5(0x154)](terminalEl),term['focus']();let isFitting=![];const doFit=()=>{const _0x3b3695=_0x37e5e5;if(isFitting)return;isFitting=!![],fitAddon[_0x3b3695(0x15d)](),sendResize(),term[_0x3b3695(0x141)](),setTimeout(()=>{isFitting=![];},0x32);};window['addEventListener'](_0x37e5e5(0x179),()=>{requestAnimationFrame(()=>{!isFitting&&doFit();});});const resizeObserver=new ResizeObserver(()=>{requestAnimationFrame(()=>{!isFitting&&doFit();});});resizeObserver[_0x37e5e5(0x166)](terminalEl);const socketProtocol=window['location'][_0x37e5e5(0x170)]==='https:'?'wss':'ws',socketUrl=new URL(_0x37e5e5(0x138)+encodeURIComponent(containerId),window[_0x37e5e5(0x167)]['href']);command&&useServerExec&&socketUrl[_0x37e5e5(0x123)][_0x37e5e5(0x163)](_0x37e5e5(0x160),command);socketUrl[_0x37e5e5(0x170)]=socketProtocol+':';const socket=new WebSocket(socketUrl['toString']());term[_0x37e5e5(0x15b)](_0x588325=>{const _0x5e6975=_0x37e5e5;socket[_0x5e6975(0x137)]===WebSocket[_0x5e6975(0x171)]&&socket['send'](JSON['stringify']({'type':_0x5e6975(0x12e),'data':_0x588325}));});let commandSent=![],hasReceivedOutput=![];socket[_0x37e5e5(0x158)](_0x37e5e5(0x145),_0x3acbf4=>{const _0x52697b=_0x37e5e5;try{const _0x2b6cf1=JSON[_0x52697b(0x16f)](_0x3acbf4['data']);if(_0x2b6cf1[_0x52697b(0x132)]===_0x52697b(0x12e)&&typeof _0x2b6cf1['data']==='string')term['write'](_0x2b6cf1[_0x52697b(0x12e)]),!hasReceivedOutput&&_0x2b6cf1[_0x52697b(0x12e)]['length']>0x0&&(hasReceivedOutput=!![],command&&!useServerExec&&!commandSent&&(commandSent=!![],setTimeout(()=>{const _0x15c2ff=_0x52697b;socket[_0x15c2ff(0x137)]===WebSocket[_0x15c2ff(0x171)]&&socket[_0x15c2ff(0x12c)](JSON[_0x15c2ff(0x14c)]({'type':_0x15c2ff(0x12e),'data':command+'\x0d'}));},0xc8)));else{if(_0x2b6cf1['type']==='status'&&_0x2b6cf1[_0x52697b(0x178)]){if(_0x2b6cf1[_0x52697b(0x178)]===_0x52697b(0x16c)){if(command&&useServerExec)updateStatus(_0x52697b(0x126)+command,_0x52697b(0x13b));else command?updateStatus(_0x52697b(0x146)+command,'info'):updateStatus(_0x52697b(0x165),_0x52697b(0x125));doFit(),term[_0x52697b(0x135)](),command&&!useServerExec&&!commandSent&&setTimeout(()=>{const _0x2abc9f=_0x52697b;!commandSent&&socket[_0x2abc9f(0x137)]===WebSocket[_0x2abc9f(0x171)]&&(commandSent=!![],socket[_0x2abc9f(0x12c)](JSON[_0x2abc9f(0x14c)]({'type':_0x2abc9f(0x12e),'data':command+'\x0d'})),updateStatus(_0x2abc9f(0x126)+command,_0x2abc9f(0x13b)));},0x7d0);}else updateStatus(_0x52697b(0x13a)+_0x2b6cf1[_0x52697b(0x178)],_0x2b6cf1['status']===_0x52697b(0x16c)?'success':_0x52697b(0x13b));}else _0x2b6cf1['type']===_0x52697b(0x12b)&&_0x2b6cf1[_0x52697b(0x145)]&&updateStatus(_0x2b6cf1[_0x52697b(0x145)],_0x52697b(0x12b));}}catch(_0x3bbe0e){console[_0x52697b(0x12b)](_0x52697b(0x14b),_0x3bbe0e);}}),socket[_0x37e5e5(0x158)](_0x37e5e5(0x13d),_0xbf76f1=>{const _0xbd5eed=_0x37e5e5,_0x20adb4=_0xbf76f1['reason']||_0xbd5eed(0x14e);updateStatus(_0x20adb4,_0xbf76f1[_0xbd5eed(0x15c)]?'info':_0xbd5eed(0x12b));}),socket['addEventListener'](_0x37e5e5(0x12b),_0x2e492a=>{const _0x1578cc=_0x37e5e5;console[_0x1578cc(0x12b)](_0x1578cc(0x14d),_0x2e492a),updateStatus(_0x1578cc(0x136),_0x1578cc(0x12b));});function sendResize(){const _0x2e822a=_0x37e5e5;if(socket['readyState']!==WebSocket[_0x2e822a(0x171)])return;const _0x4b38b9=term[_0x2e822a(0x17a)],_0x3b1692=term['rows'];socket[_0x2e822a(0x12c)](JSON[_0x2e822a(0x14c)]({'type':'resize','cols':_0x4b38b9,'rows':_0x3b1692}));}function updateStatus(_0x1ad434,_0x2dec2b=_0x37e5e5(0x13b)){const _0x1911a3=_0x37e5e5;if(!statusEl)return;statusEl[_0x1911a3(0x13e)]=_0x1ad434,statusEl[_0x1911a3(0x134)][_0x1911a3(0x128)]=_0x2dec2b;}async function enrichContainerDetails(_0x2fad09){const _0x2fe768=_0x37e5e5;try{const _0x2f407f=await API[_0x2fe768(0x150)](_0x2fad09);updateTerminalDetails(_0x2f407f);}catch{try{const _0x1479dd=await API[_0x2fe768(0x151)](),_0x25436c=(_0x1479dd[_0x2fe768(0x153)]||[])[_0x2fe768(0x12a)](_0x1d7d42=>_0x1d7d42['containerId']===_0x2fad09||_0x1d7d42['name']===_0x2fad09||_0x1d7d42[_0x2fe768(0x16a)]?.['startsWith'](_0x2fad09));if(_0x25436c){updateTerminalDetails(_0x25436c);return;}subtitleEl[_0x2fe768(0x13e)]=_0x2fe768(0x176)+_0x2fad09[_0x2fe768(0x12d)](0x0,0xc);}catch{subtitleEl['textContent']=_0x2fe768(0x176)+_0x2fad09['substring'](0x0,0xc);}}}function updateTerminalDetails(_0x5bbc6b){const _0x4244ed=_0x37e5e5,_0x226f7d=_0x5bbc6b[_0x4244ed(0x12f)]||_0x5bbc6b[_0x4244ed(0x16b)]||_0x5bbc6b['fullContainerId']||containerId,_0x32f3de=_0x5bbc6b[_0x4244ed(0x152)]?_0x4244ed(0x15f)+_0x5bbc6b['environment']:_0x4244ed(0x15a),_0x36d138=_0x5bbc6b[_0x4244ed(0x142)]?'\x20·\x20Agent\x20'+_0x5bbc6b[_0x4244ed(0x142)]:'',_0x58d341=_0x5bbc6b['createdAt']?_0x4244ed(0x130)+Utils[_0x4244ed(0x169)](_0x5bbc6b[_0x4244ed(0x13f)]):'';titleEl['textContent']=_0x4244ed(0x149)+_0x226f7d[_0x4244ed(0x12d)](0x0,0xc);const _0x803695=command?_0x4244ed(0x174)+command:'';subtitleEl[_0x4244ed(0x13e)]=''+_0x32f3de+_0x36d138+_0x58d341+_0x803695;}
|
|
1
|
+
import{API,Utils}from'./app.js';import{Terminal}from'https://cdn.jsdelivr.net/npm/xterm@5.3.0/+esm';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['getQueryParams'](),containerId=params['container'],command=(params['cmd']||'')['trim'](),useServerExec=params['server_exec']==='true',titleEl=document['getElementById']('terminal-title'),subtitleEl=document['getElementById']('terminal-subtitle'),statusEl=document['getElementById']('terminal-status'),terminalEl=document['getElementById']('terminal-container'),closeBtn=document['getElementById']('close-terminal');initTheme(),mountThemeToggle({'targetSelectors':['.terminal-actions']});const getXtermTheme=()=>{return{'background':'#0f172a','foreground':'#e2e8f0','cursor':'#e2e8f0','cursorAccent':'#0f172a'};};closeBtn&&closeBtn['addEventListener']('click',()=>{window['close']();});if(!containerId){updateStatus('Missing\x20container\x20identifier','error');throw new Error('container\x20parameter\x20is\x20required');}document['title']='Terminal\x20·\x20'+containerId['slice'](0x0,0xc),enrichContainerDetails(containerId)['catch'](()=>{subtitleEl['textContent']='Container\x20'+containerId['substring'](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['open'](terminalEl),term['focus']();let isFitting=![];const doFit=()=>{if(isFitting)return;isFitting=!![],fitAddon['fit'](),sendResize(),term['scrollToBottom'](),setTimeout(()=>{isFitting=![];},0x32);};window['addEventListener']('resize',()=>{requestAnimationFrame(()=>{!isFitting&&doFit();});});const resizeObserver=new ResizeObserver(()=>{requestAnimationFrame(()=>{!isFitting&&doFit();});});resizeObserver['observe'](terminalEl);const socketProtocol=window['location']['protocol']==='https:'?'wss':'ws',socketUrl=new URL('/ws/containers/'+encodeURIComponent(containerId),window['location']['href']);command&&useServerExec&&socketUrl['searchParams']['set']('cmd',command);socketUrl['protocol']=socketProtocol+':';const socket=new WebSocket(socketUrl['toString']());term['onData'](_0x57e733=>{socket['readyState']===WebSocket['OPEN']&&socket['send'](JSON['stringify']({'type':'data','data':_0x57e733}));});let commandSent=![],hasReceivedOutput=![];socket['addEventListener']('message',_0xd02d=>{try{const _0x48a712=JSON['parse'](_0xd02d['data']);if(_0x48a712['type']==='data'&&typeof _0x48a712['data']==='string')term['write'](_0x48a712['data']),!hasReceivedOutput&&_0x48a712['data']['length']>0x0&&(hasReceivedOutput=!![],command&&!useServerExec&&!commandSent&&(commandSent=!![],setTimeout(()=>{socket['readyState']===WebSocket['OPEN']&&socket['send'](JSON['stringify']({'type':'data','data':command+'\x0d'}));},0xc8)));else{if(_0x48a712['type']==='status'&&_0x48a712['status']){if(_0x48a712['status']==='connected'){if(command&&useServerExec)updateStatus('Running:\x20'+command,'info');else command?updateStatus('Preparing:\x20'+command,'info'):updateStatus('Terminal\x20connected','success');doFit(),term['focus'](),command&&!useServerExec&&!commandSent&&setTimeout(()=>{!commandSent&&socket['readyState']===WebSocket['OPEN']&&(commandSent=!![],socket['send'](JSON['stringify']({'type':'data','data':command+'\x0d'})),updateStatus('Running:\x20'+command,'info'));},0x7d0);}else updateStatus('Session\x20'+_0x48a712['status'],_0x48a712['status']==='connected'?'success':'info');}else _0x48a712['type']==='error'&&_0x48a712['message']&&updateStatus(_0x48a712['message'],'error');}}catch(_0x1338fe){console['error']('Failed\x20to\x20parse\x20terminal\x20message',_0x1338fe);}}),socket['addEventListener']('close',_0x2e7cae=>{const _0x1380fd=_0x2e7cae['reason']||'Connection\x20closed';updateStatus(_0x1380fd,_0x2e7cae['wasClean']?'info':'error');}),socket['addEventListener']('error',_0x45dcdf=>{console['error']('Terminal\x20websocket\x20error',_0x45dcdf),updateStatus('Connection\x20error','error');});function sendResize(){if(socket['readyState']!==WebSocket['OPEN'])return;const _0x1c13a0=term['cols'],_0x3abf1d=term['rows'];socket['send'](JSON['stringify']({'type':'resize','cols':_0x1c13a0,'rows':_0x3abf1d}));}function updateStatus(_0x40b65e,_0x48a89f='info'){if(!statusEl)return;statusEl['textContent']=_0x40b65e,statusEl['dataset']['variant']=_0x48a89f;}async function enrichContainerDetails(_0x394221){try{const _0x5ef42c=await API['getContainer'](_0x394221);updateTerminalDetails(_0x5ef42c);}catch{try{const _0x570952=await API['getContainers'](),_0x582519=(_0x570952['containers']||[])['find'](_0x2c3e4a=>_0x2c3e4a['containerId']===_0x394221||_0x2c3e4a['name']===_0x394221||_0x2c3e4a['fullContainerId']?.['startsWith'](_0x394221));if(_0x582519){updateTerminalDetails(_0x582519);return;}subtitleEl['textContent']='Container\x20'+_0x394221['substring'](0x0,0xc);}catch{subtitleEl['textContent']='Container\x20'+_0x394221['substring'](0x0,0xc);}}}function updateTerminalDetails(_0x47cee1){const _0x45ff38=_0x47cee1['containerId']||_0x47cee1['name']||_0x47cee1['fullContainerId']||containerId,_0x3e3334=_0x47cee1['environment']?'Environment\x20'+_0x47cee1['environment']:'Environment\x20unknown',_0x5a1d89=_0x47cee1['defaultAgent']?'\x20·\x20Agent\x20'+_0x47cee1['defaultAgent']:'',_0x28476a=_0x47cee1['createdAt']?'\x20·\x20Started\x20'+Utils['formatRelativeTime'](_0x47cee1['createdAt']):'';titleEl['textContent']='Terminal\x20·\x20'+_0x45ff38['substring'](0x0,0xc);const _0x558d04=command?'\x20·\x20Command\x20'+command:'';subtitleEl['textContent']=''+_0x3e3334+_0x5a1d89+_0x28476a+_0x558d04;}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const THEME_STORAGE_KEY='profound-coder-theme',THEME_CHANGE_EVENT='profound-theme-change',VALID_THEMES=new Set(['light','dark']),DEFAULT_TARGET_SELECTORS=['#theme-toggle-container','.header-actions','.status-actions','.terminal-actions','.top-bar'];function readStoredTheme(){try{const _0x3c7017=localStorage['getItem'](THEME_STORAGE_KEY);if(_0x3c7017&&VALID_THEMES['has'](_0x3c7017))return _0x3c7017;}catch(_0x6d3c3){console['warn']('[Theme]\x20Failed\x20to\x20read\x20stored\x20theme\x20preference:',_0x6d3c3);}return null;}export function getPreferredTheme(){const _0xada135=readStoredTheme();if(_0xada135)return _0xada135;const _0x5215c7=window['matchMedia']&&window['matchMedia']('(prefers-color-scheme:\x20dark)')['matches'];return _0x5215c7?'dark':'light';}export function getCurrentTheme(){const _0x468942=document['documentElement']['dataset']['theme'];if(_0x468942&&VALID_THEMES['has'](_0x468942))return _0x468942;return getPreferredTheme();}export function applyTheme(_0x1a49a8,{persist:persist=!![],emitEvent:emitEvent=!![]}={}){const _0x387b5c=VALID_THEMES['has'](_0x1a49a8)?_0x1a49a8:'light';document['documentElement']['dataset']['theme']=_0x387b5c,document['documentElement']['style']['colorScheme']=_0x387b5c==='dark'?'dark':'light';if(persist)try{localStorage['setItem'](THEME_STORAGE_KEY,_0x387b5c);}catch(_0x570eb7){console['warn']('[Theme]\x20Failed\x20to\x20persist\x20theme\x20preference:',_0x570eb7);}return emitEvent&&window['dispatchEvent'](new CustomEvent(THEME_CHANGE_EVENT,{'detail':{'theme':_0x387b5c}})),_0x387b5c;}export function initTheme(_0x32f673={}){const {emitEvent:emitEvent=![]}=_0x32f673;return applyTheme(getPreferredTheme(),{'persist':![],'emitEvent':emitEvent});}export function toggleTheme(){const _0x3f561b=getCurrentTheme()==='dark'?'light':'dark';return applyTheme(_0x3f561b);}export function onThemeChange(_0x4613ae,{runImmediately:runImmediately=![]}={}){const _0x3d461c=_0x15bde8=>{_0x4613ae(_0x15bde8['detail']['theme']);};return window['addEventListener'](THEME_CHANGE_EVENT,_0x3d461c),runImmediately&&_0x4613ae(getCurrentTheme()),()=>window['removeEventListener'](THEME_CHANGE_EVENT,_0x3d461c);}export function mountThemeToggle(_0x25b731={}){const {targetSelectors:targetSelectors=DEFAULT_TARGET_SELECTORS}=_0x25b731,_0x44db70=targetSelectors['map'](_0x272df3=>document['querySelector'](_0x272df3))['find'](Boolean),_0x6805d9=document['createElement']('button');_0x6805d9['type']='button',_0x6805d9['className']='btn-ghost\x20theme-toggle-btn',_0x6805d9['id']='theme-toggle-btn',_0x6805d9['setAttribute']('aria-pressed','false'),_0x6805d9['style']['padding']='8px',_0x6805d9['style']['lineHeight']='0',_0x6805d9['style']['width']='36px',_0x6805d9['style']['height']='36px',_0x6805d9['style']['display']='flex',_0x6805d9['style']['alignItems']='center',_0x6805d9['style']['justifyContent']='center';const _0x523616=document['createElement']('span');_0x523616['className']='theme-icon',_0x523616['style']['display']='flex',_0x6805d9['append'](_0x523616);const _0x5d8fd1='<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>',_0x401261='<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><circle\x20cx=\x2212\x22\x20cy=\x2212\x22\x20r=\x225\x22></circle><line\x20x1=\x2212\x22\x20y1=\x221\x22\x20x2=\x2212\x22\x20y2=\x223\x22></line><line\x20x1=\x2212\x22\x20y1=\x2221\x22\x20x2=\x2212\x22\x20y2=\x2223\x22></line><line\x20x1=\x224.22\x22\x20y1=\x224.22\x22\x20x2=\x225.64\x22\x20y2=\x225.64\x22></line><line\x20x1=\x2218.36\x22\x20y1=\x2218.36\x22\x20x2=\x2219.78\x22\x20y2=\x2219.78\x22></line><line\x20x1=\x221\x22\x20y1=\x2212\x22\x20x2=\x223\x22\x20y2=\x2212\x22></line><line\x20x1=\x2221\x22\x20y1=\x2212\x22\x20x2=\x2223\x22\x20y2=\x2212\x22></line><line\x20x1=\x224.22\x22\x20y1=\x2219.78\x22\x20x2=\x225.64\x22\x20y2=\x2218.36\x22></line><line\x20x1=\x2218.36\x22\x20y1=\x225.64\x22\x20x2=\x2219.78\x22\x20y2=\x224.22\x22></line></svg>',_0x45d0b0=_0x802133=>{const _0x3be220=_0x802133==='dark';_0x523616['innerHTML']=_0x3be220?_0x5d8fd1:_0x401261,_0x6805d9['title']=_0x3be220?'Switch\x20to\x20light\x20mode':'Switch\x20to\x20dark\x20mode',_0x6805d9['dataset']['theme']=_0x802133,_0x6805d9['setAttribute']('aria-pressed',String(_0x3be220));};return _0x6805d9['addEventListener']('click',()=>{const _0x5aa26f=getCurrentTheme()==='dark'?'light':'dark';applyTheme(_0x5aa26f);}),_0x44db70?_0x44db70['appendChild'](_0x6805d9):(_0x6805d9['classList']['add']('theme-toggle-floating'),document['body']['appendChild'](_0x6805d9)),_0x45d0b0(initTheme()),onThemeChange(_0x45d0b0),_0x6805d9;}export{THEME_STORAGE_KEY,THEME_CHANGE_EVENT};
|
|
@@ -245,13 +245,6 @@
|
|
|
245
245
|
<button class="modal-close" id="close-bindings-modal">×</button>
|
|
246
246
|
</div>
|
|
247
247
|
<div class="modal-body">
|
|
248
|
-
<div id="bindings-server-admin-section" style="padding: 0.875rem 1rem; margin-bottom: 1rem; background: var(--color-surface-elevated); border: 1px solid var(--color-border); border-radius: 8px;">
|
|
249
|
-
<label style="display: flex; align-items: center; gap: 0.5rem; cursor: pointer;">
|
|
250
|
-
<input type="checkbox" id="user-is-server-admin" style="width: auto; margin: 0;">
|
|
251
|
-
<span style="font-weight: 600;">Server Admin</span>
|
|
252
|
-
</label>
|
|
253
|
-
<p class="field-hint" style="margin-top: 0.375rem; margin-bottom: 0;">Grants full system access with all permissions, bypassing environment bindings.</p>
|
|
254
|
-
</div>
|
|
255
248
|
<div id="user-bindings-loading" class="loading" hidden>Loading bindings…</div>
|
|
256
249
|
<div id="user-bindings-empty" hidden style="padding: 1.5rem 0; text-align: center; color: var(--color-text-secondary);">
|
|
257
250
|
No direct user bindings.
|
|
@@ -269,7 +262,7 @@
|
|
|
269
262
|
<table class="users-table" id="user-bindings-table">
|
|
270
263
|
<thead>
|
|
271
264
|
<tr>
|
|
272
|
-
<th>
|
|
265
|
+
<th>Resource</th>
|
|
273
266
|
<th>Role</th>
|
|
274
267
|
<th>Actions</th>
|
|
275
268
|
</tr>
|
|
@@ -282,10 +275,18 @@
|
|
|
282
275
|
</div>
|
|
283
276
|
<!-- Inline add-binding form -->
|
|
284
277
|
<div id="add-user-binding-form" hidden style="margin-top: 0.75rem; padding: 1rem; border: 1px solid var(--color-border); border-radius: 8px; background: var(--color-surface-elevated);">
|
|
285
|
-
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-bottom: 0.75rem;">
|
|
278
|
+
<div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 0.75rem; margin-bottom: 0.75rem;">
|
|
286
279
|
<div>
|
|
287
|
-
<label style="font-size: 0.8rem; margin-bottom: 0.25rem; display: block;">
|
|
288
|
-
<select id="user-binding-
|
|
280
|
+
<label style="font-size: 0.8rem; margin-bottom: 0.25rem; display: block;">Resource Type</label>
|
|
281
|
+
<select id="user-binding-resource-type" class="form-input" style="font-size: 0.875rem;">
|
|
282
|
+
<option value="environment">Environment</option>
|
|
283
|
+
<option value="team">Team</option>
|
|
284
|
+
<option value="server">Server</option>
|
|
285
|
+
</select>
|
|
286
|
+
</div>
|
|
287
|
+
<div id="user-binding-resource-container">
|
|
288
|
+
<label style="font-size: 0.8rem; margin-bottom: 0.25rem; display: block;">Resource</label>
|
|
289
|
+
<select id="user-binding-resource" class="form-input" style="font-size: 0.875rem;"></select>
|
|
289
290
|
</div>
|
|
290
291
|
<div>
|
|
291
292
|
<label style="font-size: 0.8rem; margin-bottom: 0.25rem; display: block;">Role</label>
|