PluginProbe
ووسلام – همگام سازی ووکامرس و باسلام / 1.10.19
ووسلام – همگام سازی ووکامرس و باسلام v1.10.19
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 1.8.5 1.8.6 All 53 releases
sync-basalam / assets / js / round.js

round.js in ووسلام – همگام سازی ووکامرس و باسلام 1.10.19, at assets/js/round.js

190 lines 5.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 document.addEventListener("DOMContentLoaded", function () {
2 const COMMISSION_VALUE = "commission";
3 // Range in which a value is read as a percentage; outside it the value is a fixed Toman amount
4 const PERCENT_RANGE_MIN = -100;
5 const PERCENT_RANGE_MAX = 100;
6 // Maximum allowed increase and decrease percentage
7 const MAX_PERCENT = 35;
8 const MIN_PERCENT = -35;
9
10 // Parses the raw input text into an integer, keeping a leading minus sign
11 const parseValue = function (rawText) {
12 const isNegative = /^\s*-/.test(rawText);
13 const digits = rawText.replace(/[^\d]/g, "");
14
15 if (digits === "") {
16 return { raw: isNegative ? "-" : "", value: 0, empty: true };
17 }
18
19 const value = (isNegative ? -1 : 1) * parseInt(digits, 10);
20
21 return { raw: digits, value: value, empty: false };
22 };
23
24 const formatValue = function (value) {
25 return value.toLocaleString("en-US");
26 };
27
28 const isPercent = function (value) {
29 return value >= PERCENT_RANGE_MIN && value <= PERCENT_RANGE_MAX;
30 };
31
32 const groups = document.querySelectorAll(
33 ".basalam-form-group, .basalam-form-group-full"
34 );
35
36 groups.forEach(function (group) {
37 const checkbox = group.querySelector(".toggle-percentage");
38 if (!checkbox) {
39 return;
40 }
41
42 const input =
43 group.querySelector('[data-role="price-change-input"]') ||
44 group.querySelector(
45 'input.percentage-input[type="text"][name="sync_basalam_settings[price_change_value]"]'
46 );
47 const unit = group.querySelector(".percentage-unit");
48 const hiddenInput =
49 group.querySelector('[data-role="price-change-hidden"]') ||
50 group.querySelector(
51 'input[type="hidden"][name="sync_basalam_settings[price_change_value]"]'
52 );
53
54 if (!input || !unit || !hiddenInput) {
55 return;
56 }
57
58 const normalizeInput = function () {
59 const parsed = parseValue(input.value);
60
61 if (parsed.empty) {
62 input.value = parsed.raw;
63 unit.textContent = "درصد";
64
65 return "";
66 }
67
68 input.value = formatValue(parsed.value);
69 unit.textContent = isPercent(parsed.value) ? "درصد" : "تو�
70 ان";
71
72 return String(parsed.value);
73 };
74
75 const updateHiddenValue = function (value) {
76 if (hiddenInput.value === String(value)) {
77 return;
78 }
79
80 hiddenInput.value = String(value);
81 hiddenInput.dispatchEvent(new Event("input", { bubbles: true }));
82 hiddenInput.dispatchEvent(new Event("change", { bubbles: true }));
83 };
84
85 const syncHiddenInput = function () {
86 if (checkbox.checked) {
87 updateHiddenValue(COMMISSION_VALUE);
88 return;
89 }
90
91 updateHiddenValue(normalizeInput());
92 };
93
94 input.disabled = checkbox.checked;
95 syncHiddenInput();
96
97 input.addEventListener("input", function () {
98 if (!checkbox.checked) {
99 syncHiddenInput();
100 }
101 });
102
103 checkbox.addEventListener("change", function () {
104 input.disabled = checkbox.checked;
105
106 if (checkbox.checked) {
107 input.value = "";
108 updateHiddenValue(COMMISSION_VALUE);
109 unit.textContent = "درصد";
110 return;
111 }
112
113 syncHiddenInput();
114 });
115
116 const form = group.closest("form");
117 if (form && !form.dataset.priceChangeBound) {
118 form.addEventListener("submit", function () {
119 const toggles = form.querySelectorAll(".toggle-percentage");
120 let clampedNotice = false;
121
122 toggles.forEach(function (toggle) {
123 const toggleGroup =
124 toggle.closest(".basalam-form-group") ||
125 toggle.closest(".basalam-form-group-full");
126
127 if (!toggleGroup) {
128 return;
129 }
130
131 const toggleInput =
132 toggleGroup.querySelector('[data-role="price-change-input"]') ||
133 toggleGroup.querySelector(
134 'input.percentage-input[type="text"][name="sync_basalam_settings[price_change_value]"]'
135 );
136 const toggleHidden =
137 toggleGroup.querySelector('[data-role="price-change-hidden"]') ||
138 toggleGroup.querySelector(
139 'input[type="hidden"][name="sync_basalam_settings[price_change_value]"]'
140 );
141
142 if (!toggleInput || !toggleHidden) {
143 return;
144 }
145
146 if (toggle.checked) {
147 toggleHidden.value = COMMISSION_VALUE;
148 return;
149 }
150
151 const parsed = parseValue(toggleInput.value);
152
153 if (parsed.empty) {
154 toggleHidden.value = "";
155 return;
156 }
157
158 let numberValue = parsed.value;
159
160 if (isPercent(numberValue) && (numberValue > MAX_PERCENT || numberValue < MIN_PERCENT)) {
161 clampedNotice = true;
162 numberValue = numberValue > MAX_PERCENT ? MAX_PERCENT : MIN_PERCENT;
163 toggleInput.value = formatValue(numberValue);
164 const unitEl = toggleGroup.querySelector(".percentage-unit");
165 if (unitEl) {
166 unitEl.textContent = "درصد";
167 }
168 }
169
170 toggleHidden.value = String(numberValue);
171 });
172
173 if (clampedNotice) {
174 BasalamToast.info(
175 "�
176 قدار تغییر قی�
177 ت در حالت درصد ن�
178 ی‌تواند بیشتر از ۳۵٪ افزایش یا ۳۵٪ کاهش باشد. �
179 قدار وارد شده به سقف �
180 جاز تغییر داده شد و ذخیره �
181 یشود."
182 );
183 }
184 });
185
186 form.dataset.priceChangeBound = "1";
187 }
188 });
189 });
190