Adds create customer drawer to customers page

Implements new drawer for creating customers with form inputs for contact details and notes

Enhances customer management by providing a streamlined way to add new customer records directly from the customers index page
This commit is contained in:
Janus C. H. Knudsen 2026-01-24 10:59:21 +01:00
parent dc2bab5702
commit 38e9243bcd
5 changed files with 193 additions and 1 deletions

View file

@ -10,7 +10,7 @@
<i class="ph ph-export"></i>
<span>@Model.ExportButtonText</span>
</swp-btn>
<swp-btn class="primary">
<swp-btn class="primary" data-drawer-trigger="create-customer-drawer">
<i class="ph ph-plus"></i>
<span>@Model.CreateButtonText</span>
</swp-btn>

View file

@ -197,6 +197,80 @@
</swp-drawer-body>
</div>
<!-- Create Customer Drawer -->
<div id="create-customer-drawer" data-drawer="lg">
<swp-drawer-header>
<swp-drawer-title>
<i class="ph ph-user-plus"></i>
<span localize="customers.createDrawer.title">Opret ny kunde</span>
</swp-drawer-title>
<swp-drawer-close data-drawer-close>
<i class="ph ph-x"></i>
</swp-drawer-close>
</swp-drawer-header>
<swp-drawer-body>
<!-- Navn (påkrævet) -->
<swp-form-row>
<swp-form-label localize="customers.createDrawer.name">Navn *</swp-form-label>
<input type="text" id="createCustomerName" required>
</swp-form-row>
<!-- Kontaktoplysninger Card -->
<swp-card>
<swp-card-header>
<swp-card-title>
<i class="ph ph-address-book"></i>
<span localize="customers.drawer.contactInfo">Kontaktoplysninger</span>
</swp-card-title>
</swp-card-header>
<swp-edit-section>
<swp-edit-row>
<swp-edit-label localize="customers.drawer.phone">Telefon</swp-edit-label>
<swp-edit-input>
<input type="tel" id="createCustomerPhone">
</swp-edit-input>
</swp-edit-row>
<swp-edit-row>
<swp-edit-label localize="customers.drawer.email">Email</swp-edit-label>
<swp-edit-input>
<input type="email" id="createCustomerEmail">
</swp-edit-input>
</swp-edit-row>
<swp-edit-row>
<swp-edit-label localize="customers.drawer.address">Adresse</swp-edit-label>
<swp-edit-input>
<input type="text" id="createCustomerAddress">
</swp-edit-input>
</swp-edit-row>
<swp-edit-row>
<swp-edit-label localize="customers.drawer.zipCity">Postnr + By</swp-edit-label>
<swp-edit-input>
<input type="text" id="createCustomerZip" class="short">
<input type="text" id="createCustomerCity">
</swp-edit-input>
</swp-edit-row>
</swp-edit-section>
</swp-card>
<!-- Note -->
<swp-form-row class="note-field">
<swp-form-label localize="customers.createDrawer.note">Note</swp-form-label>
<textarea id="createCustomerNote" rows="3" localize-placeholder="customers.createDrawer.notePlaceholder" placeholder="Skriv en note om kunden..."></textarea>
</swp-form-row>
</swp-drawer-body>
<swp-drawer-footer>
<swp-btn class="secondary" data-drawer-close>
<span localize="common.cancel">Annuller</span>
</swp-btn>
<swp-btn class="primary" id="saveNewCustomer">
<span localize="customers.createDrawer.save">Opret kunde</span>
</swp-btn>
</swp-drawer-footer>
</div>
@section Scripts {
<script>
// Row click - navigate to detail page

View file

@ -606,6 +606,13 @@
"searchPlaceholder": "Søg kunde (navn, telefon, email...)",
"export": "Eksporter",
"create": "Ny kunde",
"createDrawer": {
"title": "Opret ny kunde",
"name": "Navn *",
"note": "Note",
"notePlaceholder": "Skriv en note om kunden...",
"save": "Opret kunde"
},
"emptySearch": "Ingen kunder matcher din søgning",
"column": {
"name": "Navn",

View file

@ -601,6 +601,60 @@
}
},
"customers": {
"title": "Customers",
"subtitle": "Manage customers and customer cards",
"searchPlaceholder": "Search customer (name, phone, email...)",
"export": "Export",
"create": "New customer",
"createDrawer": {
"title": "Create new customer",
"name": "Name *",
"note": "Note",
"notePlaceholder": "Write a note about the customer...",
"save": "Create customer"
},
"emptySearch": "No customers match your search",
"column": {
"name": "Name",
"phone": "Phone",
"email": "Email",
"visits": "Visits",
"lastVisit": "Last",
"hairdresser": "Hairdresser",
"created": "Created",
"tags": "Tags"
},
"stats": {
"total": "Total customers",
"newThisMonth": "New this month",
"avgVisits": "Avg. visits"
},
"drawer": {
"title": "Customer card",
"visits": "Visits",
"avgInterval": "Avg. interval",
"preferredHairdresser": "Preferred hairdresser",
"contactInfo": "Contact information",
"phone": "Phone",
"email": "Email",
"address": "Address",
"zipCity": "Zip + City",
"marketing": "Marketing",
"emailMarketing": "Email marketing",
"smsMarketing": "SMS marketing",
"profile": "Profile",
"hairType": "Hair type",
"porosity": "Porosity",
"preference": "Preference",
"warnings": "Warnings",
"revenueChart": "Revenue (last 6 months)",
"services": "Services",
"products": "Products",
"recentNotes": "Recent notes",
"noteType": "Note",
"colorFormula": "Color formula",
"seeAllNotes": "See all notes →"
},
"detail": {
"tabs": {
"activitylog": "Activity log"