Отображение и редактирование файлов модуля ГитЖС | Display and editing of GitJS module files
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

511 lines
14KB

  1. /*
  2. * ВЫБОР ФАЙЛА
  3. */
  4. /*
  5. ЗадатьУказанныйФайл = function(мир)
  6. {
  7. мир.файл = мир.файлы[мир.номерВыбранногоФайла];
  8. };
  9. // // // //
  10. НеОтслеживатьРедактирование = function(мир)
  11. {
  12. мир.отслеживатьРедактирование = false;
  13. };
  14. // // // //
  15. ОтслеживатьРедактирование = function(мир)
  16. {
  17. мир.отслеживатьРедактирование = true;
  18. };
  19. // // // //
  20. ЗадатьПараметрФайла = function(мир)
  21. {
  22. var файл = мир.файлы[мир.номерВыбранногоФайла];
  23. задатьПараметрВСтрокеПоиска("📁", файл);
  24. };
  25. // // // //
  26. ОтобразитьСодержимоеВыбранногоФайла = function(мир)
  27. {
  28. var файл = мир.файлы[мир.номерВыбранногоФайла];
  29. var содержимое = мир.временноеСодержимое[файл];
  30. if (!содержимое)
  31. {
  32. содержимое = мир.редактируемыйМодуль.содержимое[файл];
  33. };
  34. мир.редактор.session.setValue(содержимое);
  35. };
  36. // // // //
  37. ОтобразитьВыборФайла = function(мир)
  38. {
  39. var id = мир.макет.константы.файл;
  40. // Очищаем выбор.
  41. for (var номер in мир.файлы)
  42. {
  43. $(`#${id}-${номер}-элемент`).removeClass("uk-active");
  44. }
  45. // Отображаем выбор.
  46. $(`#${id}-${мир.номерВыбранногоФайла}-элемент`).addClass("uk-active");
  47. };
  48. */
  49. /*
  50. * ПУСК
  51. */
  52. /*
  53. const ИМЯ = "Главред | Glavred";
  54. // // // //
  55. ЗадатьВременноеСодержимое = function(мир)
  56. {
  57. мир.временноеСодержимое = {};
  58. };
  59. // // // //
  60. ЗадатьКнопкуСохранения = function(мир)
  61. {
  62. var кнопка = мир.макет.элементы.действие
  63. .replace("${название}", "💾")
  64. .replace(/\$\{id\}/g, `${мир.макет.константы.сохранить}`)
  65. ;
  66. $(`#${мир.макет.константы.действия}`).append(кнопка);
  67. $(`#${мир.макет.константы.сохранить}-ссылка`).click(function() {
  68. мир.уведомить("выбрали сохранить");
  69. });
  70. };
  71. // // // //
  72. НастроитьОтслеживаниеРедактирования = function(мир)
  73. {
  74. мир.отслеживатьРедактирование = true;
  75. мир.редактор.session.on("change", function(delta) {
  76. if (мир.отслеживатьРедактирование)
  77. {
  78. мир.уведомить("редактирование");
  79. }
  80. });
  81. };
  82. // // // //
  83. ВыбратьУказанныйФайл = function(мир)
  84. {
  85. мир.номерВыбранногоФайла = мир.файлы.indexOf(мир.файл);
  86. мир.уведомить("выбрали файл");
  87. }
  88. // // // //
  89. ВыбратьПервыйФайл = function(мир)
  90. {
  91. мир.номерВыбранногоФайла = 0;
  92. мир.уведомить("выбрали файл");
  93. }
  94. // // // //
  95. ПроверитьНаличиеУказанногоФайла = function(мир)
  96. {
  97. if (
  98. мир.файл &&
  99. мир.файлы.includes(мир.файл)
  100. ) {
  101. мир.уведомить("указанный файл существует");
  102. }
  103. else
  104. {
  105. мир.уведомить("указанный файл не существует");
  106. }
  107. };
  108. // // // //
  109. НастроитьAce = function(мир)
  110. {
  111. мир.редактор = window.ace.edit("редактор");
  112. мир.редактор.session.setMode("ace/mode/javascript");
  113. };
  114. // // // //
  115. ОтслеживатьВыборФайла = function(мир)
  116. {
  117. var id = мир.макет.константы.файл;
  118. for (var номер in мир.файлы)
  119. {
  120. const номерФайла = номер;
  121. $(`#${id}-${номер}-ссылка`).click(function() {
  122. мир.номерВыбранногоФайла = номерФайла;
  123. мир.уведомить("выбрали файл");
  124. });
  125. }
  126. };
  127. // // // //
  128. ЗадатьСписокФайлов = function(мир)
  129. {
  130. var м = мир.редактируемыйМодуль;
  131. мир.файлы = Object.keys(м.структура).sort();
  132. var содержимое = "";
  133. var заголовок = мир.макет.элементы.заголовокМеню.replace("${название}", "📦 " + м.имя);
  134. содержимое += заголовок;
  135. var id = мир.макет.константы.файл;
  136. for (var номер in мир.файлы)
  137. {
  138. var файл = мир.файлы[номер];
  139. содержимое += мир.макет.элементы.пунктМеню
  140. .replace("${название}", файл)
  141. .replace(/\$\{id\}/g, `${id}-${номер}`)
  142. ;
  143. }
  144. $(`#${мир.макет.константы.меню}`).html(содержимое);
  145. };
  146. // // // //
  147. УведомитьОбОшибкеЗагрузкиСодержимогоРедактируемогоМодуля = function(мир)
  148. {
  149. var сообщение = "ОШИБКА Не удалось загрузить редактируемый модуль из хранилища бразуера | ERROR The module to be edited couldn't be loaded from the browser's storage";
  150. console.error(сообщение);
  151. console.error(мир.указатель);
  152. $(`#${мир.макет.константы.содержимое}`).html(`
  153. <div class="ошибка">
  154. <p>${сообщение}</p>
  155. <p>${мир.указатель}</p>
  156. </div>
  157. `);
  158. };
  159. // // // //
  160. ЗагрузитьСодержимоеРедактируемогоМодуля = function(мир)
  161. {
  162. // Пропускаем загрузку, если содержимое уже присутствует.
  163. if (мир.редактируемыйМодуль.содержимое)
  164. {
  165. мир.уведомить("загрузили содержимое");
  166. return;
  167. }
  168. // Загружаем содержимое.
  169. мир.модули.загрузилиСодержимоеСохранённогоМодуля.подписатьРаз(function() {
  170. мир.уведомить("загрузили содержимое");
  171. });
  172. мир.модули.неЗагрузилиСодержимоеСохранённогоМодуля.подписатьРаз(function() {
  173. мир.уведомить("не загрузили содержимое");
  174. });
  175. мир.модули.загрузитьСодержимоеСохранённогоМодуля(мир.указатель);
  176. };
  177. // // // //
  178. ПродолжитьЗагрузку = мир =>
  179. {
  180. мир.уведомить("загрузили содержимое");
  181. };
  182. // // // //
  183. ЗадатьПараметрМодуляРедактором = function(мир)
  184. {
  185. задатьПараметрВСтрокеПоиска("📦", мир.редактируемыйМодуль.указатель);
  186. };
  187. // // // //
  188. НазначитьРедактируемымМодульРедактора = function(мир)
  189. {
  190. мир.редактируемыйМодуль = мир.модули.модульПоИмени(ИМЯ);
  191. };
  192. // // // //
  193. ПроверитьНаличиеРедактируемогоМодуля = function(мир)
  194. {
  195. мир.редактируемыйМодуль = мир.модули.модульПоУказателю(мир.указатель);
  196. if (мир.редактируемыйМодуль)
  197. {
  198. мир.уведомить("редактируемый модуль существует");
  199. }
  200. else
  201. {
  202. мир.уведомить("редактируемый модуль не существует");
  203. }
  204. };
  205. // // // //
  206. ЗадатьЗаголовокИВерсию = function(мир)
  207. {
  208. var м = мир.ведущийМодуль;
  209. $(`#${мир.макет.константы.заголовок}`).text(м.имя);
  210. $(`#${мир.макет.константы.версия}`).text(м.версия);
  211. };
  212. // // // //
  213. ОчиститьМакетОтЗаглушек = function(мир)
  214. {
  215. $(`#${мир.макет.константы.заголовок}`).text("");
  216. $(`#${мир.макет.константы.версия}`).text("");
  217. $(`#${мир.макет.константы.действия}`).text("");
  218. $(`#${мир.макет.константы.меню}`).text("");
  219. };
  220. // // // //
  221. УстановитьМакет = function(мир)
  222. {
  223. document.body.innerHTML = мир.макет.структура;
  224. var вид = document.createElement("style");
  225. document.head.appendChild(вид);
  226. вид.innerHTML = мир.макет.вид;
  227. };
  228. // // // //
  229. НастроитьМакет = function(мир)
  230. {
  231. // Вырезаем тело из макета.
  232. var html = мир.макет.структура;
  233. var начало = html.indexOf("<!-- МАКЕТ_НАЧАЛО -->");
  234. var конец = html.indexOf("<!-- МАКЕТ_КОНЕЦ -->");
  235. html = html.substring(начало, конец);
  236. var название = "редактор";
  237. мир.макет.константы = {
  238. "заголовок": `${название}-макет-шапка-заголовок`,
  239. "версия": `${название}-макет-шапка-версия`,
  240. "действия": `${название}-макет-шапка-действия`,
  241. "меню": `${название}-макет-меню`,
  242. "файл": `${название}-макет-меню-файл`,
  243. "содержимое": "редактор",
  244. "сохранить": `${название}-макет-сохранить`,
  245. };
  246. // Заменяем константы в макете.
  247. for (var константа in мир.макет.константы)
  248. {
  249. var старое = "${" + константа + "}";
  250. var новое = мир.макет.константы[константа];
  251. html = html.replace(старое, новое);
  252. }
  253. мир.макет.структура = html;
  254. };
  255. // // // //
  256. ЗагрузитьМакет = function(мир)
  257. {
  258. var м = мир.ведущийМодуль;
  259. var json = JSON.parse(м.содержимое["/макет|template.json"]);
  260. мир.макет = {
  261. "структура": м.содержимое["/макет|template.html"],
  262. "вид": м.содержимое["/макет|template.css"],
  263. "элементы": json,
  264. };
  265. };
  266. // // // //
  267. ЗадатьВедущийМодуль = function(мир)
  268. {
  269. // Редактор является ведущим модулем.
  270. мир.ведущийМодуль = мир.модули.модульПоИмени(ИМЯ);
  271. };
  272. // // // //
  273. РазобратьПараметры = function(мир)
  274. {
  275. мир.указатель = null;
  276. мир.файл = null;
  277. var параметры = new URLSearchParams(window.location.search);
  278. for (var имя of параметры.keys())
  279. {
  280. var значение = decodeURI(параметры.get(имя));
  281. var имя = decodeURI(имя);
  282. if (имя == "📦")
  283. {
  284. мир.указатель = значение;
  285. }
  286. else if (имя == "📁")
  287. {
  288. мир.файл = значение;
  289. }
  290. }
  291. };
  292. // // // //
  293. ВывестиРазобранныеПараметры = function(мир)
  294. {
  295. console.debug(`
  296. Разобранные параметры редактора:
  297. * 📦: '${мир.указатель}'
  298. * 📁: '${мир.файл}'
  299. `);
  300. };
  301. */
  302. /*
  303. * РЕДАКТИРОВАНИЕ
  304. */
  305. /*
  306. СохранитьВременноеСодержимоеРедактируемогоФайла = function(мир)
  307. {
  308. var файл = мир.файлы[мир.номерВыбранногоФайла];
  309. var содержимое = мир.редактор.session.getValue();
  310. мир.временноеСодержимое[файл] = содержимое;
  311. };
  312. // // // //
  313. ПометитьВыбранныйФайлКакИзменённый = function(мир)
  314. {
  315. $(`#${мир.макет.константы.файл}-${мир.номерВыбранногоФайла}-изменение`).removeAttr("hidden");
  316. };
  317. // // // //
  318. ВывестиРедактирование = function(мир)
  319. {
  320. console.debug("Редактирование");
  321. };
  322. */
  323. /*
  324. * СОХРАНЕНИЕ
  325. */
  326. /*
  327. УведомитьОНеудачномСохраненииИзменений = function(мир)
  328. {
  329. UIkit.notification("Не удалось сохранить изменения", {status: "danger"});
  330. UIkit.notification("Could not save changes", {status: "danger"});
  331. };
  332. // // // //
  333. УведомитьОбУспешномСохраненииИзменений = function(мир)
  334. {
  335. UIkit.notification("Сохранили успешно", {status: "success"});
  336. UIkit.notification("Saved successfully", {status: "success"});
  337. };
  338. // // // //
  339. СохранитьИзменения = function(мир)
  340. {
  341. for (var файл in мир.временноеСодержимое)
  342. {
  343. var содержимое = мир.временноеСодержимое[файл];
  344. мир.редактируемыйМодуль.содержимое[файл] = содержимое;
  345. }
  346. мир.временноеСодержимое = {};
  347. мир.модули.сохранили.подписатьРаз(function() {
  348. мир.уведомить("сохранили изменения");
  349. });
  350. мир.модули.неСохранили.подписатьРаз(function() {
  351. мир.уведомить("не сохранили изменения");
  352. });
  353. мир.модули.сохранить(мир.редактируемыйМодуль.указатель);
  354. };
  355. */