ghost 3.42.3 → 3.42.7

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.
@@ -90,16 +90,23 @@ super(...arguments),e=this,t="dropdown",s=this,(n=a)&&Object.defineProperty(e,t,
90
90
  var l,d,u,m,c,p,h=Ember._setComponentTemplate(i,o)
91
91
  e.default=h})),define("ghost-admin/components/gh-billing-iframe",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
92
92
  const t=Ember.HTMLBars.template({id:"cEwCQjwt",block:'{"symbols":[],"statements":[[10,"iframe"],[14,1,"billing-frame"],[14,0,"billing-frame"],[14,"frameborder","0"],[12],[13]],"hasEval":false,"upvars":[]}',meta:{moduleName:"ghost-admin/components/gh-billing-iframe.hbs"}})
93
- var n=Ember._setComponentTemplate(t,Ember.Component.extend({billing:Ember.inject.service(),config:Ember.inject.service(),ghostPaths:Ember.inject.service(),ajax:Ember.inject.service(),didInsertElement(){let e=!1
94
- this.billing.getBillingIframe().src=this.billing.getIframeURL(),window.addEventListener("message",(t=>{if(t&&t.data&&"token"===t.data.request){const t=this.get("ghostPaths.url").api("identities")
95
- this.ajax.request(t).then((e=>{const t=e&&e.identities&&e.identities[0]&&e.identities[0].token
96
- this.billing.getBillingIframe().contentWindow.postMessage({request:"token",response:t},"*")})),e||this.billing.get("subscription")||(e=!0,this.billing.getBillingIframe().contentWindow.postMessage({query:"getSubscription",response:"subscription"},"*"))}t&&t.data&&t.data.subscription&&this.billing.set("subscription",t.data.subscription)}))}}))
93
+ var n=Ember._setComponentTemplate(t,Ember.Component.extend({billing:Ember.inject.service(),config:Ember.inject.service(),ghostPaths:Ember.inject.service(),ajax:Ember.inject.service(),notifications:Ember.inject.service(),isOwner:null,didInsertElement(){this._super(...arguments)
94
+ let e=!1
95
+ this.billing.getBillingIframe().src=this.billing.getIframeURL(),window.addEventListener("message",(t=>{let n
96
+ if(t&&t.data&&"token"===t.data.request){const t=this.get("ghostPaths.url").api("identities")
97
+ this.ajax.request(t).then((e=>{n=e&&e.identities&&e.identities[0]&&e.identities[0].token,this.billing.getBillingIframe().contentWindow.postMessage({request:"token",response:n},"*"),this.set("isOwner",!0)})).catch((e=>{var t,n
98
+ if(null===(t=e.payload)||void 0===t||!t.errors||"NoPermissionError"!==(null===(n=e.payload.errors[0])||void 0===n?void 0:n.type))throw e
99
+ this.set("isOwner",!1),this.billing.getBillingIframe().contentWindow.postMessage({request:"token",response:null},"*")})),e||this.billing.get("subscription")||!n||(e=!0,this.billing.getBillingIframe().contentWindow.postMessage({query:"getSubscription",response:"subscription"},"*"))}if(t&&t.data&&"forceUpgradeInfo"===t.data.request){let e=null
100
+ const t=this.billing.get("ownerUser")
101
+ t&&(e={name:t.get("name"),email:t.get("email")}),this.billing.getBillingIframe().contentWindow.postMessage({request:"forceUpgradeInfo",response:{forceUpgrade:this.config.get("forceUpgrade"),isOwner:this.get("isOwner"),ownerUser:e}},"*")}var s,a,r,i,o
102
+ if(t&&t.data&&t.data.subscription)if(this.billing.set("subscription",t.data.subscription),this.billing.set("checkoutRoute",(null===(s=t.data)||void 0===s?void 0:s.checkoutRoute)||"/plans"),"active"===t.data.subscription.status&&this.config.get("forceUpgrade")&&this.config.set("forceUpgrade",!1),"past_due"===t.data.subscription.status||"unpaid"===t.data.subscription.status?this.notifications.showAlert("Billing error: This site is queued for suspension. The owner of this site must update payment information.",{type:"error",key:"billing.overdue"}):this.notifications.closeAlerts("billing.overdue"),null!==(a=t.data)&&void 0!==a&&a.exceededLimits&&null!==(r=t.data)&&void 0!==r&&r.exceededLimits.length&&(null===(i=t.data)||void 0===i?void 0:i.exceededLimits.indexOf("members"))>=0&&null!==(o=t.data)&&void 0!==o&&o.checkoutRoute){const e=this.billing.get("billingRouteRoot")+"?action=checkout"
103
+ this.notifications.showAlert(Ember.String.htmlSafe(`Your audience has grown! To continue publishing, the site owner must confirm pricing for this number of members <a href="${e}">here</a>`),{type:"warn",key:"billing.exceeded"})}else this.notifications.closeAlerts("billing.exceeded")}))}}))
97
104
  e.default=n})),define("ghost-admin/components/gh-billing-modal",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
98
105
  const t=Ember.HTMLBars.template({id:"UTF+FkW9",block:'{"symbols":[],"statements":[[10,"div"],[15,0,[31,[[32,0,["visibilityClass"]]]]],[12],[2,"\\n "],[10,"div"],[14,0,"gh-billing-container"],[12],[2,"\\n\\n "],[8,"gh-billing-iframe",[],[[],[]],[["default"],[{"statements":[],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"],[13]],"hasEval":false,"upvars":[]}',meta:{moduleName:"ghost-admin/components/gh-billing-modal.hbs"}})
99
106
  var n=Ember._setComponentTemplate(t,Ember.Component.extend({billing:Ember.inject.service(),visibilityClass:Ember.computed("billing.billingWindowOpen",(function(){return this.billing.get("billingWindowOpen")?"gh-billing":"gh-billing closed"})),didInsertElement(){this._super(...arguments),this._setupShortcuts()},willDestroyElement(){this._super(...arguments),this._removeShortcuts()},_setupShortcuts(){Ember.run((function(){document.activeElement.blur()})),this._previousKeymasterScope=key.getScope(),key("enter","modal",(()=>{this.send("confirm")})),key.setScope("modal")},_removeShortcuts(){key.unbind("enter","modal"),key.setScope(this._previousKeymasterScope)}}))
100
107
  e.default=n})),define("ghost-admin/components/gh-billing-update-button",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
101
108
  const t=Ember.HTMLBars.template({id:"RL9hrh9E",block:'{"symbols":[],"statements":[[6,[37,1],[[32,0,["showUpgradeButton"]]],null,[["default"],[{"statements":[[2," "],[11,"button"],[24,0,"gh-btn gh-btn-green"],[4,[38,0],[[32,0],"openBilling"],null],[12],[10,"span"],[12],[2,"Upgrade"],[13],[13],[2,"\\n"]],"parameters":[]}]]]],"hasEval":false,"upvars":["action","if"]}',meta:{moduleName:"ghost-admin/components/gh-billing-update-button.hbs"}})
102
- var n=Ember._setComponentTemplate(t,Ember.Component.extend({router:Ember.inject.service(),config:Ember.inject.service(),ghostPaths:Ember.inject.service(),ajax:Ember.inject.service(),billing:Ember.inject.service(),subscription:null,showUpgradeButton:Ember.computed.reads("billing.subscription.isActiveTrial"),actions:{openBilling(){this.billing.openBillingWindow(this.router.currentURL,"/billing/plans")}}}))
109
+ var n=Ember._setComponentTemplate(t,Ember.Component.extend({router:Ember.inject.service(),config:Ember.inject.service(),ghostPaths:Ember.inject.service(),ajax:Ember.inject.service(),billing:Ember.inject.service(),subscription:null,showUpgradeButton:Ember.computed.reads("billing.subscription.isActiveTrial"),actions:{openBilling(){this.billing.openBillingWindow(this.router.currentURL,"/pro/billing/plans")}}}))
103
110
  e.default=n})),define("ghost-admin/components/gh-blog-url",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
104
111
  const t=Ember.HTMLBars.template({id:"VAFqYKJu",block:'{"symbols":[],"statements":[[2,[32,0,["config","blogUrl"]]]],"hasEval":false,"upvars":[]}',meta:{moduleName:"ghost-admin/components/gh-blog-url.hbs"}})
105
112
  var n=Ember._setComponentTemplate(t,Ember.Component.extend({config:Ember.inject.service(),tagName:""}))
@@ -676,8 +683,8 @@ return this.get("clock.second"),e?(0,t.default)().tz(e).format("HH:mm:ss"):(0,t.
676
683
  e.default=s})),define("ghost-admin/components/gh-token-input",["exports","ghost-admin/utils/computed-fallback-if-undefined","ember-power-select/utils/group-utils","@ember-decorators/component","ember-concurrency"],(function(e,t,n,s,a){var r,i,o,l,d,u,m,c,p,h,g,f,b,v,y,w,E,_,k,x,P,j,T,M,S,O,C,A
677
684
  function D(e,t,n,s){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(s):void 0})}function I(e,t,n,s,a){var r={}
678
685
  return Object.keys(s).forEach((function(e){r[e]=s[e]})),r.enumerable=!!r.enumerable,r.configurable=!!r.configurable,("value"in r||r.initializer)&&(r.writable=!0),r=n.slice().reverse().reduce((function(n,s){return s(e,t,n)||n}),r),a&&void 0!==r.initializer&&(r.value=r.initializer?r.initializer.call(a):void 0,r.initializer=void 0),void 0===r.initializer&&(Object.defineProperty(e,t,r),r=null),r}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
679
- const N=Ember.HTMLBars.template({id:"DRFngbBr",block:'{"symbols":["option","@class","@triggerRole","@ariaDescribedBy","@ariaInvalid","@ariaLabel","@ariaLabelledBy","@afterOptionsComponent","@allowClear","@beforeOptionsComponent","@buildSelection","@calculatePosition","@destination","@disabled","@dropdownClass","@extra","@groupComponent","@horizontalPosition","@initiallyOpened","@loadingMessage","@matchTriggerWidth","@noMatchesMessage","@onClose","@onInput","@onOpen","@placeholder","@placeholderComponent","@preventScroll","@registerAPI","@renderInPlace","@required","@scrollTo","@searchMessage","@searchPlaceholder","@selected","@selectedItemComponent","@eventType","@title","@triggerClass","@triggerId","@verticalPosition","@tabindex"],"statements":[[8,"gh-token-input/select-multiple",[[16,0,[30,[36,1],["gh-token-input ",[32,2]],null]]],[["@triggerRole","@ariaDescribedBy","@ariaInvalid","@ariaLabel","@ariaLabelledBy","@afterOptionsComponent","@allowClear","@beforeOptionsComponent","@buildSelection","@calculatePosition","@closeOnSelect","@defaultHighlighted","@destination","@disabled","@dropdownClass","@extra","@groupComponent","@horizontalPosition","@initiallyOpened","@loadingMessage","@matcher","@matchTriggerWidth","@noMatchesMessage","@onBlur","@onChange","@onClose","@onFocus","@onInput","@onKeydown","@onOpen","@options","@optionsComponent","@placeholder","@placeholderComponent","@preventScroll","@registerAPI","@renderInPlace","@required","@scrollTo","@search","@searchEnabled","@searchField","@searchMessage","@searchPlaceholder","@selected","@selectedItemComponent","@eventType","@title","@triggerClass","@triggerComponent","@triggerId","@verticalPosition","@tabindex"],[[32,3],[32,4],[32,5],[32,6],[32,7],[32,8],[32,9],[32,10],[32,11],[32,12],[32,0,["closeOnSelect"]],[32,0,["defaultHighlighted"]],[32,13],[32,14],[32,15],[32,16],[32,17],[32,18],[32,19],[32,20],[32,0,["matcher"]],[32,21],[32,22],[32,0,["handleBlur"]],[32,0,["selectOrCreate"]],[32,23],[32,0,["handleFocus"]],[32,24],[32,0,["handleKeydown"]],[32,25],[32,0,["optionsWithoutSelected"]],[32,0,["optionsComponent"]],[32,26],[32,27],[32,28],[32,29],[32,30],[32,31],[32,32],[32,0,["searchAndSuggest"]],true,[32,0,["searchField"]],[32,33],[32,34],[32,35],[32,36],[32,37],[32,38],[32,39],[32,0,["triggerComponent"]],[32,40],[32,41],[32,42]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,2],[[32,1,["__isSuggestion__"]]],null,[["default","else"],[{"statements":[[2," "],[8,"gh-token-input/suggested-option",[],[["@option"],[[32,1]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[1,[30,[36,0],[[32,1],[32,0,["labelField"]]],null]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["get","concat","if"]}',meta:{moduleName:"ghost-admin/components/gh-token-input.hbs"}}),{Handlebars:U}=Ember
680
- let z=(r=(0,s.tagName)(""),i=(0,t.default)(!0),o=(0,t.default)(!1),l=(0,t.default)("name"),d=(0,t.default)(n.defaultMatcher),u=(0,t.default)("name"),m=(0,t.default)("gh-token-input/trigger"),c=(0,t.default)("power-select-vertical-collection-options"),p=Ember.computed("options.[]","selected.[]"),h=Ember._action,g=Ember._action,f=Ember._action,b=Ember._action,v=Ember._action,y=(0,a.task)((function*(){let e=yield this.options,t=yield this.selected
686
+ const U=Ember.HTMLBars.template({id:"DRFngbBr",block:'{"symbols":["option","@class","@triggerRole","@ariaDescribedBy","@ariaInvalid","@ariaLabel","@ariaLabelledBy","@afterOptionsComponent","@allowClear","@beforeOptionsComponent","@buildSelection","@calculatePosition","@destination","@disabled","@dropdownClass","@extra","@groupComponent","@horizontalPosition","@initiallyOpened","@loadingMessage","@matchTriggerWidth","@noMatchesMessage","@onClose","@onInput","@onOpen","@placeholder","@placeholderComponent","@preventScroll","@registerAPI","@renderInPlace","@required","@scrollTo","@searchMessage","@searchPlaceholder","@selected","@selectedItemComponent","@eventType","@title","@triggerClass","@triggerId","@verticalPosition","@tabindex"],"statements":[[8,"gh-token-input/select-multiple",[[16,0,[30,[36,1],["gh-token-input ",[32,2]],null]]],[["@triggerRole","@ariaDescribedBy","@ariaInvalid","@ariaLabel","@ariaLabelledBy","@afterOptionsComponent","@allowClear","@beforeOptionsComponent","@buildSelection","@calculatePosition","@closeOnSelect","@defaultHighlighted","@destination","@disabled","@dropdownClass","@extra","@groupComponent","@horizontalPosition","@initiallyOpened","@loadingMessage","@matcher","@matchTriggerWidth","@noMatchesMessage","@onBlur","@onChange","@onClose","@onFocus","@onInput","@onKeydown","@onOpen","@options","@optionsComponent","@placeholder","@placeholderComponent","@preventScroll","@registerAPI","@renderInPlace","@required","@scrollTo","@search","@searchEnabled","@searchField","@searchMessage","@searchPlaceholder","@selected","@selectedItemComponent","@eventType","@title","@triggerClass","@triggerComponent","@triggerId","@verticalPosition","@tabindex"],[[32,3],[32,4],[32,5],[32,6],[32,7],[32,8],[32,9],[32,10],[32,11],[32,12],[32,0,["closeOnSelect"]],[32,0,["defaultHighlighted"]],[32,13],[32,14],[32,15],[32,16],[32,17],[32,18],[32,19],[32,20],[32,0,["matcher"]],[32,21],[32,22],[32,0,["handleBlur"]],[32,0,["selectOrCreate"]],[32,23],[32,0,["handleFocus"]],[32,24],[32,0,["handleKeydown"]],[32,25],[32,0,["optionsWithoutSelected"]],[32,0,["optionsComponent"]],[32,26],[32,27],[32,28],[32,29],[32,30],[32,31],[32,32],[32,0,["searchAndSuggest"]],true,[32,0,["searchField"]],[32,33],[32,34],[32,35],[32,36],[32,37],[32,38],[32,39],[32,0,["triggerComponent"]],[32,40],[32,41],[32,42]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,2],[[32,1,["__isSuggestion__"]]],null,[["default","else"],[{"statements":[[2," "],[8,"gh-token-input/suggested-option",[],[["@option"],[[32,1]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[1,[30,[36,0],[[32,1],[32,0,["labelField"]]],null]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["get","concat","if"]}',meta:{moduleName:"ghost-admin/components/gh-token-input.hbs"}}),{Handlebars:N}=Ember
687
+ let R=(r=(0,s.tagName)(""),i=(0,t.default)(!0),o=(0,t.default)(!1),l=(0,t.default)("name"),d=(0,t.default)(n.defaultMatcher),u=(0,t.default)("name"),m=(0,t.default)("gh-token-input/trigger"),c=(0,t.default)("power-select-vertical-collection-options"),p=Ember.computed("options.[]","selected.[]"),h=Ember._action,g=Ember._action,f=Ember._action,b=Ember._action,v=Ember._action,y=(0,a.task)((function*(){let e=yield this.options,t=yield this.selected
681
688
  return e.filter((e=>!t.includes(e)))})),w=(0,a.task)((function*(e,t){let n=(yield this.optionsWithoutSelected).toArray()
682
689
  if(0===e.length)return n
683
690
  let s=this.search
@@ -690,9 +697,9 @@ let s=e.find((e=>e.__isSuggestion__))
690
697
  s?this.onCreate(s.__value__,t):this.onChange(e,t),t.actions.search("")}defaultHighlighted(e){let{results:t}=e,s=(0,n.advanceSelectableOption)(t,void 0,1)
691
698
  return t.length>1&&s.__isSuggestion__&&(s=(0,n.advanceSelectableOption)(t,s,1)),s}_addCreateOption(e,t){this._shouldShowCreateOption(e,t)&&t.unshift(this._buildSuggestionForTerm(e))}_shouldShowCreateOption(e,t){return!!this.allowCreation&&(this.showCreateWhen?this.showCreateWhen(e,t):this._hideCreateOptionOnSameTerm(e,t))}_buildSuggestionForTerm(e){return{__isSuggestion__:!0,__value__:e,text:this._buildSuggestionLabel(e)}}_hideCreateOptionOnSameTerm(e,t){let n=this.searchField
692
699
  return!t.findBy(n,e)}_filter(e,t){let s
693
- return s=this.searchField?(e,t)=>this.matcher(Ember.get(e,this.searchField),t):(e,t)=>this.matcher(e,t),(0,n.filterOptions)(e||[],t,s)}_buildSuggestionLabel(e){return this.buildSuggestion?this.buildSuggestion(e):Ember.String.htmlSafe(`Add <strong>"${U.Utils.escapeExpression(e)}"...</strong>`)}},k=I((_=A).prototype,"allowCreation",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=I(_.prototype,"closeOnSelect",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=I(_.prototype,"labelField",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=I(_.prototype,"matcher",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=I(_.prototype,"searchField",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=I(_.prototype,"triggerComponent",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=I(_.prototype,"optionsComponent",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I(_.prototype,"optionsWithoutSelected",[p],Object.getOwnPropertyDescriptor(_.prototype,"optionsWithoutSelected"),_.prototype),I(_.prototype,"handleKeydown",[h],Object.getOwnPropertyDescriptor(_.prototype,"handleKeydown"),_.prototype),I(_.prototype,"handleFocus",[g],Object.getOwnPropertyDescriptor(_.prototype,"handleFocus"),_.prototype),I(_.prototype,"handleBlur",[f],Object.getOwnPropertyDescriptor(_.prototype,"handleBlur"),_.prototype),I(_.prototype,"searchAndSuggest",[b],Object.getOwnPropertyDescriptor(_.prototype,"searchAndSuggest"),_.prototype),I(_.prototype,"selectOrCreate",[v],Object.getOwnPropertyDescriptor(_.prototype,"selectOrCreate"),_.prototype),O=I(_.prototype,"optionsWithoutSelectedTask",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=I(_.prototype,"searchAndSuggestTask",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=_))||E)
694
- var R=Ember._setComponentTemplate(N,z)
695
- e.default=R})),define("ghost-admin/components/gh-token-input/label-token",["exports","ember-drag-drop/components/draggable-object"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
700
+ return s=this.searchField?(e,t)=>this.matcher(Ember.get(e,this.searchField),t):(e,t)=>this.matcher(e,t),(0,n.filterOptions)(e||[],t,s)}_buildSuggestionLabel(e){return this.buildSuggestion?this.buildSuggestion(e):Ember.String.htmlSafe(`Add <strong>"${N.Utils.escapeExpression(e)}"...</strong>`)}},k=I((_=A).prototype,"allowCreation",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=I(_.prototype,"closeOnSelect",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=I(_.prototype,"labelField",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=I(_.prototype,"matcher",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=I(_.prototype,"searchField",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=I(_.prototype,"triggerComponent",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=I(_.prototype,"optionsComponent",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I(_.prototype,"optionsWithoutSelected",[p],Object.getOwnPropertyDescriptor(_.prototype,"optionsWithoutSelected"),_.prototype),I(_.prototype,"handleKeydown",[h],Object.getOwnPropertyDescriptor(_.prototype,"handleKeydown"),_.prototype),I(_.prototype,"handleFocus",[g],Object.getOwnPropertyDescriptor(_.prototype,"handleFocus"),_.prototype),I(_.prototype,"handleBlur",[f],Object.getOwnPropertyDescriptor(_.prototype,"handleBlur"),_.prototype),I(_.prototype,"searchAndSuggest",[b],Object.getOwnPropertyDescriptor(_.prototype,"searchAndSuggest"),_.prototype),I(_.prototype,"selectOrCreate",[v],Object.getOwnPropertyDescriptor(_.prototype,"selectOrCreate"),_.prototype),O=I(_.prototype,"optionsWithoutSelectedTask",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=I(_.prototype,"searchAndSuggestTask",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=_))||E)
701
+ var z=Ember._setComponentTemplate(U,R)
702
+ e.default=z})),define("ghost-admin/components/gh-token-input/label-token",["exports","ember-drag-drop/components/draggable-object"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
696
703
  const n=Ember.HTMLBars.template({id:"PKCFtPBX",block:'{"symbols":["&default"],"statements":[[18,1,null],[2,"\\n"]],"hasEval":false,"upvars":[]}',meta:{moduleName:"ghost-admin/components/gh-token-input/label-token.hbs"}})
697
704
  var s=Ember._setComponentTemplate(n,t.default.extend({attributeBindings:["title"],classNames:["label-token"],title:"Label"}))
698
705
  e.default=s})),define("ghost-admin/components/gh-token-input/select-multiple",["exports","jquery","ember-power-select/components/power-select-multiple","@ember-decorators/component"],(function(e,t,n,s){var a,r,i,o,l,d
@@ -1120,25 +1127,25 @@ var t=Ember.Controller.extend({ui:Ember.inject.service()})
1120
1127
  e.default=t})),define("ghost-admin/controllers/error",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1121
1128
  var t=Ember.Controller.extend({stack:!1,error:Ember.computed.readOnly("model"),code:Ember.computed("error.status",(function(){return this.get("error.status")>200?this.get("error.status"):500})),message:Ember.computed("error.statusText",(function(){return 404===this.code?"Page not found":"error"!==this.get("error.statusText")?this.get("error.statusText"):"Internal Server Error"}))})
1122
1129
  e.default=t}))
1123
- define("ghost-admin/controllers/member",["exports","ghost-admin/utils/bound-one-way","moment","ember-concurrency-decorators"],(function(e,t,n,s){var a,r,i,o,l,d,u,m,c,p,h,g,f,b,v,y,w,E,_,k,x,P,j,T,M,S,O,C,A,D,I,N
1124
- function U(e,t,n,s){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(s):void 0})}function z(e,t,n,s,a){var r={}
1130
+ define("ghost-admin/controllers/member",["exports","ghost-admin/utils/bound-one-way","moment","ember-concurrency-decorators"],(function(e,t,n,s){var a,r,i,o,l,d,u,m,c,p,h,g,f,b,v,y,w,E,_,k,x,P,j,T,M,S,O,C,A,D,I,U
1131
+ function N(e,t,n,s){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(s):void 0})}function R(e,t,n,s,a){var r={}
1125
1132
  return Object.keys(s).forEach((function(e){r[e]=s[e]})),r.enumerable=!!r.enumerable,r.configurable=!!r.configurable,("value"in r||r.initializer)&&(r.writable=!0),r=n.slice().reverse().reduce((function(n,s){return s(e,t,n)||n}),r),a&&void 0!==r.initializer&&(r.value=r.initializer?r.initializer.call(a):void 0,r.initializer=void 0),void 0===r.initializer&&(Object.defineProperty(e,t,r),r=null),r}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1126
- const R=["name","email","note"]
1127
- let L=(a=Ember.inject.controller,r=Ember.inject.service,i=Ember.inject.service,o=Ember.inject.service,l=Ember.inject.service,d=Ember.inject.service,u=Ember.inject.service,m=Ember._tracked,c=Ember._tracked,p=Ember._tracked,h=Ember._tracked,g=Ember._action,f=Ember._action,b=Ember._action,v=Ember._action,y=Ember._action,w=Ember._action,E=Ember._action,_=(0,s.task)({drop:!0}),N=class extends Ember.Controller{constructor(...e){super(...e),U(this,"members",x,this),U(this,"session",P,this),U(this,"dropdown",j,this),U(this,"membersStats",T,this),U(this,"notifications",M,this),U(this,"router",S,this),U(this,"store",O,this),U(this,"isLoading",C,this),U(this,"showDeleteMemberModal",A,this),U(this,"showImpersonateMemberModal",D,this),U(this,"showUnsavedChangesModal",I,this),function(e,t,n){t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}(this,"leaveScreenTransition",null)}get member(){return this.model}set member(e){this.model=e}get scratchMember(){let e=Ember.Object.create({member:this.member})
1128
- return R.forEach((n=>Ember.defineProperty(e,n,(0,t.default)(`member.${n}`)))),e}get subscribedAt(){let e=(0,n.default)(this.member.get("createdAtUTC")).from((0,n.default)())
1133
+ const z=["name","email","note"]
1134
+ let L=(a=Ember.inject.controller,r=Ember.inject.service,i=Ember.inject.service,o=Ember.inject.service,l=Ember.inject.service,d=Ember.inject.service,u=Ember.inject.service,m=Ember._tracked,c=Ember._tracked,p=Ember._tracked,h=Ember._tracked,g=Ember._action,f=Ember._action,b=Ember._action,v=Ember._action,y=Ember._action,w=Ember._action,E=Ember._action,_=(0,s.task)({drop:!0}),U=class extends Ember.Controller{constructor(...e){super(...e),N(this,"members",x,this),N(this,"session",P,this),N(this,"dropdown",j,this),N(this,"membersStats",T,this),N(this,"notifications",M,this),N(this,"router",S,this),N(this,"store",O,this),N(this,"isLoading",C,this),N(this,"showDeleteMemberModal",A,this),N(this,"showImpersonateMemberModal",D,this),N(this,"showUnsavedChangesModal",I,this),function(e,t,n){t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}(this,"leaveScreenTransition",null)}get member(){return this.model}set member(e){this.model=e}get scratchMember(){let e=Ember.Object.create({member:this.member})
1135
+ return z.forEach((n=>Ember.defineProperty(e,n,(0,t.default)(`member.${n}`)))),e}get subscribedAt(){let e=(0,n.default)(this.member.get("createdAtUTC")).from((0,n.default)())
1129
1136
  return`${(0,n.default)(this.member.get("createdAtUTC")).format("D MMM YYYY")} (${e})`}setProperty(e,t){this._saveMemberProperty(e,t)}toggleDeleteMemberModal(){this.showDeleteMemberModal=!this.showDeleteMemberModal}toggleImpersonateMemberModal(){this.showImpersonateMemberModal=!this.showImpersonateMemberModal}save(){return this.saveTask.perform()}deleteMember(e=!1){let t={adapterOptions:{cancel:e}}
1130
1137
  return this.member.destroyRecord(t).then((()=>(this.members.refreshData(),this.transitionToRoute("members"))),(e=>this.notifications.showAPIError(e,{key:"member.delete"})))}toggleUnsavedChangesModal(e){let t=this.leaveScreenTransition
1131
1138
  if(!e&&this.showUnsavedChangesModal)return this.leaveScreenTransition=null,void(this.showUnsavedChangesModal=!1)
1132
1139
  if(!t||e.targetName===t.targetName){if(this.leaveScreenTransition=e,this.save.isRunning)return this.save.last.then((()=>{e.retry()}))
1133
- this.showUnsavedChangesModal=!0}}leaveScreen(){return this.member.rollbackAttributes(),this.leaveScreenTransition.retry()}*saveTask(){let{member:e,scratchMember:t}=this,n=t.getProperties(R)
1140
+ this.showUnsavedChangesModal=!0}}leaveScreen(){return this.member.rollbackAttributes(),this.leaveScreenTransition.retry()}*saveTask(){let{member:e,scratchMember:t}=this,n=t.getProperties(z)
1134
1141
  e.setProperties(n)
1135
1142
  try{return yield e.save(),e.updateLabels(),this.members.refreshData(),this.replaceRoute("member",e),e}catch(s){s&&this.notifications.showAPIError(s,{key:"member.save"})}}*fetchMemberTask(e){this.isLoading=!0,this.member=yield this.store.findRecord("member",e,{reload:!0}),this.isLoading=!1}_saveMemberProperty(e,t){let n=this.member.get(e)
1136
- t&&(t=t.trim()),(!1===t||t||n)&&this.member.set(e,t)}},x=z((k=N).prototype,"members",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=z(k.prototype,"session",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=z(k.prototype,"dropdown",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=z(k.prototype,"membersStats",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=z(k.prototype,"notifications",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=z(k.prototype,"router",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=z(k.prototype,"store",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=z(k.prototype,"isLoading",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),A=z(k.prototype,"showDeleteMemberModal",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),D=z(k.prototype,"showImpersonateMemberModal",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),I=z(k.prototype,"showUnsavedChangesModal",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),z(k.prototype,"setProperty",[g],Object.getOwnPropertyDescriptor(k.prototype,"setProperty"),k.prototype),z(k.prototype,"toggleDeleteMemberModal",[f],Object.getOwnPropertyDescriptor(k.prototype,"toggleDeleteMemberModal"),k.prototype),z(k.prototype,"toggleImpersonateMemberModal",[b],Object.getOwnPropertyDescriptor(k.prototype,"toggleImpersonateMemberModal"),k.prototype),z(k.prototype,"save",[v],Object.getOwnPropertyDescriptor(k.prototype,"save"),k.prototype),z(k.prototype,"deleteMember",[y],Object.getOwnPropertyDescriptor(k.prototype,"deleteMember"),k.prototype),z(k.prototype,"toggleUnsavedChangesModal",[w],Object.getOwnPropertyDescriptor(k.prototype,"toggleUnsavedChangesModal"),k.prototype),z(k.prototype,"leaveScreen",[E],Object.getOwnPropertyDescriptor(k.prototype,"leaveScreen"),k.prototype),z(k.prototype,"saveTask",[_],Object.getOwnPropertyDescriptor(k.prototype,"saveTask"),k.prototype),z(k.prototype,"fetchMemberTask",[s.task],Object.getOwnPropertyDescriptor(k.prototype,"fetchMemberTask"),k.prototype),k)
1137
- e.default=L})),define("ghost-admin/controllers/members",["exports","ghost-admin/utils/ghost-paths","moment","ghost-admin/helpers/gh-pluralize","ember-concurrency-decorators","ember-concurrency"],(function(e,t,n,s,a,r){var i,o,l,d,u,m,c,p,h,g,f,b,v,y,w,E,_,k,x,P,j,T,M,S,O,C,A,D,I,N,U,z,R,L,B,V,F,H,q,$,W,K,Y,G,J,Z,Q,X,ee,te
1143
+ t&&(t=t.trim()),(!1===t||t||n)&&this.member.set(e,t)}},x=R((k=U).prototype,"members",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=R(k.prototype,"session",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=R(k.prototype,"dropdown",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=R(k.prototype,"membersStats",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=R(k.prototype,"notifications",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=R(k.prototype,"router",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=R(k.prototype,"store",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=R(k.prototype,"isLoading",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),A=R(k.prototype,"showDeleteMemberModal",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),D=R(k.prototype,"showImpersonateMemberModal",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),I=R(k.prototype,"showUnsavedChangesModal",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),R(k.prototype,"setProperty",[g],Object.getOwnPropertyDescriptor(k.prototype,"setProperty"),k.prototype),R(k.prototype,"toggleDeleteMemberModal",[f],Object.getOwnPropertyDescriptor(k.prototype,"toggleDeleteMemberModal"),k.prototype),R(k.prototype,"toggleImpersonateMemberModal",[b],Object.getOwnPropertyDescriptor(k.prototype,"toggleImpersonateMemberModal"),k.prototype),R(k.prototype,"save",[v],Object.getOwnPropertyDescriptor(k.prototype,"save"),k.prototype),R(k.prototype,"deleteMember",[y],Object.getOwnPropertyDescriptor(k.prototype,"deleteMember"),k.prototype),R(k.prototype,"toggleUnsavedChangesModal",[w],Object.getOwnPropertyDescriptor(k.prototype,"toggleUnsavedChangesModal"),k.prototype),R(k.prototype,"leaveScreen",[E],Object.getOwnPropertyDescriptor(k.prototype,"leaveScreen"),k.prototype),R(k.prototype,"saveTask",[_],Object.getOwnPropertyDescriptor(k.prototype,"saveTask"),k.prototype),R(k.prototype,"fetchMemberTask",[s.task],Object.getOwnPropertyDescriptor(k.prototype,"fetchMemberTask"),k.prototype),k)
1144
+ e.default=L})),define("ghost-admin/controllers/members",["exports","ghost-admin/utils/ghost-paths","moment","ghost-admin/helpers/gh-pluralize","ember-concurrency-decorators","ember-concurrency"],(function(e,t,n,s,a,r){var i,o,l,d,u,m,c,p,h,g,f,b,v,y,w,E,_,k,x,P,j,T,M,S,O,C,A,D,I,U,N,R,z,L,B,V,F,H,q,$,W,K,Y,G,J,Z,Q,X,ee,te
1138
1145
  function ne(e,t,n,s){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(s):void 0})}function se(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ae(e,t,n,s,a){var r={}
1139
1146
  return Object.keys(s).forEach((function(e){r[e]=s[e]})),r.enumerable=!!r.enumerable,r.configurable=!!r.configurable,("value"in r||r.initializer)&&(r.writable=!0),r=n.slice().reverse().reduce((function(n,s){return s(e,t,n)||n}),r),a&&void 0!==r.initializer&&(r.value=r.initializer?r.initializer.call(a):void 0,r.initializer=void 0),void 0===r.initializer&&(Object.defineProperty(e,t,r),r=null),r}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1140
1147
  const re=[{name:"All members",value:null},{name:"Free members",value:"false"},{name:"Paid members",value:"true"}]
1141
- let ie=(i=Ember.inject.service,o=Ember.inject.service,l=Ember.inject.service,d=Ember.inject.service,u=Ember.inject.service,m=Ember.inject.service,c=Ember.inject.service,p=Ember._tracked,h=Ember._tracked,g=Ember._tracked,f=Ember._tracked,b=Ember._tracked,v=Ember._tracked,y=Ember._tracked,w=Ember._tracked,E=Ember._tracked,_=Ember._tracked,k=Ember._action,x=Ember._action,P=Ember._action,j=Ember._action,T=Ember._action,M=Ember._action,S=Ember._action,O=Ember._action,C=Ember._action,A=Ember._action,D=Ember._action,I=(0,a.task)({restartable:!0}),N=(0,a.task)({restartable:!0}),U=(0,a.task)({drop:!0}),te=class extends Ember.Controller{constructor(){super(...arguments),ne(this,"ajax",R,this),ne(this,"config",L,this),ne(this,"ellaSparse",B,this),ne(this,"feature",V,this),ne(this,"ghostPaths",F,this),ne(this,"membersStats",H,this),ne(this,"store",q,this),se(this,"queryParams",["label",{paidParam:"paid"},{searchParam:"search"},{orderParam:"order"}]),ne(this,"members",$,this),ne(this,"searchText",W,this),ne(this,"searchParam",K,this),ne(this,"paidParam",Y,this),ne(this,"label",G,this),ne(this,"orderParam",J,this),ne(this,"modalLabel",Z,this),ne(this,"showLabelModal",Q,this),ne(this,"showDeleteMembersModal",X,this),ne(this,"_availableLabels",ee,this),se(this,"paidParams",re),this._availableLabels=this.store.peekAll("label")}get listHeader(){let{searchText:e,selectedLabel:t,members:n}=this
1148
+ let ie=(i=Ember.inject.service,o=Ember.inject.service,l=Ember.inject.service,d=Ember.inject.service,u=Ember.inject.service,m=Ember.inject.service,c=Ember.inject.service,p=Ember._tracked,h=Ember._tracked,g=Ember._tracked,f=Ember._tracked,b=Ember._tracked,v=Ember._tracked,y=Ember._tracked,w=Ember._tracked,E=Ember._tracked,_=Ember._tracked,k=Ember._action,x=Ember._action,P=Ember._action,j=Ember._action,T=Ember._action,M=Ember._action,S=Ember._action,O=Ember._action,C=Ember._action,A=Ember._action,D=Ember._action,I=(0,a.task)({restartable:!0}),U=(0,a.task)({restartable:!0}),N=(0,a.task)({drop:!0}),te=class extends Ember.Controller{constructor(){super(...arguments),ne(this,"ajax",z,this),ne(this,"config",L,this),ne(this,"ellaSparse",B,this),ne(this,"feature",V,this),ne(this,"ghostPaths",F,this),ne(this,"membersStats",H,this),ne(this,"store",q,this),se(this,"queryParams",["label",{paidParam:"paid"},{searchParam:"search"},{orderParam:"order"}]),ne(this,"members",$,this),ne(this,"searchText",W,this),ne(this,"searchParam",K,this),ne(this,"paidParam",Y,this),ne(this,"label",G,this),ne(this,"orderParam",J,this),ne(this,"modalLabel",Z,this),ne(this,"showLabelModal",Q,this),ne(this,"showDeleteMembersModal",X,this),ne(this,"_availableLabels",ee,this),se(this,"paidParams",re),this._availableLabels=this.store.peekAll("label")}get listHeader(){let{searchText:e,selectedLabel:t,members:n}=this
1142
1149
  if(n.loading)return"Loading..."
1143
1150
  if(e)return"Search result"
1144
1151
  let a=(0,s.ghPluralize)(n.length,"member")
@@ -1157,7 +1164,7 @@ let i=new Date,o=!e||t!==this._lastLabel||s!==this._lastPaidParam||a!==this._las
1157
1164
  if(this._lastLabel=t,this._lastPaidParam=s,this._lastSearchParam=a,this._lastOrderParam=r,!o&&this._startDate&&!(this._startDate-i>6e4))return this.members
1158
1165
  this._startDate=i,this.members=yield this.ellaSparse.array(((e={},i={})=>{const o=t?`label:'${t}'+`:"",l=s?{paid:s}:{},d=a?{search:a}:{},u=r?`${r} desc`:"created_at desc"
1159
1166
  return i=Object.assign({order:u,limit:e.length,page:e.page,filter:`${o}created_at:<='${n.default.utc(this._startDate).format("YYYY-MM-DD HH:mm:ss")}'`},l,d,i),this.store.query("member",i).then((e=>({data:e,total:e.meta.pagination.total})))}),{limit:50})}*deleteMembersTask(){let{label:e,paidParam:t,searchParam:n}=this,s=e?`label:${e}`:"",a=t?{paid:t}:{},r=n?{search:n}:{},i=e||t||n?{}:{all:!0},o=new URLSearchParams(Object.assign({},{filter:s},a,r,i)),l=`${this.ghostPaths.url.api("members")}?${o}`,d=yield this.ajax.del(l)
1160
- return this.store.unloadAll("member"),this.reload(),d.meta.stats}resetSearch(){this.searchText=""}reload(){this.membersStats.invalidate(),this.membersStats.fetch(),this.fetchMembersTask.perform()}},R=ae((z=te).prototype,"ajax",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=ae(z.prototype,"config",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),B=ae(z.prototype,"ellaSparse",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),V=ae(z.prototype,"feature",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),F=ae(z.prototype,"ghostPaths",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),H=ae(z.prototype,"membersStats",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),q=ae(z.prototype,"store",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),$=ae(z.prototype,"members",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return Ember.A([])}}),W=ae(z.prototype,"searchText",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}}),K=ae(z.prototype,"searchParam",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}}),Y=ae(z.prototype,"paidParam",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),G=ae(z.prototype,"label",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),J=ae(z.prototype,"orderParam",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),Z=ae(z.prototype,"modalLabel",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),Q=ae(z.prototype,"showLabelModal",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),X=ae(z.prototype,"showDeleteMembersModal",[E],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),ee=ae(z.prototype,"_availableLabels",[_],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return Ember.A([])}}),ae(z.prototype,"refreshData",[k],Object.getOwnPropertyDescriptor(z.prototype,"refreshData"),z.prototype),ae(z.prototype,"changeOrder",[x],Object.getOwnPropertyDescriptor(z.prototype,"changeOrder"),z.prototype),ae(z.prototype,"search",[P],Object.getOwnPropertyDescriptor(z.prototype,"search"),z.prototype),ae(z.prototype,"exportData",[j],Object.getOwnPropertyDescriptor(z.prototype,"exportData"),z.prototype),ae(z.prototype,"changeLabel",[T],Object.getOwnPropertyDescriptor(z.prototype,"changeLabel"),z.prototype),ae(z.prototype,"addLabel",[M],Object.getOwnPropertyDescriptor(z.prototype,"addLabel"),z.prototype),ae(z.prototype,"editLabel",[S],Object.getOwnPropertyDescriptor(z.prototype,"editLabel"),z.prototype),ae(z.prototype,"toggleLabelModal",[O],Object.getOwnPropertyDescriptor(z.prototype,"toggleLabelModal"),z.prototype),ae(z.prototype,"changePaidParam",[C],Object.getOwnPropertyDescriptor(z.prototype,"changePaidParam"),z.prototype),ae(z.prototype,"toggleDeleteMembersModal",[A],Object.getOwnPropertyDescriptor(z.prototype,"toggleDeleteMembersModal"),z.prototype),ae(z.prototype,"deleteMembers",[D],Object.getOwnPropertyDescriptor(z.prototype,"deleteMembers"),z.prototype),ae(z.prototype,"searchTask",[I],Object.getOwnPropertyDescriptor(z.prototype,"searchTask"),z.prototype),ae(z.prototype,"fetchLabelsTask",[a.task],Object.getOwnPropertyDescriptor(z.prototype,"fetchLabelsTask"),z.prototype),ae(z.prototype,"fetchMembersTask",[N],Object.getOwnPropertyDescriptor(z.prototype,"fetchMembersTask"),z.prototype),ae(z.prototype,"deleteMembersTask",[U],Object.getOwnPropertyDescriptor(z.prototype,"deleteMembersTask"),z.prototype),z)
1167
+ return this.store.unloadAll("member"),this.reload(),d.meta.stats}resetSearch(){this.searchText=""}reload(){this.membersStats.invalidate(),this.membersStats.fetch(),this.fetchMembersTask.perform()}},z=ae((R=te).prototype,"ajax",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=ae(R.prototype,"config",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),B=ae(R.prototype,"ellaSparse",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),V=ae(R.prototype,"feature",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),F=ae(R.prototype,"ghostPaths",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),H=ae(R.prototype,"membersStats",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),q=ae(R.prototype,"store",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),$=ae(R.prototype,"members",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return Ember.A([])}}),W=ae(R.prototype,"searchText",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}}),K=ae(R.prototype,"searchParam",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}}),Y=ae(R.prototype,"paidParam",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),G=ae(R.prototype,"label",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),J=ae(R.prototype,"orderParam",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),Z=ae(R.prototype,"modalLabel",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),Q=ae(R.prototype,"showLabelModal",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),X=ae(R.prototype,"showDeleteMembersModal",[E],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),ee=ae(R.prototype,"_availableLabels",[_],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return Ember.A([])}}),ae(R.prototype,"refreshData",[k],Object.getOwnPropertyDescriptor(R.prototype,"refreshData"),R.prototype),ae(R.prototype,"changeOrder",[x],Object.getOwnPropertyDescriptor(R.prototype,"changeOrder"),R.prototype),ae(R.prototype,"search",[P],Object.getOwnPropertyDescriptor(R.prototype,"search"),R.prototype),ae(R.prototype,"exportData",[j],Object.getOwnPropertyDescriptor(R.prototype,"exportData"),R.prototype),ae(R.prototype,"changeLabel",[T],Object.getOwnPropertyDescriptor(R.prototype,"changeLabel"),R.prototype),ae(R.prototype,"addLabel",[M],Object.getOwnPropertyDescriptor(R.prototype,"addLabel"),R.prototype),ae(R.prototype,"editLabel",[S],Object.getOwnPropertyDescriptor(R.prototype,"editLabel"),R.prototype),ae(R.prototype,"toggleLabelModal",[O],Object.getOwnPropertyDescriptor(R.prototype,"toggleLabelModal"),R.prototype),ae(R.prototype,"changePaidParam",[C],Object.getOwnPropertyDescriptor(R.prototype,"changePaidParam"),R.prototype),ae(R.prototype,"toggleDeleteMembersModal",[A],Object.getOwnPropertyDescriptor(R.prototype,"toggleDeleteMembersModal"),R.prototype),ae(R.prototype,"deleteMembers",[D],Object.getOwnPropertyDescriptor(R.prototype,"deleteMembers"),R.prototype),ae(R.prototype,"searchTask",[I],Object.getOwnPropertyDescriptor(R.prototype,"searchTask"),R.prototype),ae(R.prototype,"fetchLabelsTask",[a.task],Object.getOwnPropertyDescriptor(R.prototype,"fetchLabelsTask"),R.prototype),ae(R.prototype,"fetchMembersTask",[U],Object.getOwnPropertyDescriptor(R.prototype,"fetchMembersTask"),R.prototype),ae(R.prototype,"deleteMembersTask",[N],Object.getOwnPropertyDescriptor(R.prototype,"deleteMembersTask"),R.prototype),R)
1161
1168
  e.default=ie})),define("ghost-admin/controllers/members/import",["exports","ghost-admin/helpers/reset-query-params"],(function(e,t){var n,s,a,r,i,o,l,d
1162
1169
  function u(e,t,n,s){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(s):void 0})}function m(e,t,n,s,a){var r={}
1163
1170
  return Object.keys(s).forEach((function(e){r[e]=s[e]})),r.enumerable=!!r.enumerable,r.configurable=!!r.configurable,("value"in r||r.initializer)&&(r.writable=!0),r=n.slice().reverse().reduce((function(n,s){return s(e,t,n)||n}),r),a&&void 0!==r.initializer&&(r.value=r.initializer?r.initializer.call(a):void 0,r.initializer=void 0),void 0===r.initializer&&(Object.defineProperty(e,t,r),r=null),r}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
@@ -1685,7 +1692,7 @@ e.default=s})),define("ghost-admin/modifiers/autofocus",["exports","ember-modifi
1685
1692
  var n=(0,t.modifier)((e=>e.focus()))
1686
1693
  e.default=n})),define("ghost-admin/modifiers/did-insert",["exports","@ember/render-modifiers/modifiers/did-insert"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("ghost-admin/modifiers/did-update",["exports","@ember/render-modifiers/modifiers/did-update"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("ghost-admin/modifiers/in-viewport",["exports","ember-in-viewport/modifiers/in-viewport"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("ghost-admin/modifiers/style",["exports","ember-style-modifier/modifiers/style"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("ghost-admin/modifiers/will-destroy",["exports","@ember/render-modifiers/modifiers/will-destroy"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("ghost-admin/router",["exports","ghost-admin/config/environment","ghost-admin/utils/ghost-paths"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1687
1694
  const s=Ember.Router.extend({location:t.default.locationType,rootURL:(0,n.default)().adminRoot})
1688
- s.map((function(){this.route("home",{path:"/"}),this.route("setup",(function(){this.route("one"),this.route("two"),this.route("three")})),this.route("signin"),this.route("signout"),this.route("signup",{path:"/signup/:token"}),this.route("reset",{path:"/reset/:token"}),this.route("about"),this.route("site"),this.route("billing",(function(){this.route("billing-sub",{path:"/*sub"})})),this.route("posts"),this.route("pages"),this.route("editor",(function(){this.route("new",{path:":type"}),this.route("edit",{path:":type/:post_id"})})),this.route("staff",(function(){this.route("user",{path:":user_slug"})})),this.route("tags"),this.route("tag.new",{path:"/tags/new"}),this.route("tag",{path:"/tags/:tag_slug"}),this.route("settings.general",{path:"/settings/general"}),this.route("settings.labs",{path:"/settings/labs"}),this.route("settings.labs.members",{path:"/settings/labs/members"}),this.route("settings.code-injection",{path:"/settings/code-injection"}),this.route("settings.design",{path:"/settings/design"},(function(){this.route("uploadtheme")})),this.route("settings.integrations",{path:"/settings/integrations"},(function(){this.route("new")})),this.route("settings.integration",{path:"/settings/integrations/:integration_id"},(function(){this.route("webhooks.new",{path:"webhooks/new"}),this.route("webhooks.edit",{path:"webhooks/:webhook_id"})})),this.route("settings.integrations.slack",{path:"/settings/integrations/slack"}),this.route("settings.integrations.amp",{path:"/settings/integrations/amp"}),this.route("settings.integrations.firstpromoter",{path:"/settings/integrations/firstpromoter"}),this.route("settings.integrations.unsplash",{path:"/settings/integrations/unsplash"}),this.route("settings.integrations.zapier",{path:"/settings/integrations/zapier"}),this.route("members",(function(){this.route("import")})),this.route("member.new",{path:"/members/new"})
1695
+ s.map((function(){this.route("home",{path:"/"}),this.route("setup",(function(){this.route("one"),this.route("two"),this.route("three")})),this.route("signin"),this.route("signout"),this.route("signup",{path:"/signup/:token"}),this.route("reset",{path:"/reset/:token"}),this.route("about"),this.route("site"),this.route("pro",(function(){this.route("pro-sub",{path:"/*sub"})})),this.route("posts"),this.route("pages"),this.route("editor",(function(){this.route("new",{path:":type"}),this.route("edit",{path:":type/:post_id"})})),this.route("staff",(function(){this.route("user",{path:":user_slug"})})),this.route("tags"),this.route("tag.new",{path:"/tags/new"}),this.route("tag",{path:"/tags/:tag_slug"}),this.route("settings.general",{path:"/settings/general"}),this.route("settings.labs",{path:"/settings/labs"}),this.route("settings.labs.members",{path:"/settings/labs/members"}),this.route("settings.code-injection",{path:"/settings/code-injection"}),this.route("settings.design",{path:"/settings/design"},(function(){this.route("uploadtheme")})),this.route("settings.integrations",{path:"/settings/integrations"},(function(){this.route("new")})),this.route("settings.integration",{path:"/settings/integrations/:integration_id"},(function(){this.route("webhooks.new",{path:"webhooks/new"}),this.route("webhooks.edit",{path:"webhooks/:webhook_id"})})),this.route("settings.integrations.slack",{path:"/settings/integrations/slack"}),this.route("settings.integrations.amp",{path:"/settings/integrations/amp"}),this.route("settings.integrations.firstpromoter",{path:"/settings/integrations/firstpromoter"}),this.route("settings.integrations.unsplash",{path:"/settings/integrations/unsplash"}),this.route("settings.integrations.zapier",{path:"/settings/integrations/zapier"}),this.route("members",(function(){this.route("import")})),this.route("member.new",{path:"/members/new"})
1689
1696
  this.route("member",{path:"/members/:member_id"}),this.route("error404",{path:"/*path"})}))
1690
1697
  var a=s
1691
1698
  e.default=a})),define("ghost-admin/routes/about",["exports","ghost-admin/routes/authenticated"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
@@ -1693,21 +1700,16 @@ var n=t.default.extend({buildRouteInfoMetadata:()=>({titleToken:"About"})})
1693
1700
  e.default=n})),define("ghost-admin/routes/application",["exports","ember-simple-auth/mixins/application-route-mixin","ember-simple-auth/configuration","ghost-admin/mixins/shortcuts-route","ghost-admin/utils/ctrl-or-cmd","ghost-admin/utils/window-proxy","ember-ajax/errors","ghost-admin/services/ajax"],(function(e,t,n,s,a,r,i,o){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1694
1701
  let l={esc:{action:"closeMenus",scope:"default"}}
1695
1702
  l[`${a.default}+s`]={action:"save",scope:"all"}
1696
- var d=Ember.Route.extend(t.default,s.default,{ajax:Ember.inject.service(),config:Ember.inject.service(),feature:Ember.inject.service(),ghostPaths:Ember.inject.service(),notifications:Ember.inject.service(),router:Ember.inject.service(),settings:Ember.inject.service(),tour:Ember.inject.service(),ui:Ember.inject.service(),whatsNew:Ember.inject.service(),shortcuts:l,routeAfterAuthentication:"home",init(){this._super(...arguments),this.router.on("routeDidChange",(()=>{this.notifications.displayDelayed()}))},beforeModel(){return this.config.fetchUnauthenticated()},afterModel(e,t){if(this._super(...arguments),this.get("session.isAuthenticated"))return this.set("appLoadTransition",t),t.send("loadServerNotifications"),Ember.RSVP.all([this.config.fetchAuthenticated(),this.feature.fetch(),this.settings.fetch(),this.tour.fetchViewed()]).then((e=>(this._appLoaded=!0,this.whatsNew.fetchLatest.perform(),e)))
1703
+ var d=Ember.Route.extend(t.default,s.default,{ajax:Ember.inject.service(),config:Ember.inject.service(),feature:Ember.inject.service(),ghostPaths:Ember.inject.service(),notifications:Ember.inject.service(),router:Ember.inject.service(),settings:Ember.inject.service(),tour:Ember.inject.service(),ui:Ember.inject.service(),whatsNew:Ember.inject.service(),billing:Ember.inject.service(),shortcuts:l,routeAfterAuthentication:"home",init(){this._super(...arguments),this.router.on("routeDidChange",(()=>{this.notifications.displayDelayed()}))},beforeModel(){return this.config.fetchUnauthenticated()},afterModel(e,t){if(this._super(...arguments),this.get("session.isAuthenticated"))return this.set("appLoadTransition",t),t.send("loadServerNotifications"),Ember.RSVP.all([this.config.fetchAuthenticated(),this.feature.fetch(),this.settings.fetch(),this.tour.fetchViewed()]).then((e=>(this._appLoaded=!0,this.whatsNew.fetchLatest.perform(),e)))
1697
1704
  this._appLoaded=!0},actions:{closeMenus(){this.ui.closeMenus()},didTransition(){this.set("appLoadTransition",null),this.send("closeMenus")},signedIn(){this.notifications.clearAll(),this.send("loadServerNotifications",!0)},authorizationFailed(){r.default.replaceLocation(n.default.rootURL)},loadServerNotifications(e){this.get("session.isAuthenticated")&&this.get("session.user").then((t=>{t.get("isAuthorOrContributor")||this.store.findAll("notification",{reload:!0}).then((t=>{t.forEach((t=>{t.get("top")||t.get("custom")?this.notifications.handleNotification(t,e):this.upgradeStatus.handleUpgradeNotification(t)}))}))}))},save:function(){return this},error(e,t){if((0,i.isUnauthorizedError)(e))return!1
1698
1705
  if((0,i.isNotFoundError)(e)){t&&t.abort()
1699
1706
  let e=t.to,n=this.router,s=[]
1700
1707
  for(let t of Object.keys(e.params))s.push(e.params[t])
1701
1708
  let a=n.urlFor(e.name,...s).replace(/^#\//,"").replace(/^\//,"").replace(/^ghost\//,"")
1702
1709
  return this.replaceWith("error404",a)}return(!(0,o.isVersionMismatchError)(e)||(t&&t.abort(),this.upgradeStatus.requireUpgrade(),!this._appLoaded))&&((!(0,o.isMaintenanceError)(e)||(t&&t.abort(),this.upgradeStatus.maintenanceAlert(),!this._appLoaded))&&!(((0,i.isAjaxError)(e)||e&&e.payload&&Ember.isArray(e.payload.errors))&&(this.notifications.showAPIError(e),!t)))}},sessionAuthenticated(){this.get("session.skipAuthSuccessHandler")||(this._super(...arguments),this.get("session.user").then((e=>{this.send("signedIn",e)})))},sessionInvalidated(){let e=this.appLoadTransition
1703
- e?e.send("authorizationFailed"):Ember.run.scheduleOnce("routerTransitions",this,"send","authorizationFailed")}})
1710
+ e?e.send("authorizationFailed"):Ember.run.scheduleOnce("routerTransitions",this,"send","authorizationFailed"),this.config.get("forceUpgrade")&&this.billing.openBillingWindow(this.router.currentURL,"/pro")}})
1704
1711
  e.default=d})),define("ghost-admin/routes/authenticated",["exports","ember-simple-auth/mixins/authenticated-route-mixin"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1705
1712
  var n=Ember.Route.extend(t.default,{authenticationRoute:"signin"})
1706
- e.default=n})),define("ghost-admin/routes/billing",["exports","ghost-admin/routes/authenticated"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1707
- var n=t.default.extend({billing:Ember.inject.service(),session:Ember.inject.service(),ui:Ember.inject.service(),queryParams:{action:{refreshModel:!0}},beforeModel(e){return this._super(...arguments),this.session.user.then((t=>{if(!t.isOwner)return this.transitionTo("home")
1708
- this.billing.set("previousTransition",e)}))},model(e){e.action&&this.billing.set("action",e.action),this.billing.setBillingWindowOpen(!0)},activate(){this.ui.set("showTour",!1)},deactivate(){this.ui.set("showTour",!0)},actions:{willTransition(e){let t=!1
1709
- if(e){let n="string"==typeof e.to?e.to:e.intent?e.intent.url:""
1710
- null!=n&&n.includes("/billing")&&(t=!0)}this.billing.setBillingWindowOpen(t)}},buildRouteInfoMetadata:()=>({titleToken:"Billing"})})
1711
1713
  e.default=n})),define("ghost-admin/routes/editor",["exports","jquery","ghost-admin/routes/authenticated","ghost-admin/mixins/shortcuts-route","ghost-admin/utils/ctrl-or-cmd"],(function(e,t,n,s,a){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1712
1714
  let r={}
1713
1715
  r[`${a.default}+shift+p`]="publish",r[`${a.default}+p`]="preview"
@@ -1760,6 +1762,11 @@ case"published":t="published"
1760
1762
  break
1761
1763
  case"scheduled":t="scheduled"}return{status:t}},_filterString:e=>Object.keys(e).map((t=>{let n=e[t]
1762
1764
  if(!Ember.isBlank(n))return`${t}:${e[t]}`})).compact().join("+")})
1765
+ e.default=n})),define("ghost-admin/routes/pro",["exports","ghost-admin/routes/authenticated"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1766
+ var n=t.default.extend({billing:Ember.inject.service(),ui:Ember.inject.service(),session:Ember.inject.service(),config:Ember.inject.service(),queryParams:{action:{refreshModel:!0}},beforeModel(e){return this._super(...arguments),this.session.user.then((t=>{if(!t.get("isOwner")&&!this.config.get("forceUpgrade"))return this.transitionTo("home")
1767
+ this.billing.set("previousTransition",e)}))},model(e){e.action&&this.billing.set("action",e.action),this.billing.toggleProWindow(!0)},activate(){this.ui.set("showTour",!1)},deactivate(){this.ui.set("showTour",!0)},actions:{willTransition(e){let t=!1
1768
+ if(e){let n="string"==typeof e.to?e.to:e.intent?e.intent.url:""
1769
+ null!=n&&n.includes("/pro")&&(t=!0)}this.billing.toggleProWindow(t)}},buildRouteInfoMetadata:()=>({titleToken:"Ghost(Pro)"})})
1763
1770
  e.default=n})),define("ghost-admin/routes/reset",["exports","ghost-admin/mixins/unauthenticated-route-mixin"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1764
1771
  var n=Ember.Route.extend(t.default,{notifications:Ember.inject.service(),session:Ember.inject.service(),beforeModel(){this.get("session.isAuthenticated")&&this.notifications.showAlert("You can't reset your password while you're signed in.",{type:"warn",delayed:!0,key:"password.reset.signed-in"}),this._super(...arguments)},setupController(e,t){e.token=t.token},deactivate(){this._super(...arguments),this.controller.clearData()},buildRouteInfoMetadata:()=>({bodyClasses:["unauthenticated-route"]})})
1765
1772
  e.default=n})),define("ghost-admin/routes/settings/code-injection",["exports","ghost-admin/routes/authenticated","ghost-admin/mixins/current-user-settings"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
@@ -1934,13 +1941,13 @@ e&&(Ember.isArray(e)||(e=[e]),n.errors=e.map((function(e){return"string"==typeof
1934
1941
  k.reopen({contentType:"application/json; charset=UTF-8"})
1935
1942
  var x=k
1936
1943
  e.default=x})),define("ghost-admin/services/billing",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1937
- var t=Ember.Service.extend({router:Ember.inject.service(),config:Ember.inject.service(),ghostPaths:Ember.inject.service(),billingRouteRoot:"#/billing",billingWindowOpen:!1,subscription:null,previousRoute:null,init(){this._super(...arguments),this.config.get("billingUrl")&&window.addEventListener("message",(e=>{e&&e.data&&e.data.route&&this.handleRouteChangeInIframe(e.data.route)}))},handleRouteChangeInIframe(e){if(this.get("billingWindowOpen")){let t=this.get("billingRouteRoot")
1938
- "/"!==e&&(t+=e),window.location.hash!==t&&window.history.replaceState(window.history.state,"",t)}},getIframeURL(){let e=this.config.get("billingUrl")
1944
+ var t=Ember.Service.extend({router:Ember.inject.service(),config:Ember.inject.service(),ghostPaths:Ember.inject.service(),store:Ember.inject.service(),billingRouteRoot:"#/pro",billingWindowOpen:!1,subscription:null,previousRoute:null,action:null,ownerUser:null,init(){this._super(...arguments),this.config.get("billingUrl")&&window.addEventListener("message",(e=>{e&&e.data&&e.data.route&&this.handleRouteChangeInIframe(e.data.route)}))},handleRouteChangeInIframe(e){if(this.get("billingWindowOpen")){let t=this.get("billingRouteRoot")
1945
+ "/"!==e&&(t+=e),window.location.hash!==t&&window.history.replaceState(window.history.state,"",t)}},getIframeURL(){this.getOwnerUser()
1946
+ let e=this.config.get("billingUrl")
1939
1947
  if(window.location.hash&&window.location.hash.includes(this.get("billingRouteRoot"))){let t=window.location.hash.replace(this.get("billingRouteRoot"),"")
1940
- t&&(e+=t)}return e},setBillingWindowOpen(e){let t=this.getBillingIframe()
1941
- t&&e&&t.contentWindow.location.replace(this.getIframeURL()),this.set("billingWindowOpen",e)},openBillingWindow(e,t){this.set("previousRoute",e),window.location.hash=t||"/billing",this.router.transitionTo(t||"/billing")},closeBillingWindow(){this.set("billingWindowOpen",!1)
1942
- let e=this.get("previousRoute")||"/"
1943
- this.router.transitionTo(e)},getBillingIframe:()=>document.getElementById("billing-frame")})
1948
+ t&&(e+=t)}return e},async getOwnerUser(){if(!this.get("ownerUser")){let e=this.store.peekAll("user").findBy("isOwner",!0)
1949
+ e||(await this.store.findAll("user",{reload:!0}),e=this.store.peekAll("user").findBy("isOwner",!0)),this.set("ownerUser",e)}return this.get("ownerUser")},sendRouteUpdate(){const e=this.get("action")
1950
+ e&&("checkout"===e&&this.getBillingIframe().contentWindow.postMessage({query:"routeUpdate",response:this.get("checkoutRoute")},"*"),this.set("action",null))},toggleProWindow(e){this.get("billingWindowOpen")&&e&&!this.get("action")||(this.sendRouteUpdate(),this.set("billingWindowOpen",e))},openBillingWindow(e,t){this.getOwnerUser(),this.get("billingWindowOpen")||(this.set("previousRoute",e),window.location.hash=t||"/pro",this.sendRouteUpdate(),this.router.transitionTo(t||"/pro"))},getBillingIframe(){return this.getOwnerUser(),document.getElementById("billing-frame")}})
1944
1951
  e.default=t})),define("ghost-admin/services/clock",["exports","ghost-admin/config/environment","moment"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
1945
1952
  var s=Ember.Service.extend({second:null,minute:null,hour:null,init(){this._super(...arguments),this.tick()},tick(){let e=(0,n.default)().utc()
1946
1953
  this.setProperties({second:e.seconds(),minute:e.minutes(),hour:e.hours()}),"test"!==t.default.environment&&Ember.run.later((()=>{this.tick()}),1e3)}})
@@ -2311,7 +2318,8 @@ return i}
2311
2318
  const t=/[aeiou]$/i,n=/[bcdfghjklmnpqrstvwxyz]$/i
2312
2319
  function s(e,t){var n,a,r,i=new Uint8Array(t)
2313
2320
  for(n in r=i,window.crypto.getRandomValues(r),i)if(Object.prototype.hasOwnProperty.call(i,n)&&(a=i[n])>e&&a<t)return a
2314
- return s(e,t)}})),define("ghost-admin/utils/route",[],(function(){Ember.Route.reopen({actions:{willTransition(e){return!this.get("upgradeStatus.isRequired")||(e.abort(),this.upgradeStatus.requireUpgrade(),!1)}}})})),define("ghost-admin/utils/titleize",["exports","ember-cli-string-helpers/utils/titleize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("ghost-admin/utils/window-proxy",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
2321
+ return s(e,t)}})),define("ghost-admin/utils/route",[],(function(){Ember.Route.reopen({config:Ember.inject.service(),billing:Ember.inject.service(),router:Ember.inject.service(),actions:{willTransition(e){return this.get("upgradeStatus.isRequired")?(e.abort(),this.upgradeStatus.requireUpgrade(),!1):!this.config.get("forceUpgrade")||("pro.index"===(null===(t=e.to)||void 0===t?void 0:t.name)||"signout"===(null===(n=e.to)||void 0===n?void 0:n.name)||(e.abort(),this.billing.openBillingWindow(this.router.currentURL,"/pro"),!1))
2322
+ var t,n}}})})),define("ghost-admin/utils/titleize",["exports","ember-cli-string-helpers/utils/titleize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("ghost-admin/utils/window-proxy",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
2315
2323
  var t={changeLocation(e){window.location=e},replaceLocation(e){window.location.replace(e)},replaceState(e,t,n){window.history.replaceState(e,t,n)}}
2316
2324
  e.default=t})),define("ghost-admin/validators/base",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
2317
2325
  var t=Ember.Object.extend({passed:!1,init(){this._super(...arguments),this.properties=this.properties||[]},check(e,t){return this.set("passed",!0),t&&this[t]?this[t](e):this.properties.forEach((t=>{this[t]&&this[t](e)})),this.passed},invalidate(){this.set("passed",!1)}})
@@ -41,7 +41,7 @@ function getMembersHelper() {
41
41
  const stripeDirectPublishableKey = settingsCache.get('stripe_publishable_key');
42
42
  const stripeConnectAccountId = settingsCache.get('stripe_connect_account_id');
43
43
 
44
- let membersHelper = `<script defer src="https://unpkg.com/@tryghost/portal@~0.15.0/umd/portal.min.js" data-ghost="${urlUtils.getSiteUrl()}"></script>`;
44
+ let membersHelper = `<script defer src="https://unpkg.com/@tryghost/portal@~0.16.0/umd/portal.min.js" data-ghost="${urlUtils.getSiteUrl()}"></script>`;
45
45
  membersHelper += (`<style> ${templateStyles}</style>`);
46
46
  if ((!!stripeDirectSecretKey && !!stripeDirectPublishableKey) || !!stripeConnectAccountId) {
47
47
  membersHelper += '<script async src="https://js.stripe.com/v3/"></script>';
@@ -23,7 +23,8 @@ module.exports = {
23
23
  enableDeveloperExperiments: config.get('enableDeveloperExperiments') || false,
24
24
  stripeDirect: config.get('stripeDirect'),
25
25
  mailgunIsConfigured: config.get('bulkEmail') && config.get('bulkEmail').mailgun,
26
- emailAnalytics: config.get('emailAnalytics')
26
+ emailAnalytics: config.get('emailAnalytics'),
27
+ forceUpgrade: config.get('host_settings:forceUpgrade') || false
27
28
  };
28
29
  if (billingUrl) {
29
30
  response.billingUrl = billingUrl;
@@ -26,12 +26,14 @@ module.exports = {
26
26
  }));
27
27
  }
28
28
 
29
- // CASE: omit core settings unless internal request
30
29
  if (!frame.options.context.internal) {
30
+ // CASE: omit core settings unless internal request
31
31
  settings = _.filter(settings, (setting) => {
32
32
  const isCore = setting.group === 'core';
33
33
  return !isCore;
34
34
  });
35
+ // CASE: omit secret settings unless internal request
36
+ settings = settings.map(settingsService.hideValueIfSecret);
35
37
  }
36
38
 
37
39
  return settings;
@@ -70,6 +72,8 @@ module.exports = {
70
72
  }));
71
73
  }
72
74
 
75
+ setting = settingsService.hideValueIfSecret(setting);
76
+
73
77
  return {
74
78
  [frame.options.key]: setting
75
79
  };
@@ -217,8 +221,8 @@ module.exports = {
217
221
  async query(frame) {
218
222
  const stripeConnectIntegrationToken = frame.data.settings.find(setting => setting.key === 'stripe_connect_integration_token');
219
223
 
220
- // The `stripe_connect_integration_token` "setting" is only used to set the `stripe_connect_*` settings.
221
224
  const settings = frame.data.settings.filter((setting) => {
225
+ // The `stripe_connect_integration_token` "setting" is only used to set the `stripe_connect_*` settings.
222
226
  return ![
223
227
  'stripe_connect_integration_token',
224
228
  'stripe_connect_publishable_key',
@@ -226,7 +230,9 @@ module.exports = {
226
230
  'stripe_connect_livemode',
227
231
  'stripe_connect_account_id',
228
232
  'stripe_connect_display_name'
229
- ].includes(setting.key);
233
+ ].includes(setting.key)
234
+ // Remove obfuscated settings
235
+ && !(setting.value === settingsService.obfuscatedSetting && settingsService.isSecretSetting(setting));
230
236
  });
231
237
 
232
238
  const getSetting = setting => settingsCache.get(setting.key, {resolve: false});
@@ -24,12 +24,14 @@ module.exports = {
24
24
  }));
25
25
  }
26
26
 
27
- // CASE: omit core settings unless internal request
28
27
  if (!frame.options.context.internal) {
28
+ // CASE: omit core settings unless internal request
29
29
  settings = _.filter(settings, (setting) => {
30
30
  const isCore = setting.group === 'core';
31
31
  return !isCore;
32
32
  });
33
+ // CASE: omit secret settings unless internal request
34
+ settings = settings.map(settingsService.hideValueIfSecret);
33
35
  }
34
36
 
35
37
  return settings;
@@ -68,6 +70,8 @@ module.exports = {
68
70
  }));
69
71
  }
70
72
 
73
+ setting = settingsService.hideValueIfSecret(setting);
74
+
71
75
  return {
72
76
  [frame.options.key]: setting
73
77
  };
@@ -108,7 +112,10 @@ module.exports = {
108
112
  }
109
113
 
110
114
  frame.data.settings = _.reject(frame.data.settings, (setting) => {
111
- return setting.key === 'type';
115
+ return setting.key === 'type'
116
+ // Remove obfuscated settings
117
+ || (setting.value === settingsService.obfuscatedSetting
118
+ && settingsService.isSecretSetting(setting));
112
119
  });
113
120
 
114
121
  const errors = [];
@@ -23,7 +23,8 @@ module.exports = {
23
23
  enableDeveloperExperiments: config.get('enableDeveloperExperiments') || false,
24
24
  stripeDirect: config.get('stripeDirect'),
25
25
  mailgunIsConfigured: config.get('bulkEmail') && config.get('bulkEmail').mailgun,
26
- emailAnalytics: config.get('emailAnalytics')
26
+ emailAnalytics: config.get('emailAnalytics'),
27
+ forceUpgrade: config.get('host_settings:forceUpgrade') || false
27
28
  };
28
29
  if (billingUrl) {
29
30
  response.billingUrl = billingUrl;
@@ -26,12 +26,14 @@ module.exports = {
26
26
  }));
27
27
  }
28
28
 
29
- // CASE: omit core settings unless internal request
30
29
  if (!frame.options.context.internal) {
30
+ // CASE: omit core settings unless internal request
31
31
  settings = _.filter(settings, (setting) => {
32
32
  const isCore = setting.group === 'core';
33
33
  return !isCore;
34
34
  });
35
+ // CASE: omit secret settings unless internal request
36
+ settings = settings.map(settingsService.hideValueIfSecret);
35
37
  }
36
38
 
37
39
  return settings;
@@ -70,6 +72,8 @@ module.exports = {
70
72
  }));
71
73
  }
72
74
 
75
+ setting = settingsService.hideValueIfSecret(setting);
76
+
73
77
  return {
74
78
  [frame.options.key]: setting
75
79
  };
@@ -217,8 +221,8 @@ module.exports = {
217
221
  async query(frame) {
218
222
  const stripeConnectIntegrationToken = frame.data.settings.find(setting => setting.key === 'stripe_connect_integration_token');
219
223
 
220
- // The `stripe_connect_integration_token` "setting" is only used to set the `stripe_connect_*` settings.
221
224
  const settings = frame.data.settings.filter((setting) => {
225
+ // The `stripe_connect_integration_token` "setting" is only used to set the `stripe_connect_*` settings.
222
226
  return ![
223
227
  'stripe_connect_integration_token',
224
228
  'stripe_connect_publishable_key',
@@ -226,7 +230,9 @@ module.exports = {
226
230
  'stripe_connect_livemode',
227
231
  'stripe_connect_account_id',
228
232
  'stripe_connect_display_name'
229
- ].includes(setting.key);
233
+ ].includes(setting.key)
234
+ // Remove obfuscated settings
235
+ && !(setting.value === settingsService.obfuscatedSetting && settingsService.isSecretSetting(setting));
230
236
  });
231
237
 
232
238
  const getSetting = setting => settingsCache.get(setting.key, {resolve: false});
@@ -5,6 +5,22 @@
5
5
  const models = require('../../models');
6
6
  const SettingsCache = require('./cache');
7
7
 
8
+ // The string returned when a setting is set as write-only
9
+ const obfuscatedSetting = '••••••••';
10
+
11
+ // The function used to decide whether a setting is write-only
12
+ function isSecretSetting(setting) {
13
+ return /secret/.test(setting.key);
14
+ }
15
+
16
+ // The function that obfuscates a write-only setting
17
+ function hideValueIfSecret(setting) {
18
+ if (setting.value && isSecretSetting(setting)) {
19
+ return {...setting, value: obfuscatedSetting};
20
+ }
21
+ return setting;
22
+ }
23
+
8
24
  module.exports = {
9
25
  async init() {
10
26
  const settingsCollection = await models.Settings.populateDefaults();
@@ -44,5 +60,9 @@ module.exports = {
44
60
  value: currentRoutesHash
45
61
  }], {context: {internal: true}});
46
62
  }
47
- }
63
+ },
64
+
65
+ obfuscatedSetting,
66
+ isSecretSetting,
67
+ hideValueIfSecret
48
68
  };
@@ -1,5 +1,7 @@
1
1
  const debug = require('ghost-ignition').debug('web:admin:controller');
2
2
  const path = require('path');
3
+ const fs = require('fs');
4
+ const crypto = require('crypto');
3
5
  const config = require('../../../shared/config');
4
6
  const updateCheck = require('../../update-check');
5
7
  const logging = require('../../../shared/logging');
@@ -25,6 +27,15 @@ module.exports = function adminController(req, res) {
25
27
  const templatePath = path.resolve(config.get('paths').adminViews, defaultTemplate);
26
28
  const headers = {};
27
29
 
30
+ // Generate our own ETag header
31
+ // `sendFile` by default uses filesize+lastmod date to generate an etag.
32
+ // That doesn't work for admin templates because the filesize doesn't change between versions
33
+ // and `npm pack` sets a fixed lastmod date for every file meaning the default etag never changes
34
+ const fileBuffer = fs.readFileSync(templatePath);
35
+ const hashSum = crypto.createHash('md5');
36
+ hashSum.update(fileBuffer);
37
+ headers.ETag = hashSum.digest('hex');
38
+
28
39
  if (config.get('adminFrameProtection')) {
29
40
  headers['X-Frame-Options'] = 'sameorigin';
30
41
  }
@@ -53,7 +53,7 @@
53
53
 
54
54
 
55
55
  <script src="assets/vendor.min-1ea21c7abed44258b1662cf1b103c007.js"></script>
56
- <script src="assets/ghost.min-c115f798d99b712736e35bb28baf3ee1.js"></script>
56
+ <script src="assets/ghost.min-c2286c1da1671730ae28b70205449d2f.js"></script>
57
57
 
58
58
  </body>
59
59
  </html>
@@ -53,7 +53,7 @@
53
53
 
54
54
 
55
55
  <script src="assets/vendor.min-1ea21c7abed44258b1662cf1b103c007.js"></script>
56
- <script src="assets/ghost.min-c115f798d99b712736e35bb28baf3ee1.js"></script>
56
+ <script src="assets/ghost.min-c2286c1da1671730ae28b70205449d2f.js"></script>
57
57
 
58
58
  </body>
59
59
  </html>
@@ -34,6 +34,7 @@ module.exports = function setupMembersApp() {
34
34
  // We don't want to add global bodyParser middleware as that interfers with stripe webhook requests on - `/webhooks`.
35
35
  membersApp.get('/api/member', middleware.getMemberData);
36
36
  membersApp.put('/api/member', bodyParser.json({limit: '1mb'}), middleware.updateMemberData);
37
+ membersApp.post('/api/member/email', bodyParser.json({limit: '1mb'}), (req, res) => membersService.api.middleware.updateEmailAddress(req, res));
37
38
  membersApp.get('/api/session', middleware.getIdentityToken);
38
39
  membersApp.delete('/api/session', middleware.deleteSession);
39
40
  membersApp.get('/api/site', middleware.getMemberSiteData);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "3.42.3",
3
+ "version": "3.42.7",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
@@ -56,7 +56,7 @@
56
56
  "@tryghost/kg-markdown-html-renderer": "3.0.0",
57
57
  "@tryghost/kg-mobiledoc-html-renderer": "3.0.1",
58
58
  "@tryghost/magic-link": "0.6.4",
59
- "@tryghost/members-api": "0.37.12",
59
+ "@tryghost/members-api": "0.37.13",
60
60
  "@tryghost/members-csv": "0.4.2",
61
61
  "@tryghost/members-ssr": "0.8.8",
62
62
  "@tryghost/mw-session-from-token": "0.1.14",
package/yarn.lock CHANGED
@@ -553,10 +553,10 @@
553
553
  jsonwebtoken "^8.5.1"
554
554
  lodash "^4.17.15"
555
555
 
556
- "@tryghost/members-api@0.37.12":
557
- version "0.37.12"
558
- resolved "https://registry.yarnpkg.com/@tryghost/members-api/-/members-api-0.37.12.tgz#53660d77b2116b991b3e2e9633ec0d9d01d9249a"
559
- integrity sha512-16yLqRLjInmwgEnQe0mSeGj6aM8wch2ZoZEMCuj1aaTdwZExtvtB3qbgX+zYz3Nblr53VdQe9Sz0J4U4IwXDAA==
556
+ "@tryghost/members-api@0.37.13":
557
+ version "0.37.13"
558
+ resolved "https://registry.yarnpkg.com/@tryghost/members-api/-/members-api-0.37.13.tgz#fa43449b64ceab645195649066b1fdb748d89f23"
559
+ integrity sha512-6d3QDbXaRW4eTnoX5FOqb7JlSiVmm99QHlaygsb3dNYcrT3/q75Ro0TA5KgoTp9x3vde1Gtwr+U76plwGExapQ==
560
560
  dependencies:
561
561
  "@tryghost/magic-link" "^0.6.7"
562
562
  bluebird "^3.5.4"