Add PSR HTTP Message Interfaces and Dependencies

- Implemented StreamInterface, UploadedFileInterface, and UriInterface as per PSR standards.
- Added getallheaders function to retrieve HTTP headers in a compatible manner.
- Included LICENSE files for ralouphie/getallheaders and symfony/deprecation-contracts.
- Introduced function for triggering deprecation notices in Symfony.
This commit is contained in:
2025-12-28 12:44:00 +01:00
parent cf600ae727
commit cd264483f8
410 changed files with 60841 additions and 16 deletions

View File

@@ -0,0 +1,284 @@
jQuery(function ($) {
// Constants
const SELECTORS = {
termsLink: ".atfpp-see-terms",
termsBox: "#termsBox",
refreshBtn: ".atfpp-refresh-btn",
licenseContainer: ".atfpp-dashboard-license-pro-container",
deactivateBtn: ".atfpp-dashboard-license-pro-container-deactivate-btn",
validityStrong: ".validity:has(strong) strong",
validitySpan: ".validity:not(:has(strong))",
licenseType: ".license-type",
containerUl: ".atfpp-dashboard-license-pro-container ul",
errorNotice: ".atfpp-dashboard-license-pro-container div.notice.notice-error",
};
const CSS_CLASSES = {
valid: "valid",
invalid: "invalid",
expired: "expired",
supportExpired: "support-expired",
noSupport: "no-support"
};
const MESSAGES = {
validLicense: "✅ Valid",
invalidLicense: "❌ Invalid",
expiredLicense: "❌ License Expired",
expiredSupport: "❌ Support Expired",
genericError: "An error occurred while refreshing the license. Please try again.",
checkingStatus: "⏳Checking....."
};
const URLS = {
renewLink: "https://my.coolplugins.net/account/subscriptions/"
};
// Helper Functions
const createNoticeElement = (type, message, isError = false) => {
const noticeClass = isError ? "notice-error" : "notice-success";
return $(`<div class="notice ${noticeClass} is-dismissible"><p>${message}</p></div>`);
};
const createRenewalNotice = (message) => {
return $(`<div style="margin-top: 10px; color: #d63638;" class="notice notice-error">${message}</div>`);
};
const isDateExpired = (dateString) => {
if (!dateString || dateString.toLowerCase() === "no expiry" || dateString.toLowerCase() === "unlimited") {
return false;
}
return new Date(dateString).getTime() < Date.now();
};
const updateValidityStatus = ($element, status, cssClass) => {
$element.html(status);
$element.removeClass(Object.values(CSS_CLASSES).join(" ")).addClass(cssClass);
};
const getRenewalMessage = (isLicenseExpired, market, versionMessage = '') => {
const baseMessage = isLicenseExpired
? "Your license has expired, "
: "Your support has expired, ";
const versionPrefix = versionMessage ? versionMessage + ' ' : '';
if (market === "E") {
return versionPrefix + baseMessage + "Renew now to continue receiving updates and priority support.";
}
const linkText = isLicenseExpired ? "Renew now" :
'<a style="color: #0073aa; text-decoration: underline;" href="' + URLS.renewLink + '" target="_blank">Renew now</a>';
return isLicenseExpired
? versionPrefix + baseMessage + `<a href="${URLS.renewLink}" target="_blank">Renew now</a> to continue receiving updates and priority support.`
: versionPrefix + baseMessage + linkText + " to continue receiving updates and priority support";
};
const getFormattedDate = (dateString) => {
if (dateString.toLowerCase() !== 'no expiry') {
const date = new Date(dateString);
return date.toLocaleDateString('en-GB', {
day: '2-digit',
month: 'short',
year: 'numeric'
});
}
return dateString;
};
const showNoticeMessage = (element, delay = 2000) => {
element.insertBefore(SELECTORS.licenseContainer).delay(delay).fadeOut();
};
// Terms toggle functionality
const $termsLink = $(SELECTORS.termsLink);
const $termsBox = $(SELECTORS.termsBox);
$termsLink.on("click", function (e) {
e.preventDefault();
const isVisible = $termsBox.toggle().is(":visible");
$(this).html(isVisible ? "Hide Terms" : "See terms");
});
// License refresh functionality
const $refreshBtn = $(SELECTORS.refreshBtn);
$refreshBtn.on("click", function (e) {
e.preventDefault();
const $btn = $(this);
const originalText = $btn.text();
// Update button state
$btn.prop("disabled", true).text(MESSAGES.checkingStatus);
// AJAX request
$.ajax({
url: atfpp_ajax.ajaxurl,
type: "POST",
data: {
action: "atfpp_refresh_license_ajax",
nonce: atfpp_ajax.nonce,
},
success: function (response) {
if (response.success) {
const successNotice = createNoticeElement("success", response.data.message);
showNoticeMessage(successNotice);
if (response.data.license_info) {
const versionMessage = response.data.version_available_message || '';
updateLicenseInfo(response.data.license_info, versionMessage);
}
} else {
const errorNotice = createNoticeElement("error", response.data.message, true);
showNoticeMessage(errorNotice);
setTimeout(() => location.reload(), 2000);
}
},
error: function () {
const errorNotice = createNoticeElement("error", MESSAGES.genericError, true);
showNoticeMessage(errorNotice, 5000);
},
complete: function () {
$btn.prop("disabled", false).text("🔄" + originalText);
},
});
});
// License information update function
function updateLicenseInfo(licenseInfo, versionMessage = '') {
updateLicenseValidity(licenseInfo);
updateLicenseType(licenseInfo);
updateExpireDate(licenseInfo);
handleRenewalMessages(licenseInfo, versionMessage);
handleRefreshButtonVisibility(licenseInfo);
}
function updateLicenseValidity(licenseInfo) {
const $validity = $(SELECTORS.validityStrong);
if (!licenseInfo.is_valid) {
updateValidityStatus($validity, MESSAGES.invalidLicense, CSS_CLASSES.invalid);
return;
}
if (licenseInfo.is_valid === "license_expired") {
updateValidityStatus($validity, MESSAGES.expiredLicense, CSS_CLASSES.expired);
} else if (licenseInfo.support_end.toLowerCase() === "no support") {
updateValidityStatus($validity, MESSAGES.expiredSupport, CSS_CLASSES.noSupport);
} else if (licenseInfo.is_valid === "support_expired" &&
isDateExpired(licenseInfo.support_end)) {
updateValidityStatus($validity, MESSAGES.expiredSupport, CSS_CLASSES.supportExpired);
} else {
updateValidityStatus($validity, MESSAGES.validLicense, CSS_CLASSES.valid);
}
}
function updateLicenseType(licenseInfo) {
if (!licenseInfo.license_title) return;
const $licenseType = $(SELECTORS.licenseType);
if ($licenseType.length > 0) {
$licenseType.text(licenseInfo.license_title);
} else {
const $ul = $(SELECTORS.containerUl);
const $statusLi = $ul.find("li:first");
const $newLicenseTypeLi = $(`
<li>
<strong>License Type:</strong>
<span class="license-type">${licenseInfo.license_title}</span>
</li>
`);
$statusLi.after($newLicenseTypeLi);
}
}
function updateExpireDate(licenseInfo) {
if (!licenseInfo.expire_date) return;
const $expireDateSpan = $(SELECTORS.validitySpan);
const displayDate = getDisplayDate(licenseInfo);
if ($expireDateSpan.length > 0) {
$expireDateSpan.text(displayDate);
} else {
createExpireDateElement(displayDate);
}
}
function getDisplayDate(licenseInfo) {
const expireDateExpired = isDateExpired(licenseInfo.expire_date);
const supportEndExpired = isDateExpired(licenseInfo.support_end);
if (licenseInfo.support_end.toLowerCase() === "no support") {
return "No Support";
} else if (expireDateExpired) {
return getFormattedDate(licenseInfo.expire_date);
} else if (supportEndExpired) {
return getFormattedDate(licenseInfo.support_end);
} else {
return getFormattedDate(licenseInfo.expire_date);
}
}
function createExpireDateElement(displayDate) {
const $ul = $(SELECTORS.containerUl);
const $licenseTypeLi = $ul.find("li:has(.license-type)");
if ($licenseTypeLi.length > 0) {
const $newExpireDateLi = $(`
<li>
<strong>Plugin Updates & Support Validity:</strong>
<span class="validity">${displayDate}</span>
</li>
`);
$licenseTypeLi.after($newExpireDateLi);
}
}
function removeRenewalMessages() {
$(SELECTORS.errorNotice).remove();
}
function handleRenewalMessages(licenseInfo, versionMessage = '') {
const isLicenseExpired = licenseInfo.is_valid === "license_expired";
const isSupportExpired = licenseInfo.is_valid === "support_expired" ||
(licenseInfo.support_end.toLowerCase() === "no support" &&
isDateExpired(licenseInfo.support_end));
if (isLicenseExpired || isSupportExpired) {
updateRenewalMessage(licenseInfo, isLicenseExpired, versionMessage);
} else {
// Remove existing error notices when license is valid
removeRenewalMessages();
}
}
function updateRenewalMessage(licenseInfo, isLicenseExpired, versionMessage = '') {
const renewalMessage = getRenewalMessage(isLicenseExpired, licenseInfo.market, versionMessage);
const $existingLink = $(SELECTORS.errorNotice);
if ($existingLink.length) {
$existingLink.html(renewalMessage);
} else {
$(SELECTORS.errorNotice).remove();
const $renewalNotice = createRenewalNotice(renewalMessage);
$(SELECTORS.deactivateBtn).after($renewalNotice);
}
}
function handleRefreshButtonVisibility(licenseInfo) {
const isValidLicense = licenseInfo.is_valid &&
licenseInfo.is_valid !== "license_expired" &&
licenseInfo.is_valid !== "support_expired" &&
(licenseInfo.support_end.toLowerCase() === "unlimited" ||
!isDateExpired(licenseInfo.support_end));
if (isValidLicense) {
$(SELECTORS.refreshBtn).hide();
}
}
});

View File

@@ -0,0 +1,10 @@
jQuery(document).ready(function($) {
$('tr.active[data-plugin*="autopoly-ai-translation-for-polylang-pro"]').each(function() {
var $currentRow = $(this);
var $nextUpdateRow = $currentRow.nextAll('tr.plugin-update-tr.active.atfpp-pro').first();
if ($nextUpdateRow.length > 0) {
$currentRow.addClass('update');
}
});
});