mirror of
https://github.com/UNITRONIX/BetterDesk.git
synced 2026-09-10 01:27:11 +00:00
dd0889e3d6
Introduce a SessionManager for relay-based remote sessions in the Tauri MGMT client: new SessionCommand API, start/stop/session input routing, clipboard/recording/quality controls, and notification read/dismiss state. Wire AppState with new mutexes and show main window on startup. CI: add SBOM generation (anchore) and Trivy vulnerability scan steps. Misc: change console Docker DB path, large README/CHANGELOG updates (chat E2E, unattended access/WOL, i18n expansion, CDAP/SDK docs), and many web-nodejs assets/locales/routes/views/services and server-side changes.
246 lines
14 KiB
HTML
246 lines
14 KiB
HTML
<%- include('layouts/main', {
|
||
title: typeof title !== 'undefined' ? title : 'Resource Control',
|
||
pageStyles: typeof pageStyles !== 'undefined' ? pageStyles : ['resource-control'],
|
||
pageScripts: typeof pageScripts !== 'undefined' ? pageScripts : ['resource-control'],
|
||
currentPage: typeof currentPage !== 'undefined' ? currentPage : 'resource-control',
|
||
breadcrumb: typeof breadcrumb !== 'undefined' ? breadcrumb : [{ label: 'Resource Control' }],
|
||
body: `
|
||
<div class="page-content" style="max-width: 1400px; margin: 0 auto;">
|
||
<div class="rc-header">
|
||
<h2>${_('resource_control.title')}</h2>
|
||
<div class="rc-tabs" id="rc-tabs">
|
||
<button class="rc-tab active" data-tab="overview" onclick="ResourceControl.switchTab('overview')">
|
||
<span class="material-icons-round">dashboard</span>
|
||
${_('resource_control.tab_overview')}
|
||
</button>
|
||
<button class="rc-tab" data-tab="usb" onclick="ResourceControl.switchTab('usb')">
|
||
<span class="material-icons-round">usb</span>
|
||
${_('resource_control.tab_usb')}
|
||
</button>
|
||
<button class="rc-tab" data-tab="optical" onclick="ResourceControl.switchTab('optical')">
|
||
<span class="material-icons-round">album</span>
|
||
${_('resource_control.tab_optical')}
|
||
</button>
|
||
<button class="rc-tab" data-tab="monitors" onclick="ResourceControl.switchTab('monitors')">
|
||
<span class="material-icons-round">monitor</span>
|
||
${_('resource_control.tab_monitors')}
|
||
</button>
|
||
<button class="rc-tab" data-tab="disks" onclick="ResourceControl.switchTab('disks')">
|
||
<span class="material-icons-round">storage</span>
|
||
${_('resource_control.tab_disks')}
|
||
</button>
|
||
<button class="rc-tab" data-tab="quotas" onclick="ResourceControl.switchTab('quotas')">
|
||
<span class="material-icons-round">speed</span>
|
||
${_('resource_control.tab_quotas')}
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="rc-content">
|
||
<!-- Overview tab -->
|
||
<div class="rc-panel active" id="panel-overview">
|
||
<div class="rc-compliance-row" id="compliance-stats"></div>
|
||
<div class="rc-section">
|
||
<h3>${_('resource_control.compliance_by_category')}</h3>
|
||
<div class="rc-category-grid" id="compliance-categories"></div>
|
||
</div>
|
||
<div class="rc-section">
|
||
<h3>${_('resource_control.device_compliance')}</h3>
|
||
<div class="rc-device-filter">
|
||
<input type="text" class="rc-search" id="rc-device-search"
|
||
placeholder="${_('resource_control.search_devices')}"
|
||
oninput="ResourceControl.filterDevices()">
|
||
</div>
|
||
<div class="rc-table-scroll">
|
||
<table class="rc-table" id="rc-device-table">
|
||
<thead>
|
||
<tr>
|
||
<th>${_('resource_control.col_device')}</th>
|
||
<th>${_('resource_control.col_platform')}</th>
|
||
<th>${_('resource_control.col_status')}</th>
|
||
<th>${_('resource_control.col_usb')}</th>
|
||
<th>${_('resource_control.col_optical')}</th>
|
||
<th>${_('resource_control.col_monitors')}</th>
|
||
<th>${_('resource_control.col_disks')}</th>
|
||
<th>${_('resource_control.col_quotas')}</th>
|
||
<th>${_('resource_control.col_actions')}</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody id="rc-device-tbody"></tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- USB tab -->
|
||
<div class="rc-panel" id="panel-usb">
|
||
<div class="rc-section">
|
||
<div class="rc-section-header">
|
||
<h3><span class="material-icons-round">usb</span> ${_('resource_control.usb_title')}</h3>
|
||
</div>
|
||
<p class="rc-hint">${_('resource_control.usb_hint')}</p>
|
||
<div class="rc-policy-form" id="usb-form">
|
||
<div class="rc-form-group">
|
||
<label>${_('resource_control.usb_storage_policy')}</label>
|
||
<select id="usb-storage-policy">
|
||
<option value="allowed">${_('resource_control.policy_allowed')}</option>
|
||
<option value="blocked">${_('resource_control.policy_blocked')}</option>
|
||
<option value="whitelist">${_('resource_control.policy_whitelist')}</option>
|
||
</select>
|
||
</div>
|
||
<div class="rc-form-group">
|
||
<label>${_('resource_control.usb_whitelist')}</label>
|
||
<textarea id="usb-whitelist" placeholder="${_('resource_control.usb_whitelist_hint')}" rows="4"></textarea>
|
||
</div>
|
||
<div class="rc-form-group">
|
||
<label class="rc-toggle-label">
|
||
<input type="checkbox" id="usb-audit-log"> ${_('resource_control.usb_audit_log')}
|
||
</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Optical tab -->
|
||
<div class="rc-panel" id="panel-optical">
|
||
<div class="rc-section">
|
||
<div class="rc-section-header">
|
||
<h3><span class="material-icons-round">album</span> ${_('resource_control.optical_title')}</h3>
|
||
</div>
|
||
<p class="rc-hint">${_('resource_control.optical_hint')}</p>
|
||
<div class="rc-policy-form" id="optical-form">
|
||
<div class="rc-form-group">
|
||
<label>${_('resource_control.optical_policy')}</label>
|
||
<select id="optical-policy">
|
||
<option value="allowed">${_('resource_control.policy_allowed')}</option>
|
||
<option value="blocked">${_('resource_control.policy_blocked')}</option>
|
||
</select>
|
||
</div>
|
||
<div class="rc-form-group">
|
||
<label class="rc-toggle-label">
|
||
<input type="checkbox" id="optical-audit-log"> ${_('resource_control.optical_audit_log')}
|
||
</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Monitors tab -->
|
||
<div class="rc-panel" id="panel-monitors">
|
||
<div class="rc-section">
|
||
<div class="rc-section-header">
|
||
<h3><span class="material-icons-round">monitor</span> ${_('resource_control.monitors_title')}</h3>
|
||
</div>
|
||
<p class="rc-hint">${_('resource_control.monitors_hint')}</p>
|
||
<div class="rc-policy-form" id="monitors-form">
|
||
<div class="rc-form-group">
|
||
<label>${_('resource_control.monitors_max_count')}</label>
|
||
<input type="number" id="monitors-max-count" min="0" max="16" value="0"
|
||
placeholder="${_('resource_control.monitors_max_hint')}">
|
||
</div>
|
||
<div class="rc-form-group">
|
||
<label>${_('resource_control.monitors_resolution')}</label>
|
||
<select id="monitors-resolution">
|
||
<option value="any">${_('resource_control.policy_any')}</option>
|
||
<option value="1920x1080">1920×1080 (Full HD)</option>
|
||
<option value="2560x1440">2560×1440 (QHD)</option>
|
||
<option value="3840x2160">3840×2160 (4K UHD)</option>
|
||
</select>
|
||
</div>
|
||
<div class="rc-form-group">
|
||
<label>${_('resource_control.monitors_brightness')}</label>
|
||
<input type="range" id="monitors-brightness" min="0" max="100" value="100">
|
||
<span id="monitors-brightness-val">100%</span>
|
||
</div>
|
||
<div class="rc-form-group">
|
||
<label>${_('resource_control.monitors_power_schedule')}</label>
|
||
<input type="text" id="monitors-power-schedule"
|
||
placeholder="${_('resource_control.monitors_power_hint')}">
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Disks tab -->
|
||
<div class="rc-panel" id="panel-disks">
|
||
<div class="rc-section">
|
||
<div class="rc-section-header">
|
||
<h3><span class="material-icons-round">storage</span> ${_('resource_control.disks_title')}</h3>
|
||
</div>
|
||
<p class="rc-hint">${_('resource_control.disks_hint')}</p>
|
||
<div class="rc-policy-form" id="disks-form">
|
||
<div class="rc-form-group">
|
||
<label class="rc-toggle-label">
|
||
<input type="checkbox" id="disks-readonly"> ${_('resource_control.disks_readonly')}
|
||
</label>
|
||
</div>
|
||
<div class="rc-form-group">
|
||
<label class="rc-toggle-label">
|
||
<input type="checkbox" id="disks-encryption"> ${_('resource_control.disks_encryption')}
|
||
</label>
|
||
</div>
|
||
<div class="rc-form-group">
|
||
<label class="rc-toggle-label">
|
||
<input type="checkbox" id="disks-smart"> ${_('resource_control.disks_smart')}
|
||
</label>
|
||
</div>
|
||
<div class="rc-form-group">
|
||
<label>${_('resource_control.disks_hidden')}</label>
|
||
<input type="text" id="disks-hidden-partitions"
|
||
placeholder="${_('resource_control.disks_hidden_hint')}">
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Quotas tab -->
|
||
<div class="rc-panel" id="panel-quotas">
|
||
<div class="rc-section">
|
||
<div class="rc-section-header">
|
||
<h3><span class="material-icons-round">speed</span> ${_('resource_control.quotas_title')}</h3>
|
||
</div>
|
||
<p class="rc-hint">${_('resource_control.quotas_hint')}</p>
|
||
<div class="rc-policy-form" id="quotas-form">
|
||
<div class="rc-form-group">
|
||
<label>${_('resource_control.quotas_cpu')}</label>
|
||
<div class="rc-range-group">
|
||
<input type="range" id="quotas-cpu" min="0" max="100" value="100">
|
||
<span id="quotas-cpu-val">100%</span>
|
||
</div>
|
||
</div>
|
||
<div class="rc-form-group">
|
||
<label>${_('resource_control.quotas_ram')}</label>
|
||
<div class="rc-range-group">
|
||
<input type="range" id="quotas-ram" min="0" max="100" value="100">
|
||
<span id="quotas-ram-val">100%</span>
|
||
</div>
|
||
</div>
|
||
<div class="rc-form-group">
|
||
<label>${_('resource_control.quotas_bandwidth')}</label>
|
||
<input type="number" id="quotas-bandwidth" min="0" value="0"
|
||
placeholder="${_('resource_control.quotas_bandwidth_hint')}">
|
||
</div>
|
||
<div class="rc-form-group">
|
||
<label>${_('resource_control.quotas_disk_quota')}</label>
|
||
<input type="number" id="quotas-disk" min="0" value="0"
|
||
placeholder="${_('resource_control.quotas_disk_hint')}">
|
||
</div>
|
||
<div class="rc-form-group">
|
||
<label>${_('resource_control.quotas_process_whitelist')}</label>
|
||
<textarea id="quotas-process-whitelist" rows="4"
|
||
placeholder="${_('resource_control.quotas_process_hint')}"></textarea>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<script>
|
||
document.addEventListener('DOMContentLoaded', function() {
|
||
if (window.ResourceControl) ResourceControl.init();
|
||
});
|
||
</script>
|
||
`
|
||
}) %>
|