feat: initial WooAApanel plugin
Full WooCommerce plugin for aaPanel hosting management: - aaPanel API client (all website + database endpoints) - Admin: server management, site/DB assignments, full site/DB management panels - Customer My Account: web hosting tab with sites and databases - WooDomains PowerDNS integration for DNS management - WooCommerce order auto-provisioning (product → server linking) - Permission model: admin has all actions, customers have scoped access Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
84
assets/css/wooaapanel-account.css
Normal file
84
assets/css/wooaapanel-account.css
Normal file
@@ -0,0 +1,84 @@
|
||||
/* WooAApanel Account (My Account) Styles */
|
||||
|
||||
#wooaapanel-account { margin-top: 16px; }
|
||||
|
||||
/* ── Panels ───────────────────────────────────────────────────── */
|
||||
.wap-site-panel, .wap-db-panel {
|
||||
border: 1px solid #e0e0e0;
|
||||
border-radius: 6px;
|
||||
margin-bottom: 20px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.wap-panel-header {
|
||||
background: #f8f9fa;
|
||||
padding: 14px 16px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
border-bottom: 1px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.wap-site-name, .wap-db-name { font-weight: 700; font-size: 15px; }
|
||||
.wap-domain { color: #0073aa; }
|
||||
.wap-server-label { color: #888; font-size: 12px; margin-left: auto; }
|
||||
|
||||
/* ── Action buttons ──────────────────────────────────────────── */
|
||||
.wap-panel-actions { display: flex; flex-wrap: wrap; gap: 6px; }
|
||||
.wap-btn-sm { font-size: 12px !important; padding: 4px 10px !important; height: auto !important; line-height: 1.5 !important; }
|
||||
|
||||
/* ── Sections ────────────────────────────────────────────────── */
|
||||
.wap-section { padding: 16px; border-top: 1px solid #f0f0f0; }
|
||||
.wap-section h4, .wap-section h5 { margin-top: 0; margin-bottom: 10px; }
|
||||
|
||||
/* ── Tables inside sections ──────────────────────────────────── */
|
||||
.wap-section table { width: 100%; border-collapse: collapse; font-size: 13px; }
|
||||
.wap-section table th,
|
||||
.wap-section table td { padding: 6px 10px; border-bottom: 1px solid #f0f0f0; text-align: left; }
|
||||
.wap-section table th { background: #f8f8f8; font-weight: 600; }
|
||||
|
||||
/* ── Input rows ───────────────────────────────────────────────── */
|
||||
.wap-section input[type="text"],
|
||||
.wap-section input[type="password"],
|
||||
.wap-section select {
|
||||
padding: 6px 10px;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 3px;
|
||||
font-size: 13px;
|
||||
margin-right: 6px;
|
||||
}
|
||||
|
||||
.wap-section textarea {
|
||||
width: 100%;
|
||||
padding: 8px;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 3px;
|
||||
font-family: monospace;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
/* ── SSL info ─────────────────────────────────────────────────── */
|
||||
.wap-ssl-info p { margin: 4px 0; }
|
||||
.wap-ssl-info .wap-ssl-valid { color: #155724; font-weight: 600; }
|
||||
.wap-ssl-info .wap-ssl-invalid { color: #721c24; font-weight: 600; }
|
||||
|
||||
/* ── DNS ──────────────────────────────────────────────────────── */
|
||||
.wap-dns-add-form label { display: block; margin-bottom: 10px; }
|
||||
.wap-dns-add-form textarea { height: 70px; }
|
||||
|
||||
/* ── Notices ──────────────────────────────────────────────────── */
|
||||
.wap-notice-inline {
|
||||
display: inline-block;
|
||||
padding: 4px 10px;
|
||||
border-radius: 3px;
|
||||
font-size: 12px;
|
||||
margin-left: 6px;
|
||||
}
|
||||
.wap-notice-inline.ok { background: #d4edda; color: #155724; }
|
||||
.wap-notice-inline.error { background: #f8d7da; color: #721c24; }
|
||||
|
||||
/* ── DB action notice ─────────────────────────────────────────── */
|
||||
.wap-db-action-notice { padding: 0 16px; }
|
||||
.wap-db-action-notice.ok { background: #d4edda; color: #155724; padding: 8px 16px; }
|
||||
.wap-db-action-notice.error { background: #f8d7da; color: #721c24; padding: 8px 16px; }
|
||||
94
assets/css/wooaapanel-admin.css
Normal file
94
assets/css/wooaapanel-admin.css
Normal file
@@ -0,0 +1,94 @@
|
||||
/* WooAApanel Admin Styles */
|
||||
|
||||
.wooaapanel-page { max-width: 1200px; }
|
||||
|
||||
/* ── Cards / tables ─────────────────────────────────────────── */
|
||||
.wap-card {
|
||||
background: #fff;
|
||||
border: 1px solid #e0e0e0;
|
||||
border-radius: 4px;
|
||||
padding: 16px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.wap-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
font-size: 13px;
|
||||
}
|
||||
.wap-table th, .wap-table td {
|
||||
padding: 8px 12px;
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
.wap-table th { background: #f8f8f8; font-weight: 600; }
|
||||
.wap-table tr:hover td { background: #fafafa; }
|
||||
|
||||
/* ── Forms ───────────────────────────────────────────────────── */
|
||||
.wap-form { max-width: 600px; }
|
||||
.wap-form label { display: block; margin-bottom: 12px; }
|
||||
.wap-form label span { display: block; font-weight: 600; margin-bottom: 4px; font-size: 12px; }
|
||||
.wap-form input[type="text"],
|
||||
.wap-form input[type="url"],
|
||||
.wap-form input[type="password"],
|
||||
.wap-form select,
|
||||
.wap-form textarea {
|
||||
width: 100%;
|
||||
padding: 6px 10px;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 3px;
|
||||
font-size: 13px;
|
||||
}
|
||||
.wap-form textarea { min-height: 100px; font-family: monospace; }
|
||||
|
||||
/* ── Toolbar ─────────────────────────────────────────────────── */
|
||||
.wap-toolbar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
margin-bottom: 16px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.wap-toolbar select, .wap-toolbar input { max-width: 200px; }
|
||||
|
||||
/* ── Status / badges ─────────────────────────────────────────── */
|
||||
.wap-badge {
|
||||
display: inline-block;
|
||||
padding: 2px 8px;
|
||||
border-radius: 10px;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.wap-badge-active { background: #d4edda; color: #155724; }
|
||||
.wap-badge-inactive{ background: #f8d7da; color: #721c24; }
|
||||
|
||||
/* ── Action buttons ──────────────────────────────────────────── */
|
||||
.wap-action-btn { cursor: pointer; }
|
||||
.wap-action-btn + .wap-action-btn { margin-left: 4px; }
|
||||
|
||||
/* ── Inline edit form ────────────────────────────────────────── */
|
||||
.wap-inline-form { background: #f8f9fa; border: 1px solid #e0e0e0; border-radius: 4px; padding: 16px; margin-top: 16px; }
|
||||
.wap-inline-form h4 { margin-top: 0; }
|
||||
|
||||
/* ── Notices ─────────────────────────────────────────────────── */
|
||||
.wap-notice { padding: 8px 12px; border-radius: 3px; margin-top: 8px; display: none; }
|
||||
.wap-notice.success { background: #d4edda; color: #155724; display: block; }
|
||||
.wap-notice.error { background: #f8d7da; color: #721c24; display: block; }
|
||||
|
||||
/* ── Server selector ──────────────────────────────────────────── */
|
||||
.wap-server-picker { display: flex; align-items: center; gap: 8px; margin-bottom: 16px; }
|
||||
.wap-server-picker label { font-weight: 600; margin: 0; }
|
||||
|
||||
/* ── Detail panels ───────────────────────────────────────────── */
|
||||
.wap-detail-panel { margin-top: 8px; padding: 12px; background: #fafafa; border: 1px solid #e8e8e8; border-radius: 3px; }
|
||||
.wap-detail-panel pre { margin: 0; white-space: pre-wrap; word-break: break-all; font-size: 12px; }
|
||||
|
||||
/* ── Tabs ─────────────────────────────────────────────────────── */
|
||||
.wap-tabs { display: flex; gap: 0; border-bottom: 2px solid #0073aa; margin-bottom: 16px; }
|
||||
.wap-tab { padding: 8px 16px; cursor: pointer; border: 1px solid transparent; border-bottom: none; font-size: 13px; border-radius: 3px 3px 0 0; }
|
||||
.wap-tab.active { background: #0073aa; color: #fff; }
|
||||
.wap-tab:hover:not(.active) { background: #e8f4fc; }
|
||||
|
||||
.wap-tab-content { display: none; }
|
||||
.wap-tab-content.active { display: block; }
|
||||
Reference in New Issue
Block a user