Plugin Directory

Changeset 3246256


Ignore:
Timestamp:
02/25/2025 08:34:50 AM (13 months ago)
Author:
easyprolabs
Message:

documentation improvements

Location:
easy-docs
Files:
75 added
5 edited

Legend:

Unmodified
Added
Removed
  • easy-docs/trunk/README.txt

    r3240911 r3246256  
    11=== Easy Docs ===
    22Contributors: easyprolabs
    3 Tags: Documentation, Knowledge Base, Content Management
     3Tags: docs, documentation, knowledge base, faq
    44Requires at least: 6.0
    55Tested up to: 6.7
    66Requires PHP: 7.4
    7 Stable tag: 1.3.0
     7Stable tag: 1.4.0
    88License: GPLv3 or later
    99License URI: http://www.gnu.org/licenses/gpl-3.0.html
     
    1313== Description ==
    1414
    15 **Easy Docs** is the ultimate WordPress plugin for creating comprehensive documentation with ease. Whether you're building product guides, software manuals, or any other type of documentation, Easy Docs is designed to streamline the process for developers and non-developers alike. 
     15Having a well-organized knowledge base is crucial for businesses and developers alike. It can reduce support tickets and streamline customer support by providing a well-structured knowledge base, allowing users to find answers quickly without contacting support.
     16
     17Easy Docs is a powerful WordPress documentation plugin that simplifies the process of creating, managing, and displaying documentation. Whether you're building a knowledge base, user guide, or developer docs, Easy Docs streamlines content creation and enhances user experience. 
     18
    1619[youtube https://www.youtube.com/watch?v=ryHDrrj8Zuk]
    1720
    18 ### Key Features: 
     21Easy Docs is designed specifically for WordPress users, offering an intuitive way to create and manage documentation from a single admin page. Inspired by modern code editors, the backend provides a familiar, structured workspace for developers while ensuring a professional and user-friendly frontend presentation.
    1922
    20 1. **Familiar, Intuitive Interface** 
    21    Easy Docs brings a VS Code-inspired layout to WordPress, with a two-panel interface: 
    22    - **Explorer (Sidebar):** Add folders (projects), subfolders, and documents to outline your documentation structure. 
    23    - **Editor (Main Content):** Edit documentation with a rich TinyMCE text editor for individual documents. 
     23**Key Features of Easy Docs**
    2424
    25 2. **Project-Based Organization** 
    26    Each top-level folder represents a project. Create multiple projects, each with its unique set of folders and documents.
     25- **Intuitive Interface**: The two-panel layout mirrors the modern code editor's interface, featuring a sidebar for organizing content into projects and subfolders, and a main editor for crafting your documentation with the rich TinyMCE text editor.
    2726
    28 3. **Efficient Document Creation & Management** 
    29    - Add folders and documents dynamically without page reloads (via Ajax). 
    30    - Open multiple documents simultaneously as tabs, making it easy to switch between topics. 
     27- **Project-Based Organization**: Each top-level folder represents a unique project, allowing users to efficiently manage multiple documentation sets within WordPress.
    3128
    32 4. **Frontend Documentation Display** 
    33    - Use a simple shortcode, e.g., `[easydocs doc="A"]`, to display a project. 
    34    - The frontend includes: 
    35      - **Sidebar:** Mirrors your documentation structure. 
    36      - **Main Content Area:** Dynamically loads document content via Ajax. 
    37      - **Table of Contents (ToC):** Automatically generated from headings for quick navigation. 
    38      - **Search Box:** Perform instant Ajax-powered searches across your documentation. 
     29- **Efficient Document Management**: Easily create, edit, and manage documents with a dynamic tab-based system that enables quick navigation between multiple files.
    3930
    40 5. **Developer-Friendly Design** 
    41    Easy Docs keeps the workflow familiar for developers, with a backend designed for efficient documentation creation. 
     31- **Frontend Display Options**: Publish your documentation using a simple shortcode, which automatically generates a sidebar, dynamic content loading, and a search box for a seamless user experience.
    4232
    43 ### Benefits: 
    44 - Save time with dynamic document management. 
    45 - Create a professional, user-friendly frontend for your documentation. 
    46 - Easily scale your documentation with unlimited projects, folders, and documents. 
     33**Efficiency and Ease of Use**
    4734
    48 Easy Docs is perfect for anyone looking for a straightforward and powerful solution to build and display documentation in WordPress.
     35Easy Docs is built with usability in mind, making documentation creation faster and more efficient. Its user-friendly interface caters to both developers and non-technical users, ensuring that anyone can structure and maintain a knowledge base effortlessly.
     36
     37**Enhancing the Frontend User Experience**
     38
     39The frontend display of Easy Docs is designed for maximum readability and accessibility. It includes a built-in table of contents, instant search functionality, and a professional layout, allowing users to navigate documentation with ease.
     40
     41**Perfect for Developers and Non-Developers Alike**
     42
     43Whether you’re a developer managing technical documentation or a business owner creating a help center, Easy Docs offers the flexibility and efficiency you need. Its structured backend and clean frontend make it a versatile solution for any WordPress site.
     44
     45**Get Started with Easy Docs Today**
     46
     47Easy Docs is the ultimate tool for creating, organizing, and displaying documentation in WordPress. Download Easy Docs today and streamline your content management process!
    4948
    5049== Installation ==
     
    7978
    8079== Changelog ==
     80= 1.4.0 =
     81* Modify: In admin explorer, clicking outside the input will also create the outline or doc.
     82* Modify: Update readme documentation
     83
    8184= 1.2.0 =
    8285* Add: Copy link button to copy link of the current document.
  • easy-docs/trunk/admin/js/admin.build.js

    r3240911 r3246256  
    1 (()=>{"use strict";const t=class{constructor(){}static get_icon(t,e=""){return'<svg class="icon icon-'.concat(t," ").concat(e,'" aria-hidden="true" role="img" focusable="false"><use href="#icon-').concat(t,'" xlink:href="#icon-').concat(t,'"></use></svg>')}static normalize_html(t){const e=document.createElement("div");return e.innerHTML=t,e.innerHTML.replace(/\s+/g," ").trim()}},e=window.Easy_Docs_Admin_Data||{},s={ajaxUrl:e.ajaxUrl,security:e.security,posts:e.posts,i18n:e.i18n};class i{constructor(t,e=document){this.elements="string"==typeof t?this.get(t,e):[t]}static async sendAjaxRequest(t,e,s=console.error){const i=new URLSearchParams(e);try{const e=await fetch(t,{method:"POST",body:i,headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}});if(!e.ok)throw new Error("Network response was not ok");return await e.json()}catch(t){return s(t.message),null}}static template(t,e){return t.replace(/\{\{(\w+)\}\}/g,((t,s)=>e[s]||""))}static strToHTML(t){const e=document.createElement("div");return e.innerHTML=t,e.firstElementChild}}const o=(t,e=document)=>new i(t,e);Object.getOwnPropertyNames(i).forEach((t=>{"function"==typeof i[t]&&"prototype"!==t&&(o[t]=i[t])}));const c=class{constructor(t){this.contextItem=!1,this.pasteItem=!1,this.pasteContext=!1,this.editor=t,this.outline=document.querySelector("#docs-outline"),this.outline&&(this.actionBtns=document.querySelector("#docs-explorer-actions"),this.addOutlineBtn=document.querySelector("#easy-add-outline"),this.addDocBtn=document.querySelector("#easy-add-doc"),this.insertDocBtn=document.querySelector("#easy-insert-doc"),this.unlinkBtn=document.querySelector("#easy-remove-doc"),this.delBtn=document.querySelector("#easy-delete-doc"),this.collapseBtn=document.querySelector("#easy-collapse-all"),this.menu=document.querySelector("#easy-context-menu"),this.modal=document.querySelector("#docs-overlay"),this.docsInfo=document.querySelector("#docs-info"),this.currentProject=null,this.isModalOpen=!1,this.activeItem=null,this.setup(),this.events())}setup(){this.outline&&this.docsInfo&&this.docsInfo.querySelectorAll(".easy-docs-message").forEach((t=>{t.classList.add("hidden"),(!this.outline.firstElementChild&&t.classList.contains("easy-docs-info-welcome")||this.outline.firstElementChild&&t.classList.contains("easy-docs-info-wb"))&&t.classList.remove("hidden")}))}events(){const t=this;this.outline&&(this.outline.addEventListener("click",(e=>{if(e.target.classList.contains("docs-input"))return;const s=e.target.closest(".docs-outline-item");s&&!s.classList.contains("new-item")&&(s.classList.contains("docs-post")&&"easydocs-welcome"!==s.textContent?t.unlinkBtn&&(t.unlinkBtn.classList.remove("cursor-not-allowed","text-gray-400"),t.unlinkBtn.classList.add("cursor-pointer","hover:bg-gray-400/20")):t.unlinkBtn&&(t.unlinkBtn.classList.add("cursor-not-allowed","text-gray-400"),t.unlinkBtn.classList.remove("cursor-pointer","hover:bg-gray-400/20")),e.preventDefault(),e.stopPropagation(),t.activateListItem(s),t.updateCurrentProject(s))})),this.outline.addEventListener("contextmenu",(t=>{const e=t.target.closest(".docs-outline-item"),s=!!this.menu&&this.menu.querySelector(".paste-inside"),i=!!this.menu&&this.menu.querySelector(".unlink-doc");e&&(e.classList.contains("docs-post")&&"easydocs-welcome"!==e.textContent?(s&&s.classList.add("hidden"),i&&(i.classList.remove("cursor-not-allowed","text-gray-400"),i.classList.add("cursor-pointer","hover:bg-gray-200"))):(s&&s.classList.remove("hidden"),i&&(i.classList.add("cursor-not-allowed","text-gray-400"),i.classList.remove("cursor-pointer","hover:bg-gray-200"))),t.preventDefault(),this.contextItem=e,this.menu&&(this.menu.style.display="block",this.menu.style.left=t.clientX+"px",this.menu.style.top=t.clientY+"px"))})),this.docsInfo&&this.docsInfo.querySelector(".easy-docs-shortcopy").addEventListener("click",(e=>{e.preventDefault();const s=t.docsInfo.querySelector(".easy-docs-shortcode").textContent;s&&navigator.clipboard.writeText(s).then((()=>{const t=this.docsInfo.querySelector("#copy-indicator");t&&(t.classList.remove("hidden"),setTimeout((()=>{t.classList.add("hidden")}),1e3))})).catch((t=>{console.error("Failed to copy text: ",t)}))})),document.addEventListener("click",(function(e){const s=e.target;t.menu&&s!==t.menu&&!t.menu.contains(s)&&(t.menu.style.display="none",t.contextItem=!1,!t.activeItem||s===t.outline||t.outline.contains(s)||s===t.actionBtns||t.actionBtns.contains(s)||(t.activeItem.classList.remove("active-item"),t.activeItem.querySelectorAll(".bg-lime-700\\/10").forEach((t=>t.classList.remove("bg-lime-700/10"))),t.activeItem=null))})),this.menu&&this.menu.addEventListener("click",(function(e){const s=e.target;if("LI"!==s.nodeName)return void(t.contextItem=!1);if(!t.contextItem)return;const i=s.getAttribute("data-attr");t.menu.style.display="none","delete"===i?t.deleteOutlineItem(t.contextItem):"create-doc"===i?t.addOutlineItem("post",t.contextItem):"insert-doc"===i?t.showDocsList(t.contextItem):"unlink-doc"===i?t.unlinkDocument(t.contextItem):"create-outline"===i?t.addOutlineItem("folder",t.contextItem):"rename"===i?t.renameOutlineItem(t.contextItem):"cut"===i?t.cutcopyOutlineItem(t.contextItem,"cut"):"copy"===i?t.cutcopyOutlineItem(t.contextItem,"copy"):"paste-before"===i?t.pasteOutlineItem(t.contextItem,"insert_before"):"paste-after"===i?t.pasteOutlineItem(t.contextItem,"insert_after"):"paste-inside"===i&&t.pasteOutlineItem(t.contextItem,"inside")})),this.addOutlineBtn&&this.addOutlineBtn.addEventListener("click",(()=>{this.addOutlineItem("folder")})),this.addDocBtn&&this.addDocBtn.addEventListener("click",(()=>{this.addOutlineItem("post")})),this.insertDocBtn&&this.insertDocBtn.addEventListener("click",(()=>{this.showDocsList()})),this.unlinkBtn&&this.unlinkBtn.addEventListener("click",(()=>{this.unlinkDocument()})),this.delBtn&&this.delBtn.addEventListener("click",(()=>{this.deleteOutlineItem()})),this.collapseBtn&&this.collapseBtn.addEventListener("click",(()=>{this.collapseAll()})),this.modal&&(this.modal.addEventListener("click",(t=>{this.isModalOpen&&!t.target.closest(".easy-docs-modal-content")&&this.toggleModal()})),this.modal.addEventListener("keydown",(t=>{"Escape"===t.key&&this.toggleModal()}))))}updateCurrentProject(t){if(this.currentProject&&(this.currentProject===t||this.currentProject.contains(t)))return;let e=t.closest(".docs-outline-item");for(;e&&e.parentElement!==this.outline;)e=e.parentElement;e&&e.classList.contains("docs-folder")?this.currentProject=e:this.currentProject=null;const s=this.currentProject?this.currentProject.querySelector(".docs-outline-label"):null,i=s?s.textContent.trim():"",o=i?i.toLowerCase().replace(/[^a-z0-9]+/g,""):"";this.showMessage(i,o)}showMessage(t,e){t?this.docsInfo&&this.docsInfo.querySelectorAll(".easy-docs-message").forEach((t=>{if(t.classList.contains("easy-docs-info-project")){t.classList.remove("hidden");const i=s.i18n;t.querySelector("span").innerHTML="".concat(i.shortcode,': <strong class="easy-docs-shortcode">[easydocs doc="').concat(e,'"]</strong>')}else t.classList.add("hidden")})):this.docsInfo&&this.docsInfo.querySelectorAll(".easy-docs-message").forEach((t=>{t.classList.contains("easy-docs-info-wb")?t.classList.remove("hidden"):t.classList.add("hidden")}))}showDocsList(t=!1){if(this.toggleModal(),!this.isModalOpen)return;const e=s.posts,i=s.i18n,o=Object.keys(e),c=this.modal.querySelector(".easy-docs-modal-content");if(0===o.length)return void(c.innerHTML="No posts found");const n='<p class="mb-2 font-bold text-base">'.concat(i.select_doc,'</p>\n\t\t<div class="mb-1"><input type="text" class="easy-docs-modal-search w-full !border-gray-300" placeholder="').concat(i.search_docs,'..."></div>\n\t\t<ul class="easy-docs-all-docs border border-gray-300 rounded">\n\t\t\t').concat(o.map((t=>{const s=e[t];return s&&"easydocs-welcome"!==s.title?'<li class="mb-0" data-term="'.concat(s.title.toLowerCase(),'"><a class="easy-select-doc block max-w-full px-2 py-1 border-b border-gray-300" href="#" data-postid=').concat(s.id,">").concat(s.title,"</a></li>"):""})).join(""),"\n\t\t</ul>");c.innerHTML=n,c.querySelector(".easy-docs-modal-search").focus();const a=c.querySelector(".easy-docs-modal-search"),r=c.querySelector(".easy-docs-all-docs");["keyup","paste"].forEach((t=>{a.addEventListener(t,(t=>{const e=t.target.value.toLowerCase();r.querySelectorAll("li").forEach((t=>{const s=t.getAttribute("data-term");!e||s.includes(e)?t.style.display="block":t.style.display="none"}))}))})),r.addEventListener("click",(e=>{e.target.classList.contains("easy-select-doc")&&(e.preventDefault(),this.insertDoc(e.target.dataset.postid,e.target.textContent,t))}))}insertDoc(e,s,i){this.toggleModal(),i||(i=this.outline.querySelector(".active-item"));const o=i?i.closest(".docs-folder"):null;let c=o?o.querySelector("ul"):null;if(c||(c=this.outline),i&&i.classList.contains("docs-folder")){const t=i.querySelector("ul");if(t){t.classList.remove("hidden");const e=i.querySelector(".icon-right");e&&e.classList.add("rotate-90")}}const n=o?o.querySelector("span.truncate"):null;let a=n?n.className.match(/pl-\d+/):null,r="pl-4";if(a){let t=parseInt(a[0].replace("pl-",""));r="pl-".concat(t+2)}let l="";const d=document.createElement("li");d.classList.add("docs-outline-item","docs-post","mb-0","hover:cursor-pointer","new-item"),d.setAttribute("data-id",e),l='<span class="mr-1 text-slate-400">'.concat(t.get_icon("file-text")).concat(t.get_icon("loading","animate-spin easyhide"),"</span>"),d.innerHTML='\n\t\t\t<span class="block hover:bg-gray-300">\n\t\t\t\t<span class="block truncate py-1 text-sm pr-2 '.concat(r,'">\n\t\t\t\t\t').concat(l,'<span class="docs-outline-label">').concat(s,"</span>\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t\t"),c.classList.remove("hidden"),c.appendChild(d),d.classList.remove("new-item"),this.updateOutline(d)}toggleModal(){if(this.modal)if(this.modal.classList.contains("hidden"))this.modal.classList.remove("hidden"),this.isModalOpen=!0;else{const t=this.modal.querySelector(".easy-docs-modal-content");this.modal.classList.add("hidden"),this.isModalOpen=!1,t&&(t.innerHTML="")}}addOutlineItem(e,s=!1){s||(s=this.outline.querySelector(".active-item"));const i=s?s.closest(".docs-folder"):null;let o=i?i.querySelector("ul"):null;if(o||(o=this.outline),s&&s.classList.contains("docs-folder")){const t=s.querySelector("ul");if(t){t.classList.remove("hidden");const e=s.querySelector(".icon-right");e&&e.classList.add("rotate-90")}}const c=i?i.querySelector("span.truncate"):null;let n=c?c.className.match(/pl-\d+/):null,a="pl-4";if(n){let t=parseInt(n[0].replace("pl-",""));a="pl-".concat(t+2)}let r="",l="";const d="folder"===e?"docs-folder":"docs-post",u=document.createElement("li");u.classList.add("docs-outline-item",d,"mb-0","hover:cursor-pointer","new-item"),"folder"===e?(r='<span class="mr-1 text-slate-600">'.concat(t.get_icon("right")).concat(t.get_icon("loading","animate-spin easyhide"),"</span>"),l='<ul class="hidden"></ul>'):"post"===e&&(r='<span class="mr-1 text-slate-400">'.concat(t.get_icon("file-text")).concat(t.get_icon("loading","animate-spin easyhide"),"</span>")),u.innerHTML='\n\t\t\t<span class="block hover:bg-gray-300" href="#">\n\t\t\t\t<span class="block truncate py-1 text-sm pr-2 '.concat(a,'">\n\t\t\t\t\t').concat(r,'<input type="text" class="docs-input w-full text-slate-600 box-border" style="width: calc( 100% - 16px - 0.25rem );">\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t\t').concat(l,"\n\t\t\t"),o.classList.remove("hidden"),o.appendChild(u);const h=u.querySelector(".docs-input");h.focus(),h.addEventListener("blur",(()=>{u.remove()}));const m=t=>{"Enter"===t.key||"Tab"===t.key?(u.classList.remove("new-item"),u.removeEventListener("keydown",m),this.handleFolderInput(u)):"Escape"===t.key&&u.remove()};u.addEventListener("keydown",m)}renameOutlineItem(t){if(!t)return;const e=t.querySelector(".docs-outline-label");if(!e)return;const s=e.textContent.trim();e.innerHTML='<input type="text" class="docs-input w-full text-slate-600 box-border" style="width: calc( 100% - 16px - 0.25rem );" value="'.concat(s,'">');const i=e.querySelector(".docs-input");i.focus(),i.addEventListener("blur",(()=>{e.innerHTML="".concat(s)})),i.addEventListener("keydown",(i=>{"Enter"===i.key||"Tab"===i.key?this.handleRenameInput(t,s):"Escape"===i.key&&(e.innerHTML="".concat(s))}))}unlinkDocument(t=!1){t||(t=this.outline.querySelector(".active-item")),t&&t.classList.contains("docs-post")&&(t.remove(),this.updateOutline())}deleteOutlineItem(t=!1){if(t||(t=this.outline.querySelector(".active-item")),t){let e=[];const s=this.currentProject&&this.currentProject===t;t.classList.contains("docs-post")?e=[t.getAttribute("data-id")]:t.querySelectorAll(".docs-post").forEach((t=>{e.push(t.getAttribute("data-id"))})),t.remove(),e.length>0?this.deletePost(e):this.updateOutline(),s&&(this.currentProject=null,this.setup())}}collapseAll(){const t=this.outline.querySelector(".active-item");t&&(t.classList.remove("active-item"),t.querySelectorAll(".bg-lime-700\\/10").forEach((t=>t.classList.remove("bg-lime-700/10")))),this.outline.querySelectorAll("ul").forEach((t=>{t.classList.add("hidden")})),this.outline.querySelectorAll(".rotate-90").forEach((t=>{t.classList.remove("rotate-90")}))}activateListItem(t){this.activeItem=t;const e=t.querySelector("span");if(e){const s=this.outline.querySelector(".active-item");s&&(s.classList.remove("active-item"),s.querySelectorAll(".bg-lime-700\\/10").forEach((t=>t.classList.remove("bg-lime-700/10")))),t.classList.add("active-item"),e.classList.add("bg-lime-700/10")}const s=t.querySelector("ul");if(s){const e=t.querySelector(".icon-right");e&&e.classList.toggle("rotate-90"),s.classList.toggle("hidden")}}cutcopyOutlineItem(t,e){this.pasteItem&&(this.pasteItem.classList.remove("text-gray-400"),this.pasteItem=!1),t&&(this.pasteContext=e,this.pasteItem=t,this.menu.querySelectorAll(".cutcopy-context").forEach((t=>{t.classList.remove("cursor-not-allowed","text-gray-400"),t.classList.add("cursor-pointer","hover:bg-gray-200","paste-context")})),"cut"===e&&t.classList.add("text-gray-400"))}pasteOutlineItem(t,e){if(!t||!this.pasteContext||!this.pasteItem)return;this.pasteItem.classList.remove("text-gray-400"),"copy"===this.pasteContext&&(this.pasteItem=this.pasteItem.cloneNode(!0));const s=t.querySelector(".block.truncate");let i=4;if(s){const t=s.className.match(/pl-\d+/);t&&(i=parseInt(t[0].replace("pl-","")))}"insert_before"===e?(this.adjustPadding(this.pasteItem,i),t.parentNode.insertBefore(this.pasteItem,t)):"insert_after"===e?(this.adjustPadding(this.pasteItem,i),t.nextSibling?t.parentNode.insertBefore(this.pasteItem,t.nextSibling):t.parentNode.appendChild(this.pasteItem)):"inside"===e&&(this.adjustPadding(this.pasteItem,i+2),t.querySelector("ul").appendChild(this.pasteItem)),"cut"===this.pasteContext&&(this.pasteContext=!1,this.pasteItem=!1,this.menu.querySelectorAll(".paste-context").forEach((t=>{t.classList.add("cursor-not-allowed","text-gray-400"),t.classList.remove("cursor-pointer","hover:bg-gray-200","paste-context")}))),this.updateOutline()}parseOutlineList(t){const e={};let s=0;return t.querySelectorAll(":scope > li").forEach((t=>{const i=t.querySelector("span:first-of-type"),o=i?i.textContent.trim():"",c=t.querySelector("ul");if(c)e[o]=this.parseOutlineList(c);else{const i=parseInt(t.getAttribute("data-id"),10);e["EasyDocs_"+s]=i,s++}})),e}async handleFolderInput(e){const s=e.querySelector(".docs-input"),i=s.value.trim();if(i)if(s.outerHTML='<span class="docs-outline-label">'.concat(i,"</span>"),e.classList.contains("docs-folder")){if(await this.updateOutline(e),e.parentElement&&"docs-outline"===e.parentElement.id){const s=e.querySelector("ul");if(s){s.classList.remove("hidden");const i=e.querySelector(".icon-right");i&&i.classList.add("rotate-90");const o=document.createElement("li");o.classList.add("docs-outline-item","docs-post","mb-0","hover:cursor-pointer","new-item");const c='<span class="mr-1 text-slate-400">'.concat(t.get_icon("file-text")).concat(t.get_icon("loading","animate-spin easyhide"),"</span>");o.innerHTML='\n\t\t\t\t\t\t\t<span class="block hover:bg-gray-300">\n\t\t\t\t\t\t\t\t<span class="block truncate py-1 text-sm pr-2 pl-6">\n\t\t\t\t\t\t\t\t\t'.concat(c,"<span>easydocs-welcome</span>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t"),s.classList.remove("hidden"),s.appendChild(o),o.classList.remove("new-item"),this.createNewDocument(o,"easydocs-welcome")}}}else e.classList.contains("docs-post")&&this.createNewDocument(e,i);else e.remove()}handleRenameInput(t,e){const s=t.querySelector(".docs-input").value.trim();s&&s!==e?(t.querySelector(".docs-outline-label").innerHTML="".concat(s),t.classList.contains("docs-folder")?this.updateOutline(t):t.classList.contains("docs-post")&&this.renameDocument(t,s)):t.querySelector(".docs-outline-label").innerHTML="".concat(e)}adjustPadding(t,e){const s=t.querySelector(".block.truncate");if(s){const t=s.className.match(/pl-\d+/);t&&(s.classList.remove(t[0]),s.classList.add("pl-".concat(e)))}const i=t.querySelector("ul");i&&i.querySelectorAll(":scope > li").forEach((t=>{this.adjustPadding(t,e+2)}))}async updateOutline(t=!1){const e=this.parseOutlineList(this.outline),i={action:"easy_docs_update_outline",security:s.security,outline:JSON.stringify(e)};this.addDocBtn.disabled=!0,this.insertDocBtn.disabled=!0,this.addOutlineBtn.disabled=!0,this.delBtn.disabled=!0,t&&(t.classList.contains("docs-folder")&&t.querySelector(".icon-right").classList.add("easyhide"),t.querySelector(".icon-loading").classList.remove("easyhide")),(await o.sendAjaxRequest(s.ajaxUrl,i,this.handleError.bind(this))).success?(this.addDocBtn.disabled=!1,this.insertDocBtn.disabled=!1,this.addOutlineBtn.disabled=!1,this.delBtn.disabled=!1,t&&(t.classList.contains("docs-folder")?t.querySelector(".icon-right").classList.remove("easyhide"):t.classList.contains("docs-post")&&t.querySelector(".icon-file-text").classList.remove("easyhide"),t.querySelector(".icon-loading").classList.add("easyhide"))):(this.addDocBtn.disabled=!1,this.insertDocBtn.disabled=!1,this.addOutlineBtn.disabled=!1,this.delBtn.disabled=!1,t&&t.remove())}async createNewDocument(t,e){if(!t||!e)return;const i={action:"easy_docs_create_document",security:s.security,postTitle:e};this.addDocBtn.disabled=!0,this.insertDocBtn.disabled=!0,this.addOutlineBtn.disabled=!0,t.querySelector(".icon-file-text").classList.add("easyhide"),t.querySelector(".icon-loading").classList.remove("easyhide");const c=await o.sendAjaxRequest(s.ajaxUrl,i,this.handleError.bind(this));if(c.success){const e=c.data.id;t.setAttribute("data-id",e),this.updateOutline(t)}else this.addDocBtn.disabled=!1,this.insertDocBtn.disabled=!1,this.addOutlineBtn.disabled=!1,t.remove()}async renameDocument(t,e){if(!t||!e)return;t.querySelector(".icon-file-text").classList.add("easyhide"),t.querySelector(".icon-loading").classList.remove("easyhide");const i={action:"easy_docs_rename_document",security:s.security,postId:t.getAttribute("data-id"),postTitle:e};(await o.sendAjaxRequest(s.ajaxUrl,i,this.handleError.bind(this))).success&&this.updateOutline(t)}async deletePost(t){const e={action:"easy_docs_delete_document",security:s.security,postIds:JSON.stringify(t)};(await o.sendAjaxRequest(s.ajaxUrl,e,this.handleError.bind(this))).success&&(this.updateOutline(),t.forEach((t=>{this.editor.closeTab(t,!0)})))}handleError(t){console.log(t)}},n=class{constructor(){this.isFresh=!0,this.activeEditor=!1,this.isInitiated=!1,this.isSettingContent=!1,this.editorData={},this.outline=document.querySelector("#docs-outline"),this.outline&&(this.tabs=document.querySelector("#docs-tabs"),this.tabContent=document.querySelector("#docs-tab-content"),this.saveDocBtn=document.querySelector("#easy-save-doc"),this.events())}events(){const t=this;this.outline&&this.outline.addEventListener("click",(e=>{if(e.target.classList.contains("docs-input"))return;const s=e.target.closest(".docs-outline-item");s&&s.classList.contains("docs-post")&&t.openEditor(s)})),this.tabs&&this.tabs.addEventListener("click",(e=>{if(e.target.closest(".docs-tab-label")){e.preventDefault();const s=e.target.closest(".docs-tab");if(s.classList.contains("active-tab"))return;const i=s.getAttribute("data-id");t.activateEditor(i)}else if(e.target.closest(".docs-tab-close")){e.preventDefault();const s=e.target.closest(".docs-tab").getAttribute("data-id");t.closeTab(s)}})),this.saveDocBtn&&this.saveDocBtn.addEventListener("click",(e=>{t.saveDocument()}))}initiateEditor(){const t=this.tabContent.querySelector(".dpc-welcome"),e=this.tabContent.querySelector(".dpc-editor");t&&e&&(t.classList.add("hidden"),e.classList.remove("sr-only"))}resetEditor(){const t=this.tabContent.querySelector(".dpc-welcome"),e=this.tabContent.querySelector(".dpc-editor");t&&e&&(t.classList.remove("hidden"),e.classList.add("sr-only")),this.isFresh=!0,this.activeEditor=!1}openEditor(t){const e=t.getAttribute("data-id");if(!e)return;const s="docs-tab-".concat(e);s!==this.activeEditor&&(this.tabs&&this.tabs.querySelector("#".concat(s))?this.activateEditor(e):this.createNewTab(e,"easydocs-welcome"===t.textContent.trim()))}activateEditor(t){const e="docs-tab-".concat(t),s=!!this.tabs&&this.tabs.querySelector("#".concat(e)),i=this.editorData?.[e]?.[0]??"";s&&(this.tabs.querySelectorAll(".active-tab").forEach((t=>t.classList.remove("active-tab","bg-gray-100"))),s.classList.add("active-tab","bg-gray-100"),this.activeEditor!==e&&this.modifyEditorContent(t,i))}closeTab(t,e){const s="docs-tab-".concat(t),i=!!this.tabs&&this.tabs.querySelector("#".concat(s));if(i){if(this.editorData[s][1]&&!e&&!confirm("There are unsaved changes. Are you sure you want to close?"))return;if(i.remove(),this.activeEditor===s){const t=!!this.tabs&&this.tabs.querySelector(".docs-tab");t?this.activateEditor(t.getAttribute("data-id")):this.resetEditor()}}}async createNewTab(e,i){const c={action:"easy_docs_get_document",security:s.security,postId:e},n=await o.sendAjaxRequest(s.ajaxUrl,c,this.handleError.bind(this));if(!n.success||!n.data)return;const a=n.data.title;let r=n.data.content;if(r)r=t.normalize_html(r);else if(i){const t=s.i18n;r="<h3>".concat(t.welcome[0],"</h3><p>").concat(t.welcome[1],"</p><p><b><i>").concat(t.welcome[2],"</i></b></p><p>").concat(t.welcome[3],"</p>")}const l=document.createElement("div");if(l.id="docs-tab-".concat(e),l.setAttribute("data-id",e),l.classList.add("docs-tab","flex","items-center","m-1","mr-0","cursor-pointer","min-w-32","max-w-52","justify-between"),l.innerHTML='<a href="#" class="docs-tab-label text-gray-500 text-sm truncate px-4 py-2">'.concat(a,'</a><a href="#" class="docs-tab-close px-4 py-2 text-gray-500 hover:text-red-400">').concat(t.get_icon("close","tab-close"),"</a>"),this.tabs&&(this.tabs.appendChild(l),this.editorData["docs-tab-".concat(e)]=[r,!1],this.modifyEditorContent(e,r),this.activateEditor(e),this.isFresh&&(this.initiateEditor(),this.isFresh=!1),!this.isInitiated)){const t=tinymce.get("docs-post-content");t&&(t.on("change",(()=>{this.isSettingContent||(this.editorData[this.activeEditor][1]=!0)})),this.isInitiated=!0)}}async saveDocument(){const{content:t,isDirty:e}=this.editorData[this.activeEditor],i="docs-post-content",c=this.tabContent.querySelector("#".concat(i));if(!c)return;let n="";if("text"==(null===c.offsetParent?"visual":"text"))n=c.value;else{const t=tinymce.get(i);if(!t)return;n=t.getContent()}const a=this.activeEditor.replace("docs-tab-","");if(n===t)return;this.saveDocBtn.disabled=!0;const r={action:"easy_docs_update_document",security:s.security,postId:a,content:n};(await o.sendAjaxRequest(s.ajaxUrl,r,this.handleError.bind(this))).success&&(this.saveDocBtn.disabled=!1,this.editorData[this.activeEditor][0]=n,this.editorData[this.activeEditor][1]=!1)}modifyEditorContent(t,e){const s="docs-post-content",i=document.getElementById(s),o=tinymce.get(s),c=null!==i.offsetParent;if(this.activeEditor&&tinymce.activeEditor&&this.editorData[this.activeEditor][1])if(c){const t=i.value;this.editorData[this.activeEditor]=[t,!0]}else{o.save();const t=o.getContent();this.editorData[this.activeEditor]=[t,!0]}this.isSettingContent=!0,c?i.value=e:o.setContent(e),this.isSettingContent=!1,this.activeEditor="docs-tab-".concat(t)}handleError(t){console.log(t)}},a=class{constructor(){this.outline=document.querySelector("#docs-stats-filter-outline"),this.outline&&(this.table=document.querySelector("#easydocs-stats-table"),this.collapseBtn=document.querySelector("#easy-collapse-all"),this.activeItem=null,this.events())}events(){const t=this;this.outline.addEventListener("click",(e=>{const s=e.target.closest(".docs-outline-item");s&&(e.preventDefault(),e.stopPropagation(),t.activateListItem(s),t.filterList(s))})),this.collapseBtn&&this.collapseBtn.addEventListener("click",(()=>{this.collapseAll()})),this.table&&this.table.querySelectorAll(".easydocs-table-sort").forEach((t=>{t.addEventListener("click",(()=>{const e=t.getAttribute("data-column");this.sortTable(e)}))}))}collapseAll(){const t=this.outline.querySelector(".active-item");t&&(t.classList.remove("active-item"),t.querySelectorAll(".bg-lime-700\\/10").forEach((t=>t.classList.remove("bg-lime-700/10")))),this.outline.querySelectorAll("ul").forEach((t=>{t.classList.add("hidden")})),this.outline.querySelectorAll(".rotate-90").forEach((t=>{t.classList.remove("rotate-90")})),this.table.querySelectorAll(".easydocs-stats-items tr").forEach((t=>{t.classList.remove("hidden")}))}activateListItem(t){this.activeItem=t;const e=t.querySelector("span");if(e){const s=this.outline.querySelector(".active-item");s&&(s.classList.remove("active-item"),s.querySelectorAll(".bg-lime-700\\/10").forEach((t=>t.classList.remove("bg-lime-700/10")))),t.classList.add("active-item"),e.classList.add("bg-lime-700/10")}const s=t.querySelector("ul");if(s){const e=t.querySelector(".icon-right");e&&e.classList.toggle("rotate-90"),s.classList.toggle("hidden")}}filterList(t){let e=t.getAttribute("data_ids");e=e.split(","),e.length>0?this.table.querySelectorAll(".easydocs-stats-items tr").forEach((t=>{const s=t.getAttribute("data-id");e.indexOf(s)>-1?t.classList.remove("hidden"):t.classList.add("hidden")})):this.table.querySelectorAll(".easydocs-stats-items tr").forEach((t=>{t.classList.add("hidden")}))}sortTable(t){t=parseInt(t);const e=this.table.querySelector("tbody"),s=Array.from(e.querySelectorAll("tr")),i="desc"===this.table.dataset.sortOrder?"asc":"desc";this.table.dataset.sortOrder=i,s.sort(((e,s)=>{const o=e.querySelector("td:nth-child(".concat(t,")")).textContent.trim(),c=s.querySelector("td:nth-child(".concat(t,")")).textContent.trim();return 2!==t&&3!==t&&4!==t||isNaN(parseFloat(o))||isNaN(parseFloat(c))?(console.log(t),"asc"===i?o.localeCompare(c):c.localeCompare(o)):function(t,e){const s=parseFloat(t),o=parseFloat(e);return"asc"===i?s-o:o-s}(o,c)})),s.forEach((t=>e.appendChild(t)))}handleError(t){console.log(t)}},r=class{constructor(){this.settings=document.querySelector("#easydocs-settings"),this.settings&&(this.form=this.settings.querySelector("#easydocs-admin-settings"),this.submit=this.settings.querySelector("#easydocs-admin-settings_save"),this.events())}events(){this.submit&&this.submit.addEventListener("click",(t=>{const e=this.form.querySelectorAll(".easydocs-option"),s={};e.forEach((t=>{let e;const i=t.querySelector("input, select"),o=t.getAttribute("data-setting");o&&i&&(e="checkbox"===i.type?i.checked?"yes":"no":i.value,s[o]=e)})),this.submit.disabled=!0,this.sendSettings(s)}))}async sendSettings(t){const e={action:"easy_docs_update_settings",security:s.security,settings:JSON.stringify(t)},i=await o.sendAjaxRequest(s.ajaxUrl,e,this.handleError.bind(this));this.submit.disabled=!1,i.success&&location.reload()}handleError(t){console.log(t)}};document.addEventListener("DOMContentLoaded",(()=>{const t=new n;new c(t),new a,new r}))})();
     1(()=>{"use strict";const t=class{constructor(){}static get_icon(t,e=""){return'<svg class="icon icon-'.concat(t," ").concat(e,'" aria-hidden="true" role="img" focusable="false"><use href="#icon-').concat(t,'" xlink:href="#icon-').concat(t,'"></use></svg>')}static normalize_html(t){const e=document.createElement("div");return e.innerHTML=t,e.innerHTML.replace(/\s+/g," ").trim()}},e=window.Easy_Docs_Admin_Data||{},s={ajaxUrl:e.ajaxUrl,security:e.security,posts:e.posts,i18n:e.i18n};class i{constructor(t,e=document){this.elements="string"==typeof t?this.get(t,e):[t]}static async sendAjaxRequest(t,e,s=console.error){const i=new URLSearchParams(e);try{const e=await fetch(t,{method:"POST",body:i,headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}});if(!e.ok)throw new Error("Network response was not ok");return await e.json()}catch(t){return s(t.message),null}}static template(t,e){return t.replace(/\{\{(\w+)\}\}/g,((t,s)=>e[s]||""))}static strToHTML(t){const e=document.createElement("div");return e.innerHTML=t,e.firstElementChild}}const o=(t,e=document)=>new i(t,e);Object.getOwnPropertyNames(i).forEach((t=>{"function"==typeof i[t]&&"prototype"!==t&&(o[t]=i[t])}));const c=class{constructor(t){this.contextItem=!1,this.pasteItem=!1,this.pasteContext=!1,this.editor=t,this.outline=document.querySelector("#docs-outline"),this.outline&&(this.actionBtns=document.querySelector("#docs-explorer-actions"),this.addOutlineBtn=document.querySelector("#easy-add-outline"),this.addDocBtn=document.querySelector("#easy-add-doc"),this.insertDocBtn=document.querySelector("#easy-insert-doc"),this.unlinkBtn=document.querySelector("#easy-remove-doc"),this.delBtn=document.querySelector("#easy-delete-doc"),this.collapseBtn=document.querySelector("#easy-collapse-all"),this.menu=document.querySelector("#easy-context-menu"),this.modal=document.querySelector("#docs-overlay"),this.docsInfo=document.querySelector("#docs-info"),this.currentProject=null,this.isModalOpen=!1,this.activeItem=null,this.setup(),this.events())}setup(){this.outline&&this.docsInfo&&this.docsInfo.querySelectorAll(".easy-docs-message").forEach((t=>{t.classList.add("hidden"),(!this.outline.firstElementChild&&t.classList.contains("easy-docs-info-welcome")||this.outline.firstElementChild&&t.classList.contains("easy-docs-info-wb"))&&t.classList.remove("hidden")}))}events(){const t=this;this.outline&&(this.outline.addEventListener("click",(e=>{if(e.target.classList.contains("docs-input"))return;const s=e.target.closest(".docs-outline-item");s&&!s.classList.contains("new-item")&&(s.classList.contains("docs-post")&&"easydocs-welcome"!==s.textContent?t.unlinkBtn&&(t.unlinkBtn.classList.remove("cursor-not-allowed","text-gray-400"),t.unlinkBtn.classList.add("cursor-pointer","hover:bg-gray-400/20")):t.unlinkBtn&&(t.unlinkBtn.classList.add("cursor-not-allowed","text-gray-400"),t.unlinkBtn.classList.remove("cursor-pointer","hover:bg-gray-400/20")),e.preventDefault(),e.stopPropagation(),t.activateListItem(s),t.updateCurrentProject(s))})),this.outline.addEventListener("contextmenu",(t=>{const e=t.target.closest(".docs-outline-item"),s=!!this.menu&&this.menu.querySelector(".paste-inside"),i=!!this.menu&&this.menu.querySelector(".unlink-doc");e&&(e.classList.contains("docs-post")&&"easydocs-welcome"!==e.textContent?(s&&s.classList.add("hidden"),i&&(i.classList.remove("cursor-not-allowed","text-gray-400"),i.classList.add("cursor-pointer","hover:bg-gray-200"))):(s&&s.classList.remove("hidden"),i&&(i.classList.add("cursor-not-allowed","text-gray-400"),i.classList.remove("cursor-pointer","hover:bg-gray-200"))),t.preventDefault(),this.contextItem=e,this.menu&&(this.menu.style.display="block",this.menu.style.left=t.clientX+"px",this.menu.style.top=t.clientY+"px"))})),this.docsInfo&&this.docsInfo.querySelector(".easy-docs-shortcopy").addEventListener("click",(e=>{e.preventDefault();const s=t.docsInfo.querySelector(".easy-docs-shortcode").textContent;s&&navigator.clipboard.writeText(s).then((()=>{const t=this.docsInfo.querySelector("#copy-indicator");t&&(t.classList.remove("hidden"),setTimeout((()=>{t.classList.add("hidden")}),1e3))})).catch((t=>{console.error("Failed to copy text: ",t)}))})),document.addEventListener("click",(function(e){const s=e.target;t.menu&&s!==t.menu&&!t.menu.contains(s)&&(t.menu.style.display="none",t.contextItem=!1,!t.activeItem||s===t.outline||t.outline.contains(s)||s===t.actionBtns||t.actionBtns.contains(s)||(t.activeItem.classList.remove("active-item"),t.activeItem.querySelectorAll(".bg-lime-700\\/10").forEach((t=>t.classList.remove("bg-lime-700/10"))),t.activeItem=null))})),this.menu&&this.menu.addEventListener("click",(function(e){const s=e.target;if("LI"!==s.nodeName)return void(t.contextItem=!1);if(!t.contextItem)return;const i=s.getAttribute("data-attr");t.menu.style.display="none","delete"===i?t.deleteOutlineItem(t.contextItem):"create-doc"===i?t.addOutlineItem("post",t.contextItem):"insert-doc"===i?t.showDocsList(t.contextItem):"unlink-doc"===i?t.unlinkDocument(t.contextItem):"create-outline"===i?t.addOutlineItem("folder",t.contextItem):"rename"===i?t.renameOutlineItem(t.contextItem):"cut"===i?t.cutcopyOutlineItem(t.contextItem,"cut"):"copy"===i?t.cutcopyOutlineItem(t.contextItem,"copy"):"paste-before"===i?t.pasteOutlineItem(t.contextItem,"insert_before"):"paste-after"===i?t.pasteOutlineItem(t.contextItem,"insert_after"):"paste-inside"===i&&t.pasteOutlineItem(t.contextItem,"inside")})),this.addOutlineBtn&&this.addOutlineBtn.addEventListener("click",(()=>{this.addOutlineItem("folder")})),this.addDocBtn&&this.addDocBtn.addEventListener("click",(()=>{this.addOutlineItem("post")})),this.insertDocBtn&&this.insertDocBtn.addEventListener("click",(()=>{this.showDocsList()})),this.unlinkBtn&&this.unlinkBtn.addEventListener("click",(()=>{this.unlinkDocument()})),this.delBtn&&this.delBtn.addEventListener("click",(()=>{this.deleteOutlineItem()})),this.collapseBtn&&this.collapseBtn.addEventListener("click",(()=>{this.collapseAll()})),this.modal&&(this.modal.addEventListener("click",(t=>{this.isModalOpen&&!t.target.closest(".easy-docs-modal-content")&&this.toggleModal()})),this.modal.addEventListener("keydown",(t=>{"Escape"===t.key&&this.toggleModal()}))))}updateCurrentProject(t){if(this.currentProject&&(this.currentProject===t||this.currentProject.contains(t)))return;let e=t.closest(".docs-outline-item");for(;e&&e.parentElement!==this.outline;)e=e.parentElement;e&&e.classList.contains("docs-folder")?this.currentProject=e:this.currentProject=null;const s=this.currentProject?this.currentProject.querySelector(".docs-outline-label"):null,i=s?s.textContent.trim():"",o=i?i.toLowerCase().replace(/[^a-z0-9]+/g,""):"";this.showMessage(i,o)}showMessage(t,e){t?this.docsInfo&&this.docsInfo.querySelectorAll(".easy-docs-message").forEach((t=>{if(t.classList.contains("easy-docs-info-project")){t.classList.remove("hidden");const i=s.i18n;t.querySelector("span").innerHTML="".concat(i.shortcode,': <strong class="easy-docs-shortcode">[easydocs doc="').concat(e,'"]</strong>')}else t.classList.add("hidden")})):this.docsInfo&&this.docsInfo.querySelectorAll(".easy-docs-message").forEach((t=>{t.classList.contains("easy-docs-info-wb")?t.classList.remove("hidden"):t.classList.add("hidden")}))}showDocsList(t=!1){if(this.toggleModal(),!this.isModalOpen)return;const e=s.posts,i=s.i18n,o=Object.keys(e),c=this.modal.querySelector(".easy-docs-modal-content");if(0===o.length)return void(c.innerHTML="No posts found");const n='<p class="mb-2 font-bold text-base">'.concat(i.select_doc,'</p>\n\t\t<div class="mb-1"><input type="text" class="easy-docs-modal-search w-full !border-gray-300" placeholder="').concat(i.search_docs,'..."></div>\n\t\t<ul class="easy-docs-all-docs border border-gray-300 rounded">\n\t\t\t').concat(o.map((t=>{const s=e[t];return s&&"easydocs-welcome"!==s.title?'<li class="mb-0" data-term="'.concat(s.title.toLowerCase(),'"><a class="easy-select-doc block max-w-full px-2 py-1 border-b border-gray-300" href="#" data-postid=').concat(s.id,">").concat(s.title,"</a></li>"):""})).join(""),"\n\t\t</ul>");c.innerHTML=n,c.querySelector(".easy-docs-modal-search").focus();const a=c.querySelector(".easy-docs-modal-search"),r=c.querySelector(".easy-docs-all-docs");["keyup","paste"].forEach((t=>{a.addEventListener(t,(t=>{const e=t.target.value.toLowerCase();r.querySelectorAll("li").forEach((t=>{const s=t.getAttribute("data-term");!e||s.includes(e)?t.style.display="block":t.style.display="none"}))}))})),r.addEventListener("click",(e=>{e.target.classList.contains("easy-select-doc")&&(e.preventDefault(),this.insertDoc(e.target.dataset.postid,e.target.textContent,t))}))}insertDoc(e,s,i){this.toggleModal(),i||(i=this.outline.querySelector(".active-item"));const o=i?i.closest(".docs-folder"):null;let c=o?o.querySelector("ul"):null;if(c||(c=this.outline),i&&i.classList.contains("docs-folder")){const t=i.querySelector("ul");if(t){t.classList.remove("hidden");const e=i.querySelector(".icon-right");e&&e.classList.add("rotate-90")}}const n=o?o.querySelector("span.truncate"):null;let a=n?n.className.match(/pl-\d+/):null,r="pl-4";if(a){let t=parseInt(a[0].replace("pl-",""));r="pl-".concat(t+2)}let l="";const d=document.createElement("li");d.classList.add("docs-outline-item","docs-post","mb-0","hover:cursor-pointer","new-item"),d.setAttribute("data-id",e),l='<span class="mr-1 text-slate-400">'.concat(t.get_icon("file-text")).concat(t.get_icon("loading","animate-spin easyhide"),"</span>"),d.innerHTML='\n\t\t\t<span class="block hover:bg-gray-300">\n\t\t\t\t<span class="block truncate py-1 text-sm pr-2 '.concat(r,'">\n\t\t\t\t\t').concat(l,'<span class="docs-outline-label">').concat(s,"</span>\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t\t"),c.classList.remove("hidden"),c.appendChild(d),d.classList.remove("new-item"),this.updateOutline(d)}toggleModal(){if(this.modal)if(this.modal.classList.contains("hidden"))this.modal.classList.remove("hidden"),this.isModalOpen=!0;else{const t=this.modal.querySelector(".easy-docs-modal-content");this.modal.classList.add("hidden"),this.isModalOpen=!1,t&&(t.innerHTML="")}}addOutlineItem(e,s=!1){s||(s=this.outline.querySelector(".active-item"));const i=s?s.closest(".docs-folder"):null;let o=i?i.querySelector("ul"):null;if(o||(o=this.outline),s&&s.classList.contains("docs-folder")){const t=s.querySelector("ul");if(t){t.classList.remove("hidden");const e=s.querySelector(".icon-right");e&&e.classList.add("rotate-90")}}const c=i?i.querySelector("span.truncate"):null;let n=c?c.className.match(/pl-\d+/):null,a="pl-4";if(n){let t=parseInt(n[0].replace("pl-",""));a="pl-".concat(t+2)}let r="",l="";const d="folder"===e?"docs-folder":"docs-post",u=document.createElement("li");u.classList.add("docs-outline-item",d,"mb-0","hover:cursor-pointer","new-item"),"folder"===e?(r='<span class="mr-1 text-slate-600">'.concat(t.get_icon("right")).concat(t.get_icon("loading","animate-spin easyhide"),"</span>"),l='<ul class="hidden"></ul>'):"post"===e&&(r='<span class="mr-1 text-slate-400">'.concat(t.get_icon("file-text")).concat(t.get_icon("loading","animate-spin easyhide"),"</span>")),u.innerHTML='\n\t\t\t<span class="block hover:bg-gray-300" href="#">\n\t\t\t\t<span class="block truncate py-1 text-sm pr-2 '.concat(a,'">\n\t\t\t\t\t').concat(r,'<input type="text" class="docs-input w-full text-slate-600 box-border" style="width: calc( 100% - 16px - 0.25rem );">\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t\t').concat(l,"\n\t\t\t"),o.classList.remove("hidden"),o.appendChild(u);const h=u.querySelector(".docs-input");h.focus(),h.addEventListener("blur",(()=>{this.handleFolderInput(u)}));const m=t=>{"Enter"===t.key||"Tab"===t.key?(u.classList.remove("new-item"),u.removeEventListener("keydown",m),this.handleFolderInput(u)):"Escape"===t.key&&u.remove()};u.addEventListener("keydown",m)}renameOutlineItem(t){if(!t)return;const e=t.querySelector(".docs-outline-label");if(!e)return;const s=e.textContent.trim();e.innerHTML='<input type="text" class="docs-input w-full text-slate-600 box-border" style="width: calc( 100% - 16px - 0.25rem );" value="'.concat(s,'">');const i=e.querySelector(".docs-input");i.focus(),i.addEventListener("blur",(()=>{e.innerHTML="".concat(s)})),i.addEventListener("keydown",(i=>{"Enter"===i.key||"Tab"===i.key?this.handleRenameInput(t,s):"Escape"===i.key&&(e.innerHTML="".concat(s))}))}unlinkDocument(t=!1){t||(t=this.outline.querySelector(".active-item")),t&&t.classList.contains("docs-post")&&(t.remove(),this.updateOutline())}deleteOutlineItem(t=!1){if(t||(t=this.outline.querySelector(".active-item")),t){let e=[];const s=this.currentProject&&this.currentProject===t;t.classList.contains("docs-post")?e=[t.getAttribute("data-id")]:t.querySelectorAll(".docs-post").forEach((t=>{e.push(t.getAttribute("data-id"))})),t.remove(),e.length>0?this.deletePost(e):this.updateOutline(),s&&(this.currentProject=null,this.setup())}}collapseAll(){const t=this.outline.querySelector(".active-item");t&&(t.classList.remove("active-item"),t.querySelectorAll(".bg-lime-700\\/10").forEach((t=>t.classList.remove("bg-lime-700/10")))),this.outline.querySelectorAll("ul").forEach((t=>{t.classList.add("hidden")})),this.outline.querySelectorAll(".rotate-90").forEach((t=>{t.classList.remove("rotate-90")}))}activateListItem(t){this.activeItem=t;const e=t.querySelector("span");if(e){const s=this.outline.querySelector(".active-item");s&&(s.classList.remove("active-item"),s.querySelectorAll(".bg-lime-700\\/10").forEach((t=>t.classList.remove("bg-lime-700/10")))),t.classList.add("active-item"),e.classList.add("bg-lime-700/10")}const s=t.querySelector("ul");if(s){const e=t.querySelector(".icon-right");e&&e.classList.toggle("rotate-90"),s.classList.toggle("hidden")}}cutcopyOutlineItem(t,e){this.pasteItem&&(this.pasteItem.classList.remove("text-gray-400"),this.pasteItem=!1),t&&(this.pasteContext=e,this.pasteItem=t,this.menu.querySelectorAll(".cutcopy-context").forEach((t=>{t.classList.remove("cursor-not-allowed","text-gray-400"),t.classList.add("cursor-pointer","hover:bg-gray-200","paste-context")})),"cut"===e&&t.classList.add("text-gray-400"))}pasteOutlineItem(t,e){if(!t||!this.pasteContext||!this.pasteItem)return;this.pasteItem.classList.remove("text-gray-400"),"copy"===this.pasteContext&&(this.pasteItem=this.pasteItem.cloneNode(!0));const s=t.querySelector(".block.truncate");let i=4;if(s){const t=s.className.match(/pl-\d+/);t&&(i=parseInt(t[0].replace("pl-","")))}"insert_before"===e?(this.adjustPadding(this.pasteItem,i),t.parentNode.insertBefore(this.pasteItem,t)):"insert_after"===e?(this.adjustPadding(this.pasteItem,i),t.nextSibling?t.parentNode.insertBefore(this.pasteItem,t.nextSibling):t.parentNode.appendChild(this.pasteItem)):"inside"===e&&(this.adjustPadding(this.pasteItem,i+2),t.querySelector("ul").appendChild(this.pasteItem)),"cut"===this.pasteContext&&(this.pasteContext=!1,this.pasteItem=!1,this.menu.querySelectorAll(".paste-context").forEach((t=>{t.classList.add("cursor-not-allowed","text-gray-400"),t.classList.remove("cursor-pointer","hover:bg-gray-200","paste-context")}))),this.updateOutline()}parseOutlineList(t){const e={};let s=0;return t.querySelectorAll(":scope > li").forEach((t=>{const i=t.querySelector("span:first-of-type"),o=i?i.textContent.trim():"",c=t.querySelector("ul");if(c)e[o]=this.parseOutlineList(c);else{const i=parseInt(t.getAttribute("data-id"),10);e["EasyDocs_"+s]=i,s++}})),e}async handleFolderInput(e){const s=e.querySelector(".docs-input"),i=s.value.trim();if(i)if(s.outerHTML='<span class="docs-outline-label">'.concat(i,"</span>"),e.classList.contains("docs-folder")){if(await this.updateOutline(e),e.parentElement&&"docs-outline"===e.parentElement.id){const s=e.querySelector("ul");if(s){s.classList.remove("hidden");const i=e.querySelector(".icon-right");i&&i.classList.add("rotate-90");const o=document.createElement("li");o.classList.add("docs-outline-item","docs-post","mb-0","hover:cursor-pointer","new-item");const c='<span class="mr-1 text-slate-400">'.concat(t.get_icon("file-text")).concat(t.get_icon("loading","animate-spin easyhide"),"</span>");o.innerHTML='\n\t\t\t\t\t\t\t<span class="block hover:bg-gray-300">\n\t\t\t\t\t\t\t\t<span class="block truncate py-1 text-sm pr-2 pl-6">\n\t\t\t\t\t\t\t\t\t'.concat(c,"<span>easydocs-welcome</span>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t"),s.classList.remove("hidden"),s.appendChild(o),o.classList.remove("new-item"),this.createNewDocument(o,"easydocs-welcome")}}}else e.classList.contains("docs-post")&&this.createNewDocument(e,i);else e.remove()}handleRenameInput(t,e){const s=t.querySelector(".docs-input").value.trim();s&&s!==e?(t.querySelector(".docs-outline-label").innerHTML="".concat(s),t.classList.contains("docs-folder")?this.updateOutline(t):t.classList.contains("docs-post")&&this.renameDocument(t,s)):t.querySelector(".docs-outline-label").innerHTML="".concat(e)}adjustPadding(t,e){const s=t.querySelector(".block.truncate");if(s){const t=s.className.match(/pl-\d+/);t&&(s.classList.remove(t[0]),s.classList.add("pl-".concat(e)))}const i=t.querySelector("ul");i&&i.querySelectorAll(":scope > li").forEach((t=>{this.adjustPadding(t,e+2)}))}async updateOutline(t=!1){const e=this.parseOutlineList(this.outline),i={action:"easy_docs_update_outline",security:s.security,outline:JSON.stringify(e)};this.addDocBtn.disabled=!0,this.insertDocBtn.disabled=!0,this.addOutlineBtn.disabled=!0,this.delBtn.disabled=!0,t&&(t.classList.contains("docs-folder")&&t.querySelector(".icon-right").classList.add("easyhide"),t.querySelector(".icon-loading").classList.remove("easyhide")),(await o.sendAjaxRequest(s.ajaxUrl,i,this.handleError.bind(this))).success?(this.addDocBtn.disabled=!1,this.insertDocBtn.disabled=!1,this.addOutlineBtn.disabled=!1,this.delBtn.disabled=!1,t&&(t.classList.contains("docs-folder")?t.querySelector(".icon-right").classList.remove("easyhide"):t.classList.contains("docs-post")&&t.querySelector(".icon-file-text").classList.remove("easyhide"),t.querySelector(".icon-loading").classList.add("easyhide"))):(this.addDocBtn.disabled=!1,this.insertDocBtn.disabled=!1,this.addOutlineBtn.disabled=!1,this.delBtn.disabled=!1,t&&t.remove())}async createNewDocument(t,e){if(!t||!e)return;const i={action:"easy_docs_create_document",security:s.security,postTitle:e};this.addDocBtn.disabled=!0,this.insertDocBtn.disabled=!0,this.addOutlineBtn.disabled=!0,t.querySelector(".icon-file-text").classList.add("easyhide"),t.querySelector(".icon-loading").classList.remove("easyhide");const c=await o.sendAjaxRequest(s.ajaxUrl,i,this.handleError.bind(this));if(c.success){const e=c.data.id;t.setAttribute("data-id",e),this.updateOutline(t)}else this.addDocBtn.disabled=!1,this.insertDocBtn.disabled=!1,this.addOutlineBtn.disabled=!1,t.remove()}async renameDocument(t,e){if(!t||!e)return;t.querySelector(".icon-file-text").classList.add("easyhide"),t.querySelector(".icon-loading").classList.remove("easyhide");const i={action:"easy_docs_rename_document",security:s.security,postId:t.getAttribute("data-id"),postTitle:e};(await o.sendAjaxRequest(s.ajaxUrl,i,this.handleError.bind(this))).success&&this.updateOutline(t)}async deletePost(t){const e={action:"easy_docs_delete_document",security:s.security,postIds:JSON.stringify(t)};(await o.sendAjaxRequest(s.ajaxUrl,e,this.handleError.bind(this))).success&&(this.updateOutline(),t.forEach((t=>{this.editor.closeTab(t,!0)})))}handleError(t){console.log(t)}},n=class{constructor(){this.isFresh=!0,this.activeEditor=!1,this.isInitiated=!1,this.isSettingContent=!1,this.editorData={},this.outline=document.querySelector("#docs-outline"),this.outline&&(this.tabs=document.querySelector("#docs-tabs"),this.tabContent=document.querySelector("#docs-tab-content"),this.saveDocBtn=document.querySelector("#easy-save-doc"),this.events())}events(){const t=this;this.outline&&this.outline.addEventListener("click",(e=>{if(e.target.classList.contains("docs-input"))return;const s=e.target.closest(".docs-outline-item");s&&s.classList.contains("docs-post")&&t.openEditor(s)})),this.tabs&&this.tabs.addEventListener("click",(e=>{if(e.target.closest(".docs-tab-label")){e.preventDefault();const s=e.target.closest(".docs-tab");if(s.classList.contains("active-tab"))return;const i=s.getAttribute("data-id");t.activateEditor(i)}else if(e.target.closest(".docs-tab-close")){e.preventDefault();const s=e.target.closest(".docs-tab").getAttribute("data-id");t.closeTab(s)}})),this.saveDocBtn&&this.saveDocBtn.addEventListener("click",(e=>{t.saveDocument()}))}initiateEditor(){const t=this.tabContent.querySelector(".dpc-welcome"),e=this.tabContent.querySelector(".dpc-editor");t&&e&&(t.classList.add("hidden"),e.classList.remove("sr-only"))}resetEditor(){const t=this.tabContent.querySelector(".dpc-welcome"),e=this.tabContent.querySelector(".dpc-editor");t&&e&&(t.classList.remove("hidden"),e.classList.add("sr-only")),this.isFresh=!0,this.activeEditor=!1}openEditor(t){const e=t.getAttribute("data-id");if(!e)return;const s="docs-tab-".concat(e);s!==this.activeEditor&&(this.tabs&&this.tabs.querySelector("#".concat(s))?this.activateEditor(e):this.createNewTab(e,"easydocs-welcome"===t.textContent.trim()))}activateEditor(t){const e="docs-tab-".concat(t),s=!!this.tabs&&this.tabs.querySelector("#".concat(e)),i=this.editorData?.[e]?.[0]??"";s&&(this.tabs.querySelectorAll(".active-tab").forEach((t=>t.classList.remove("active-tab","bg-gray-100"))),s.classList.add("active-tab","bg-gray-100"),this.activeEditor!==e&&this.modifyEditorContent(t,i))}closeTab(t,e){const s="docs-tab-".concat(t),i=!!this.tabs&&this.tabs.querySelector("#".concat(s));if(i){if(this.editorData[s][1]&&!e&&!confirm("There are unsaved changes. Are you sure you want to close?"))return;if(i.remove(),this.activeEditor===s){const t=!!this.tabs&&this.tabs.querySelector(".docs-tab");t?this.activateEditor(t.getAttribute("data-id")):this.resetEditor()}}}async createNewTab(e,i){const c={action:"easy_docs_get_document",security:s.security,postId:e},n=await o.sendAjaxRequest(s.ajaxUrl,c,this.handleError.bind(this));if(!n.success||!n.data)return;const a=n.data.title;let r=n.data.content;if(r)r=t.normalize_html(r);else if(i){const t=s.i18n;r="<h3>".concat(t.welcome[0],"</h3><p>").concat(t.welcome[1],"</p><p><b><i>").concat(t.welcome[2],"</i></b></p><p>").concat(t.welcome[3],"</p>")}const l=document.createElement("div");if(l.id="docs-tab-".concat(e),l.setAttribute("data-id",e),l.classList.add("docs-tab","flex","items-center","m-1","mr-0","cursor-pointer","min-w-32","max-w-52","justify-between"),l.innerHTML='<a href="#" class="docs-tab-label text-gray-500 text-sm truncate px-4 py-2">'.concat(a,'</a><a href="#" class="docs-tab-close px-4 py-2 text-gray-500 hover:text-red-400">').concat(t.get_icon("close","tab-close"),"</a>"),this.tabs&&(this.tabs.appendChild(l),this.editorData["docs-tab-".concat(e)]=[r,!1],this.modifyEditorContent(e,r),this.activateEditor(e),this.isFresh&&(this.initiateEditor(),this.isFresh=!1),!this.isInitiated)){const t=tinymce.get("docs-post-content");t&&(t.on("change",(()=>{this.isSettingContent||(this.editorData[this.activeEditor][1]=!0)})),this.isInitiated=!0)}}async saveDocument(){const{content:t,isDirty:e}=this.editorData[this.activeEditor],i="docs-post-content",c=this.tabContent.querySelector("#".concat(i));if(!c)return;let n="";if("text"==(null===c.offsetParent?"visual":"text"))n=c.value;else{const t=tinymce.get(i);if(!t)return;n=t.getContent()}const a=this.activeEditor.replace("docs-tab-","");if(n===t)return;this.saveDocBtn.disabled=!0;const r={action:"easy_docs_update_document",security:s.security,postId:a,content:n};(await o.sendAjaxRequest(s.ajaxUrl,r,this.handleError.bind(this))).success&&(this.saveDocBtn.disabled=!1,this.editorData[this.activeEditor][0]=n,this.editorData[this.activeEditor][1]=!1)}modifyEditorContent(t,e){const s="docs-post-content",i=document.getElementById(s),o=tinymce.get(s),c=null!==i.offsetParent;if(this.activeEditor&&tinymce.activeEditor&&this.editorData[this.activeEditor][1])if(c){const t=i.value;this.editorData[this.activeEditor]=[t,!0]}else{o.save();const t=o.getContent();this.editorData[this.activeEditor]=[t,!0]}this.isSettingContent=!0,c?i.value=e:o.setContent(e),this.isSettingContent=!1,this.activeEditor="docs-tab-".concat(t)}handleError(t){console.log(t)}},a=class{constructor(){this.outline=document.querySelector("#docs-stats-filter-outline"),this.outline&&(this.table=document.querySelector("#easydocs-stats-table"),this.collapseBtn=document.querySelector("#easy-collapse-all"),this.activeItem=null,this.events())}events(){const t=this;this.outline.addEventListener("click",(e=>{const s=e.target.closest(".docs-outline-item");s&&(e.preventDefault(),e.stopPropagation(),t.activateListItem(s),t.filterList(s))})),this.collapseBtn&&this.collapseBtn.addEventListener("click",(()=>{this.collapseAll()})),this.table&&this.table.querySelectorAll(".easydocs-table-sort").forEach((t=>{t.addEventListener("click",(()=>{const e=t.getAttribute("data-column");this.sortTable(e)}))}))}collapseAll(){const t=this.outline.querySelector(".active-item");t&&(t.classList.remove("active-item"),t.querySelectorAll(".bg-lime-700\\/10").forEach((t=>t.classList.remove("bg-lime-700/10")))),this.outline.querySelectorAll("ul").forEach((t=>{t.classList.add("hidden")})),this.outline.querySelectorAll(".rotate-90").forEach((t=>{t.classList.remove("rotate-90")})),this.table.querySelectorAll(".easydocs-stats-items tr").forEach((t=>{t.classList.remove("hidden")}))}activateListItem(t){this.activeItem=t;const e=t.querySelector("span");if(e){const s=this.outline.querySelector(".active-item");s&&(s.classList.remove("active-item"),s.querySelectorAll(".bg-lime-700\\/10").forEach((t=>t.classList.remove("bg-lime-700/10")))),t.classList.add("active-item"),e.classList.add("bg-lime-700/10")}const s=t.querySelector("ul");if(s){const e=t.querySelector(".icon-right");e&&e.classList.toggle("rotate-90"),s.classList.toggle("hidden")}}filterList(t){let e=t.getAttribute("data_ids");e=e.split(","),e.length>0?this.table.querySelectorAll(".easydocs-stats-items tr").forEach((t=>{const s=t.getAttribute("data-id");e.indexOf(s)>-1?t.classList.remove("hidden"):t.classList.add("hidden")})):this.table.querySelectorAll(".easydocs-stats-items tr").forEach((t=>{t.classList.add("hidden")}))}sortTable(t){t=parseInt(t);const e=this.table.querySelector("tbody"),s=Array.from(e.querySelectorAll("tr")),i="desc"===this.table.dataset.sortOrder?"asc":"desc";this.table.dataset.sortOrder=i,s.sort(((e,s)=>{const o=e.querySelector("td:nth-child(".concat(t,")")).textContent.trim(),c=s.querySelector("td:nth-child(".concat(t,")")).textContent.trim();return 2!==t&&3!==t&&4!==t||isNaN(parseFloat(o))||isNaN(parseFloat(c))?(console.log(t),"asc"===i?o.localeCompare(c):c.localeCompare(o)):function(t,e){const s=parseFloat(t),o=parseFloat(e);return"asc"===i?s-o:o-s}(o,c)})),s.forEach((t=>e.appendChild(t)))}handleError(t){console.log(t)}},r=class{constructor(){this.settings=document.querySelector("#easydocs-settings"),this.settings&&(this.form=this.settings.querySelector("#easydocs-admin-settings"),this.submit=this.settings.querySelector("#easydocs-admin-settings_save"),this.events())}events(){this.submit&&this.submit.addEventListener("click",(t=>{const e=this.form.querySelectorAll(".easydocs-option"),s={};e.forEach((t=>{let e;const i=t.querySelector("input, select"),o=t.getAttribute("data-setting");o&&i&&(e="checkbox"===i.type?i.checked?"yes":"no":i.value,s[o]=e)})),this.submit.disabled=!0,this.sendSettings(s)}))}async sendSettings(t){const e={action:"easy_docs_update_settings",security:s.security,settings:JSON.stringify(t)},i=await o.sendAjaxRequest(s.ajaxUrl,e,this.handleError.bind(this));this.submit.disabled=!1,i.success&&location.reload()}handleError(t){console.log(t)}};document.addEventListener("DOMContentLoaded",(()=>{const t=new n;new c(t),new a,new r}))})();
  • easy-docs/trunk/admin/js/partials/explorer.js

    r3240911 r3246256  
    491491        docsInput.focus();
    492492        docsInput.addEventListener('blur', () => {
    493             newItem.remove();
     493            // newItem.remove();
     494            this.handleFolderInput(newItem);
    494495        });
    495496
  • easy-docs/trunk/easy-docs.php

    r3240911 r3246256  
    1515 * Plugin URI:        https://easyprolabs.com/easy-docs
    1616 * Description:       Create simple ajax documentation for your product
    17  * Version:           1.3.0
     17 * Version:           1.4.0
    1818 * Author:            easyprolabs
    1919 * Author URI:        https://easyprolabs.com
     
    3030
    3131// Currently plugin version.
    32 define( 'EASY_DOCS_VERSION', '1.3.0' );
     32define( 'EASY_DOCS_VERSION', '1.4.0' );
    3333
    3434// Define plugin constants.
  • easy-docs/trunk/includes/functions/class-getters.php

    r3240911 r3246256  
    149149        return apply_filters(
    150150            'easydocs_admin_settings', array(
    151                 array(
     151                'general' => array(
    152152                    'label' => esc_html__( 'General Options', 'easy-docs' ),
    153                     'items' => array(
    154                         'easydocs_analytics' => array(
    155                             'label'   => esc_html__( 'Enable easy docs analytics.', 'easy-docs' ),
    156                             'setting' => 'easydocs_analytics',
    157                             'desc'    => esc_html__( 'Enable collecting easy docs analytics.', 'easy-docs' ),
    158                             'link'    => '',
    159                             'type'    => 'checkbox',
    160                             'default' => 'yes',
    161                         ),
    162                         'easydocs_feedback' => array(
    163                             'label'   => esc_html__( 'Enable easy docs user feedback.', 'easy-docs' ),
    164                             'setting' => 'easydocs_feedback',
    165                             'desc'    => esc_html__( 'Enable collecting easy docs user feedback for documents.', 'easy-docs' ),
    166                             'link'    => '',
    167                             'type'    => 'checkbox',
    168                             'default' => 'yes',
    169                         ),
    170                         'easydocs_admin_email'  => array(
    171                             'label'   => esc_html__( 'Admin Email to Receive Feedback.', 'easy-docs' ),
    172                             'setting' => 'easydocs_admin_email',
    173                             'desc'    => esc_html__( 'Leave it empty to receive feedback on your website\'s default admin email.', 'easy-docs' ),
    174                             'link'    => '',
    175                             'type'    => 'email',
    176                             'default' => '',
    177                         ),
    178                     ),
     153                    'items' => array(),
    179154                ),
    180155            )
Note: See TracChangeset for help on using the changeset viewer.