Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 85 additions & 3 deletions adserver/templates/adserver/staff/publisher-payout-finish.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ <h1>{% block heading %}{% trans 'Finish Payout' %}{% endblock heading %}</h1>

<form method="post">

<h5 class="mb-3">{% trans 'Payout Details' %}</h5>

<dl>
<dt>{% trans 'Publisher' %}</dt>
<dd>{{ payout.publisher }}</dd>
Expand All @@ -31,18 +33,31 @@ <h1>{% block heading %}{% trans 'Finish Payout' %}{% endblock heading %}</h1>
{% if payout.publisher.paypal_email %}
<dt>{% trans 'User' %}</dt>
<dd>
{{ payout.publisher.paypal_email }}
<span id="payout-email">{{ payout.publisher.paypal_email }}</span>
<button type="button" class="btn btn-sm btn-outline-secondary ml-2 copy-btn" data-copy-target="payout-email" title="{% trans 'Copy email' %}">
<span class="fa fa-copy" aria-hidden="true"></span>
</button>
</dd>
{% endif %}

<dt>{% trans 'Status' %}</dt>
<dd>{{ payout.get_status_display }}</dd>

<dt>{% trans 'Amount' %}</dt>
<dd>${{ payout.amount|floatformat:2|intcomma }}</dd>
<dd>
<span id="payout-amount">${{ payout.amount|floatformat:2|intcomma }}</span>
<button type="button" class="btn btn-sm btn-outline-secondary ml-2 copy-btn" data-copy-target="payout-amount" title="{% trans 'Copy amount' %}">
<span class="fa fa-copy" aria-hidden="true"></span>
</button>
</dd>

<dt>{% trans 'Subject' %}</dt>
<dd>{% trans "EthicalAds Payout" %} - {{ payout.publisher.name }}</dd>
<dd>
<span id="payout-subject">{% trans "EthicalAds Payout" %} - {{ payout.publisher.name }}</span>
<button type="button" class="btn btn-sm btn-outline-secondary ml-2 copy-btn" data-copy-target="payout-subject" title="{% trans 'Copy subject' %}">
<span class="fa fa-copy" aria-hidden="true"></span>
</button>
</dd>

<dt>{% trans 'Action' %}</dt>
<dd>
Expand Down Expand Up @@ -85,4 +100,71 @@ <h1>{% block heading %}{% trans 'Finish Payout' %}{% endblock heading %}</h1>

</div>

<script>
(function() {
var RESET_TIMEOUT = 1500;

// Function to copy text to clipboard
function copyToClipboard(text, button, callback) {
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(function() {
callback();
}).catch(function(err) {
console.error('Failed to copy text: ', err);
alert('Failed to copy to clipboard');
});
} else {
// Fallback for older browsers
var textArea = document.createElement('textarea');
textArea.value = text;
textArea.style.position = 'fixed';
textArea.style.left = '-999999px';
document.body.appendChild(textArea);
textArea.select();
try {
document.execCommand('copy');
callback();
} catch (err) {
console.error('Fallback: Failed to copy text: ', err);
alert('Failed to copy to clipboard');
}
document.body.removeChild(textArea);
}
}

// Function to show success feedback on button
function showSuccessFeedback(button) {
var icon = button.querySelector('.fa-copy');
if (icon) {
icon.classList.remove('fa-copy');
icon.classList.add('fa-check');
button.classList.remove('btn-outline-secondary');
button.classList.add('btn-success');

setTimeout(function() {
icon.classList.remove('fa-check');
icon.classList.add('fa-copy');
button.classList.remove('btn-success');
button.classList.add('btn-outline-secondary');
}, RESET_TIMEOUT);
}
}

// Add click handlers to all copy buttons
var copyButtons = document.querySelectorAll('.copy-btn');
copyButtons.forEach(function(button) {
button.addEventListener('click', function() {
var targetId = this.getAttribute('data-copy-target');
var targetElement = document.getElementById(targetId);
if (targetElement) {
var textToCopy = targetElement.textContent.trim();
copyToClipboard(textToCopy, this, function() {
showSuccessFeedback(button);
});
}
});
});
})();
</script>

{% endblock content_container %}
4 changes: 4 additions & 0 deletions adserver/tests/test_staff_actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,10 @@ def test_finish_view(self):
self.assertEqual(finish_response.status_code, 200)
self.assertContains(finish_response, self.payout3.get_status_display())
self.assertContains(finish_response, "$99")
# Verify individual copy buttons are present
self.assertContains(finish_response, 'class="copy-btn"')
self.assertContains(finish_response, 'data-copy-target="payout-amount"')
self.assertContains(finish_response, 'data-copy-target="payout-subject"')

post_response = self.client.post(finish_url)
self.assertEqual(post_response.status_code, 302)
Expand Down
Loading