Pictures!
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. (function() {
  2. window.setView = setView;
  3. var root = $$("#root");
  4. var views = {
  5. login: viewLogin,
  6. main: viewMain,
  7. edit: viewEdit
  8. }
  9. function setView(name, args) {
  10. if (args)
  11. location.hash = name+"/"+args.join("/");
  12. else
  13. location.hash = name+"/";
  14. }
  15. function viewLogin(root) {
  16. function login(first) {
  17. var pass;
  18. do {
  19. if (first)
  20. pass = prompt("Password?");
  21. else
  22. pass = prompt("Incorrect password.");
  23. } while (!pass);
  24. apiLogin(pass, success => {
  25. if (success)
  26. setView("main");
  27. else
  28. login(false);
  29. });
  30. }
  31. login(true);
  32. }
  33. function viewMain(root) {
  34. // Get a list of the slides
  35. api("list_slides", {}, (err, slides) => {
  36. if (err)
  37. return error(err);
  38. slides.forEach(function(s) {
  39. // Create a div for each slide
  40. var el = elem("a", {
  41. className: "slide",
  42. href: "#edit/"+s
  43. }, [
  44. elem("div", {
  45. className: "name",
  46. innerText: s
  47. }),
  48. elem("iframe", {
  49. className: "preview",
  50. src: "/"+s+"/"
  51. }),
  52. elem("div", {
  53. className: "overlay"
  54. })
  55. ]).appendTo(root);
  56. // Add 'disabled' to the class if it's disabled
  57. api("slide_meta", { slide: s }, (err, res) => {
  58. if (err)
  59. return error(err);
  60. if (res.disabled)
  61. el.addClass("disabled");
  62. });
  63. });
  64. });
  65. }
  66. function viewEdit(root, slide) {
  67. if (!slide) {
  68. error("No slide provided.");
  69. setView("main");
  70. return;
  71. }
  72. var fileListEl;
  73. var htmlTextEl;
  74. var previewEl;
  75. function populateFileList() {
  76. api("slide_file_list", { slide: slide }, (err, res) => {
  77. fileListEl.clear();
  78. if (err)
  79. return error(err);
  80. res.files.forEach(f => {
  81. elem("div", { className: "file" }, [
  82. elem("span", {
  83. className: "name",
  84. innerText: f
  85. }),
  86. elem("span", { className: "controls" }, [
  87. elem("button", {
  88. className: "rename",
  89. innerText: "Rename"
  90. }).on("click", () => {
  91. var nwname = prompt("New name?", f);
  92. if (!nwname)
  93. return;
  94. api("slide_file_rename", {
  95. slide: slide,
  96. from: f,
  97. to: nwname
  98. }, populateFileList);
  99. }),
  100. elem("button", {
  101. className: "delete",
  102. innerText: "Delete"
  103. }).on("click", () => {
  104. if (!confirm("Are you sure you want to delete "+f+"?"))
  105. return;
  106. api("slide_file_delete", {
  107. slide: slide,
  108. file: f
  109. }, populateFileList);
  110. })
  111. ])
  112. ]).appendTo(fileListEl);
  113. });
  114. });
  115. }
  116. elem("div", { id: "slide" }, [
  117. elem("div", { id: "topBar" }, [
  118. elem("a", {
  119. href: "#main",
  120. innerText: "Back"
  121. }),
  122. elem("span", {
  123. className: "name",
  124. innerText: slide
  125. })
  126. ]),
  127. fileListEl = elem("div", { id: "fileList" }),
  128. uploadEl({
  129. slide: slide
  130. }, populateFileList),
  131. htmlTextEl = elem("textarea", {
  132. id: "html"
  133. }).on("keydown", debounce(() => {
  134. console.log(htmlTextEl.value);
  135. api("slide_content_update", {
  136. slide: slide,
  137. text: htmlTextEl.value
  138. }, err => {
  139. if (err)
  140. error(err);
  141. previewEl.src = previewEl.src;
  142. });
  143. })),
  144. previewEl = elem("iframe", {
  145. id: "preview",
  146. src: "/"+slide+"/"
  147. })
  148. ]).appendTo(root);
  149. populateFileList();
  150. api("slide_meta", { slide: slide }, (err, res) => {
  151. if (err) {
  152. error(err);
  153. setView("main");
  154. }
  155. //metaDisabledEl.checked = !!res.disabled;
  156. });
  157. api("slide_content", { slide: slide }, (err, html) => {
  158. if (err)
  159. return error(err);
  160. htmlTextEl.innerHTML = html.text;
  161. });
  162. }
  163. function route() {
  164. var name, args;
  165. if (location.hash.substring(1)) {
  166. args = location.hash.substring(1).split("/");
  167. name = args[0];
  168. args.splice(0, 1);
  169. if (!views[name])
  170. name = "login"
  171. } else {
  172. name = "login";
  173. }
  174. args = args || [];
  175. args.splice(0, 0, root);
  176. root.clear();
  177. root.className = name;
  178. views[name].apply(null, args);
  179. }
  180. route();
  181. window.onhashchange = route;
  182. })();