Head.coffee 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. class Head extends Class
  2. constructor: ->
  3. @menu_settings = new Menu()
  4. formatUpdateInfo: ->
  5. if parseFloat(Page.server_info.version.replace(".", "0")) < parseFloat(Page.latest_version.replace(".", "0"))
  6. return "New version available!"
  7. else
  8. return "Up to date!"
  9. handleLanguageClick: (e) =>
  10. if Page.server_info.rev < 1750
  11. return Page.cmd "wrapperNotification", ["info", "You need ZeroNet 0.5.1 to change the interface's language"]
  12. lang = e.target.hash.replace("#", "")
  13. Page.cmd "configSet", ["language", lang], ->
  14. Page.server_info.language = lang
  15. top.location = "?Home"
  16. return false
  17. renderMenuLanguage: =>
  18. langs = ["da", "de", "en", "es", "fa", "fr", "hu", "it", "nl", "pl", "pt", "pt-br", "ru", "sk", "tr", "uk", "zh", "zh-tw"]
  19. if Page.server_info.language and Page.server_info.language not in langs
  20. langs.push Page.server_info.language
  21. h("div.menu-radio",
  22. h("div", "Language: "),
  23. for lang in langs
  24. [
  25. h("a", {href: "#"+lang, onclick: @handleLanguageClick, classes: {selected: Page.server_info.language == lang, long: lang.length > 2}}, lang),
  26. " "
  27. ]
  28. )
  29. handleThemeClick: (e) =>
  30. if Page.server_info.rev < 3670
  31. return Page.cmd "wrapperNotification", ["info", "You need ZeroNet 0.6.4 to change the interface's theme"]
  32. theme = e.target.hash.replace("#", "")
  33. if theme == "system"
  34. if Page.server_info.rev < 4085
  35. return Page.cmd "wrapperNotification", ["info", "You need ZeroNet 0.7.0 to use system's theme"]
  36. DARK = "(prefers-color-scheme: dark)"
  37. mqDark = window.matchMedia(DARK)
  38. Page.cmd "userGetGlobalSettings", [], (user_settings) ->
  39. if theme == "system"
  40. theme = if mqDark.matches then "dark" else "light"
  41. user_settings.use_system_theme = true
  42. else
  43. user_settings.use_system_theme = false
  44. user_settings.theme = theme
  45. Page.server_info.user_settings = user_settings
  46. document.getElementById("style-live").innerHTML = "* { transition: all 0.5s ease-in-out }"
  47. Page.cmd "userSetGlobalSettings", [user_settings]
  48. setTimeout ( ->
  49. document.body.className = document.body.className.replace(/theme-[a-z]+/, "")
  50. document.body.className += " theme-#{theme}"
  51. setTimeout ( ->
  52. document.getElementById("style-live").innerHTML = ""
  53. ), 1000
  54. ), 300
  55. return false
  56. renderMenuTheme: =>
  57. themes = {"system": _("system"), "light": _("light"), "dark": _("dark")}
  58. if Page.server_info.user_settings.use_system_theme
  59. theme_selected = "system"
  60. else
  61. theme_selected = Page.server_info.user_settings?.theme
  62. if not theme_selected then theme_selected = "system"
  63. h("div.menu-radio.menu-themes",
  64. h("div", "Theme: "),
  65. for theme_id, theme_title of themes
  66. [
  67. h("a", {href: "#" + theme_id, onclick: @handleThemeClick, classes: {selected: theme_selected == theme_id, long: true}}, theme_title),
  68. " "
  69. ]
  70. )
  71. handleCreateSiteClick: =>
  72. if Page.server_info.rev < 1770
  73. return Page.cmd "wrapperNotification", ["info", "You need to update your ZeroNet client to use this feature"]
  74. Page.cmd("siteClone", [Page.site_info.address, "template-new"])
  75. handleBackupClick: =>
  76. if Page.server_info.rev < 2165
  77. return Page.cmd "wrapperNotification", ["info", "You need to update your ZeroNet client to use this feature"]
  78. Page.cmd("serverShowdirectory", "backup")
  79. return Page.cmd "wrapperNotification", ["info", "Backup <b>users.json</b> file to keep your identity safe."]
  80. handleSettingsClick: =>
  81. Page.settings.sites_orderby ?= "peers"
  82. orderby = Page.settings.sites_orderby
  83. @menu_settings.items = []
  84. @menu_settings.items.push ["Update all sites", @handleUpdateAllClick]
  85. @menu_settings.items.push ["---"]
  86. @menu_settings.items.push ["Order sites by peers", ( => @handleOrderbyClick("peers") ), (orderby == "peers")]
  87. @menu_settings.items.push ["Order sites by update time", ( => @handleOrderbyClick("modified") ), (orderby == "modified")]
  88. @menu_settings.items.push ["Order sites by add time", ( => @handleOrderbyClick("addtime") ), (orderby == "addtime")]
  89. @menu_settings.items.push ["Order sites by size", ( => @handleOrderbyClick("size") ), (orderby == "size")]
  90. @menu_settings.items.push ["---"]
  91. @menu_settings.items.push [@renderMenuTheme(), null ]
  92. @menu_settings.items.push ["---"]
  93. @menu_settings.items.push [@renderMenuLanguage(), null ]
  94. @menu_settings.items.push ["---"]
  95. @menu_settings.items.push ["Create new, empty site", @handleCreateSiteClick]
  96. @menu_settings.items.push ["---"]
  97. @menu_settings.items.push [[h("div.icon-mute", ""), "Manage blocked users and sites"], @handleManageBlocksClick]
  98. if Page.server_info.plugins.indexOf("UiConfig") >= 0
  99. @menu_settings.items.push [[h("div.icon-gear.emoji", "\u2699\uFE0E"), "Configuration"], "/Config"]
  100. if Page.server_info.plugins.indexOf("UiPluginManager") >= 0
  101. @menu_settings.items.push [[h("div.icon-gear.emoji", "\u2B21"), "Plugins"], "/Plugins"]
  102. @menu_settings.items.push ["---"]
  103. if not Page.server_info.multiuser or Page.server_info.multiuser_admin
  104. @menu_settings.items.push ["Show data directory", @handleBackupClick]
  105. @menu_settings.items.push ["Version #{Page.server_info.version} (rev#{Page.server_info.rev}): #{@formatUpdateInfo()}", @handleUpdateZeronetClick]
  106. if not Page.server_info.multiuser or Page.server_info.multiuser_admin
  107. @menu_settings.items.push ["Shut down ZeroNet", @handleShutdownZeronetClick]
  108. if @menu_settings.visible
  109. @menu_settings.hide()
  110. else
  111. @menu_settings.show()
  112. return false
  113. handleUpdateAllClick: =>
  114. for site in Page.site_list.sites
  115. if site.row.settings.serving
  116. Page.cmd "siteUpdate", {"address": site.row.address}
  117. handleOrderbyClick: (orderby) =>
  118. Page.settings.sites_orderby = orderby
  119. Page.site_list.reorder()
  120. Page.saveSettings()
  121. handleTorClick: =>
  122. return true
  123. handleManageBlocksClick: =>
  124. if Page.server_info.rev < 1880
  125. return Page.cmd "wrapperNotification", ["info", "You need ZeroNet 0.5.2 to use this feature."]
  126. Page.projector.replace($("#MuteList"), Page.mute_list.render)
  127. Page.mute_list.show()
  128. handleUpdateZeronetClick: =>
  129. if Page.server_info.updatesite
  130. Page.updateZeronet()
  131. else
  132. Page.cmd "wrapperConfirm", ["Update to latest development version?", "Update ZeroNet #{Page.latest_version}"], =>
  133. Page.updateZeronet()
  134. return false
  135. handleShutdownZeronetClick: =>
  136. Page.cmd "wrapperConfirm", ["Are you sure?", "Shut down ZeroNet"], =>
  137. Page.cmd "serverShutdown"
  138. handleModeClick: (e) =>
  139. if Page.server_info.rev < 1700
  140. Page.cmd "wrapperNotification", ["info", "This feature requires ZeroNet version 0.5.0"]
  141. else
  142. Page.handleLinkClick(e)
  143. return false
  144. render: =>
  145. h("div#Head",
  146. h("a.settings", {href: "#Settings", onmousedown: @handleSettingsClick, onclick: Page.returnFalse}, ["\u22EE"])
  147. @menu_settings.render()
  148. h("a.logo", {href: "?Home"}, [
  149. h("img", {src: 'img/logo.svg', width: 40, height: 40, onerror: "this.src='img/logo.png'; this.onerror=null;"}),
  150. h("span", ["Hello ZeroNet_"])
  151. ]),
  152. h("div.modes", [
  153. h("a.mode.sites", {href: "?", classes: {active: Page.mode == "Sites"}, onclick: Page.handleLinkClick}, _("Sites"))
  154. h("a.mode.files", {href: "?Files", classes: {active: Page.mode == "Files"}, onclick: Page.handleLinkClick}, _("Files"))
  155. h("a.mode.stats", {href: "?Stats", classes: {active: Page.mode == "Stats"}, onclick: Page.handleLinkClick}, _("Stats"))
  156. ])
  157. )
  158. window.Head = Head