app/Plugin/NZMailSystem42/Resource/template/admin/order_list_buttons.twig line 1

Open in your IDE?
  1. <script>
  2. $(document).ready(function() {
  3.     // NZMailSystem専用の処理を遅延実行(既存機能を優先)
  4.     setTimeout(function() {
  5.         initNZMailButtons();
  6.     }, 500);
  7. });
  8. function initNZMailButtons() {
  9.     // CSRFトークンの取得(検索フォームから取得)
  10.     var csrfToken = $('#search_form input[name="_token"]').val();
  11.     if (!csrfToken) {
  12.         // 検索フォームにない場合は、最初のフォームから取得
  13.         csrfToken = $('form input[name="_token"]').first().val();
  14.     }
  15.     
  16.     var adminPath = '{{ eccube_config.eccube_admin_route }}';
  17.     
  18.     // メール送信履歴データ(PHPから渡される)
  19.     var mailHistories = {{ nz_mail_histories|json_encode|raw }};
  20.     
  21.     // 各受注行にボタンを追加
  22.     $('#search_result tbody tr').each(function() {
  23.         var $row = $(this);
  24.         
  25.         // 最後の列(お届け先の列)を取得
  26.         var $lastCell = $row.find('td').last();
  27.         
  28.         // 注文IDを取得(IDの列から)
  29.         var $idCell = $row.find('td').eq(1); // 2列目(ID列)
  30.         var $idLink = $idCell.find('a');
  31.         if ($idLink.length === 0) return;
  32.         
  33.         var href = $idLink.attr('href');
  34.         var matches = href.match(/\/(\d+)\/edit$/);
  35.         if (!matches) return;
  36.         
  37.         var orderId = matches[1];
  38.         
  39.         // 既に追加済みかチェック
  40.         if ($lastCell.find('.nz-mail-btn').length > 0) return;
  41.         
  42.         // .text-endを含む親要素を取得
  43.         var $buttonContainer = $lastCell.find('.text-end');
  44.         if ($buttonContainer.length === 0) return;
  45.         
  46.         // メール送信履歴をチェック
  47.         var isReceivedSent = mailHistories[orderId] && mailHistories[orderId].received;
  48.         var isCancelSent = mailHistories[orderId] && mailHistories[orderId].cancel;
  49.         
  50.         // 入金確認済みボタンのラッパー(銀行マーク)
  51.         var $receivedWrapper = $('<div class="px-1 d-inline-block"></div>');
  52.         var receivedIconClass = isReceivedSent ? 'text-muted' : 'text-success';
  53.         var receivedIcon = isReceivedSent ? 
  54.             '<i class="fa fa-check-circle fa-lg ' + receivedIconClass + '"></i>' : 
  55.             '<i class="fa fa-university fa-lg ' + receivedIconClass + '"></i>';
  56.         var receivedTitle = isReceivedSent ? '入金確認済みメール送信済み' : '入金確認済みメール送信';
  57.         var receivedDisabled = isReceivedSent ? ' disabled' : '';
  58.         
  59.         var $receivedBtn = $('<button type="button" class="btn btn-ec-actionIcon nz-mail-btn nz-payment-received-btn" data-order-id="' + orderId + '" data-bs-toggle="tooltip" data-bs-placement="top" title="' + receivedTitle + '"' + receivedDisabled + '>' +
  60.                 receivedIcon +
  61.                 '</button>');
  62.         
  63.         if (!isReceivedSent) {
  64.             $receivedBtn.on('click', function(e) {
  65.                 e.preventDefault();
  66.                 e.stopPropagation();
  67.                 
  68.                 var orderId = $(this).data('order-id');
  69.                 if (!confirm('入金確認済みメールを送信しますか?')) {
  70.                     return;
  71.                 }
  72.                 
  73.                 var $btn = $(this);
  74.                 
  75.                 $.ajax({
  76.                     url: '/' + adminPath + '/nz_mail/payment_received/' + orderId,
  77.                     type: 'POST',
  78.                     data: {
  79.                         '_token': csrfToken
  80.                     },
  81.                     dataType: 'json',
  82.                     success: function(response) {
  83.                         if (response.success) {
  84.                             alert('✓ 入金確認済みメールを送信しました');
  85.                             // ボタンを送信済み状態に変更
  86.                             $btn.prop('disabled', true);
  87.                             $btn.html('<i class="fa fa-check-circle fa-lg text-muted"></i>');
  88.                             $btn.attr('title', '入金確認済みメール送信済み');
  89.                             $btn.tooltip('dispose').tooltip();
  90.                         } else {
  91.                             alert('エラー: ' + (response.message || '送信に失敗しました'));
  92.                         }
  93.                     },
  94.                     error: function(xhr) {
  95.                         var errorMsg = 'メール送信に失敗しました';
  96.                         if (xhr.responseJSON && xhr.responseJSON.message) {
  97.                             errorMsg += '\n' + xhr.responseJSON.message;
  98.                         } else if (xhr.responseText) {
  99.                             errorMsg += '\n' + xhr.responseText;
  100.                         }
  101.                         alert(errorMsg);
  102.                         console.error('Ajax error:', xhr);
  103.                     }
  104.                 });
  105.             });
  106.         }
  107.         
  108.         $receivedWrapper.append($receivedBtn);
  109.         
  110.         // キャンセルボタンのラッパー
  111.         var $cancelWrapper = $('<div class="px-1 d-inline-block"></div>');
  112.         var cancelIconClass = isCancelSent ? 'text-muted' : 'text-secondary';
  113.         var cancelIcon = isCancelSent ? 
  114.             '<i class="fa fa-check-circle fa-lg ' + cancelIconClass + '"></i>' : 
  115.             '<i class="fa fa-times-circle fa-lg ' + cancelIconClass + '"></i>';
  116.         var cancelTitle = isCancelSent ? 'キャンセルメール送信済み' : 'キャンセルメール送信';
  117.         var cancelDisabled = isCancelSent ? ' disabled' : '';
  118.         
  119.         var $cancelBtn = $('<button type="button" class="btn btn-ec-actionIcon nz-mail-btn nz-cancel-btn" data-order-id="' + orderId + '" data-bs-toggle="tooltip" data-bs-placement="top" title="' + cancelTitle + '"' + cancelDisabled + '>' +
  120.                 cancelIcon +
  121.                 '</button>');
  122.         
  123.         if (!isCancelSent) {
  124.             $cancelBtn.on('click', function(e) {
  125.                 e.preventDefault();
  126.                 e.stopPropagation();
  127.                 
  128.                 var orderId = $(this).data('order-id');
  129.                 if (!confirm('キャンセルメールを送信しますか?')) {
  130.                     return;
  131.                 }
  132.                 
  133.                 var $btn = $(this);
  134.                 
  135.                 $.ajax({
  136.                     url: '/' + adminPath + '/nz_mail/cancel/' + orderId,
  137.                     type: 'POST',
  138.                     data: {
  139.                         '_token': csrfToken
  140.                     },
  141.                     dataType: 'json',
  142.                     success: function(response) {
  143.                         if (response.success) {
  144.                             alert('✓ キャンセルメールを送信しました');
  145.                             // ボタンを送信済み状態に変更
  146.                             $btn.prop('disabled', true);
  147.                             $btn.html('<i class="fa fa-check-circle fa-lg text-muted"></i>');
  148.                             $btn.attr('title', 'キャンセルメール送信済み');
  149.                             $btn.tooltip('dispose').tooltip();
  150.                         } else {
  151.                             alert('エラー: ' + (response.message || '送信に失敗しました'));
  152.                         }
  153.                     },
  154.                     error: function(xhr) {
  155.                         var errorMsg = 'メール送信に失敗しました';
  156.                         if (xhr.responseJSON && xhr.responseJSON.message) {
  157.                             errorMsg += '\n' + xhr.responseJSON.message;
  158.                         } else if (xhr.responseText) {
  159.                             errorMsg += '\n' + xhr.responseText;
  160.                         }
  161.                         alert(errorMsg);
  162.                         console.error('Ajax error:', xhr);
  163.                     }
  164.                 });
  165.             });
  166.         }
  167.         
  168.         $cancelWrapper.append($cancelBtn);
  169.         
  170.         // 既存のボタンの後ろに追加
  171.         $buttonContainer.append($receivedWrapper).append($cancelWrapper);
  172.     });
  173.     
  174.     // ツールチップ初期化
  175.     $('[data-bs-toggle="tooltip"]').tooltip();
  176. }
  177. </script>
  178. <style>
  179. .btn-ec-actionIcon {
  180.     border: none;
  181.     background: none;
  182.     padding: 0.25rem 0.5rem;
  183.     cursor: pointer;
  184. }
  185. .btn-ec-actionIcon:hover:not(:disabled) {
  186.     opacity: 0.7;
  187. }
  188. .btn-ec-actionIcon:disabled {
  189.     cursor: not-allowed;
  190.     opacity: 0.6;
  191. }
  192. </style>