Update index.html
Browse files- index.html +18 -15
index.html
CHANGED
|
@@ -40,15 +40,15 @@
|
|
| 40 |
<section class="steps">
|
| 41 |
<div class="step">
|
| 42 |
<span class="step-number">1</span>
|
| 43 |
-
<span class="step-text">اضغط لاختيار الملفات
|
| 44 |
</div>
|
| 45 |
<div class="step">
|
| 46 |
<span class="step-number">2</span>
|
| 47 |
-
<span class="step-text">ا
|
| 48 |
</div>
|
| 49 |
<div class="step">
|
| 50 |
<span class="step-number">3</span>
|
| 51 |
-
<span class="step-text">احصل على ملف PDF واحد جاهز للتحميل
|
| 52 |
</div>
|
| 53 |
</section>
|
| 54 |
|
|
@@ -63,7 +63,7 @@
|
|
| 63 |
<strong>دمج عدة ملفات PDF</strong> في ملف واحد،
|
| 64 |
أو
|
| 65 |
<strong>تحويل عدة صور (JPG / PNG)</strong> إلى ملف PDF واحد.
|
| 66 |
-
|
| 67 |
</p>
|
| 68 |
|
| 69 |
<label class="file-picker">
|
|
@@ -107,7 +107,7 @@
|
|
| 107 |
const fileListDiv = document.getElementById("fileList");
|
| 108 |
const outputNameInput = document.getElementById("outputName");
|
| 109 |
|
| 110 |
-
// نخزن جميع الملفات المختارة من عدة م
|
| 111 |
let selectedFiles = [];
|
| 112 |
|
| 113 |
function setStatus(msg, type = "") {
|
|
@@ -167,12 +167,12 @@
|
|
| 167 |
URL.revokeObjectURL(url);
|
| 168 |
}
|
| 169 |
|
| 170 |
-
//
|
| 171 |
filesInput.addEventListener("change", () => {
|
| 172 |
const newFiles = Array.from(filesInput.files || []);
|
| 173 |
if (!newFiles.length) return;
|
| 174 |
|
| 175 |
-
// دمج بدون تكرار (اسم + حجم + تاريخ تعديل)
|
| 176 |
const map = new Map();
|
| 177 |
[...selectedFiles, ...newFiles].forEach(f => {
|
| 178 |
const key = `${f.name}|${f.size}|${f.lastModified}`;
|
|
@@ -185,22 +185,19 @@
|
|
| 185 |
|
| 186 |
renderFileList(selectedFiles);
|
| 187 |
setStatus("");
|
| 188 |
-
|
|
|
|
|
|
|
| 189 |
});
|
| 190 |
|
| 191 |
mergeBtn.addEventListener("click", async () => {
|
| 192 |
-
|
| 193 |
|
| 194 |
if (!files.length) {
|
| 195 |
setStatus("الرجاء اختيار الملفات أولاً.", "error");
|
| 196 |
return;
|
| 197 |
}
|
| 198 |
|
| 199 |
-
files.sort((a, b) =>
|
| 200 |
-
a.name.localeCompare(b.name, undefined, { numeric: true })
|
| 201 |
-
);
|
| 202 |
-
renderFileList(files);
|
| 203 |
-
|
| 204 |
const mode = detectMode(files);
|
| 205 |
if (!mode) {
|
| 206 |
setStatus(
|
|
@@ -210,6 +207,12 @@
|
|
| 210 |
return;
|
| 211 |
}
|
| 212 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 213 |
try {
|
| 214 |
setStatus("جاري معالجة الملفات...", "loading");
|
| 215 |
mergeBtn.disabled = true;
|
|
@@ -278,7 +281,7 @@
|
|
| 278 |
setStatus("تم دمج ملفات PDF بنجاح.", "ok");
|
| 279 |
}
|
| 280 |
|
| 281 |
-
//
|
| 282 |
selectedFiles = [];
|
| 283 |
renderFileList([]);
|
| 284 |
} catch (err) {
|
|
|
|
| 40 |
<section class="steps">
|
| 41 |
<div class="step">
|
| 42 |
<span class="step-number">1</span>
|
| 43 |
+
<span class="step-text">اضغط لاختيار الملفات، ويمكن الإضافة على دفعات.</span>
|
| 44 |
</div>
|
| 45 |
<div class="step">
|
| 46 |
<span class="step-number">2</span>
|
| 47 |
+
<span class="step-text">استخدم إما صورًا فقط أو ملفات PDF فقط في كل عملية.</span>
|
| 48 |
</div>
|
| 49 |
<div class="step">
|
| 50 |
<span class="step-number">3</span>
|
| 51 |
+
<span class="step-text">احصل على ملف PDF واحد جاهز للتحميل.</span>
|
| 52 |
</div>
|
| 53 |
</section>
|
| 54 |
|
|
|
|
| 63 |
<strong>دمج عدة ملفات PDF</strong> في ملف واحد،
|
| 64 |
أو
|
| 65 |
<strong>تحويل عدة صور (JPG / PNG)</strong> إلى ملف PDF واحد.
|
| 66 |
+
لا تخلط بين الصور وملفات PDF في نفس العملية.
|
| 67 |
</p>
|
| 68 |
|
| 69 |
<label class="file-picker">
|
|
|
|
| 107 |
const fileListDiv = document.getElementById("fileList");
|
| 108 |
const outputNameInput = document.getElementById("outputName");
|
| 109 |
|
| 110 |
+
// نخزن جميع الملفات المختارة من عدة محاولات اختيار
|
| 111 |
let selectedFiles = [];
|
| 112 |
|
| 113 |
function setStatus(msg, type = "") {
|
|
|
|
| 167 |
URL.revokeObjectURL(url);
|
| 168 |
}
|
| 169 |
|
| 170 |
+
// إضافة ملفات على دفعات (مفيد للجوال)
|
| 171 |
filesInput.addEventListener("change", () => {
|
| 172 |
const newFiles = Array.from(filesInput.files || []);
|
| 173 |
if (!newFiles.length) return;
|
| 174 |
|
| 175 |
+
// دمج بدون تكرار (اسم + حجم + تاريخ التعديل)
|
| 176 |
const map = new Map();
|
| 177 |
[...selectedFiles, ...newFiles].forEach(f => {
|
| 178 |
const key = `${f.name}|${f.size}|${f.lastModified}`;
|
|
|
|
| 185 |
|
| 186 |
renderFileList(selectedFiles);
|
| 187 |
setStatus("");
|
| 188 |
+
|
| 189 |
+
// إفراغ input حتى نسمح باختيار دفعة جديدة
|
| 190 |
+
filesInput.value = "";
|
| 191 |
});
|
| 192 |
|
| 193 |
mergeBtn.addEventListener("click", async () => {
|
| 194 |
+
const files = [...selectedFiles];
|
| 195 |
|
| 196 |
if (!files.length) {
|
| 197 |
setStatus("الرجاء اختيار الملفات أولاً.", "error");
|
| 198 |
return;
|
| 199 |
}
|
| 200 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 201 |
const mode = detectMode(files);
|
| 202 |
if (!mode) {
|
| 203 |
setStatus(
|
|
|
|
| 207 |
return;
|
| 208 |
}
|
| 209 |
|
| 210 |
+
// ترتيب نهائي حسب الاسم
|
| 211 |
+
files.sort((a, b) =>
|
| 212 |
+
a.name.localeCompare(b.name, undefined, { numeric: true })
|
| 213 |
+
);
|
| 214 |
+
renderFileList(files);
|
| 215 |
+
|
| 216 |
try {
|
| 217 |
setStatus("جاري معالجة الملفات...", "loading");
|
| 218 |
mergeBtn.disabled = true;
|
|
|
|
| 281 |
setStatus("تم دمج ملفات PDF بنجاح.", "ok");
|
| 282 |
}
|
| 283 |
|
| 284 |
+
// بعد الانتهاء: تنظيف
|
| 285 |
selectedFiles = [];
|
| 286 |
renderFileList([]);
|
| 287 |
} catch (err) {
|