/** * שכבות ארציות משותפות — DXF שיושב בשרת ונטען אוטומטית אצל כל * המשתמשים, בלי שיצטרכו להוסיף אותו ידנית. * * השרת מגיש layers/index.json במבנה: * [{ "file": "layers/national.dxf", "name": "פריסה ארצית", "version": "2026-07-05" }] * הקובץ מפוענח פעם אחת ונשמר ב-IndexedDB; גרסה חדשה ב-index.json * גוררת הורדה ופענוח מחדש. העדפות המשתמש (מוצג/מוסתר, שקיפות, * תתי-שכבות) נשמרות בין גרסאות. בלי אינטרנט — עובדים מהעותק השמור. */ (function (global) { "use strict"; function slug(name) { return "shared_" + name.replace(/[^\w֐-׿]+/g, "_"); } /** * מסנכרן את השכבות המשותפות מול השרת. * @param {Array} existing רשומות קיימות מ-IndexedDB * @returns {Promise<{records: Array, removedIds: string[]}>} * records — רשומות השכבות המשותפות העדכניות (חדשות או קיימות); * removedIds — שכבות משותפות שכבר לא ב-index (להסרה). */ function sync(existing) { var existingShared = {}; (existing || []).forEach(function (f) { if (f.shared) existingShared[f.id] = f; }); return fetch("layers/index.json", { cache: "no-store" }) .then(function (r) { return r.ok ? r.json() : []; }) .catch(function () { return null; }) // אין רשת — נשארים עם העותק השמור .then(function (index) { if (index === null) { return { records: Object.keys(existingShared).map(function (k) { return existingShared[k]; }), removedIds: [] }; } if (!Array.isArray(index)) index = []; var wantedIds = {}; var work = Promise.resolve(); var records = []; index.forEach(function (entry) { if (!entry || !entry.file || !entry.name) return; var id = slug(entry.name); wantedIds[id] = true; var current = existingShared[id]; if (current && current.version === String(entry.version || "")) { records.push(current); return; } work = work.then(function () { return fetch(entry.file, { cache: "no-store" }) .then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.arrayBuffer(); }) .then(function (buf) { return global.DXF.parseAsync(buf); }) .then(function (parsed) { parsed = global.Geo.sanitizeParsed(parsed); var rec = { id: id, shared: true, version: String(entry.version || ""), name: entry.name, addedAt: new Date().toISOString(), entities: parsed.entities, bbox: parsed.bbox, coordSys: parsed.coordSys, calibration: null, // שמירת העדפות המשתמש מהגרסה הקודמת opacity: current ? current.opacity : 1, weight: current ? current.weight : 2, visible: current ? current.visible : true, hiddenLayers: current ? current.hiddenLayers : [], }; records.push(rec); return global.Store.saveFile(rec); }) .catch(function () { // הורדה/פענוח נכשלו — אם יש גרסה ישנה שמורה, ממשיכים איתה if (current) records.push(current); }); }); }); return work.then(function () { var removedIds = Object.keys(existingShared).filter(function (id) { return !wantedIds[id]; }); return { records: records, removedIds: removedIds }; }); }); } global.SharedLayers = { sync: sync }; })(window);