new.pug 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. extends ../layout
  2. block scripts
  3. script(src="https://js.recurly.com/v4/recurly.js")
  4. script(type='text/javascript').
  5. window.countryCode = '#{countryCode}'
  6. window.plan_code = '#{plan_code}'
  7. window.recurlyApiKey = "!{settings.apis.recurly.publicKey}"
  8. window.couponCode = !{StringHelper.stringifyJsonForScript(couponCode)}
  9. window.recomendedCurrency = !{StringHelper.stringifyJsonForScript(currency.slice(0,3))}
  10. block content
  11. .content.content-alt
  12. .container(ng-controller="NewSubscriptionController" ng-cloak)
  13. .row.card-group
  14. .col-md-5.col-md-push-4
  15. .card.card-highlighted.card-border(ng-hide="threeDSecureFlow")
  16. .alert.alert-danger(ng-show="recurlyLoadError")
  17. strong #{translate('payment_provider_unreachable_error')}
  18. .page-header(ng-hide="recurlyLoadError")
  19. .row
  20. .col-xs-9
  21. h2 {{planName}}
  22. .col-xs-3
  23. div.dropdown.changePlanButton.pull-right(ng-cloak, dropdown)
  24. a.btn.btn-default.dropdown-toggle(
  25. href="#",
  26. data-toggle="dropdown",
  27. dropdown-toggle
  28. )
  29. | {{currencyCode}} ({{allCurrencies[currencyCode]['symbol']}})
  30. span.caret
  31. ul.dropdown-menu(role="menu")
  32. li(ng-repeat="(currency, value) in availableCurrencies")
  33. a(
  34. ng-click="changeCurrency(currency)",
  35. ) {{currency}} ({{value['symbol']}})
  36. .row(ng-if="planCode == 'student-annual' || planCode == 'student-monthly' || planCode == 'student_free_trial_7_days'")
  37. .col-xs-12
  38. p.student-disclaimer #{translate('student_disclaimer')}
  39. hr.thin
  40. .row
  41. .col-md-12.text-center
  42. div(ng-if="trialLength")
  43. span !{translate("first_few_days_free", {trialLen:'{{trialLength}}'})}
  44. span(ng-if="discountMonths && discountRate")   - {{discountMonths}} #{translate("month")}s {{discountRate}}% Off
  45. div(ng-if="price")
  46. strong {{availableCurrencies[currencyCode]['symbol']}}{{price.next.total}}
  47. span(ng-if="monthlyBilling") #{translate("every")} #{translate("month")}
  48. span(ng-if="!monthlyBilling") #{translate("every")} #{translate("year")}
  49. div(ng-if="normalPrice")
  50. span.small Normally {{availableCurrencies[currencyCode]['symbol']}}{{normalPrice}}
  51. .row(ng-hide="recurlyLoadError")
  52. div()
  53. .col-md-12()
  54. form(
  55. name="simpleCCForm"
  56. novalidate
  57. )
  58. div.payment-method-toggle
  59. a.payment-method-toggle-switch(
  60. href
  61. ng-click="setPaymentMethod('credit_card');"
  62. ng-class="paymentMethod.value === 'credit_card' ? 'payment-method-toggle-switch-selected' : ''"
  63. )
  64. i.fa.fa-cc-mastercard.fa-2x(aria-hidden="true")
  65. span  
  66. i.fa.fa-cc-visa.fa-2x(aria-hidden="true")
  67. span  
  68. i.fa.fa-cc-amex.fa-2x(aria-hidden="true")
  69. span.sr-only Pay with Mastercard, Visa, or Amex
  70. a.payment-method-toggle-switch(
  71. href
  72. ng-click="setPaymentMethod('paypal');"
  73. ng-class="paymentMethod.value === 'paypal' ? 'payment-method-toggle-switch-selected' : ''"
  74. )
  75. i.fa.fa-cc-paypal.fa-2x(aria-hidden="true")
  76. span.sr-only Pay with PayPal
  77. .alert.alert-warning.small(ng-show="genericError")
  78. strong {{genericError}}
  79. div(ng-show="paymentMethod.value === 'credit_card'")
  80. .row
  81. .col-xs-6
  82. .form-group(ng-class="validation.errorFields.first_name || inputHasError(simpleCCForm.firstName) ? 'has-external-error' : ''")
  83. label(for="first-name") #{translate('first_name')}
  84. input#first-name.form-control(
  85. type="text"
  86. maxlength='255'
  87. data-recurly="first_name"
  88. name="firstName"
  89. ng-model="data.first_name"
  90. required
  91. )
  92. span.input-feedback-message {{ simpleCCForm.firstName.$error.required ? 'This field is required' : '' }}
  93. .col-xs-6
  94. .form-group(for="last-name",ng-class="validation.errorFields.last_name || inputHasError(simpleCCForm.lastName)? 'has-external-error' : ''")
  95. label(for="last-name") #{translate('last_name')}
  96. input#last-name.form-control(
  97. type="text"
  98. maxlength='255'
  99. data-recurly="last_name"
  100. name="lastName"
  101. ng-model="data.last_name"
  102. required
  103. )
  104. .form-group(ng-class="validation.errorFields.number ? 'has-external-error' : ''")
  105. label(for="card-no") #{translate("credit_card_number")}
  106. div#card-no(
  107. type="text"
  108. name="ccNumber"
  109. data-recurly='number'
  110. )
  111. .row
  112. .col-xs-3
  113. .form-group.has-feedback(ng-class="validation.errorFields.month ? 'has-external-error' : ''")
  114. label(for="month").capitalised #{translate("month")}
  115. div(
  116. type="number"
  117. name="month"
  118. data-recurly="month"
  119. )
  120. .col-xs-3
  121. .form-group.has-feedback(ng-class="validation.errorFields.year ? 'has-external-error' : ''")
  122. label(for="year").capitalised #{translate("year")}
  123. div(
  124. type="number"
  125. name="year"
  126. data-recurly="year"
  127. )
  128. .col-xs-6
  129. .form-group.has-feedback(ng-class="validation.errorFields.cvv ? 'has-external-error' : ''")
  130. label #{translate("security_code")}
  131. div(
  132. type="number"
  133. ng-model="data.cvv"
  134. data-recurly="cvv"
  135. name="cvv"
  136. cc-format-sec-code
  137. )
  138. .form-control-feedback
  139. a.form-helper(
  140. href
  141. tabindex="-1"
  142. tooltip-template="'cvv-tooltip-tpl.html'"
  143. tooltip-trigger="mouseenter"
  144. tooltip-append-to-body="true"
  145. ) ?
  146. div
  147. .form-group(ng-class="validation.errorFields.country || inputHasError(simpleCCForm.country) ? 'has-external-error' : ''")
  148. label(for="country") #{translate('country')}
  149. select#country.form-control(
  150. data-recurly="country"
  151. ng-model="data.country"
  152. name="country"
  153. ng-change="updateCountry()"
  154. required,
  155. ng-selected="{{country.code == data.country}}"
  156. )
  157. option(value='', disabled) #{translate("country")}
  158. option(value='-', disabled) --------------
  159. option(ng-repeat="country in countries" ng-bind-html="country.name" value="{{country.code}}")
  160. span.input-feedback-message {{ simpleCCForm.country.$error.required ? 'This field is required' : '' }}
  161. if (showVatField)
  162. .form-group
  163. label(for="vat-no") #{translate('vat_number')}
  164. input#vat-no.form-control(
  165. type="text"
  166. ng-blur="applyVatNumber()"
  167. ng-model="data.vat_number"
  168. )
  169. if (showCouponField)
  170. .form-group
  171. label(for="coupon-code") #{translate('coupon_code')}
  172. input#coupon-code.form-control(
  173. type="text"
  174. ng-blur="applyCoupon()"
  175. ng-model="data.coupon"
  176. )
  177. p(ng-if="paymentMethod.value === 'paypal'") #{translate("paypal_upgrade")}
  178. div.price-breakdown(ng-if="price.next.tax !== '0.00'")
  179. hr.thin
  180. span Total:
  181. strong {{availableCurrencies[currencyCode]['symbol']}}{{price.next.total}}
  182. span ({{availableCurrencies[currencyCode]['symbol']}}{{price.next.subtotal}} + {{availableCurrencies[currencyCode]['symbol']}}{{price.next.tax}} tax)
  183. span(ng-if="monthlyBilling") #{translate("every")} #{translate("month")}
  184. span(ng-if="!monthlyBilling") #{translate("every")} #{translate("year")}
  185. hr.thin
  186. div.payment-submit
  187. button.btn.btn-success.btn-block(
  188. ng-click="submit()"
  189. ng-disabled="processing || !isFormValid(simpleCCForm);"
  190. )
  191. span(ng-show="processing")
  192. i.fa.fa-spinner.fa-spin(aria-hidden="true")
  193. span.sr-only #{translate('processing')}
  194. |  
  195. span(ng-if="paymentMethod.value === 'credit_card'")
  196. | {{ monthlyBilling ? '#{translate("upgrade_cc_btn")}' : '#{translate("upgrade_now")}'}}
  197. span(ng-if="paymentMethod.value !== 'credit_card'") #{translate("upgrade_paypal_btn")}
  198. div.three-d-secure-container.card.card-highlighted.card-border(ng-show="threeDSecureFlow")
  199. .alert.alert-info.small(aria-live="assertive")
  200. strong #{translate('card_must_be_authenticated_by_3dsecure')}
  201. div.three-d-secure-recurly-container
  202. .col-md-3.col-md-pull-4
  203. if showStudentPlan == 'true'
  204. a.btn-primary.btn.plansPageStudentLink(
  205. href,
  206. ng-click="switchToStudent()"
  207. ) #{translate("half_price_student")}
  208. .card.card-first
  209. .paymentPageFeatures
  210. h3 #{translate("unlimited_projects")}
  211. p #{translate("create_unlimited_projects")}
  212. h3
  213. if plan.features.collaborators == -1
  214. - var collaboratorCount = 'Unlimited'
  215. else
  216. - var collaboratorCount = plan.features.collaborators
  217. | #{translate("collabs_per_proj", {collabcount:collaboratorCount})}
  218. p #{translate("work_on_single_version")}. #{translate("view_collab_edits")} in real time.
  219. h3 #{translate("full_doc_history")}
  220. p #{translate("see_what_has_been")}
  221. span.added #{translate("added")}
  222. | #{translate("and")}
  223. span.removed #{translate("removed")}.
  224. | #{translate("restore_to_any_older_version")}.
  225. h3 #{translate("sync_to_dropbox")}
  226. p
  227. | #{translate("acces_work_from_anywhere")}.
  228. | #{translate("work_offline_and_sync_with_dropbox")}.
  229. hr
  230. p.small.text-center(ng-non-bindable) We're confident that you'll love #{settings.appName}, but if not you can cancel anytime. We'll give you your money back, no questions asked, if you let us know within 30 days.
  231. script(type="text/javascript").
  232. ga('send', 'event', 'pageview', 'payment_form', "#{plan_code}")
  233. script(
  234. type="text/ng-template"
  235. id="cvv-tooltip-tpl.html"
  236. )
  237. p For #[strong Visa, MasterCard and Discover], the #[strong 3 digits] on the #[strong back] of your card.
  238. p For #[strong American Express], the #[strong 4 digits] on the #[strong front] of your card.