Browse Source

moved emberapp from misago, wip drop ember.js helper from python source

Rafał Pitoń 9 years ago
parent
commit
daa352b141
500 changed files with 104 additions and 261 deletions
  1. 0 1
      emberapp
  2. 0 0
      emberapp/.bowerrc
  3. 0 0
      emberapp/.editorconfig
  4. 0 0
      emberapp/.ember-cli
  5. 0 0
      emberapp/.gitignore
  6. 0 0
      emberapp/.jshintrc
  7. 0 0
      emberapp/.travis.yml
  8. 0 0
      emberapp/.watchmanconfig
  9. 0 0
      emberapp/Brocfile.js
  10. 0 0
      emberapp/README.md
  11. 0 0
      emberapp/ace/ace.js
  12. 0 0
      emberapp/ace/mode-markdown.js
  13. 0 0
      emberapp/app/adapters/application.js
  14. 0 0
      emberapp/app/adapters/user-profile.js
  15. 0 0
      emberapp/app/app.js
  16. 0 0
      emberapp/app/components/ban-expires.js
  17. 0 0
      emberapp/app/components/close-modal-button.js
  18. 0 0
      emberapp/app/components/desync-message.js
  19. 0 0
      emberapp/app/components/form-row.js
  20. 0 0
      emberapp/app/components/forms/avatar-crop-form.js
  21. 0 0
      emberapp/app/components/forms/avatar-gallery-form.js
  22. 0 0
      emberapp/app/components/forms/avatar-upload-form.js
  23. 0 0
      emberapp/app/components/forms/change-email-form.js
  24. 0 0
      emberapp/app/components/forms/change-password-form.js
  25. 0 0
      emberapp/app/components/forms/change-username-form.js
  26. 0 0
      emberapp/app/components/forms/edit-signature-form.js
  27. 0 0
      emberapp/app/components/forms/forum-options-form.js
  28. 0 0
      emberapp/app/components/forms/login-form.js
  29. 0 0
      emberapp/app/components/forms/register-form.js
  30. 0 0
      emberapp/app/components/forms/request-link-form.js
  31. 0 0
      emberapp/app/components/forms/select-avatar-type-form.js
  32. 0 0
      emberapp/app/components/forms/set-new-password-form.js
  33. 0 0
      emberapp/app/components/forms/validated-form.js
  34. 0 0
      emberapp/app/components/forum-footer.js
  35. 0 0
      emberapp/app/components/forum-navbar.js
  36. 0 0
      emberapp/app/components/last-username-changes.js
  37. 0 0
      emberapp/app/components/link-dropdown-toggle.js
  38. 0 0
      emberapp/app/components/loader-compact.js
  39. 0 0
      emberapp/app/components/loading-overlay.js
  40. 0 0
      emberapp/app/components/misago-editor.js
  41. 0 0
      emberapp/app/components/misago-markup.js
  42. 0 0
      emberapp/app/components/modal-header.js
  43. 0 0
      emberapp/app/components/modals/change-avatar-modal.js
  44. 0 0
      emberapp/app/components/modals/forum-modal.js
  45. 0 0
      emberapp/app/components/modals/login-modal.js
  46. 0 0
      emberapp/app/components/modals/register-closed-modal.js
  47. 0 0
      emberapp/app/components/modals/register-done-modal.js
  48. 0 0
      emberapp/app/components/modals/register-form-modal.js
  49. 0 0
      emberapp/app/components/navbar-dropdown-toggle.js
  50. 0 0
      emberapp/app/components/navbar-dropdown.js
  51. 0 0
      emberapp/app/components/pagination-aligned.js
  52. 0 0
      emberapp/app/components/qacaptcha-field.js
  53. 0 0
      emberapp/app/components/recaptcha-field.js
  54. 0 0
      emberapp/app/components/refresh-button.js
  55. 0 0
      emberapp/app/components/register-button.js
  56. 0 0
      emberapp/app/components/routed-links.js
  57. 0 0
      emberapp/app/components/show-modal-button.js
  58. 0 0
      emberapp/app/components/toast-message.js
  59. 0 0
      emberapp/app/components/ui-text-preview.js
  60. 0 0
      emberapp/app/components/user-avatar.js
  61. 0 0
      emberapp/app/components/user-card-ui-preview.js
  62. 0 0
      emberapp/app/components/user-card.js
  63. 0 0
      emberapp/app/components/user-menu.js
  64. 0 0
      emberapp/app/components/user-state-icon.js
  65. 0 0
      emberapp/app/components/user-state-label.js
  66. 0 0
      emberapp/app/components/yes-no-switch.js
  67. 0 0
      emberapp/app/helpers/batch-row.js
  68. 0 0
      emberapp/app/helpers/file-size.js
  69. 0 0
      emberapp/app/helpers/format-date.js
  70. 0 0
      emberapp/app/helpers/from-now.js
  71. 0 0
      emberapp/app/helpers/join-strings.js
  72. 0 0
      emberapp/app/helpers/rel-date.js
  73. 0 0
      emberapp/app/helpers/x-range.js
  74. 0 0
      emberapp/app/index.html
  75. 0 0
      emberapp/app/initializers/ace-editor-service.js
  76. 0 0
      emberapp/app/initializers/ajax-service.js
  77. 0 0
      emberapp/app/initializers/auth-service.js
  78. 0 0
      emberapp/app/initializers/captcha-service.js
  79. 0 0
      emberapp/app/initializers/clock-service.js
  80. 0 0
      emberapp/app/initializers/components-store.js
  81. 0 0
      emberapp/app/initializers/cropit-service.js
  82. 0 0
      emberapp/app/initializers/csrf-service.js
  83. 0 0
      emberapp/app/initializers/django-location.js
  84. 0 0
      emberapp/app/initializers/local-store.js
  85. 0 0
      emberapp/app/initializers/misago-settings.js
  86. 0 0
      emberapp/app/initializers/modal-service.js
  87. 0 0
      emberapp/app/initializers/moment-locale.js
  88. 0 0
      emberapp/app/initializers/navbar-dropdown-service.js
  89. 0 0
      emberapp/app/initializers/preload-store.js
  90. 0 0
      emberapp/app/initializers/registration-modal.js
  91. 0 0
      emberapp/app/initializers/script-loader-service.js
  92. 0 0
      emberapp/app/initializers/toast-message-service.js
  93. 0 0
      emberapp/app/initializers/zxcvbn-service.js
  94. 0 0
      emberapp/app/mixins/document-title.js
  95. 0 0
      emberapp/app/mixins/exceptions-shortcuts.js
  96. 0 0
      emberapp/app/mixins/modal-component.js
  97. 0 0
      emberapp/app/mixins/model-pagination.js
  98. 0 0
      emberapp/app/mixins/model-url-name.js
  99. 0 0
      emberapp/app/mixins/reset-scroll.js
  100. 0 0
      emberapp/app/mixins/shared-user-attrs.js
  101. 0 0
      emberapp/app/mixins/with-url-name.js
  102. 0 0
      emberapp/app/models/captcha-question.js
  103. 0 0
      emberapp/app/models/legal-page.js
  104. 0 0
      emberapp/app/models/rank.js
  105. 0 0
      emberapp/app/models/user-profile.js
  106. 0 0
      emberapp/app/models/user.js
  107. 0 0
      emberapp/app/models/username-change.js
  108. 0 0
      emberapp/app/resolver.js
  109. 0 0
      emberapp/app/router.js
  110. 0 0
      emberapp/app/routes/activation.js
  111. 0 0
      emberapp/app/routes/activation/activate.js
  112. 0 0
      emberapp/app/routes/activation/index.js
  113. 0 0
      emberapp/app/routes/application.js
  114. 0 0
      emberapp/app/routes/error-0.js
  115. 0 0
      emberapp/app/routes/error-403.js
  116. 0 0
      emberapp/app/routes/error-404.js
  117. 0 0
      emberapp/app/routes/error-banned.js
  118. 0 0
      emberapp/app/routes/forgotten-password/change-form.js
  119. 0 0
      emberapp/app/routes/forgotten-password/index.js
  120. 0 0
      emberapp/app/routes/index.js
  121. 0 0
      emberapp/app/routes/misago.js
  122. 0 0
      emberapp/app/routes/not-found.js
  123. 0 0
      emberapp/app/routes/options.js
  124. 0 0
      emberapp/app/routes/options/email/confirm.js
  125. 0 0
      emberapp/app/routes/options/email/index.js
  126. 0 0
      emberapp/app/routes/options/forum.js
  127. 0 0
      emberapp/app/routes/options/index.js
  128. 0 0
      emberapp/app/routes/options/password/confirm.js
  129. 0 0
      emberapp/app/routes/options/password/index.js
  130. 0 0
      emberapp/app/routes/options/signature.js
  131. 0 0
      emberapp/app/routes/options/username.js
  132. 0 0
      emberapp/app/routes/privacy-policy.js
  133. 0 0
      emberapp/app/routes/terms-of-service.js
  134. 0 0
      emberapp/app/routes/user.js
  135. 0 0
      emberapp/app/routes/users.js
  136. 0 0
      emberapp/app/routes/users/active.js
  137. 0 0
      emberapp/app/routes/users/index.js
  138. 0 0
      emberapp/app/routes/users/online/index.js
  139. 0 0
      emberapp/app/routes/users/rank.js
  140. 0 0
      emberapp/app/routes/users/rank/index.js
  141. 0 0
      emberapp/app/routes/users/rank/page.js
  142. 0 0
      emberapp/app/serializers/application.js
  143. 0 0
      emberapp/app/serializers/username-change.js
  144. 0 0
      emberapp/app/services/ace-editor.js
  145. 0 0
      emberapp/app/services/ajax.js
  146. 0 0
      emberapp/app/services/auth.js
  147. 0 0
      emberapp/app/services/clock.js
  148. 0 0
      emberapp/app/services/cropit.js
  149. 0 0
      emberapp/app/services/csrf.js
  150. 0 0
      emberapp/app/services/local-store.js
  151. 0 0
      emberapp/app/services/modal.js
  152. 0 0
      emberapp/app/services/navbar-dropdown.js
  153. 0 0
      emberapp/app/services/nocaptcha.js
  154. 0 0
      emberapp/app/services/page-title.js
  155. 0 0
      emberapp/app/services/preload-store.js
  156. 0 0
      emberapp/app/services/qacaptcha.js
  157. 0 0
      emberapp/app/services/recaptcha.js
  158. 0 0
      emberapp/app/services/registration-modal.js
  159. 0 0
      emberapp/app/services/script-loader.js
  160. 0 0
      emberapp/app/services/toast-message.js
  161. 0 0
      emberapp/app/services/zxcvbn.js
  162. 0 0
      emberapp/app/styles/app.less
  163. 0 0
      emberapp/app/styles/bootstrap-datetimepicker.less
  164. 0 0
      emberapp/app/styles/bootstrap/.csscomb.json
  165. 0 0
      emberapp/app/styles/bootstrap/.csslintrc
  166. 0 0
      emberapp/app/styles/bootstrap/alerts.less
  167. 0 0
      emberapp/app/styles/bootstrap/badges.less
  168. 0 0
      emberapp/app/styles/bootstrap/bootstrap.less
  169. 0 0
      emberapp/app/styles/bootstrap/breadcrumbs.less
  170. 0 0
      emberapp/app/styles/bootstrap/button-groups.less
  171. 0 0
      emberapp/app/styles/bootstrap/buttons.less
  172. 0 0
      emberapp/app/styles/bootstrap/carousel.less
  173. 0 0
      emberapp/app/styles/bootstrap/close.less
  174. 0 0
      emberapp/app/styles/bootstrap/code.less
  175. 0 0
      emberapp/app/styles/bootstrap/component-animations.less
  176. 0 0
      emberapp/app/styles/bootstrap/dropdowns.less
  177. 0 0
      emberapp/app/styles/bootstrap/forms.less
  178. 0 0
      emberapp/app/styles/bootstrap/glyphicons.less
  179. 0 0
      emberapp/app/styles/bootstrap/grid.less
  180. 0 0
      emberapp/app/styles/bootstrap/input-groups.less
  181. 0 0
      emberapp/app/styles/bootstrap/jumbotron.less
  182. 0 0
      emberapp/app/styles/bootstrap/labels.less
  183. 0 0
      emberapp/app/styles/bootstrap/list-group.less
  184. 0 0
      emberapp/app/styles/bootstrap/media.less
  185. 0 0
      emberapp/app/styles/bootstrap/mixins.less
  186. 0 0
      emberapp/app/styles/bootstrap/mixins/alerts.less
  187. 0 0
      emberapp/app/styles/bootstrap/mixins/background-variant.less
  188. 0 0
      emberapp/app/styles/bootstrap/mixins/border-radius.less
  189. 0 0
      emberapp/app/styles/bootstrap/mixins/buttons.less
  190. 0 0
      emberapp/app/styles/bootstrap/mixins/center-block.less
  191. 0 0
      emberapp/app/styles/bootstrap/mixins/clearfix.less
  192. 0 0
      emberapp/app/styles/bootstrap/mixins/forms.less
  193. 0 0
      emberapp/app/styles/bootstrap/mixins/gradients.less
  194. 0 0
      emberapp/app/styles/bootstrap/mixins/grid-framework.less
  195. 0 0
      emberapp/app/styles/bootstrap/mixins/grid.less
  196. 0 0
      emberapp/app/styles/bootstrap/mixins/hide-text.less
  197. 0 0
      emberapp/app/styles/bootstrap/mixins/image.less
  198. 0 0
      emberapp/app/styles/bootstrap/mixins/labels.less
  199. 0 0
      emberapp/app/styles/bootstrap/mixins/list-group.less
  200. 0 0
      emberapp/app/styles/bootstrap/mixins/nav-divider.less
  201. 0 0
      emberapp/app/styles/bootstrap/mixins/nav-vertical-align.less
  202. 0 0
      emberapp/app/styles/bootstrap/mixins/opacity.less
  203. 0 0
      emberapp/app/styles/bootstrap/mixins/pagination.less
  204. 0 0
      emberapp/app/styles/bootstrap/mixins/panels.less
  205. 0 0
      emberapp/app/styles/bootstrap/mixins/progress-bar.less
  206. 0 0
      emberapp/app/styles/bootstrap/mixins/reset-filter.less
  207. 0 0
      emberapp/app/styles/bootstrap/mixins/resize.less
  208. 0 0
      emberapp/app/styles/bootstrap/mixins/responsive-visibility.less
  209. 0 0
      emberapp/app/styles/bootstrap/mixins/size.less
  210. 0 0
      emberapp/app/styles/bootstrap/mixins/tab-focus.less
  211. 0 0
      emberapp/app/styles/bootstrap/mixins/table-row.less
  212. 0 0
      emberapp/app/styles/bootstrap/mixins/text-emphasis.less
  213. 0 0
      emberapp/app/styles/bootstrap/mixins/text-overflow.less
  214. 0 0
      emberapp/app/styles/bootstrap/mixins/vendor-prefixes.less
  215. 0 0
      emberapp/app/styles/bootstrap/modals.less
  216. 0 0
      emberapp/app/styles/bootstrap/navbar.less
  217. 0 0
      emberapp/app/styles/bootstrap/navs.less
  218. 0 0
      emberapp/app/styles/bootstrap/normalize.less
  219. 0 0
      emberapp/app/styles/bootstrap/pager.less
  220. 0 0
      emberapp/app/styles/bootstrap/pagination.less
  221. 0 0
      emberapp/app/styles/bootstrap/panels.less
  222. 0 0
      emberapp/app/styles/bootstrap/popovers.less
  223. 0 0
      emberapp/app/styles/bootstrap/print.less
  224. 0 0
      emberapp/app/styles/bootstrap/progress-bars.less
  225. 0 0
      emberapp/app/styles/bootstrap/responsive-embed.less
  226. 0 0
      emberapp/app/styles/bootstrap/responsive-utilities.less
  227. 0 0
      emberapp/app/styles/bootstrap/scaffolding.less
  228. 0 0
      emberapp/app/styles/bootstrap/tables.less
  229. 0 0
      emberapp/app/styles/bootstrap/theme.less
  230. 0 0
      emberapp/app/styles/bootstrap/thumbnails.less
  231. 0 0
      emberapp/app/styles/bootstrap/tooltip.less
  232. 0 0
      emberapp/app/styles/bootstrap/type.less
  233. 0 0
      emberapp/app/styles/bootstrap/utilities.less
  234. 0 0
      emberapp/app/styles/bootstrap/variables.less
  235. 0 0
      emberapp/app/styles/bootstrap/wells.less
  236. 0 0
      emberapp/app/styles/flavor/flavor.less
  237. 0 0
      emberapp/app/styles/flavor/variables.less
  238. 0 0
      emberapp/app/styles/misago/buttons.less
  239. 0 0
      emberapp/app/styles/misago/change-avatar.less
  240. 0 0
      emberapp/app/styles/misago/desync-message.less
  241. 0 0
      emberapp/app/styles/misago/dropdowns.less
  242. 0 0
      emberapp/app/styles/misago/editor.less
  243. 0 0
      emberapp/app/styles/misago/errorpages.less
  244. 0 0
      emberapp/app/styles/misago/footer.less
  245. 0 0
      emberapp/app/styles/misago/forms.less
  246. 0 0
      emberapp/app/styles/misago/inputs.less
  247. 0 0
      emberapp/app/styles/misago/list-groups.less
  248. 0 0
      emberapp/app/styles/misago/loaders.less
  249. 0 0
      emberapp/app/styles/misago/material-icons.less
  250. 0 0
      emberapp/app/styles/misago/misago.less
  251. 0 0
      emberapp/app/styles/misago/misc.less
  252. 0 0
      emberapp/app/styles/misago/modals.less
  253. 0 0
      emberapp/app/styles/misago/navbar.less
  254. 0 0
      emberapp/app/styles/misago/navs.less
  255. 0 0
      emberapp/app/styles/misago/page-header.less
  256. 0 0
      emberapp/app/styles/misago/pagination.less
  257. 0 0
      emberapp/app/styles/misago/shadows.less
  258. 0 0
      emberapp/app/styles/misago/tables.less
  259. 0 0
      emberapp/app/styles/misago/toast-message.less
  260. 0 0
      emberapp/app/styles/misago/typo.less
  261. 0 0
      emberapp/app/styles/misago/ui-preview.less
  262. 0 0
      emberapp/app/styles/misago/user-card.less
  263. 0 0
      emberapp/app/styles/misago/user-options.less
  264. 0 0
      emberapp/app/styles/misago/user-profile.less
  265. 0 0
      emberapp/app/styles/misago/user-status.less
  266. 0 0
      emberapp/app/styles/misago/variables.less
  267. 0 0
      emberapp/app/styles/ranks.less
  268. 0 0
      emberapp/app/templates/activation/link-sent.hbs
  269. 0 0
      emberapp/app/templates/activation/loading.hbs
  270. 0 0
      emberapp/app/templates/activation/request-link.hbs
  271. 0 0
      emberapp/app/templates/application.hbs
  272. 0 0
      emberapp/app/templates/components/ban-expires.hbs
  273. 0 0
      emberapp/app/templates/components/desync-message.hbs
  274. 0 0
      emberapp/app/templates/components/form-row.hbs
  275. 0 0
      emberapp/app/templates/components/forms/avatar-crop-form.hbs
  276. 0 0
      emberapp/app/templates/components/forms/avatar-gallery-form.hbs
  277. 0 0
      emberapp/app/templates/components/forms/avatar-upload-form.hbs
  278. 0 0
      emberapp/app/templates/components/forms/change-email-form.hbs
  279. 0 0
      emberapp/app/templates/components/forms/change-password-form.hbs
  280. 0 0
      emberapp/app/templates/components/forms/change-username-form.hbs
  281. 0 0
      emberapp/app/templates/components/forms/edit-signature-form.hbs
  282. 0 0
      emberapp/app/templates/components/forms/forum-options-form.hbs
  283. 0 0
      emberapp/app/templates/components/forms/login-form.hbs
  284. 0 0
      emberapp/app/templates/components/forms/register-form.hbs
  285. 0 0
      emberapp/app/templates/components/forms/request-link-form.hbs
  286. 0 0
      emberapp/app/templates/components/forms/select-avatar-type-form.hbs
  287. 0 0
      emberapp/app/templates/components/forms/set-new-password-form.hbs
  288. 0 0
      emberapp/app/templates/components/forum-footer.hbs
  289. 0 0
      emberapp/app/templates/components/forum-navbar.hbs
  290. 0 0
      emberapp/app/templates/components/last-username-changes.hbs
  291. 0 0
      emberapp/app/templates/components/loader-compact.hbs
  292. 0 0
      emberapp/app/templates/components/loading-overlay.hbs
  293. 0 0
      emberapp/app/templates/components/misago-editor.hbs
  294. 0 0
      emberapp/app/templates/components/modal-header.hbs
  295. 0 0
      emberapp/app/templates/components/modals/change-avatar-modal.hbs
  296. 0 0
      emberapp/app/templates/components/modals/empty-modal.hbs
  297. 0 0
      emberapp/app/templates/components/modals/forum-modal.hbs
  298. 0 0
      emberapp/app/templates/components/modals/login-modal.hbs
  299. 0 0
      emberapp/app/templates/components/modals/register-closed-modal.hbs
  300. 0 0
      emberapp/app/templates/components/modals/register-done-modal.hbs
  301. 0 0
      emberapp/app/templates/components/modals/register-form-modal.hbs
  302. 0 0
      emberapp/app/templates/components/navbar-dropdown.hbs
  303. 0 0
      emberapp/app/templates/components/pagination-aligned.hbs
  304. 0 0
      emberapp/app/templates/components/qacaptcha-field.hbs
  305. 0 0
      emberapp/app/templates/components/recaptcha-field.hbs
  306. 0 0
      emberapp/app/templates/components/toast-message.hbs
  307. 0 0
      emberapp/app/templates/components/user-card-ui-preview.hbs
  308. 0 0
      emberapp/app/templates/components/user-card.hbs
  309. 0 0
      emberapp/app/templates/components/user-menu.hbs
  310. 0 0
      emberapp/app/templates/components/user-state-icon.hbs
  311. 0 0
      emberapp/app/templates/components/user-state-label.hbs
  312. 0 0
      emberapp/app/templates/components/yes-no-switch.hbs
  313. 0 0
      emberapp/app/templates/error-0.hbs
  314. 0 0
      emberapp/app/templates/error-403.hbs
  315. 0 0
      emberapp/app/templates/error-404.hbs
  316. 0 0
      emberapp/app/templates/error-banned.hbs
  317. 0 0
      emberapp/app/templates/error.hbs
  318. 0 0
      emberapp/app/templates/forgotten-password/change-form.hbs
  319. 0 0
      emberapp/app/templates/forgotten-password/link-sent.hbs
  320. 0 0
      emberapp/app/templates/forgotten-password/request-link.hbs
  321. 0 0
      emberapp/app/templates/index.hbs
  322. 0 0
      emberapp/app/templates/loading.hbs
  323. 0 0
      emberapp/app/templates/misago.hbs
  324. 0 0
      emberapp/app/templates/options.hbs
  325. 0 0
      emberapp/app/templates/options/email/index.hbs
  326. 0 0
      emberapp/app/templates/options/email/loading.hbs
  327. 0 0
      emberapp/app/templates/options/forum.hbs
  328. 0 0
      emberapp/app/templates/options/password/index.hbs
  329. 0 0
      emberapp/app/templates/options/password/loading.hbs
  330. 0 0
      emberapp/app/templates/options/signature.hbs
  331. 0 0
      emberapp/app/templates/options/username.hbs
  332. 0 0
      emberapp/app/templates/privacy-policy.hbs
  333. 0 0
      emberapp/app/templates/terms-of-service.hbs
  334. 0 0
      emberapp/app/templates/user.hbs
  335. 0 0
      emberapp/app/templates/users.hbs
  336. 0 0
      emberapp/app/templates/users/active.hbs
  337. 0 0
      emberapp/app/templates/users/online/index.hbs
  338. 0 0
      emberapp/app/templates/users/online/loading.hbs
  339. 0 0
      emberapp/app/templates/users/rank.hbs
  340. 0 0
      emberapp/app/templates/users/rank/index.hbs
  341. 0 0
      emberapp/app/templates/users/rank/loading.hbs
  342. 0 0
      emberapp/app/transforms/ember-object.js
  343. 0 0
      emberapp/app/transforms/moment-date.js
  344. 0 0
      emberapp/app/utils/strings.js
  345. 0 0
      emberapp/bower.json
  346. 0 0
      emberapp/buildprod
  347. 0 0
      emberapp/config/environment.js
  348. 0 0
      emberapp/package.json
  349. 0 0
      emberapp/public/crossdomain.xml
  350. 0 0
      emberapp/public/misago/fonts/MaterialIcons-Regular.eot
  351. 0 0
      emberapp/public/misago/fonts/MaterialIcons-Regular.ttf
  352. 0 0
      emberapp/public/misago/fonts/MaterialIcons-Regular.woff
  353. 0 0
      emberapp/public/misago/fonts/MaterialIcons-Regular.woff2
  354. 0 0
      emberapp/public/misago/fonts/README.md
  355. 0 0
      emberapp/public/misago/fonts/codepoints
  356. 0 0
      emberapp/public/misago/img/site-icon.png
  357. 0 0
      emberapp/public/misago/img/site-logo.png
  358. 0 0
      emberapp/public/misago/js/ace.js
  359. 0 0
      emberapp/public/misago/js/cropit.js
  360. 0 0
      emberapp/public/misago/js/zxcvbn.js
  361. 0 0
      emberapp/public/robots.txt
  362. 0 0
      emberapp/testem.json
  363. 0 0
      emberapp/tests/.jshintrc
  364. 0 0
      emberapp/tests/acceptance/activate-test.js
  365. 0 0
      emberapp/tests/acceptance/ajax-service-test.js
  366. 0 0
      emberapp/tests/acceptance/auth-deny-test.js
  367. 0 0
      emberapp/tests/acceptance/auth-service-test.js
  368. 0 0
      emberapp/tests/acceptance/change-avatar-test.js
  369. 0 0
      emberapp/tests/acceptance/change-email-test.js
  370. 0 0
      emberapp/tests/acceptance/change-password-test.js
  371. 0 0
      emberapp/tests/acceptance/change-username-test.js
  372. 0 0
      emberapp/tests/acceptance/cropit-service-test.js
  373. 0 0
      emberapp/tests/acceptance/csrf-service-test.js
  374. 0 0
      emberapp/tests/acceptance/document-title-mixin-test.js
  375. 0 0
      emberapp/tests/acceptance/edit-signature-test.js
  376. 0 0
      emberapp/tests/acceptance/error-test.js
  377. 0 0
      emberapp/tests/acceptance/error-toast-test.js
  378. 0 0
      emberapp/tests/acceptance/forgotten-password-test.js
  379. 0 0
      emberapp/tests/acceptance/forum-options-test.js
  380. 0 0
      emberapp/tests/acceptance/index-test.js
  381. 0 0
      emberapp/tests/acceptance/local-store-test.js
  382. 0 0
      emberapp/tests/acceptance/login-test.js
  383. 0 0
      emberapp/tests/acceptance/model-pagination-test.js
  384. 0 0
      emberapp/tests/acceptance/model-url-name-mixin-test.js
  385. 0 0
      emberapp/tests/acceptance/privacy-policy-test.js
  386. 0 0
      emberapp/tests/acceptance/registration-test.js
  387. 0 0
      emberapp/tests/acceptance/routed-links-test.js
  388. 0 0
      emberapp/tests/acceptance/terms-of-service-test.js
  389. 0 0
      emberapp/tests/acceptance/zxcvbn-service-test.js
  390. 0 0
      emberapp/tests/helpers/api-mocks.js
  391. 0 0
      emberapp/tests/helpers/create-user.js
  392. 0 0
      emberapp/tests/helpers/destroy-modal.js
  393. 0 0
      emberapp/tests/helpers/resolver.js
  394. 0 0
      emberapp/tests/helpers/start-app.js
  395. 0 0
      emberapp/tests/helpers/toast-message.js
  396. 0 0
      emberapp/tests/index.html
  397. 0 0
      emberapp/tests/test-helper.js
  398. 0 0
      emberapp/tests/unit/.gitkeep
  399. 0 0
      emberapp/tests/unit/components/ban-expires-test.js
  400. 0 0
      emberapp/tests/unit/components/forum-footer-test.js
  401. 0 0
      emberapp/tests/unit/components/routed-links-test.js
  402. 0 0
      emberapp/tests/unit/helpers/batch-row-test.js
  403. 0 0
      emberapp/tests/unit/helpers/from-now-test.js
  404. 0 0
      emberapp/tests/unit/initializers/django-location-test.js
  405. 0 0
      emberapp/tests/unit/initializers/misago-settings-test.js
  406. 0 0
      emberapp/tests/unit/initializers/moment-locale-test.js
  407. 0 0
      emberapp/tests/unit/mixins/document-title-test.js
  408. 0 0
      emberapp/tests/unit/mixins/reset-scroll-test.js
  409. 0 0
      emberapp/tests/unit/models/legal-page-test.js
  410. 0 0
      emberapp/tests/unit/routes/application-test.js
  411. 0 0
      emberapp/tests/unit/routes/forgotten-password/index-test.js
  412. 0 0
      emberapp/tests/unit/routes/index-test.js
  413. 0 0
      emberapp/tests/unit/routes/misago-test.js
  414. 0 0
      emberapp/tests/unit/routes/not-found-test.js
  415. 0 0
      emberapp/tests/unit/routes/privacy-policy-test.js
  416. 0 0
      emberapp/tests/unit/routes/terms-of-service-test.js
  417. 0 0
      emberapp/tests/unit/services/clock-test.js
  418. 0 0
      emberapp/tests/unit/services/preload-store-test.js
  419. 0 0
      emberapp/tests/unit/services/toast-message-test.js
  420. 0 0
      emberapp/tests/unit/transforms/moment-date-test.js
  421. 0 0
      emberapp/tests/unit/utils/api-mocks-test.js
  422. 0 0
      emberapp/tests/unit/utils/strings-test.js
  423. 0 0
      emberapp/vendor/.gitkeep
  424. 0 0
      emberapp/vendor/bootstrap/.jscsrc
  425. 0 0
      emberapp/vendor/bootstrap/.jshintrc
  426. 0 0
      emberapp/vendor/bootstrap/affix.js
  427. 0 0
      emberapp/vendor/bootstrap/alert.js
  428. 0 0
      emberapp/vendor/bootstrap/button.js
  429. 0 0
      emberapp/vendor/bootstrap/carousel.js
  430. 0 0
      emberapp/vendor/bootstrap/collapse.js
  431. 0 0
      emberapp/vendor/bootstrap/dropdown.js
  432. 0 0
      emberapp/vendor/bootstrap/modal.js
  433. 0 0
      emberapp/vendor/bootstrap/popover.js
  434. 0 0
      emberapp/vendor/bootstrap/scrollspy.js
  435. 0 0
      emberapp/vendor/bootstrap/tab.js
  436. 0 0
      emberapp/vendor/bootstrap/tests/README.md
  437. 0 0
      emberapp/vendor/bootstrap/tests/index.html
  438. 0 0
      emberapp/vendor/bootstrap/tests/unit/.jshintrc
  439. 0 0
      emberapp/vendor/bootstrap/tests/unit/affix.js
  440. 0 0
      emberapp/vendor/bootstrap/tests/unit/alert.js
  441. 0 0
      emberapp/vendor/bootstrap/tests/unit/button.js
  442. 0 0
      emberapp/vendor/bootstrap/tests/unit/carousel.js
  443. 0 0
      emberapp/vendor/bootstrap/tests/unit/collapse.js
  444. 0 0
      emberapp/vendor/bootstrap/tests/unit/dropdown.js
  445. 0 0
      emberapp/vendor/bootstrap/tests/unit/modal.js
  446. 0 0
      emberapp/vendor/bootstrap/tests/unit/phantom.js
  447. 0 0
      emberapp/vendor/bootstrap/tests/unit/popover.js
  448. 0 0
      emberapp/vendor/bootstrap/tests/unit/scrollspy.js
  449. 0 0
      emberapp/vendor/bootstrap/tests/unit/tab.js
  450. 0 0
      emberapp/vendor/bootstrap/tests/unit/tooltip.js
  451. 0 0
      emberapp/vendor/bootstrap/tests/vendor/jquery.min.js
  452. 0 0
      emberapp/vendor/bootstrap/tests/vendor/qunit.css
  453. 0 0
      emberapp/vendor/bootstrap/tests/vendor/qunit.js
  454. 0 0
      emberapp/vendor/bootstrap/tests/visual/affix.html
  455. 0 0
      emberapp/vendor/bootstrap/tests/visual/alert.html
  456. 0 0
      emberapp/vendor/bootstrap/tests/visual/button.html
  457. 0 0
      emberapp/vendor/bootstrap/tests/visual/carousel.html
  458. 0 0
      emberapp/vendor/bootstrap/tests/visual/collapse.html
  459. 0 0
      emberapp/vendor/bootstrap/tests/visual/dropdown.html
  460. 0 0
      emberapp/vendor/bootstrap/tests/visual/modal.html
  461. 0 0
      emberapp/vendor/bootstrap/tests/visual/popover.html
  462. 0 0
      emberapp/vendor/bootstrap/tests/visual/scrollspy.html
  463. 0 0
      emberapp/vendor/bootstrap/tests/visual/tab.html
  464. 0 0
      emberapp/vendor/bootstrap/tests/visual/tooltip.html
  465. 0 0
      emberapp/vendor/bootstrap/tooltip.js
  466. 0 0
      emberapp/vendor/bootstrap/transition.js
  467. 0 0
      emberapp/vendor/testutils/.gitkeep
  468. 0 0
      emberapp/vendor/testutils/django-js-catalog.js
  469. 0 0
      emberapp/vendor/testutils/jquery.mockjax.js
  470. 0 0
      emberapp/vendor/testutils/misago-preload-data.js
  471. 1 1
      misago/conf/context_processors.py
  472. 4 4
      misago/conf/defaults.py
  473. 3 4
      misago/conf/tests/test_context_processors.py
  474. 3 9
      misago/core/context_processors.py
  475. 0 18
      misago/core/embercli.py
  476. 0 29
      misago/core/middleware/embercliredirects.py
  477. 3 0
      misago/core/middleware/frontendcontext.py
  478. 0 3
      misago/core/middleware/preloademberdata.py
  479. 6 6
      misago/core/tests/test_context_processors.py
  480. 0 43
      misago/core/tests/test_embercli.py
  481. 0 60
      misago/core/tests/test_embercliredirects_middleware.py
  482. 15 0
      misago/core/tests/test_frontendcontext_middleware.py
  483. 0 15
      misago/core/tests/test_preloademberdata_middleware.py
  484. 0 9
      misago/core/views.py
  485. 2 2
      misago/frontend/misago/app.js
  486. 8 3
      misago/frontend/misago/components/legal.js
  487. 1 1
      misago/frontend/misago/services/api.js
  488. 1 1
      misago/frontend/misago/services/conf.js
  489. 2 2
      misago/frontend/misago/services/router.js
  490. 2 2
      misago/frontend/test/tests/unit/conf.js
  491. 2 2
      misago/frontend/test/tests/unit/router.js
  492. 9 6
      misago/legal/views.py
  493. 0 3
      misago/project_template/project_name/urls.py
  494. 35 23
      misago/static/misago/js/misago.js
  495. 1 1
      misago/static/misago/js/misago.js.map
  496. 1 1
      misago/templates/misago/base.html
  497. 2 0
      misago/templates/misago/frontend_context.js
  498. 0 2
      misago/templates/misago/preloaded_data.js
  499. 3 3
      misago/users/context_processors.py
  500. 0 7
      misago/users/views/auth.py

+ 0 - 1
emberapp

@@ -1 +0,0 @@
-misago/emberapp

+ 0 - 0
misago/emberapp/.bowerrc → emberapp/.bowerrc


+ 0 - 0
misago/emberapp/.editorconfig → emberapp/.editorconfig


+ 0 - 0
misago/emberapp/.ember-cli → emberapp/.ember-cli


+ 0 - 0
misago/emberapp/.gitignore → emberapp/.gitignore


+ 0 - 0
misago/emberapp/.jshintrc → emberapp/.jshintrc


+ 0 - 0
misago/emberapp/.travis.yml → emberapp/.travis.yml


+ 0 - 0
misago/emberapp/.watchmanconfig → emberapp/.watchmanconfig


+ 0 - 0
misago/emberapp/Brocfile.js → emberapp/Brocfile.js


+ 0 - 0
misago/emberapp/README.md → emberapp/README.md


+ 0 - 0
misago/emberapp/ace/ace.js → emberapp/ace/ace.js


+ 0 - 0
misago/emberapp/ace/mode-markdown.js → emberapp/ace/mode-markdown.js


+ 0 - 0
misago/emberapp/app/adapters/application.js → emberapp/app/adapters/application.js


+ 0 - 0
misago/emberapp/app/adapters/user-profile.js → emberapp/app/adapters/user-profile.js


+ 0 - 0
misago/emberapp/app/app.js → emberapp/app/app.js


+ 0 - 0
misago/emberapp/app/components/ban-expires.js → emberapp/app/components/ban-expires.js


+ 0 - 0
misago/emberapp/app/components/close-modal-button.js → emberapp/app/components/close-modal-button.js


+ 0 - 0
misago/emberapp/app/components/desync-message.js → emberapp/app/components/desync-message.js


+ 0 - 0
misago/emberapp/app/components/form-row.js → emberapp/app/components/form-row.js


+ 0 - 0
misago/emberapp/app/components/forms/avatar-crop-form.js → emberapp/app/components/forms/avatar-crop-form.js


+ 0 - 0
misago/emberapp/app/components/forms/avatar-gallery-form.js → emberapp/app/components/forms/avatar-gallery-form.js


+ 0 - 0
misago/emberapp/app/components/forms/avatar-upload-form.js → emberapp/app/components/forms/avatar-upload-form.js


+ 0 - 0
misago/emberapp/app/components/forms/change-email-form.js → emberapp/app/components/forms/change-email-form.js


+ 0 - 0
misago/emberapp/app/components/forms/change-password-form.js → emberapp/app/components/forms/change-password-form.js


+ 0 - 0
misago/emberapp/app/components/forms/change-username-form.js → emberapp/app/components/forms/change-username-form.js


+ 0 - 0
misago/emberapp/app/components/forms/edit-signature-form.js → emberapp/app/components/forms/edit-signature-form.js


+ 0 - 0
misago/emberapp/app/components/forms/forum-options-form.js → emberapp/app/components/forms/forum-options-form.js


+ 0 - 0
misago/emberapp/app/components/forms/login-form.js → emberapp/app/components/forms/login-form.js


+ 0 - 0
misago/emberapp/app/components/forms/register-form.js → emberapp/app/components/forms/register-form.js


+ 0 - 0
misago/emberapp/app/components/forms/request-link-form.js → emberapp/app/components/forms/request-link-form.js


+ 0 - 0
misago/emberapp/app/components/forms/select-avatar-type-form.js → emberapp/app/components/forms/select-avatar-type-form.js


+ 0 - 0
misago/emberapp/app/components/forms/set-new-password-form.js → emberapp/app/components/forms/set-new-password-form.js


+ 0 - 0
misago/emberapp/app/components/forms/validated-form.js → emberapp/app/components/forms/validated-form.js


+ 0 - 0
misago/emberapp/app/components/forum-footer.js → emberapp/app/components/forum-footer.js


+ 0 - 0
misago/emberapp/app/components/forum-navbar.js → emberapp/app/components/forum-navbar.js


+ 0 - 0
misago/emberapp/app/components/last-username-changes.js → emberapp/app/components/last-username-changes.js


+ 0 - 0
misago/emberapp/app/components/link-dropdown-toggle.js → emberapp/app/components/link-dropdown-toggle.js


+ 0 - 0
misago/emberapp/app/components/loader-compact.js → emberapp/app/components/loader-compact.js


+ 0 - 0
misago/emberapp/app/components/loading-overlay.js → emberapp/app/components/loading-overlay.js


+ 0 - 0
misago/emberapp/app/components/misago-editor.js → emberapp/app/components/misago-editor.js


+ 0 - 0
misago/emberapp/app/components/misago-markup.js → emberapp/app/components/misago-markup.js


+ 0 - 0
misago/emberapp/app/components/modal-header.js → emberapp/app/components/modal-header.js


+ 0 - 0
misago/emberapp/app/components/modals/change-avatar-modal.js → emberapp/app/components/modals/change-avatar-modal.js


+ 0 - 0
misago/emberapp/app/components/modals/forum-modal.js → emberapp/app/components/modals/forum-modal.js


+ 0 - 0
misago/emberapp/app/components/modals/login-modal.js → emberapp/app/components/modals/login-modal.js


+ 0 - 0
misago/emberapp/app/components/modals/register-closed-modal.js → emberapp/app/components/modals/register-closed-modal.js


+ 0 - 0
misago/emberapp/app/components/modals/register-done-modal.js → emberapp/app/components/modals/register-done-modal.js


+ 0 - 0
misago/emberapp/app/components/modals/register-form-modal.js → emberapp/app/components/modals/register-form-modal.js


+ 0 - 0
misago/emberapp/app/components/navbar-dropdown-toggle.js → emberapp/app/components/navbar-dropdown-toggle.js


+ 0 - 0
misago/emberapp/app/components/navbar-dropdown.js → emberapp/app/components/navbar-dropdown.js


+ 0 - 0
misago/emberapp/app/components/pagination-aligned.js → emberapp/app/components/pagination-aligned.js


+ 0 - 0
misago/emberapp/app/components/qacaptcha-field.js → emberapp/app/components/qacaptcha-field.js


+ 0 - 0
misago/emberapp/app/components/recaptcha-field.js → emberapp/app/components/recaptcha-field.js


+ 0 - 0
misago/emberapp/app/components/refresh-button.js → emberapp/app/components/refresh-button.js


+ 0 - 0
misago/emberapp/app/components/register-button.js → emberapp/app/components/register-button.js


+ 0 - 0
misago/emberapp/app/components/routed-links.js → emberapp/app/components/routed-links.js


+ 0 - 0
misago/emberapp/app/components/show-modal-button.js → emberapp/app/components/show-modal-button.js


+ 0 - 0
misago/emberapp/app/components/toast-message.js → emberapp/app/components/toast-message.js


+ 0 - 0
misago/emberapp/app/components/ui-text-preview.js → emberapp/app/components/ui-text-preview.js


+ 0 - 0
misago/emberapp/app/components/user-avatar.js → emberapp/app/components/user-avatar.js


+ 0 - 0
misago/emberapp/app/components/user-card-ui-preview.js → emberapp/app/components/user-card-ui-preview.js


+ 0 - 0
misago/emberapp/app/components/user-card.js → emberapp/app/components/user-card.js


+ 0 - 0
misago/emberapp/app/components/user-menu.js → emberapp/app/components/user-menu.js


+ 0 - 0
misago/emberapp/app/components/user-state-icon.js → emberapp/app/components/user-state-icon.js


+ 0 - 0
misago/emberapp/app/components/user-state-label.js → emberapp/app/components/user-state-label.js


+ 0 - 0
misago/emberapp/app/components/yes-no-switch.js → emberapp/app/components/yes-no-switch.js


+ 0 - 0
misago/emberapp/app/helpers/batch-row.js → emberapp/app/helpers/batch-row.js


+ 0 - 0
misago/emberapp/app/helpers/file-size.js → emberapp/app/helpers/file-size.js


+ 0 - 0
misago/emberapp/app/helpers/format-date.js → emberapp/app/helpers/format-date.js


+ 0 - 0
misago/emberapp/app/helpers/from-now.js → emberapp/app/helpers/from-now.js


+ 0 - 0
misago/emberapp/app/helpers/join-strings.js → emberapp/app/helpers/join-strings.js


+ 0 - 0
misago/emberapp/app/helpers/rel-date.js → emberapp/app/helpers/rel-date.js


+ 0 - 0
misago/emberapp/app/helpers/x-range.js → emberapp/app/helpers/x-range.js


+ 0 - 0
misago/emberapp/app/index.html → emberapp/app/index.html


+ 0 - 0
misago/emberapp/app/initializers/ace-editor-service.js → emberapp/app/initializers/ace-editor-service.js


+ 0 - 0
misago/emberapp/app/initializers/ajax-service.js → emberapp/app/initializers/ajax-service.js


+ 0 - 0
misago/emberapp/app/initializers/auth-service.js → emberapp/app/initializers/auth-service.js


+ 0 - 0
misago/emberapp/app/initializers/captcha-service.js → emberapp/app/initializers/captcha-service.js


+ 0 - 0
misago/emberapp/app/initializers/clock-service.js → emberapp/app/initializers/clock-service.js


+ 0 - 0
misago/emberapp/app/initializers/components-store.js → emberapp/app/initializers/components-store.js


+ 0 - 0
misago/emberapp/app/initializers/cropit-service.js → emberapp/app/initializers/cropit-service.js


+ 0 - 0
misago/emberapp/app/initializers/csrf-service.js → emberapp/app/initializers/csrf-service.js


+ 0 - 0
misago/emberapp/app/initializers/django-location.js → emberapp/app/initializers/django-location.js


+ 0 - 0
misago/emberapp/app/initializers/local-store.js → emberapp/app/initializers/local-store.js


+ 0 - 0
misago/emberapp/app/initializers/misago-settings.js → emberapp/app/initializers/misago-settings.js


+ 0 - 0
misago/emberapp/app/initializers/modal-service.js → emberapp/app/initializers/modal-service.js


+ 0 - 0
misago/emberapp/app/initializers/moment-locale.js → emberapp/app/initializers/moment-locale.js


+ 0 - 0
misago/emberapp/app/initializers/navbar-dropdown-service.js → emberapp/app/initializers/navbar-dropdown-service.js


+ 0 - 0
misago/emberapp/app/initializers/preload-store.js → emberapp/app/initializers/preload-store.js


+ 0 - 0
misago/emberapp/app/initializers/registration-modal.js → emberapp/app/initializers/registration-modal.js


+ 0 - 0
misago/emberapp/app/initializers/script-loader-service.js → emberapp/app/initializers/script-loader-service.js


+ 0 - 0
misago/emberapp/app/initializers/toast-message-service.js → emberapp/app/initializers/toast-message-service.js


+ 0 - 0
misago/emberapp/app/initializers/zxcvbn-service.js → emberapp/app/initializers/zxcvbn-service.js


+ 0 - 0
misago/emberapp/app/mixins/document-title.js → emberapp/app/mixins/document-title.js


+ 0 - 0
misago/emberapp/app/mixins/exceptions-shortcuts.js → emberapp/app/mixins/exceptions-shortcuts.js


+ 0 - 0
misago/emberapp/app/mixins/modal-component.js → emberapp/app/mixins/modal-component.js


+ 0 - 0
misago/emberapp/app/mixins/model-pagination.js → emberapp/app/mixins/model-pagination.js


+ 0 - 0
misago/emberapp/app/mixins/model-url-name.js → emberapp/app/mixins/model-url-name.js


+ 0 - 0
misago/emberapp/app/mixins/reset-scroll.js → emberapp/app/mixins/reset-scroll.js


+ 0 - 0
misago/emberapp/app/mixins/shared-user-attrs.js → emberapp/app/mixins/shared-user-attrs.js


+ 0 - 0
misago/emberapp/app/mixins/with-url-name.js → emberapp/app/mixins/with-url-name.js


+ 0 - 0
misago/emberapp/app/models/captcha-question.js → emberapp/app/models/captcha-question.js


+ 0 - 0
misago/emberapp/app/models/legal-page.js → emberapp/app/models/legal-page.js


+ 0 - 0
misago/emberapp/app/models/rank.js → emberapp/app/models/rank.js


+ 0 - 0
misago/emberapp/app/models/user-profile.js → emberapp/app/models/user-profile.js


+ 0 - 0
misago/emberapp/app/models/user.js → emberapp/app/models/user.js


+ 0 - 0
misago/emberapp/app/models/username-change.js → emberapp/app/models/username-change.js


+ 0 - 0
misago/emberapp/app/resolver.js → emberapp/app/resolver.js


+ 0 - 0
misago/emberapp/app/router.js → emberapp/app/router.js


+ 0 - 0
misago/emberapp/app/routes/activation.js → emberapp/app/routes/activation.js


+ 0 - 0
misago/emberapp/app/routes/activation/activate.js → emberapp/app/routes/activation/activate.js


+ 0 - 0
misago/emberapp/app/routes/activation/index.js → emberapp/app/routes/activation/index.js


+ 0 - 0
misago/emberapp/app/routes/application.js → emberapp/app/routes/application.js


+ 0 - 0
misago/emberapp/app/routes/error-0.js → emberapp/app/routes/error-0.js


+ 0 - 0
misago/emberapp/app/routes/error-403.js → emberapp/app/routes/error-403.js


+ 0 - 0
misago/emberapp/app/routes/error-404.js → emberapp/app/routes/error-404.js


+ 0 - 0
misago/emberapp/app/routes/error-banned.js → emberapp/app/routes/error-banned.js


+ 0 - 0
misago/emberapp/app/routes/forgotten-password/change-form.js → emberapp/app/routes/forgotten-password/change-form.js


+ 0 - 0
misago/emberapp/app/routes/forgotten-password/index.js → emberapp/app/routes/forgotten-password/index.js


+ 0 - 0
misago/emberapp/app/routes/index.js → emberapp/app/routes/index.js


+ 0 - 0
misago/emberapp/app/routes/misago.js → emberapp/app/routes/misago.js


+ 0 - 0
misago/emberapp/app/routes/not-found.js → emberapp/app/routes/not-found.js


+ 0 - 0
misago/emberapp/app/routes/options.js → emberapp/app/routes/options.js


+ 0 - 0
misago/emberapp/app/routes/options/email/confirm.js → emberapp/app/routes/options/email/confirm.js


+ 0 - 0
misago/emberapp/app/routes/options/email/index.js → emberapp/app/routes/options/email/index.js


+ 0 - 0
misago/emberapp/app/routes/options/forum.js → emberapp/app/routes/options/forum.js


+ 0 - 0
misago/emberapp/app/routes/options/index.js → emberapp/app/routes/options/index.js


+ 0 - 0
misago/emberapp/app/routes/options/password/confirm.js → emberapp/app/routes/options/password/confirm.js


+ 0 - 0
misago/emberapp/app/routes/options/password/index.js → emberapp/app/routes/options/password/index.js


+ 0 - 0
misago/emberapp/app/routes/options/signature.js → emberapp/app/routes/options/signature.js


+ 0 - 0
misago/emberapp/app/routes/options/username.js → emberapp/app/routes/options/username.js


+ 0 - 0
misago/emberapp/app/routes/privacy-policy.js → emberapp/app/routes/privacy-policy.js


+ 0 - 0
misago/emberapp/app/routes/terms-of-service.js → emberapp/app/routes/terms-of-service.js


+ 0 - 0
misago/emberapp/app/routes/user.js → emberapp/app/routes/user.js


+ 0 - 0
misago/emberapp/app/routes/users.js → emberapp/app/routes/users.js


+ 0 - 0
misago/emberapp/app/routes/users/active.js → emberapp/app/routes/users/active.js


+ 0 - 0
misago/emberapp/app/routes/users/index.js → emberapp/app/routes/users/index.js


+ 0 - 0
misago/emberapp/app/routes/users/online/index.js → emberapp/app/routes/users/online/index.js


+ 0 - 0
misago/emberapp/app/routes/users/rank.js → emberapp/app/routes/users/rank.js


+ 0 - 0
misago/emberapp/app/routes/users/rank/index.js → emberapp/app/routes/users/rank/index.js


+ 0 - 0
misago/emberapp/app/routes/users/rank/page.js → emberapp/app/routes/users/rank/page.js


+ 0 - 0
misago/emberapp/app/serializers/application.js → emberapp/app/serializers/application.js


+ 0 - 0
misago/emberapp/app/serializers/username-change.js → emberapp/app/serializers/username-change.js


+ 0 - 0
misago/emberapp/app/services/ace-editor.js → emberapp/app/services/ace-editor.js


+ 0 - 0
misago/emberapp/app/services/ajax.js → emberapp/app/services/ajax.js


+ 0 - 0
misago/emberapp/app/services/auth.js → emberapp/app/services/auth.js


+ 0 - 0
misago/emberapp/app/services/clock.js → emberapp/app/services/clock.js


+ 0 - 0
misago/emberapp/app/services/cropit.js → emberapp/app/services/cropit.js


+ 0 - 0
misago/emberapp/app/services/csrf.js → emberapp/app/services/csrf.js


+ 0 - 0
misago/emberapp/app/services/local-store.js → emberapp/app/services/local-store.js


+ 0 - 0
misago/emberapp/app/services/modal.js → emberapp/app/services/modal.js


+ 0 - 0
misago/emberapp/app/services/navbar-dropdown.js → emberapp/app/services/navbar-dropdown.js


+ 0 - 0
misago/emberapp/app/services/nocaptcha.js → emberapp/app/services/nocaptcha.js


+ 0 - 0
misago/emberapp/app/services/page-title.js → emberapp/app/services/page-title.js


+ 0 - 0
misago/emberapp/app/services/preload-store.js → emberapp/app/services/preload-store.js


+ 0 - 0
misago/emberapp/app/services/qacaptcha.js → emberapp/app/services/qacaptcha.js


+ 0 - 0
misago/emberapp/app/services/recaptcha.js → emberapp/app/services/recaptcha.js


+ 0 - 0
misago/emberapp/app/services/registration-modal.js → emberapp/app/services/registration-modal.js


+ 0 - 0
misago/emberapp/app/services/script-loader.js → emberapp/app/services/script-loader.js


+ 0 - 0
misago/emberapp/app/services/toast-message.js → emberapp/app/services/toast-message.js


+ 0 - 0
misago/emberapp/app/services/zxcvbn.js → emberapp/app/services/zxcvbn.js


+ 0 - 0
misago/emberapp/app/styles/app.less → emberapp/app/styles/app.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap-datetimepicker.less → emberapp/app/styles/bootstrap-datetimepicker.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/.csscomb.json → emberapp/app/styles/bootstrap/.csscomb.json


+ 0 - 0
misago/emberapp/app/styles/bootstrap/.csslintrc → emberapp/app/styles/bootstrap/.csslintrc


+ 0 - 0
misago/emberapp/app/styles/bootstrap/alerts.less → emberapp/app/styles/bootstrap/alerts.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/badges.less → emberapp/app/styles/bootstrap/badges.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/bootstrap.less → emberapp/app/styles/bootstrap/bootstrap.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/breadcrumbs.less → emberapp/app/styles/bootstrap/breadcrumbs.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/button-groups.less → emberapp/app/styles/bootstrap/button-groups.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/buttons.less → emberapp/app/styles/bootstrap/buttons.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/carousel.less → emberapp/app/styles/bootstrap/carousel.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/close.less → emberapp/app/styles/bootstrap/close.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/code.less → emberapp/app/styles/bootstrap/code.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/component-animations.less → emberapp/app/styles/bootstrap/component-animations.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/dropdowns.less → emberapp/app/styles/bootstrap/dropdowns.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/forms.less → emberapp/app/styles/bootstrap/forms.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/glyphicons.less → emberapp/app/styles/bootstrap/glyphicons.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/grid.less → emberapp/app/styles/bootstrap/grid.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/input-groups.less → emberapp/app/styles/bootstrap/input-groups.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/jumbotron.less → emberapp/app/styles/bootstrap/jumbotron.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/labels.less → emberapp/app/styles/bootstrap/labels.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/list-group.less → emberapp/app/styles/bootstrap/list-group.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/media.less → emberapp/app/styles/bootstrap/media.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins.less → emberapp/app/styles/bootstrap/mixins.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/alerts.less → emberapp/app/styles/bootstrap/mixins/alerts.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/background-variant.less → emberapp/app/styles/bootstrap/mixins/background-variant.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/border-radius.less → emberapp/app/styles/bootstrap/mixins/border-radius.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/buttons.less → emberapp/app/styles/bootstrap/mixins/buttons.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/center-block.less → emberapp/app/styles/bootstrap/mixins/center-block.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/clearfix.less → emberapp/app/styles/bootstrap/mixins/clearfix.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/forms.less → emberapp/app/styles/bootstrap/mixins/forms.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/gradients.less → emberapp/app/styles/bootstrap/mixins/gradients.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/grid-framework.less → emberapp/app/styles/bootstrap/mixins/grid-framework.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/grid.less → emberapp/app/styles/bootstrap/mixins/grid.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/hide-text.less → emberapp/app/styles/bootstrap/mixins/hide-text.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/image.less → emberapp/app/styles/bootstrap/mixins/image.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/labels.less → emberapp/app/styles/bootstrap/mixins/labels.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/list-group.less → emberapp/app/styles/bootstrap/mixins/list-group.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/nav-divider.less → emberapp/app/styles/bootstrap/mixins/nav-divider.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/nav-vertical-align.less → emberapp/app/styles/bootstrap/mixins/nav-vertical-align.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/opacity.less → emberapp/app/styles/bootstrap/mixins/opacity.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/pagination.less → emberapp/app/styles/bootstrap/mixins/pagination.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/panels.less → emberapp/app/styles/bootstrap/mixins/panels.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/progress-bar.less → emberapp/app/styles/bootstrap/mixins/progress-bar.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/reset-filter.less → emberapp/app/styles/bootstrap/mixins/reset-filter.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/resize.less → emberapp/app/styles/bootstrap/mixins/resize.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/responsive-visibility.less → emberapp/app/styles/bootstrap/mixins/responsive-visibility.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/size.less → emberapp/app/styles/bootstrap/mixins/size.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/tab-focus.less → emberapp/app/styles/bootstrap/mixins/tab-focus.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/table-row.less → emberapp/app/styles/bootstrap/mixins/table-row.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/text-emphasis.less → emberapp/app/styles/bootstrap/mixins/text-emphasis.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/text-overflow.less → emberapp/app/styles/bootstrap/mixins/text-overflow.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/mixins/vendor-prefixes.less → emberapp/app/styles/bootstrap/mixins/vendor-prefixes.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/modals.less → emberapp/app/styles/bootstrap/modals.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/navbar.less → emberapp/app/styles/bootstrap/navbar.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/navs.less → emberapp/app/styles/bootstrap/navs.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/normalize.less → emberapp/app/styles/bootstrap/normalize.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/pager.less → emberapp/app/styles/bootstrap/pager.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/pagination.less → emberapp/app/styles/bootstrap/pagination.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/panels.less → emberapp/app/styles/bootstrap/panels.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/popovers.less → emberapp/app/styles/bootstrap/popovers.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/print.less → emberapp/app/styles/bootstrap/print.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/progress-bars.less → emberapp/app/styles/bootstrap/progress-bars.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/responsive-embed.less → emberapp/app/styles/bootstrap/responsive-embed.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/responsive-utilities.less → emberapp/app/styles/bootstrap/responsive-utilities.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/scaffolding.less → emberapp/app/styles/bootstrap/scaffolding.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/tables.less → emberapp/app/styles/bootstrap/tables.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/theme.less → emberapp/app/styles/bootstrap/theme.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/thumbnails.less → emberapp/app/styles/bootstrap/thumbnails.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/tooltip.less → emberapp/app/styles/bootstrap/tooltip.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/type.less → emberapp/app/styles/bootstrap/type.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/utilities.less → emberapp/app/styles/bootstrap/utilities.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/variables.less → emberapp/app/styles/bootstrap/variables.less


+ 0 - 0
misago/emberapp/app/styles/bootstrap/wells.less → emberapp/app/styles/bootstrap/wells.less


+ 0 - 0
misago/emberapp/app/styles/flavor/flavor.less → emberapp/app/styles/flavor/flavor.less


+ 0 - 0
misago/emberapp/app/styles/flavor/variables.less → emberapp/app/styles/flavor/variables.less


+ 0 - 0
misago/emberapp/app/styles/misago/buttons.less → emberapp/app/styles/misago/buttons.less


+ 0 - 0
misago/emberapp/app/styles/misago/change-avatar.less → emberapp/app/styles/misago/change-avatar.less


+ 0 - 0
misago/emberapp/app/styles/misago/desync-message.less → emberapp/app/styles/misago/desync-message.less


+ 0 - 0
misago/emberapp/app/styles/misago/dropdowns.less → emberapp/app/styles/misago/dropdowns.less


+ 0 - 0
misago/emberapp/app/styles/misago/editor.less → emberapp/app/styles/misago/editor.less


+ 0 - 0
misago/emberapp/app/styles/misago/errorpages.less → emberapp/app/styles/misago/errorpages.less


+ 0 - 0
misago/emberapp/app/styles/misago/footer.less → emberapp/app/styles/misago/footer.less


+ 0 - 0
misago/emberapp/app/styles/misago/forms.less → emberapp/app/styles/misago/forms.less


+ 0 - 0
misago/emberapp/app/styles/misago/inputs.less → emberapp/app/styles/misago/inputs.less


+ 0 - 0
misago/emberapp/app/styles/misago/list-groups.less → emberapp/app/styles/misago/list-groups.less


+ 0 - 0
misago/emberapp/app/styles/misago/loaders.less → emberapp/app/styles/misago/loaders.less


+ 0 - 0
misago/emberapp/app/styles/misago/material-icons.less → emberapp/app/styles/misago/material-icons.less


+ 0 - 0
misago/emberapp/app/styles/misago/misago.less → emberapp/app/styles/misago/misago.less


+ 0 - 0
misago/emberapp/app/styles/misago/misc.less → emberapp/app/styles/misago/misc.less


+ 0 - 0
misago/emberapp/app/styles/misago/modals.less → emberapp/app/styles/misago/modals.less


+ 0 - 0
misago/emberapp/app/styles/misago/navbar.less → emberapp/app/styles/misago/navbar.less


+ 0 - 0
misago/emberapp/app/styles/misago/navs.less → emberapp/app/styles/misago/navs.less


+ 0 - 0
misago/emberapp/app/styles/misago/page-header.less → emberapp/app/styles/misago/page-header.less


+ 0 - 0
misago/emberapp/app/styles/misago/pagination.less → emberapp/app/styles/misago/pagination.less


+ 0 - 0
misago/emberapp/app/styles/misago/shadows.less → emberapp/app/styles/misago/shadows.less


+ 0 - 0
misago/emberapp/app/styles/misago/tables.less → emberapp/app/styles/misago/tables.less


+ 0 - 0
misago/emberapp/app/styles/misago/toast-message.less → emberapp/app/styles/misago/toast-message.less


+ 0 - 0
misago/emberapp/app/styles/misago/typo.less → emberapp/app/styles/misago/typo.less


+ 0 - 0
misago/emberapp/app/styles/misago/ui-preview.less → emberapp/app/styles/misago/ui-preview.less


+ 0 - 0
misago/emberapp/app/styles/misago/user-card.less → emberapp/app/styles/misago/user-card.less


+ 0 - 0
misago/emberapp/app/styles/misago/user-options.less → emberapp/app/styles/misago/user-options.less


+ 0 - 0
misago/emberapp/app/styles/misago/user-profile.less → emberapp/app/styles/misago/user-profile.less


+ 0 - 0
misago/emberapp/app/styles/misago/user-status.less → emberapp/app/styles/misago/user-status.less


+ 0 - 0
misago/emberapp/app/styles/misago/variables.less → emberapp/app/styles/misago/variables.less


+ 0 - 0
misago/emberapp/app/styles/ranks.less → emberapp/app/styles/ranks.less


+ 0 - 0
misago/emberapp/app/templates/activation/link-sent.hbs → emberapp/app/templates/activation/link-sent.hbs


+ 0 - 0
misago/emberapp/app/templates/activation/loading.hbs → emberapp/app/templates/activation/loading.hbs


+ 0 - 0
misago/emberapp/app/templates/activation/request-link.hbs → emberapp/app/templates/activation/request-link.hbs


+ 0 - 0
misago/emberapp/app/templates/application.hbs → emberapp/app/templates/application.hbs


+ 0 - 0
misago/emberapp/app/templates/components/ban-expires.hbs → emberapp/app/templates/components/ban-expires.hbs


+ 0 - 0
misago/emberapp/app/templates/components/desync-message.hbs → emberapp/app/templates/components/desync-message.hbs


+ 0 - 0
misago/emberapp/app/templates/components/form-row.hbs → emberapp/app/templates/components/form-row.hbs


+ 0 - 0
misago/emberapp/app/templates/components/forms/avatar-crop-form.hbs → emberapp/app/templates/components/forms/avatar-crop-form.hbs


+ 0 - 0
misago/emberapp/app/templates/components/forms/avatar-gallery-form.hbs → emberapp/app/templates/components/forms/avatar-gallery-form.hbs


+ 0 - 0
misago/emberapp/app/templates/components/forms/avatar-upload-form.hbs → emberapp/app/templates/components/forms/avatar-upload-form.hbs


+ 0 - 0
misago/emberapp/app/templates/components/forms/change-email-form.hbs → emberapp/app/templates/components/forms/change-email-form.hbs


+ 0 - 0
misago/emberapp/app/templates/components/forms/change-password-form.hbs → emberapp/app/templates/components/forms/change-password-form.hbs


+ 0 - 0
misago/emberapp/app/templates/components/forms/change-username-form.hbs → emberapp/app/templates/components/forms/change-username-form.hbs


+ 0 - 0
misago/emberapp/app/templates/components/forms/edit-signature-form.hbs → emberapp/app/templates/components/forms/edit-signature-form.hbs


+ 0 - 0
misago/emberapp/app/templates/components/forms/forum-options-form.hbs → emberapp/app/templates/components/forms/forum-options-form.hbs


+ 0 - 0
misago/emberapp/app/templates/components/forms/login-form.hbs → emberapp/app/templates/components/forms/login-form.hbs


+ 0 - 0
misago/emberapp/app/templates/components/forms/register-form.hbs → emberapp/app/templates/components/forms/register-form.hbs


+ 0 - 0
misago/emberapp/app/templates/components/forms/request-link-form.hbs → emberapp/app/templates/components/forms/request-link-form.hbs


+ 0 - 0
misago/emberapp/app/templates/components/forms/select-avatar-type-form.hbs → emberapp/app/templates/components/forms/select-avatar-type-form.hbs


+ 0 - 0
misago/emberapp/app/templates/components/forms/set-new-password-form.hbs → emberapp/app/templates/components/forms/set-new-password-form.hbs


+ 0 - 0
misago/emberapp/app/templates/components/forum-footer.hbs → emberapp/app/templates/components/forum-footer.hbs


+ 0 - 0
misago/emberapp/app/templates/components/forum-navbar.hbs → emberapp/app/templates/components/forum-navbar.hbs


+ 0 - 0
misago/emberapp/app/templates/components/last-username-changes.hbs → emberapp/app/templates/components/last-username-changes.hbs


+ 0 - 0
misago/emberapp/app/templates/components/loader-compact.hbs → emberapp/app/templates/components/loader-compact.hbs


+ 0 - 0
misago/emberapp/app/templates/components/loading-overlay.hbs → emberapp/app/templates/components/loading-overlay.hbs


+ 0 - 0
misago/emberapp/app/templates/components/misago-editor.hbs → emberapp/app/templates/components/misago-editor.hbs


+ 0 - 0
misago/emberapp/app/templates/components/modal-header.hbs → emberapp/app/templates/components/modal-header.hbs


+ 0 - 0
misago/emberapp/app/templates/components/modals/change-avatar-modal.hbs → emberapp/app/templates/components/modals/change-avatar-modal.hbs


+ 0 - 0
misago/emberapp/app/templates/components/modals/empty-modal.hbs → emberapp/app/templates/components/modals/empty-modal.hbs


+ 0 - 0
misago/emberapp/app/templates/components/modals/forum-modal.hbs → emberapp/app/templates/components/modals/forum-modal.hbs


+ 0 - 0
misago/emberapp/app/templates/components/modals/login-modal.hbs → emberapp/app/templates/components/modals/login-modal.hbs


+ 0 - 0
misago/emberapp/app/templates/components/modals/register-closed-modal.hbs → emberapp/app/templates/components/modals/register-closed-modal.hbs


+ 0 - 0
misago/emberapp/app/templates/components/modals/register-done-modal.hbs → emberapp/app/templates/components/modals/register-done-modal.hbs


+ 0 - 0
misago/emberapp/app/templates/components/modals/register-form-modal.hbs → emberapp/app/templates/components/modals/register-form-modal.hbs


+ 0 - 0
misago/emberapp/app/templates/components/navbar-dropdown.hbs → emberapp/app/templates/components/navbar-dropdown.hbs


+ 0 - 0
misago/emberapp/app/templates/components/pagination-aligned.hbs → emberapp/app/templates/components/pagination-aligned.hbs


+ 0 - 0
misago/emberapp/app/templates/components/qacaptcha-field.hbs → emberapp/app/templates/components/qacaptcha-field.hbs


+ 0 - 0
misago/emberapp/app/templates/components/recaptcha-field.hbs → emberapp/app/templates/components/recaptcha-field.hbs


+ 0 - 0
misago/emberapp/app/templates/components/toast-message.hbs → emberapp/app/templates/components/toast-message.hbs


+ 0 - 0
misago/emberapp/app/templates/components/user-card-ui-preview.hbs → emberapp/app/templates/components/user-card-ui-preview.hbs


+ 0 - 0
misago/emberapp/app/templates/components/user-card.hbs → emberapp/app/templates/components/user-card.hbs


+ 0 - 0
misago/emberapp/app/templates/components/user-menu.hbs → emberapp/app/templates/components/user-menu.hbs


+ 0 - 0
misago/emberapp/app/templates/components/user-state-icon.hbs → emberapp/app/templates/components/user-state-icon.hbs


+ 0 - 0
misago/emberapp/app/templates/components/user-state-label.hbs → emberapp/app/templates/components/user-state-label.hbs


+ 0 - 0
misago/emberapp/app/templates/components/yes-no-switch.hbs → emberapp/app/templates/components/yes-no-switch.hbs


+ 0 - 0
misago/emberapp/app/templates/error-0.hbs → emberapp/app/templates/error-0.hbs


+ 0 - 0
misago/emberapp/app/templates/error-403.hbs → emberapp/app/templates/error-403.hbs


+ 0 - 0
misago/emberapp/app/templates/error-404.hbs → emberapp/app/templates/error-404.hbs


+ 0 - 0
misago/emberapp/app/templates/error-banned.hbs → emberapp/app/templates/error-banned.hbs


+ 0 - 0
misago/emberapp/app/templates/error.hbs → emberapp/app/templates/error.hbs


+ 0 - 0
misago/emberapp/app/templates/forgotten-password/change-form.hbs → emberapp/app/templates/forgotten-password/change-form.hbs


+ 0 - 0
misago/emberapp/app/templates/forgotten-password/link-sent.hbs → emberapp/app/templates/forgotten-password/link-sent.hbs


+ 0 - 0
misago/emberapp/app/templates/forgotten-password/request-link.hbs → emberapp/app/templates/forgotten-password/request-link.hbs


+ 0 - 0
misago/emberapp/app/templates/index.hbs → emberapp/app/templates/index.hbs


+ 0 - 0
misago/emberapp/app/templates/loading.hbs → emberapp/app/templates/loading.hbs


+ 0 - 0
misago/emberapp/app/templates/misago.hbs → emberapp/app/templates/misago.hbs


+ 0 - 0
misago/emberapp/app/templates/options.hbs → emberapp/app/templates/options.hbs


+ 0 - 0
misago/emberapp/app/templates/options/email/index.hbs → emberapp/app/templates/options/email/index.hbs


+ 0 - 0
misago/emberapp/app/templates/options/email/loading.hbs → emberapp/app/templates/options/email/loading.hbs


+ 0 - 0
misago/emberapp/app/templates/options/forum.hbs → emberapp/app/templates/options/forum.hbs


+ 0 - 0
misago/emberapp/app/templates/options/password/index.hbs → emberapp/app/templates/options/password/index.hbs


+ 0 - 0
misago/emberapp/app/templates/options/password/loading.hbs → emberapp/app/templates/options/password/loading.hbs


+ 0 - 0
misago/emberapp/app/templates/options/signature.hbs → emberapp/app/templates/options/signature.hbs


+ 0 - 0
misago/emberapp/app/templates/options/username.hbs → emberapp/app/templates/options/username.hbs


+ 0 - 0
misago/emberapp/app/templates/privacy-policy.hbs → emberapp/app/templates/privacy-policy.hbs


+ 0 - 0
misago/emberapp/app/templates/terms-of-service.hbs → emberapp/app/templates/terms-of-service.hbs


+ 0 - 0
misago/emberapp/app/templates/user.hbs → emberapp/app/templates/user.hbs


+ 0 - 0
misago/emberapp/app/templates/users.hbs → emberapp/app/templates/users.hbs


+ 0 - 0
misago/emberapp/app/templates/users/active.hbs → emberapp/app/templates/users/active.hbs


+ 0 - 0
misago/emberapp/app/templates/users/online/index.hbs → emberapp/app/templates/users/online/index.hbs


+ 0 - 0
misago/emberapp/app/templates/users/online/loading.hbs → emberapp/app/templates/users/online/loading.hbs


+ 0 - 0
misago/emberapp/app/templates/users/rank.hbs → emberapp/app/templates/users/rank.hbs


+ 0 - 0
misago/emberapp/app/templates/users/rank/index.hbs → emberapp/app/templates/users/rank/index.hbs


+ 0 - 0
misago/emberapp/app/templates/users/rank/loading.hbs → emberapp/app/templates/users/rank/loading.hbs


+ 0 - 0
misago/emberapp/app/transforms/ember-object.js → emberapp/app/transforms/ember-object.js


+ 0 - 0
misago/emberapp/app/transforms/moment-date.js → emberapp/app/transforms/moment-date.js


+ 0 - 0
misago/emberapp/app/utils/strings.js → emberapp/app/utils/strings.js


+ 0 - 0
misago/emberapp/bower.json → emberapp/bower.json


+ 0 - 0
misago/emberapp/buildprod → emberapp/buildprod


+ 0 - 0
misago/emberapp/config/environment.js → emberapp/config/environment.js


+ 0 - 0
misago/emberapp/package.json → emberapp/package.json


+ 0 - 0
misago/emberapp/public/crossdomain.xml → emberapp/public/crossdomain.xml


+ 0 - 0
misago/emberapp/public/misago/fonts/MaterialIcons-Regular.eot → emberapp/public/misago/fonts/MaterialIcons-Regular.eot


+ 0 - 0
misago/emberapp/public/misago/fonts/MaterialIcons-Regular.ttf → emberapp/public/misago/fonts/MaterialIcons-Regular.ttf


+ 0 - 0
misago/emberapp/public/misago/fonts/MaterialIcons-Regular.woff → emberapp/public/misago/fonts/MaterialIcons-Regular.woff


+ 0 - 0
misago/emberapp/public/misago/fonts/MaterialIcons-Regular.woff2 → emberapp/public/misago/fonts/MaterialIcons-Regular.woff2


+ 0 - 0
misago/emberapp/public/misago/fonts/README.md → emberapp/public/misago/fonts/README.md


+ 0 - 0
misago/emberapp/public/misago/fonts/codepoints → emberapp/public/misago/fonts/codepoints


+ 0 - 0
misago/emberapp/public/misago/img/site-icon.png → emberapp/public/misago/img/site-icon.png


+ 0 - 0
misago/emberapp/public/misago/img/site-logo.png → emberapp/public/misago/img/site-logo.png


+ 0 - 0
misago/emberapp/public/misago/js/ace.js → emberapp/public/misago/js/ace.js


+ 0 - 0
misago/emberapp/public/misago/js/cropit.js → emberapp/public/misago/js/cropit.js


+ 0 - 0
misago/emberapp/public/misago/js/zxcvbn.js → emberapp/public/misago/js/zxcvbn.js


+ 0 - 0
misago/emberapp/public/robots.txt → emberapp/public/robots.txt


+ 0 - 0
misago/emberapp/testem.json → emberapp/testem.json


+ 0 - 0
misago/emberapp/tests/.jshintrc → emberapp/tests/.jshintrc


+ 0 - 0
misago/emberapp/tests/acceptance/activate-test.js → emberapp/tests/acceptance/activate-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/ajax-service-test.js → emberapp/tests/acceptance/ajax-service-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/auth-deny-test.js → emberapp/tests/acceptance/auth-deny-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/auth-service-test.js → emberapp/tests/acceptance/auth-service-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/change-avatar-test.js → emberapp/tests/acceptance/change-avatar-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/change-email-test.js → emberapp/tests/acceptance/change-email-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/change-password-test.js → emberapp/tests/acceptance/change-password-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/change-username-test.js → emberapp/tests/acceptance/change-username-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/cropit-service-test.js → emberapp/tests/acceptance/cropit-service-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/csrf-service-test.js → emberapp/tests/acceptance/csrf-service-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/document-title-mixin-test.js → emberapp/tests/acceptance/document-title-mixin-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/edit-signature-test.js → emberapp/tests/acceptance/edit-signature-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/error-test.js → emberapp/tests/acceptance/error-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/error-toast-test.js → emberapp/tests/acceptance/error-toast-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/forgotten-password-test.js → emberapp/tests/acceptance/forgotten-password-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/forum-options-test.js → emberapp/tests/acceptance/forum-options-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/index-test.js → emberapp/tests/acceptance/index-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/local-store-test.js → emberapp/tests/acceptance/local-store-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/login-test.js → emberapp/tests/acceptance/login-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/model-pagination-test.js → emberapp/tests/acceptance/model-pagination-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/model-url-name-mixin-test.js → emberapp/tests/acceptance/model-url-name-mixin-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/privacy-policy-test.js → emberapp/tests/acceptance/privacy-policy-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/registration-test.js → emberapp/tests/acceptance/registration-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/routed-links-test.js → emberapp/tests/acceptance/routed-links-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/terms-of-service-test.js → emberapp/tests/acceptance/terms-of-service-test.js


+ 0 - 0
misago/emberapp/tests/acceptance/zxcvbn-service-test.js → emberapp/tests/acceptance/zxcvbn-service-test.js


+ 0 - 0
misago/emberapp/tests/helpers/api-mocks.js → emberapp/tests/helpers/api-mocks.js


+ 0 - 0
misago/emberapp/tests/helpers/create-user.js → emberapp/tests/helpers/create-user.js


+ 0 - 0
misago/emberapp/tests/helpers/destroy-modal.js → emberapp/tests/helpers/destroy-modal.js


+ 0 - 0
misago/emberapp/tests/helpers/resolver.js → emberapp/tests/helpers/resolver.js


+ 0 - 0
misago/emberapp/tests/helpers/start-app.js → emberapp/tests/helpers/start-app.js


+ 0 - 0
misago/emberapp/tests/helpers/toast-message.js → emberapp/tests/helpers/toast-message.js


+ 0 - 0
misago/emberapp/tests/index.html → emberapp/tests/index.html


+ 0 - 0
misago/emberapp/tests/test-helper.js → emberapp/tests/test-helper.js


+ 0 - 0
misago/emberapp/tests/unit/.gitkeep → emberapp/tests/unit/.gitkeep


+ 0 - 0
misago/emberapp/tests/unit/components/ban-expires-test.js → emberapp/tests/unit/components/ban-expires-test.js


+ 0 - 0
misago/emberapp/tests/unit/components/forum-footer-test.js → emberapp/tests/unit/components/forum-footer-test.js


+ 0 - 0
misago/emberapp/tests/unit/components/routed-links-test.js → emberapp/tests/unit/components/routed-links-test.js


+ 0 - 0
misago/emberapp/tests/unit/helpers/batch-row-test.js → emberapp/tests/unit/helpers/batch-row-test.js


+ 0 - 0
misago/emberapp/tests/unit/helpers/from-now-test.js → emberapp/tests/unit/helpers/from-now-test.js


+ 0 - 0
misago/emberapp/tests/unit/initializers/django-location-test.js → emberapp/tests/unit/initializers/django-location-test.js


+ 0 - 0
misago/emberapp/tests/unit/initializers/misago-settings-test.js → emberapp/tests/unit/initializers/misago-settings-test.js


+ 0 - 0
misago/emberapp/tests/unit/initializers/moment-locale-test.js → emberapp/tests/unit/initializers/moment-locale-test.js


+ 0 - 0
misago/emberapp/tests/unit/mixins/document-title-test.js → emberapp/tests/unit/mixins/document-title-test.js


+ 0 - 0
misago/emberapp/tests/unit/mixins/reset-scroll-test.js → emberapp/tests/unit/mixins/reset-scroll-test.js


+ 0 - 0
misago/emberapp/tests/unit/models/legal-page-test.js → emberapp/tests/unit/models/legal-page-test.js


+ 0 - 0
misago/emberapp/tests/unit/routes/application-test.js → emberapp/tests/unit/routes/application-test.js


+ 0 - 0
misago/emberapp/tests/unit/routes/forgotten-password/index-test.js → emberapp/tests/unit/routes/forgotten-password/index-test.js


+ 0 - 0
misago/emberapp/tests/unit/routes/index-test.js → emberapp/tests/unit/routes/index-test.js


+ 0 - 0
misago/emberapp/tests/unit/routes/misago-test.js → emberapp/tests/unit/routes/misago-test.js


+ 0 - 0
misago/emberapp/tests/unit/routes/not-found-test.js → emberapp/tests/unit/routes/not-found-test.js


+ 0 - 0
misago/emberapp/tests/unit/routes/privacy-policy-test.js → emberapp/tests/unit/routes/privacy-policy-test.js


+ 0 - 0
misago/emberapp/tests/unit/routes/terms-of-service-test.js → emberapp/tests/unit/routes/terms-of-service-test.js


+ 0 - 0
misago/emberapp/tests/unit/services/clock-test.js → emberapp/tests/unit/services/clock-test.js


+ 0 - 0
misago/emberapp/tests/unit/services/preload-store-test.js → emberapp/tests/unit/services/preload-store-test.js


+ 0 - 0
misago/emberapp/tests/unit/services/toast-message-test.js → emberapp/tests/unit/services/toast-message-test.js


+ 0 - 0
misago/emberapp/tests/unit/transforms/moment-date-test.js → emberapp/tests/unit/transforms/moment-date-test.js


+ 0 - 0
misago/emberapp/tests/unit/utils/api-mocks-test.js → emberapp/tests/unit/utils/api-mocks-test.js


+ 0 - 0
misago/emberapp/tests/unit/utils/strings-test.js → emberapp/tests/unit/utils/strings-test.js


+ 0 - 0
misago/emberapp/vendor/.gitkeep → emberapp/vendor/.gitkeep


+ 0 - 0
misago/emberapp/vendor/bootstrap/.jscsrc → emberapp/vendor/bootstrap/.jscsrc


+ 0 - 0
misago/emberapp/vendor/bootstrap/.jshintrc → emberapp/vendor/bootstrap/.jshintrc


+ 0 - 0
misago/emberapp/vendor/bootstrap/affix.js → emberapp/vendor/bootstrap/affix.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/alert.js → emberapp/vendor/bootstrap/alert.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/button.js → emberapp/vendor/bootstrap/button.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/carousel.js → emberapp/vendor/bootstrap/carousel.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/collapse.js → emberapp/vendor/bootstrap/collapse.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/dropdown.js → emberapp/vendor/bootstrap/dropdown.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/modal.js → emberapp/vendor/bootstrap/modal.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/popover.js → emberapp/vendor/bootstrap/popover.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/scrollspy.js → emberapp/vendor/bootstrap/scrollspy.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tab.js → emberapp/vendor/bootstrap/tab.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/README.md → emberapp/vendor/bootstrap/tests/README.md


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/index.html → emberapp/vendor/bootstrap/tests/index.html


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/unit/.jshintrc → emberapp/vendor/bootstrap/tests/unit/.jshintrc


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/unit/affix.js → emberapp/vendor/bootstrap/tests/unit/affix.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/unit/alert.js → emberapp/vendor/bootstrap/tests/unit/alert.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/unit/button.js → emberapp/vendor/bootstrap/tests/unit/button.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/unit/carousel.js → emberapp/vendor/bootstrap/tests/unit/carousel.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/unit/collapse.js → emberapp/vendor/bootstrap/tests/unit/collapse.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/unit/dropdown.js → emberapp/vendor/bootstrap/tests/unit/dropdown.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/unit/modal.js → emberapp/vendor/bootstrap/tests/unit/modal.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/unit/phantom.js → emberapp/vendor/bootstrap/tests/unit/phantom.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/unit/popover.js → emberapp/vendor/bootstrap/tests/unit/popover.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/unit/scrollspy.js → emberapp/vendor/bootstrap/tests/unit/scrollspy.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/unit/tab.js → emberapp/vendor/bootstrap/tests/unit/tab.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/unit/tooltip.js → emberapp/vendor/bootstrap/tests/unit/tooltip.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/vendor/jquery.min.js → emberapp/vendor/bootstrap/tests/vendor/jquery.min.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/vendor/qunit.css → emberapp/vendor/bootstrap/tests/vendor/qunit.css


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/vendor/qunit.js → emberapp/vendor/bootstrap/tests/vendor/qunit.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/visual/affix.html → emberapp/vendor/bootstrap/tests/visual/affix.html


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/visual/alert.html → emberapp/vendor/bootstrap/tests/visual/alert.html


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/visual/button.html → emberapp/vendor/bootstrap/tests/visual/button.html


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/visual/carousel.html → emberapp/vendor/bootstrap/tests/visual/carousel.html


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/visual/collapse.html → emberapp/vendor/bootstrap/tests/visual/collapse.html


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/visual/dropdown.html → emberapp/vendor/bootstrap/tests/visual/dropdown.html


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/visual/modal.html → emberapp/vendor/bootstrap/tests/visual/modal.html


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/visual/popover.html → emberapp/vendor/bootstrap/tests/visual/popover.html


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/visual/scrollspy.html → emberapp/vendor/bootstrap/tests/visual/scrollspy.html


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/visual/tab.html → emberapp/vendor/bootstrap/tests/visual/tab.html


+ 0 - 0
misago/emberapp/vendor/bootstrap/tests/visual/tooltip.html → emberapp/vendor/bootstrap/tests/visual/tooltip.html


+ 0 - 0
misago/emberapp/vendor/bootstrap/tooltip.js → emberapp/vendor/bootstrap/tooltip.js


+ 0 - 0
misago/emberapp/vendor/bootstrap/transition.js → emberapp/vendor/bootstrap/transition.js


+ 0 - 0
misago/emberapp/vendor/testutils/.gitkeep → emberapp/vendor/testutils/.gitkeep


+ 0 - 0
misago/emberapp/vendor/testutils/django-js-catalog.js → emberapp/vendor/testutils/django-js-catalog.js


+ 0 - 0
misago/emberapp/vendor/testutils/jquery.mockjax.js → emberapp/vendor/testutils/jquery.mockjax.js


+ 0 - 0
misago/emberapp/vendor/testutils/misago-preload-data.js → emberapp/vendor/testutils/misago-preload-data.js


+ 1 - 1
misago/conf/context_processors.py

@@ -27,7 +27,7 @@ def preload_settings_json(request):
         'LOGOUT_URL': reverse(dj_settings.LOGOUT_URL),
     })
 
-    request.preloaded_ember_data.update({
+    request.frontend_context.update({
         'SETTINGS': preloaded_settings,
 
         'STATIC_URL': dj_settings.STATIC_URL,

+ 4 - 4
misago/conf/defaults.py

@@ -120,7 +120,7 @@ MIDDLEWARE_CLASSES = (
     'misago.core.middleware.embercliredirects.EmberCLIRedirectsMiddleware',
     'misago.users.middleware.AvatarServerMiddleware',
     'misago.users.middleware.RealIPMiddleware',
-    'misago.core.middleware.preloademberdata.PreloadEmberDataMiddleware',
+    'misago.core.middleware.frontendcontext.FrontendContextMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
@@ -150,9 +150,9 @@ TEMPLATE_CONTEXT_PROCESSORS = (
     # Data preloaders
     'misago.conf.context_processors.preload_settings_json',
     'misago.users.context_processors.preload_user_json',
-    # Note: keep preloaded_ember_data processor last for previous processors
-    # to be able to add data to request.preloaded_ember_data
-    'misago.core.context_processors.preloaded_ember_data',
+    # Note: keep frontend_context processor last for previous processors
+    # to be able to add data to request.frontend_context
+    'misago.core.context_processors.frontend_context',
 )
 
 MISAGO_ACL_EXTENSIONS = (

+ 3 - 4
misago/conf/tests/test_context_processors.py

@@ -23,7 +23,6 @@ class ContextProcessorsTests(TestCase):
 
     def test_preload_settings(self):
         """site configuration is preloaded by middleware"""
-        with self.settings(_MISAGO_JS_DEBUG=True):
-            response = self.client.get('/misago-preload-data.js')
-            self.assertEqual(response.status_code, 200)
-            self.assertIn('misagoSettings', response.content)
+        response = self.client.get('/')
+        self.assertEqual(response.status_code, 200)
+        self.assertIn("'SETTINGS':{", response.content)

+ 3 - 9
misago/core/context_processors.py

@@ -1,6 +1,3 @@
-from misago.core.embercli import is_ember_cli_request, get_embercli_host
-
-
 def site_address(request):
     if request.is_secure():
         site_protocol = 'https'
@@ -9,10 +6,7 @@ def site_address(request):
         site_protocol = 'http'
         address_template = 'http://%s'
 
-    if is_ember_cli_request(request):
-        host = get_embercli_host()
-    else:
-        host = request.get_host()
+    host = request.get_host()
 
     return {
         'SITE_PROTOCOL': site_protocol,
@@ -21,5 +15,5 @@ def site_address(request):
     }
 
 
-def preloaded_ember_data(request):
-    return {'preloaded_ember_data': request.preloaded_ember_data}
+def frontend_context(request):
+    return {'frontend_context': request.frontend_context}

+ 0 - 18
misago/core/embercli.py

@@ -1,18 +0,0 @@
-from django.conf import settings
-from django.utils.six.moves.urllib.parse import urlparse
-
-
-def is_ember_cli_request(request):
-    if settings.DEBUG and settings.MISAGO_EMBER_CLI_ORIGIN:
-        http_origin = request.META.get('HTTP_ORIGIN', '')
-        return http_origin.startswith(settings.MISAGO_EMBER_CLI_ORIGIN)
-    else:
-        return False
-
-
-def get_embercli_host():
-    if settings.MISAGO_EMBER_CLI_ORIGIN:
-        parsed_url = urlparse(settings.MISAGO_EMBER_CLI_ORIGIN)
-        return '%s:%s' % (parsed_url.hostname, parsed_url.port)
-    else:
-        return None

+ 0 - 29
misago/core/middleware/embercliredirects.py

@@ -1,29 +0,0 @@
-from django.conf import settings
-from misago.core.embercli import is_ember_cli_request
-
-
-class EmberCLIRedirectsMiddleware(object):
-    """
-    Utility middleware for development
-
-    Redirects returned by Django point to dev server's port,
-    thus pulling us out from Ember's dev server.
-
-    This middleware detects requests coming from Ember and makes redirects
-    point back to it instead.
-
-    This middleware works only in DEBUG and requires browser to send Origin
-    header that matches one in MISAGO_EMBER_CLI_ORIGIN setting.
-    """
-    def process_response(self, request, response):
-        if (is_ember_cli_request(request) and
-                response.status_code in (301, 302)):
-            return self.rewrite_http_redirect_url(response)
-
-        return response
-
-
-    def rewrite_http_redirect_url(self, response):
-        final_location = settings.MISAGO_EMBER_CLI_ORIGIN, response['location']
-        response['location'] = ''.join(final_location)
-        return response

+ 3 - 0
misago/core/middleware/frontendcontext.py

@@ -0,0 +1,3 @@
+class FrontendContextMiddleware(object):
+    def process_request(self, request):
+        request.frontend_context = {}

+ 0 - 3
misago/core/middleware/preloademberdata.py

@@ -1,3 +0,0 @@
-class PreloadEmberDataMiddleware(object):
-    def process_request(self, request):
-        request.preloaded_ember_data = {}

+ 6 - 6
misago/core/tests/test_context_processors.py

@@ -38,12 +38,12 @@ class SiteAddressTests(TestCase):
             })
 
 
-class PreloadedDataTests(TestCase):
-    def test_preloaded_ember_data(self):
-        """preloaded_ember_data is available in templates"""
+class FrontendContextTests(TestCase):
+    def test_frontend_context(self):
+        """frontend_context is available in templates"""
         mock_request = MockRequest(False, 'somewhere.com')
-        mock_request.preloaded_ember_data = {'someValue': 'Something'}
+        mock_request.frontend_context = {'someValue': 'Something'}
 
         self.assertEqual(
-            context_processors.preloaded_ember_data(mock_request),
-            {'preloaded_ember_data': {'someValue': 'Something'}})
+            context_processors.frontend_context(mock_request),
+            {'frontend_context': {'someValue': 'Something'}})

+ 0 - 43
misago/core/tests/test_embercli.py

@@ -1,43 +0,0 @@
-from django.conf import settings
-from django.test import TestCase
-
-from misago.core.embercli import is_ember_cli_request, get_embercli_host
-
-
-class MockRequest(object):
-    def __init__(self, origin):
-        self.META = {'HTTP_ORIGIN': origin}
-
-
-class EmberCLITests(TestCase):
-    def test_is_ember_cli_request(self):
-        """is_ember_cli_request test works"""
-        with self.settings(DEBUG=True):
-            valid_request = MockRequest(settings.MISAGO_EMBER_CLI_ORIGIN)
-            self.assertTrue(is_ember_cli_request(valid_request))
-
-            valid_origin = '%s/page.html' % settings.MISAGO_EMBER_CLI_ORIGIN
-            valid_request = MockRequest(valid_origin)
-            self.assertTrue(is_ember_cli_request(valid_request))
-
-            invalid_request = MockRequest('http://somewhere.com/page.html')
-            self.assertFalse(is_ember_cli_request(invalid_request))
-
-        with self.settings(DEBUG=False):
-            valid_request = MockRequest(settings.MISAGO_EMBER_CLI_ORIGIN)
-            self.assertFalse(is_ember_cli_request(valid_request))
-
-            valid_origin = '%s/page.html' % settings.MISAGO_EMBER_CLI_ORIGIN
-            valid_request = MockRequest(valid_origin)
-            self.assertFalse(is_ember_cli_request(valid_request))
-
-            invalid_request = MockRequest('http://somewhere.com/page.html')
-            self.assertFalse(is_ember_cli_request(invalid_request))
-
-    def test_get_embercli_host(self):
-        """get_embercli_host returns ember-cli host"""
-        with self.settings(MISAGO_EMBER_CLI_ORIGIN='http://somewhere:1234'):
-            self.assertEqual(get_embercli_host(), 'somewhere:1234')
-
-        with self.settings(MISAGO_EMBER_CLI_ORIGIN=''):
-            self.assertIsNone(get_embercli_host())

+ 0 - 60
misago/core/tests/test_embercliredirects_middleware.py

@@ -1,60 +0,0 @@
-from django.conf import settings
-from django.test import TestCase
-
-from misago.core.middleware.embercliredirects import (
-    EmberCLIRedirectsMiddleware)
-
-
-class MockRequest(object):
-    def __init__(self, origin):
-        self.META = {'HTTP_ORIGIN': origin}
-
-
-class MockResponse(object):
-    def __init__(self, location, code=301):
-        self.status_code = code
-        self._dict = {'location': location}
-
-    def __setitem__(self, key, item):
-        self._dict[key] = item
-
-    def __getitem__(self, key):
-        return self._dict[key]
-
-
-class EmberCLIRedirectsMiddlewareTests(TestCase):
-    def test_process_response_rewrites_redirect(self):
-        """process_response rewrites redirect"""
-        middleware = EmberCLIRedirectsMiddleware()
-
-        request = MockRequest(settings.MISAGO_EMBER_CLI_ORIGIN)
-
-        url = '/thread/bob-boberson-rules-1/'
-        response = MockResponse(url, 301)
-
-        with self.settings(DEBUG=True):
-            response = MockResponse(url, 301)
-
-            middleware.process_response(request, response)
-            self.assertTrue(response['location'].startswith(
-                settings.MISAGO_EMBER_CLI_ORIGIN))
-            self.assertTrue(response['location'].endswith(url))
-
-        with self.settings(DEBUG=False):
-            response = MockResponse(url, 301)
-
-            middleware.process_response(request, response)
-            self.assertFalse(response['location'].startswith(
-                settings.MISAGO_EMBER_CLI_ORIGIN))
-            self.assertTrue(response['location'].endswith(url))
-
-    def rewrite_http_redirect_url(self):
-        """rewrite_http_redirect_url prepents CLI host to URL"""
-        middleware = EmberCLIRedirectsMiddleware()
-
-        url = '/thread/bob-boberson-rules-1/'
-        rewrited_url = middleware.rewrite_http_redirect_url(url)
-
-        self.assertTrue(rewrited_url.startswith(
-            settings.MISAGO_EMBER_CLI_ORIGIN))
-        self.assertTrue(rewrited_url.endswith(url))

+ 15 - 0
misago/core/tests/test_frontendcontext_middleware.py

@@ -0,0 +1,15 @@
+from django.test import TestCase
+from misago.core.middleware.frontendcontext import FrontendContextMiddleware
+
+
+class MockRequest(object):
+    pass
+
+
+class FrontendContextMiddlewareTests(TestCase):
+    def test_middleware_frontend_context_dict(self):
+        """Middleware sets frontend_context dict on request"""
+        request = MockRequest()
+
+        FrontendContextMiddleware().process_request(request)
+        self.assertEqual(request.frontend_context, {})

+ 0 - 15
misago/core/tests/test_preloademberdata_middleware.py

@@ -1,15 +0,0 @@
-from django.test import TestCase
-from misago.core.middleware.preloademberdata import PreloadEmberDataMiddleware
-
-
-class MockRequest(object):
-    pass
-
-
-class PreloadEmberDataMiddlewareTests(TestCase):
-    def test_middleware_sets_preloaded_dict(self):
-        """Middleware sets preloaded_ember_data dict on request"""
-        request = MockRequest()
-
-        PreloadEmberDataMiddleware().process_request(request)
-        self.assertEqual(request.preloaded_ember_data, {})

+ 0 - 9
misago/core/views.py

@@ -39,15 +39,6 @@ def momentjs_catalog(request):
                         content_type='application/javascript; charset=utf-8')
 
 
-@never_cache
-def preload_data(request):
-    if not (settings.DEBUG or settings._MISAGO_JS_DEBUG):
-        raise Http404()
-
-    return render(request, 'misago/preloaded_data.js',
-                  content_type='application/javascript; charset=utf-8')
-
-
 def noscript(request, title=None, message=None):
     return render(request, 'misago/noscript.html', {
         'title': title,

+ 2 - 2
misago/frontend/misago/app.js

@@ -8,8 +8,8 @@
     var ns = Object.getPrototypeOf(this);
     var self = this;
 
-    // Preloaded data
-    this.preloaded_data = {
+    // Context data
+    this.context = {
       // Empty settings
       SETTINGS: {}
     };

+ 8 - 3
misago/frontend/misago/components/legal.js

@@ -7,8 +7,14 @@
     var self = {
       is_destroyed: true,
       controller: function() {
+        var _ = self.container;
         self.is_destroyed = false;
-        self.vm.init();
+
+        if (ns.get(_.settings, type_name + '_link')) {
+          window.location = ns.get(_.settings, type_name + '_link');
+        } else {
+          self.vm.init(_);
+        }
 
         return {
           onunload: function() {
@@ -21,8 +27,7 @@
         is_ready: false,
         content: null,
 
-        init: function() {
-          var _ = self.container;
+        init: function(_) {
 
           var vm = this;
           if (vm.is_ready) {

+ 1 - 1
misago/frontend/misago/services/api.js

@@ -3,7 +3,7 @@
 
   var Api = function(_) {
     // Ajax implementation
-    var cookie_regex = new RegExp(_.preloaded_data.CSRF_COOKIE_NAME + '\=([^;]*)');
+    var cookie_regex = new RegExp(_.context.CSRF_COOKIE_NAME + '\=([^;]*)');
     this.csrf_token = ns.get(document.cookie.match(cookie_regex), 0).split('=')[1];
 
     this.ajax = function(method, url, data, progress) {

+ 1 - 1
misago/frontend/misago/services/conf.js

@@ -2,6 +2,6 @@
   'use strict';
 
   ns.Conf = function(_) {
-    _.settings = ns.get(_.preloaded_data, 'SETTINGS', {});
+    _.settings = ns.get(_.context, 'SETTINGS', {});
   };
 }(Misago.prototype));

+ 2 - 2
misago/frontend/misago/services/router.js

@@ -5,8 +5,8 @@
     var self = this;
     this.base_url = $('base').attr('href');
 
-    this.static_url = ns.get(_.preloaded_data, 'STATIC_URL', '/');
-    this.media_url = ns.get(_.preloaded_data, 'MEDIA_URL', '/');
+    this.static_url = ns.get(_.context, 'STATIC_URL', '/');
+    this.media_url = ns.get(_.context, 'MEDIA_URL', '/');
 
     // Routing
     this.urls = {};

+ 2 - 2
misago/frontend/test/tests/unit/conf.js

@@ -1,8 +1,8 @@
 (function (ns) {
   'use strict';
 
-  var MockContainer = function(preloaded_data) {
-    this.preloaded_data = preloaded_data;
+  var MockContainer = function(context) {
+    this.context = context;
   };
 
   QUnit.module("Conf service");

+ 2 - 2
misago/frontend/test/tests/unit/router.js

@@ -5,7 +5,7 @@
 
   QUnit.test("cleanUrl cleans url's that should be routed", function(assert) {
     var container = {
-      preloaded_data: {
+      context: {
         'STATIC_URL': '/static/',
         'MEDIA_URL': 'http://nocookie.somewhere.com/'
       }
@@ -40,7 +40,7 @@
 
   QUnit.test("staticUrl and mediaUrl prefix paths", function(assert) {
     var container = {
-      preloaded_data: {
+      context: {
         'STATIC_URL': '/static/',
         'MEDIA_URL': 'http://nocookie.somewhere.com/'
       }

+ 9 - 6
misago/legal/views.py

@@ -1,5 +1,6 @@
 from hashlib import md5
 
+from django.core.urlresolvers import reverse
 from django.http import Http404
 from django.shortcuts import redirect, render
 from django.utils.translation import gettext as _
@@ -42,6 +43,7 @@ def terms_of_service(request, return_dict=False):
 
     parsed_content = get_parsed_content(request, 'terms_of_service')
     response_dict = {
+        'id': 'terms-of-service',
         'title': settings.terms_of_service_title or _("Terms of service"),
         'link': settings.terms_of_service_link,
         'body': parsed_content,
@@ -50,8 +52,9 @@ def terms_of_service(request, return_dict=False):
     if return_dict:
         return response_dict
     else:
-        response_dict['id'] = 'terms-of-service'
-        request.preloaded_ember_data['terms-of-service'] = response_dict
+        api_url = reverse('misago:api:legal_page',
+                          kwargs={'page': response_dict['id']})
+        request.frontend_context[api_url] = response_dict
         return render(request, 'misago/terms_of_service.html', response_dict)
 
 
@@ -64,6 +67,7 @@ def privacy_policy(request, return_dict=False):
 
     parsed_content = get_parsed_content(request, 'privacy_policy')
     response_dict = {
+        'id': 'privacy-policy',
         'title': settings.privacy_policy_title or _("Privacy policy"),
         'link': settings.privacy_policy_link,
         'body': parsed_content,
@@ -72,8 +76,9 @@ def privacy_policy(request, return_dict=False):
     if return_dict:
         return response_dict
     else:
-        response_dict['id'] = 'privacy-policy'
-        request.preloaded_ember_data['privacy-policy'] = response_dict
+        api_url = reverse('misago:api:legal_page',
+                          kwargs={'page': response_dict['id']})
+        request.frontend_context[api_url] = response_dict
         return render(request, 'misago/privacy_policy.html', response_dict)
 
 
@@ -89,6 +94,4 @@ def legal_page(request, page):
         raise Http404()
 
     page_dict = API_PAGES.get(page)(request, True)
-    page_dict['id'] = page
-
     return Response(page_dict)

+ 0 - 3
misago/project_template/project_name/urls.py

@@ -14,9 +14,6 @@ urlpatterns = patterns('',
     url(r'^django-i18n.js$', 'misago.core.views.javascript_catalog'),
     url(r'^moment-i18n.js$', 'misago.core.views.momentjs_catalog'),
 
-    # In-dev preload data for Ember-CLI
-    url(r'^misago-preload-data.js$', 'misago.core.views.preload_data'),
-
     # Uncomment next line if you plan to use Django admin for 3rd party apps
     #url(r'^django-admin/', include(admin.site.urls)),
 

+ 35 - 23
misago/static/misago/js/misago.js

@@ -8,8 +8,8 @@
     var ns = Object.getPrototypeOf(this);
     var self = this;
 
-    // Preloaded data
-    this.preloaded_data = {
+    // Context data
+    this.context = {
       // Empty settings
       SETTINGS: {}
     };
@@ -54,6 +54,7 @@
 
     this.registerCoreServices = function() {
       this.addService('conf', ns.Conf);
+      this.addService('component', ns.ComponentFactory);
       this.addService('router', ns.RouterFactory);
       this.addService('api', ns.Api);
       this.addService('outlet', ns.Outlet);
@@ -61,17 +62,6 @@
       this.addService('start-routing', ns.startRouting);
     };
 
-    // Component factory
-    this.component = function() {
-      var arguments_array = [];
-      for (var i = 0; i < arguments.length; i += 1) {
-        arguments_array.push(arguments[i]);
-      }
-
-      arguments_array.push(this);
-      return m.component.apply(undefined, arguments_array);
-    };
-
     // App init/destory
     this.setup = false;
     this.init = function(setup) {
@@ -136,8 +126,14 @@
     var self = {
       is_destroyed: true,
       controller: function() {
+        var _ = self.container;
         self.is_destroyed = false;
-        self.vm.init();
+
+        if (ns.get(_.settings, type_name + '_link')) {
+          window.location = ns.get(_.settings, type_name + '_link');
+        } else {
+          self.vm.init(_);
+        }
 
         return {
           onunload: function() {
@@ -150,8 +146,7 @@
         is_ready: false,
         content: null,
 
-        init: function() {
-          var _ = self.container;
+        init: function(_) {
 
           var vm = this;
           if (vm.is_ready) {
@@ -378,7 +373,7 @@
 
   var Api = function(_) {
     // Ajax implementation
-    var cookie_regex = new RegExp(_.preloaded_data.CSRF_COOKIE_NAME + '\=([^;]*)');
+    var cookie_regex = new RegExp(_.context.CSRF_COOKIE_NAME + '\=([^;]*)');
     this.csrf_token = ns.get(document.cookie.match(cookie_regex), 0).split('=')[1];
 
     this.ajax = function(method, url, data, progress) {
@@ -441,7 +436,7 @@
 
     };
 
-    this.call = function(model, call, target, data) {
+    this.call = function(model, target, call, data) {
 
     };
   };
@@ -454,8 +449,25 @@
 (function (ns) {
   'use strict';
 
+  ns.ComponentFactory = function(_) {
+    // Component factory
+    _.component = function() {
+      var arguments_array = [];
+      for (var i = 0; i < arguments.length; i += 1) {
+        arguments_array.push(arguments[i]);
+      }
+
+      arguments_array.push(_);
+      return m.component.apply(undefined, arguments_array);
+    };
+  };
+}(Misago.prototype));
+
+(function (ns) {
+  'use strict';
+
   ns.Conf = function(_) {
-    _.settings = ns.get(_.preloaded_data, 'SETTINGS', {});
+    _.settings = ns.get(_.context, 'SETTINGS', {});
   };
 }(Misago.prototype));
 
@@ -485,8 +497,8 @@
     var self = this;
     this.base_url = $('base').attr('href');
 
-    this.static_url = ns.get(_.preloaded_data, 'STATIC_URL', '/');
-    this.media_url = ns.get(_.preloaded_data, 'MEDIA_URL', '/');
+    this.static_url = ns.get(_.context, 'STATIC_URL', '/');
+    this.media_url = ns.get(_.context, 'MEDIA_URL', '/');
 
     // Routing
     this.urls = {};
@@ -584,8 +596,8 @@
       };
     };
 
-    this.staticUrl = prefixUrl(ns.get(_.preloaded_data, 'STATIC_URL', '/'));
-    this.mediaUrl = prefixUrl(ns.get(_.preloaded_data, 'MEDIA_URL', '/'));
+    this.staticUrl = prefixUrl(this.static_url);
+    this.mediaUrl = prefixUrl(this.media_url);
   };
 
   ns.RouterFactory = function(_) {

+ 1 - 1
misago/static/misago/js/misago.js.map

@@ -1 +1 @@
-{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","preloaded_data","SETTINGS","_services","addService","name","factory","order","push","item","after","get","before","_initServices","services","ordered_services","OrderedList","forEach","undefined","service_instance","_destroyServices","reverse","destroy","registerCoreServices","Conf","RouterFactory","Outlet","startRouting","component","arguments_array","i","arguments","length","m","apply","setup","init","fixture","in_test","persistent","el","isInit","context","retain","ForumLayout","view","ctrl","_","ForumNavbar","config","ForumFooter","prototype","IndexPage","legalPageFactory","type_name","default_title","controller","console","log","vm","container","loadingPage","TermsOfServicePage","gettext","PrivacyPolicyPage","Loader","setupMarkup","MisagoMarkup","content","trust","PageHeader","options","title","legalLink","legal_type","url","settings","router","href","FooterNav","isVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","indexOf","items","nav","FooterMisagoBranding","BrandFull","branding","children","src","staticUrl","alt","forum_name","desktop_navbar","forum_branding_display","forum_branding_text","route","mount","document","getElementById","Router","base_url","$","attr","urls","reverses","populatePatterns","urlconf","patterns","final_pattern","pattern","replace","mode","delegate_element","delegate_name","isSiteUrl","delegateClicks","element","on","e","target","siteUrl","preventDefault","off","prefixUrl","prefix","mediaUrl","has","obj","key","hasOwnProperty","value","pop","returnValue","is_ordered","_items","add","values","values_only","_order","unordered","insertItem","insertAt","ordering","ordered","splice","index","iterations","startsWith","string","beginning","endsWith","tail","UrlConfInvalidComponentError","message","UrlConf","_patterns","prefixPattern","include"],"mappings":"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","file":"misago.js","sourcesContent":["/* global -Misago */\n/* exported Misago */\n(function () {\n  'use strict';\n\n  window.Misago = function() {\n\n    var ns = Object.getPrototypeOf(this);\n    var self = this;\n\n    // Preloaded data\n    this.preloaded_data = {\n      // Empty settings\n      SETTINGS: {}\n    };\n\n    // Services\n    this._services = [];\n    this.addService = function(name, factory, order) {\n      this._services.push({\n        name: name,\n        item: factory,\n        after: this.get(order, 'after'),\n        before: this.get(order, 'before')\n      });\n    };\n\n    this._initServices = function(services) {\n      var ordered_services = new ns.OrderedList(services).order(false);\n      ordered_services.forEach(function (item) {\n        var factory = null;\n        if (item.item.factory !== undefined) {\n          factory = item.item.factory;\n        } else {\n          factory = item.item;\n        }\n\n        var service_instance = factory(self);\n        if (service_instance) {\n          self[item.name] = service_instance;\n        }\n      });\n    };\n\n    this._destroyServices = function(services) {\n      var ordered_services = new ns.OrderedList(services).order();\n      ordered_services.reverse();\n      ordered_services.forEach(function (item) {\n        if (item.destroy !== undefined) {\n          item.destroy(self);\n        }\n      });\n    };\n\n    this.registerCoreServices = function() {\n      this.addService('conf', ns.Conf);\n      this.addService('router', ns.RouterFactory);\n      this.addService('outlet', ns.Outlet);\n      this.addService('start-routing', ns.startRouting);\n    };\n\n    // Component factory\n    this.component = function() {\n      var arguments_array = [];\n      for (var i = 0; i < arguments.length; i += 1) {\n        arguments_array.push(arguments[i]);\n      }\n\n      arguments_array.push(this);\n      return m.component.apply(undefined, arguments_array);\n    };\n\n    // App init/destory\n    this.setup = false;\n    this.init = function(setup) {\n      this.setup = {\n        fixture: ns.get(setup, 'fixture', null),\n        in_test: ns.get(setup, 'in_test', false)\n      };\n\n      this._initServices(this._services);\n    };\n\n    this.destroy = function() {\n      this._destroyServices();\n    };\n  };\n}());\n\n\n(function (ns) {\n  'use strict';\n\n  var persistent = function(el, isInit, context) {\n    context.retain = true;\n  };\n\n  ns.ForumLayout = {\n    view: function(ctrl, _) {\n      return [\n        _.component(ns.ForumNavbar),\n        m('#router-fixture', {config: persistent}),\n        _.component(ns.ForumFooter)\n      ];\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.IndexPage = {\n    view: function() {\n      return [\n        m('h1', 'Forum index page!'),\n        m('p', 'Lorem ipsum dolor met sit amet elit.'),\n        m('p', 'Sequar elit dolor nihi putto.')\n      ];\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var legalPageFactory = function(type_name, default_title) {\n    return {\n      controller: function() {\n        console.log('controller!');\n      },\n      vm: function() {\n\n      },\n      view: function() {\n        var _ = this.container;\n\n        if (true) {\n          return ns.loadingPage(_);\n        } else {\n          return m('.page.page-legal.page-legal-' + type_name.replace('_', '-'), [\n            _.component(ns.PageHeader, {title: ns.get(_.settings, type_name + '_title', default_title)}),\n            m('p', 'Si pacem sequar elit bellum nihi equit.')\n          ]);\n        }\n      }\n    };\n  };\n\n  ns.TermsOfServicePage = legalPageFactory(\n    'terms_of_service', gettext('Terms of service'));\n  ns.PrivacyPolicyPage = legalPageFactory(\n    'privacy_policy', gettext('Privacy policy'));\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.Loader = {\n    view: function() {\n      return m('.loader.sk-folding-cube', [\n        m('.sk-cube1.sk-cube'),\n        m('.sk-cube2.sk-cube'),\n        m('.sk-cube4.sk-cube'),\n        m('.sk-cube3.sk-cube')\n      ]);\n    }\n  };\n} (Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var setupMarkup = function(el, isInit, context) {\n    context.retain = true;\n  };\n\n  ns.MisagoMarkup = {\n    view: function(ctrl, content) {\n      return m('article.misago-markup', {config: setupMarkup}, m.trust(content));\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.PageHeader = {\n    view: function(ctrl, options) {\n      return m('.page-header',\n        m('.container', [\n          m('h1', options.title),\n        ])\n      );\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var legalLink = function(_, legal_type, default_title) {\n    var url = ns.get(_.settings, legal_type + '_link');\n    if (!url && ns.get(_.settings, legal_type)) {\n      url = _.router.url(legal_type);\n    }\n\n    if (url) {\n      return m('li',\n        m('a', {href: url}, ns.get(_.settings, legal_type + '_title', default_title))\n      );\n    } else {\n      return null;\n    }\n  };\n\n  ns.FooterNav = {\n    isVisible: function(settings) {\n      return [\n        !!settings.forum_footnote,\n        !!settings.terms_of_service,\n        !!settings.terms_of_service_link,\n        !!settings.privacy_policy,\n        !!settings.privacy_policy_link\n      ].indexOf(true) !== -1;\n    },\n    view: function(ctrl, _) {\n      var items = [];\n\n      if (_.settings.forum_footnote) {\n        items.push(m('li.forum-footnote', m.trust(_.settings.forum_footnote)));\n      }\n\n      items.push(legalLink(_, 'terms_of_service', gettext('Terms of service')));\n      items.push(legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n      return m('ul.list-inline.footer-nav', items);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.ForumFooter = {\n    view: function(ctrl, _) {\n      var nav = null;\n      if (ns.FooterNav.isVisible(_.settings)) {\n        nav = _.component(ns.FooterNav);\n      }\n\n      return m('footer.forum-footer', [\n        m('.container',\n          m('.footer-content', [\n            nav,\n            _.component(ns.FooterMisagoBranding)\n          ])\n        )\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.FooterMisagoBranding = {\n    view: function() {\n      return m('a.misago-branding[href=http://misago-project.org]', [\n        \"powered by \", m('strong', \"misago\")\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.BrandFull = {\n    view: function(ctrl, branding, _) {\n      var children = [\n        m('img', {\n          src: _.router.staticUrl('misago/img/site-logo.png'),\n          alt: _.settings.forum_name\n        })\n      ];\n\n      if (branding) {\n        children.push(branding);\n      }\n\n      return m('a.navbar-brand', {href: _.router.url('index')}, children);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.ForumNavbar = {\n    view: function(ctrl, _) {\n      var desktop_navbar = [];\n\n      if (_.settings.forum_branding_display) {\n        desktop_navbar.push(_.component(ns.BrandFull, _.settings.forum_branding_text));\n      }\n\n      desktop_navbar.push(m('ul.nav.navbar-nav', [\n        m('li', m(\"a\", {config: m.route, href: _.router.url('index')}, 'Index')),\n        m('li', m(\"a\", {config: m.route, href: _.router.url('test')}, 'Test'))\n      ]));\n\n      return m('nav.navbar.navbar-default.navbar-static-top[role=\"navigation\"]', [\n        m('.container.navbar-full.hidden-xs.hidden-sm', desktop_navbar)\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.Conf = function(_) {\n    _.settings = ns.get(_.preloaded_data, 'SETTINGS', {});\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.Outlet = {\n    factory: function(_) {\n      if (_.setup.fixture) {\n        m.mount(document.getElementById(_.setup.fixture),\n                _.component(ns.ForumLayout));\n      }\n    },\n\n    destroy: function(_) {\n      if (_.setup.fixture) {\n        m.mount(_.setup.fixture, null);\n      }\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var Router = function(_) {\n    var self = this;\n    this.base_url = $('base').attr('href');\n\n    // Routing\n    this.urls = {};\n    this.reverses = {};\n\n    var populatePatterns = function(urlconf) {\n      urlconf.patterns().forEach(function(url) {\n        // set service container on component\n        url.component.container = _;\n\n        var final_pattern = self.base_url + url.pattern;\n        final_pattern = final_pattern.replace('//', '/');\n\n        self.urls[final_pattern] = url.component;\n        self.reverses[url.name] = final_pattern;\n      });\n    };\n\n    this.startRouting = function(urlconf, fixture) {\n      populatePatterns(urlconf);\n\n      m.route.mode = 'pathname';\n      m.route(fixture, '/', this.urls);\n    };\n\n    this.url = function(name) {\n      return this.reverses[name];\n    };\n\n    // Delegate clicks\n    this.delegate_element = null;\n    this.delegate_name = 'click.misago-router';\n\n    this.isSiteUrl = function(url) {\n      return false;\n    };\n\n    this.delegateClicks = function(element) {\n      this.delegate_element = element;\n      $(this.delegate_element).on(this.delegate_name, 'a', function(e) {\n        var url = e.target.href;\n        if (siteUrl(url)) {\n          m.route(url);\n          e.preventDefault();\n        }\n      });\n    };\n\n    this.destroy = function() {\n      $(this.delegate_element).off(this.delegate_name);\n    };\n\n    // Media/Static url\n    var prefixUrl = function(prefix) {\n      return function(url) {\n        return prefix + url;\n      };\n    };\n\n    this.staticUrl = prefixUrl(_.get(_.preloaded_data, 'STATIC_URL', '/'));\n    this.mediaUrl = prefixUrl(_.get(_.preloaded_data, 'MEDIA_URL', '/'));\n  };\n\n  ns.RouterFactory = function(_) {\n    return new Router(_);\n  };\n\n  ns.startRouting = function(_) {\n    _.router.startRouting(ns.urls, document.getElementById('router-fixture'));\n    _.router.delegateClicks(document.getElementById(_.setup.fixture));\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.has = function(obj, key) {\n    if (obj !== undefined) {\n      return obj.hasOwnProperty(key);\n    } else {\n      return false;\n    }\n  };\n\n  ns.get = function(obj, key, value) {\n    if (ns.has(obj, key)) {\n      return obj[key];\n    } else if (value !== undefined) {\n      return value;\n    } else {\n      return undefined;\n    }\n  };\n\n  ns.pop = function(obj, key, value) {\n    var returnValue = ns.get(obj, key, value);\n    if (ns.has(obj, key)) {\n      delete obj[key];\n    }\n    return returnValue;\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.OrderedList = function(items) {\n    this.is_ordered = false;\n    this._items = items || [];\n\n    this.add = function(key, item, order) {\n      this._items.push({\n        key: key,\n        item: item,\n        after: ns.get(order, 'after'),\n        before: ns.get(order, 'before')\n      });\n    };\n\n    this.get = function(key, value) {\n      for (var i = 0; i < this._items.length; i++) {\n        if (this._items[i].key === key) {\n          return this._items[i].item;\n        }\n      }\n\n      return value;\n    };\n\n    this.has = function(key) {\n      return this.get(key) !== undefined;\n    };\n\n    this.values = function() {\n      var values = [];\n      for (var i = 0; i < this._items.length; i++) {\n        values.push(this._items[i].item);\n      }\n      return values;\n    };\n\n    this.order = function(values_only) {\n      if (!this.is_ordered) {\n        this._items = this._order(this._items);\n        this.is_ordered = true;\n      }\n\n      if (values_only || typeof values_only === 'undefined') {\n        return this.values();\n      } else {\n        return this._items;\n      }\n    };\n\n    this._order = function(unordered) {\n      // Index of unordered items\n      var index = [];\n      unordered.forEach(function (item) {\n        index.push(item.key);\n      });\n\n      // Ordered items\n      var ordered = [];\n      var ordering = [];\n\n      // First pass: register items that\n      // don't specify their order\n      unordered.forEach(function (item) {\n        if (!item.after && !item.before) {\n          ordered.push(item);\n          ordering.push(item.key);\n        }\n      });\n\n      // Second pass: keep iterating items\n      // until we hit iterations limit or finish\n      // ordering list\n      function insertItem(item) {\n        var insertAt = -1;\n        if (ordering.indexOf(item.key) === -1) {\n          if (item.after) {\n            insertAt = ordering.indexOf(item.after);\n            if (insertAt !== -1) {\n              insertAt += 1;\n            }\n          } else if (item.before) {\n            insertAt = ordering.indexOf(item.before);\n          }\n\n          if (insertAt !== -1) {\n            ordered.splice(insertAt, 0, item);\n            ordering.splice(insertAt, 0, item.key);\n          }\n        }\n      }\n\n      var iterations = 200;\n      while (iterations > 0 && index.length !== ordering.length) {\n        iterations -= 1;\n        unordered.forEach(insertItem);\n      }\n\n      return ordered;\n    };\n  };\n} (Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.startsWith = function(string, beginning) {\n    return string.indexOf(beginning) === 0;\n  };\n\n  ns.endsWith = function(string, tail) {\n    return string.indexOf(tail, string.length - tail.length) !== -1;\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.UrlConfInvalidComponentError = function() {\n    this.message = 'component argument should be array or object';\n  };\n\n  ns.UrlConf = function() {\n    var self = this;\n    this._patterns = [];\n\n    this.patterns = function() {\n      return this._patterns;\n    };\n\n    var prefixPattern = function(prefix, pattern) {\n      return (prefix + pattern).replace('//', '/');\n    };\n\n    var include = function(prefix, patterns) {\n      for (var i = 0; i < patterns.length; i ++) {\n        self.url(prefixPattern(prefix, patterns[i].pattern),\n                 patterns[i].component,\n                 patterns[i].name);\n      }\n    };\n\n    this.url = function(pattern, component, name) {\n      if (typeof component !== 'object') {\n        throw new ns.UrlConfInvalidComponentError();\n      }\n\n      if (pattern === '') {\n        pattern = '/';\n      }\n\n      if (component instanceof ns.UrlConf) {\n        include(pattern, component.patterns());\n      } else {\n        this._patterns.push({\n          pattern: pattern,\n          component: component,\n          name: name\n        });\n      }\n    };\n  };\n} (Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.loadingPage = function(_) {\n    return m('.page.page-loading', _.component(ns.Loader));\n  };\n} (Misago.prototype));\n\n(function (ns, UrlConf) {\n  'use strict';\n\n  var urls = new UrlConf();\n  urls.url('/', ns.IndexPage, 'index');\n\n  // Legal pages\n  urls.url('/terms-of-service/', ns.TermsOfServicePage, 'terms_of_service');\n  urls.url('/privacy-policy/', ns.PrivacyPolicyPage, 'privacy_policy');\n\n  ns.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}
+{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","preloaded_data","SETTINGS","_services","addService","name","factory","order","push","item","after","get","before","_initServices","services","ordered_services","OrderedList","forEach","undefined","service_instance","_destroyServices","reverse","destroy","registerCoreServices","Conf","ComponentFactory","RouterFactory","Api","Outlet","PageTitle","startRouting","setup","init","fixture","in_test","persistent","el","isInit","context","retain","ForumLayout","view","ctrl","_","component","ForumNavbar","m","config","ForumFooter","prototype","controller","container","setTitle","settings","forum_index_title","IndexPage","legalPageFactory","type_name","default_title","dashed_type_name","replace","is_destroyed","location","vm","onunload","is_busy","is_ready","content","title","api","one","then","data","body","redraw","PageHeader","trust","LoadingPage","TermsOfServicePage","gettext","PrivacyPolicyPage","Loader","setupMarkup","MisagoMarkup","options","legalLink","legal_type","url","router","href","FooterNav","isVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","indexOf","items","nav","FooterMisagoBranding","BrandFull","branding","children","src","staticUrl","alt","forum_name","desktop_navbar","forum_branding_display","forum_branding_text","route","cookie_regex","RegExp","CSRF_COOKIE_NAME","csrf_token","document","cookie","match","split","ajax","method","progress","deferred","ajax_settings","headers","X-CSRFToken","dataType","success","resolve","error","jqXHR","reject","$","promise","pop","post","buildUrl","model","call","querystrings","base_url","id","many","filters","target","arguments_array","i","arguments","length","apply","mount","getElementById","Router","attr","static_url","media_url","urls","reverses","populatePatterns","urlconf","patterns","final_pattern","pattern","mode","delegate_element","delegate_name","cleanUrl","is_relative","substr","protocol","host","avatars_url","delegateClicks","element","on","e","clean_url","preventDefault","off","prefixUrl","prefix","mediaUrl","_setTitle","complete_title","page","interpolate","parent","has","obj","key","hasOwnProperty","value","returnValue","is_ordered","_items","add","values","values_only","_order","unordered","insertItem","insertAt","ordering","ordered","splice","index","iterations","startsWith","string","beginning","endsWith","tail","UrlConfInvalidComponentError","message","UrlConf","_patterns","prefixPattern","include","loadingPage"],"mappings":"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","file":"misago.js","sourcesContent":["/* global -Misago */\n/* exported Misago */\n(function () {\n  'use strict';\n\n  window.Misago = function() {\n\n    var ns = Object.getPrototypeOf(this);\n    var self = this;\n\n    // Preloaded data\n    this.preloaded_data = {\n      // Empty settings\n      SETTINGS: {}\n    };\n\n    // Services\n    this._services = [];\n    this.addService = function(name, factory, order) {\n      this._services.push({\n        name: name,\n        item: factory,\n        after: this.get(order, 'after'),\n        before: this.get(order, 'before')\n      });\n    };\n\n    this._initServices = function(services) {\n      var ordered_services = new ns.OrderedList(services).order(false);\n      ordered_services.forEach(function (item) {\n        var factory = null;\n        if (item.item.factory !== undefined) {\n          factory = item.item.factory;\n        } else {\n          factory = item.item;\n        }\n\n        var service_instance = factory(self);\n        if (service_instance) {\n          self[item.name] = service_instance;\n        }\n      });\n    };\n\n    this._destroyServices = function(services) {\n      var ordered_services = new ns.OrderedList(services).order();\n      ordered_services.reverse();\n      ordered_services.forEach(function (item) {\n        if (item.destroy !== undefined) {\n          item.destroy(self);\n        }\n      });\n    };\n\n    this.registerCoreServices = function() {\n      this.addService('conf', ns.Conf);\n      this.addService('component', ns.ComponentFactory);\n      this.addService('router', ns.RouterFactory);\n      this.addService('api', ns.Api);\n      this.addService('outlet', ns.Outlet);\n      this.addService('title', ns.PageTitle);\n      this.addService('start-routing', ns.startRouting);\n    };\n\n    // App init/destory\n    this.setup = false;\n    this.init = function(setup) {\n      this.setup = {\n        fixture: ns.get(setup, 'fixture', null),\n        in_test: ns.get(setup, 'in_test', false)\n      };\n\n      this._initServices(this._services);\n    };\n\n    this.destroy = function() {\n      this._destroyServices();\n    };\n  };\n}());\n\n\n(function (ns) {\n  'use strict';\n\n  var persistent = function(el, isInit, context) {\n    context.retain = true;\n  };\n\n  ns.ForumLayout = {\n    view: function(ctrl, _) {\n      return [\n        _.component(ns.ForumNavbar),\n        m('#router-fixture', {config: persistent}),\n        _.component(ns.ForumFooter)\n      ];\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var self = {\n    controller: function() {\n      var _ = self.container;\n      _.setTitle(_.settings.forum_index_title);\n    },\n    view: function() {\n      return m('.container', [\n        m('h1', 'Forum index page!'),\n        m('p', 'Lorem ipsum dolor met sit amet elit.'),\n        m('p', 'Sequar elit dolor nihi putto.')\n      ]);\n    }\n  };\n  ns.IndexPage = self;\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var legalPageFactory = function(type_name, default_title) {\n    var dashed_type_name = type_name.replace(/_/g, '-');\n\n    var self = {\n      is_destroyed: true,\n      controller: function() {\n        var _ = self.container;\n        self.is_destroyed = false;\n\n        if (ns.get(_.settings, type_name + '_link')) {\n          window.location = ns.get(_.settings, type_name + '_link');\n        } else {\n          self.vm.init(_);\n        }\n\n        return {\n          onunload: function() {\n            self.is_destroyed = true;\n          }\n        };\n      },\n      vm: {\n        is_busy: false,\n        is_ready: false,\n        content: null,\n\n        init: function(_) {\n\n          var vm = this;\n          if (vm.is_ready) {\n            _.setTitle(vm.title);\n          } else {\n            _.setTitle();\n\n            if (!vm.is_busy) {\n              vm.is_busy = true;\n\n              _.api.one('legal-pages', dashed_type_name).then(function(data) {\n                vm.title = data.title || default_title;\n                vm.body = data.body;\n                vm.is_busy = false;\n                vm.is_ready = true;\n\n                if (!self.is_destroyed) {\n                  _.setTitle(vm.title);\n                  m.redraw();\n                }\n              });\n            }\n          }\n        }\n      },\n      view: function() {\n        var _ = this.container;\n\n        if (this.vm.is_ready) {\n          return m('.page.page-legal.page-legal-' + dashed_type_name, [\n            _.component(ns.PageHeader, {title: this.vm.title}),\n            m('.container',\n              m.trust(this.vm.body)\n            )\n          ]);\n        } else {\n          return _.component(ns.LoadingPage);\n        }\n      }\n    };\n    return self;\n  };\n\n  ns.TermsOfServicePage = legalPageFactory(\n    'terms_of_service', gettext('Terms of service'));\n  ns.PrivacyPolicyPage = legalPageFactory(\n    'privacy_policy', gettext('Privacy policy'));\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.Loader = {\n    view: function() {\n      return m('.loader.sk-folding-cube', [\n        m('.sk-cube1.sk-cube'),\n        m('.sk-cube2.sk-cube'),\n        m('.sk-cube4.sk-cube'),\n        m('.sk-cube3.sk-cube')\n      ]);\n    }\n  };\n\n  ns.LoadingPage = {\n    view: function(ctrl, _) {\n      return m('.page.page-loading',\n        _.component(ns.Loader)\n      );\n    }\n  };\n} (Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var setupMarkup = function(el, isInit, context) {\n    context.retain = true;\n  };\n\n  ns.MisagoMarkup = {\n    view: function(ctrl, content) {\n      return m('article.misago-markup', {config: setupMarkup}, m.trust(content));\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.PageHeader = {\n    view: function(ctrl, options) {\n      return m('.page-header',\n        m('.container', [\n          m('h1', options.title),\n        ])\n      );\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var legalLink = function(_, legal_type, default_title) {\n    var url = ns.get(_.settings, legal_type + '_link');\n    if (!url && ns.get(_.settings, legal_type)) {\n      url = _.router.url(legal_type);\n    }\n\n    if (url) {\n      return m('li',\n        m('a', {href: url}, ns.get(_.settings, legal_type + '_title', default_title))\n      );\n    } else {\n      return null;\n    }\n  };\n\n  ns.FooterNav = {\n    isVisible: function(settings) {\n      return [\n        !!settings.forum_footnote,\n        !!settings.terms_of_service,\n        !!settings.terms_of_service_link,\n        !!settings.privacy_policy,\n        !!settings.privacy_policy_link\n      ].indexOf(true) !== -1;\n    },\n    view: function(ctrl, _) {\n      var items = [];\n\n      if (_.settings.forum_footnote) {\n        items.push(m('li.forum-footnote', m.trust(_.settings.forum_footnote)));\n      }\n\n      items.push(legalLink(_, 'terms_of_service', gettext('Terms of service')));\n      items.push(legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n      return m('ul.list-inline.footer-nav', items);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.ForumFooter = {\n    view: function(ctrl, _) {\n      var nav = null;\n      if (ns.FooterNav.isVisible(_.settings)) {\n        nav = _.component(ns.FooterNav);\n      }\n\n      return m('footer.forum-footer', [\n        m('.container',\n          m('.footer-content', [\n            nav,\n            _.component(ns.FooterMisagoBranding)\n          ])\n        )\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.FooterMisagoBranding = {\n    view: function() {\n      return m('a.misago-branding[href=http://misago-project.org]', [\n        \"powered by \", m('strong', \"misago\")\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.BrandFull = {\n    view: function(ctrl, branding, _) {\n      var children = [\n        m('img', {\n          src: _.router.staticUrl('misago/img/site-logo.png'),\n          alt: _.settings.forum_name\n        })\n      ];\n\n      if (branding) {\n        children.push(branding);\n      }\n\n      return m('a.navbar-brand', {href: _.router.url('index')}, children);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.ForumNavbar = {\n    view: function(ctrl, _) {\n      var desktop_navbar = [];\n\n      if (_.settings.forum_branding_display) {\n        desktop_navbar.push(_.component(ns.BrandFull, _.settings.forum_branding_text));\n      }\n\n      desktop_navbar.push(m('ul.nav.navbar-nav', [\n        m('li', m(\"a\", {config: m.route, href: _.router.url('index')}, 'Index')),\n        m('li', m(\"a\", {config: m.route, href: _.router.url('test')}, 'Test'))\n      ]));\n\n      return m('nav.navbar.navbar-default.navbar-static-top[role=\"navigation\"]', [\n        m('.container.navbar-full.hidden-xs.hidden-sm', desktop_navbar)\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var Api = function(_) {\n    // Ajax implementation\n    var cookie_regex = new RegExp(_.preloaded_data.CSRF_COOKIE_NAME + '\\=([^;]*)');\n    this.csrf_token = ns.get(document.cookie.match(cookie_regex), 0).split('=')[1];\n\n    this.ajax = function(method, url, data, progress) {\n      var deferred = m.deferred();\n\n      var ajax_settings = {\n        url: url,\n        method: method,\n        headers: {\n          'X-CSRFToken': this.csrf_token\n        },\n\n        data: data | {},\n        dataType: 'json',\n\n        success: function(data) {\n          deferred.resolve(data);\n        },\n        error: function(jqXHR) {\n          deferred.reject(jqXHR);\n        }\n      };\n\n      if (progress) {\n        return; // not implemented... yet!\n      }\n\n      $.ajax(ajax_settings);\n      return deferred.promise;\n    };\n\n    this.get = function(url) {\n      var preloaded_data = ns.pop(_.preloaded_data, url);\n      if (preloaded_data) {\n        var deferred = m.deferred();\n        deferred.resolve(preloaded_data);\n        return deferred.promise;\n      } else {\n        return this.ajax('GET', url);\n      }\n    };\n\n    this.post = function(url) {\n      return this.ajax('POST', url);\n    };\n\n    // API\n    this.buildUrl = function(model, call, querystrings) {\n      var url = _.router.base_url;\n      url += 'api/' + model + '/';\n      return url;\n    };\n\n    this.one = function(model, id) {\n      var url = this.buildUrl(model) + id + '/';\n      return this.get(url);\n    };\n\n    this.many = function(model, filters) {\n\n    };\n\n    this.call = function(model, target, call, data) {\n\n    };\n  };\n\n  ns.Api = function(_) {\n    return new Api(_);\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.ComponentFactory = function(_) {\n    // Component factory\n    _.component = function() {\n      var arguments_array = [];\n      for (var i = 0; i < arguments.length; i += 1) {\n        arguments_array.push(arguments[i]);\n      }\n\n      arguments_array.push(_);\n      return m.component.apply(undefined, arguments_array);\n    };\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.Conf = function(_) {\n    _.settings = ns.get(_.preloaded_data, 'SETTINGS', {});\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.Outlet = {\n    factory: function(_) {\n      if (_.setup.fixture) {\n        m.mount(document.getElementById(_.setup.fixture),\n                _.component(ns.ForumLayout));\n      }\n    },\n\n    destroy: function(_) {\n      if (_.setup.fixture) {\n        m.mount(_.setup.fixture, null);\n      }\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var Router = function(_) {\n    var self = this;\n    this.base_url = $('base').attr('href');\n\n    this.static_url = ns.get(_.preloaded_data, 'STATIC_URL', '/');\n    this.media_url = ns.get(_.preloaded_data, 'MEDIA_URL', '/');\n\n    // Routing\n    this.urls = {};\n    this.reverses = {};\n\n    var populatePatterns = function(urlconf) {\n      urlconf.patterns().forEach(function(url) {\n        // set service container on component\n        url.component.container = _;\n\n        var final_pattern = self.base_url + url.pattern;\n        final_pattern = final_pattern.replace('//', '/');\n\n        self.urls[final_pattern] = url.component;\n        self.reverses[url.name] = final_pattern;\n      });\n    };\n\n    this.startRouting = function(urlconf, fixture) {\n      populatePatterns(urlconf);\n      this.fixture = fixture;\n\n      m.route.mode = 'pathname';\n      m.route(fixture, '/', this.urls);\n    };\n\n    this.url = function(name) {\n      return this.reverses[name];\n    };\n\n    // Delegate clicks\n    this.delegate_element = null;\n    this.delegate_name = 'click.misago-router';\n\n    this.cleanUrl = function(url) {\n      if (!url) { return; }\n\n      // Is link relative?\n      var is_relative = url.substr(0, 1) === '/' && url.substr(0, 2) !== '//';\n\n      // If link contains host, validate to see if its outgoing\n      if (!is_relative) {\n        var location = window.location;\n\n        // If protocol matches current one, strip it from string\n        // otherwhise stop handler\n        if (url.substr(0, 2) !== '//') {\n          var protocol = url.substr(0, location.protocol.length + 2);\n          if (protocol !== location.protocol + '//') { return; }\n          url = url.substr(location.protocol.length + 2);\n        } else {\n          url = url.substr(2);\n        }\n\n        // Host checks out?\n        if (url.substr(0, location.host.length) !== location.host) { return; }\n        url = url.substr(location.host.length);\n      }\n\n      // Is link within Ember app?\n      if (url.substr(0, this.base_url.length) !== this.base_url) { return; }\n\n      // Is link to media/static/avatar server?\n      if (url.substr(0, this.static_url.length) === this.static_url) { return; }\n\n      if (url.substr(0, this.media_url.length) === this.media_url) { return; }\n\n      var avatars_url = '/user-avatar/';\n      if (url.substr(0, avatars_url.length) === avatars_url) { return; }\n\n      return url;\n    };\n\n    this.delegateClicks = function(element) {\n      this.delegate_element = element;\n      $(this.delegate_element).on(this.delegate_name, 'a', function(e) {\n        var clean_url = self.cleanUrl(e.target.href);\n        if (clean_url) {\n          if (clean_url != m.route()) {\n            m.route(clean_url);\n          }\n          e.preventDefault();\n        }\n      });\n    };\n\n    this.destroy = function() {\n      $(this.delegate_element).off(this.delegate_name);\n    };\n\n    // Media/Static url\n    var prefixUrl = function(prefix) {\n      return function(url) {\n        return prefix + url;\n      };\n    };\n\n    this.staticUrl = prefixUrl(this.static_url);\n    this.mediaUrl = prefixUrl(this.media_url);\n  };\n\n  ns.RouterFactory = function(_) {\n    return new Router(_);\n  };\n\n  ns.startRouting = function(_) {\n    _.router.startRouting(ns.urls, document.getElementById('router-fixture'));\n    _.router.delegateClicks(document.getElementById(_.setup.fixture));\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.PageTitle = function(_) {\n    _._setTitle = function(title) {\n      if (typeof title === 'string') {\n        title = {title: title};\n      }\n\n      var complete_title = title.title;\n\n      if (typeof title.page !== 'undefined' && title.page > 1) {\n        complete_title += ' (' + interpolate(gettext('page %(page)s'), { page:title.page }, true) + ')';\n      }\n\n      if (typeof title.parent !== 'undefined') {\n        complete_title += ' | ' + title.parent;\n      }\n\n      document.title = complete_title + ' | ' + this.settings.forum_name;\n    };\n\n    _.setTitle = function(title) {\n      if (title) {\n        this._setTitle(title);\n      } else {\n        document.title = this.settings.forum_name;\n      }\n    };\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.has = function(obj, key) {\n    if (obj !== undefined) {\n      return obj.hasOwnProperty(key);\n    } else {\n      return false;\n    }\n  };\n\n  ns.get = function(obj, key, value) {\n    if (ns.has(obj, key)) {\n      return obj[key];\n    } else if (value !== undefined) {\n      return value;\n    } else {\n      return undefined;\n    }\n  };\n\n  ns.pop = function(obj, key, value) {\n    var returnValue = ns.get(obj, key, value);\n    if (ns.has(obj, key)) {\n      delete obj[key];\n    }\n    return returnValue;\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.OrderedList = function(items) {\n    this.is_ordered = false;\n    this._items = items || [];\n\n    this.add = function(key, item, order) {\n      this._items.push({\n        key: key,\n        item: item,\n        after: ns.get(order, 'after'),\n        before: ns.get(order, 'before')\n      });\n    };\n\n    this.get = function(key, value) {\n      for (var i = 0; i < this._items.length; i++) {\n        if (this._items[i].key === key) {\n          return this._items[i].item;\n        }\n      }\n\n      return value;\n    };\n\n    this.has = function(key) {\n      return this.get(key) !== undefined;\n    };\n\n    this.values = function() {\n      var values = [];\n      for (var i = 0; i < this._items.length; i++) {\n        values.push(this._items[i].item);\n      }\n      return values;\n    };\n\n    this.order = function(values_only) {\n      if (!this.is_ordered) {\n        this._items = this._order(this._items);\n        this.is_ordered = true;\n      }\n\n      if (values_only || typeof values_only === 'undefined') {\n        return this.values();\n      } else {\n        return this._items;\n      }\n    };\n\n    this._order = function(unordered) {\n      // Index of unordered items\n      var index = [];\n      unordered.forEach(function (item) {\n        index.push(item.key);\n      });\n\n      // Ordered items\n      var ordered = [];\n      var ordering = [];\n\n      // First pass: register items that\n      // don't specify their order\n      unordered.forEach(function (item) {\n        if (!item.after && !item.before) {\n          ordered.push(item);\n          ordering.push(item.key);\n        }\n      });\n\n      // Second pass: keep iterating items\n      // until we hit iterations limit or finish\n      // ordering list\n      function insertItem(item) {\n        var insertAt = -1;\n        if (ordering.indexOf(item.key) === -1) {\n          if (item.after) {\n            insertAt = ordering.indexOf(item.after);\n            if (insertAt !== -1) {\n              insertAt += 1;\n            }\n          } else if (item.before) {\n            insertAt = ordering.indexOf(item.before);\n          }\n\n          if (insertAt !== -1) {\n            ordered.splice(insertAt, 0, item);\n            ordering.splice(insertAt, 0, item.key);\n          }\n        }\n      }\n\n      var iterations = 200;\n      while (iterations > 0 && index.length !== ordering.length) {\n        iterations -= 1;\n        unordered.forEach(insertItem);\n      }\n\n      return ordered;\n    };\n  };\n} (Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.startsWith = function(string, beginning) {\n    return string.indexOf(beginning) === 0;\n  };\n\n  ns.endsWith = function(string, tail) {\n    return string.indexOf(tail, string.length - tail.length) !== -1;\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.UrlConfInvalidComponentError = function() {\n    this.message = 'component argument should be array or object';\n  };\n\n  ns.UrlConf = function() {\n    var self = this;\n    this._patterns = [];\n\n    this.patterns = function() {\n      return this._patterns;\n    };\n\n    var prefixPattern = function(prefix, pattern) {\n      return (prefix + pattern).replace('//', '/');\n    };\n\n    var include = function(prefix, patterns) {\n      for (var i = 0; i < patterns.length; i ++) {\n        self.url(prefixPattern(prefix, patterns[i].pattern),\n                 patterns[i].component,\n                 patterns[i].name);\n      }\n    };\n\n    this.url = function(pattern, component, name) {\n      if (typeof component !== 'object') {\n        throw new ns.UrlConfInvalidComponentError();\n      }\n\n      if (pattern === '') {\n        pattern = '/';\n      }\n\n      if (component instanceof ns.UrlConf) {\n        include(pattern, component.patterns());\n      } else {\n        this._patterns.push({\n          pattern: pattern,\n          component: component,\n          name: name\n        });\n      }\n    };\n  };\n} (Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.loadingPage = function(_) {\n    return m('.page.page-loading', _.component(ns.Loader));\n  };\n} (Misago.prototype));\n\n(function (ns, UrlConf) {\n  'use strict';\n\n  var urls = new UrlConf();\n  urls.url('/', ns.IndexPage, 'index');\n\n  // Legal pages\n  urls.url('/terms-of-service/', ns.TermsOfServicePage, 'terms_of_service');\n  urls.url('/privacy-policy/', ns.PrivacyPolicyPage, 'privacy_policy');\n\n  ns.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}

+ 1 - 1
misago/templates/misago/base.html

@@ -47,7 +47,7 @@
     <script type="text/javascript">
       var misago = new Misago();
       misago.registerCoreServices();
-      {% include "misago/preloaded_data.js" %}
+      {% include "misago/frontend_context.js" %}
       misago.init({
         fixture: 'misago-fixture'
       });

+ 2 - 0
misago/templates/misago/frontend_context.js

@@ -0,0 +1,2 @@
+{% load misago_json %}
+misago.context = {{ frontend_context|as_json }};

+ 0 - 2
misago/templates/misago/preloaded_data.js

@@ -1,2 +0,0 @@
-{% load misago_json %}
-misago.preloaded_data = {{ preloaded_ember_data|as_json }};

+ 3 - 3
misago/users/context_processors.py

@@ -12,16 +12,16 @@ def sites_links(request):
 
 
 def preload_user_json(request):
-    request.preloaded_ember_data.update({
+    request.frontend_context.update({
         'isAuthenticated': request.user.is_authenticated(),
     })
 
     if request.user.is_authenticated():
-        request.preloaded_ember_data.update({
+        request.frontend_context.update({
             'user': AuthenticatedUserSerializer(request.user).data
         })
     else:
-        request.preloaded_ember_data.update({
+        request.frontend_context.update({
             'user': AnonymousUserSerializer(request.user).data
         })
 

+ 0 - 7
misago/users/views/auth.py

@@ -8,8 +8,6 @@ from django.views.decorators.cache import never_cache
 from django.views.decorators.csrf import csrf_protect
 from django.views.decorators.debug import sensitive_post_parameters
 
-from misago.core.embercli import is_ember_cli_request, get_embercli_host
-
 
 @sensitive_post_parameters()
 @never_cache
@@ -20,11 +18,6 @@ def login(request):
         if redirect_to:
             is_redirect_safe = is_safe_url(
                 url=redirect_to, host=request.get_host())
-
-            if not is_redirect_safe and is_ember_cli_request(request):
-                is_redirect_safe = is_safe_url(
-                    url=redirect_to, host=get_embercli_host())
-
             if is_redirect_safe:
                 redirect_to_path = urlparse(redirect_to).path
                 return redirect(redirect_to_path)