newpg.html 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <br>
  2. <style>
  3. #editorFrame {
  4. width: 100%;
  5. border: none;
  6. height: calc(100vh - 1em);
  7. }
  8. </style>
  9. <div class="ui text container" style="margin-top:20px;">
  10. <h2>Create New Page</h2>
  11. <form class="ui form">
  12. <div class="field">
  13. <label for="pageTitle">Page Title</label>
  14. <input type="text" id="pageTitle" name="pageTitle" placeholder="Enter page title">
  15. </div>
  16. <div class="field">
  17. <label for="saveFilename">Save Filename</label>
  18. <div class="ui right labeled input">
  19. <input type="text" id="saveFilename" name="saveFilename" placeholder="Enter filename">
  20. <div class="ui basic label">
  21. .html
  22. </div>
  23. </div>
  24. <small>The page will be saved to <code>/site/pages/</code></small>
  25. </div>
  26. </form>
  27. <br>
  28. </div>
  29. <script>
  30. //Set this to non null for the editor to start a new page
  31. var inputFiles = null;
  32. if (editingPage && editingPage != ""){
  33. inputFiles = "/site/pages/" + editingPage;
  34. let filenameInput = document.getElementById("saveFilename");
  35. filenameInput.value = editingPage;
  36. filenameInput.disabled = true;
  37. editingPage = ""; //Reset it
  38. }
  39. //URL encode value of the template
  40. var saveTemplate = "%3Chtml%3E%0A%20%20%20%20%3Chead%3E%0A%20%20%20%20%20%20%20%20%3Ctitle%3E%7B%7Btitle%7D%7D%3C%2Ftitle%3E%0A%20%20%20%20%20%20%20%20%3Cmeta%20charset%3D%22UTF-8%22%3E%0A%20%20%20%20%20%20%20%20%3Cmeta%20name%3D%22viewport%22%20content%3D%22width%3Ddevice-width%2C%20initial-scale%3D1.0%22%3E%0A%20%20%20%20%20%20%20%20%3Clink%20rel%3D%22stylesheet%22%20href%3D%22https%3A%2F%2Fcdnjs.cloudflare.com%2Fajax%2Flibs%2Ftocas-ui%2F5.0.2%2Ftocas.min.css%22%3E%0A%20%20%20%20%20%20%20%20%3Cscript%20src%3D%22https%3A%2F%2Fcdnjs.cloudflare.com%2Fajax%2Flibs%2Ftocas-ui%2F5.0.2%2Ftocas.min.js%22%3E%3C%2Fscript%3E%0A%20%20%20%20%20%20%20%20%3Clink%20rel%3D%22preconnect%22%20href%3D%22https%3A%2F%2Ffonts.googleapis.com%22%3E%0A%20%20%20%20%20%20%20%20%3Clink%20rel%3D%22preconnect%22%20href%3D%22https%3A%2F%2Ffonts.gstatic.com%22%20crossorigin%3E%0A%20%20%20%20%20%20%20%20%3Clink%20href%3D%22https%3A%2F%2Ffonts.googleapis.com%2Fcss2%3Ffamily%3DNoto%2BSans%2BTC%3Awght%40400%3B500%3B700%26display%3Dswap%22%20rel%3D%22stylesheet%22%3E%0A%20%20%20%20%3C%2Fhead%3E%0A%20%20%20%20%3Cbody%3E%0A%20%20%20%20%20%20%20%20%3Cdiv%20id%3D%22context%22%20class%3D%22ts-content%20is-padded%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%7Bcontent%7D%7D%0A%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%3C%2Fbody%3E%0A%20%20%20%20%3C%2Fhtml%3E";
  41. saveTemplate = decodeURIComponent(saveTemplate);
  42. function handleSavefile(content){
  43. //Creating new file
  44. let title = document.getElementById("pageTitle").value;
  45. if (title.length > 27) {
  46. msgbox(`<i class="ui red times icon"></i> The title cannot be longer than 27 characters.`);
  47. return;
  48. }
  49. if (title.trim() === "") {
  50. msgbox(`<i class="ui red times icon"></i> The page title cannot be empty.`);
  51. return;
  52. }
  53. //Replace the title and content to the template
  54. let editingTemplate = JSON.parse(JSON.stringify(saveTemplate)); //deepcopy
  55. let filledTemplate = editingTemplate.replace("{{title}}", title).replace("{{content}}", content);
  56. let filename = document.getElementById("saveFilename").value.trim();
  57. if (inputFiles != null){
  58. //Replace the filename with the base name of inputFiles
  59. filename = inputFiles.split("/").pop();
  60. }
  61. if (filename.trim() === "") {
  62. msgbox(`<i class="ui red times icon"></i> The filename cannot be empty.`);
  63. return;
  64. }
  65. if (!filename.endsWith(".html")) {
  66. filename += ".html";
  67. }
  68. //This will just overwrite the org file
  69. createNewPage(filename, filledTemplate, function(){
  70. if (inputFiles == null){
  71. msgbox(`<i class="ui green check icon"></i> Page created`, 3000);
  72. switchToTab("allpages"); // Switch to the all posts tab
  73. }else{
  74. msgbox(`<i class="ui green check icon"></i> Page updated`, 3000);
  75. }
  76. });
  77. }
  78. //Upload the new content html to disk
  79. function createNewPage(filename, content, callback=undefined){
  80. if (filename.trim() === "" && content.trim() === "") {
  81. alert("Cannot create an empty page.");
  82. return;
  83. }
  84. //Create the markdown file at the /blog/posts folder
  85. const blob = new Blob([content], { type: 'text/plain' });
  86. const file = new File([blob], filename);
  87. handleFile(file, "/site/pages", function(){
  88. if (callback){
  89. callback();
  90. }
  91. });
  92. }
  93. // Error handler for AJAX requests
  94. function errorHandler(event) {
  95. msgbox("Failed to create post: " + event.target.responseText, 3000);
  96. $("#saveButton").removeClass("loading disabled");
  97. }
  98. //This is use for pedit to set page title from iframe
  99. function setPageTitle(title){
  100. let titleInput = document.getElementById("pageTitle");
  101. titleInput.value = title;
  102. titleInput.disabled = true;
  103. }
  104. // Function to handle file upload
  105. function handleFile(file, dir, callback=undefined) {
  106. // Perform actions with the selected file
  107. var formdata = new FormData();
  108. formdata.append("file1", file);
  109. var ajax = new XMLHttpRequest();
  110. ajax.addEventListener("load", function(event){
  111. let responseText = event.target.responseText;
  112. try{
  113. responseText = JSON.parse(responseText);
  114. if (responseText.error != undefined){
  115. alert(responseText.error);
  116. }
  117. }catch(ex){
  118. }
  119. if (callback != undefined){
  120. callback();
  121. }
  122. }, false); // doesnt appear to ever get called even upon success
  123. ajax.addEventListener("error", errorHandler, false);
  124. //ajax.addEventListener("abort", abortHandler, false);
  125. ajax.open("POST", "/upload?dir=" + dir);
  126. ajax.send(formdata);
  127. }
  128. </script>
  129. <iframe id="editorFrame" src="posteng/pedit.html"></iframe>