Ignore:
Timestamp:
02/22/26 17:24:14 (7 months ago)
Author:
Klimentina Efremova <klimentina08642@…>
Branches:
finki-main, main
Children:
4dff800
Parents:
69f2a41
Message:

Fixed Product and Category adding

File:
1 edited

Legend:

Unmodified
Added
Removed
  • interfejs/store-owner.html

    r69f2a41 r591278c  
    151151                    </select>
    152152                </div>
     153
    153154                <div id="custom-date-range" style="display: none;">
    154155                    <div class="form-row">
    … …  
    163164                    </div>
    164165                </div>
     166
    165167                <div class="form-group">
    166168                    <label for="report-type">Report Type</label>
    … …  
    172174                    </select>
    173175                </div>
     176
    174177                <button id="generate-store-report" class="btn-primary">Generate Report</button>
     178
    175179                <div id="report-results" style="margin-top: 2rem;"></div>
    176180            </div>
    … …  
    214218                            <input type="number" id="product-production-time" min="1" required>
    215219                        </div>
    216                         <div class="form-group">
     220                        <div class="form-group category-group">
    217221                            <label for="product-category">Category *</label>
    218                             <select id="product-category" required>
    219                                 <option value="">Select Category</option>
    220                             </select>
     222                            <div class="category-input-group">
     223                                <select id="product-category" required>
     224                                    <option value="">Select Category</option>
     225                                </select>
     226                                <button type="button" id="add-category-btn" class="btn-small btn-secondary">➕ New Category</button>
     227                            </div>
    221228                        </div>
    222229                    </div>
    … …  
    286293</main>
    287294
     295<!-- Edit Product Modal -->
    288296<div id="edit-product-modal" class="modal" style="display: none;">
    289297    <div class="modal-content modal-large">
    … …  
    325333                    <input type="number" id="edit-product-production-time" min="1">
    326334                </div>
    327                 <div class="form-group">
     335                <div class="form-group category-group">
    328336                    <label for="edit-product-category">Category</label>
    329                     <select id="edit-product-category">
    330                         <option value="">Select Category</option>
    331                     </select>
     337                    <div class="category-input-group">
     338                        <select id="edit-product-category">
     339                            <option value="">Select Category</option>
     340                        </select>
     341                        <button type="button" id="edit-add-category-btn" class="btn-small btn-secondary">➕ New Category</button>
     342                    </div>
    332343                </div>
    333344            </div>
    … …  
    348359</div>
    349360
     361<!-- Edit Employee Modal -->
    350362<div id="edit-employee-modal" class="modal" style="display: none;">
    351363    <div class="modal-content">
    … …  
    381393
    382394            <button type="submit" class="btn-primary">Update Employee</button>
     395        </form>
     396    </div>
     397</div>
     398
     399<!-- Add Category Modal -->
     400<div id="add-category-modal" class="modal" style="display: none;">
     401    <div class="modal-content">
     402        <span class="close">&times;</span>
     403        <h2>Create New Category</h2>
     404        <form id="add-category-form" class="form">
     405            <div class="form-group">
     406                <label for="category-name">Category Name *</label>
     407                <input type="text" id="category-name" required>
     408            </div>
     409
     410            <div class="form-group">
     411                <label for="category-description">Description</label>
     412                <textarea id="category-description" rows="3" placeholder="Optional description"></textarea>
     413            </div>
     414
     415            <div class="form-group">
     416                <label for="category-parent">Parent Category (optional)</label>
     417                <select id="category-parent">
     418                    <option value="">None (Top Level Category)</option>
     419                </select>
     420            </div>
     421
     422            <button type="submit" class="btn-primary">Create Category</button>
     423            <button type="button" id="cancel-category-btn" class="btn-secondary">Cancel</button>
    383424        </form>
    384425    </div>
    … …  
    408449    document.addEventListener('DOMContentLoaded', async () => {
    409450        const user = await loadUserData();
     451
    410452        if (!user || user.userType !== 'store_owner') {
    411453            window.location.href = 'index.html';
    … …  
    464506        // Generate report
    465507        document.getElementById('generate-store-report').addEventListener('click', generateStoreReport);
     508
     509        // Add Category button functionality
     510        document.getElementById('add-category-btn').addEventListener('click', () => {
     511            openCategoryModal();
     512        });
     513
     514        document.getElementById('edit-add-category-btn').addEventListener('click', () => {
     515            openCategoryModal('edit');
     516        });
     517
     518        // Category form submission
     519        document.getElementById('add-category-form').addEventListener('submit', createCategory);
     520
     521        // Cancel button
     522        document.getElementById('cancel-category-btn').addEventListener('click', () => {
     523            document.getElementById('add-category-modal').style.display = 'none';
     524        });
    466525    });
    467526
    … …  
    499558            const response = await fetch(`/api/store-products?storeId=${storeId}`);
    500559            const data = await response.json();
    501 
    502560            const tbody = document.getElementById('products-list');
     561
    503562            if (data.success && data.products.length > 0) {
    504563                tbody.innerHTML = data.products.map(product => `
    … …  
    528587            const response = await fetch(`/api/store-orders?storeId=${storeId}`);
    529588            const data = await response.json();
    530 
    531589            const tbody = document.getElementById('orders-list');
     590
    532591            if (data.success && data.orders.length > 0) {
    533592                tbody.innerHTML = data.orders.map(order => {
    … …  
    560619            const response = await fetch(`/api/store-employees?storeId=${storeId}`);
    561620            const data = await response.json();
    562 
    563621            const tbody = document.getElementById('employees-list');
     622
    564623            if (data.success && data.employees.length > 0) {
    565624                tbody.innerHTML = data.employees.map(emp => `
    … …  
    592651            if (data.success) {
    593652                const options = data.categories.map(cat =>
     653                    `<option value="${cat.category_id}">${cat.name}${cat.parent_name ? ` (subcategory of ${cat.parent_name})` : ''}</option>`
     654                ).join('');
     655
     656                document.getElementById('product-category').innerHTML = '<option value="">Select Category</option>' + options;
     657                document.getElementById('edit-product-category').innerHTML = '<option value="">Select Category</option>' + options;
     658
     659                // Also load for category parent dropdown
     660                const parentOptions = data.categories.map(cat =>
    594661                    `<option value="${cat.category_id}">${cat.name}</option>`
    595662                ).join('');
    596 
    597                 document.getElementById('product-category').innerHTML = '<option value="">Select Category</option>' + options;
    598                 document.getElementById('edit-product-category').innerHTML = '<option value="">Select Category</option>' + options;
     663                document.getElementById('category-parent').innerHTML = '<option value="">None (Top Level Category)</option>' + parentOptions;
    599664            }
    600665        } catch (error) {
    601666            console.error('Error loading categories:', error);
     667        }
     668    }
     669
     670    function openCategoryModal(source = 'add') {
     671        // Store which form triggered this
     672        document.getElementById('add-category-modal').dataset.source = source;
     673        document.getElementById('add-category-modal').style.display = 'block';
     674        document.getElementById('add-category-form').reset();
     675    }
     676
     677    async function createCategory(e) {
     678        e.preventDefault();
     679
     680        const categoryName = document.getElementById('category-name').value.trim();
     681        const categoryDescription = document.getElementById('category-description').value.trim();
     682        const parentId = document.getElementById('category-parent').value;
     683
     684        if (!categoryName) {
     685            alert('Please enter a category name');
     686            return;
     687        }
     688
     689        const categoryData = {
     690            name: categoryName,
     691            description: categoryDescription,
     692            parentId: parentId || null
     693        };
     694
     695        try {
     696            const response = await fetch('/api/create-category', {
     697                method: 'POST',
     698                headers: { 'Content-Type': 'application/json' },
     699                body: JSON.stringify(categoryData)
     700            });
     701
     702            const data = await response.json();
     703
     704            if (data.success) {
     705                alert(`Category "${categoryName}" created successfully!`);
     706                document.getElementById('add-category-modal').style.display = 'none';
     707
     708                // Reload categories in all dropdowns
     709                await loadCategories();
     710
     711                // Auto-select the new category if it came from add product form
     712                const source = document.getElementById('add-category-modal').dataset.source;
     713                if (source === 'edit') {
     714                    document.getElementById('edit-product-category').value = data.category.id;
     715                } else {
     716                    document.getElementById('product-category').value = data.category.id;
     717                }
     718            } else {
     719                alert(data.message || 'Failed to create category');
     720            }
     721        } catch (error) {
     722            console.error('Error creating category:', error);
     723            alert('An error occurred while creating the category');
    602724        }
    603725    }
    … …  
    607729
    608730        const storeId = document.getElementById('store-select').value;
     731
    609732        if (!storeId) {
    610733            alert('Please select a store first');
    … …  
    679802
    680803        const storeId = document.getElementById('store-select').value;
     804
    681805        if (!storeId) {
    682806            alert('Please select a store first');
    … …  
    686810        const password = document.getElementById('employee-password').value;
    687811        const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
     812
    688813        if (!passwordRegex.test(password)) {
    689814            alert('Password must have at least 8 characters, including uppercase, lowercase, number and special character');
    … …  
    762887
    763888        const storeId = document.getElementById('store-select').value;
     889
    764890        const formData = {
    765891            code: document.getElementById('edit-product-code').value,
    … …  
    860986
    861987        const storeId = document.getElementById('store-select').value;
     988
    862989        const formData = {
    863990            employeeId: document.getElementById('edit-employee-id').value,
    … …  
    8971024
    8981025        let startDate, endDate;
     1026
    8991027        if (period === 'custom') {
    9001028            startDate = document.getElementById('report-start').value;
    9011029            endDate = document.getElementById('report-end').value;
     1030
    9021031            if (!startDate || !endDate) {
    9031032                alert('Please select start and end dates');
Note: See TracChangeset for help on using the changeset viewer.