Pictures!
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.

view.js 3.5KB

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