web-mojo 2.1.936 → 2.1.955

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.
Files changed (102) hide show
  1. package/dist/admin.cjs.js +1 -1
  2. package/dist/admin.cjs.js.map +1 -1
  3. package/dist/admin.es.js +122 -229
  4. package/dist/admin.es.js.map +1 -1
  5. package/dist/auth.cjs.js +1 -1
  6. package/dist/auth.cjs.js.map +1 -1
  7. package/dist/auth.es.js +7 -7
  8. package/dist/auth.es.js.map +1 -1
  9. package/dist/charts.cjs.js +1 -1
  10. package/dist/charts.es.js +7 -7
  11. package/dist/chunks/ChatView-CTtQHvRP.js +2 -0
  12. package/dist/chunks/ChatView-CTtQHvRP.js.map +1 -0
  13. package/dist/chunks/{ChatView-DlSxjxah.js → ChatView-DLEStri1.js} +89 -574
  14. package/dist/chunks/ChatView-DLEStri1.js.map +1 -0
  15. package/dist/chunks/Collection-DD1_31eh.js +2 -0
  16. package/dist/chunks/Collection-DD1_31eh.js.map +1 -0
  17. package/dist/chunks/Collection-YRfGoT73.js +990 -0
  18. package/dist/chunks/Collection-YRfGoT73.js.map +1 -0
  19. package/dist/chunks/ContextMenu-By2g3KYY.js +1171 -0
  20. package/dist/chunks/ContextMenu-By2g3KYY.js.map +1 -0
  21. package/dist/chunks/ContextMenu-Cl0TRsIa.js +3 -0
  22. package/dist/chunks/ContextMenu-Cl0TRsIa.js.map +1 -0
  23. package/dist/chunks/DataView-CdDY9ijM.js +2 -0
  24. package/dist/chunks/{DataView-XJbTQ5q0.js.map → DataView-CdDY9ijM.js.map} +1 -1
  25. package/dist/chunks/{DataView-Vmjx4eCr.js → DataView-OUqaLmGB.js} +2 -2
  26. package/dist/chunks/{DataView-Vmjx4eCr.js.map → DataView-OUqaLmGB.js.map} +1 -1
  27. package/dist/chunks/{Dialog-D_rAf4gQ.js → Dialog-C2mRUxga.js} +8 -6
  28. package/dist/chunks/{Dialog-D_rAf4gQ.js.map → Dialog-C2mRUxga.js.map} +1 -1
  29. package/dist/chunks/Dialog-Cl6MN8if.js +2 -0
  30. package/dist/chunks/{Dialog-BinTQTfO.js.map → Dialog-Cl6MN8if.js.map} +1 -1
  31. package/dist/chunks/FormView-BSWaXDav.js +3 -0
  32. package/dist/chunks/{FormView-TPFsq8ZX.js.map → FormView-BSWaXDav.js.map} +1 -1
  33. package/dist/chunks/{FormView-CIriLDZY.js → FormView-HWvIdFkB.js} +10 -6
  34. package/dist/chunks/FormView-HWvIdFkB.js.map +1 -0
  35. package/dist/chunks/ListView-BMNhd5-B.js +492 -0
  36. package/dist/chunks/ListView-BMNhd5-B.js.map +1 -0
  37. package/dist/chunks/ListView-BRGiITfD.js +2 -0
  38. package/dist/chunks/ListView-BRGiITfD.js.map +1 -0
  39. package/dist/chunks/MetricsMiniChartWidget-BkTEO87S.js +2 -0
  40. package/dist/chunks/{MetricsMiniChartWidget-sONcM0pG.js.map → MetricsMiniChartWidget-BkTEO87S.js.map} +1 -1
  41. package/dist/chunks/{MetricsMiniChartWidget-BolRZ-Ja.js → MetricsMiniChartWidget-Y70IHFIe.js} +3 -3
  42. package/dist/chunks/{MetricsMiniChartWidget-BolRZ-Ja.js.map → MetricsMiniChartWidget-Y70IHFIe.js.map} +1 -1
  43. package/dist/chunks/PDFViewer-C0aMqGJL.js +2 -0
  44. package/dist/chunks/{PDFViewer-UBhinN8A.js.map → PDFViewer-C0aMqGJL.js.map} +1 -1
  45. package/dist/chunks/{PDFViewer-D6SKOl85.js → PDFViewer-DkbYnnoV.js} +3 -3
  46. package/dist/chunks/{PDFViewer-D6SKOl85.js.map → PDFViewer-DkbYnnoV.js.map} +1 -1
  47. package/dist/chunks/Page-CvbwEoLv.js +2 -0
  48. package/dist/chunks/{Page-CnvHhwLZ.js.map → Page-CvbwEoLv.js.map} +1 -1
  49. package/dist/chunks/{Page-B7L25Omb.js → Page-Deq4y2Kq.js} +2 -2
  50. package/dist/chunks/{Page-B7L25Omb.js.map → Page-Deq4y2Kq.js.map} +1 -1
  51. package/dist/chunks/Rest-BNYqGlnP.js +2 -0
  52. package/dist/chunks/Rest-BNYqGlnP.js.map +1 -0
  53. package/dist/chunks/{WebApp-El07OMHH.js → Rest-CS4jRCAs.js} +5 -1389
  54. package/dist/chunks/Rest-CS4jRCAs.js.map +1 -0
  55. package/dist/chunks/TopNav-A7NQ4viq.js +2 -0
  56. package/dist/chunks/{TopNav-Dcmcic-i.js.map → TopNav-A7NQ4viq.js.map} +1 -1
  57. package/dist/chunks/{TopNav-CPA884W7.js → TopNav-Dch6cZFa.js} +5 -5
  58. package/dist/chunks/{TopNav-CPA884W7.js.map → TopNav-Dch6cZFa.js.map} +1 -1
  59. package/dist/chunks/WebApp-CaOPY_k7.js +2 -0
  60. package/dist/chunks/WebApp-CaOPY_k7.js.map +1 -0
  61. package/dist/chunks/WebApp-RHtJ4hFZ.js +1388 -0
  62. package/dist/chunks/WebApp-RHtJ4hFZ.js.map +1 -0
  63. package/dist/css/web-mojo.css +2 -2
  64. package/dist/docit.cjs.js +1 -1
  65. package/dist/docit.cjs.js.map +1 -1
  66. package/dist/docit.es.js +12 -10
  67. package/dist/docit.es.js.map +1 -1
  68. package/dist/index.cjs.js +1 -1
  69. package/dist/index.cjs.js.map +1 -1
  70. package/dist/index.es.js +120 -116
  71. package/dist/index.es.js.map +1 -1
  72. package/dist/lightbox.cjs.js +1 -1
  73. package/dist/lightbox.cjs.js.map +1 -1
  74. package/dist/lightbox.es.js +121 -121
  75. package/dist/lightbox.es.js.map +1 -1
  76. package/dist/map.cjs.js +2 -0
  77. package/dist/map.cjs.js.map +1 -0
  78. package/dist/map.es.js +188 -0
  79. package/dist/map.es.js.map +1 -0
  80. package/dist/timeline.cjs.js +2 -0
  81. package/dist/timeline.cjs.js.map +1 -0
  82. package/dist/timeline.es.js +225 -0
  83. package/dist/timeline.es.js.map +1 -0
  84. package/package.json +9 -1
  85. package/dist/chunks/ChatView-DlSxjxah.js.map +0 -1
  86. package/dist/chunks/ChatView-DnqrGXMC.js +0 -2
  87. package/dist/chunks/ChatView-DnqrGXMC.js.map +0 -1
  88. package/dist/chunks/ContextMenu-CE77rUmn.js +0 -2155
  89. package/dist/chunks/ContextMenu-CE77rUmn.js.map +0 -1
  90. package/dist/chunks/ContextMenu-KVxd0Kgd.js +0 -3
  91. package/dist/chunks/ContextMenu-KVxd0Kgd.js.map +0 -1
  92. package/dist/chunks/DataView-XJbTQ5q0.js +0 -2
  93. package/dist/chunks/Dialog-BinTQTfO.js +0 -2
  94. package/dist/chunks/FormView-CIriLDZY.js.map +0 -1
  95. package/dist/chunks/FormView-TPFsq8ZX.js +0 -3
  96. package/dist/chunks/MetricsMiniChartWidget-sONcM0pG.js +0 -2
  97. package/dist/chunks/PDFViewer-UBhinN8A.js +0 -2
  98. package/dist/chunks/Page-CnvHhwLZ.js +0 -2
  99. package/dist/chunks/TopNav-Dcmcic-i.js +0 -2
  100. package/dist/chunks/WebApp-El07OMHH.js.map +0 -1
  101. package/dist/chunks/WebApp-b9DQWz1d.js +0 -2
  102. package/dist/chunks/WebApp-b9DQWz1d.js.map +0 -1
@@ -1,2 +0,0 @@
1
- "use strict";const e=require("./WebApp-b9DQWz1d.js");class Page extends e.View{constructor(e={}){e.tagName=e.tagName||"main",e.className=e.className||"mojo-page";const t=e.pageName||"";t&&!e.id&&(e.id="page_"+t.toLowerCase().replace(/\s+/g,"_")),super(e),this.pageName=e.pageName||this.constructor.pageName||"",this.route=e.route||this.constructor.route||"",this.title=e.title||this.pageName||"",this.id||!this.constructor.pageName||e.pageName||(this.id="page_"+this.constructor.pageName.toLowerCase().replace(/\s+/g,"_")),this.pageIcon=e.icon||e.pageIcon||this.constructor.pageIcon||"bi bi-file-text",this.displayName=e.displayName||this.constructor.displayName||this.pageName||"",this.pageDescription=e.pageDescription||this.constructor.pageDescription||"",this.params={},this.query={},this.matched=!1,this.isActive=!1,this.pageOptions={title:e.title||this.pageName||"Untitled Page",description:e.description||"",requiresAuth:e.requiresAuth||!1,...e.pageOptions},this.savedState=null,this.pageName,this.route}async onParams(e={},t={}){this.params=e,this.query=t}canEnter(){if(this.options.permissions){const e=this.getApp().activeUser;if(!e||!e.hasPermission(this.options.permissions))return!1}return!(this.options.requiresGroup&&!this.getApp().activeGroup)}async onEnter(){this.isActive=!0,await this.onInitView(),this.savedState&&(this.restoreState(this.savedState),this.savedState=null),this.pageOptions&&this.pageOptions.title&&"undefined"!=typeof document&&(document.title=this.pageOptions.title),this.emit("activated",{page:this.getMetadata()}),this.pageName}async onExit(){this.savedState=this.captureState(),this.isActive=!1,this.emit("deactivated",{page:this.getMetadata()}),this.pageName}getMetadata(){return{name:this.pageName,displayName:this.displayName||this.pageName,icon:this.pageIcon,description:this.pageDescription,route:this.route,isActive:this.isActive}}async onActionDefault(e){this.pageName}async makeActive(){this.getApp().showPage(this)}async onActionNavigate(e,t){e.preventDefault();const s=t.dataset.page;this.getApp().showPage(s)}captureState(){return this.element?{scrollTop:this.element.scrollTop,formData:this.captureFormData(),custom:this.captureCustomState()}:null}restoreState(e){e&&this.element&&(this.element.scrollTop=e.scrollTop||0,this.restoreFormData(e.formData),e.custom&&this.restoreCustomState(e.custom))}captureFormData(){const e={};return this.element?(this.element.querySelectorAll("input, select, textarea").forEach(t=>{t.name&&("checkbox"===t.type?e[t.name]=t.checked:"radio"===t.type?t.checked&&(e[t.name]=t.value):e[t.name]=t.value)}),e):e}restoreFormData(e){e&&this.element&&Object.entries(e).forEach(([e,t])=>{const s=this.element.querySelector(`[name="${e}"]`);if(s)if("checkbox"===s.type)s.checked=t;else if("radio"===s.type){const s=this.element.querySelector(`[name="${e}"][value="${t}"]`);s&&(s.checked=!0)}else s.value=t})}captureCustomState(){return{}}restoreCustomState(e){}setMeta(e={}){if("undefined"!=typeof document){if(e.title&&(document.title=e.title,this.pageOptions.title=e.title),e.description){let t=document.querySelector('meta[name="description"]');t||(t=document.createElement("meta"),t.name="description",document.head.appendChild(t)),t.content=e.description,this.pageOptions.description=e.description}Object.entries(e).forEach(([e,t])=>{if("title"!==e&&"description"!==e){let s=document.querySelector(`meta[name="${e}"]`);s||(s=document.createElement("meta"),s.name=e,document.head.appendChild(s)),s.content=t}})}}showError(e){if(super.showError(e),this.element){const t=document.createElement("div");t.className="alert alert-danger alert-dismissible fade show",t.innerHTML=`\n ${e}\n <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>\n `,this.element.insertBefore(t,this.element.firstChild),setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t)},5e3)}}showSuccess(e){if(super.showSuccess(e),this.element){const t=document.createElement("div");t.className="alert alert-success alert-dismissible fade show",t.innerHTML=`\n ${e}\n <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>\n `,this.element.insertBefore(t,this.element.firstChild),setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t)},3e3)}}async onBeforeRender(){await super.onBeforeRender(),this.setMeta({title:this.pageOptions.title,description:this.pageOptions.description})}async onAfterMount(){await super.onAfterMount(),"undefined"!=typeof document&&this.pageName&&document.body.classList.add(`page-${this.pageName.toLowerCase().replace(/\s+/g,"-")}`)}async onBeforeDestroy(){await super.onBeforeDestroy(),"undefined"!=typeof document&&this.pageName&&document.body.classList.remove(`page-${this.pageName.toLowerCase().replace(/\s+/g,"-")}`)}navigate(e,t={},s={}){return this.app&&this.app.router?this.app.router.navigate(e,s):"undefined"!=typeof window&&window.MOJO?.router?window.MOJO.router.navigate(e,s):void console.error("No router available for navigation")}getRoute(){if(this.route){let e=this.route;return"string"==typeof e&&e.startsWith("/")&&(e=e.substring(1)),e}return this.pageName}syncUrl(e=!0){this.updateBrowserUrl(this.query,!1,!1)}updateBrowserUrl(e=null,t=!1,s=!1){this.getApp(),this.app.router.updateBrowserUrl(this.getRoute(),e,t,s)}static define(e){class DefinedPage extends Page{constructor(t={}){super({...e,...t})}}return DefinedPage.template=e.template,DefinedPage.pageName=e.pageName,DefinedPage.route=e.route,DefinedPage}}exports.Page=Page;
2
- //# sourceMappingURL=Page-CnvHhwLZ.js.map
@@ -1,2 +0,0 @@
1
- "use strict";const t=require("./WebApp-b9DQWz1d.js"),e=require("./Dialog-BinTQTfO.js"),i=require("./ContextMenu-KVxd0Kgd.js");class ResultsView extends t.View{constructor(t={}){super({className:"search-results-view flex-grow-1 overflow-auto d-flex flex-column",template:'\n <div class="flex-grow-1 overflow-auto">\n {{#data.loading}}\n <div class="text-center p-4">\n <div class="spinner-border spinner-border-sm text-muted" role="status">\n <span class="visually-hidden">Loading...</span>\n </div>\n <div class="mt-2 small text-muted">{{data.loadingText}}</div>\n </div>\n {{/data.loading}}\n\n {{^data.loading}}\n {{#data.items}}\n <div class="simple-search-item position-relative"\n data-action="select-item"\n data-item-index="{{index}}">\n {{{itemContent}}}\n <i class="bi bi-chevron-right position-absolute end-0 top-50 translate-middle-y me-3 text-muted"></i>\n </div>\n {{/data.items}}\n\n {{#data.showNoResults}}\n <div class="text-center p-4">\n <i class="bi bi-search text-muted mb-2" style="font-size: 1.5rem;"></i>\n <div class="text-muted small">{{data.noResultsText}}</div>\n <button type="button"\n class="btn btn-link btn-sm mt-2 p-0"\n data-action="clear-search">\n Clear search\n </button>\n </div>\n {{/data.showNoResults}}\n\n {{#data.showEmpty}}\n <div class="text-center p-4">\n <i class="{{data.emptyIcon}} text-muted mb-2" style="font-size: 2rem;"></i>\n <div class="text-muted small mb-2">{{data.emptyText}}</div>\n {{#data.emptySubtext}}\n <div class="text-muted" style="font-size: 0.75rem;">\n {{data.emptySubtext}}\n </div>\n {{/data.emptySubtext}}\n </div>\n {{/data.showEmpty}}\n {{/data.loading}}\n </div>\n\n {{#data.showResultsCount}}\n <div class="border-top bg-light p-2 text-center">\n <small class="text-muted">\n {{data.filteredCount}} of {{data.totalCount}}\n </small>\n </div>\n {{/data.showResultsCount}}\n ',...t}),this.parentView=t.parentView}async handleActionSelectItem(t,e){t.preventDefault();const i=parseInt(e.getAttribute("data-item-index"));this.parentView&&this.parentView.handleItemSelection(i)}async handleActionClearSearch(t,e){t.preventDefault(),this.parentView&&this.parentView.clearSearch()}}class SimpleSearchView extends t.View{constructor(t={}){super({className:"simple-search-view h-100 d-flex flex-column",template:'\n <div class="p-3 border-bottom bg-light">\n <div class="d-flex justify-content-between align-items-start mb-3">\n <h6 class="text-muted fw-semibold mb-0">\n {{#data.headerIcon}}<i class="{{data.headerIcon}} me-2"></i>{{/data.headerIcon}}\n {{{data.headerText}}}\n </h6>\n {{#data.showExitButton}}\n <button class="btn btn-link p-0 text-muted simple-search-exit-btn"\n type="button"\n data-action="exit-view"\n title="Exit"\n aria-label="Exit view">\n <i class="bi bi-x-lg" aria-hidden="true"></i>\n </button>\n {{/data.showExitButton}}\n </div>\n <div class="position-relative">\n <input type="text"\n class="form-control form-control-sm pe-5"\n placeholder="{{data.searchPlaceholder}}"\n value="{{data.searchValue}}"\n data-filter="live-search"\n data-filter-debounce="{{data.debounceMs}}"\n data-change-action="search-items">\n <button class="btn btn-link p-0 position-absolute top-50 end-0 translate-middle-y me-2 text-muted simple-search-clear-btn"\n type="button"\n data-action="clear-search"\n title="Clear search"\n aria-label="Clear search">\n <i class="bi bi-x-circle-fill" aria-hidden="true"></i>\n </button>\n </div>\n </div>\n\n <div data-container="results"></div>\n\n {{#data.showFooter}}\n <div class="p-3 border-top bg-light">\n <small class="text-muted">\n <i class="{{data.footerIcon}} me-1"></i>\n {{{data.footerContent}}}\n </small>\n </div>\n {{/data.showFooter}}\n ',...t}),this.Collection=t.Collection,this.collection=t.collection,this.itemTemplate=t.itemTemplate||this.getDefaultItemTemplate(),this.searchFields=t.searchFields||["name"],this.collectionParams={size:25,...t.collectionParams},this.headerText=t.headerText||"Select Item",this.headerIcon=t.headerIcon||"bi bi-list",this.searchPlaceholder=t.searchPlaceholder||"Search...",this.loadingText=t.loadingText||"Loading items...",this.noResultsText=t.noResultsText||"No items match your search",this.emptyText=t.emptyText||"No items available",this.emptySubtext=t.emptySubtext||null,this.emptyIcon=t.emptyIcon||"bi bi-inbox",this.footerContent=t.footerContent||null,this.footerIcon=t.footerIcon||"bi bi-info-circle",this.showExitButton=t.showExitButton||!1,this.searchValue="",this.filteredItems=[],this.loading=!1,this.hasSearched=!1,this.searchTimer=null,this.debounceMs=t.debounceMs||800,this.resultsView=new ResultsView({parentView:this}),!this.collection&&this.Collection&&(this.collection=new this.Collection),this.addChild(this.resultsView)}onInit(){this.collection&&this.setupCollection(),this.collection&&!1!==this.options.autoLoad&&this.loadItems()}setupCollection(){Object.assign(this.collection.params,this.collectionParams),this.collection.on("fetch:success",()=>{this.loading=!1,this.updateFilteredItems()}),this.collection.on("fetch:error",()=>{this.loading=!1})}async loadItems(){if(this.collection){this.loading=!0,this.updateResultsView();try{await this.collection.fetch(),this.updateFilteredItems()}catch(t){console.error("Error loading items:",t);const e=this.getApp();e?.showError?.("Failed to load items. Please try again.")}finally{this.loading=!1,this.updateFilteredItems()}}else console.warn("SimpleSearchView: No collection provided")}updateFilteredItems(){if(!this.collection)return void(this.filteredItems=[]);const t=this.collection.toJSON();if(this.searchValue&&this.searchValue.trim()){const e=this.searchValue.toLowerCase().trim();this.filteredItems=t.filter(t=>this.searchFields.some(i=>{const s=this.getNestedValue(t,i);return s&&s.toString().toLowerCase().includes(e)}))}else this.filteredItems=t;this.updateResultsView()}getNestedValue(t,e){return e.split(".").reduce((t,e)=>t?.[e],t)}async getViewData(){return{searchValue:this.searchValue,showFooter:!!this.footerContent,showExitButton:this.showExitButton,debounceMs:this.debounceMs,headerText:this.headerText,headerIcon:this.headerIcon,searchPlaceholder:this.searchPlaceholder,footerContent:this.footerContent,footerIcon:this.footerIcon}}updateResultsView(){if(!this.resultsView)return;const t=this.collection&&this.collection.length()>0,e=this.filteredItems.length>0,i=this.searchValue.length>0,s=this.filteredItems.map((t,e)=>({...t,index:e,itemContent:this.processItemTemplate(t)}));this.resultsView.data={loading:this.loading,items:s,showEmpty:!this.loading&&!t,showNoResults:!this.loading&&t&&!e&&i,showResultsCount:!this.loading&&t,filteredCount:this.filteredItems.length,totalCount:this.collection?.restEnabled?this.collection?.meta?.count||0:this.collection?.length()||0,loadingText:this.loadingText,noResultsText:this.noResultsText,emptyText:this.emptyText,emptySubtext:this.emptySubtext,emptyIcon:this.emptyIcon},this.resultsView.render()}processItemTemplate(t){let e=this.itemTemplate;return e=e.replace(/\{\{(\w+)\}\}/g,(e,i)=>this.getNestedValue(t,i)||""),e}getDefaultItemTemplate(){return'\n <div class="p-3 border-bottom">\n <div class="fw-semibold text-dark">{{name}}</div>\n <small class="text-muted">{{id}}</small>\n </div>\n '}async onPassThruActionSearchItems(t,e){const i=e.value||"";this.searchValue=i,this.hasSearched=!0,this.searchTimer&&clearTimeout(this.searchTimer),this.performSearch()}async performSearch(){const t={...this.collectionParams};this.searchValue&&this.searchValue.length>1&&(t.search=this.searchValue.trim()),this.collection.setParams(t,!0)}handleItemSelection(t){if(isNaN(t)||t<0||t>=this.filteredItems.length)return void console.error("Invalid item index:",t);const e=this.filteredItems[t],i=this.collection?this.collection.get(e.id):null;this.emit("item:selected",{item:e,model:i,index:t})}setCollection(t){return this.collection=t,this.setupCollection(),this}setItemTemplate(t){return this.itemTemplate=t,this.updateResultsView(),this}setSearchFields(t){return this.searchFields=Array.isArray(t)?t:[t],this}async refresh(){await this.loadItems()}focusSearch(){const t=this.element?.querySelector('input[data-action="search-items"]');t&&t.focus()}async handleActionExitView(t,e){this.emit("exit",{view:this})}async handleActionClearSearch(t,e){this.clearSearch()}clearSearch(){this.searchValue="",this.hasSearched=!1;const t=this.element?.querySelector('input[data-change-action="search-items"]');t&&(t.value="",t.focus()),this.performSearch()}getItemCount(){return this.collection?this.collection.length():0}getFilteredItemCount(){return this.filteredItems.length}hasItems(){return this.getItemCount()>0}getSearchValue(){return this.searchValue}setSearchValue(t){this.searchValue=t||"",this.hasSearched=!!this.searchValue;const e=this.element?.querySelector('input[data-action="search-items"]');return e&&(e.value=this.searchValue),this.performSearch(),this}async onAfterRender(){if(await super.onAfterRender(),this.resultsView&&!this.resultsView.isMounted()){const t=this.element?.querySelector('[data-container="results"]');t&&await this.resultsView.render(!0,t)}this.updateResultsView()}async onBeforeDestroy(){this.searchTimer&&clearTimeout(this.searchTimer),this.collection&&this.collection.off("update"),await super.onBeforeDestroy()}}class GroupSelectorButton extends t.View{constructor(t={}){super({tagName:"div",className:"nav-item",...t});const e=this.getApp();this.Collection=t.Collection||e?.GroupCollection||i.GroupList,this.collection=t.collection||new this.Collection,this.currentGroup=void 0!==t.currentGroup?t.currentGroup:e?.activeGroup,this.buttonClass=t.buttonClass||"btn btn-link nav-link",this.buttonIcon=t.buttonIcon||"bi-building",this.defaultText=t.defaultText||"Select Group",this.itemTemplate=t.itemTemplate,this.searchFields=t.searchFields||["name"],this.headerText=t.headerText||"Select Group",this.searchPlaceholder=t.searchPlaceholder||"Search groups...",this.autoSetActiveGroup=!1!==t.autoSetActiveGroup,this.onGroupSelected=t.onGroupSelected,this.dialog=null,e?.events&&e.events.on("group:changed",t=>{t.group!==this.currentGroup&&this.setCurrentGroup(t.group)})}async getTemplate(){return'\n <button class="{{buttonClass}}" \n data-action="show-selector"\n type="button"\n style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">\n <i class="{{buttonIcon}} me-1"></i>\n <span class="group-name">{{displayName}}</span>\n </button>\n '}async onBeforeRender(){await super.onBeforeRender(),this.currentGroup?.get?.("name")||this.currentGroup,this.buttonClass=this.buttonClass,this.buttonIcon=this.buttonIcon,this.displayName=this.currentGroup?.get?.("name")||this.currentGroup?.name||this.defaultText}async onActionShowSelector(t){const i=new SimpleSearchView({Collection:this.Collection,collection:this.collection,itemTemplate:this.itemTemplate||this.getDefaultItemTemplate(),searchFields:this.searchFields,headerText:this.headerText,searchPlaceholder:this.searchPlaceholder,headerIcon:this.buttonIcon,showExitButton:!1});return this.dialog=new e.default({title:this.headerText,body:i,size:"md",scrollable:!0,noBodyPadding:!0,buttons:[],closeButton:!0}),i.on("item:selected",t=>{this.handleGroupSelection(t.model||t.item),this.dialog&&this.dialog.hide()}),this.dialog.on("hidden",()=>{this.dialog.destroy(),this.dialog=null}),await this.dialog.render(!0,document.body),this.dialog.show(),!0}handleGroupSelection(t){this.currentGroup=t,this.displayName=t?.get?.("name")||t?.name||this.defaultText,this.render();const e=this.getApp();this.autoSetActiveGroup&&e?.setActiveGroup&&e.setActiveGroup(t),this.onGroupSelected&&this.onGroupSelected({group:t}),this.emit("group-selected",{group:t}),e?.events&&(e.events.emit("group:selected",{group:t}),e.events.emit("group:changed",{group:t}))}getDefaultItemTemplate(){return'\n <div class="d-flex align-items-center p-3 border-bottom">\n <div class="flex-grow-1">\n <div class="fw-semibold text-dark">{{name}}</div>\n <small class="text-muted">#{{id}} {{kind}}</small>\n </div>\n </div>\n '}setCurrentGroup(t){this.currentGroup=t,this.displayName=t?.get?.("name")||t?.name||this.defaultText,this.mounted&&this.render()}getCurrentGroup(){return this.currentGroup}}class TopNav extends t.View{constructor(t={}){const e={light:"navbar navbar-expand-lg navbar-light topnav-light",dark:"navbar navbar-expand-lg navbar-dark topnav-dark",clean:"navbar navbar-expand-lg navbar-light topnav-clean",gradient:"navbar navbar-expand-lg navbar-dark topnav-gradient"};let i=e[t.theme||"light"]||e.light;t.shadow&&(i+=` topnav-shadow-${t.shadow}`),super({tagName:"nav",className:i,enableTooltips:!0,style:"position: relative; z-index: 1030;",...t}),this.displayMode=t.displayMode||"both",this.showPageIcon=!1!==t.showPageIcon,this.showPageDescription=t.showPageDescription||!1,this.showBreadcrumbs=t.showBreadcrumbs||!1,this.groupIcon=t.groupIcon||"bi-building",this.currentPage=null,this.previousPage=null,this.config={brand:t.brand||"MOJO App",brandIcon:t.brandIcon||"bi bi-play-circle",brandRoute:t.brandRoute||"/",navItems:t.navItems||[],rightItems:t.rightItems||[],showSidebarToggle:t.showSidebarToggle||!1,sidebarToggleAction:t.sidebarToggleAction||"toggle-sidebar",...t},this.userMenu=t.userMenu||this.findMenuItem("user"),this.userMenu&&(this.userMenu.id="user"),this.loginMenu=t.loginMenu||this.findMenuItem("login"),this.setupPageListeners(),this.setupGroupListeners(),this.groupSelectorButton=null,this.currentGroup=null}findMenuItem(t){let e=this.config.navItems.find(e=>e.id===t);return e||(e=this.config.rightItems.find(e=>e.id===t)),e||null}replaceMenuItem(t,e){const i=this.config.navItems.findIndex(e=>e.id===t);if(-1!==i)return this.config.navItems[i]=e,!0;const s=this.config.rightItems.findIndex(e=>e.id===t);return-1!==s&&(this.config.rightItems[s]=e,!0)}setBrand(t,e=null){this.config.brand=t,this.config.brandIcon=e||this.config.brandIcon,this.render()}setUser(t){t?(this.userMenu.label=t.get("display_name"),this.replaceMenuItem("login",this.userMenu)):this.replaceMenuItem("user",this.loginMenu),this.setModel(t)}_onModelChange(){this.model&&(this.userMenu.label=this.model.get("display_name")),this.isMounted()&&this.render()}async getTemplate(){return'\n <div class="container-fluid">\n {{#data.showSidebarToggle}}\n <button class="topnav-sidebar-toggle me-2" data-action="{{data.sidebarToggleAction}}" aria-label="Toggle Sidebar">\n <i class="bi bi-chevron-right toggle-chevron"></i>\n </button>\n {{/data.showSidebarToggle}}\n\n {{#data.showGroupInfo}}\n <div class="navbar-brand d-flex align-items-center">\n {{#data.groupIcon}}<i class="{{data.groupIcon}} me-2"></i>{{/data.groupIcon}}\n <div>\n <span class="topnav-group-name"\n role="button"\n tabindex="0"\n data-action="open-group-selector"\n style="cursor: pointer;">\n {{data.currentGroupName}}\n </span>\n {{#data.showPageTitle}}\n <span class="text-muted mx-2">|</span>\n <span>{{data.currentPageName}}</span>\n {{/data.showPageTitle}}\n </div>\n </div>\n {{/data.showGroupInfo}}\n\n {{#data.showPageInfo}}\n <div class="navbar-brand d-flex align-items-center">\n {{#data.currentPageIcon}}<i class="{{data.currentPageIcon}} me-2"></i>{{/data.currentPageIcon}}\n <div>\n <span>{{data.currentPageName}}</span>\n {{#data.currentPageDescription}}\n <small class="d-block" style="font-size: 0.75rem; line-height: 1;">{{data.currentPageDescription}}</small>\n {{/data.currentPageDescription}}\n </div>\n </div>\n {{/data.showPageInfo}}\n\n {{#data.showBrand}}\n <a class="navbar-brand" href="{{data.brandRoute}}">\n {{#data.brandIcon}}<i class="{{data.brandIcon}} me-2"></i>{{/data.brandIcon}}\n {{data.brand}}\n </a>\n {{/data.showBrand}}\n\n <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#{{data.navbarId}}">\n <span class="navbar-toggler-icon"></span>\n </button>\n\n <div class="collapse navbar-collapse" id="{{data.navbarId}}">\n {{#data.showNavItems}}\n <ul class="navbar-nav me-auto mb-2 mb-lg-0">\n {{#data.navItems}}\n <li class="nav-item">\n <a class="nav-link {{#active}}active{{/active}}" href="{{route}}" {{#tooltip}}data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="{{tooltip}}"{{/tooltip}}>\n {{#icon}}<i class="{{icon}} me-1"></i>{{/icon}}\n {{text}}\n </a>\n </li>\n {{/data.navItems}}\n </ul>\n {{/data.showNavItems}}\n\n {{#data.hasRightItems}}\n <div class="navbar-nav ms-auto">\n {{#data.rightItems}}\n {{#isGroupSelector}}\n <div data-container="group-selector-{{id}}"></div>\n {{/isGroupSelector}}\n {{^isGroupSelector}}\n {{#isDropdown}}\n <div class="nav-item dropdown">\n <a class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">\n {{#icon}}<i class="{{icon}} me-1"></i>{{/icon}}\n {{label}}\n </a>\n <ul class="dropdown-menu dropdown-menu-end">\n {{#items}}\n {{#divider}}\n <li><hr class="dropdown-divider"></li>\n {{/divider}}\n {{^divider}}\n <li>\n <a class="dropdown-item" role="button" {{#action}}data-action="{{action}}"{{/action}}>\n {{#icon}}<i class="{{icon}} me-1"></i>{{/icon}}\n {{label}}\n </a>\n </li>\n {{/divider}}\n {{/items}}\n </ul>\n </div>\n {{/isDropdown}}\n {{^isDropdown}}\n {{#isButton}}\n <button class="{{buttonClass}}" data-action="{{action}}" data-id="{{id}}" {{#tooltip}}data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="{{tooltip}}"{{/tooltip}}>\n {{#icon}}<i class="{{icon}} me-1"></i>{{/icon}}\n {{label}}\n </button>\n {{/isButton}}\n {{^isButton}}\n <a class="nav-link" href="{{href}}" {{#action}}data-action="{{action}}"{{/action}} {{#tooltip}}data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="{{tooltip}}"{{/tooltip}}>\n {{#icon}}<i class="{{icon}} me-1"></i>{{/icon}}\n {{label}}\n </a>\n {{/isButton}}\n {{/isDropdown}}\n {{/isGroupSelector}}\n {{/data.rightItems}}\n </div>\n {{/data.hasRightItems}}\n </div>\n </div>\n '}async onBeforeRender(){await super.onBeforeRender();const t=this.getApp(),e=this.currentGroup||t?.activeGroup,i="group"===this.displayMode||"group_page_titles"===this.displayMode,s="group_page_titles"===this.displayMode,n="page"===this.displayMode||"both"===this.displayMode,a=!i&&!n,o="menu"===this.displayMode||"both"===this.displayMode,r=this.filterItemsByPermissions(this.config.navItems||[]),l=this.processRightItems(this.config.rightItems||[]);this.data={brand:this.config.brand,brandIcon:this.config.brandIcon,brandRoute:this.config.brandRoute,showBrand:a,navbarId:`navbar-${this.id}`,navItems:r,showNavItems:o,rightItems:l,hasRightItems:l.length>0,showGroupInfo:i,showPageTitle:s,currentGroupName:e?.get?.("name")||e?.name||"Select Group",groupIcon:this.groupIcon,showPageInfo:n,currentPageName:this.currentPage?.title||this.currentPage?.name||"",currentPageIcon:this.currentPage?.icon||this.currentPage?.pageIcon||"",currentPageDescription:this.showPageDescription?this.currentPage?.description:"",showSidebarToggle:this.config.showSidebarToggle,sidebarToggleAction:this.config.sidebarToggleAction,displayMode:this.displayMode}}processRightItems(t){return this.filterItemsByPermissions(t).map(t=>{const e={...t};if(t.items&&(e.items=this.filterItemsByPermissions(t.items)),"group-selector"===t.type){e.isGroupSelector=!0,e.isDropdown=!1,e.isButton=!1;const i={containerId:`group-selector-${t.id||"default"}`};void 0!==t.Collection&&(i.Collection=t.Collection),void 0!==t.collection&&(i.collection=t.collection),void 0!==t.currentGroup&&(i.currentGroup=t.currentGroup),void 0!==t.buttonClass&&(i.buttonClass=t.buttonClass),void 0!==t.buttonIcon&&(i.buttonIcon=t.buttonIcon),void 0!==t.defaultText&&(i.defaultText=t.defaultText),void 0!==t.itemTemplate&&(i.itemTemplate=t.itemTemplate),void 0!==t.searchFields&&(i.searchFields=t.searchFields),void 0!==t.headerText&&(i.headerText=t.headerText),void 0!==t.searchPlaceholder&&(i.searchPlaceholder=t.searchPlaceholder),void 0!==t.autoSetActiveGroup&&(i.autoSetActiveGroup=t.autoSetActiveGroup),void 0!==t.onGroupSelected&&(i.onGroupSelected=t.onGroupSelected);const s=new GroupSelectorButton(i);this.groupSelectorButton=s,this.addChild(s)}else e.items&&e.items.length>0?(e.isDropdown=!0,e.isButton=!1):t.buttonClass?(e.isButton=!0,e.isDropdown=!1):(e.isButton=!1,e.isDropdown=!1);return t.handler&&(this.rightItemHandlers=this.rightItemHandlers||/* @__PURE__ */new Map,this.rightItemHandlers.set(t.id,t.handler)),e})}setupPageListeners(){this.getApp().events.on("page:show",t=>{this.onPageChanged(t)})}setupGroupListeners(){const t=this.getApp();t?.events&&t.events.on(["group:changed","group:loaded"],t=>{t?.group&&(this.currentGroup=t.group),"group"!==this.displayMode&&"group_page_titles"!==this.displayMode||this.mounted&&this.render()})}onPageBeforeChange(t){"page"===this.displayMode||this.displayMode}onPageChanged(t){this.previousPage=this.currentPage,this.currentPage=t.page,"page"!==this.displayMode&&"both"!==this.displayMode||this.updatePageDisplay(),"menu"!==this.displayMode&&"both"!==this.displayMode||this.currentPage&&this.currentPage.route&&this.updateActiveItem(this.currentPage.route)}updatePageDisplay(){this.currentPage&&this.mounted&&this.render()}updateActiveItem(t){const e=t=>t?t.startsWith("/")?t:`/${t}`:"/",i=e(t),s=this.data.navItems.map(t=>{const s=e(t.route);let n=!1;return"/"===s&&"/"===i?n=!0:"/"!==s&&"/"!==i&&(n=i.startsWith(s)||i===s),{...t,active:n}});this.updateData({navItems:s},!0)}onPassThruActionProfile(){this.getApp().events.emit("portal:action",{action:"profile"})}onActionSettings(){this.getApp().events.emit("portal:action",{action:"settings"})}onActionLogout(){this.getApp().events.emit("auth:logout",{action:"logout"})}async onActionOpenGroupSelector(t){if(this.groupSelectorButton)return await this.groupSelectorButton.onActionShowSelector(t),!0;const{GroupList:e}=await Promise.resolve().then(()=>require("./ContextMenu-KVxd0Kgd.js")).then(t=>t.Group$1),i=new GroupSelectorButton({Collection:e,currentGroup:this.getApp()?.activeGroup});return await i.onActionShowSelector(t),!0}async handleAction(t,e,i){const s=i.getAttribute("data-id");if(s&&this.rightItemHandlers&&this.rightItemHandlers.has(s)){const n=this.rightItemHandlers.get(s);if("function"==typeof n)return await n.call(this,t,e,i)}const n=`onAction${t.charAt(0).toUpperCase()+t.slice(1).replace(/-([a-z])/g,t=>t[1].toUpperCase())}`;if("function"==typeof this[n])return await this[n](e,i);this.emit("action",{action:t,event:e,element:i,topnav:this})}async onActionDefault(t,e,i){if(this.config.navItems)for(const s of this.config.navItems)if(s.action===t&&s.handler)return await s.handler.call(this,t,e,i),!0;if(this.config.rightItems)for(const s of this.config.rightItems){if(s.action===t&&s.handler)return await s.handler.call(this,t,e,i),!0;if(s.items)for(const n of s.items)if(n.action===t&&n.handler)return await n.handler.call(this,t,e,i),!0}return this.getApp().events.emit("portal:action",{action:t,event:e,el:i}),!1}filterItemsByPermissions(t){if(!t)return[];const e=this.getApp(),i=e?.activeUser;return t.filter(t=>!t.permissions||!i||i.hasPermission(t.permissions))}}exports.SimpleSearchView=SimpleSearchView,exports.TopNav=TopNav;
2
- //# sourceMappingURL=TopNav-Dcmcic-i.js.map