Add booking stack, client deploys, and back-office updates
- deploy/booking: shared Easy!Appointments stack with brand-matched wizard (flatpickr recolor, single-tenant provider hide, iframe auto-fit height reporter) - deploy/clients: per-client isolated nginx compose stacks with _template scaffold, new-client.sh, and happynails live site - deploy/backup: smb-db backup script - n8n: booking-sync workflow; onboarding tweaks - playbooks: lead-to-customer lifecycle + outreach - templates: nail-studio landing previews - backoffice: app/db/init/compose updates Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -43,11 +43,12 @@
|
||||
.pillv { display: inline-block; padding: 2px 9px; border-radius: 999px; font-size: .74rem; font-weight: 600;
|
||||
background: var(--teal-soft); color: var(--teal-2); }
|
||||
.empty { padding: 40px; text-align: center; color: var(--muted); }
|
||||
.del { background: none; border: 1px solid var(--line); border-radius: 7px; cursor: pointer;
|
||||
padding: 3px 8px; font-size: .9rem; }
|
||||
.del:hover { background: #fdecec; border-color: #f3c7c7; }
|
||||
.actcol { white-space: nowrap; width: 1%; text-align: right; }
|
||||
.del { background: none; border: 1px solid #e6b9b9; color: #b4322e; border-radius: 7px; cursor: pointer;
|
||||
padding: 4px 10px; font-size: .8rem; font-weight: 600; }
|
||||
.del:hover { background: #fdecec; border-color: #e08a86; }
|
||||
.act { background: none; border: 1px solid var(--line); border-radius: 7px; cursor: pointer;
|
||||
padding: 3px 8px; font-size: .9rem; margin-right: 4px; }
|
||||
padding: 4px 10px; font-size: .8rem; font-weight: 600; margin-right: 6px; }
|
||||
.act:hover { background: var(--teal-soft); border-color: var(--teal); }
|
||||
.overlay { position: fixed; inset: 0; background: rgba(8,20,19,.5); display: none;
|
||||
align-items: flex-start; justify-content: center; padding: 40px 16px; z-index: 20; overflow: auto; }
|
||||
@@ -151,7 +152,7 @@
|
||||
if((c==='received_at'||c==='created_at') && v) v = String(v).replace('T',' ').slice(0,16);
|
||||
return `<td title="${esc(v)}">${esc(v)}</td>`;
|
||||
}).join('');
|
||||
return `<tr>${cells}<td style="white-space:nowrap"><button class="act" title="Bearbeiten" onclick="openForm('${esc(id)}')">✎</button><button class="del" title="Löschen" onclick="del('${esc(id)}')">🗑</button></td></tr>`;
|
||||
return `<tr>${cells}<td class="actcol"><button class="act" title="Bearbeiten" onclick="openForm('${esc(id)}')">Bearbeiten</button><button class="del" title="Löschen" onclick="del('${esc(id)}')">Löschen</button></td></tr>`;
|
||||
}).join('');
|
||||
document.getElementById('table').innerHTML = `<table><thead>${head}</thead><tbody>${body}</tbody></table>`;
|
||||
}
|
||||
@@ -183,6 +184,7 @@
|
||||
{k:'status',t:'select',opts:['lead','onboarding','active','churned']},
|
||||
{k:'billing_cycle',t:'select',opts:['monthly','yearly','one-off']},
|
||||
{k:'monthly_fee_eur'},{k:'domain'},
|
||||
{k:'notify_channel',t:'select',opts:['calendar','telegram','email','sms','whatsapp']},
|
||||
{k:'start_date',t:'date'},{k:'renewal_date',t:'date'},
|
||||
{k:'services',wide:true},{k:'stack_notes',t:'textarea',wide:true},
|
||||
{k:'vault_ref'},{k:'notes',t:'textarea',wide:true},
|
||||
|
||||
Reference in New Issue
Block a user