Server : Apache/2.4.18 (Ubuntu) System : Linux canvaswebdesign 3.13.0-71-generic #114-Ubuntu SMP Tue Dec 1 02:34:22 UTC 2015 x86_64 User : oppastar ( 1041) PHP Version : 7.0.33-0ubuntu0.16.04.15 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, Directory : /var/www/laciasmara.com/public_html/shop/application/views/account/ |
Upload File : |
<?php defined('BASEPATH') or exit('No direct script access allowed'); ?> <div class="account-order-container"> <h1><?= ucfirst(lang('order_title')) ?></h1> <p><?= ucfirst(lang('order_sub_title')) ?></p> <!-- Search Box --> <div class="order-search-bar"> <input type="text" id="order-search" placeholder="<?= ucfirst(lang('account_search_placeholder')) ?>" /> </div> <!-- Filter Buttons --> <div class="order-filter-buttons"> <p class="order-filter-title">Status</p> <button class="order-filter-btn active" data-status="all"><?= ucfirst(lang('order_status_all')) ?></button> <button class="order-filter-btn" data-status="pending"><?= ucfirst(lang('order_status_pending')) ?></button> <button class="order-filter-btn" data-status="in-progress"><?= ucfirst(lang('order_status_progress')) ?></button> <button class="order-filter-btn" data-status="sent"><?= ucfirst(lang('order_status_sent')) ?></button> <button class="order-filter-btn" data-status="selesai"><?= ucfirst(lang('order_status_done')) ?></button> <button class="order-filter-btn" data-status="batal"><?= ucfirst(lang('order_status_cancel')) ?></button> </div> <ul class="order-history__list" id="orderHistoryList"> <?php foreach ($orders as $order): ?> <li class="order-card" data-status="<?= $order['status_class'] ?>"> <!-- Order Header --> <div class="order-card__header"> <div class="order-card__meta"> <span class="order-card__date"><?= $order['date'] ?></span> <span class="order-card__id">Order ID: <?= $order['id'] ?></span> </div> <span class="order-card__status order-card__status--<?= $order['status_class'] ?>"> <?= ($order['payment_confirm'] == 1 && $order['status'] == 'Belum Dibayar') ? "Pembayaran Sedang Diverifikasi" : $order['status'] ?> </span> </div> <!-- Order Items --> <div class="order-card__items"> <?php foreach ($order['items'] as $item): ?> <div class="order-item"> <div class="order-item__image"> <a href="<?= base_url('product/' . $item->alias) ?>" class="order-item__link"> <img src="<?= base_url('uploads/product/' . $item->image) ?>" alt="<?= $item->item_name ?>" class="order-item__thumbnail" /> </a> </div> <div class="order-item__details"> <h3 class="order-item__name"> <a href="<?= base_url('product/' . $item->alias) ?>" class="order-item__link"> <?= $item->item_name ?> </a> </h3> <p class="order-item__quantity"> <?= $item->quantity ?> pcs × IDR <?= number_format($item->item_price) ?> </p> <!-- Review Button for Individual Products --> <?php if ($order['status'] == "Selesai" && $item->can_review): ?> <div class="order-item__actions"> <a href="<?= base_url('product/' . $item->alias) ?>" class="btn btn--secondary btn--small"> <i class="fa fa-star"></i> Buat Ulasan (Dapetin 500 Poin) </a> </div> <?php elseif ($order['status'] == "Selesai" && !$item->can_review): ?> <div class="order-item__actions"> <span class="review-completed"> <i class="fa fa-check-circle"></i> Sudah Diulas </span> </div> <?php endif; ?> </div> </div> <?php endforeach; ?> </div> <!-- Order Footer --> <div class="order-card__footer"> <div class="order-card__total"> <div class="order-card__total-info"> <span class="order-card__total-label">Total:</span> <span class="order-card__total-amount">IDR <?= number_format($order['total'], 0, ',', '.') ?></span> </div> <button class="order-card__toggle-detail" onclick="toggleOrderDetail(<?= $order['id'] ?>)"> <span>Klik untuk melihat detail pesanan</span> <i class="fa fa-chevron-down order-card__toggle-icon" id="toggle-icon-<?= $order['id'] ?>"></i> </button> </div> <div class="order-card__actions"> <?php if ($order['status'] == "Dikirim"): ?> <button class="btn btn--outline btn--small" onclick="copyResiNumber('<?= $order['no_resi'] ?>')" title="Salin nomor resi JNE"> <i data-feather="copy" class="btn-icon"></i> Copy No. Resi JNE </button> <button class="btn btn--outline btn--small" onclick="openComplainModal(<?= $order['id'] ?>)"> <i data-feather="message-square" class="btn-icon"></i> Klaim Garansi </button> <button class="btn btn--primary btn--small" onclick="openFinishOrderModal(<?= $order['id'] ?>)"> <i data-feather="check-circle" class="btn-icon"></i> Selesai </button> <?php elseif ($order['status'] == "Belum Dibayar"): ?> <button class="btn btn--primary" onclick="openConfirmPaymentModal(<?= $order['id'] ?>)"> <i data-feather="upload" class="btn-icon"></i> Upload Bukti Pembayaran </button> <?php elseif ($order['status'] == "Selesai"): ?> <button class="btn btn--outline btn--small" onclick="openComplainModal(<?= $order['id'] ?>)"> <i data-feather="message-square" class="btn-icon"></i> Klaim Garansi </button> <button class="btn btn--primary" onclick="generateInvoice(<?= $order['id'] ?>)"> <i data-feather="printer" class="btn-icon"></i> Cetak Invoice </button> <?php elseif ($order['status'] == "Sudah Dibayar" || $order['status'] == "Diproses"): ?> <span class="order-card__processing-text"><i data-feather="clock" class="btn-icon"></i>Pesanan Lagi Diproses</span> <?php elseif ($order['status'] == "Komplain"): ?> <span class="order-card__claim-text"> <i data-feather="clock" class="btn-icon"></i><?= ucwords(lang('complaintdescstatus')); ?> <?= number_format($order['claim_credit']); ?> </span> <?php endif; ?> </div> </div> <!-- Order Details (Hidden by default) --> <div class="order-card__details" id="order-details-<?= $order['id'] ?>" style="display: none;"> <div class="order-details"> <h4 class="order-details__title">Detail Pesanan</h4> <div class="order-details__grid"> <div class="order-details__item"> <span class="order-details__label">Subtotal:</span> <span class="order-details__value">IDR <?= number_format($order['subtotal'], 0, ',', '.') ?></span> </div> <div class="order-details__item"> <span class="order-details__label">Biaya Ongkir:</span> <span class="order-details__value <?= $order['shipping_fee'] <= 0 ? 'order-details__value--reward' : '' ?>"> <?php if ($order['shipping_fee'] > 0): ?> IDR <?= number_format($order['shipping_fee'], 0, ',', '.'); ?> <?php else: ?> <i data-feather="truck" class="order-details__icon"></i> GRATIS ONGKIR <?php endif; ?> </span> </div> <?php if ($order['redeemed_voucher_amount'] > 0): ?> <div class="order-details__item"> <span class="order-details__label">Diskon Voucher (<?= $order['redeemed_voucher_code'] ?>):</span> <span class="order-details__value order-details__value--discount"> <i data-feather="tag" class="order-details__icon"></i> -IDR <?= number_format($order['redeemed_voucher_amount'], 0, ',', '.') ?></span> </div> <?php endif; ?> <?php if ($order['minus_reward_amount'] > 0): ?> <div class="order-details__item"> <span class="order-details__label">Diskon Poin (<?= number_format($order['minus_reward']) ?> poin):</span> <span class="order-details__value order-details__value--discount">-IDR <?= number_format($order['minus_reward_amount'], 0, ',', '.') ?></span> </div> <?php endif; ?> <?php if ($order['insurance_status'] == 'Yes'): ?> <div class="order-details__item"> <span class="order-details__label">Biaya Asuransi:</span> <span class="order-details__value">IDR <?= number_format($order['insurance_cost'], 0, ',', '.') ?></span> </div> <?php endif; ?> <div class="order-details__item"> <span class="order-details__label">Total Belanja:</span> <span class="order-details__value">IDR <?= number_format($order['total'], 0, ',', '.') ?></span> </div> <?php if ($order['plus_reward'] > 0): ?> <div class="order-details__item"> <span class="order-details__label">Poin yang Didapat:</span> <span class="order-details__value order-details__value--reward"> <i data-feather="gift" class="order-details__icon"></i> +<?= number_format($order['plus_reward']) ?> poin</span> </div> <?php endif; ?> </div> </div> </div> </li> <?php endforeach; ?> </ul> <!-- Transaction List --> <!-- <ul class="transaction-list"> <?php foreach ($orders as $order): ?> <li class="transaction-item" data-status="<?= $order['status_class'] ?>"> <div class="transaction-header"> <span class="transaction-date"><?= $order['date'] ?></span> <span class="transaction-status <?= $order['status_class'] ?>"> <?= ($order['payment_confirm'] == 1 && $order['status'] == 'Belum Dibayar') ? "Pembayaran Sedang Diverifikasi" : $order['status'] ?> </span> <span class="transaction-id">Order ID: <?= $order['id'] ?></span> </div> <?php foreach ($order['items'] as $item): ?> <div class="transaction-detail"> <a href="<?= base_url('product/' . $item->alias) ?>"> <img src="<?= base_url('uploads/product/' . $item->image) ?>" alt="<?= $item->item_name ?>" class="transaction-product-thumbnail" /> </a> <div class="transaction-product-details"> <span class="transaction-item-name"><a href="<?= base_url('product/' . $item->alias) ?>"><?= $item->item_name ?></a></span> <span class="transaction-item-quantity"><?= $item->quantity ?> pcs x IDR <?= number_format($item->item_price) ?></span> </div> </div> <?php endforeach; ?> <p class="transaction-total">Total:<b> IDR <?= number_format($order['total']) ?></b></p> <div class="transaction-actions"> <?php if ($order['status'] == "Dikirim"): ?> <button class="order-btn-copy-resi" onclick="copyResiNumber('<?= $order['no_resi'] ?>')" title="Salin nomor resi JNE"> <i class="fa fa-copy"></i> Copy No. Resi JNE </button> <button class="order-btn-complain" onclick="openComplainModal(<?= $order['id'] ?>)"> Complain </button> <button class="order-btn-finish" onclick="openFinishOrderModal(<?= $order['id'] ?>)"> Selesai </button> <?php elseif ($order['status'] == "Belum Dibayar"): ?> <button class="order-btn-confirm" onclick="openConfirmPaymentModal(<?= $order['id'] ?>)"> Konfirmasi Pembayaran </button> <?php elseif ($order['status'] == "Selesai"): ?> <button class="order-btn-confirm" onclick="generateInvoice(<?= $order['id'] ?>)"> Generate Invoice </button> <?php elseif ($order['status'] == "Sudah Dibayar" || $order['status'] == "Diproses"): ?> <span>Pesanan Sedang Diproses</span> <?php elseif ($order['status'] == "Komplain"): ?> <?= ucwords(lang('complaintdescstatus')); ?> <?= number_format($order['claim_credit']); ?> <?php endif; ?> </div> </li> <?php endforeach; ?> </ul> --> <!-- Finish Order Modal --> <div id="finishOrderModal" class="finish-order-modal hidden" inert> <div class="finish-order-modal-content" role="dialog" aria-labelledby="modalTitle" aria-describedby="modalDescription"> <button class="finish-order-close-btn" aria-label="Close" onclick="closeFinishOrderModal()">×</button> <h2 id="modalTitle"><?= ucwords(lang('finishyourorder')); ?> #<span id="orderIdDisplay"></span></h2> <p id="modalDescription"><?= ucwords(lang('finishyourorderdesc')); ?></p> <div class="finish-order-modal-actions"> <button class="finish-order-cancel-btn" onclick="closeFinishOrderModal()">Batal</button> <form id="finish-order-form" onsubmit="confirmFinishOrder(event)"> <input type="hidden" name="<?= $this->security->get_csrf_token_name(); ?>" value="<?= $this->security->get_csrf_hash(); ?>"> <input type="hidden" name="orderID" id="orderIDForm" value=""> <input type="hidden" name="new_status" value="8"> <button class="finish-order-confirm-btn" type="submit"><?= ucwords(lang('finishyourorder')); ?></button> </form> </div> </div> </div> <!-- Modal Complain --> <div id="order_history_complain_modal" class="order_history_modal hidden"> <div class="order_history_modal_box"> <div class="order_history_modal_header"> <h3 id="order_history_modal_title">Complain Order</h3> <button class="order_history_modal_close" onclick="closeComplainModal()">×</button> </div> <div class="order_history_modal_body"> <form id="order_history_complain_form" enctype="multipart/form-data"> <div class="order_history_form_group"> <label for="order_history_order_id">Order ID:</label> <input type="text" id="order_history_order_id" name="orderID" readonly /> </div> <div class="order_history_form_group"> <label>Order Details:</label> <table class="order_history_table"> <thead> <tr> <th>Item Name</th> <th>Quantity</th> </tr> </thead> <tbody id="order_history_order_items"> <!-- Dynamic Content --> </tbody> </table> </div> <div class="order_history_form_group"> <label for="order_history_linkclaim">Link Video Unboxing:</label> <input type="text" id="order_history_linkclaim" name="linkclaim" placeholder="Paste the video link here" required /> </div> <!-- <div class="order_history_form_group"> <label for="order_history_upload_proof">Upload Additional Proof:</label> <input type="file" id="order_history_upload_proof" name="file_claim[]" multiple /> <p class="order_history_hint"> You can upload images or documents related to your complaint. </p> </div> --> <input type="hidden" name="new_status" value="9"> <button type="submit" class="order_history_btn_submit">Submit Complaint</button> </form> </div> </div> </div> <!-- Confirm Payment Modal --> <div id="confirmPaymentModal" class="confirm-payment-modal hidden" inert> <div class="confirm-payment-modal-content" role="dialog" aria-labelledby="confirmPaymentModalTitle" aria-describedby="confirmPaymentModalDescription"> <button class="confirm-payment-close-btn" aria-label="Close" onclick="closeConfirmPaymentModal()">×</button> <h2 id="confirmPaymentModalTitle"><?= strtoupper(lang('payment_confirmation')) ?> #<span id="confirmPaymentModalOrderID"></span></h2> <p id="confirmPaymentModalDescription"><?= ucwords(lang('please_fill')); ?></p> <form id="confirm-payment-form"> <input type="hidden" name="<?= $this->security->get_csrf_token_name(); ?>" value="<?= $this->security->get_csrf_hash(); ?>"> <input type="hidden" name="order_id" value=""> <div class="confirm-payment-form-group"> <label for="payment_date"><?= ucwords(lang('payment_date')); ?></label> <input type="date" name="payment_date" id="payment_date" class="datepicker" value="<?= set_value('payment_date') ?>" required> </div> <div class="confirm-payment-form-group"> <label for="total_amount"><?= ucwords(lang('payment_amount')); ?> (IDR)</label> <input type="number" name="total_amount" id="total_amount" value="<?= set_value('total_amount') ?>" required> </div> <div class="confirm-payment-form-group"> <label for="to_bank"><?= ucwords(lang('transfer_to')); ?></label> <select id="to_bank" name="to_bank" required> <option value="bca" selected>BCA</option> <option value="mandiri">MANDIRI</option> </select> </div> <div class="confirm-payment-form-group"> <label for="from_bank"><?= ucwords(lang('transfer_from')); ?></label> <input type="text" name="from_bank" id="from_bank" value="<?= set_value('from_bank') ?>" required> </div> <div class="confirm-payment-form-group"> <label for="account_name"><?= ucwords(lang('from_account_name')); ?></label> <input type="text" name="account_name" id="account_name" value="<?= set_value('account_name') ?>" required> </div> <div class="confirm-payment-form-group"> <label for="account_number"><?= ucwords(lang('from_account_number')); ?></label> <input type="text" name="account_number" id="account_number" value="<?= set_value('account_number') ?>" required> </div> <div class="confirm-payment-form-group"> <label for="receipt_file">Bukti Pembayaran</label> <input type="file" name="receipt_file" id="receipt_file" required> <span class="file-tip"><?= lang('file_type_notice'); ?></span> </div> <div class="confirm-payment-form-actions"> <button type="submit" class="confirm-payment-submit-btn"> <span class="button-text"><?= ucwords(lang('confirm_payment')); ?></span> <span class="spinner-border spinner-border-sm d-none" role="status" aria-hidden="true"></span> </button> </div> </form> </div> </div> <div class="modal-tracking-overlay" id="trackingModal"> <div class="tracking-modal"> <div class="modal-tracking-header"> <h3>Detail Tracking Paket JNE</h3> <button class="close-tracking-modal" onclick="closeTrackingModal()">×</button> </div> <div class="modal-tracking-body" id="modalTrackingContent"> <div class="loading-tracking-spinner"> <div class="spinner"></div> </div> </div> </div> </div> <style> /* Modal Styles */ .modal-tracking-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 9999; opacity: 0; visibility: hidden; transition: opacity 0.3s, visibility 0.3s; } .modal-tracking-overlay.active { opacity: 1; visibility: visible; } .tracking-modal { background-color: #fff; width: 90%; max-width: 600px; border-radius: 8px; overflow: hidden; transform: translateY(20px); transition: transform 0.3s; } .modal-tracking-overlay.active .tracking-modal { transform: translateY(0); } .modal-tracking-header { background-color: #7A4397; color: white; padding: 15px 20px; display: flex; justify-content: space-between; align-items: center; } .modal-tracking-header h3 { margin: 0; font-size: 18px; } .close-tracking-modal { background: none; border: none; color: white; font-size: 24px; cursor: pointer; } .modal-tracking-body { padding: 20px; max-height: 70vh; overflow-y: auto; } /* Tracking Info Styles */ .tracking-summary { background-color: #f9f9f9; border-radius: 8px; padding: 15px; margin-bottom: 20px; } .summary-row { display: flex; margin-bottom: 8px; } .summary-label { font-weight: bold; width: 120px; flex-shrink: 0; } .tracking-detail { display: flex; flex-wrap: wrap; background-color: #f9f9f9; border-radius: 8px; padding: 15px; margin-bottom: 20px; } .detail-item { width: 50%; margin-bottom: 8px; } .detail-label { font-weight: bold; display: block; font-size: 13px; color: #666; } .tracking-history { margin-top: 20px; } .history-title { font-weight: bold; margin-bottom: 15px; padding-bottom: 5px; border-bottom: 1px solid #ddd; } .history-item { padding: 15px; border-left: 2px solid #7A4397; position: relative; margin-left: 15px; margin-bottom: 15px; } .history-item:before { content: ''; position: absolute; left: -8px; top: 0; width: 14px; height: 14px; border-radius: 50%; background-color: #7A4397; } .history-item:last-child { border-color: #999; } .history-item:last-child:before { background-color: #999; } .history-date { font-weight: bold; margin-bottom: 5px; color: #7A4397; } .history-item:last-child .history-date { color: #999; } .history-desc { font-size: 14px; } /* Loading Spinner */ .loading-tracking-spinner { display: flex; justify-content: center; align-items: center; padding: 30px; } .spinner { width: 40px; height: 40px; border: 4px solid rgba(0, 0, 0, 0.1); border-radius: 50%; border-top-color: #7A4397; animation: spin 1s ease-in-out infinite; } @keyframes spin { to { transform: rotate(360deg); } } @keyframes slide-in { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } @keyframes fade-out { from { opacity: 1; } to { opacity: 0; } } /* Responsive Styles */ @media (max-width: 768px) { .detail-item { width: 100%; } .copy-notification { right: 10px; bottom: 10px; max-width: calc(100% - 20px); } .tracking-modal { width: 95%; max-height: 90vh; } .modal-tracking-body { max-height: 65vh; } } </style> </div> <style> .confirm-payment-submit-btn { position: relative; min-width: 160px; } .confirm-payment-submit-btn:disabled { cursor: not-allowed; opacity: 0.7; } .spinner-border { margin-left: 8px; } /* Style untuk tombol Copy No. Resi */ .order-btn-copy-resi { width: 175px; border: 1px solid #333; background-color: #ffffff; color: #333; font-size: 14px; padding: 10px; border-radius: 5px; cursor: pointer; font-weight: 500; } .order-btn-copy-resi i { margin-right: 6px; } /* Style untuk notifikasi copy */ .copy-notification { position: fixed; bottom: 20px; left: 20px; right: 20px; background-color: #fff; border-left: 4px solid #4CAF50; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); padding: 16px; border-radius: 8px; display: flex; align-items: flex-start; box-sizing: border-box; z-index: 9999; animation: slide-in 0.3s ease-out; transition: all 0.3s ease; max-width: 100%; } .success-icon { background-color: #4CAF50; color: white; border-radius: 50%; width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; margin-right: 12px; font-size: 16px; flex-shrink: 0; } .notification-content { flex-grow: 1; overflow-wrap: break-word; } .notification-content p { margin: 0 0 6px 0; color: #333; font-size: 14px; line-height: 1.4; } .resi-info { font-size: 13px; color: #666; } .track-link { display: inline-block; text-decoration: none; color: #1976D2; margin-top: 6px; font-size: 13px; font-weight: 500; padding: 6px 10px; background-color: #E3F2FD; border-radius: 4px; cursor: pointer; transition: background-color 0.2s ease; border: none; } .track-link:hover { background-color: #BBDEFB; } .fade-out { animation: fade-out 0.5s ease-in forwards; } @keyframes slide-in { from { transform: translateY(100%); opacity: 0; } to { transform: translateY(0); opacity: 1; } } @keyframes fade-out { from { opacity: 1; } to { opacity: 0; } } @media (min-width: 480px) { .copy-notification { left: auto; right: 20px; max-width: 350px; } } </style> <script> document.addEventListener("DOMContentLoaded", () => { const searchInput = document.getElementById("order-search"); const filterButtons = document.querySelectorAll(".order-filter-btn"); const orderHistoryList = document.getElementById("orderHistoryList"); // Debounce function for search const debounce = (fn, delay) => { let timeoutId; return (...args) => { clearTimeout(timeoutId); timeoutId = setTimeout(() => fn.apply(this, args), delay); }; }; // Filter function const filterTransactions = (status) => { const items = orderHistoryList.querySelectorAll(".order-card"); items.forEach(item => { const itemStatus = item.dataset.status; // Show all if (status === "all") { item.style.display = "block"; return; } // Group status for 'Berlangsung' if (status === "in-progress" && ["processed", "paid", "halfpaid"].includes(itemStatus)) { item.style.display = "block"; return; } // Status 'pending' remains the same if (status === "pending" && ["pending"].includes(itemStatus)) { item.style.display = "block"; return; } // Status 'sent' now includes items with status 'sent' (status 4 with resi) if (status === "sent" && ["sent"].includes(itemStatus)) { item.style.display = "block"; return; } // Status 'selesai' now includes items with status 'selesai' (status 5 and 8) if (status === "selesai" && ["selesai"].includes(itemStatus)) { item.style.display = "block"; return; } // Status 'batal' remains the same if (status === "batal" && ["batal"].includes(itemStatus)) { item.style.display = "block"; return; } // Hide if no match item.style.display = "none"; }); }; // Search function const searchTransactions = debounce((query) => { const items = orderHistoryList.querySelectorAll(".order-card"); const searchQuery = query.toLowerCase(); items.forEach(item => { const itemDetails = Array.from(item.querySelectorAll(".order-item__details .order-item__name")); const orderId = item.querySelector(".order-card__id")?.textContent.toLowerCase(); const matchesItemName = itemDetails.some(detail => detail.textContent.toLowerCase().includes(searchQuery) ); const shouldShow = matchesItemName || orderId?.includes(searchQuery); item.style.display = shouldShow ? "block" : "none"; }); }, 300); // Event Listeners filterButtons.forEach(btn => { btn.addEventListener("click", (e) => { // Remove 'active' class from all buttons and set it for the clicked button filterButtons.forEach(b => b.classList.remove("active")); btn.classList.add("active"); // Call filter function based on data-status attribute const status = btn.dataset.status; filterTransactions(status); }); }); searchInput.addEventListener("input", (e) => { searchTransactions(e.target.value); }); document.querySelectorAll('.order_history_quantity_input').forEach((input) => { input.addEventListener('input', function() { if (parseInt(this.value, 10) > parseInt(this.max, 10)) { alert(`Max quantity is ${this.max}`); this.value = this.max; } }); }); let CSRF_TOKEN = "<?= $this->security->get_csrf_hash(); ?>"; const CSRF_NAME = "<?= $this->security->get_csrf_token_name(); ?>"; document .getElementById("order_history_complain_form") .addEventListener("submit", function(e) { e.preventDefault(); const formData = new FormData(this); formData.append(CSRF_NAME, CSRF_TOKEN); fetch(`${BASE_URL}account/komplain_pesanan`, { method: "POST", body: formData, }) .then((response) => response.json()) .then((data) => { if (data.status === "success") { alert(data.message); closeComplainModal(); CSRF_TOKEN = data.csrf_token; location.reload(); } else { alert(data.message); } }) .catch((error) => { console.error("Error processing complaint:", error); alert("Failed to submit complaint. Please try again."); }); }); }); // Fungsi untuk menyalin nomor resi function copyResiNumber(resiNumber) { // Buat elemen temporary untuk menyimpan text const tempInput = document.createElement("input"); document.body.appendChild(tempInput); tempInput.value = resiNumber; tempInput.select(); document.execCommand("copy"); document.body.removeChild(tempInput); // Tampilkan notifikasi showCopyNotification(resiNumber); } // Fungsi untuk menampilkan notifikasi bahwa nomor resi telah disalin function showCopyNotification(resiNumber) { const notification = document.createElement("div"); notification.className = "copy-notification"; notification.innerHTML = ` <div class="success-icon">✓</div> <div class="notification-content"> <p>Nomor Resi JNE berhasil disalin!</p> <p class="resi-info">Nomor resi <strong>${resiNumber}</strong> dapat dilacak dengan mengklik tombol dibawah ini</p> <button class="track-link" onclick="trackPackage('${resiNumber}')">Lacak Paket</button> </div> `; document.body.appendChild(notification); setTimeout(() => { notification.classList.add("fade-out"); setTimeout(() => { document.body.removeChild(notification); }, 500); }, 5000); } function openTrackingModal() { document.getElementById('trackingModal').classList.add('active'); } // Fungsi untuk menutup modal function closeTrackingModal() { document.getElementById('trackingModal').classList.remove('active'); } function trackPackage(resiNumber) { // Tampilkan modal dengan loading spinner openTrackingModal(); const modalTrackingContent = document.getElementById('modalTrackingContent'); modalTrackingContent.innerHTML = ` <div class="loading-tracking-spinner"> <div class="spinner"></div> </div> `; // URL API lacak paket const API_KEY = '<?= $api_key ?>'; const apiUrl = `https://api.binderbyte.com/v1/track?api_key=${API_KEY}&courier=jne&awb=${resiNumber}`; // Fetch data dari API fetch(apiUrl) .then(response => response.json()) .then(data => { if (data.status === 200) { displayTrackingResult(data); } else { modalTrackingContent.innerHTML = ` <div class="error-message"> <p>Gagal mendapatkan informasi tracking.</p> <p>${data.message || 'Silakan coba lagi nanti.'}</p> </div> `; } }) .catch(error => { console.error('Error fetching tracking info:', error); modalTrackingContent.innerHTML = ` <div class="error-message"> <p>Terjadi kesalahan saat mengambil data tracking.</p> <p>Silakan coba lagi nanti.</p> </div> `; }); } function displayTrackingResult(data) { const trackingInfo = data.data; const modalTrackingContent = document.getElementById('modalTrackingContent'); // Format tanggal ke format Indonesia function formatDate(dateString) { const options = { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' }; return new Date(dateString).toLocaleDateString('id-ID', options); } // Tampilkan hasil tracking let html = ` <div class="tracking-summary"> <div class="summary-row"> <span class="summary-label">No. Resi:</span> <span>${trackingInfo.summary.awb}</span> </div> <div class="summary-row"> <span class="summary-label">Kurir:</span> <span>${trackingInfo.summary.courier}</span> </div> <div class="summary-row"> <span class="summary-label">Layanan:</span> <span>${trackingInfo.summary.service || '-'}</span> </div> <div class="summary-row"> <span class="summary-label">Status:</span> <span><strong>${trackingInfo.summary.status}</strong></span> </div> <div class="summary-row"> <span class="summary-label">Tanggal Update:</span> <span>${formatDate(trackingInfo.summary.date)}</span> </div> ${trackingInfo.summary.weight ? ` <div class="summary-row"> <span class="summary-label">Berat:</span> <span>${trackingInfo.summary.weight}</span> </div>` : ''} </div> <div class="tracking-detail"> <div class="detail-item"> <span class="detail-label">Pengirim</span> <span>${trackingInfo.detail.shipper}</span> </div> <div class="detail-item"> <span class="detail-label">Penerima</span> <span>${trackingInfo.detail.receiver}</span> </div> <div class="detail-item"> <span class="detail-label">Asal</span> <span>${trackingInfo.detail.origin}</span> </div> <div class="detail-item"> <span class="detail-label">Tujuan</span> <span>${trackingInfo.detail.destination}</span> </div> </div> <div class="tracking-history"> <h4 class="history-title">Riwayat Pengiriman</h4> `; // Tampilkan riwayat pengiriman trackingInfo.history.forEach((item, index) => { html += ` <div class="history-item"> <div class="history-date">${formatDate(item.date)}</div> <div class="history-desc">${item.desc}</div> ${item.location ? `<div class="history-location">${item.location}</div>` : ''} </div> `; }); html += `</div>`; modalTrackingContent.innerHTML = html; } // Event listener untuk menutup modal ketika mengklik overlay document.getElementById('trackingModal').addEventListener('click', function(e) { if (e.target === this) { closeTrackingModal(); } }); function openConfirmPaymentModal(orderId) { const modal = document.getElementById('confirmPaymentModal'); const form = document.getElementById('confirm-payment-form'); const formOrderID = document.getElementById('confirmPaymentModalOrderID'); formOrderID.textContent = orderId; modal.classList.remove('hidden'); modal.setAttribute('aria-hidden', 'false'); modal.removeAttribute('inert'); form.querySelector('input[name="order_id"]').value = orderId; } function closeConfirmPaymentModal() { const modal = document.getElementById('confirmPaymentModal'); modal.classList.add('hidden'); modal.setAttribute('aria-hidden', 'true'); modal.setAttribute('inert', ''); } const closeComplainModal = () => { document.getElementById("order_history_complain_form").reset(); document.getElementById("order_history_complain_modal").classList.add("hidden"); }; const openComplainModal = (orderId) => { const complainModal = document.getElementById("order_history_complain_modal"); const orderIdField = document.getElementById("order_history_order_id"); const orderItemsContainer = document.getElementById("order_history_order_items"); // Tampilkan modal complainModal.classList.remove("hidden"); // Isi Order ID di form orderIdField.value = orderId; // Hapus konten lama dari tabel items orderItemsContainer.innerHTML = "<tr><td colspan='2'>Loading...</td></tr>"; const BASE_URL = "<?= base_url(); ?>"; // Ambil data item dari server fetch(`${BASE_URL}account/getOrderItemsJSON/${orderId}`) .then((response) => response.json()) .then((data) => { if (data.length > 0) { const itemsHTML = data .map( (item) => ` <tr class="order_history_item_row"> <td class="order_history_item_image"> <figure class="order_history_figure"> <img src="${BASE_URL}/uploads/product/${item.image}" alt="${item.item_name}" class="order_history_item_thumbnail" /> <figcaption class="order_history_item_name"> ${item.item_name} </figcaption> </figure> </td> <td class="order_history_item_quantity"> <label for="quantity_${item.id_orders_detail}" class="order_history_quantity_label"> </label> <input type="number" id="quantity_${item.id_orders_detail}" name="quantity[${item.id_orders_detail}]" value="${item.quantity}" min="1" max="${item.quantity}" class="order_history_quantity_input" /> </td> </tr> ` ) .join(""); orderItemsContainer.innerHTML = itemsHTML; } else { orderItemsContainer.innerHTML = ` <tr> <td colspan="2" class="order_history_empty_row"> <p class="order_history_empty_text">No items found</p> </td> </tr> `; } }) .catch((error) => { console.error("Error fetching order items:", error); orderItemsContainer.innerHTML = ` <tr> <td colspan="2" class="order_history_error_row"> <p class="order_history_error_text">Failed to load items</p> </td> </tr> `; }); }; function openFinishOrderModal(orderId) { const modal = document.getElementById('finishOrderModal'); const orderIdDisplay = document.getElementById('orderIdDisplay'); const orderIdForm = document.getElementById('orderIDForm'); // Set the order ID in the modal and form modal.dataset.orderId = orderId; orderIdDisplay.textContent = orderId; orderIdForm.value = orderId; // Show modal and manage accessibility modal.classList.remove('hidden'); modal.setAttribute('aria-hidden', 'false'); modal.removeAttribute('inert'); } function closeFinishOrderModal() { const modal = document.getElementById('finishOrderModal'); // Hide modal and re-enable inert for accessibility modal.classList.add('hidden'); modal.setAttribute('aria-hidden', 'true'); modal.setAttribute('inert', ''); } function confirmFinishOrder(event) { event.preventDefault(); // Prevent default form submission const form = document.getElementById('finish-order-form'); const formData = new FormData(form); // Get base URL from PHP const BASE_URL = "<?= base_url(); ?>"; // Send request using fetch fetch(BASE_URL + 'account/ubah_status_pesanan', { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { if (data.status === 'success') { alert(data.message); window.location.reload(); } else { alert(data.message); } // Update CSRF token if needed form.querySelector('input[name="<?= $this->security->get_csrf_token_name(); ?>"]').value = data.csrf_token; }) .catch(error => { console.error('Error:', error); }); // Close modal after submission closeFinishOrderModal(); } function toggleOrderDetail(orderId) { const detailsElement = document.getElementById('order-details-' + orderId); const iconElement = document.getElementById('toggle-icon-' + orderId); if (detailsElement.style.display === 'none' || detailsElement.style.display === '') { detailsElement.style.display = 'block'; iconElement.classList.add('rotated'); } else { detailsElement.style.display = 'none'; iconElement.classList.remove('rotated'); } } function generateInvoice(orderId) { window.location.href = '<?= base_url() ?>Account/generate_invoice/' + orderId; } const notyf = new Notyf({ duration: 2000, position: { x: 'right', y: 'top' }, types: [{ type: 'success', background: '#7A4397', icon: { className: 'fas fa-check', tagName: 'i', color: 'white' } }, { type: 'error', background: '#dc3545', icon: { className: 'fas fa-times', tagName: 'i', color: 'white' } } ] }); $(document).on('submit', '#confirm-payment-form', function(e) { e.preventDefault(); // Prevent the default form submission // Get form data var formData = new FormData(this); // Send AJAX request $.ajax({ url: '<?= base_url('account/update_paymentconfirmation') ?>', type: 'POST', data: formData, dataType: 'json', processData: false, contentType: false, beforeSend: function() { const $btn = $('.confirm-payment-submit-btn'); const $text = $btn.find('.button-text'); const $spinner = $btn.find('.spinner-border'); $btn.prop('disabled', true); $text.text('Processing...'); $spinner.removeClass('d-none'); }, success: function(response) { const $btn = $('.confirm-payment-submit-btn'); const $text = $btn.find('.button-text'); const $spinner = $btn.find('.spinner-border'); $btn.prop('disabled', false); $text.text('<?= ucwords(lang('confirm_payment')); ?>'); $spinner.addClass('d-none'); notyf.success('Payment confirmation successful!'); setTimeout(() => { window.location.reload(); }, 2000); }, error: function(xhr, status, error) { const $btn = $('.confirm-payment-submit-btn'); const $text = $btn.find('.button-text'); const $spinner = $btn.find('.spinner-border'); $btn.prop('disabled', false); $text.text('<?= ucwords(lang('confirm_payment')); ?>'); $spinner.addClass('d-none'); notyf.error('An error occurred. Please try again.'); } }); }); </script>