Files
orion/app/templates/admin/company-create.html
Samir Boulahtit bb2e5fd260 refactor: standardize admin templates with shared macros
Migrate all admin templates to use standardized components:
- Use tabs macros (tabs_nav, tab_button) for tab navigation
- Use number_stepper for quantity/numeric inputs
- Use headers macros for consistent page layouts
- Use modals macros for dialog components

Affected pages: dashboard, settings, logs, content-pages, companies,
vendors, users, imports, marketplace, code-quality, and more.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-07 17:04:43 +01:00

286 lines
13 KiB
HTML

{# app/templates/admin/company-create.html #}
{% extends "admin/base.html" %}
{% from 'shared/macros/headers.html' import page_header %}
{% from 'shared/macros/alerts.html' import error_state %}
{% block title %}Create Company{% endblock %}
{% block alpine_data %}adminCompanyCreate(){% endblock %}
{% block content %}
{{ page_header('Create New Company', subtitle='Create a company account with an owner user', back_url='/admin/companies', back_label='Back to Companies') }}
<!-- Success Message -->
<div x-show="successMessage" x-cloak class="mb-6 p-4 bg-green-100 border border-green-400 text-green-700 rounded-lg">
<div class="flex items-start">
<span x-html="$icon('check-circle', 'w-5 h-5 mr-3 mt-0.5 flex-shrink-0')"></span>
<div class="flex-1">
<p class="font-semibold">Company Created Successfully!</p>
<template x-if="ownerCredentials">
<div class="mt-2 p-3 bg-white rounded border border-green-300">
<p class="text-sm font-semibold mb-2">Owner Login Credentials (Save these!):</p>
<div class="space-y-1 text-sm font-mono">
<div><span class="font-bold">Email:</span> <span x-text="ownerCredentials.email"></span></div>
<div><span class="font-bold">Password:</span> <span x-text="ownerCredentials.password" class="bg-yellow-100 px-2 py-1 rounded"></span></div>
<div><span class="font-bold">Login URL:</span> <span x-text="ownerCredentials.login_url"></span></div>
</div>
<p class="mt-2 text-xs text-red-600">⚠️ The password will only be shown once. Please save it now!</p>
</div>
</template>
</div>
</div>
</div>
{{ error_state('Error Creating Company', error_var='errorMessage', show_condition='errorMessage') }}
<!-- Create Company Form -->
<div class="px-4 py-3 mb-8 bg-white rounded-lg shadow-md dark:bg-gray-800">
<form @submit.prevent="createCompany">
<!-- Company Information Section -->
<div class="mb-6">
<h3 class="mb-4 text-lg font-semibold text-gray-700 dark:text-gray-200">Company Information</h3>
<div class="grid gap-6 mb-4 md:grid-cols-2">
<!-- Company Name -->
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-400 mb-2">
Company Name <span class="text-red-500">*</span>
</label>
<input
type="text"
x-model="formData.name"
required
class="block w-full px-3 py-2 text-sm border border-gray-300 rounded-lg dark:border-gray-600 dark:bg-gray-700 dark:text-gray-300 focus:outline-none focus:ring-2 focus:ring-purple-600"
placeholder="ACME Corporation"
/>
</div>
<!-- Contact Email (Business) -->
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-400 mb-2">
Business Contact Email <span class="text-red-500">*</span>
</label>
<input
type="email"
x-model="formData.contact_email"
required
class="block w-full px-3 py-2 text-sm border border-gray-300 rounded-lg dark:border-gray-600 dark:bg-gray-700 dark:text-gray-300 focus:outline-none focus:ring-2 focus:ring-purple-600"
placeholder="info@acmecorp.com"
/>
<p class="mt-1 text-xs text-gray-500">Public business contact email</p>
</div>
</div>
<!-- Description -->
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 dark:text-gray-400 mb-2">
Description
</label>
<textarea
x-model="formData.description"
rows="3"
class="block w-full px-3 py-2 text-sm border border-gray-300 rounded-lg dark:border-gray-600 dark:bg-gray-700 dark:text-gray-300 focus:outline-none focus:ring-2 focus:ring-purple-600"
placeholder="Brief description of the company..."
></textarea>
</div>
<div class="grid gap-6 mb-4 md:grid-cols-2">
<!-- Contact Phone -->
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-400 mb-2">
Phone Number
</label>
<input
type="tel"
x-model="formData.contact_phone"
class="block w-full px-3 py-2 text-sm border border-gray-300 rounded-lg dark:border-gray-600 dark:bg-gray-700 dark:text-gray-300 focus:outline-none focus:ring-2 focus:ring-purple-600"
placeholder="+352 123 456 789"
/>
</div>
<!-- Website -->
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-400 mb-2">
Website
</label>
<input
type="url"
x-model="formData.website"
class="block w-full px-3 py-2 text-sm border border-gray-300 rounded-lg dark:border-gray-600 dark:bg-gray-700 dark:text-gray-300 focus:outline-none focus:ring-2 focus:ring-purple-600"
placeholder="https://www.acmecorp.com"
/>
</div>
</div>
<div class="grid gap-6 mb-4 md:grid-cols-2">
<!-- Business Address -->
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-400 mb-2">
Business Address
</label>
<textarea
x-model="formData.business_address"
rows="2"
class="block w-full px-3 py-2 text-sm border border-gray-300 rounded-lg dark:border-gray-600 dark:bg-gray-700 dark:text-gray-300 focus:outline-none focus:ring-2 focus:ring-purple-600"
placeholder="123 Main Street, Luxembourg City"
></textarea>
</div>
<!-- Tax Number -->
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-400 mb-2">
Tax/VAT Number
</label>
<input
type="text"
x-model="formData.tax_number"
class="block w-full px-3 py-2 text-sm border border-gray-300 rounded-lg dark:border-gray-600 dark:bg-gray-700 dark:text-gray-300 focus:outline-none focus:ring-2 focus:ring-purple-600"
placeholder="LU12345678"
/>
</div>
</div>
</div>
<!-- Owner Information Section -->
<div class="mb-6 pt-6 border-t border-gray-200 dark:border-gray-700">
<h3 class="mb-4 text-lg font-semibold text-gray-700 dark:text-gray-200">Owner Account</h3>
<div class="p-4 mb-4 bg-blue-50 border border-blue-200 rounded-lg dark:bg-gray-700 dark:border-gray-600">
<p class="text-sm text-blue-800 dark:text-blue-300">
<span x-html="$icon('information-circle', 'w-4 h-4 inline mr-1')"></span>
A user account will be created for the company owner. If the email already exists, that user will be assigned as owner.
</p>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-400 mb-2">
Owner Email (Login) <span class="text-red-500">*</span>
</label>
<input
type="email"
x-model="formData.owner_email"
required
class="block w-full px-3 py-2 text-sm border border-gray-300 rounded-lg dark:border-gray-600 dark:bg-gray-700 dark:text-gray-300 focus:outline-none focus:ring-2 focus:ring-purple-600"
placeholder="john.smith@acmecorp.com"
/>
<p class="mt-1 text-xs text-gray-500">This email will be used for owner login. Can be different from business contact email.</p>
</div>
</div>
<!-- Form Actions -->
<div class="flex items-center justify-between pt-6 border-t border-gray-200 dark:border-gray-700">
<button
type="button"
@click="window.location.href='/admin/companies'"
class="px-4 py-2 text-sm font-medium leading-5 text-gray-700 transition-colors duration-150 bg-white border border-gray-300 rounded-lg dark:text-gray-400 dark:border-gray-600 dark:bg-gray-800 hover:border-gray-500 focus:outline-none focus:shadow-outline-gray"
>
Cancel
</button>
<button
type="submit"
:disabled="loading"
class="px-4 py-2 text-sm font-medium leading-5 text-white transition-colors duration-150 bg-purple-600 border border-transparent rounded-lg hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple disabled:opacity-50 disabled:cursor-not-allowed"
>
<span x-show="!loading">Create Company</span>
<span x-show="loading" class="flex items-center">
<span x-html="$icon('spinner', 'w-4 h-4 mr-2')"></span>
Creating...
</span>
</button>
</div>
</form>
</div>
{% endblock %}
{% block extra_scripts %}
<script>
// Company Create Alpine Component
function adminCompanyCreate() {
return {
// Inherit base layout functionality
...data(),
// Page identifier
currentPage: 'companies',
// Form data
formData: {
name: '',
description: '',
owner_email: '',
contact_email: '',
contact_phone: '',
website: '',
business_address: '',
tax_number: ''
},
// UI state
loading: false,
successMessage: false,
errorMessage: '',
ownerCredentials: null,
// Initialize
init() {
console.log('Company Create page initialized');
},
// Create company
async createCompany() {
this.loading = true;
this.errorMessage = '';
this.successMessage = false;
this.ownerCredentials = null;
try {
console.log('Creating company:', this.formData);
const response = await apiClient.post('/admin/companies', this.formData);
console.log('Company created successfully:', response);
// Store owner credentials
if (response.temporary_password && response.temporary_password !== 'N/A (Existing user)') {
this.ownerCredentials = {
email: response.owner_email,
password: response.temporary_password,
login_url: response.login_url
};
}
this.successMessage = true;
// Reset form
this.formData = {
name: '',
description: '',
owner_email: '',
contact_email: '',
contact_phone: '',
website: '',
business_address: '',
tax_number: ''
};
// Scroll to top to show success message
window.scrollTo({ top: 0, behavior: 'smooth' });
// Redirect after 10 seconds if credentials shown, or 3 seconds otherwise
const redirectDelay = this.ownerCredentials ? 10000 : 3000;
setTimeout(() => {
window.location.href = '/admin/companies';
}, redirectDelay);
} catch (error) {
console.error('Failed to create company:', error);
this.errorMessage = error.message || 'Failed to create company';
window.scrollTo({ top: 0, behavior: 'smooth' });
} finally {
this.loading = false;
}
}
};
}
</script>
{% endblock %}