PluginProbe
ووسلام – همگام سازی ووکامرس و باسلام / 1.10.22
ووسلام – همگام سازی ووکامرس و باسلام v1.10.22
1.10.22 1.10.21 1.10.19 1.10.20 1.10.18 1.10.17 1.10.15 1.10.14 1.10.13 1.10.12 1.10.10 1.10.9 1.10.8 1.10.7 1.10.6 1.10.5 1.10.4 1.10.3 1.10.2 1.10.1 1.10.0 1.9.2 1.9.1 1.9.0 1.8.8 All 55 releases
← All changes | assets/js/admin.js +104 -16 1.10.1 → 1.10.22 View file →
@@ -22,9 +22,62 @@
22 22 action: "connect_products_with_basalam",
23 23 },
24 24 ];
25 25
26 + const updateModal = document.getElementById("BasalamUpdateProductsModal");
27 + let updateStatusPoller = null;
28 + let updateStatusInFlight = false;
29 +
30 + const showUpdatePanel = (panelId) => {
31 + ["update-status-loading", "update-status-error", "update-type-selection", "quick-update-in-progress", "active-jobs-info"].forEach((id) => {
32 + const panel = document.getElementById(id);
33 + if (panel) panel.hidden = id !== panelId;
34 + });
35 + };
36 +
37 + const refreshUpdateStatus = () => {
38 + if (!updateModal || !document.getElementById("update-type-selection") || updateStatusInFlight) return;
39 +
40 + updateStatusInFlight = true;
41 + const formData = new FormData();
42 + formData.append("action", "get_update_queue_status");
43 + formData.append("_wpnonce", updateModal.dataset.statusNonce || "");
44 +
45 + return fetch(ajaxurl, { method: "POST", body: formData, cache: "no-store" })
46 + .then((response) => response.json())
47 + .then((response) => {
48 + if (!response.success || !response.data) throw new Error("Update status unavailable");
49 +
50 + const status = response.data;
51 + if (!status.active) {
52 + showUpdatePanel("update-type-selection");
53 + } else if (status.type === "quick") {
54 + const badge = document.getElementById("quick-update-status");
55 + if (badge) badge.textContent = status.status === "processing" ? "در حال پردازش" : "در انتظار";
56 + showUpdatePanel("quick-update-in-progress");
57 + } else {
58 + const count = Number(status.count) || 0;
59 + const countRow = document.getElementById("update-queue-count-row");
60 + const countBadge = document.getElementById("update-queue-count");
61 + if (countRow) countRow.hidden = count === 0;
62 + if (countBadge) countBadge.textContent = `${count} محصول`;
63 + showUpdatePanel("active-jobs-info");
64 + }
65 + })
66 + .catch((error) => {
67 + console.error("Error fetching product update status:", error);
68 + showUpdatePanel("update-status-error");
69 + })
70 + .finally(() => {
71 + updateStatusInFlight = false;
72 + });
73 + };
74 +
26 75 const closeModal = () => {
76 + if (updateStatusPoller) {
77 + clearInterval(updateStatusPoller);
78 + updateStatusPoller = null;
79 + }
27 80 document.querySelectorAll(".basalam-modal").forEach((modal) => {
28 81 modal.style.display = "none";
29 82 });
30 83 document.body.style.overflow = "auto";
@@ -40,15 +93,14 @@
40 93 modal.style.display = "block";
41 94 document.body.style.overflow = "hidden";
42 95
43 96 if (modalId === "BasalamUpdateProductsModal") {
44 - const selectionDiv = document.getElementById("update-type-selection");
45 - const quickConfirm = document.getElementById("quick-update-confirm");
46 - const fullConfirm = document.getElementById("full-update-confirm");
47 -
48 - if (selectionDiv) selectionDiv.style.display = "block";
49 - if (quickConfirm) quickConfirm.style.display = "none";
50 - if (fullConfirm) fullConfirm.style.display = "none";
97 + if (document.getElementById("update-type-selection")) {
98 + showUpdatePanel("update-status-loading");
99 + refreshUpdateStatus();
100 + if (updateStatusPoller) clearInterval(updateStatusPoller);
101 + updateStatusPoller = setInterval(refreshUpdateStatus, 5000);
102 + }
51 103 }
52 104 });
53 105 }
54 106
@@ -77,8 +129,13 @@
77 129 });
78 130 }
79 131 });
80 132
133 + document.getElementById("update-status-retry")?.addEventListener("click", () => {
134 + showUpdatePanel("update-status-loading");
135 + refreshUpdateStatus();
136 + });
137 +
81 138 setTimeout(() => {
82 139 const quickUpdateBtn = document.getElementById("quick-update-btn");
83 140 const fullUpdateBtn = document.getElementById("full-update-btn");
84 141
@@ -208,14 +265,45 @@
208 265 });
209 266
210 267 const select = document.getElementById("basalam-sync-type");
211 268 if (select) {
269 + const customFields = document.getElementById("Basalam-custom-fields");
270 + const settingsForm = select.closest("form");
271 + const validationMessage =
272 + "در حالت سفارشی باید حداقل یک فیلد را برای بروزرسانی انتخاب کنید.";
273 +
212 274 const toggleFields = (val) => {
213 - document.getElementById("Basalam-custom-fields").style.display =
214 - val === "custom" ? "block" : "none";
275 + if (customFields) {
276 + customFields.style.display = val === "custom" ? "block" : "none";
277 + }
215 278 };
279 +
280 + const hasSelectedCustomField = () =>
281 + customFields &&
282 + Array.from(
283 + customFields.querySelectorAll('input[type="checkbox"]')
284 + ).some((checkbox) => checkbox.checked);
285 +
216 286 toggleFields(select.value);
217 287 select.addEventListener("change", (e) => toggleFields(e.target.value));
288 +
289 + if (settingsForm) {
290 + settingsForm.addEventListener("submit", (event) => {
291 + if (select.value !== "custom" || hasSelectedCustomField()) return;
292 +
293 + event.preventDefault();
294 + event.stopImmediatePropagation();
295 +
296 + if (window.BasalamToast) {
297 + window.BasalamToast.error(validationMessage);
298 + }
299 +
300 + if (customFields) {
301 + customFields.scrollIntoView({ behavior: "smooth", block: "center" });
302 + customFields.querySelector('input[type="checkbox"]')?.focus();
303 + }
304 + }, true);
305 + }
218 306 }
219 307
220 308 // Tab functionality for settings modal
221 309 const initTabs = () => {
@@ -867,15 +955,15 @@
867 955 }
868 956 });
869 957 };
870 958
871 - const syncIncreaseVisibility = () => {
959 + const syncPriceChangeVisibility = () => {
872 960 document
873 - .querySelectorAll('select[name="sync_basalam_bulk_increase_action"]')
961 + .querySelectorAll('select[name="sync_basalam_bulk_price_change_action"]')
874 962 .forEach((select) => {
875 963 const field = select
876 964 .closest(".sync-basalam-bulk-edit")
877 - ?.querySelector(".sync-basalam-bulk-increase-value");
965 + ?.querySelector(".sync-basalam-bulk-price-change-value");
878 966
879 967 if (field) {
880 968 field.style.display = select.value === "set" ? "block" : "none";
881 969 }
@@ -905,9 +993,9 @@
905 993
906 994 window.requestAnimationFrame(() => {
907 995 setBulkEditMode("basalam");
908 996 syncTypeVisibility();
909 - syncIncreaseVisibility();
997 + syncPriceChangeVisibility();
910 998 });
911 999 };
912 1000
913 1001 document.addEventListener("change", (event) => {
@@ -919,10 +1007,10 @@
919 1007 if (target.name === "sync_basalam_bulk_product_type_action") {
920 1008 syncTypeVisibility();
921 1009 }
922 1010
923 - if (target.name === "sync_basalam_bulk_increase_action") {
924 - syncIncreaseVisibility();
1011 + if (target.name === "sync_basalam_bulk_price_change_action") {
1012 + syncPriceChangeVisibility();
925 1013 }
926 1014 });
927 1015
928 1016 document.addEventListener("click", (event) => {
@@ -967,9 +1055,9 @@
967 1055
968 1056 setBulkEditMode("default");
969 1057
970 1058 syncTypeVisibility();
971 - syncIncreaseVisibility();
1059 + syncPriceChangeVisibility();
972 1060 };
973 1061
974 1062 initBulkEditFields();
975 1063