settings_page.coffee 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. class app.views.SettingsPage extends app.View
  2. @className: '_static'
  3. @events:
  4. click: 'onClick'
  5. change: 'onChange'
  6. render: ->
  7. @html @tmpl('settingsPage', @currentSettings())
  8. return
  9. currentSettings: ->
  10. settings = {}
  11. settings.dark = app.settings.get('dark')
  12. settings.smoothScroll = !app.settings.get('fastScroll')
  13. settings.arrowScroll = app.settings.get('arrowScroll')
  14. settings.autoInstall = app.settings.get('autoInstall')
  15. settings.analyticsConsent = app.settings.get('analyticsConsent')
  16. settings[layout] = app.settings.hasLayout(layout) for layout in app.settings.LAYOUTS
  17. settings
  18. getTitle: ->
  19. 'Preferences'
  20. toggleDark: (enable) ->
  21. app.settings.set('dark', !!enable)
  22. return
  23. toggleLayout: (layout, enable) ->
  24. app.settings.setLayout(layout, enable)
  25. return
  26. toggleSmoothScroll: (enable) ->
  27. app.settings.set('fastScroll', !enable)
  28. return
  29. toggleAnalyticsConsent: (enable) ->
  30. app.settings.set('analyticsConsent', if enable then '1' else '0')
  31. resetAnalytics() unless enable
  32. return
  33. toggle: (name, enable) ->
  34. app.settings.set(name, enable)
  35. return
  36. export: ->
  37. data = new Blob([JSON.stringify(app.settings.export())], type: 'application/json')
  38. link = document.createElement('a')
  39. link.href = URL.createObjectURL(data)
  40. link.download = 'devdocs.json'
  41. link.style.display = 'none'
  42. document.body.appendChild(link)
  43. link.click()
  44. document.body.removeChild(link)
  45. return
  46. import: (file, input) ->
  47. unless file and file.type is 'application/json'
  48. new app.views.Notif 'ImportInvalid', autoHide: false
  49. return
  50. reader = new FileReader()
  51. reader.onloadend = ->
  52. data = try JSON.parse(reader.result)
  53. unless data and data.constructor is Object
  54. new app.views.Notif 'ImportInvalid', autoHide: false
  55. return
  56. app.settings.import(data)
  57. $.trigger input.form, 'import'
  58. return
  59. reader.readAsText(file)
  60. return
  61. onChange: (event) =>
  62. input = event.target
  63. switch input.name
  64. when 'dark'
  65. @toggleDark input.checked
  66. when 'layout'
  67. @toggleLayout input.value, input.checked
  68. when 'smoothScroll'
  69. @toggleSmoothScroll input.checked
  70. when 'import'
  71. @import input.files[0], input
  72. when 'analyticsConsent'
  73. @toggleAnalyticsConsent input.checked
  74. else
  75. @toggle input.name, input.checked
  76. return
  77. onClick: (event) =>
  78. target = $.eventTarget(event)
  79. switch target.getAttribute('data-action')
  80. when 'export'
  81. $.stopEvent(event)
  82. @export()
  83. return
  84. onRoute: (context) ->
  85. @render()
  86. return