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:
2026-03-06 12:48:06 +01:00
commit 8bb96b9048
10 changed files with 3458 additions and 0 deletions

View 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; }

View 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; }