UiConfig.coffee 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. window.h = maquette.h
  2. class UiConfig extends ZeroFrame
  3. init: ->
  4. @save_visible = true
  5. @config = null # Setting currently set on the server
  6. @values = null # Entered values on the page
  7. @config_view = new ConfigView()
  8. window.onbeforeunload = =>
  9. if @getValuesChanged().length > 0
  10. return true
  11. else
  12. return null
  13. onOpenWebsocket: =>
  14. @cmd("wrapperSetTitle", "Config - ZeroNet")
  15. @cmd "serverInfo", {}, (server_info) =>
  16. @server_info = server_info
  17. @restart_loading = false
  18. @updateConfig()
  19. updateConfig: (cb) =>
  20. @cmd "configList", [], (res) =>
  21. @config = res
  22. @values = {}
  23. @config_storage = new ConfigStorage(@config)
  24. @config_view.values = @values
  25. @config_view.config_storage = @config_storage
  26. for key, item of res
  27. value = item.value
  28. @values[key] = @config_storage.formatValue(value)
  29. @projector.scheduleRender()
  30. cb?()
  31. createProjector: =>
  32. @projector = maquette.createProjector()
  33. @projector.replace($("#content"), @render)
  34. @projector.replace($("#bottom-save"), @renderBottomSave)
  35. @projector.replace($("#bottom-restart"), @renderBottomRestart)
  36. getValuesChanged: =>
  37. values_changed = []
  38. for key, value of @values
  39. if @config_storage.formatValue(value) != @config_storage.formatValue(@config[key]?.value)
  40. values_changed.push({key: key, value: value})
  41. return values_changed
  42. getValuesPending: =>
  43. values_pending = []
  44. for key, item of @config
  45. if item.pending
  46. values_pending.push(key)
  47. return values_pending
  48. saveValues: (cb) =>
  49. changed_values = @getValuesChanged()
  50. for item, i in changed_values
  51. last = i == changed_values.length - 1
  52. value = @config_storage.deformatValue(item.value, typeof(@config[item.key].default))
  53. default_value = @config_storage.deformatValue(@config[item.key].default, typeof(@config[item.key].default))
  54. value_same_as_default = JSON.stringify(default_value) == JSON.stringify(value)
  55. if @config[item.key].item.valid_pattern and not @config[item.key].item.isHidden?()
  56. match = value.match(@config[item.key].item.valid_pattern)
  57. if not match or match[0] != value
  58. message = "Invalid value of #{@config[item.key].item.title}: #{value} (does not matches #{@config[item.key].item.valid_pattern})"
  59. Page.cmd("wrapperNotification", ["error", message])
  60. cb(false)
  61. break
  62. if value_same_as_default
  63. value = null
  64. @saveValue(item.key, value, if last then cb else null)
  65. saveValue: (key, value, cb) =>
  66. if key == "open_browser"
  67. if value
  68. value = "default_browser"
  69. else
  70. value = "False"
  71. Page.cmd "configSet", [key, value], (res) =>
  72. if res != "ok"
  73. Page.cmd "wrapperNotification", ["error", res.error]
  74. cb?(true)
  75. render: =>
  76. if not @config
  77. return h("div.content")
  78. h("div.content", [
  79. @config_view.render()
  80. ])
  81. handleSaveClick: =>
  82. @save_loading = true
  83. @logStart "Save"
  84. @saveValues (success) =>
  85. @save_loading = false
  86. @logEnd "Save"
  87. if success
  88. @updateConfig()
  89. Page.projector.scheduleRender()
  90. return false
  91. renderBottomSave: =>
  92. values_changed = @getValuesChanged()
  93. h("div.bottom.bottom-save", {classes: {visible: values_changed.length}}, h("div.bottom-content", [
  94. h("div.title", "#{values_changed.length} configuration item value changed"),
  95. h("a.button.button-submit.button-save", {href: "#Save", classes: {loading: @save_loading}, onclick: @handleSaveClick}, "Save settings")
  96. ]))
  97. handleRestartClick: =>
  98. @restart_loading = true
  99. Page.cmd("serverShutdown", {restart: true})
  100. Page.projector.scheduleRender()
  101. return false
  102. renderBottomRestart: =>
  103. values_pending = @getValuesPending()
  104. values_changed = @getValuesChanged()
  105. h("div.bottom.bottom-restart", {classes: {visible: values_pending.length and not values_changed.length}}, h("div.bottom-content", [
  106. h("div.title", "Some changed settings requires restart"),
  107. h("a.button.button-submit.button-restart", {href: "#Restart", classes: {loading: @restart_loading}, onclick: @handleRestartClick}, "Restart ZeroNet client")
  108. ]))
  109. window.Page = new UiConfig()
  110. window.Page.createProjector()