web-mojo 2.1.1043 → 2.1.1087
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -16
- package/dist/admin.cjs.js +1 -1
- package/dist/admin.cjs.js.map +1 -1
- package/dist/admin.es.js +16 -14
- package/dist/admin.es.js.map +1 -1
- package/dist/auth.cjs.js +1 -1
- package/dist/auth.cjs.js.map +1 -1
- package/dist/auth.css +305 -266
- package/dist/auth.es.js +537 -2175
- package/dist/auth.es.js.map +1 -1
- package/dist/charts.cjs.js +1 -1
- package/dist/charts.cjs.js.map +1 -1
- package/dist/charts.css +319 -0
- package/dist/charts.es.js +555 -2
- package/dist/charts.es.js.map +1 -1
- package/dist/chunks/ChatView-BnC15uoD.js +2 -0
- package/dist/chunks/{ChatView-CGBaudUc.js.map → ChatView-BnC15uoD.js.map} +1 -1
- package/dist/chunks/{ChatView-DguKw-gR.js → ChatView-D-5lHZ5H.js} +7 -8
- package/dist/chunks/{ChatView-DguKw-gR.js.map → ChatView-D-5lHZ5H.js.map} +1 -1
- package/dist/chunks/{Collection-DD1_31eh.js → Collection-B64LJ92k.js} +2 -2
- package/dist/chunks/{Collection-DD1_31eh.js.map → Collection-B64LJ92k.js.map} +1 -1
- package/dist/chunks/{Collection-YRfGoT73.js → Collection-CsAk0UhA.js} +2 -2
- package/dist/chunks/{Collection-YRfGoT73.js.map → Collection-CsAk0UhA.js.map} +1 -1
- package/dist/chunks/ContextMenu-CfMAB33c.js +3 -0
- package/dist/chunks/ContextMenu-CfMAB33c.js.map +1 -0
- package/dist/chunks/{ContextMenu-B4_YS0G8.js → ContextMenu-Cvls3QC_.js} +350 -3
- package/dist/chunks/ContextMenu-Cvls3QC_.js.map +1 -0
- package/dist/chunks/DataView-DESqBxT-.js +2 -0
- package/dist/chunks/DataView-DESqBxT-.js.map +1 -0
- package/dist/chunks/{DataView-OUqaLmGB.js → DataView-QXyfcg2M.js} +3 -2
- package/dist/chunks/DataView-QXyfcg2M.js.map +1 -0
- package/dist/chunks/Dialog-BfXN-fFA.js +2 -0
- package/dist/chunks/Dialog-BfXN-fFA.js.map +1 -0
- package/dist/chunks/{Dialog-BiVgKzSK.js → Dialog-DHUsZ92-.js} +1375 -7
- package/dist/chunks/Dialog-DHUsZ92-.js.map +1 -0
- package/dist/chunks/{FormView-BClEkzmE.js → FormView-DGRmcKUG.js} +282 -123
- package/dist/chunks/FormView-DGRmcKUG.js.map +1 -0
- package/dist/chunks/FormView-KGvr68ju.js +3 -0
- package/dist/chunks/FormView-KGvr68ju.js.map +1 -0
- package/dist/chunks/{ListView-BMNhd5-B.js → ListView-BGJG4GYH.js} +3 -3
- package/dist/chunks/{ListView-BMNhd5-B.js.map → ListView-BGJG4GYH.js.map} +1 -1
- package/dist/chunks/{ListView-BRGiITfD.js → ListView-BpGEatee.js} +2 -2
- package/dist/chunks/{ListView-BRGiITfD.js.map → ListView-BpGEatee.js.map} +1 -1
- package/dist/chunks/{MetricsMiniChartWidget-CCroU6BZ.js → MetricsMiniChartWidget-BKbFGvXG.js} +4 -4
- package/dist/chunks/{MetricsMiniChartWidget-CCroU6BZ.js.map → MetricsMiniChartWidget-BKbFGvXG.js.map} +1 -1
- package/dist/chunks/MetricsMiniChartWidget-BNdGuSZV.js +2 -0
- package/dist/chunks/{MetricsMiniChartWidget-Esvv-lFp.js.map → MetricsMiniChartWidget-BNdGuSZV.js.map} +1 -1
- package/dist/chunks/{PDFViewer-NeL91Gon.js → PDFViewer-BIBNhuWY.js} +3 -3
- package/dist/chunks/{PDFViewer-NeL91Gon.js.map → PDFViewer-BIBNhuWY.js.map} +1 -1
- package/dist/chunks/{PDFViewer-D4uo3oiA.js → PDFViewer-nZAQQScE.js} +2 -2
- package/dist/chunks/{PDFViewer-D4uo3oiA.js.map → PDFViewer-nZAQQScE.js.map} +1 -1
- package/dist/chunks/Rest-BpDyhFfG.js +2 -0
- package/dist/chunks/Rest-BpDyhFfG.js.map +1 -0
- package/dist/chunks/{Rest-CS4jRCAs.js → Rest-DpbPbmra.js} +96 -5
- package/dist/chunks/Rest-DpbPbmra.js.map +1 -0
- package/dist/chunks/TokenManager-BWc_pRpg.js +2 -0
- package/dist/chunks/TokenManager-BWc_pRpg.js.map +1 -0
- package/dist/chunks/{TopNav-DC8oGpHp.js → TokenManager-N3e5wDu1.js} +369 -6
- package/dist/chunks/TokenManager-N3e5wDu1.js.map +1 -0
- package/dist/chunks/{WebSocketClient-D-5DJoMX.js → WebSocketClient-DghNkEyO.js} +2 -2
- package/dist/chunks/{WebSocketClient-D-5DJoMX.js.map → WebSocketClient-DghNkEyO.js.map} +1 -1
- package/dist/chunks/{WebSocketClient-DzcqAmho.js → WebSocketClient-E08hfP5f.js} +2 -2
- package/dist/chunks/{WebSocketClient-DzcqAmho.js.map → WebSocketClient-E08hfP5f.js.map} +1 -1
- package/dist/chunks/version-CKPqwcQJ.js +2 -0
- package/dist/chunks/version-CKPqwcQJ.js.map +1 -0
- package/dist/chunks/version-Dtwh-YkD.js +38 -0
- package/dist/chunks/version-Dtwh-YkD.js.map +1 -0
- package/dist/css/web-mojo.css +1 -17
- package/dist/docit.cjs.js +1 -1
- package/dist/docit.cjs.js.map +1 -1
- package/dist/docit.es.js +6 -8
- package/dist/docit.es.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +34 -36
- package/dist/index.es.js.map +1 -1
- package/dist/lightbox.cjs.js +1 -1
- package/dist/lightbox.cjs.js.map +1 -1
- package/dist/lightbox.es.js +5 -4
- package/dist/lightbox.es.js.map +1 -1
- package/dist/map.cjs.js +1 -1
- package/dist/map.cjs.js.map +1 -1
- package/dist/map.es.js +82 -3
- package/dist/map.es.js.map +1 -1
- package/dist/timeline.cjs.js +1 -1
- package/dist/timeline.es.js +4 -4
- package/package.json +1 -1
- package/dist/chunks/ChatView-CGBaudUc.js +0 -2
- package/dist/chunks/ContextMenu-B4_YS0G8.js.map +0 -1
- package/dist/chunks/ContextMenu-DcLhcYMp.js +0 -3
- package/dist/chunks/ContextMenu-DcLhcYMp.js.map +0 -1
- package/dist/chunks/DataView-CdDY9ijM.js +0 -2
- package/dist/chunks/DataView-CdDY9ijM.js.map +0 -1
- package/dist/chunks/DataView-OUqaLmGB.js.map +0 -1
- package/dist/chunks/Dialog-BiVgKzSK.js.map +0 -1
- package/dist/chunks/Dialog-DmIPK_Bi.js +0 -2
- package/dist/chunks/Dialog-DmIPK_Bi.js.map +0 -1
- package/dist/chunks/FormView-BClEkzmE.js.map +0 -1
- package/dist/chunks/FormView-nulck4nL.js +0 -3
- package/dist/chunks/FormView-nulck4nL.js.map +0 -1
- package/dist/chunks/MetricsMiniChartWidget-Esvv-lFp.js +0 -2
- package/dist/chunks/Page-CvbwEoLv.js +0 -2
- package/dist/chunks/Page-CvbwEoLv.js.map +0 -1
- package/dist/chunks/Page-Deq4y2Kq.js +0 -351
- package/dist/chunks/Page-Deq4y2Kq.js.map +0 -1
- package/dist/chunks/Rest-BNYqGlnP.js +0 -2
- package/dist/chunks/Rest-BNYqGlnP.js.map +0 -1
- package/dist/chunks/Rest-CS4jRCAs.js.map +0 -1
- package/dist/chunks/TokenManager-CAZNcCMs.js +0 -366
- package/dist/chunks/TokenManager-CAZNcCMs.js.map +0 -1
- package/dist/chunks/TokenManager-CJBYcVqs.js +0 -2
- package/dist/chunks/TokenManager-CJBYcVqs.js.map +0 -1
- package/dist/chunks/TopNav-23B5R-dl.js +0 -2
- package/dist/chunks/TopNav-23B5R-dl.js.map +0 -1
- package/dist/chunks/TopNav-DC8oGpHp.js.map +0 -1
- package/dist/chunks/WebApp-C1vcdSuu.js +0 -1388
- package/dist/chunks/WebApp-C1vcdSuu.js.map +0 -1
- package/dist/chunks/WebApp-CpxtmTk0.js +0 -2
- package/dist/chunks/WebApp-CpxtmTk0.js.map +0 -1
package/dist/docit.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./chunks/WebApp-CpxtmTk0.js"),e=require("./chunks/TopNav-23B5R-dl.js"),o=require("./chunks/Rest-BNYqGlnP.js"),i=require("./chunks/Page-CvbwEoLv.js"),s=require("./chunks/ContextMenu-DcLhcYMp.js"),a=require("./chunks/Collection-DD1_31eh.js"),n=require("./chunks/TokenManager-CJBYcVqs.js");class DocNavSidebar extends o.View{constructor(t={}){super({className:"docit-sidebar-nav",tagName:"nav",...t}),this.singleBookMode=t.singleBookMode||!1,this.books=t.books,this.docPages=t.docPages,this.activeUser=t.activeUser,this.currentBook=null,this.currentDocPage=null}async onInit(){await super.onInit(),this.getApp().events.on("page:show",this._onPageShow.bind(this))}async _onPageShow({query:t}){const e=t.doc_book,o=t.doc_page,i=this.getApp();if(e){const t=this.books.findWhere({slug:e});!t||this.currentBook&&this.currentBook.id===t.id||(await i.setActiveBook(t),this.currentBook=i.currentBook)}else this.currentBook&&(await i.setActiveBook(null),this.currentBook=null);this.currentDocPage=o?this.docPages.findWhere({slug:o}):null,this.render()}getTemplate(){return'\n <div class="docit-nav-body pt-3">\n {{#currentBook}}\n {{#docPages.models}}\n <a href="#" class="docit-page-link {{#isActive}}active{{/isActive}}"\n data-action="select-page" data-page-slug="{{slug}}">\n <i class="{{#metadata.icon}}{{metadata.icon}}{{/metadata.icon}}{{^metadata.icon}}bi bi-file-earmark-text{{/metadata.icon}} me-2"></i>\n <span>{{title|capitalize}}</span>\n </a>\n {{/docPages.models}}\n {{^docPages.models}}\n <div class="docit-nav-empty"><p>No pages in this book.</p></div>\n {{/docPages.models}}\n {{/currentBook}}\n {{^currentBook}}\n {{#books.models}}\n <a href="#" class="docit-book-item" data-action="select-book" data-book-slug="{{slug}}">\n <i class="bi bi-book me-2"></i>\n <span class="book-title">{{title}}</span>\n <span class="badge bg-secondary ms-auto">{{page_count}}</span>\n </a>\n {{/books.models}}\n {{/currentBook}}\n </div>\n {{#currentBook}}\n <div class="docit-nav-footer">\n {{#canEdit}}\n <button class="btn btn-link w-100 mb-2" data-action="create-page">\n <i class="bi bi-plus-circle me-2"></i>\n Create New Page\n </button>\n {{/canEdit}}\n <button class="btn btn-link w-100" data-action="back-to-books">\n <i class="bi bi-arrow-left me-2"></i>\n Back to Books\n </button>\n </div>\n {{/currentBook}}\n {{^currentBook}}\n {{#canEdit}}\n <div class="docit-nav-footer">\n <button class="btn btn-link w-100" data-action="create-book">\n <i class="bi bi-plus-circle me-2"></i>\n Create New Book\n </button>\n </div>\n {{/canEdit}}\n {{/currentBook}}\n '}async onBeforeRender(){await super.onBeforeRender(),this.canEdit=this.getApp().canEdit(),this.docPages&&this.currentDocPage&&this.docPages.forEach(t=>{t.isActive=t.id===this.currentDocPage.id})}async onActionSelectBook(t,e){t.preventDefault();const o=e.dataset.bookSlug,i=this.books.findWhere({slug:o});if(i){await this.getApp().setActiveBook(i);const t=this.docPages.at(0),e={doc_book:i.get("slug")};t&&(e.doc_page=t.get("slug")),this.getApp().showPage("docs",e,{})}}onActionSelectPage(t,e){t.preventDefault();const o=e.dataset.pageSlug;this.currentBook&&o&&this.getApp().showPage("docs",{doc_book:this.currentBook.get("slug"),doc_page:o},{})}async onActionBackToBooks(t,e){t.preventDefault(),await this.getApp().setActiveBook(null),this.getApp().showPage("home")}async onActionCreateBook(){await this.getApp().createNewBook()}async onActionCreatePage(){this.currentBook&&await this.getApp().createNewPage(this.currentBook)}setBooks(t){this.books=t,this.render()}setDocPages(t){this.docPages=t,this.render()}setCurrentBook(t){this.currentBook=t,this.render(),this.getApp().topnav&&(t?this.getApp().topnav.setBrand(t.get("title")):this.getApp().topnav.setBrand("Documentation"))}setUser(t){this.activeUser=t,this.render()}}class DocHomePage extends i.Page{constructor(t={}){super({pageName:"home",title:"Documentation",className:"docit-home-page",...t})}async getTemplate(){return'\n <div class="docit-empty-state vh-100 d-flex flex-column align-items-center justify-content-center">\n <i class="bi bi-collection" style="font-size: 4rem;"></i>\n <h3 class="mt-4">Welcome to the Documentation Portal</h3>\n <p class="text-muted">Please select a book from the sidebar to get started.</p>\n </div>\n '}}class DocitBook extends a.Model{static endpoint="/api/docit/book";buildUrl(t=null){return this.get("slug")&&!this.id?`/api/docit/book/slug/${this.get("slug")}`:this.id?`/api/docit/book/${this.id}`:this.endpoint}}class DocitBookList extends a.Collection{constructor(t={}){super({ModelClass:DocitBook,endpoint:"/api/docit/book",...t})}parse(t){return t.data&&t.data.status?(this.meta={...this.meta,total:t.data.count||0,graph:t.data.graph},t.data.data||[]):super.parse(t)}}class DocitPage extends a.Model{static endpoint="/api/docit/page";buildUrl(t=null){return this.get("slug")&&!this.id?`/api/docit/page/slug/${this.get("slug")}`:this.id?`/api/docit/page/${this.id}`:this.endpoint}}class DocitPageList extends a.Collection{constructor(t={}){super({ModelClass:DocitPage,endpoint:"/api/docit/page",...t})}parse(t){return t.data&&t.data.status?(this.meta={...this.meta,total:t.data.count||0,graph:t.data.graph,book:t.data.book},t.data.data||[]):super.parse(t)}}class DocPage extends i.Page{constructor(t={}){super({pageName:"docs",title:"Documentation",className:"docit-page",...t}),this.bookModel=null,this.model=null}async onInit(){await super.onInit(),this.pageContextMenu=new s.ContextMenu({config:this.getPageContextMenuConfig(),containerId:"page-context-menu"}),this.addChild(this.pageContextMenu)}getPageContextMenuConfig(){return{icon:"bi-three-dots",buttonClass:"btn btn-outline-secondary btn-sm",items:[{label:"View History",action:"view-history",icon:"bi-clock-history"},{type:"divider"},{label:"Edit Page Content",action:"edit-page",icon:"bi-pencil"},{label:"Edit Page Info",action:"edit-page-info",icon:"bi-list-ol"},{type:"divider"},{label:"Edit Book Info",action:"edit-book",icon:"bi-book"},{type:"divider"},{label:"Delete Page",action:"delete-page",icon:"bi-trash",danger:!0}]}}async getTemplate(){return'\n <div class="docit-page-container position-relative">\n {{#loading}}\n <div class="docit-loading">\n <div class="spinner-border" role="status">\n <span class="visually-hidden">Loading...</span>\n </div>\n </div>\n {{/loading}}\n\n {{^loading}}\n {{#model|bool}}\n <div class="docit-page-toolbar">\n <div class="row">\n <div class="col d-flex justify-content-end">\n <div data-container="page-context-menu"></div>\n </div>\n </div>\n </div>\n <article class="docit-page-content">\n {{{model.html}}}\n </article>\n\n <nav class="docit-page-nav">\n {{#prevPage}}\n <a href="#" class="docit-nav-prev" data-action="navigate-to-page" data-page-slug="{{slug}}">\n <i class="bi bi-arrow-left"></i>\n <div>\n <small>Previous</small>\n <span>{{title}}</span>\n </div>\n </a>\n {{/prevPage}}\n {{^prevPage}}\n <div></div>\n {{/prevPage}}\n\n {{#nextPage}}\n <a href="#" class="docit-nav-next" data-action="navigate-to-page" data-page-slug="{{slug}}">\n <div>\n <small>Next</small>\n <span>{{title}}</span>\n </div>\n <i class="bi bi-arrow-right"></i>\n </a>\n {{/nextPage}}\n\n <div class="my-3">\n <span class="text-muted">Last updated: {{model.modified|datetime}}</span>\n </div>\n </nav>\n {{/model|bool}}\n\n {{^model|bool}}\n <div class="docit-empty-state">\n <i class="bi bi-file-earmark-text"></i>\n <h3>Select a page</h3>\n <p>Choose a page from the sidebar to view its content.</p>\n </div>\n {{/model|bool}}\n {{/loading}}\n </div>\n '}async onParams(t={},e={}){await super.onParams(t,e),this.loading=!0,await this.render();const o=this.getApp(),i=o.bookSlug||e.doc_book,s=e.doc_page;if(i)try{if(i){if(!o.currentBook||o.currentBook.get("slug")!==i){const t=new DocitBook({slug:i});await t.fetch(),await o.setActiveBook(t)}if(this.bookModel=o.currentBook,s)this.model=new DocitPage({slug:s}),await this.model.fetch({graph:"html"});else{const t=o.docPages.at(0);t?(this.model=new DocitPage({id:t.id}),await this.model.fetch({graph:"html"})):this.model=null}}else this.bookModel=null,this.model=null;this.canEdit=o.canEdit(),this.setupNavigation()}catch(a){console.error("Failed to load page:",a),this.showError("Failed to load documentation page"),this.model=null}finally{this.loading=!1,await this.render(),o.events.emit("docit:page-rendered",{book:this.bookModel,page:this.model})}else setTimeout(()=>{o.showPage("home")},100)}setupNavigation(){if(!this.model)return this.prevPage=null,void(this.nextPage=null);const t=this.getApp().docPages.models,e=t.findIndex(t=>t.id===this.model.id);this.prevPage=e>0?{slug:t[e-1].get("slug"),title:t[e-1].get("title")}:null,this.nextPage=e<t.length-1?{slug:t[e+1].get("slug"),title:t[e+1].get("title")}:null}async onActionNavigateToPage(t,e){t.preventDefault();const o=e.dataset.pageSlug;o&&this.getApp().showPage("docs",{},{doc_book:this.bookModel.get("slug"),doc_page:o})}async onActionEditPage(t,e){t.preventDefault(),this.model&&this.getApp().showPage("edit",{id:this.model.id,doc_book:this.bookModel.get("slug"),doc_page:this.model.get("slug")},{})}async onActionViewHistory(t,e){this.showInfo("Revision history coming soon.")}async onActionEditPageInfo(t,e){this.model&&this.getApp().showModelForm({model:this.model,fields:[{label:"Title",name:"title",type:"text"},{label:"Order Priority",name:"order_priority"},{label:"Slug",name:"slug"}]})}async onActionEditBook(t,e){if(this.model){const t=this.getApp().sidebar.currentBook;if(!t)return;this.getApp().showModelForm({model:t,fields:[{label:"Title",name:"title",type:"text"},{label:"Order Priority",name:"order_priority"},{label:"Slug",name:"slug"},{label:"Is Active",name:"is_active",type:"switch"}]})}}async onActionDeletePage(t,e){if(this.model&&await this.getApp().showConfirm({title:"Delete Page",body:`Are you sure you want to delete "${this.model.get("title")}"?`,confirmText:"Delete",confirmClass:"btn-danger"})){await this.model.destroy(),this.showSuccess("Page deleted."),await this.getApp().setActiveBook(this.bookModel);const t=this.getApp().docPages.at(0);t?this.getApp().showPage("docs",{},{doc_book:this.bookModel.get("slug"),doc_page:t.get("slug")}):this.getApp().showPage("docs",{},{doc_book:this.bookModel.get("slug")})}}async onAfterRender(){await super.onAfterRender(),"undefined"!=typeof Prism&&this.model&&Prism.highlightAll()}}class DocEditPage extends i.Page{constructor(t={}){super({pageName:"edit",title:"Edit Page",className:"docit-edit-page",...t}),this.model=null,this.editor=null,this.isDirty=!1}async getTemplate(){return'\n <div class="docit-edit-container vh-100">\n {{#loading}}\n <div class="docit-loading"><div class="spinner-border"></div></div>\n {{/loading}}\n\n {{^loading}}{{#model}}\n <header class="docit-edit-header">\n <div class="docit-edit-title-row">\n <h2>Editing: {{model.title}}</h2>\n <div class="docit-edit-actions">\n <button class="btn btn-outline-secondary" data-action="cancel-edit">Cancel</button>\n <button class="btn btn-success" data-action="save-page">\n <i class="bi bi-check-lg"></i> Save Changes\n </button>\n </div>\n </div>\n </header>\n <div class="docit-edit-body flex-grow-1">\n <div id="editor"></div>\n </div>\n {{/model}}\n {{^model}}\n <div class="docit-error-state">\n <h3>Page Not Found</h3>\n <p>The page you\'re trying to edit could not be found.</p>\n <button class="btn btn-primary" data-action="go-back">Go Back</button>\n </div>\n {{/model}}{{/loading}}\n </div>\n '}async onParams(t={},e={}){await super.onParams(t,e);let o=null;e.id?o=new DocitPage({id:e.id}):e.doc_page&&(o=new DocitPage({slug:e.doc_page})),this.model=o,this.model&&await this.model.fetch({graph:"detail"})}initEditor(){!this.editor&&this.element.querySelector("#editor")&&(this.editor=new toastui.Editor({el:this.element.querySelector("#editor"),height:"100%",initialEditType:"markdown",previewStyle:"tab",initialValue:this.model.get("content")||""}),this.editor.on("change",()=>{this.isDirty=!0}))}async onActionSavePage(){if(this.model&&this.editor){this.saving=!0,this.getApp().showLoading("saving...");try{const t=this.editor.getMarkdown();await this.model.save({content:t}),this.isDirty=!1,this.getApp().toast.success("Page saved successfully."),this.getApp().showPage("docs",this.query)}catch(t){console.error("Failed to save page:",t),this.getApp().toast.error("Failed to save page.")}finally{this.saving=!1,this.getApp().hideLoading()}}}async onActionCancelEdit(){this.getApp().showPage("docs",this.query)}onActionGoBack(){this.getApp().showPage("docs")}async onBeforeRender(){await super.onBeforeRender(),this.editor&&(this.editor.destroy(),this.editor=null)}async onAfterRender(){await super.onAfterRender(),this.model&&this.initEditor()}async onBeforeDestroy(){this.editor?.destroy(),await super.onBeforeDestroy()}}class DocItApp extends t.WebApp{constructor(t={}){super({name:t.title||"DocIt Portal",version:t.version||"1.0.0",debug:t.debug||!1,container:t.container||"#app",defaultRoute:"home",basePath:t.basePath||"",...t}),this.bookSlug=t.bookSlug||null,this.showBookNav=void 0!==t.showBookNav?t.showBookNav:!this.bookSlug,this.theme=t.theme||"light",this.editPermissions=t.permissions?.edit||["manage_docit"],this.sidebarConfig={showSearch:!0,defaultCollapsed:!1,...t.sidebar},this.books=new DocitBookList,this.books.params.sort="-order_priority",this.docPages=new DocitPageList,this.docPages.params.sort="-order_priority",this.toast=new s.ToastService,this.currentBook=null,this.sidebar=null,this.isDocItReady=!1,this.tokenManager=new n.TokenManager,this.activeUser=null}async start(){try{this.setupDocItLayout(),await this.setupTopNav(),await this.setupSidebar(),await this.checkAuthStatus(),this.registerDocItPages(),await super.start(),await this.loadInitialData(),this.isDocItReady=!0,this.events.emit("docit:ready",{app:this})}catch(t){throw console.error("Failed to start DocIt:",t),this.showError("Failed to initialize documentation portal"),t}}setupDocItLayout(){const t="string"==typeof this.container?document.querySelector(this.container):this.container;if(!t)throw new Error(`Container not found: ${this.container}`);t.classList.add("docit-app",`docit-theme-${this.theme}`),t.innerHTML='\n <div class="docit-app-layout">\n <div id="topnav-container"></div>\n <div class="docit-body-layout">\n <div class="docit-sidebar" id="docit-sidebar"></div>\n <div class="docit-main">\n <div class="docit-content" id="page-container"></div>\n </div>\n </div>\n </div>\n ',this.pageContainer="#page-container"}async setupTopNav(){this.topnav=new e.TopNav({containerId:"topnav-container",brand:this.name,theme:"navbar navbar-expand-lg bg-dark navbar-dark",showSidebarToggle:!1,displayMode:"brand",rightItems:[{id:"login",icon:"bi-box-arrow-in-right",href:"/examples/auth/",label:"Login"}],userMenu:{label:"User",icon:"bi-person-circle",items:[{label:"Profile",icon:"bi-person",action:"profile"},{divider:!0},{label:"Logout",icon:"bi-box-arrow-right",action:"logout"}]}}),await this.topnav.render()}onActionToggleSidebar(){document.querySelector(".docit-layout").classList.toggle("sidebar-collapsed")}async setupSidebar(){this.sidebar=new DocNavSidebar({containerId:"docit-sidebar",app:this,singleBookMode:!!this.bookSlug,showBookNav:this.showBookNav,books:this.books,docPages:this.docPages,activeUser:this.activeUser,...this.sidebarConfig}),await this.sidebar.render()}registerDocItPages(){this.registerPage("home",DocHomePage,{route:"/",permissions:null}),this.registerPage("docs",DocPage,{route:"/docs",permissions:null}),this.registerPage("edit",DocEditPage,{route:"/edit",permissions:this.editPermissions})}async loadInitialData(){try{if(this.bookSlug){const t=new DocitBook({slug:this.bookSlug});if(await t.fetch(),!t.id)throw new Error(`Book with slug '${this.bookSlug}' not found.`);this.books.add(t),await this.setActiveBook(t)}else await this.books.fetch({graph:"list"}),this.sidebar.render()}catch(t){console.error("Failed to load initial data:",t),this.showError("Failed to load documentation")}}async setActiveBook(t){this.currentBook&&t&&this.currentBook.id===t.id||(this.currentBook=t,this.docPages.reset(),t&&await this.docPages.fetch({book:t.get("id"),graph:"list"}),this.sidebar.setCurrentBook(t),this.sidebar.setDocPages(this.docPages),this.events.emit("docit:book-changed",{book:t}))}async saveDocPageContent(t,e){const o=this.docPages.get(t)||new DocitPage({id:t});o.set("content",e);const i=await o.save();if(!i.success||!i.data.status)throw new Error("Failed to save doc page");return o}canEdit(){const t=this.activeUser;return!!t&&this.editPermissions.some(e=>!!t.hasPermission&&t.hasPermission(e))}async checkAuthStatus(){try{const t=this.tokenManager.getTokenInstance();if(!t||!t.isValid())return void this.events.emit("auth:unauthorized",{app:this});if(t.isExpired())return void this.events.emit("auth:expired",{app:this});this.tokenManager.startAutoRefresh(this),this.rest.setAuthToken(t.token);const e=new s.User({id:t.getUserId()});await e.fetch(),this.setActiveUser(e)}catch(t){console.error("Failed to check auth status:",t),this.events.emit("auth:error",{error:t,app:this})}}setActiveUser(t){return this.activeUser=t,this.sidebar&&this.sidebar.setUser(t),this.topnav&&(this.topnav.setUser(t),this.tonnav.render()),this.events.emit("user:changed",{user:t,app:this}),this}clearActiveUser(){return this.activeUser=null,this.tokenManager.clearTokens(),this.rest.clearAuth(),this.sidebar&&this.sidebar.setUser(null),this.events.emit("user:cleared",{app:this}),this}async logout(){this.clearActiveUser(),this.books.reset(),this.docPages.reset(),this.currentBook=null,this.events.emit("auth:logout",{app:this}),window.location.reload()}async createNewBook(){const t=await this.showModelForm({title:"Create New Book",model:new DocitBook,fields:[{name:"title",label:"Title",required:!0},{name:"slug",label:"Slug",required:!0,helpText:"A URL-friendly identifier."}]});t&&t.success&&(this.books.add(t.data),this.sidebar.render(),this.showSuccess("Book created successfully."))}async createNewPage(t){if(!t)return;const e=await this.showForm({title:"Create New Page",fields:[{name:"title",label:"Title",required:!0},{name:"slug",label:"Slug",required:!0,helpText:"A URL-friendly identifier."}]});e&&e.slug&&(e.book=t.id);const o=new DocitPage,i=await o.save(e);i&&i.success&&(this.docPages.add(o),this.sidebar.render(),this.showPage("edit",{id:o.id,doc_book:t.get("slug"),doc_page:o.get("slug")},{}))}static create(t={}){return new DocItApp(t)}static createForBook(t,e={}){return new DocItApp({...e,bookSlug:t,showBookNav:!1})}}exports.BUILD_TIME=t.BUILD_TIME,exports.VERSION=t.VERSION,exports.VERSION_INFO=t.VERSION_INFO,exports.VERSION_MAJOR=t.VERSION_MAJOR,exports.VERSION_MINOR=t.VERSION_MINOR,exports.VERSION_REVISION=t.VERSION_REVISION,exports.WebApp=t.WebApp,exports.DocEditPage=DocEditPage,exports.DocHomePage=DocHomePage,exports.DocItApp=DocItApp,exports.DocNavSidebar=DocNavSidebar,exports.DocPage=DocPage,exports.DocitBook=DocitBook,exports.DocitBookList=DocitBookList,exports.DocitPage=DocitPage,exports.DocitPageList=DocitPageList;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./chunks/Dialog-BfXN-fFA.js"),e=require("./chunks/TokenManager-BWc_pRpg.js"),o=require("./chunks/Rest-BpDyhFfG.js"),i=require("./chunks/ContextMenu-CfMAB33c.js"),s=require("./chunks/Collection-B64LJ92k.js"),a=require("./chunks/version-CKPqwcQJ.js");class DocNavSidebar extends o.View{constructor(t={}){super({className:"docit-sidebar-nav",tagName:"nav",...t}),this.singleBookMode=t.singleBookMode||!1,this.books=t.books,this.docPages=t.docPages,this.activeUser=t.activeUser,this.currentBook=null,this.currentDocPage=null}async onInit(){await super.onInit(),this.getApp().events.on("page:show",this._onPageShow.bind(this))}async _onPageShow({query:t}){const e=t.doc_book,o=t.doc_page,i=this.getApp();if(e){const t=this.books.findWhere({slug:e});!t||this.currentBook&&this.currentBook.id===t.id||(await i.setActiveBook(t),this.currentBook=i.currentBook)}else this.currentBook&&(await i.setActiveBook(null),this.currentBook=null);this.currentDocPage=o?this.docPages.findWhere({slug:o}):null,this.render()}getTemplate(){return'\n <div class="docit-nav-body pt-3">\n {{#currentBook}}\n {{#docPages.models}}\n <a href="#" class="docit-page-link {{#isActive}}active{{/isActive}}"\n data-action="select-page" data-page-slug="{{slug}}">\n <i class="{{#metadata.icon}}{{metadata.icon}}{{/metadata.icon}}{{^metadata.icon}}bi bi-file-earmark-text{{/metadata.icon}} me-2"></i>\n <span>{{title|capitalize}}</span>\n </a>\n {{/docPages.models}}\n {{^docPages.models}}\n <div class="docit-nav-empty"><p>No pages in this book.</p></div>\n {{/docPages.models}}\n {{/currentBook}}\n {{^currentBook}}\n {{#books.models}}\n <a href="#" class="docit-book-item" data-action="select-book" data-book-slug="{{slug}}">\n <i class="bi bi-book me-2"></i>\n <span class="book-title">{{title}}</span>\n <span class="badge bg-secondary ms-auto">{{page_count}}</span>\n </a>\n {{/books.models}}\n {{/currentBook}}\n </div>\n {{#currentBook}}\n <div class="docit-nav-footer">\n {{#canEdit}}\n <button class="btn btn-link w-100 mb-2" data-action="create-page">\n <i class="bi bi-plus-circle me-2"></i>\n Create New Page\n </button>\n {{/canEdit}}\n <button class="btn btn-link w-100" data-action="back-to-books">\n <i class="bi bi-arrow-left me-2"></i>\n Back to Books\n </button>\n </div>\n {{/currentBook}}\n {{^currentBook}}\n {{#canEdit}}\n <div class="docit-nav-footer">\n <button class="btn btn-link w-100" data-action="create-book">\n <i class="bi bi-plus-circle me-2"></i>\n Create New Book\n </button>\n </div>\n {{/canEdit}}\n {{/currentBook}}\n '}async onBeforeRender(){await super.onBeforeRender(),this.canEdit=this.getApp().canEdit(),this.docPages&&this.currentDocPage&&this.docPages.forEach(t=>{t.isActive=t.id===this.currentDocPage.id})}async onActionSelectBook(t,e){t.preventDefault();const o=e.dataset.bookSlug,i=this.books.findWhere({slug:o});if(i){await this.getApp().setActiveBook(i);const t=this.docPages.at(0),e={doc_book:i.get("slug")};t&&(e.doc_page=t.get("slug")),this.getApp().showPage("docs",e,{})}}onActionSelectPage(t,e){t.preventDefault();const o=e.dataset.pageSlug;this.currentBook&&o&&this.getApp().showPage("docs",{doc_book:this.currentBook.get("slug"),doc_page:o},{})}async onActionBackToBooks(t,e){t.preventDefault(),await this.getApp().setActiveBook(null),this.getApp().showPage("home")}async onActionCreateBook(){await this.getApp().createNewBook()}async onActionCreatePage(){this.currentBook&&await this.getApp().createNewPage(this.currentBook)}setBooks(t){this.books=t,this.render()}setDocPages(t){this.docPages=t,this.render()}setCurrentBook(t){this.currentBook=t,this.render(),this.getApp().topnav&&(t?this.getApp().topnav.setBrand(t.get("title")):this.getApp().topnav.setBrand("Documentation"))}setUser(t){this.activeUser=t,this.render()}}class DocHomePage extends i.Page{constructor(t={}){super({pageName:"home",title:"Documentation",className:"docit-home-page",...t})}async getTemplate(){return'\n <div class="docit-empty-state vh-100 d-flex flex-column align-items-center justify-content-center">\n <i class="bi bi-collection" style="font-size: 4rem;"></i>\n <h3 class="mt-4">Welcome to the Documentation Portal</h3>\n <p class="text-muted">Please select a book from the sidebar to get started.</p>\n </div>\n '}}class DocitBook extends s.Model{static endpoint="/api/docit/book";buildUrl(t=null){return this.get("slug")&&!this.id?`/api/docit/book/slug/${this.get("slug")}`:this.id?`/api/docit/book/${this.id}`:this.endpoint}}class DocitBookList extends s.Collection{constructor(t={}){super({ModelClass:DocitBook,endpoint:"/api/docit/book",...t})}parse(t){return t.data&&t.data.status?(this.meta={...this.meta,total:t.data.count||0,graph:t.data.graph},t.data.data||[]):super.parse(t)}}class DocitPage extends s.Model{static endpoint="/api/docit/page";buildUrl(t=null){return this.get("slug")&&!this.id?`/api/docit/page/slug/${this.get("slug")}`:this.id?`/api/docit/page/${this.id}`:this.endpoint}}class DocitPageList extends s.Collection{constructor(t={}){super({ModelClass:DocitPage,endpoint:"/api/docit/page",...t})}parse(t){return t.data&&t.data.status?(this.meta={...this.meta,total:t.data.count||0,graph:t.data.graph,book:t.data.book},t.data.data||[]):super.parse(t)}}class DocPage extends i.Page{constructor(t={}){super({pageName:"docs",title:"Documentation",className:"docit-page",...t}),this.bookModel=null,this.model=null}async onInit(){await super.onInit(),this.pageContextMenu=new i.ContextMenu({config:this.getPageContextMenuConfig(),containerId:"page-context-menu"}),this.addChild(this.pageContextMenu)}getPageContextMenuConfig(){return{icon:"bi-three-dots",buttonClass:"btn btn-outline-secondary btn-sm",items:[{label:"View History",action:"view-history",icon:"bi-clock-history"},{type:"divider"},{label:"Edit Page Content",action:"edit-page",icon:"bi-pencil"},{label:"Edit Page Info",action:"edit-page-info",icon:"bi-list-ol"},{type:"divider"},{label:"Edit Book Info",action:"edit-book",icon:"bi-book"},{type:"divider"},{label:"Delete Page",action:"delete-page",icon:"bi-trash",danger:!0}]}}async getTemplate(){return'\n <div class="docit-page-container position-relative">\n {{#loading}}\n <div class="docit-loading">\n <div class="spinner-border" role="status">\n <span class="visually-hidden">Loading...</span>\n </div>\n </div>\n {{/loading}}\n\n {{^loading}}\n {{#model|bool}}\n <div class="docit-page-toolbar">\n <div class="row">\n <div class="col d-flex justify-content-end">\n <div data-container="page-context-menu"></div>\n </div>\n </div>\n </div>\n <article class="docit-page-content">\n {{{model.html}}}\n </article>\n\n <nav class="docit-page-nav">\n {{#prevPage}}\n <a href="#" class="docit-nav-prev" data-action="navigate-to-page" data-page-slug="{{slug}}">\n <i class="bi bi-arrow-left"></i>\n <div>\n <small>Previous</small>\n <span>{{title}}</span>\n </div>\n </a>\n {{/prevPage}}\n {{^prevPage}}\n <div></div>\n {{/prevPage}}\n\n {{#nextPage}}\n <a href="#" class="docit-nav-next" data-action="navigate-to-page" data-page-slug="{{slug}}">\n <div>\n <small>Next</small>\n <span>{{title}}</span>\n </div>\n <i class="bi bi-arrow-right"></i>\n </a>\n {{/nextPage}}\n\n <div class="my-3">\n <span class="text-muted">Last updated: {{model.modified|datetime}}</span>\n </div>\n </nav>\n {{/model|bool}}\n\n {{^model|bool}}\n <div class="docit-empty-state">\n <i class="bi bi-file-earmark-text"></i>\n <h3>Select a page</h3>\n <p>Choose a page from the sidebar to view its content.</p>\n </div>\n {{/model|bool}}\n {{/loading}}\n </div>\n '}async onParams(t={},e={}){await super.onParams(t,e),this.loading=!0,await this.render();const o=this.getApp(),i=o.bookSlug||e.doc_book,s=e.doc_page;if(i)try{if(i){if(!o.currentBook||o.currentBook.get("slug")!==i){const t=new DocitBook({slug:i});await t.fetch(),await o.setActiveBook(t)}if(this.bookModel=o.currentBook,s)this.model=new DocitPage({slug:s}),await this.model.fetch({graph:"html"});else{const t=o.docPages.at(0);t?(this.model=new DocitPage({id:t.id}),await this.model.fetch({graph:"html"})):this.model=null}}else this.bookModel=null,this.model=null;this.canEdit=o.canEdit(),this.setupNavigation()}catch(a){console.error("Failed to load page:",a),this.showError("Failed to load documentation page"),this.model=null}finally{this.loading=!1,await this.render(),o.events.emit("docit:page-rendered",{book:this.bookModel,page:this.model})}else setTimeout(()=>{o.showPage("home")},100)}setupNavigation(){if(!this.model)return this.prevPage=null,void(this.nextPage=null);const t=this.getApp().docPages.models,e=t.findIndex(t=>t.id===this.model.id);this.prevPage=e>0?{slug:t[e-1].get("slug"),title:t[e-1].get("title")}:null,this.nextPage=e<t.length-1?{slug:t[e+1].get("slug"),title:t[e+1].get("title")}:null}async onActionNavigateToPage(t,e){t.preventDefault();const o=e.dataset.pageSlug;o&&this.getApp().showPage("docs",{},{doc_book:this.bookModel.get("slug"),doc_page:o})}async onActionEditPage(t,e){t.preventDefault(),this.model&&this.getApp().showPage("edit",{id:this.model.id,doc_book:this.bookModel.get("slug"),doc_page:this.model.get("slug")},{})}async onActionViewHistory(t,e){this.showInfo("Revision history coming soon.")}async onActionEditPageInfo(t,e){this.model&&this.getApp().showModelForm({model:this.model,fields:[{label:"Title",name:"title",type:"text"},{label:"Order Priority",name:"order_priority"},{label:"Slug",name:"slug"}]})}async onActionEditBook(t,e){if(this.model){const t=this.getApp().sidebar.currentBook;if(!t)return;this.getApp().showModelForm({model:t,fields:[{label:"Title",name:"title",type:"text"},{label:"Order Priority",name:"order_priority"},{label:"Slug",name:"slug"},{label:"Is Active",name:"is_active",type:"switch"}]})}}async onActionDeletePage(t,e){if(this.model&&await this.getApp().showConfirm({title:"Delete Page",body:`Are you sure you want to delete "${this.model.get("title")}"?`,confirmText:"Delete",confirmClass:"btn-danger"})){await this.model.destroy(),this.showSuccess("Page deleted."),await this.getApp().setActiveBook(this.bookModel);const t=this.getApp().docPages.at(0);t?this.getApp().showPage("docs",{},{doc_book:this.bookModel.get("slug"),doc_page:t.get("slug")}):this.getApp().showPage("docs",{},{doc_book:this.bookModel.get("slug")})}}async onAfterRender(){await super.onAfterRender(),"undefined"!=typeof Prism&&this.model&&Prism.highlightAll()}}class DocEditPage extends i.Page{constructor(t={}){super({pageName:"edit",title:"Edit Page",className:"docit-edit-page",...t}),this.model=null,this.editor=null,this.isDirty=!1}async getTemplate(){return'\n <div class="docit-edit-container vh-100">\n {{#loading}}\n <div class="docit-loading"><div class="spinner-border"></div></div>\n {{/loading}}\n\n {{^loading}}{{#model}}\n <header class="docit-edit-header">\n <div class="docit-edit-title-row">\n <h2>Editing: {{model.title}}</h2>\n <div class="docit-edit-actions">\n <button class="btn btn-outline-secondary" data-action="cancel-edit">Cancel</button>\n <button class="btn btn-success" data-action="save-page">\n <i class="bi bi-check-lg"></i> Save Changes\n </button>\n </div>\n </div>\n </header>\n <div class="docit-edit-body flex-grow-1">\n <div id="editor"></div>\n </div>\n {{/model}}\n {{^model}}\n <div class="docit-error-state">\n <h3>Page Not Found</h3>\n <p>The page you\'re trying to edit could not be found.</p>\n <button class="btn btn-primary" data-action="go-back">Go Back</button>\n </div>\n {{/model}}{{/loading}}\n </div>\n '}async onParams(t={},e={}){await super.onParams(t,e);let o=null;e.id?o=new DocitPage({id:e.id}):e.doc_page&&(o=new DocitPage({slug:e.doc_page})),this.model=o,this.model&&await this.model.fetch({graph:"detail"})}initEditor(){!this.editor&&this.element.querySelector("#editor")&&(this.editor=new toastui.Editor({el:this.element.querySelector("#editor"),height:"100%",initialEditType:"markdown",previewStyle:"tab",initialValue:this.model.get("content")||""}),this.editor.on("change",()=>{this.isDirty=!0}))}async onActionSavePage(){if(this.model&&this.editor){this.saving=!0,this.getApp().showLoading("saving...");try{const t=this.editor.getMarkdown();await this.model.save({content:t}),this.isDirty=!1,this.getApp().toast.success("Page saved successfully."),this.getApp().showPage("docs",this.query)}catch(t){console.error("Failed to save page:",t),this.getApp().toast.error("Failed to save page.")}finally{this.saving=!1,this.getApp().hideLoading()}}}async onActionCancelEdit(){this.getApp().showPage("docs",this.query)}onActionGoBack(){this.getApp().showPage("docs")}async onBeforeRender(){await super.onBeforeRender(),this.editor&&(this.editor.destroy(),this.editor=null)}async onAfterRender(){await super.onAfterRender(),this.model&&this.initEditor()}async onBeforeDestroy(){this.editor?.destroy(),await super.onBeforeDestroy()}}class DocItApp extends t.WebApp{constructor(t={}){super({name:t.title||"DocIt Portal",version:t.version||"1.0.0",debug:t.debug||!1,container:t.container||"#app",defaultRoute:"home",basePath:t.basePath||"",...t}),this.bookSlug=t.bookSlug||null,this.showBookNav=void 0!==t.showBookNav?t.showBookNav:!this.bookSlug,this.theme=t.theme||"light",this.editPermissions=t.permissions?.edit||["manage_docit"],this.sidebarConfig={showSearch:!0,defaultCollapsed:!1,...t.sidebar},this.books=new DocitBookList,this.books.params.sort="-order_priority",this.docPages=new DocitPageList,this.docPages.params.sort="-order_priority",this.toast=new i.ToastService,this.currentBook=null,this.sidebar=null,this.isDocItReady=!1,this.tokenManager=new e.TokenManager,this.activeUser=null}async start(){try{this.setupDocItLayout(),await this.setupTopNav(),await this.setupSidebar(),await this.checkAuthStatus(),this.registerDocItPages(),await super.start(),await this.loadInitialData(),this.isDocItReady=!0,this.events.emit("docit:ready",{app:this})}catch(t){throw console.error("Failed to start DocIt:",t),this.showError("Failed to initialize documentation portal"),t}}setupDocItLayout(){const t="string"==typeof this.container?document.querySelector(this.container):this.container;if(!t)throw new Error(`Container not found: ${this.container}`);t.classList.add("docit-app",`docit-theme-${this.theme}`),t.innerHTML='\n <div class="docit-app-layout">\n <div id="topnav-container"></div>\n <div class="docit-body-layout">\n <div class="docit-sidebar" id="docit-sidebar"></div>\n <div class="docit-main">\n <div class="docit-content" id="page-container"></div>\n </div>\n </div>\n </div>\n ',this.pageContainer="#page-container"}async setupTopNav(){this.topnav=new e.TopNav({containerId:"topnav-container",brand:this.name,theme:"navbar navbar-expand-lg bg-dark navbar-dark",showSidebarToggle:!1,displayMode:"brand",rightItems:[{id:"login",icon:"bi-box-arrow-in-right",href:"/examples/auth/",label:"Login"}],userMenu:{label:"User",icon:"bi-person-circle",items:[{label:"Profile",icon:"bi-person",action:"profile"},{divider:!0},{label:"Logout",icon:"bi-box-arrow-right",action:"logout"}]}}),await this.topnav.render()}onActionToggleSidebar(){document.querySelector(".docit-layout").classList.toggle("sidebar-collapsed")}async setupSidebar(){this.sidebar=new DocNavSidebar({containerId:"docit-sidebar",app:this,singleBookMode:!!this.bookSlug,showBookNav:this.showBookNav,books:this.books,docPages:this.docPages,activeUser:this.activeUser,...this.sidebarConfig}),await this.sidebar.render()}registerDocItPages(){this.registerPage("home",DocHomePage,{route:"/",permissions:null}),this.registerPage("docs",DocPage,{route:"/docs",permissions:null}),this.registerPage("edit",DocEditPage,{route:"/edit",permissions:this.editPermissions})}async loadInitialData(){try{if(this.bookSlug){const t=new DocitBook({slug:this.bookSlug});if(await t.fetch(),!t.id)throw new Error(`Book with slug '${this.bookSlug}' not found.`);this.books.add(t),await this.setActiveBook(t)}else await this.books.fetch({graph:"list"}),this.sidebar.render()}catch(t){console.error("Failed to load initial data:",t),this.showError("Failed to load documentation")}}async setActiveBook(t){this.currentBook&&t&&this.currentBook.id===t.id||(this.currentBook=t,this.docPages.reset(),t&&await this.docPages.fetch({book:t.get("id"),graph:"list"}),this.sidebar.setCurrentBook(t),this.sidebar.setDocPages(this.docPages),this.events.emit("docit:book-changed",{book:t}))}async saveDocPageContent(t,e){const o=this.docPages.get(t)||new DocitPage({id:t});o.set("content",e);const i=await o.save();if(!i.success||!i.data.status)throw new Error("Failed to save doc page");return o}canEdit(){const t=this.activeUser;return!!t&&this.editPermissions.some(e=>!!t.hasPermission&&t.hasPermission(e))}async checkAuthStatus(){try{const t=this.tokenManager.getTokenInstance();if(!t||!t.isValid())return void this.events.emit("auth:unauthorized",{app:this});if(t.isExpired())return void this.events.emit("auth:expired",{app:this});this.tokenManager.startAutoRefresh(this),this.rest.setAuthToken(t.token);const e=new i.User({id:t.getUserId()});await e.fetch(),this.setActiveUser(e)}catch(t){console.error("Failed to check auth status:",t),this.events.emit("auth:error",{error:t,app:this})}}setActiveUser(t){return this.activeUser=t,this.sidebar&&this.sidebar.setUser(t),this.topnav&&(this.topnav.setUser(t),this.tonnav.render()),this.events.emit("user:changed",{user:t,app:this}),this}clearActiveUser(){return this.activeUser=null,this.tokenManager.clearTokens(),this.rest.clearAuth(),this.sidebar&&this.sidebar.setUser(null),this.events.emit("user:cleared",{app:this}),this}async logout(){this.clearActiveUser(),this.books.reset(),this.docPages.reset(),this.currentBook=null,this.events.emit("auth:logout",{app:this}),window.location.reload()}async createNewBook(){const t=await this.showModelForm({title:"Create New Book",model:new DocitBook,fields:[{name:"title",label:"Title",required:!0},{name:"slug",label:"Slug",required:!0,helpText:"A URL-friendly identifier."}]});t&&t.success&&(this.books.add(t.data),this.sidebar.render(),this.showSuccess("Book created successfully."))}async createNewPage(t){if(!t)return;const e=await this.showForm({title:"Create New Page",fields:[{name:"title",label:"Title",required:!0},{name:"slug",label:"Slug",required:!0,helpText:"A URL-friendly identifier."}]});e&&e.slug&&(e.book=t.id);const o=new DocitPage,i=await o.save(e);i&&i.success&&(this.docPages.add(o),this.sidebar.render(),this.showPage("edit",{id:o.id,doc_book:t.get("slug"),doc_page:o.get("slug")},{}))}static create(t={}){return new DocItApp(t)}static createForBook(t,e={}){return new DocItApp({...e,bookSlug:t,showBookNav:!1})}}exports.WebApp=t.WebApp,exports.BUILD_TIME=a.BUILD_TIME,exports.VERSION=a.VERSION,exports.VERSION_INFO=a.VERSION_INFO,exports.VERSION_MAJOR=a.VERSION_MAJOR,exports.VERSION_MINOR=a.VERSION_MINOR,exports.VERSION_REVISION=a.VERSION_REVISION,exports.DocEditPage=DocEditPage,exports.DocHomePage=DocHomePage,exports.DocItApp=DocItApp,exports.DocNavSidebar=DocNavSidebar,exports.DocPage=DocPage,exports.DocitBook=DocitBook,exports.DocitBookList=DocitBookList,exports.DocitPage=DocitPage,exports.DocitPageList=DocitPageList;
|
|
2
2
|
//# sourceMappingURL=docit.cjs.js.map
|
package/dist/docit.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docit.cjs.js","sources":["../src/extensions/docit/views/DocNavSidebar.js","../src/extensions/docit/pages/DocHomePage.js","../src/extensions/docit/models/Book.js","../src/extensions/docit/models/Page.js","../src/extensions/docit/pages/DocPage.js","../src/extensions/docit/pages/DocEditPage.js","../src/extensions/docit/DocItApp.js"],"sourcesContent":["/**\n * DocNavSidebar - Navigation sidebar for DocIt documentation portal.\n * This view is reactive and relies on the parent DocItApp for state management.\n */\n\nimport View from '@core/View.js';\n\nclass DocNavSidebar extends View {\n constructor(options = {}) {\n super({\n className: 'docit-sidebar-nav',\n tagName: 'nav',\n ...options\n });\n\n this.singleBookMode = options.singleBookMode || false;\n this.books = options.books;\n this.docPages = options.docPages;\n this.activeUser = options.activeUser;\n this.currentBook = null;\n this.currentDocPage = null;\n }\n\n async onInit() {\n await super.onInit();\n this.getApp().events.on('page:show', this._onPageShow.bind(this));\n }\n\n async _onPageShow({ query }) {\n const bookSlug = query.doc_book;\n const pageSlug = query.doc_page;\n const app = this.getApp();\n\n if (bookSlug) {\n const book = this.books.findWhere({ slug: bookSlug });\n if (book && (!this.currentBook || this.currentBook.id !== book.id)) {\n await app.setActiveBook(book);\n this.currentBook = app.currentBook;\n }\n } else {\n if (this.currentBook) {\n await app.setActiveBook(null);\n this.currentBook = null;\n }\n }\n\n this.currentDocPage = pageSlug ? this.docPages.findWhere({ slug: pageSlug }) : null;\n this.render();\n }\n\n getTemplate() {\n return `\n <div class=\"docit-nav-body pt-3\">\n {{#currentBook}}\n {{#docPages.models}}\n <a href=\"#\" class=\"docit-page-link {{#isActive}}active{{/isActive}}\"\n data-action=\"select-page\" data-page-slug=\"{{slug}}\">\n <i class=\"{{#metadata.icon}}{{metadata.icon}}{{/metadata.icon}}{{^metadata.icon}}bi bi-file-earmark-text{{/metadata.icon}} me-2\"></i>\n <span>{{title|capitalize}}</span>\n </a>\n {{/docPages.models}}\n {{^docPages.models}}\n <div class=\"docit-nav-empty\"><p>No pages in this book.</p></div>\n {{/docPages.models}}\n {{/currentBook}}\n {{^currentBook}}\n {{#books.models}}\n <a href=\"#\" class=\"docit-book-item\" data-action=\"select-book\" data-book-slug=\"{{slug}}\">\n <i class=\"bi bi-book me-2\"></i>\n <span class=\"book-title\">{{title}}</span>\n <span class=\"badge bg-secondary ms-auto\">{{page_count}}</span>\n </a>\n {{/books.models}}\n {{/currentBook}}\n </div>\n {{#currentBook}}\n <div class=\"docit-nav-footer\">\n {{#canEdit}}\n <button class=\"btn btn-link w-100 mb-2\" data-action=\"create-page\">\n <i class=\"bi bi-plus-circle me-2\"></i>\n Create New Page\n </button>\n {{/canEdit}}\n <button class=\"btn btn-link w-100\" data-action=\"back-to-books\">\n <i class=\"bi bi-arrow-left me-2\"></i>\n Back to Books\n </button>\n </div>\n {{/currentBook}}\n {{^currentBook}}\n {{#canEdit}}\n <div class=\"docit-nav-footer\">\n <button class=\"btn btn-link w-100\" data-action=\"create-book\">\n <i class=\"bi bi-plus-circle me-2\"></i>\n Create New Book\n </button>\n </div>\n {{/canEdit}}\n {{/currentBook}}\n `;\n }\n\n async onBeforeRender() {\n await super.onBeforeRender();\n this.canEdit = this.getApp().canEdit();\n if (this.docPages && this.currentDocPage) {\n this.docPages.forEach(page => {\n page.isActive = (page.id === this.currentDocPage.id);\n });\n }\n }\n\n async onActionSelectBook(event, element) {\n event.preventDefault();\n const bookSlug = element.dataset.bookSlug;\n const book = this.books.findWhere({ slug: bookSlug });\n if (book) {\n await this.getApp().setActiveBook(book);\n const firstPage = this.docPages.at(0);\n const query = { doc_book: book.get('slug') };\n if (firstPage) {\n query.doc_page = firstPage.get('slug');\n }\n this.getApp().showPage('docs', query, {});\n }\n }\n\n onActionSelectPage(event, element) {\n event.preventDefault();\n const pageSlug = element.dataset.pageSlug;\n if (this.currentBook && pageSlug) {\n this.getApp().showPage('docs', {\n doc_book: this.currentBook.get('slug'),\n doc_page: pageSlug\n }, {});\n }\n }\n\n async onActionBackToBooks(event, element) {\n event.preventDefault();\n await this.getApp().setActiveBook(null);\n this.getApp().showPage('home');\n }\n\n async onActionCreateBook() {\n await this.getApp().createNewBook();\n }\n\n async onActionCreatePage() {\n if (this.currentBook) {\n await this.getApp().createNewPage(this.currentBook);\n }\n }\n\n setBooks(books) { this.books = books; this.render(); }\n setDocPages(docPages) { this.docPages = docPages; this.render(); }\n setCurrentBook(book) {\n this.currentBook = book;\n this.render();\n if (this.getApp().topnav) {\n if (book) {\n this.getApp().topnav.setBrand(book.get(\"title\"));\n } else {\n this.getApp().topnav.setBrand(\"Documentation\");\n }\n\n }\n }\n setUser(user) { this.activeUser = user; this.render(); }\n}\n\nexport default DocNavSidebar;\n","/**\n * DocHomePage - The default landing page for the documentation portal.\n * Instructs the user to select a book to begin.\n */\n\nimport Page from '@core/Page.js';\n\nclass DocHomePage extends Page {\n constructor(options = {}) {\n super({\n pageName: 'home',\n title: 'Documentation',\n className: 'docit-home-page',\n ...options\n });\n }\n\n async getTemplate() {\n return `\n <div class=\"docit-empty-state vh-100 d-flex flex-column align-items-center justify-content-center\">\n <i class=\"bi bi-collection\" style=\"font-size: 4rem;\"></i>\n <h3 class=\"mt-4\">Welcome to the Documentation Portal</h3>\n <p class=\"text-muted\">Please select a book from the sidebar to get started.</p>\n </div>\n `;\n }\n}\n\nexport default DocHomePage;","import Model from '@core/Model.js';\nimport Collection from '@core/Collection.js';\n\n/**\n * DocitBook - Model for documentation books.\n * Handles fetching book data by ID or slug.\n */\nexport class DocitBook extends Model {\n static endpoint = '/api/docit/book';\n\n buildUrl(id = null) {\n if (this.get('slug') && !this.id) {\n return `/api/docit/book/slug/${this.get('slug')}`;\n } else if (this.id) {\n return `/api/docit/book/${this.id}`;\n }\n return this.endpoint;\n }\n}\n\n/**\n * DocitBookList - Collection of documentation books.\n */\nexport class DocitBookList extends Collection {\n constructor(options = {}) {\n super({\n ModelClass: DocitBook,\n endpoint: '/api/docit/book',\n ...options\n });\n }\n\n /**\n * Custom parsing to handle the specific API response structure for book lists.\n */\n parse(response) {\n if (response.data && response.data.status) {\n this.meta = {\n ...this.meta,\n total: response.data.count || 0,\n graph: response.data.graph\n };\n return response.data.data || [];\n }\n return super.parse(response);\n }\n}\n\nexport default DocitBook;\n","import Model from '@core/Model.js';\nimport Collection from '@core/Collection.js';\n\n/**\n * DocitPage - Model for documentation pages.\n * Handles fetching page data by ID or slug.\n */\nexport class DocitPage extends Model {\n static endpoint = '/api/docit/page';\n\n buildUrl(id = null) {\n if (this.get('slug') && !this.id) {\n return `/api/docit/page/slug/${this.get('slug')}`;\n } else if (this.id) {\n return `/api/docit/page/${this.id}`;\n }\n return this.endpoint;\n }\n}\n\n/**\n * DocitPageList - Collection of documentation pages.\n */\nexport class DocitPageList extends Collection {\n constructor(options = {}) {\n super({\n ModelClass: DocitPage,\n endpoint: '/api/docit/page',\n ...options\n });\n }\n\n /**\n * Custom parsing to handle the specific API response structure for page lists.\n */\n parse(response) {\n if (response.data && response.data.status) {\n this.meta = {\n ...this.meta,\n total: response.data.count || 0,\n graph: response.data.graph,\n book: response.data.book\n };\n return response.data.data || [];\n }\n return super.parse(response);\n }\n}\n\nexport default DocitPage;\n","/**\n * DocPage - Main documentation page viewer\n * Displays rendered HTML content from markdown pages. This page is URL-driven.\n */\n\nimport Page from '@core/Page.js';\nimport ContextMenu from '@core/views/feedback/ContextMenu.js';\nimport { DocitBook } from '@ext/docit/models/Book.js';\nimport { DocitPage } from '@ext/docit/models/Page.js';\n\nclass DocPage extends Page {\n constructor(options = {}) {\n super({\n pageName: 'docs',\n title: 'Documentation',\n className: 'docit-page',\n ...options\n });\n\n this.bookModel = null;\n this.model = null;\n }\n\n async onInit() {\n await super.onInit();\n this.pageContextMenu = new ContextMenu({\n config: this.getPageContextMenuConfig(),\n containerId: 'page-context-menu'\n });\n this.addChild(this.pageContextMenu);\n }\n\n getPageContextMenuConfig() {\n return {\n icon: 'bi-three-dots',\n buttonClass: 'btn btn-outline-secondary btn-sm',\n items: [\n { label: 'View History', action: 'view-history', icon: 'bi-clock-history' },\n { type: 'divider' },\n { label: 'Edit Page Content', action: 'edit-page', icon: 'bi-pencil' },\n { label: 'Edit Page Info', action: 'edit-page-info', icon: 'bi-list-ol' },\n { type: 'divider' },\n { label: 'Edit Book Info', action: 'edit-book', icon: 'bi-book' },\n { type: 'divider' },\n { label: 'Delete Page', action: 'delete-page', icon: 'bi-trash', danger: true },\n ]\n };\n }\n\n async getTemplate() {\n return `\n <div class=\"docit-page-container position-relative\">\n {{#loading}}\n <div class=\"docit-loading\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n {{/loading}}\n\n {{^loading}}\n {{#model|bool}}\n <div class=\"docit-page-toolbar\">\n <div class=\"row\">\n <div class=\"col d-flex justify-content-end\">\n <div data-container=\"page-context-menu\"></div>\n </div>\n </div>\n </div>\n <article class=\"docit-page-content\">\n {{{model.html}}}\n </article>\n\n <nav class=\"docit-page-nav\">\n {{#prevPage}}\n <a href=\"#\" class=\"docit-nav-prev\" data-action=\"navigate-to-page\" data-page-slug=\"{{slug}}\">\n <i class=\"bi bi-arrow-left\"></i>\n <div>\n <small>Previous</small>\n <span>{{title}}</span>\n </div>\n </a>\n {{/prevPage}}\n {{^prevPage}}\n <div></div>\n {{/prevPage}}\n\n {{#nextPage}}\n <a href=\"#\" class=\"docit-nav-next\" data-action=\"navigate-to-page\" data-page-slug=\"{{slug}}\">\n <div>\n <small>Next</small>\n <span>{{title}}</span>\n </div>\n <i class=\"bi bi-arrow-right\"></i>\n </a>\n {{/nextPage}}\n\n <div class=\"my-3\">\n <span class=\"text-muted\">Last updated: {{model.modified|datetime}}</span>\n </div>\n </nav>\n {{/model|bool}}\n\n {{^model|bool}}\n <div class=\"docit-empty-state\">\n <i class=\"bi bi-file-earmark-text\"></i>\n <h3>Select a page</h3>\n <p>Choose a page from the sidebar to view its content.</p>\n </div>\n {{/model|bool}}\n {{/loading}}\n </div>\n `;\n }\n\n async onParams(params = {}, query = {}) {\n await super.onParams(params, query);\n this.loading = true;\n await this.render();\n\n const app = this.getApp();\n const bookSlug = app.bookSlug || query.doc_book;\n const pageSlug = query.doc_page;\n\n if (!bookSlug) {\n setTimeout(() => {\n app.showPage('home');\n }, 100);\n return;\n }\n\n try {\n if (bookSlug) {\n if (!app.currentBook || app.currentBook.get('slug') !== bookSlug) {\n const book = new DocitBook({ slug: bookSlug });\n await book.fetch();\n await app.setActiveBook(book);\n }\n this.bookModel = app.currentBook;\n\n if (pageSlug) {\n this.model = new DocitPage({ slug: pageSlug });\n await this.model.fetch({ graph: 'html' });\n } else {\n const firstPage = app.docPages.at(0);\n if (firstPage) {\n this.model = new DocitPage({ id: firstPage.id });\n await this.model.fetch({ graph: 'html' });\n } else {\n this.model = null;\n }\n }\n } else {\n this.bookModel = null;\n this.model = null;\n }\n\n this.canEdit = app.canEdit();\n this.setupNavigation();\n\n } catch (error) {\n console.error('Failed to load page:', error);\n this.showError('Failed to load documentation page');\n this.model = null;\n } finally {\n this.loading = false;\n await this.render();\n app.events.emit('docit:page-rendered', {\n book: this.bookModel,\n page: this.model\n });\n }\n }\n\n setupNavigation() {\n if (!this.model) {\n this.prevPage = null;\n this.nextPage = null;\n return;\n }\n\n const app = this.getApp();\n const pages = app.docPages.models;\n const currentIndex = pages.findIndex(p => p.id === this.model.id);\n\n this.prevPage = currentIndex > 0 ? { slug: pages[currentIndex - 1].get('slug'), title: pages[currentIndex - 1].get('title') } : null;\n this.nextPage = currentIndex < pages.length - 1 ? { slug: pages[currentIndex + 1].get('slug'), title: pages[currentIndex + 1].get('title') } : null;\n }\n\n async onActionNavigateToPage(event, element) {\n event.preventDefault();\n const pageSlug = element.dataset.pageSlug;\n if (pageSlug) {\n this.getApp().showPage('docs', {}, {\n doc_book: this.bookModel.get('slug'),\n doc_page: pageSlug\n });\n }\n }\n\n async onActionEditPage(event, element) {\n event.preventDefault();\n if (this.model) {\n this.getApp().showPage('edit', {\n id: this.model.id,\n doc_book: this.bookModel.get('slug'),\n doc_page: this.model.get('slug')\n }, {});\n }\n }\n\n async onActionViewHistory(event, element) {\n this.showInfo('Revision history coming soon.');\n }\n\n async onActionEditPageInfo(event, element) {\n if (this.model) {\n this.getApp().showModelForm({\n model: this.model,\n fields: [\n {label:\"Title\", name:\"title\", type: \"text\"},\n {label:\"Order Priority\", name:\"order_priority\"},\n {label:\"Slug\", name:\"slug\"}\n ]\n })\n }\n }\n\n async onActionEditBook(event, element) {\n if (this.model) {\n const book = this.getApp().sidebar.currentBook;\n if (!book) return;\n this.getApp().showModelForm({\n model: book,\n fields: [\n {label:\"Title\", name:\"title\", type: \"text\"},\n {label:\"Order Priority\", name:\"order_priority\"},\n {label:\"Slug\", name:\"slug\"},\n {label:\"Is Active\", name:\"is_active\", type:\"switch\"}\n ]\n })\n }\n }\n\n async onActionDeletePage(event, element) {\n if (!this.model) return;\n\n const confirmed = await this.getApp().showConfirm({\n title: 'Delete Page',\n body: `Are you sure you want to delete \"${this.model.get('title')}\"?`,\n confirmText: 'Delete',\n confirmClass: 'btn-danger'\n });\n\n if (confirmed) {\n await this.model.destroy();\n this.showSuccess('Page deleted.');\n // Reload the book's pages and navigate to the first one\n await this.getApp().setActiveBook(this.bookModel);\n const firstPage = this.getApp().docPages.at(0);\n if (firstPage) {\n this.getApp().showPage('docs', {}, { doc_book: this.bookModel.get('slug'), doc_page: firstPage.get('slug') });\n } else {\n this.getApp().showPage('docs', {}, { doc_book: this.bookModel.get('slug') });\n }\n }\n }\n\n async onAfterRender() {\n await super.onAfterRender();\n if (typeof Prism !== 'undefined' && this.model) {\n Prism.highlightAll();\n }\n }\n}\n\nexport default DocPage;\n","/**\n * DocEditPage - Markdown editor for documentation pages using TOAST UI Editor.\n */\n\nimport Page from '@core/Page.js';\nimport { DocitPage } from '@ext/docit/models/Page.js';\n\nclass DocEditPage extends Page {\n constructor(options = {}) {\n super({\n pageName: 'edit',\n title: 'Edit Page',\n className: 'docit-edit-page',\n ...options\n });\n\n this.model = null;\n this.editor = null;\n this.isDirty = false;\n }\n\n async getTemplate() {\n return `\n <div class=\"docit-edit-container vh-100\">\n {{#loading}}\n <div class=\"docit-loading\"><div class=\"spinner-border\"></div></div>\n {{/loading}}\n\n {{^loading}}{{#model}}\n <header class=\"docit-edit-header\">\n <div class=\"docit-edit-title-row\">\n <h2>Editing: {{model.title}}</h2>\n <div class=\"docit-edit-actions\">\n <button class=\"btn btn-outline-secondary\" data-action=\"cancel-edit\">Cancel</button>\n <button class=\"btn btn-success\" data-action=\"save-page\">\n <i class=\"bi bi-check-lg\"></i> Save Changes\n </button>\n </div>\n </div>\n </header>\n <div class=\"docit-edit-body flex-grow-1\">\n <div id=\"editor\"></div>\n </div>\n {{/model}}\n {{^model}}\n <div class=\"docit-error-state\">\n <h3>Page Not Found</h3>\n <p>The page you're trying to edit could not be found.</p>\n <button class=\"btn btn-primary\" data-action=\"go-back\">Go Back</button>\n </div>\n {{/model}}{{/loading}}\n </div>\n `;\n }\n\n async onParams(params = {}, query = {}) {\n await super.onParams(params, query);\n let model = null;\n if (query.id) {\n model = new DocitPage({ id: query.id });\n } else if (query.doc_page) {\n model = new DocitPage({ slug: query.doc_page });\n }\n this.model = model;\n if (this.model) {\n await this.model.fetch({ graph: 'detail' });\n }\n }\n\n initEditor() {\n if (this.editor || !this.element.querySelector('#editor')) return;\n\n this.editor = new toastui.Editor({\n el: this.element.querySelector('#editor'),\n height: '100%',\n initialEditType: 'markdown',\n previewStyle: 'tab',\n initialValue: this.model.get('content') || ''\n });\n\n this.editor.on('change', () => {\n this.isDirty = true;\n });\n }\n\n async onActionSavePage() {\n if (!this.model || !this.editor) return;\n\n this.saving = true;\n this.getApp().showLoading(\"saving...\");\n try {\n const content = this.editor.getMarkdown();\n await this.model.save({ content });\n this.isDirty = false;\n this.getApp().toast.success('Page saved successfully.');\n this.getApp().showPage('docs', this.query);\n } catch (error) {\n console.error('Failed to save page:', error);\n this.getApp().toast.error('Failed to save page.');\n } finally {\n this.saving = false;\n this.getApp().hideLoading();\n }\n }\n\n async onActionCancelEdit() {\n this.getApp().showPage('docs', this.query);\n }\n\n onActionGoBack() {\n this.getApp().showPage('docs');\n }\n\n async onBeforeRender() {\n await super.onBeforeRender();\n if (this.editor) {\n this.editor.destroy();\n this.editor = null;\n }\n }\n\n async onAfterRender() {\n await super.onAfterRender();\n if (this.model) {\n this.initEditor();\n }\n }\n\n async onBeforeDestroy() {\n this.editor?.destroy();\n await super.onBeforeDestroy();\n }\n}\n\nexport default DocEditPage;\n","/**\n * DocItApp - Documentation portal application\n * Supports both single-book and multi-book modes with automatic configuration\n */\n\nimport WebApp from '@core/WebApp.js';\nimport TopNav from '@core/views/navigation/TopNav.js';\nimport DocNavSidebar from '@ext/docit/views/DocNavSidebar.js';\nimport DocHomePage from '@ext/docit/pages/DocHomePage.js';\nimport DocPage from '@ext/docit/pages/DocPage.js';\nimport DocEditPage from '@ext/docit/pages/DocEditPage.js';\nimport { DocitBook, DocitBookList } from '@ext/docit/models/Book.js';\nimport { DocitPage, DocitPageList } from '@ext/docit/models/Page.js';\nimport TokenManager from '@core/services/TokenManager.js';\nimport { User } from '@core/models/User.js';\nimport ToastService from '@core/services/ToastService.js';\n\nclass DocItApp extends WebApp {\n constructor(config = {}) {\n // Set defaults for documentation app\n const defaults = {\n name: config.title || 'DocIt Portal',\n version: config.version || '1.0.0',\n debug: config.debug || false,\n container: config.container || '#app',\n defaultRoute: 'home',\n basePath: config.basePath || '',\n ...config\n };\n\n super(defaults);\n\n // DocIt specific configuration\n this.bookSlug = config.bookSlug || null; // If set, locks to single book\n this.showBookNav = config.showBookNav !== undefined ? config.showBookNav : !this.bookSlug;\n this.theme = config.theme || 'light';\n this.editPermissions = config.permissions?.edit || ['manage_docit'];\n\n // Sidebar configuration\n this.sidebarConfig = {\n showSearch: true,\n defaultCollapsed: false,\n ...config.sidebar\n };\n\n // Collections for managing data\n this.books = new DocitBookList();\n this.books.params.sort = \"-order_priority\";\n this.docPages = new DocitPageList();\n this.docPages.params.sort = \"-order_priority\";\n\n this.toast = new ToastService();\n\n // Current state\n this.currentBook = null;\n\n // Components\n this.sidebar = null;\n this.isDocItReady = false;\n\n // Authentication\n this.tokenManager = new TokenManager();\n this.activeUser = null;\n }\n\n /**\n * Start the DocIt application\n */\n async start() {\n try {\n console.log('Starting DocIt Portal...');\n\n // Setup container and basic layout\n this.setupDocItLayout();\n\n // Initialize TopNav\n await this.setupTopNav();\n\n // Initialize sidebar\n await this.setupSidebar();\n\n // Check authentication status first\n await this.checkAuthStatus();\n\n // Register pages\n this.registerDocItPages();\n\n // Start the web app (router, events, etc)\n await super.start();\n\n // Load initial data\n await this.loadInitialData();\n\n // Mark as ready\n this.isDocItReady = true;\n this.events.emit('docit:ready', { app: this });\n\n console.log('✅ DocIt Portal ready');\n } catch (error) {\n console.error('Failed to start DocIt:', error);\n this.showError('Failed to initialize documentation portal');\n throw error;\n }\n }\n\n /**\n * Setup DocIt specific layout\n */\n setupDocItLayout() {\n const container = typeof this.container === 'string'\n ? document.querySelector(this.container)\n : this.container;\n\n if (!container) {\n throw new Error(`Container not found: ${this.container}`);\n }\n\n // Apply theme\n container.classList.add('docit-app', `docit-theme-${this.theme}`);\n\n // Create layout structure\n container.innerHTML = `\n <div class=\"docit-app-layout\">\n <div id=\"topnav-container\"></div>\n <div class=\"docit-body-layout\">\n <div class=\"docit-sidebar\" id=\"docit-sidebar\"></div>\n <div class=\"docit-main\">\n <div class=\"docit-content\" id=\"page-container\"></div>\n </div>\n </div>\n </div>\n `;\n\n this.pageContainer = '#page-container';\n }\n\n async setupTopNav() {\n this.topnav = new TopNav({\n containerId: 'topnav-container',\n brand: this.name,\n theme: 'navbar navbar-expand-lg bg-dark navbar-dark',\n showSidebarToggle: false,\n displayMode: \"brand\",\n rightItems: [\n {\n id: \"login\",\n icon: 'bi-box-arrow-in-right',\n href: '/examples/auth/',\n label: 'Login'\n },\n ],\n userMenu: {\n label: 'User',\n icon: 'bi-person-circle',\n items: [\n {\n label: 'Profile',\n icon: 'bi-person',\n action: 'profile'\n },\n {\n divider: true\n },\n {\n label: 'Logout',\n icon: 'bi-box-arrow-right',\n action: 'logout'\n }\n ]\n }\n });\n await this.topnav.render();\n }\n\n onActionToggleSidebar() {\n const layout = document.querySelector('.docit-layout');\n layout.classList.toggle('sidebar-collapsed');\n }\n\n /**\n * Setup sidebar navigation\n */\n async setupSidebar() {\n this.sidebar = new DocNavSidebar({\n containerId: 'docit-sidebar',\n app: this,\n singleBookMode: !!this.bookSlug,\n showBookNav: this.showBookNav,\n books: this.books,\n docPages: this.docPages,\n activeUser: this.activeUser,\n ...this.sidebarConfig\n });\n\n await this.sidebar.render();\n }\n\n /**\n * Register DocIt pages\n */\n registerDocItPages() {\n this.registerPage('home', DocHomePage, {\n route: '/',\n permissions: null\n });\n\n this.registerPage('docs', DocPage, {\n route: '/docs',\n permissions: null // Public access\n });\n\n this.registerPage('edit', DocEditPage, {\n route: '/edit',\n permissions: this.editPermissions\n });\n }\n\n /**\n * Load initial data based on mode\n */\n async loadInitialData() {\n try {\n if (this.bookSlug) {\n // Single-book mode: Load the specified book\n const book = new DocitBook({ slug: this.bookSlug });\n await book.fetch();\n if (book.id) {\n this.books.add(book);\n await this.setActiveBook(book);\n } else {\n throw new Error(`Book with slug '${this.bookSlug}' not found.`);\n }\n } else {\n // Multi-book mode: Load all books\n await this.books.fetch({ graph: 'list' });\n this.sidebar.render();\n }\n } catch (error) {\n console.error('Failed to load initial data:', error);\n this.showError('Failed to load documentation');\n }\n }\n\n /**\n * Set the active book and load its pages\n * @param {DocitBook} book - The book to set as active\n */\n async setActiveBook(book) {\n if (this.currentBook && book && this.currentBook.id === book.id) {\n return;\n }\n\n this.currentBook = book;\n this.docPages.reset();\n\n if (book) {\n await this.docPages.fetch({\n book: book.get('id'),\n graph: 'list'\n });\n }\n\n this.sidebar.setCurrentBook(book);\n this.sidebar.setDocPages(this.docPages);\n\n this.events.emit('docit:book-changed', { book });\n }\n\n /**\n * Save doc page content using Model\n */\n async saveDocPageContent(docPageId, content) {\n const docPage = this.docPages.get(docPageId) || new DocitPage({ id: docPageId });\n\n docPage.set('content', content);\n const response = await docPage.save();\n\n if (!response.success || !response.data.status) {\n throw new Error('Failed to save doc page');\n }\n\n return docPage;\n }\n\n /**\n * Check if user can edit\n */\n canEdit() {\n const user = this.activeUser;\n if (!user) return false;\n return this.editPermissions.some(perm => user.hasPermission ? user.hasPermission(perm) : false);\n }\n\n /**\n * Check authentication status and load user\n */\n async checkAuthStatus() {\n try {\n const token = this.tokenManager.getTokenInstance();\n\n if (!token || !token.isValid()) {\n this.events.emit('auth:unauthorized', { app: this });\n return;\n }\n\n if (token.isExpired()) {\n this.events.emit('auth:expired', { app: this });\n return;\n }\n\n this.tokenManager.startAutoRefresh(this);\n this.rest.setAuthToken(token.token);\n\n const user = new User({ id: token.getUserId() });\n await user.fetch();\n this.setActiveUser(user);\n } catch (error) {\n console.error('Failed to check auth status:', error);\n this.events.emit('auth:error', { error, app: this });\n }\n }\n\n /**\n * Set the active authenticated user\n */\n setActiveUser(user) {\n this.activeUser = user;\n if (this.sidebar) {\n this.sidebar.setUser(user);\n }\n if (this.topnav) {\n this.topnav.setUser(user);\n this.tonnav.render();\n }\n this.events.emit('user:changed', { user, app: this });\n return this;\n }\n\n /**\n * Clear the active user (logout)\n */\n clearActiveUser() {\n this.activeUser = null;\n this.tokenManager.clearTokens();\n this.rest.clearAuth();\n if (this.sidebar) {\n this.sidebar.setUser(null);\n }\n this.events.emit('user:cleared', { app: this });\n return this;\n }\n\n /**\n * Handle logout\n */\n async logout() {\n this.clearActiveUser();\n this.books.reset();\n this.docPages.reset();\n this.currentBook = null;\n this.events.emit('auth:logout', { app: this });\n window.location.reload();\n }\n\n async createNewBook() {\n const result = await this.showModelForm({\n title: 'Create New Book',\n model: new DocitBook(),\n fields: [\n { name: 'title', label: 'Title', required: true },\n { name: 'slug', label: 'Slug', required: true, helpText: 'A URL-friendly identifier.' }\n ]\n });\n\n if (result && result.success) {\n this.books.add(result.data);\n this.sidebar.render();\n this.showSuccess('Book created successfully.');\n }\n }\n\n async createNewPage(book) {\n if (!book) return;\n\n const data = await this.showForm({\n title: 'Create New Page',\n fields: [\n { name: 'title', label: 'Title', required: true },\n { name: 'slug', label: 'Slug', required: true, helpText: 'A URL-friendly identifier.' }\n ]\n });\n\n if (data && data.slug) {\n data.book = book.id;\n }\n\n const newPage = new DocitPage();\n const result = await newPage.save(data);\n\n if (result && result.success) {\n this.docPages.add(newPage);\n this.sidebar.render();\n // this.showSuccess('Page created successfully.');\n\n this.showPage('edit', {\n id: newPage.id,\n doc_book: book.get('slug'),\n doc_page: newPage.get('slug')\n }, {});\n }\n }\n\n /**\n * Static factory method for quick setup\n */\n static create(config = {}) {\n return new DocItApp(config);\n }\n\n /**\n * Quick setup for single-book mode\n */\n static createForBook(bookSlug, config = {}) {\n return new DocItApp({\n ...config,\n bookSlug,\n showBookNav: false\n });\n }\n}\n\nexport default DocItApp;\n"],"names":["DocNavSidebar","View","constructor","options","super","className","tagName","this","singleBookMode","books","docPages","activeUser","currentBook","currentDocPage","onInit","getApp","events","on","_onPageShow","bind","query","bookSlug","doc_book","pageSlug","doc_page","app","book","findWhere","slug","id","setActiveBook","render","getTemplate","onBeforeRender","canEdit","forEach","page","isActive","onActionSelectBook","event","element","preventDefault","dataset","firstPage","at","get","showPage","onActionSelectPage","onActionBackToBooks","onActionCreateBook","createNewBook","onActionCreatePage","createNewPage","setBooks","setDocPages","setCurrentBook","topnav","setBrand","setUser","user","DocHomePage","Page","pageName","title","DocitBook","Model","static","buildUrl","endpoint","DocitBookList","Collection","ModelClass","parse","response","data","status","meta","total","count","graph","DocitPage","DocitPageList","DocPage","bookModel","model","pageContextMenu","ContextMenu","config","getPageContextMenuConfig","containerId","addChild","icon","buttonClass","items","label","action","type","danger","onParams","params","loading","fetch","setupNavigation","error","console","showError","emit","setTimeout","prevPage","nextPage","pages","models","currentIndex","findIndex","p","length","onActionNavigateToPage","onActionEditPage","onActionViewHistory","showInfo","onActionEditPageInfo","showModelForm","fields","name","onActionEditBook","sidebar","onActionDeletePage","showConfirm","body","confirmText","confirmClass","destroy","showSuccess","onAfterRender","Prism","highlightAll","DocEditPage","editor","isDirty","initEditor","querySelector","toastui","Editor","el","height","initialEditType","previewStyle","initialValue","onActionSavePage","saving","showLoading","content","getMarkdown","save","toast","success","hideLoading","onActionCancelEdit","onActionGoBack","onBeforeDestroy","DocItApp","WebApp","version","debug","container","defaultRoute","basePath","showBookNav","theme","editPermissions","permissions","edit","sidebarConfig","showSearch","defaultCollapsed","sort","ToastService","isDocItReady","tokenManager","TokenManager","start","setupDocItLayout","setupTopNav","setupSidebar","checkAuthStatus","registerDocItPages","loadInitialData","document","Error","classList","add","innerHTML","pageContainer","TopNav","brand","showSidebarToggle","displayMode","rightItems","href","userMenu","divider","onActionToggleSidebar","toggle","registerPage","route","reset","saveDocPageContent","docPageId","docPage","set","some","perm","hasPermission","token","getTokenInstance","isValid","isExpired","startAutoRefresh","rest","setAuthToken","User","getUserId","setActiveUser","tonnav","clearActiveUser","clearTokens","clearAuth","logout","window","location","reload","result","required","helpText","showForm","newPage","create","createForBook"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"docit.cjs.js","sources":["../src/extensions/docit/views/DocNavSidebar.js","../src/extensions/docit/pages/DocHomePage.js","../src/extensions/docit/models/Book.js","../src/extensions/docit/models/Page.js","../src/extensions/docit/pages/DocPage.js","../src/extensions/docit/pages/DocEditPage.js","../src/extensions/docit/DocItApp.js"],"sourcesContent":["/**\n * DocNavSidebar - Navigation sidebar for DocIt documentation portal.\n * This view is reactive and relies on the parent DocItApp for state management.\n */\n\nimport View from '@core/View.js';\n\nclass DocNavSidebar extends View {\n constructor(options = {}) {\n super({\n className: 'docit-sidebar-nav',\n tagName: 'nav',\n ...options\n });\n\n this.singleBookMode = options.singleBookMode || false;\n this.books = options.books;\n this.docPages = options.docPages;\n this.activeUser = options.activeUser;\n this.currentBook = null;\n this.currentDocPage = null;\n }\n\n async onInit() {\n await super.onInit();\n this.getApp().events.on('page:show', this._onPageShow.bind(this));\n }\n\n async _onPageShow({ query }) {\n const bookSlug = query.doc_book;\n const pageSlug = query.doc_page;\n const app = this.getApp();\n\n if (bookSlug) {\n const book = this.books.findWhere({ slug: bookSlug });\n if (book && (!this.currentBook || this.currentBook.id !== book.id)) {\n await app.setActiveBook(book);\n this.currentBook = app.currentBook;\n }\n } else {\n if (this.currentBook) {\n await app.setActiveBook(null);\n this.currentBook = null;\n }\n }\n\n this.currentDocPage = pageSlug ? this.docPages.findWhere({ slug: pageSlug }) : null;\n this.render();\n }\n\n getTemplate() {\n return `\n <div class=\"docit-nav-body pt-3\">\n {{#currentBook}}\n {{#docPages.models}}\n <a href=\"#\" class=\"docit-page-link {{#isActive}}active{{/isActive}}\"\n data-action=\"select-page\" data-page-slug=\"{{slug}}\">\n <i class=\"{{#metadata.icon}}{{metadata.icon}}{{/metadata.icon}}{{^metadata.icon}}bi bi-file-earmark-text{{/metadata.icon}} me-2\"></i>\n <span>{{title|capitalize}}</span>\n </a>\n {{/docPages.models}}\n {{^docPages.models}}\n <div class=\"docit-nav-empty\"><p>No pages in this book.</p></div>\n {{/docPages.models}}\n {{/currentBook}}\n {{^currentBook}}\n {{#books.models}}\n <a href=\"#\" class=\"docit-book-item\" data-action=\"select-book\" data-book-slug=\"{{slug}}\">\n <i class=\"bi bi-book me-2\"></i>\n <span class=\"book-title\">{{title}}</span>\n <span class=\"badge bg-secondary ms-auto\">{{page_count}}</span>\n </a>\n {{/books.models}}\n {{/currentBook}}\n </div>\n {{#currentBook}}\n <div class=\"docit-nav-footer\">\n {{#canEdit}}\n <button class=\"btn btn-link w-100 mb-2\" data-action=\"create-page\">\n <i class=\"bi bi-plus-circle me-2\"></i>\n Create New Page\n </button>\n {{/canEdit}}\n <button class=\"btn btn-link w-100\" data-action=\"back-to-books\">\n <i class=\"bi bi-arrow-left me-2\"></i>\n Back to Books\n </button>\n </div>\n {{/currentBook}}\n {{^currentBook}}\n {{#canEdit}}\n <div class=\"docit-nav-footer\">\n <button class=\"btn btn-link w-100\" data-action=\"create-book\">\n <i class=\"bi bi-plus-circle me-2\"></i>\n Create New Book\n </button>\n </div>\n {{/canEdit}}\n {{/currentBook}}\n `;\n }\n\n async onBeforeRender() {\n await super.onBeforeRender();\n this.canEdit = this.getApp().canEdit();\n if (this.docPages && this.currentDocPage) {\n this.docPages.forEach(page => {\n page.isActive = (page.id === this.currentDocPage.id);\n });\n }\n }\n\n async onActionSelectBook(event, element) {\n event.preventDefault();\n const bookSlug = element.dataset.bookSlug;\n const book = this.books.findWhere({ slug: bookSlug });\n if (book) {\n await this.getApp().setActiveBook(book);\n const firstPage = this.docPages.at(0);\n const query = { doc_book: book.get('slug') };\n if (firstPage) {\n query.doc_page = firstPage.get('slug');\n }\n this.getApp().showPage('docs', query, {});\n }\n }\n\n onActionSelectPage(event, element) {\n event.preventDefault();\n const pageSlug = element.dataset.pageSlug;\n if (this.currentBook && pageSlug) {\n this.getApp().showPage('docs', {\n doc_book: this.currentBook.get('slug'),\n doc_page: pageSlug\n }, {});\n }\n }\n\n async onActionBackToBooks(event, element) {\n event.preventDefault();\n await this.getApp().setActiveBook(null);\n this.getApp().showPage('home');\n }\n\n async onActionCreateBook() {\n await this.getApp().createNewBook();\n }\n\n async onActionCreatePage() {\n if (this.currentBook) {\n await this.getApp().createNewPage(this.currentBook);\n }\n }\n\n setBooks(books) { this.books = books; this.render(); }\n setDocPages(docPages) { this.docPages = docPages; this.render(); }\n setCurrentBook(book) {\n this.currentBook = book;\n this.render();\n if (this.getApp().topnav) {\n if (book) {\n this.getApp().topnav.setBrand(book.get(\"title\"));\n } else {\n this.getApp().topnav.setBrand(\"Documentation\");\n }\n\n }\n }\n setUser(user) { this.activeUser = user; this.render(); }\n}\n\nexport default DocNavSidebar;\n","/**\n * DocHomePage - The default landing page for the documentation portal.\n * Instructs the user to select a book to begin.\n */\n\nimport Page from '@core/Page.js';\n\nclass DocHomePage extends Page {\n constructor(options = {}) {\n super({\n pageName: 'home',\n title: 'Documentation',\n className: 'docit-home-page',\n ...options\n });\n }\n\n async getTemplate() {\n return `\n <div class=\"docit-empty-state vh-100 d-flex flex-column align-items-center justify-content-center\">\n <i class=\"bi bi-collection\" style=\"font-size: 4rem;\"></i>\n <h3 class=\"mt-4\">Welcome to the Documentation Portal</h3>\n <p class=\"text-muted\">Please select a book from the sidebar to get started.</p>\n </div>\n `;\n }\n}\n\nexport default DocHomePage;","import Model from '@core/Model.js';\nimport Collection from '@core/Collection.js';\n\n/**\n * DocitBook - Model for documentation books.\n * Handles fetching book data by ID or slug.\n */\nexport class DocitBook extends Model {\n static endpoint = '/api/docit/book';\n\n buildUrl(id = null) {\n if (this.get('slug') && !this.id) {\n return `/api/docit/book/slug/${this.get('slug')}`;\n } else if (this.id) {\n return `/api/docit/book/${this.id}`;\n }\n return this.endpoint;\n }\n}\n\n/**\n * DocitBookList - Collection of documentation books.\n */\nexport class DocitBookList extends Collection {\n constructor(options = {}) {\n super({\n ModelClass: DocitBook,\n endpoint: '/api/docit/book',\n ...options\n });\n }\n\n /**\n * Custom parsing to handle the specific API response structure for book lists.\n */\n parse(response) {\n if (response.data && response.data.status) {\n this.meta = {\n ...this.meta,\n total: response.data.count || 0,\n graph: response.data.graph\n };\n return response.data.data || [];\n }\n return super.parse(response);\n }\n}\n\nexport default DocitBook;\n","import Model from '@core/Model.js';\nimport Collection from '@core/Collection.js';\n\n/**\n * DocitPage - Model for documentation pages.\n * Handles fetching page data by ID or slug.\n */\nexport class DocitPage extends Model {\n static endpoint = '/api/docit/page';\n\n buildUrl(id = null) {\n if (this.get('slug') && !this.id) {\n return `/api/docit/page/slug/${this.get('slug')}`;\n } else if (this.id) {\n return `/api/docit/page/${this.id}`;\n }\n return this.endpoint;\n }\n}\n\n/**\n * DocitPageList - Collection of documentation pages.\n */\nexport class DocitPageList extends Collection {\n constructor(options = {}) {\n super({\n ModelClass: DocitPage,\n endpoint: '/api/docit/page',\n ...options\n });\n }\n\n /**\n * Custom parsing to handle the specific API response structure for page lists.\n */\n parse(response) {\n if (response.data && response.data.status) {\n this.meta = {\n ...this.meta,\n total: response.data.count || 0,\n graph: response.data.graph,\n book: response.data.book\n };\n return response.data.data || [];\n }\n return super.parse(response);\n }\n}\n\nexport default DocitPage;\n","/**\n * DocPage - Main documentation page viewer\n * Displays rendered HTML content from markdown pages. This page is URL-driven.\n */\n\nimport Page from '@core/Page.js';\nimport ContextMenu from '@core/views/feedback/ContextMenu.js';\nimport { DocitBook } from '@ext/docit/models/Book.js';\nimport { DocitPage } from '@ext/docit/models/Page.js';\n\nclass DocPage extends Page {\n constructor(options = {}) {\n super({\n pageName: 'docs',\n title: 'Documentation',\n className: 'docit-page',\n ...options\n });\n\n this.bookModel = null;\n this.model = null;\n }\n\n async onInit() {\n await super.onInit();\n this.pageContextMenu = new ContextMenu({\n config: this.getPageContextMenuConfig(),\n containerId: 'page-context-menu'\n });\n this.addChild(this.pageContextMenu);\n }\n\n getPageContextMenuConfig() {\n return {\n icon: 'bi-three-dots',\n buttonClass: 'btn btn-outline-secondary btn-sm',\n items: [\n { label: 'View History', action: 'view-history', icon: 'bi-clock-history' },\n { type: 'divider' },\n { label: 'Edit Page Content', action: 'edit-page', icon: 'bi-pencil' },\n { label: 'Edit Page Info', action: 'edit-page-info', icon: 'bi-list-ol' },\n { type: 'divider' },\n { label: 'Edit Book Info', action: 'edit-book', icon: 'bi-book' },\n { type: 'divider' },\n { label: 'Delete Page', action: 'delete-page', icon: 'bi-trash', danger: true },\n ]\n };\n }\n\n async getTemplate() {\n return `\n <div class=\"docit-page-container position-relative\">\n {{#loading}}\n <div class=\"docit-loading\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n {{/loading}}\n\n {{^loading}}\n {{#model|bool}}\n <div class=\"docit-page-toolbar\">\n <div class=\"row\">\n <div class=\"col d-flex justify-content-end\">\n <div data-container=\"page-context-menu\"></div>\n </div>\n </div>\n </div>\n <article class=\"docit-page-content\">\n {{{model.html}}}\n </article>\n\n <nav class=\"docit-page-nav\">\n {{#prevPage}}\n <a href=\"#\" class=\"docit-nav-prev\" data-action=\"navigate-to-page\" data-page-slug=\"{{slug}}\">\n <i class=\"bi bi-arrow-left\"></i>\n <div>\n <small>Previous</small>\n <span>{{title}}</span>\n </div>\n </a>\n {{/prevPage}}\n {{^prevPage}}\n <div></div>\n {{/prevPage}}\n\n {{#nextPage}}\n <a href=\"#\" class=\"docit-nav-next\" data-action=\"navigate-to-page\" data-page-slug=\"{{slug}}\">\n <div>\n <small>Next</small>\n <span>{{title}}</span>\n </div>\n <i class=\"bi bi-arrow-right\"></i>\n </a>\n {{/nextPage}}\n\n <div class=\"my-3\">\n <span class=\"text-muted\">Last updated: {{model.modified|datetime}}</span>\n </div>\n </nav>\n {{/model|bool}}\n\n {{^model|bool}}\n <div class=\"docit-empty-state\">\n <i class=\"bi bi-file-earmark-text\"></i>\n <h3>Select a page</h3>\n <p>Choose a page from the sidebar to view its content.</p>\n </div>\n {{/model|bool}}\n {{/loading}}\n </div>\n `;\n }\n\n async onParams(params = {}, query = {}) {\n await super.onParams(params, query);\n this.loading = true;\n await this.render();\n\n const app = this.getApp();\n const bookSlug = app.bookSlug || query.doc_book;\n const pageSlug = query.doc_page;\n\n if (!bookSlug) {\n setTimeout(() => {\n app.showPage('home');\n }, 100);\n return;\n }\n\n try {\n if (bookSlug) {\n if (!app.currentBook || app.currentBook.get('slug') !== bookSlug) {\n const book = new DocitBook({ slug: bookSlug });\n await book.fetch();\n await app.setActiveBook(book);\n }\n this.bookModel = app.currentBook;\n\n if (pageSlug) {\n this.model = new DocitPage({ slug: pageSlug });\n await this.model.fetch({ graph: 'html' });\n } else {\n const firstPage = app.docPages.at(0);\n if (firstPage) {\n this.model = new DocitPage({ id: firstPage.id });\n await this.model.fetch({ graph: 'html' });\n } else {\n this.model = null;\n }\n }\n } else {\n this.bookModel = null;\n this.model = null;\n }\n\n this.canEdit = app.canEdit();\n this.setupNavigation();\n\n } catch (error) {\n console.error('Failed to load page:', error);\n this.showError('Failed to load documentation page');\n this.model = null;\n } finally {\n this.loading = false;\n await this.render();\n app.events.emit('docit:page-rendered', {\n book: this.bookModel,\n page: this.model\n });\n }\n }\n\n setupNavigation() {\n if (!this.model) {\n this.prevPage = null;\n this.nextPage = null;\n return;\n }\n\n const app = this.getApp();\n const pages = app.docPages.models;\n const currentIndex = pages.findIndex(p => p.id === this.model.id);\n\n this.prevPage = currentIndex > 0 ? { slug: pages[currentIndex - 1].get('slug'), title: pages[currentIndex - 1].get('title') } : null;\n this.nextPage = currentIndex < pages.length - 1 ? { slug: pages[currentIndex + 1].get('slug'), title: pages[currentIndex + 1].get('title') } : null;\n }\n\n async onActionNavigateToPage(event, element) {\n event.preventDefault();\n const pageSlug = element.dataset.pageSlug;\n if (pageSlug) {\n this.getApp().showPage('docs', {}, {\n doc_book: this.bookModel.get('slug'),\n doc_page: pageSlug\n });\n }\n }\n\n async onActionEditPage(event, element) {\n event.preventDefault();\n if (this.model) {\n this.getApp().showPage('edit', {\n id: this.model.id,\n doc_book: this.bookModel.get('slug'),\n doc_page: this.model.get('slug')\n }, {});\n }\n }\n\n async onActionViewHistory(event, element) {\n this.showInfo('Revision history coming soon.');\n }\n\n async onActionEditPageInfo(event, element) {\n if (this.model) {\n this.getApp().showModelForm({\n model: this.model,\n fields: [\n {label:\"Title\", name:\"title\", type: \"text\"},\n {label:\"Order Priority\", name:\"order_priority\"},\n {label:\"Slug\", name:\"slug\"}\n ]\n })\n }\n }\n\n async onActionEditBook(event, element) {\n if (this.model) {\n const book = this.getApp().sidebar.currentBook;\n if (!book) return;\n this.getApp().showModelForm({\n model: book,\n fields: [\n {label:\"Title\", name:\"title\", type: \"text\"},\n {label:\"Order Priority\", name:\"order_priority\"},\n {label:\"Slug\", name:\"slug\"},\n {label:\"Is Active\", name:\"is_active\", type:\"switch\"}\n ]\n })\n }\n }\n\n async onActionDeletePage(event, element) {\n if (!this.model) return;\n\n const confirmed = await this.getApp().showConfirm({\n title: 'Delete Page',\n body: `Are you sure you want to delete \"${this.model.get('title')}\"?`,\n confirmText: 'Delete',\n confirmClass: 'btn-danger'\n });\n\n if (confirmed) {\n await this.model.destroy();\n this.showSuccess('Page deleted.');\n // Reload the book's pages and navigate to the first one\n await this.getApp().setActiveBook(this.bookModel);\n const firstPage = this.getApp().docPages.at(0);\n if (firstPage) {\n this.getApp().showPage('docs', {}, { doc_book: this.bookModel.get('slug'), doc_page: firstPage.get('slug') });\n } else {\n this.getApp().showPage('docs', {}, { doc_book: this.bookModel.get('slug') });\n }\n }\n }\n\n async onAfterRender() {\n await super.onAfterRender();\n if (typeof Prism !== 'undefined' && this.model) {\n Prism.highlightAll();\n }\n }\n}\n\nexport default DocPage;\n","/**\n * DocEditPage - Markdown editor for documentation pages using TOAST UI Editor.\n */\n\nimport Page from '@core/Page.js';\nimport { DocitPage } from '@ext/docit/models/Page.js';\n\nclass DocEditPage extends Page {\n constructor(options = {}) {\n super({\n pageName: 'edit',\n title: 'Edit Page',\n className: 'docit-edit-page',\n ...options\n });\n\n this.model = null;\n this.editor = null;\n this.isDirty = false;\n }\n\n async getTemplate() {\n return `\n <div class=\"docit-edit-container vh-100\">\n {{#loading}}\n <div class=\"docit-loading\"><div class=\"spinner-border\"></div></div>\n {{/loading}}\n\n {{^loading}}{{#model}}\n <header class=\"docit-edit-header\">\n <div class=\"docit-edit-title-row\">\n <h2>Editing: {{model.title}}</h2>\n <div class=\"docit-edit-actions\">\n <button class=\"btn btn-outline-secondary\" data-action=\"cancel-edit\">Cancel</button>\n <button class=\"btn btn-success\" data-action=\"save-page\">\n <i class=\"bi bi-check-lg\"></i> Save Changes\n </button>\n </div>\n </div>\n </header>\n <div class=\"docit-edit-body flex-grow-1\">\n <div id=\"editor\"></div>\n </div>\n {{/model}}\n {{^model}}\n <div class=\"docit-error-state\">\n <h3>Page Not Found</h3>\n <p>The page you're trying to edit could not be found.</p>\n <button class=\"btn btn-primary\" data-action=\"go-back\">Go Back</button>\n </div>\n {{/model}}{{/loading}}\n </div>\n `;\n }\n\n async onParams(params = {}, query = {}) {\n await super.onParams(params, query);\n let model = null;\n if (query.id) {\n model = new DocitPage({ id: query.id });\n } else if (query.doc_page) {\n model = new DocitPage({ slug: query.doc_page });\n }\n this.model = model;\n if (this.model) {\n await this.model.fetch({ graph: 'detail' });\n }\n }\n\n initEditor() {\n if (this.editor || !this.element.querySelector('#editor')) return;\n\n this.editor = new toastui.Editor({\n el: this.element.querySelector('#editor'),\n height: '100%',\n initialEditType: 'markdown',\n previewStyle: 'tab',\n initialValue: this.model.get('content') || ''\n });\n\n this.editor.on('change', () => {\n this.isDirty = true;\n });\n }\n\n async onActionSavePage() {\n if (!this.model || !this.editor) return;\n\n this.saving = true;\n this.getApp().showLoading(\"saving...\");\n try {\n const content = this.editor.getMarkdown();\n await this.model.save({ content });\n this.isDirty = false;\n this.getApp().toast.success('Page saved successfully.');\n this.getApp().showPage('docs', this.query);\n } catch (error) {\n console.error('Failed to save page:', error);\n this.getApp().toast.error('Failed to save page.');\n } finally {\n this.saving = false;\n this.getApp().hideLoading();\n }\n }\n\n async onActionCancelEdit() {\n this.getApp().showPage('docs', this.query);\n }\n\n onActionGoBack() {\n this.getApp().showPage('docs');\n }\n\n async onBeforeRender() {\n await super.onBeforeRender();\n if (this.editor) {\n this.editor.destroy();\n this.editor = null;\n }\n }\n\n async onAfterRender() {\n await super.onAfterRender();\n if (this.model) {\n this.initEditor();\n }\n }\n\n async onBeforeDestroy() {\n this.editor?.destroy();\n await super.onBeforeDestroy();\n }\n}\n\nexport default DocEditPage;\n","/**\n * DocItApp - Documentation portal application\n * Supports both single-book and multi-book modes with automatic configuration\n */\n\nimport WebApp from '@core/WebApp.js';\nimport TopNav from '@core/views/navigation/TopNav.js';\nimport DocNavSidebar from '@ext/docit/views/DocNavSidebar.js';\nimport DocHomePage from '@ext/docit/pages/DocHomePage.js';\nimport DocPage from '@ext/docit/pages/DocPage.js';\nimport DocEditPage from '@ext/docit/pages/DocEditPage.js';\nimport { DocitBook, DocitBookList } from '@ext/docit/models/Book.js';\nimport { DocitPage, DocitPageList } from '@ext/docit/models/Page.js';\nimport TokenManager from '@core/services/TokenManager.js';\nimport { User } from '@core/models/User.js';\nimport ToastService from '@core/services/ToastService.js';\n\nclass DocItApp extends WebApp {\n constructor(config = {}) {\n // Set defaults for documentation app\n const defaults = {\n name: config.title || 'DocIt Portal',\n version: config.version || '1.0.0',\n debug: config.debug || false,\n container: config.container || '#app',\n defaultRoute: 'home',\n basePath: config.basePath || '',\n ...config\n };\n\n super(defaults);\n\n // DocIt specific configuration\n this.bookSlug = config.bookSlug || null; // If set, locks to single book\n this.showBookNav = config.showBookNav !== undefined ? config.showBookNav : !this.bookSlug;\n this.theme = config.theme || 'light';\n this.editPermissions = config.permissions?.edit || ['manage_docit'];\n\n // Sidebar configuration\n this.sidebarConfig = {\n showSearch: true,\n defaultCollapsed: false,\n ...config.sidebar\n };\n\n // Collections for managing data\n this.books = new DocitBookList();\n this.books.params.sort = \"-order_priority\";\n this.docPages = new DocitPageList();\n this.docPages.params.sort = \"-order_priority\";\n\n this.toast = new ToastService();\n\n // Current state\n this.currentBook = null;\n\n // Components\n this.sidebar = null;\n this.isDocItReady = false;\n\n // Authentication\n this.tokenManager = new TokenManager();\n this.activeUser = null;\n }\n\n /**\n * Start the DocIt application\n */\n async start() {\n try {\n console.log('Starting DocIt Portal...');\n\n // Setup container and basic layout\n this.setupDocItLayout();\n\n // Initialize TopNav\n await this.setupTopNav();\n\n // Initialize sidebar\n await this.setupSidebar();\n\n // Check authentication status first\n await this.checkAuthStatus();\n\n // Register pages\n this.registerDocItPages();\n\n // Start the web app (router, events, etc)\n await super.start();\n\n // Load initial data\n await this.loadInitialData();\n\n // Mark as ready\n this.isDocItReady = true;\n this.events.emit('docit:ready', { app: this });\n\n console.log('✅ DocIt Portal ready');\n } catch (error) {\n console.error('Failed to start DocIt:', error);\n this.showError('Failed to initialize documentation portal');\n throw error;\n }\n }\n\n /**\n * Setup DocIt specific layout\n */\n setupDocItLayout() {\n const container = typeof this.container === 'string'\n ? document.querySelector(this.container)\n : this.container;\n\n if (!container) {\n throw new Error(`Container not found: ${this.container}`);\n }\n\n // Apply theme\n container.classList.add('docit-app', `docit-theme-${this.theme}`);\n\n // Create layout structure\n container.innerHTML = `\n <div class=\"docit-app-layout\">\n <div id=\"topnav-container\"></div>\n <div class=\"docit-body-layout\">\n <div class=\"docit-sidebar\" id=\"docit-sidebar\"></div>\n <div class=\"docit-main\">\n <div class=\"docit-content\" id=\"page-container\"></div>\n </div>\n </div>\n </div>\n `;\n\n this.pageContainer = '#page-container';\n }\n\n async setupTopNav() {\n this.topnav = new TopNav({\n containerId: 'topnav-container',\n brand: this.name,\n theme: 'navbar navbar-expand-lg bg-dark navbar-dark',\n showSidebarToggle: false,\n displayMode: \"brand\",\n rightItems: [\n {\n id: \"login\",\n icon: 'bi-box-arrow-in-right',\n href: '/examples/auth/',\n label: 'Login'\n },\n ],\n userMenu: {\n label: 'User',\n icon: 'bi-person-circle',\n items: [\n {\n label: 'Profile',\n icon: 'bi-person',\n action: 'profile'\n },\n {\n divider: true\n },\n {\n label: 'Logout',\n icon: 'bi-box-arrow-right',\n action: 'logout'\n }\n ]\n }\n });\n await this.topnav.render();\n }\n\n onActionToggleSidebar() {\n const layout = document.querySelector('.docit-layout');\n layout.classList.toggle('sidebar-collapsed');\n }\n\n /**\n * Setup sidebar navigation\n */\n async setupSidebar() {\n this.sidebar = new DocNavSidebar({\n containerId: 'docit-sidebar',\n app: this,\n singleBookMode: !!this.bookSlug,\n showBookNav: this.showBookNav,\n books: this.books,\n docPages: this.docPages,\n activeUser: this.activeUser,\n ...this.sidebarConfig\n });\n\n await this.sidebar.render();\n }\n\n /**\n * Register DocIt pages\n */\n registerDocItPages() {\n this.registerPage('home', DocHomePage, {\n route: '/',\n permissions: null\n });\n\n this.registerPage('docs', DocPage, {\n route: '/docs',\n permissions: null // Public access\n });\n\n this.registerPage('edit', DocEditPage, {\n route: '/edit',\n permissions: this.editPermissions\n });\n }\n\n /**\n * Load initial data based on mode\n */\n async loadInitialData() {\n try {\n if (this.bookSlug) {\n // Single-book mode: Load the specified book\n const book = new DocitBook({ slug: this.bookSlug });\n await book.fetch();\n if (book.id) {\n this.books.add(book);\n await this.setActiveBook(book);\n } else {\n throw new Error(`Book with slug '${this.bookSlug}' not found.`);\n }\n } else {\n // Multi-book mode: Load all books\n await this.books.fetch({ graph: 'list' });\n this.sidebar.render();\n }\n } catch (error) {\n console.error('Failed to load initial data:', error);\n this.showError('Failed to load documentation');\n }\n }\n\n /**\n * Set the active book and load its pages\n * @param {DocitBook} book - The book to set as active\n */\n async setActiveBook(book) {\n if (this.currentBook && book && this.currentBook.id === book.id) {\n return;\n }\n\n this.currentBook = book;\n this.docPages.reset();\n\n if (book) {\n await this.docPages.fetch({\n book: book.get('id'),\n graph: 'list'\n });\n }\n\n this.sidebar.setCurrentBook(book);\n this.sidebar.setDocPages(this.docPages);\n\n this.events.emit('docit:book-changed', { book });\n }\n\n /**\n * Save doc page content using Model\n */\n async saveDocPageContent(docPageId, content) {\n const docPage = this.docPages.get(docPageId) || new DocitPage({ id: docPageId });\n\n docPage.set('content', content);\n const response = await docPage.save();\n\n if (!response.success || !response.data.status) {\n throw new Error('Failed to save doc page');\n }\n\n return docPage;\n }\n\n /**\n * Check if user can edit\n */\n canEdit() {\n const user = this.activeUser;\n if (!user) return false;\n return this.editPermissions.some(perm => user.hasPermission ? user.hasPermission(perm) : false);\n }\n\n /**\n * Check authentication status and load user\n */\n async checkAuthStatus() {\n try {\n const token = this.tokenManager.getTokenInstance();\n\n if (!token || !token.isValid()) {\n this.events.emit('auth:unauthorized', { app: this });\n return;\n }\n\n if (token.isExpired()) {\n this.events.emit('auth:expired', { app: this });\n return;\n }\n\n this.tokenManager.startAutoRefresh(this);\n this.rest.setAuthToken(token.token);\n\n const user = new User({ id: token.getUserId() });\n await user.fetch();\n this.setActiveUser(user);\n } catch (error) {\n console.error('Failed to check auth status:', error);\n this.events.emit('auth:error', { error, app: this });\n }\n }\n\n /**\n * Set the active authenticated user\n */\n setActiveUser(user) {\n this.activeUser = user;\n if (this.sidebar) {\n this.sidebar.setUser(user);\n }\n if (this.topnav) {\n this.topnav.setUser(user);\n this.tonnav.render();\n }\n this.events.emit('user:changed', { user, app: this });\n return this;\n }\n\n /**\n * Clear the active user (logout)\n */\n clearActiveUser() {\n this.activeUser = null;\n this.tokenManager.clearTokens();\n this.rest.clearAuth();\n if (this.sidebar) {\n this.sidebar.setUser(null);\n }\n this.events.emit('user:cleared', { app: this });\n return this;\n }\n\n /**\n * Handle logout\n */\n async logout() {\n this.clearActiveUser();\n this.books.reset();\n this.docPages.reset();\n this.currentBook = null;\n this.events.emit('auth:logout', { app: this });\n window.location.reload();\n }\n\n async createNewBook() {\n const result = await this.showModelForm({\n title: 'Create New Book',\n model: new DocitBook(),\n fields: [\n { name: 'title', label: 'Title', required: true },\n { name: 'slug', label: 'Slug', required: true, helpText: 'A URL-friendly identifier.' }\n ]\n });\n\n if (result && result.success) {\n this.books.add(result.data);\n this.sidebar.render();\n this.showSuccess('Book created successfully.');\n }\n }\n\n async createNewPage(book) {\n if (!book) return;\n\n const data = await this.showForm({\n title: 'Create New Page',\n fields: [\n { name: 'title', label: 'Title', required: true },\n { name: 'slug', label: 'Slug', required: true, helpText: 'A URL-friendly identifier.' }\n ]\n });\n\n if (data && data.slug) {\n data.book = book.id;\n }\n\n const newPage = new DocitPage();\n const result = await newPage.save(data);\n\n if (result && result.success) {\n this.docPages.add(newPage);\n this.sidebar.render();\n // this.showSuccess('Page created successfully.');\n\n this.showPage('edit', {\n id: newPage.id,\n doc_book: book.get('slug'),\n doc_page: newPage.get('slug')\n }, {});\n }\n }\n\n /**\n * Static factory method for quick setup\n */\n static create(config = {}) {\n return new DocItApp(config);\n }\n\n /**\n * Quick setup for single-book mode\n */\n static createForBook(bookSlug, config = {}) {\n return new DocItApp({\n ...config,\n bookSlug,\n showBookNav: false\n });\n }\n}\n\nexport default DocItApp;\n"],"names":["DocNavSidebar","View","constructor","options","super","className","tagName","this","singleBookMode","books","docPages","activeUser","currentBook","currentDocPage","onInit","getApp","events","on","_onPageShow","bind","query","bookSlug","doc_book","pageSlug","doc_page","app","book","findWhere","slug","id","setActiveBook","render","getTemplate","onBeforeRender","canEdit","forEach","page","isActive","onActionSelectBook","event","element","preventDefault","dataset","firstPage","at","get","showPage","onActionSelectPage","onActionBackToBooks","onActionCreateBook","createNewBook","onActionCreatePage","createNewPage","setBooks","setDocPages","setCurrentBook","topnav","setBrand","setUser","user","DocHomePage","Page","pageName","title","DocitBook","Model","static","buildUrl","endpoint","DocitBookList","Collection","ModelClass","parse","response","data","status","meta","total","count","graph","DocitPage","DocitPageList","DocPage","bookModel","model","pageContextMenu","ContextMenu","config","getPageContextMenuConfig","containerId","addChild","icon","buttonClass","items","label","action","type","danger","onParams","params","loading","fetch","setupNavigation","error","console","showError","emit","setTimeout","prevPage","nextPage","pages","models","currentIndex","findIndex","p","length","onActionNavigateToPage","onActionEditPage","onActionViewHistory","showInfo","onActionEditPageInfo","showModelForm","fields","name","onActionEditBook","sidebar","onActionDeletePage","showConfirm","body","confirmText","confirmClass","destroy","showSuccess","onAfterRender","Prism","highlightAll","DocEditPage","editor","isDirty","initEditor","querySelector","toastui","Editor","el","height","initialEditType","previewStyle","initialValue","onActionSavePage","saving","showLoading","content","getMarkdown","save","toast","success","hideLoading","onActionCancelEdit","onActionGoBack","onBeforeDestroy","DocItApp","WebApp","version","debug","container","defaultRoute","basePath","showBookNav","theme","editPermissions","permissions","edit","sidebarConfig","showSearch","defaultCollapsed","sort","ToastService","isDocItReady","tokenManager","TokenManager","start","setupDocItLayout","setupTopNav","setupSidebar","checkAuthStatus","registerDocItPages","loadInitialData","document","Error","classList","add","innerHTML","pageContainer","TopNav","brand","showSidebarToggle","displayMode","rightItems","href","userMenu","divider","onActionToggleSidebar","toggle","registerPage","route","reset","saveDocPageContent","docPageId","docPage","set","some","perm","hasPermission","token","getTokenInstance","isValid","isExpired","startAutoRefresh","rest","setAuthToken","User","getUserId","setActiveUser","tonnav","clearActiveUser","clearTokens","clearAuth","logout","window","location","reload","result","required","helpText","showForm","newPage","create","createForBook"],"mappings":"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"}
|
package/dist/docit.es.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { W as WebApp } from "./chunks/
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { M as Model, C as Collection } from "./chunks/Collection-YRfGoT73.js";
|
|
8
|
-
import { T as TokenManager } from "./chunks/TokenManager-CAZNcCMs.js";
|
|
1
|
+
import { W as WebApp } from "./chunks/Dialog-DHUsZ92-.js";
|
|
2
|
+
import { T as TokenManager, a as TopNav } from "./chunks/TokenManager-N3e5wDu1.js";
|
|
3
|
+
import { V as View } from "./chunks/Rest-DpbPbmra.js";
|
|
4
|
+
import { P as Page, C as ContextMenu, T as ToastService, U as User } from "./chunks/ContextMenu-Cvls3QC_.js";
|
|
5
|
+
import { M as Model, C as Collection } from "./chunks/Collection-CsAk0UhA.js";
|
|
6
|
+
import { B, a, V, b, c, d } from "./chunks/version-Dtwh-YkD.js";
|
|
9
7
|
class DocNavSidebar extends View {
|
|
10
8
|
constructor(options = {}) {
|
|
11
9
|
super({
|