- Timestamp:
- 02/22/26 17:24:14 (7 months ago)
- Branches:
- finki-main, main
- Children:
- 4dff800
- Parents:
- 69f2a41
- File:
-
- 1 edited
-
interfejs/store-owner.html (modified) (20 diffs)
Legend:
- Unmodified
- Added
- Removed
-
interfejs/store-owner.html
r69f2a41 r591278c 151 151 </select> 152 152 </div> 153 153 154 <div id="custom-date-range" style="display: none;"> 154 155 <div class="form-row"> … … 163 164 </div> 164 165 </div> 166 165 167 <div class="form-group"> 166 168 <label for="report-type">Report Type</label> … … 172 174 </select> 173 175 </div> 176 174 177 <button id="generate-store-report" class="btn-primary">Generate Report</button> 178 175 179 <div id="report-results" style="margin-top: 2rem;"></div> 176 180 </div> … … 214 218 <input type="number" id="product-production-time" min="1" required> 215 219 </div> 216 <div class="form-group ">220 <div class="form-group category-group"> 217 221 <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> 221 228 </div> 222 229 </div> … … 286 293 </main> 287 294 295 <!-- Edit Product Modal --> 288 296 <div id="edit-product-modal" class="modal" style="display: none;"> 289 297 <div class="modal-content modal-large"> … … 325 333 <input type="number" id="edit-product-production-time" min="1"> 326 334 </div> 327 <div class="form-group ">335 <div class="form-group category-group"> 328 336 <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> 332 343 </div> 333 344 </div> … … 348 359 </div> 349 360 361 <!-- Edit Employee Modal --> 350 362 <div id="edit-employee-modal" class="modal" style="display: none;"> 351 363 <div class="modal-content"> … … 381 393 382 394 <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">×</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> 383 424 </form> 384 425 </div> … … 408 449 document.addEventListener('DOMContentLoaded', async () => { 409 450 const user = await loadUserData(); 451 410 452 if (!user || user.userType !== 'store_owner') { 411 453 window.location.href = 'index.html'; … … 464 506 // Generate report 465 507 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 }); 466 525 }); 467 526 … … 499 558 const response = await fetch(`/api/store-products?storeId=${storeId}`); 500 559 const data = await response.json(); 501 502 560 const tbody = document.getElementById('products-list'); 561 503 562 if (data.success && data.products.length > 0) { 504 563 tbody.innerHTML = data.products.map(product => ` … … 528 587 const response = await fetch(`/api/store-orders?storeId=${storeId}`); 529 588 const data = await response.json(); 530 531 589 const tbody = document.getElementById('orders-list'); 590 532 591 if (data.success && data.orders.length > 0) { 533 592 tbody.innerHTML = data.orders.map(order => { … … 560 619 const response = await fetch(`/api/store-employees?storeId=${storeId}`); 561 620 const data = await response.json(); 562 563 621 const tbody = document.getElementById('employees-list'); 622 564 623 if (data.success && data.employees.length > 0) { 565 624 tbody.innerHTML = data.employees.map(emp => ` … … 592 651 if (data.success) { 593 652 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 => 594 661 `<option value="${cat.category_id}">${cat.name}</option>` 595 662 ).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; 599 664 } 600 665 } catch (error) { 601 666 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'); 602 724 } 603 725 } … … 607 729 608 730 const storeId = document.getElementById('store-select').value; 731 609 732 if (!storeId) { 610 733 alert('Please select a store first'); … … 679 802 680 803 const storeId = document.getElementById('store-select').value; 804 681 805 if (!storeId) { 682 806 alert('Please select a store first'); … … 686 810 const password = document.getElementById('employee-password').value; 687 811 const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/; 812 688 813 if (!passwordRegex.test(password)) { 689 814 alert('Password must have at least 8 characters, including uppercase, lowercase, number and special character'); … … 762 887 763 888 const storeId = document.getElementById('store-select').value; 889 764 890 const formData = { 765 891 code: document.getElementById('edit-product-code').value, … … 860 986 861 987 const storeId = document.getElementById('store-select').value; 988 862 989 const formData = { 863 990 employeeId: document.getElementById('edit-employee-id').value, … … 897 1024 898 1025 let startDate, endDate; 1026 899 1027 if (period === 'custom') { 900 1028 startDate = document.getElementById('report-start').value; 901 1029 endDate = document.getElementById('report-end').value; 1030 902 1031 if (!startDate || !endDate) { 903 1032 alert('Please select start and end dates');
Note:
See TracChangeset
for help on using the changeset viewer.
