@vendure/admin-ui-plugin 2.0.0-next.5 → 2.0.0-next.9

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 (39) hide show
  1. package/lib/admin-ui/356.d5ab46db919a9f0b.js +2 -0
  2. package/lib/admin-ui/356.d5ab46db919a9f0b.js.map +1 -0
  3. package/lib/admin-ui/504.56537eeeb3db51b7.js +2 -0
  4. package/lib/admin-ui/504.56537eeeb3db51b7.js.map +1 -0
  5. package/lib/admin-ui/625.00b1380b31501047.js +2 -0
  6. package/lib/admin-ui/{625.01c97949f67d7dbf.js.map → 625.00b1380b31501047.js.map} +1 -1
  7. package/lib/admin-ui/{849.6af354bbc8b876dc.js → 849.f649a9ff8824afb1.js} +2 -2
  8. package/lib/admin-ui/{849.6af354bbc8b876dc.js.map → 849.f649a9ff8824afb1.js.map} +1 -1
  9. package/lib/admin-ui/i18n-messages/cs.json +3 -0
  10. package/lib/admin-ui/i18n-messages/de.json +5 -0
  11. package/lib/admin-ui/i18n-messages/en.json +4 -1
  12. package/lib/admin-ui/i18n-messages/es.json +3 -0
  13. package/lib/admin-ui/i18n-messages/fr.json +3 -0
  14. package/lib/admin-ui/i18n-messages/it.json +3 -0
  15. package/lib/admin-ui/i18n-messages/pl.json +3 -0
  16. package/lib/admin-ui/i18n-messages/pt_BR.json +3 -0
  17. package/lib/admin-ui/i18n-messages/pt_PT.json +3 -0
  18. package/lib/admin-ui/i18n-messages/ru.json +3 -0
  19. package/lib/admin-ui/i18n-messages/uk.json +3 -0
  20. package/lib/admin-ui/i18n-messages/zh_Hans.json +3 -0
  21. package/lib/admin-ui/i18n-messages/zh_Hant.json +3 -0
  22. package/lib/admin-ui/index.html +2 -2
  23. package/lib/admin-ui/main.648a3a4e6c48732f.js +2758 -0
  24. package/lib/admin-ui/{main.0d861a880b32646d.js.map → main.648a3a4e6c48732f.js.map} +1 -1
  25. package/lib/admin-ui/{runtime.6864d94d589dbb0c.js → runtime.7f595bf374c7bfaa.js} +2 -2
  26. package/lib/admin-ui/{runtime.6864d94d589dbb0c.js.map → runtime.7f595bf374c7bfaa.js.map} +1 -1
  27. package/lib/admin-ui/styles/global/_forms.scss +1 -1
  28. package/lib/admin-ui/styles/global/_overrides.scss +5 -1
  29. package/lib/admin-ui/styles/global/_utilities.scss +9 -0
  30. package/lib/admin-ui/styles/theme/default.scss +13 -1
  31. package/lib/admin-ui/{styles.8ce1757596f10cc1.css → styles.4e29f263e5259cf7.css} +2 -2
  32. package/lib/admin-ui/{styles.8ce1757596f10cc1.css.map → styles.4e29f263e5259cf7.css.map} +1 -1
  33. package/package.json +4 -4
  34. package/lib/admin-ui/356.1033de258e918a70.js +0 -2
  35. package/lib/admin-ui/356.1033de258e918a70.js.map +0 -1
  36. package/lib/admin-ui/504.3098353022d84cc3.js +0 -2
  37. package/lib/admin-ui/504.3098353022d84cc3.js.map +0 -1
  38. package/lib/admin-ui/625.01c97949f67d7dbf.js +0 -2
  39. package/lib/admin-ui/main.0d861a880b32646d.js +0 -2757
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkvendure_admin=self.webpackChunkvendure_admin||[]).push([[356],{5356:(ft,D,a)=>{a.r(D),a.d(D,{DEFAULT_DASHBOARD_WIDGET_LAYOUT:()=>S,DEFAULT_WIDGETS:()=>k,DashboardComponent:()=>p,DashboardModule:()=>b,DashboardWidgetComponent:()=>g,LatestOrdersWidgetComponent:()=>m,LatestOrdersWidgetModule:()=>u,OrderSummaryWidgetComponent:()=>h,OrderSummaryWidgetModule:()=>v,TestWidgetComponent:()=>f,TestWidgetModule:()=>y,WelcomeWidgetComponent:()=>_,WelcomeWidgetModule:()=>C,dashboardRoutes:()=>A});var F=a(234),x=a(635),I=a(9337),t=a(3184),d=a(3682),$=a(735),P=a(1519),O=a(2748),R=a(8854),s=a(6362),j=a(5111),w=a(6998),J=a(9416),q=a(4929),Z=a(7514);const N=["portal"];function Q(n,e){if(1&n&&(t.ynx(0),t._uU(1),t.ALo(2,"translate"),t.BQk()),2&n){const o=e.ngIf;t.xp6(1),t.Oqu(t.lcZ(2,1,o))}}function Y(n,e){}class g{constructor(e){this.componentFactoryResolver=e}ngAfterViewInit(){this.loadWidget()}loadWidget(){return(0,q.mG)(this,void 0,void 0,function*(){const e=this.widgetConfig.loadComponent(),o=e instanceof Promise?yield e:e;this.componentRef=this.portal.createComponent(this.componentFactoryResolver.resolveComponentFactory(o)),this.componentRef.changeDetectorRef.detectChanges()})}ngOnDestroy(){this.componentRef&&this.componentRef.destroy()}}function E(n,e){if(1&n){const o=t.EpF();t.TgZ(0,"button",7),t.NdJ("click",function(){const c=t.CHM(o).$implicit;return t.oxw().addWidget(c)}),t._uU(1),t.qZA()}if(2&n){const o=e.$implicit;t.xp6(1),t.hij(" ",o," ")}}g.\u0275fac=function(e){return new(e||g)(t.Y36(t._Vd))},g.\u0275cmp=t.Xpm({type:g,selectors:[["vdr-dashboard-widget"]],viewQuery:function(e,o){if(1&e&&t.Gf(N,5,t.s_b),2&e){let r;t.iGM(r=t.CRH())&&(o.portal=r.first)}},inputs:{widgetConfig:"widgetConfig"},ngContentSelectors:["*"],decls:9,vars:1,consts:[[1,"card"],[1,"card-header"],[1,"title"],[4,"ngIf"],[1,"controls"],[1,"card-block"],["portal",""]],template:function(e,o){1&e&&(t.F$t(),t.TgZ(0,"div",0)(1,"div",1)(2,"div",2),t.YNc(3,Q,3,3,"ng-container",3),t.qZA(),t.TgZ(4,"div",4),t.Hsn(5),t.qZA()(),t.TgZ(6,"div",5),t.YNc(7,Y,0,0,"ng-template",null,6,t.W1O),t.qZA()()),2&e&&(t.xp6(3),t.Q6J("ngIf",o.widgetConfig.title))},directives:[s.O5],pipes:[Z.X$],styles:["[_nghost-%COMP%]{display:block}.card[_ngcontent-%COMP%]{margin-top:0;min-height:200px}.card-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between}"],changeDetection:0});const H=function(n){return{width:n}};function V(n,e){if(1&n){const o=t.EpF();t.TgZ(0,"button",22),t.NdJ("click",function(){const c=t.CHM(o).$implicit,l=t.oxw(2).$implicit;return t.oxw(2).setWidgetWidth(l,c)}),t._uU(1),t.ALo(2,"translate"),t.qZA()}if(2&n){const o=e.$implicit,r=t.oxw(2).$implicit;t.Q6J("disabled",o===r.width),t.xp6(1),t.hij(" ",t.xi3(2,2,"dashboard.widget-width",t.VKq(5,H,o))," ")}}function z(n,e){if(1&n){const o=t.EpF();t.TgZ(0,"vdr-dashboard-widget",12)(1,"div",13)(2,"div",14),t._UZ(3,"clr-icon",15),t.qZA(),t.TgZ(4,"vdr-dropdown")(5,"button",16),t._UZ(6,"clr-icon",17),t.qZA(),t.TgZ(7,"vdr-dropdown-menu",3)(8,"h4",18),t._uU(9),t.ALo(10,"translate"),t.qZA(),t.YNc(11,V,3,7,"button",19),t._UZ(12,"div",20),t.TgZ(13,"button",7),t.NdJ("click",function(){t.CHM(o);const i=t.oxw().$implicit;return t.oxw(2).removeWidget(i)}),t._UZ(14,"clr-icon",21),t._uU(15),t.ALo(16,"translate"),t.qZA()()()()()}if(2&n){const o=t.oxw().$implicit,r=t.oxw(2);t.Q6J("widgetConfig",o.config),t.xp6(9),t.Oqu(t.lcZ(10,4,"dashboard.widget-resize")),t.xp6(2),t.Q6J("ngForOf",r.getSupportedWidths(o.config)),t.xp6(4),t.hij(" ",t.lcZ(16,6,"dashboard.remove-widget")," ")}}function X(n,e){if(1&n&&(t.TgZ(0,"div",10),t.YNc(1,z,17,8,"vdr-dashboard-widget",11),t.qZA()),2&n){const o=e.$implicit,r=t.oxw(2);t.Q6J("ngClass",r.getClassForWidth(o.width))("cdkDragData",o),t.xp6(1),t.Q6J("vdrIfPermissions",o.config.requiresPermissions||null)}}const G=function(n){return{index:n}};function K(n,e){if(1&n){const o=t.EpF();t.TgZ(0,"div",8),t.NdJ("cdkDropListDropped",function(i){return t.CHM(o),t.oxw().drop(i)}),t.YNc(1,X,2,3,"div",9),t.qZA()}if(2&n){const o=e.$implicit,r=e.index,i=t.oxw();t.Q6J("cdkDropListData",t.VKq(3,G,r)),t.xp6(1),t.Q6J("ngForOf",o)("ngForTrackBy",i.trackRowItem)}}class p{constructor(e,o,r,i){this.dashboardWidgetService=e,this.localStorageService=o,this.changedDetectorRef=r,this.dataService=i,this.deletionMarker="__delete__"}ngOnInit(){this.availableWidgetIds$=this.dataService.client.userStatus().stream$.pipe((0,x.U)(({userStatus:e})=>e.permissions),(0,x.U)(e=>this.dashboardWidgetService.getAvailableIds(e)),(0,I.b)(e=>this.widgetLayout=this.initLayout(e)))}getClassForWidth(e){switch(e){case 3:return"clr-col-12 clr-col-sm-6 clr-col-lg-3";case 4:return"clr-col-12 clr-col-sm-6 clr-col-lg-4";case 6:return"clr-col-12 clr-col-lg-6";case 8:return"clr-col-12 clr-col-lg-8";case 12:return"clr-col-12";default:(0,F.assertNever)(e)}}getSupportedWidths(e){return e.supportedWidths||[3,4,6,8,12]}setWidgetWidth(e,o){e.width=o,this.recalculateLayout()}trackRow(e,o){return o.map(i=>`${i.id}:${i.width}`).join("|")}trackRowItem(e,o){return o.config}addWidget(e){var o;const r=this.dashboardWidgetService.getWidgetById(e);if(r){const c={id:e,config:r,width:this.getSupportedWidths(r)[0]};let l;this.widgetLayout&&this.widgetLayout.length?l=this.widgetLayout[this.widgetLayout.length-1]:(l=[],null===(o=this.widgetLayout)||void 0===o||o.push(l)),l.push(c),this.recalculateLayout()}}removeWidget(e){e.id=this.deletionMarker,this.recalculateLayout()}drop(e){const{currentIndex:o,previousIndex:r,previousContainer:i,container:c}=e;if((r!==o||i.data.index!==c.data.index)&&this.widgetLayout){const l=this.widgetLayout[i.data.index],U=this.widgetLayout[c.data.index];l.splice(r,1),U.splice(o,0,e.item.data),this.recalculateLayout()}}initLayout(e){const o=this.localStorageService.get("dashboardWidgetLayout");let r;return o&&(r=o.filter(i=>e.includes(i.id))),this.dashboardWidgetService.getWidgetLayout(r)}recalculateLayout(){if(this.widgetLayout){const o=this.widgetLayout.reduce((r,i)=>[...r,...i],[]).filter(r=>r.id!==this.deletionMarker).map(r=>({id:r.id,width:r.width}));this.widgetLayout=this.dashboardWidgetService.getWidgetLayout(o),this.localStorageService.set("dashboardWidgetLayout",o),setTimeout(()=>this.changedDetectorRef.markForCheck())}}}p.\u0275fac=function(e){return new(e||p)(t.Y36(d.ayj),t.Y36(d.n2A),t.Y36(t.sBO),t.Y36(d.DoR))},p.\u0275cmp=t.Xpm({type:p,selectors:[["vdr-dashboard"]],decls:11,vars:8,consts:[[1,"widget-header"],["vdrDropdownTrigger","",1,"btn","btn-secondary","btn-sm"],["shape","plus"],["vdrPosition","bottom-right"],["class","button","vdrDropdownItem","",3,"click",4,"ngFor","ngForOf"],["cdkDropListGroup",""],["class","clr-row dashboard-row","cdkDropList","","cdkDropListOrientation","horizontal",3,"cdkDropListData","cdkDropListDropped",4,"ngFor","ngForOf","ngForTrackBy"],["vdrDropdownItem","",1,"button",3,"click"],["cdkDropList","","cdkDropListOrientation","horizontal",1,"clr-row","dashboard-row",3,"cdkDropListData","cdkDropListDropped"],["class","dashboard-item","cdkDrag","",3,"ngClass","cdkDragData",4,"ngFor","ngForOf","ngForTrackBy"],["cdkDrag","",1,"dashboard-item",3,"ngClass","cdkDragData"],[3,"widgetConfig",4,"vdrIfPermissions"],[3,"widgetConfig"],[1,"flex"],["cdkDragHandle","",1,"drag-handle"],["shape","drag-handle","size","24"],["vdrDropdownTrigger","",1,"icon-button"],["shape","ellipsis-vertical"],[1,"dropdown-header"],["class","button","vdrDropdownItem","",3,"disabled","click",4,"ngFor","ngForOf"],["role","separator",1,"dropdown-divider"],["shape","trash",1,"is-danger"],["vdrDropdownItem","",1,"button",3,"disabled","click"]],template:function(e,o){1&e&&(t.TgZ(0,"div",0)(1,"vdr-dropdown")(2,"button",1),t._UZ(3,"clr-icon",2),t._uU(4),t.ALo(5,"translate"),t.qZA(),t.TgZ(6,"vdr-dropdown-menu",3),t.YNc(7,E,2,1,"button",4),t.ALo(8,"async"),t.qZA()()(),t.TgZ(9,"div",5),t.YNc(10,K,2,5,"div",6),t.qZA()),2&e&&(t.xp6(4),t.hij(" ",t.lcZ(5,4,"dashboard.add-widget")," "),t.xp6(3),t.Q6J("ngForOf",t.lcZ(8,6,o.availableWidgetIds$)),t.xp6(3),t.Q6J("ngForOf",o.widgetLayout)("ngForTrackBy",o.trackRow))},directives:[$.J,P.U,O.qvL,R.N,s.sg,j.H,w.Fd,O.q0d,w.Wj,w.Zt,s.mk,J.H,g,w.Bh],pipes:[Z.X$,s.Ov],styles:["[_nghost-%COMP%]{display:block;max-width:1200px;margin:auto}.widget-header[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.placeholder[_ngcontent-%COMP%]{color:var(--color-grey-300);text-align:center}.placeholder[_ngcontent-%COMP%] .version[_ngcontent-%COMP%]{font-size:3em;margin:24px;line-height:1em}.placeholder[_ngcontent-%COMP%] .clr-i-outline{fill:var(--color-grey-200)}vdr-dashboard-widget[_ngcontent-%COMP%]{margin-bottom:24px}.cdk-drag-preview[_ngcontent-%COMP%]{box-sizing:border-box;border-radius:4px}.cdk-drag-placeholder[_ngcontent-%COMP%]{opacity:0}.cdk-drag-animating[_ngcontent-%COMP%]{transition:transform .25s cubic-bezier(0,0,.2,1)}.dashboard-row[_ngcontent-%COMP%]{padding:0;border-width:1;margin-bottom:6px;transition:padding .2s,margin .2s}.dashboard-row.cdk-drop-list-dragging[_ngcontent-%COMP%], .dashboard-row.cdk-drop-list-receiving[_ngcontent-%COMP%]{border:1px dashed var(--color-component-border-200);padding:6px}.dashboard-row.cdk-drop-list-dragging[_ngcontent-%COMP%] .dashboard-item[_ngcontent-%COMP%]:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}"],changeDetection:0});var tt=a(9720);const A=[{path:"",component:p,pathMatch:"full"}];var W=a(8270),et=a(365),ot=a(5886),nt=a(458),rt=a(8899),it=a(4187),T=a(6826);const at=function(n){return["/orders/",n]};function dt(n,e){if(1&n&&(t.TgZ(0,"td",1),t._uU(1),t._UZ(2,"vdr-order-state-label",2),t.qZA(),t.TgZ(3,"td",1),t._UZ(4,"vdr-customer-label",3),t.qZA(),t.TgZ(5,"td",1),t._uU(6),t.ALo(7,"localeCurrency"),t.qZA(),t.TgZ(8,"td",1),t._uU(9),t.ALo(10,"timeAgo"),t.qZA(),t.TgZ(11,"td",4),t._UZ(12,"vdr-table-row-action",5),t.ALo(13,"translate"),t.qZA()),2&n){const o=e.item;t.xp6(1),t.hij(" ",o.code," "),t.xp6(1),t.Q6J("state",o.state),t.xp6(2),t.Q6J("customer",o.customer),t.xp6(2),t.Oqu(t.xi3(7,7,o.total,o.currencyCode)),t.xp6(3),t.Oqu(t.lcZ(10,10,o.orderPlacedAt)),t.xp6(3),t.Q6J("label",t.lcZ(13,12,"common.open"))("linkTo",t.VKq(14,at,o.id))}}class m{constructor(e){this.dataService=e}ngOnInit(){this.latestOrders$=this.dataService.order.getOrders({take:10,filter:{active:{eq:!1},state:{notEq:"Cancelled"}},sort:{orderPlacedAt:d.Asd.DESC}}).refetchOnChannelChange().mapStream(e=>e.orders.items)}}m.\u0275fac=function(e){return new(e||m)(t.Y36(d.DoR))},m.\u0275cmp=t.Xpm({type:m,selectors:[["vdr-latest-orders-widget"]],decls:3,vars:3,consts:[[3,"items"],[1,"left","align-middle"],[3,"state"],[3,"customer"],[1,"right","align-middle"],["iconShape","shopping-cart",3,"label","linkTo"]],template:function(e,o){1&e&&(t.TgZ(0,"vdr-data-table",0),t.ALo(1,"async"),t.YNc(2,dt,14,16,"ng-template"),t.qZA()),2&e&&t.Q6J("items",t.lcZ(1,1,o.latestOrders$))},directives:[et.Q,ot.G,nt.d,rt.v],pipes:[s.Ov,it.k,T.e,Z.X$],styles:["vdr-data-table[_ngcontent-%COMP%] table{margin-top:0}"],changeDetection:0});class u{}u.\u0275fac=function(e){return new(e||u)},u.\u0275mod=t.oAB({type:u}),u.\u0275inj=t.cJS({imports:[[d.IR2,d.m81]]});var st=a(704),L=a.n(st),ct=a(6317),lt=a(8977),M=a(9196),gt=a(2673),pt=a(2651);function mt(n,e){if(1&n){const o=t.EpF();t.TgZ(0,"div",7)(1,"button",8),t.NdJ("click",function(){t.CHM(o);const i=t.oxw();return i.selection$.next({timeframe:"day",date:i.today})}),t._uU(2),t.ALo(3,"translate"),t.qZA(),t.TgZ(4,"button",8),t.NdJ("click",function(){t.CHM(o);const i=t.oxw();return i.selection$.next({timeframe:"day",date:i.yesterday})}),t._uU(5),t.ALo(6,"translate"),t.qZA(),t.TgZ(7,"button",8),t.NdJ("click",function(){return t.CHM(o),t.oxw().selection$.next({timeframe:"week"})}),t._uU(8),t.ALo(9,"translate"),t.qZA(),t.TgZ(10,"button",8),t.NdJ("click",function(){return t.CHM(o),t.oxw().selection$.next({timeframe:"month"})}),t._uU(11),t.ALo(12,"translate"),t.qZA()()}if(2&n){const o=e.ngIf,r=t.oxw();t.xp6(1),t.ekj("btn-primary",o.date===r.today),t.xp6(1),t.hij(" ",t.lcZ(3,12,"dashboard.today")," "),t.xp6(2),t.ekj("btn-primary",o.date===r.yesterday),t.xp6(1),t.hij(" ",t.lcZ(6,14,"dashboard.yesterday")," "),t.xp6(2),t.ekj("btn-primary","week"===o.timeframe),t.xp6(1),t.hij(" ",t.lcZ(9,16,"dashboard.thisWeek")," "),t.xp6(2),t.ekj("btn-primary","month"===o.timeframe),t.xp6(1),t.hij(" ",t.lcZ(12,18,"dashboard.thisMonth")," ")}}function ut(n,e){if(1&n&&(t.TgZ(0,"div",9),t._uU(1),t.ALo(2,"localeDate"),t.ALo(3,"localeDate"),t.qZA()),2&n){const o=e.ngIf;t.xp6(1),t.AsE(" ",t.lcZ(2,2,o.start)," - ",t.lcZ(3,4,o.end)," ")}}class h{constructor(e){this.dataService=e,this.today=new Date,this.yesterday=new Date((new Date).setDate(this.today.getDate()-1)),this.selection$=new ct.X({timeframe:"day",date:this.today})}ngOnInit(){this.dateRange$=this.selection$.pipe((0,lt.x)(),(0,x.U)(o=>({start:L()(o.date).startOf(o.timeframe).toDate(),end:L()(o.date).endOf(o.timeframe).toDate()})),(0,M.d)(1));const e=this.dateRange$.pipe((0,gt.w)(({start:o,end:r})=>this.dataService.order.getOrderSummary(o,r).refetchOnChannelChange().mapStream(i=>i.orders)),(0,M.d)(1));this.totalOrderCount$=e.pipe((0,x.U)(o=>o.totalItems)),this.totalOrderValue$=e.pipe((0,x.U)(o=>o.items.reduce((r,i)=>r+i.total,0)/100)),this.currencyCode$=this.dataService.settings.getActiveChannel().refetchOnChannelChange().mapStream(o=>o.activeChannel.currencyCode||void 0)}}h.\u0275fac=function(e){return new(e||h)(t.Y36(d.DoR))},h.\u0275cmp=t.Xpm({type:h,selectors:[["vdr-order-summary-widget"]],decls:22,vars:23,consts:[[1,"stats"],[1,"stat"],[1,"stat-figure"],[1,"stat-label"],[1,"footer"],["class","btn-group btn-outline-primary btn-sm",4,"ngIf"],["class","date-range p5",4,"ngIf"],[1,"btn-group","btn-outline-primary","btn-sm"],[1,"btn",3,"click"],[1,"date-range","p5"]],template:function(e,o){1&e&&(t.TgZ(0,"div",0)(1,"div",1)(2,"div",2),t._uU(3),t.ALo(4,"async"),t.qZA(),t.TgZ(5,"div",3),t._uU(6),t.ALo(7,"translate"),t.qZA()(),t.TgZ(8,"div",1)(9,"div",2),t._uU(10),t.ALo(11,"currency"),t.ALo(12,"async"),t.ALo(13,"async"),t.qZA(),t.TgZ(14,"div",3),t._uU(15),t.ALo(16,"translate"),t.qZA()()(),t.TgZ(17,"div",4),t.YNc(18,mt,13,20,"div",5),t.ALo(19,"async"),t.YNc(20,ut,4,6,"div",6),t.ALo(21,"async"),t.qZA()),2&e&&(t.xp6(3),t.Oqu(t.lcZ(4,6,o.totalOrderCount$)),t.xp6(3),t.Oqu(t.lcZ(7,8,"dashboard.total-orders")),t.xp6(4),t.hij(" ",t.xi3(11,10,t.lcZ(12,13,o.totalOrderValue$),t.lcZ(13,15,o.currencyCode$)||void 0)," "),t.xp6(5),t.Oqu(t.lcZ(16,17,"dashboard.total-order-value")),t.xp6(3),t.Q6J("ngIf",t.lcZ(19,19,o.selection$)),t.xp6(2),t.Q6J("ngIf",t.lcZ(21,21,o.dateRange$)))},directives:[s.O5],pipes:[s.Ov,Z.X$,s.H9,pt.H],styles:[".stats[_ngcontent-%COMP%]{display:flex;justify-content:space-evenly}.stat[_ngcontent-%COMP%]{text-align:center}.stat-figure[_ngcontent-%COMP%]{font-size:2rem;line-height:3rem}.stat-label[_ngcontent-%COMP%]{text-transform:uppercase}.date-range[_ngcontent-%COMP%]{margin-top:0}.footer[_ngcontent-%COMP%]{margin-top:24px;display:flex;flex-direction:column;justify-content:space-between}"],changeDetection:0});class v{}v.\u0275fac=function(e){return new(e||v)},v.\u0275mod=t.oAB({type:v}),v.\u0275inj=t.cJS({imports:[[d.IR2]]});class f{}f.\u0275fac=function(e){return new(e||f)},f.\u0275cmp=t.Xpm({type:f,selectors:[["vdr-test-widget"]],decls:2,vars:0,template:function(e,o){1&e&&(t.TgZ(0,"p"),t._uU(1,"This is a test widget!"),t.qZA())},styles:[""],changeDetection:0});class y{}function ht(n,e){if(1&n&&(t.TgZ(0,"p",4),t._uU(1),t.qZA()),2&n){const o=t.oxw(2);t.xp6(1),t.AsE(" ",o.hideVendureBranding?"":"Vendure"," ",o.hideVersion?"":"Admin UI v"+o.version," ")}}function vt(n,e){if(1&n&&(t.TgZ(0,"div")(1,"h4",3),t._uU(2),t._UZ(3,"br"),t.TgZ(4,"small",4),t._uU(5),t.ALo(6,"timeAgo"),t.qZA()(),t.YNc(7,ht,2,2,"p",5),t.qZA()),2&n){const o=e.ngIf,r=t.oxw();t.xp6(2),t.AsE(" Welcome, ",o.firstName," ",o.lastName,""),t.xp6(3),t.hij("Last login: ",t.lcZ(6,4,o.user.lastLogin),""),t.xp6(2),t.Q6J("ngIf",!r.hideVendureBranding||!r.hideVersion)}}y.\u0275fac=function(e){return new(e||y)},y.\u0275mod=t.oAB({type:y}),y.\u0275inj=t.cJS({});class _{constructor(e){this.dataService=e,this.version=d.s5M,this.brand=(0,d.hq7)().brand,this.hideVendureBranding=(0,d.hq7)().hideVendureBranding,this.hideVersion=(0,d.hq7)().hideVersion}ngOnInit(){this.administrator$=this.dataService.administrator.getActiveAdministrator().mapStream(e=>e.activeAdministrator||null)}}_.\u0275fac=function(e){return new(e||_)(t.Y36(d.DoR))},_.\u0275cmp=t.Xpm({type:_,selectors:[["vdr-welcome-widget"]],decls:4,vars:3,consts:[[4,"ngIf"],[1,"placeholder"],["shape","line-chart","size","128"],[1,"h4"],[1,"p5"],["class","p5",4,"ngIf"]],template:function(e,o){1&e&&(t.YNc(0,vt,8,6,"div",0),t.ALo(1,"async"),t.TgZ(2,"div",1),t._UZ(3,"clr-icon",2),t.qZA()),2&e&&t.Q6J("ngIf",t.lcZ(1,1,o.administrator$))},directives:[s.O5,O.qvL],pipes:[s.Ov,T.e],styles:["[_nghost-%COMP%]{display:flex;justify-content:space-between}.placeholder[_ngcontent-%COMP%]{color:var(--color-grey-200)}"],changeDetection:0});class C{}C.\u0275fac=function(e){return new(e||C)},C.\u0275mod=t.oAB({type:C}),C.\u0275inj=t.cJS({imports:[[d.IR2]]});const S=[{id:"welcome",width:12},{id:"orderSummary",width:6},{id:"latestOrders",width:6}],k={welcome:{loadComponent:()=>_},orderSummary:{title:(0,W.J)("dashboard.orders-summary"),loadComponent:()=>h,requiresPermissions:[d.y3$.ReadOrder]},latestOrders:{title:(0,W.J)("dashboard.latest-orders"),loadComponent:()=>m,supportedWidths:[6,8,12],requiresPermissions:[d.y3$.ReadOrder]},testWidget:{title:"Test Widget",loadComponent:()=>f}};class b{constructor(e){Object.entries(k).map(([o,r])=>e.registerWidget(o,r)),0===e.getDefaultLayout().length&&e.setDefaultLayout(S)}}b.\u0275fac=function(e){return new(e||b)(t.LFG(d.ayj))},b.\u0275mod=t.oAB({type:b}),b.\u0275inj=t.cJS({imports:[[d.m81,tt.Bz.forChild(A)]]})}}]);
2
+ //# sourceMappingURL=356.d5ab46db919a9f0b.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":["t","constructor","e","ngAfterViewInit","this","loadWidget","widgetConfig","loadComponent","o","Promise","componentRef","portal","createComponent","componentFactoryResolver","resolveComponentFactory","changeDetectorRef","detectChanges","ngOnDestroy","destroy","addWidget","g","selectors","oxw","setWidgetWidth","removeWidget","drop","r","i","ngOnInit","availableWidgetIds$","dataService","client","userStatus","stream$","pipe","x","permissions","dashboardWidgetService","getAvailableIds","I","widgetLayout","initLayout","getClassForWidth","F","getSupportedWidths","supportedWidths","width","recalculateLayout","trackRow","map","id","join","trackRowItem","config","getWidgetById","c","l","length","push","deletionMarker","currentIndex","previousIndex","previousContainer","container","data","index","U","splice","item","localStorageService","get","filter","includes","getWidgetLayout","reduce","set","setTimeout","changedDetectorRef","markForCheck","p","A","path","component","pathMatch","latestOrders$","order","getOrders","take","active","eq","state","notEq","sort","orderPlacedAt","d","refetchOnChannelChange","mapStream","orders","items","m","u","date","selection$","Date","setDate","today","getDate","ct","timeframe","dateRange$","lt","start","L","startOf","toDate","end","endOf","M","gt","getOrderSummary","totalOrderCount$","totalItems","totalOrderValue$","total","currencyCode$","settings","getActiveChannel","activeChannel","currencyCode","h","v","f","y","brand","hideVendureBranding","hideVersion","administrator$","administrator","getActiveAdministrator","activeAdministrator","_","C","S","k","welcome","orderSummary","title","W","requiresPermissions","latestOrders","testWidget","Object","entries","registerWidget","getDefaultLayout","setDefaultLayout","b","tt"],"sources":["./src/lib/dashboard/src/components/dashboard-widget/dashboard-widget.component.html","./src/lib/dashboard/src/components/dashboard-widget/dashboard-widget.component.ts","./src/lib/dashboard/src/components/dashboard/dashboard.component.html","./src/lib/dashboard/src/components/dashboard/dashboard.component.ts","./src/lib/dashboard/src/dashboard.routes.ts","./src/lib/dashboard/src/widgets/latest-orders-widget/latest-orders-widget.component.html","./src/lib/dashboard/src/widgets/latest-orders-widget/latest-orders-widget.component.ts","./src/lib/dashboard/src/widgets/order-summary-widget/order-summary-widget.component.html","./src/lib/dashboard/src/widgets/order-summary-widget/order-summary-widget.component.ts","./src/lib/dashboard/src/widgets/test-widget/test-widget.component.ts","./src/lib/dashboard/src/widgets/test-widget/test-widget.component.html","./src/lib/dashboard/src/widgets/welcome-widget/welcome-widget.component.html","./src/lib/dashboard/src/widgets/welcome-widget/welcome-widget.component.ts","./src/lib/dashboard/src/default-widgets.ts","./src/lib/dashboard/src/dashboard.module.ts"],"sourcesContent":["<div class=\"card\">\r\n <div class=\"card-header\">\r\n <div class=\"title\">\r\n <ng-container *ngIf=\"widgetConfig.title as title\">{{ title | translate }}</ng-container>\r\n </div>\r\n <div class=\"controls\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n <div class=\"card-block\">\r\n <ng-template #portal></ng-template>\r\n </div>\r\n</div>\r\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ComponentFactoryResolver,\n ComponentRef,\n Input,\n OnDestroy,\n OnInit,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { DashboardWidgetConfig } from '@vendure/admin-ui/core';\n\n@Component({\n selector: 'vdr-dashboard-widget',\n templateUrl: './dashboard-widget.component.html',\n styleUrls: ['./dashboard-widget.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DashboardWidgetComponent implements AfterViewInit, OnDestroy {\n @Input() widgetConfig: DashboardWidgetConfig;\n\n @ViewChild('portal', { read: ViewContainerRef })\n private portal: ViewContainerRef;\n\n private componentRef: ComponentRef<any>;\n\n constructor(private componentFactoryResolver: ComponentFactoryResolver) {}\n\n ngAfterViewInit(): void {\n this.loadWidget();\n }\n\n private async loadWidget() {\n const loadComponentResult = this.widgetConfig.loadComponent();\n const componentType =\n loadComponentResult instanceof Promise ? await loadComponentResult : loadComponentResult;\n this.componentRef = this.portal.createComponent(\n this.componentFactoryResolver.resolveComponentFactory(componentType),\n );\n this.componentRef.changeDetectorRef.detectChanges();\n }\n\n ngOnDestroy() {\n if (this.componentRef) {\n this.componentRef.destroy();\n }\n }\n}\n","<div class=\"widget-header\">\r\n <vdr-dropdown>\r\n <button class=\"btn btn-secondary btn-sm\" vdrDropdownTrigger>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'dashboard.add-widget' | translate }}\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n *ngFor=\"let id of availableWidgetIds$ | async\"\r\n (click)=\"addWidget(id)\"\r\n >\r\n {{ id }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n</div>\r\n<div cdkDropListGroup>\r\n <div\r\n class=\"clr-row dashboard-row\"\r\n *ngFor=\"let row of widgetLayout; index as rowIndex; trackBy: trackRow\"\r\n cdkDropList\r\n (cdkDropListDropped)=\"drop($event)\"\r\n cdkDropListOrientation=\"horizontal\"\r\n [cdkDropListData]=\"{ index: rowIndex }\"\r\n >\r\n <div\r\n *ngFor=\"let widget of row; trackBy: trackRowItem\"\r\n class=\"dashboard-item\"\r\n [ngClass]=\"getClassForWidth(widget.width)\"\r\n cdkDrag\r\n [cdkDragData]=\"widget\"\r\n >\r\n <vdr-dashboard-widget\r\n *vdrIfPermissions=\"widget.config.requiresPermissions || null\"\r\n [widgetConfig]=\"widget.config\"\r\n >\r\n <div class=\"flex\">\r\n <div class=\"drag-handle\" cdkDragHandle>\r\n <clr-icon shape=\"drag-handle\" size=\"24\"></clr-icon>\r\n </div>\r\n <vdr-dropdown>\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <h4 class=\"dropdown-header\">{{ 'dashboard.widget-resize' | translate }}</h4>\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n [disabled]=\"width === widget.width\"\r\n *ngFor=\"let width of getSupportedWidths(widget.config)\"\r\n (click)=\"setWidgetWidth(widget, width)\"\r\n >\r\n {{ 'dashboard.widget-width' | translate: { width: width } }}\r\n </button>\r\n <div class=\"dropdown-divider\" role=\"separator\"></div>\r\n <button class=\"button\" vdrDropdownItem (click)=\"removeWidget(widget)\">\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'dashboard.remove-widget' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </vdr-dashboard-widget>\r\n </div>\r\n </div>\r\n</div>\r\n","import { CdkDragDrop } from '@angular/cdk/drag-drop';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\r\nimport {\r\n DashboardWidgetConfig,\r\n DashboardWidgetService,\r\n DashboardWidgetWidth,\r\n DataService,\r\n LocalStorageService,\r\n WidgetLayout,\r\n WidgetLayoutDefinition,\r\n} from '@vendure/admin-ui/core';\r\nimport { assertNever } from '@vendure/common/lib/shared-utils';\r\nimport { Observable } from 'rxjs';\r\nimport { map, tap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-dashboard',\r\n templateUrl: './dashboard.component.html',\r\n styleUrls: ['./dashboard.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DashboardComponent implements OnInit {\r\n widgetLayout: WidgetLayout | undefined;\r\n availableWidgetIds$: Observable<string[]>;\r\n private readonly deletionMarker = '__delete__';\r\n\r\n constructor(\r\n private dashboardWidgetService: DashboardWidgetService,\r\n private localStorageService: LocalStorageService,\r\n private changedDetectorRef: ChangeDetectorRef,\r\n private dataService: DataService,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.availableWidgetIds$ = this.dataService.client.userStatus().stream$.pipe(\r\n map(({ userStatus }) => userStatus.permissions),\r\n map(permissions => this.dashboardWidgetService.getAvailableIds(permissions)),\r\n tap(ids => (this.widgetLayout = this.initLayout(ids))),\r\n );\r\n }\r\n\r\n getClassForWidth(width: DashboardWidgetWidth): string {\r\n switch (width) {\r\n case 3:\r\n return `clr-col-12 clr-col-sm-6 clr-col-lg-3`;\r\n case 4:\r\n return `clr-col-12 clr-col-sm-6 clr-col-lg-4`;\r\n case 6:\r\n return `clr-col-12 clr-col-lg-6`;\r\n case 8:\r\n return `clr-col-12 clr-col-lg-8`;\r\n case 12:\r\n return `clr-col-12`;\r\n default:\r\n assertNever(width);\r\n }\r\n }\r\n\r\n getSupportedWidths(config: DashboardWidgetConfig): DashboardWidgetWidth[] {\r\n return config.supportedWidths || [3, 4, 6, 8, 12];\r\n }\r\n\r\n setWidgetWidth(widget: WidgetLayout[number][number], width: DashboardWidgetWidth) {\r\n widget.width = width;\r\n this.recalculateLayout();\r\n }\r\n\r\n trackRow(index: number, row: WidgetLayout[number]) {\r\n const id = row.map(item => `${item.id}:${item.width}`).join('|');\r\n return id;\r\n }\r\n\r\n trackRowItem(index: number, item: WidgetLayout[number][number]) {\r\n return item.config;\r\n }\r\n\r\n addWidget(id: string) {\r\n const config = this.dashboardWidgetService.getWidgetById(id);\r\n if (config) {\r\n const width = this.getSupportedWidths(config)[0];\r\n const widget: WidgetLayout[number][number] = {\r\n id,\r\n config,\r\n width,\r\n };\r\n let targetRow: WidgetLayout[number];\r\n if (this.widgetLayout && this.widgetLayout.length) {\r\n targetRow = this.widgetLayout[this.widgetLayout.length - 1];\r\n } else {\r\n targetRow = [];\r\n this.widgetLayout?.push(targetRow);\r\n }\r\n targetRow.push(widget);\r\n this.recalculateLayout();\r\n }\r\n }\r\n\r\n removeWidget(widget: WidgetLayout[number][number]) {\r\n widget.id = this.deletionMarker;\r\n this.recalculateLayout();\r\n }\r\n\r\n drop(event: CdkDragDrop<{ index: number }>) {\r\n const { currentIndex, previousIndex, previousContainer, container } = event;\r\n if (previousIndex === currentIndex && previousContainer.data.index === container.data.index) {\r\n // Nothing changed\r\n return;\r\n }\r\n if (this.widgetLayout) {\r\n const previousLayoutRow = this.widgetLayout[previousContainer.data.index];\r\n const newLayoutRow = this.widgetLayout[container.data.index];\r\n\r\n previousLayoutRow.splice(previousIndex, 1);\r\n newLayoutRow.splice(currentIndex, 0, event.item.data);\r\n this.recalculateLayout();\r\n }\r\n }\r\n\r\n private initLayout(availableIds: string[]): WidgetLayout {\r\n const savedLayoutDef = this.localStorageService.get('dashboardWidgetLayout');\r\n let layoutDef: WidgetLayoutDefinition | undefined;\r\n if (savedLayoutDef) {\r\n // validate all the IDs from the saved layout are still available\r\n layoutDef = savedLayoutDef.filter(item => availableIds.includes(item.id));\r\n }\r\n return this.dashboardWidgetService.getWidgetLayout(layoutDef);\r\n }\r\n\r\n private recalculateLayout() {\r\n if (this.widgetLayout) {\r\n const flattened = this.widgetLayout\r\n .reduce((flat, row) => [...flat, ...row], [])\r\n .filter(item => item.id !== this.deletionMarker);\r\n const newLayoutDef: WidgetLayoutDefinition = flattened.map(item => ({\r\n id: item.id,\r\n width: item.width,\r\n }));\r\n this.widgetLayout = this.dashboardWidgetService.getWidgetLayout(newLayoutDef);\r\n this.localStorageService.set('dashboardWidgetLayout', newLayoutDef);\r\n setTimeout(() => this.changedDetectorRef.markForCheck());\r\n }\r\n }\r\n}\r\n","import { Routes } from '@angular/router';\r\n\r\nimport { DashboardComponent } from './components/dashboard/dashboard.component';\r\n\r\nexport const dashboardRoutes: Routes = [\r\n {\r\n path: '',\r\n component: DashboardComponent,\r\n pathMatch: 'full',\r\n },\r\n];\r\n","<vdr-data-table [items]=\"latestOrders$ | async\">\r\n <ng-template let-order=\"item\">\r\n <td class=\"left align-middle\">\r\n {{ order.code }}\r\n <vdr-order-state-label [state]=\"order.state\"></vdr-order-state-label>\r\n </td>\r\n <td class=\"left align-middle\">\r\n <vdr-customer-label [customer]=\"order.customer\"></vdr-customer-label>\r\n </td>\r\n <td class=\"left align-middle\">{{ order.total | localeCurrency: order.currencyCode }}</td>\r\n <td class=\"left align-middle\">{{ order.orderPlacedAt | timeAgo }}</td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"shopping-cart\"\r\n [label]=\"'common.open' | translate\"\r\n [linkTo]=\"['/orders/', order.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n","import { ChangeDetectionStrategy, Component, NgModule, OnInit } from '@angular/core';\r\nimport {\r\n CoreModule,\r\n DataService,\r\n GetOrderListQuery,\r\n ItemOf,\r\n SharedModule,\r\n SortOrder,\r\n} from '@vendure/admin-ui/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'vdr-latest-orders-widget',\r\n templateUrl: './latest-orders-widget.component.html',\r\n styleUrls: ['./latest-orders-widget.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class LatestOrdersWidgetComponent implements OnInit {\r\n latestOrders$: Observable<Array<ItemOf<GetOrderListQuery, 'orders'>>>;\r\n constructor(private dataService: DataService) {}\r\n\r\n ngOnInit(): void {\r\n this.latestOrders$ = this.dataService.order\r\n .getOrders({\r\n take: 10,\r\n filter: {\r\n active: { eq: false },\r\n state: { notEq: 'Cancelled' },\r\n },\r\n sort: {\r\n orderPlacedAt: SortOrder.DESC,\r\n },\r\n })\r\n .refetchOnChannelChange()\r\n .mapStream(data => data.orders.items);\r\n }\r\n}\r\n\r\n@NgModule({\r\n imports: [CoreModule, SharedModule],\r\n declarations: [LatestOrdersWidgetComponent],\r\n})\r\nexport class LatestOrdersWidgetModule {}\r\n","<div class=\"stats\">\r\n <div class=\"stat\">\r\n <div class=\"stat-figure\">{{ totalOrderCount$ | async }}</div>\r\n <div class=\"stat-label\">{{ 'dashboard.total-orders' | translate }}</div>\r\n </div>\r\n <div class=\"stat\">\r\n <div class=\"stat-figure\">\r\n {{ totalOrderValue$ | async | currency: (currencyCode$ | async) || undefined }}\r\n </div>\r\n <div class=\"stat-label\">{{ 'dashboard.total-order-value' | translate }}</div>\r\n </div>\r\n</div>\r\n<div class=\"footer\">\r\n <div class=\"btn-group btn-outline-primary btn-sm\" *ngIf=\"selection$ | async as selection\">\r\n <button class=\"btn\" [class.btn-primary]=\"selection.date === today\" (click)=\"selection$.next({timeframe: 'day', date: today})\">\r\n {{ 'dashboard.today' | translate }}\r\n </button>\r\n <button class=\"btn\" [class.btn-primary]=\"selection.date === yesterday\" (click)=\"selection$.next({timeframe: 'day', date: yesterday})\">\r\n {{ 'dashboard.yesterday' | translate }}\r\n </button>\r\n <button class=\"btn\" [class.btn-primary]=\"selection.timeframe === 'week'\" (click)=\"selection$.next({timeframe: 'week'})\">\r\n {{ 'dashboard.thisWeek' | translate }}\r\n </button>\r\n <button class=\"btn\" [class.btn-primary]=\"selection.timeframe === 'month'\" (click)=\"selection$.next({timeframe: 'month'})\">\r\n {{ 'dashboard.thisMonth' | translate }}\r\n </button>\r\n </div>\r\n\r\n <div class=\"date-range p5\" *ngIf=\"dateRange$ | async as range\">\r\n {{ range.start | localeDate }} - {{ range.end | localeDate }}\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, NgModule, OnInit } from '@angular/core';\r\nimport { CoreModule, DataService } from '@vendure/admin-ui/core';\r\nimport dayjs from 'dayjs';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { distinctUntilChanged, map, shareReplay, switchMap } from 'rxjs/operators';\r\n\r\nexport type Timeframe = 'day' | 'week' | 'month';\r\n\r\n@Component({\r\n selector: 'vdr-order-summary-widget',\r\n templateUrl: './order-summary-widget.component.html',\r\n styleUrls: ['./order-summary-widget.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderSummaryWidgetComponent implements OnInit {\r\n today = new Date();\r\n yesterday = new Date(new Date().setDate(this.today.getDate() - 1));\r\n totalOrderCount$: Observable<number>;\r\n totalOrderValue$: Observable<number>;\r\n currencyCode$: Observable<string | undefined>;\r\n selection$ = new BehaviorSubject<{ timeframe: Timeframe; date?: Date }>({\r\n timeframe: 'day',\r\n date: this.today,\r\n });\r\n dateRange$: Observable<{ start: Date; end: Date }>;\r\n\r\n constructor(private dataService: DataService) {}\r\n\r\n ngOnInit(): void {\r\n this.dateRange$ = this.selection$.pipe(\r\n distinctUntilChanged(),\r\n map(selection => {\r\n return {\r\n start: dayjs(selection.date).startOf(selection.timeframe).toDate(),\r\n end: dayjs(selection.date).endOf(selection.timeframe).toDate(),\r\n };\r\n }),\r\n shareReplay(1),\r\n );\r\n const orderSummary$ = this.dateRange$.pipe(\r\n switchMap(({ start, end }) => {\r\n return this.dataService.order\r\n .getOrderSummary(start, end)\r\n .refetchOnChannelChange()\r\n .mapStream(data => data.orders);\r\n }),\r\n shareReplay(1),\r\n );\r\n this.totalOrderCount$ = orderSummary$.pipe(map(res => res.totalItems));\r\n this.totalOrderValue$ = orderSummary$.pipe(\r\n map(res => res.items.reduce((total, order) => total + order.total, 0) / 100),\r\n );\r\n this.currencyCode$ = this.dataService.settings\r\n .getActiveChannel()\r\n .refetchOnChannelChange()\r\n .mapStream(data => data.activeChannel.currencyCode || undefined);\r\n }\r\n}\r\n\r\n@NgModule({\r\n imports: [CoreModule],\r\n declarations: [OrderSummaryWidgetComponent],\r\n})\r\nexport class OrderSummaryWidgetModule {}\r\n","import { ChangeDetectionStrategy, Component, NgModule } from '@angular/core';\n\n@Component({\n selector: 'vdr-test-widget',\n templateUrl: './test-widget.component.html',\n styleUrls: ['./test-widget.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TestWidgetComponent {}\n\n@NgModule({\n declarations: [TestWidgetComponent],\n})\nexport class TestWidgetModule {}\n","<p>This is a test widget!</p>\r\n","<div *ngIf=\"administrator$ | async as administrator\">\r\n <h4 class=\"h4\">\r\n Welcome, {{ administrator.firstName }} {{ administrator.lastName }}<br />\r\n <small class=\"p5\">Last login: {{ administrator.user.lastLogin | timeAgo }}</small>\r\n </h4>\r\n\r\n <p class=\"p5\" *ngIf=\"!hideVendureBranding || !hideVersion\">\r\n {{ hideVendureBranding ? '' : 'Vendure' }} {{ hideVersion ? '' : ('Admin UI v' + version) }}\r\n </p>\r\n</div>\r\n<div class=\"placeholder\">\r\n <clr-icon shape=\"line-chart\" size=\"128\"></clr-icon>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, NgModule, OnInit } from '@angular/core';\r\nimport {\r\n ADMIN_UI_VERSION,\r\n CoreModule,\r\n DataService,\r\n GetActiveAdministratorQuery,\r\n getAppConfig,\r\n} from '@vendure/admin-ui/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'vdr-welcome-widget',\r\n templateUrl: './welcome-widget.component.html',\r\n styleUrls: ['./welcome-widget.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class WelcomeWidgetComponent implements OnInit {\r\n version = ADMIN_UI_VERSION;\r\n administrator$: Observable<GetActiveAdministratorQuery['activeAdministrator']>;\r\n brand = getAppConfig().brand;\r\n hideVendureBranding = getAppConfig().hideVendureBranding;\r\n hideVersion = getAppConfig().hideVersion;\r\n\r\n constructor(private dataService: DataService) {}\r\n\r\n ngOnInit(): void {\r\n this.administrator$ = this.dataService.administrator\r\n .getActiveAdministrator()\r\n .mapStream(data => data.activeAdministrator || null);\r\n }\r\n}\r\n\r\n@NgModule({\r\n imports: [CoreModule],\r\n declarations: [WelcomeWidgetComponent],\r\n})\r\nexport class WelcomeWidgetModule {}\r\n","import { APP_INITIALIZER, FactoryProvider } from '@angular/core';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n DashboardWidgetConfig,\n DashboardWidgetService,\n Permission,\n WidgetLayoutDefinition,\n} from '@vendure/admin-ui/core';\n\nimport { LatestOrdersWidgetComponent } from './widgets/latest-orders-widget/latest-orders-widget.component';\nimport { OrderSummaryWidgetComponent } from './widgets/order-summary-widget/order-summary-widget.component';\nimport { TestWidgetComponent } from './widgets/test-widget/test-widget.component';\nimport { WelcomeWidgetComponent } from './widgets/welcome-widget/welcome-widget.component';\n\nexport const DEFAULT_DASHBOARD_WIDGET_LAYOUT: WidgetLayoutDefinition = [\n { id: 'welcome', width: 12 },\n { id: 'orderSummary', width: 6 },\n { id: 'latestOrders', width: 6 },\n];\n\nexport const DEFAULT_WIDGETS: { [id: string]: DashboardWidgetConfig } = {\n welcome: {\n loadComponent: () => WelcomeWidgetComponent,\n },\n orderSummary: {\n title: _('dashboard.orders-summary'),\n loadComponent: () => OrderSummaryWidgetComponent,\n requiresPermissions: [Permission.ReadOrder],\n },\n latestOrders: {\n title: _('dashboard.latest-orders'),\n loadComponent: () => LatestOrdersWidgetComponent,\n supportedWidths: [6, 8, 12],\n requiresPermissions: [Permission.ReadOrder],\n },\n testWidget: {\n title: 'Test Widget',\n loadComponent: () => TestWidgetComponent,\n },\n};\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { DashboardWidgetService, SharedModule } from '@vendure/admin-ui/core';\n\nimport { DashboardWidgetComponent } from './components/dashboard-widget/dashboard-widget.component';\nimport { DashboardComponent } from './components/dashboard/dashboard.component';\nimport { dashboardRoutes } from './dashboard.routes';\nimport { DEFAULT_DASHBOARD_WIDGET_LAYOUT, DEFAULT_WIDGETS } from './default-widgets';\n\n@NgModule({\n imports: [SharedModule, RouterModule.forChild(dashboardRoutes)],\n declarations: [DashboardComponent, DashboardWidgetComponent],\n})\nexport class DashboardModule {\n constructor(dashboardWidgetService: DashboardWidgetService) {\n Object.entries(DEFAULT_WIDGETS).map(([id, config]) =>\n dashboardWidgetService.registerWidget(id, config),\n );\n if (dashboardWidgetService.getDefaultLayout().length === 0) {\n dashboardWidgetService.setDefaultLayout(DEFAULT_DASHBOARD_WIDGET_LAYOUT);\n }\n }\n}\n"],"sourceRoot":"webpack:///","file":"356.d5ab46db919a9f0b.js"}