123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345 |
- class Site extends Class
- constructor: (row, @item_list) ->
- @deleted = false
- @show_errors = false
- @message_visible = false
- @message = null
- @message_class = ""
- @message_collapsed = false
- @message_timer = null
- @favorite = Page.settings.favorite_sites[row.address]
- @key = row.address
- @optional_helps = []
- @optional_helps_disabled = {}
- @setRow(row)
- @files = new SiteFiles(@)
- @menu = new Menu()
- @menu_helps = null
- setRow: (row) ->
- # Default values
- row.settings.modified ?= 0
- row.settings.size ?= 0
- row.settings.added ?= 0
- row.settings.peers ?= 0
- # Message
- if row.event?[0] == "updated" and row.content_updated != false
- @setMessage "Updated!", "done"
- else if row.event?[0] == "updating"
- @setMessage "Updating..."
- else if row.tasks > 0
- @setMessage "Updating: #{Math.max(row.tasks, row.bad_files)} left"
- else if row.bad_files > 0
- if row.peers <= 1
- @setMessage "No peers", "error"
- else
- @setMessage row.bad_files+" file update failed", "error"
- else if row.content_updated == false
- if row.peers <= 1
- @setMessage "No peers", "error"
- else
- @setMessage "Update failed", "error"
- else if row.tasks == 0 and @row?.tasks > 0
- @setMessage "Updated!", "done"
- if not row.body?
- row.body = ""
- @optional_helps = ([key, val] for key, val of row.settings.optional_help)
- @row = row
- setMessage: (message, @message_class="") ->
- # Set message
- if message
- @message = message
- @message_visible = true
- if @message_class == "error" and not @show_errors
- @message_collapsed = true
- else
- @message_collapsed = false
- else
- @message_visible = false
- # Hide done message after 3 seconds
- clearInterval(@message_timer)
- if @message_class == "done"
- @message_timer = setTimeout (=>
- @setMessage("")
- ), 5000
- Page.projector.scheduleRender()
- isWorking: ->
- @row.tasks > 0 or @row.event?[0] == "updating"
- handleFavoriteClick: =>
- @favorite = true
- @menu = new Menu()
- Page.settings.favorite_sites[@row.address] = true
- Page.saveSettings()
- Page.site_list.reorder()
- return false
- handleUnfavoriteClick: =>
- @favorite = false
- @menu = new Menu()
- delete Page.settings.favorite_sites[@row.address]
- Page.saveSettings()
- Page.site_list.reorder()
- return false
- handleUpdateClick: =>
- Page.cmd "siteUpdate", {"address": @row.address}
- @show_errors = true
- return false
- handleCheckfilesClick: =>
- Page.cmd "siteUpdate", {"address": @row.address, "check_files": true, since: 0}
- @show_errors = true
- return false
- handleResumeClick: =>
- Page.cmd "siteResume", {"address": @row.address}
- return false
- handlePauseClick: =>
- Page.cmd "sitePause", {"address": @row.address}
- return false
- handleCloneClick: =>
- Page.cmd "siteClone", {"address": @row.address}
- return false
- handleCloneUpgradeClick: =>
- Page.cmd "wrapperConfirm", ["Are you sure?" + " Any modifications you made on<br><b>#{@row.content.title}</b> site's js/css files will be lost.", "Upgrade"], (confirmed) =>
- Page.cmd "siteClone", {"address": @row.content.cloned_from, "root_inner_path": @row.content.clone_root, "target_address": @row.address}
- return false
- handleDeleteClick: =>
- if @row.settings.own or @row.privatekey
- Page.cmd "wrapperConfirm", ["You can delete your site using the site's sidebar.", ["Open site"]], (confirmed) =>
- if (confirmed)
- window.top.location = @getHref() + "#ZeroNet:OpenSidebar"
- else
- if not @row.content.title
- Page.cmd "siteDelete", {"address": @row.address}
- @item_list.deleteItem(@)
- Page.projector.scheduleRender()
- else if Page.server_info.rev > 2060
- Page.cmd "wrapperConfirm", ["Are you sure?" + " <b>#{@row.content.title}</b>", ["Delete", "Blacklist"]], (confirmed) =>
- if confirmed == 1
- Page.cmd "siteDelete", {"address": @row.address}
- @item_list.deleteItem(@)
- Page.projector.scheduleRender()
- else if confirmed == 2
- Page.cmd "wrapperPrompt", ["Blacklist <b>#{@row.content.title}</b>", "text", "Delete and Blacklist", "Reason"], (reason) =>
- Page.cmd "siteDelete", {"address": @row.address}
- Page.cmd "siteblockAdd", [@row.address, reason]
- @item_list.deleteItem(@)
- Page.projector.scheduleRender()
- else
- Page.cmd "wrapperConfirm", ["Are you sure?" + " <b>#{@row.content.title}</b>", "Delete"], (confirmed) =>
- if confirmed
- Page.cmd "siteDelete", {"address": @row.address}
- @item_list.deleteItem(@)
- Page.projector.scheduleRender()
- return false
- handleSettingsClick: (e) =>
- @menu.items = []
- if @favorite
- @menu.items.push ["Unfavorite", @handleUnfavoriteClick]
- else
- @menu.items.push ["Favorite", @handleFavoriteClick]
- @menu.items.push ["Update", @handleUpdateClick]
- @menu.items.push ["Check files", @handleCheckfilesClick]
- if @row.settings.serving
- @menu.items.push ["Pause", @handlePauseClick]
- else
- @menu.items.push ["Resume", @handleResumeClick]
- @menu.items.push ["Save as .zip", "/ZeroNet-Internal/Zip?address=#{@row.address}"]
- if @row.content.cloneable == true
- @menu.items.push ["Clone", @handleCloneClick]
- if @row.settings.own and @row.content.cloned_from and Page.server_info.rev >= 2080
- @menu.items.push ["---"]
- @menu.items.push ["Upgrade code", @handleCloneUpgradeClick]
- @menu.items.push ["---"]
- @menu.items.push ["Delete", @handleDeleteClick]
- if @menu.visible
- @menu.hide()
- else
- @menu.show()
- return false
- handleHelpClick: (directory, title) =>
- if @optional_helps_disabled[directory]
- Page.cmd "OptionalHelp", [directory, title, @row.address]
- delete @optional_helps_disabled[directory]
- else
- Page.cmd "OptionalHelpRemove", [directory, @row.address]
- @optional_helps_disabled[directory] = true
- return true
- handleHelpAllClick: =>
- if @row.settings.autodownloadoptional == true
- Page.cmd "OptionalHelpAll", [false, @row.address], =>
- @row.settings.autodownloadoptional = false
- Page.projector.scheduleRender()
- else
- Page.cmd "OptionalHelpAll", [true, @row.address], =>
- @row.settings.autodownloadoptional = true
- Page.projector.scheduleRender()
- handleHelpsClick: (e) =>
- if e.target.classList.contains("menu-item")
- return
- if not @menu_helps
- @menu_helps = new Menu()
- @menu_helps.items = []
- @menu_helps.items.push ["Help distribute all new files", @handleHelpAllClick, ( => return @row.settings.autodownloadoptional)]
- if @optional_helps.length > 0
- @menu_helps.items.push ["---"]
- for [directory, title] in @optional_helps
- @menu_helps.items.push [title, ( => @handleHelpClick(directory, title) ), ( => return not @optional_helps_disabled[directory] )]
- @menu_helps.toggle()
- return true
- getHref: (row) ->
- if @row.content?.domain
- ext = @row.content?.domain.split(".").pop()
- supported_plugins = {
- bit: ["Zeroname", "Dnschain", "Zeroname-local"],
- yo: ["NameYo"],
- yu: ["NameYo"],
- of: ["NameYo"],
- inf: ["NameYo"],
- zn: ["NameYo"],
- list: ["NameYo"]
- }[ext] or []
- has_plugin = Page.server_info?.plugins? and supported_plugins.some((plugin) -> plugin in Page.server_info?.plugins)
- else
- has_plugin = false
- if has_plugin and @row.content?.domain # Domain
- href = Text.getSiteUrl(@row.content.domain)
- else # Address
- href = Text.getSiteUrl(@row.address)
- if row?.inner_path
- return href + row.inner_path
- else
- return href
- handleLimitIncreaseClick: =>
- if Page.server_info.rev < 3170
- return Page.cmd "wrapperNotification", ["info", "You need ZeroNet Rev3170 to use this command"]
- Page.cmd "as", [@row.address, "siteSetLimit", @row.need_limit], (res) =>
- if res == "ok"
- Page.cmd "wrapperNotification", ["done", "Site <b>#{@row.content.title}</b> storage limit modified to <b>#{@row.need_limit}MB</b>", 5000]
- else
- Page.cmd "wrapperNotification", ["error", res.error]
- Page.projector.scheduleRender()
- return false
- render: =>
- now = Date.now()/1000
- h("div.site", {
- key: @key, "data-key": @key,
- classes: {
- "modified-lastday": now - @row.settings.modified < 60*60*24,
- "disabled": not @row.settings.serving and not @row.demo,
- "working": @isWorking()
- }
- },
- h("div.circle", {style: "color: #{Text.toColor(@row.address, 40, 50)}"}, ["\u2022"]),
- h("a.inner", {href: @getHref(), title: @row.content.title if @row.content.title?.length > 20}, [
- h("span.title", [@row.content.title or @row.address]),
- h("div.details", [
- h("span.modified", [
- h("div.icon-clock")
- if Page.settings.sites_orderby == "size"
- h("span.value", [(@row.settings.size/1024/1024 + @row.settings.size_optional?/1024/1024).toFixed(1), "MB"])
- else
- h("span.value", [Time.since(@row.settings.modified)])
- ]),
- h("span.peers", [
- h("div.icon-profile")
- h("span.value", [Math.max((if @row.settings.peers then @row.settings.peers else 0), @row.peers)])
- ])
- ])
- if @row.demo
- h("div.details.demo", "Activate \u00BB")
- if @row.need_limit
- h("a.details.needaction", {href: "#Set+limit", onclick: @handleLimitIncreaseClick}, "Set limit to #{@row.need_limit}MB")
- h("div.message",
- {classes: {visible: @message_visible, done: @message_class == 'done', error: @message_class == 'error', collapsed: @message_collapsed}},
- [@message]
- )
- ]),
- h("a.settings", {href: "#Settings", tabIndex: -1, onmousedown: @handleSettingsClick, onclick: Page.returnFalse}, ["\u22EE"]),
- @menu.render()
- )
- renderCircle: (value, max) ->
- if value < 1
- dashoffset = 75+(1-value)*75
- else
- dashoffset = Math.max(0, 75-((value-1)/9)*75)
- stroke = "hsl(#{Math.min(555, value*50)}, 100%, 61%)"
- return h("div.circle", {title: "Upload/Download ratio", innerHTML: """
- <svg class="circle-svg" width="30" height="30" viewPort="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg">
- <circle r="12" cx="15" cy="15" fill="transparent" class='circle-bg'></circle>
- <circle r="12" cx="15" cy="15" fill="transparent" class='circle-fg' style='stroke-dashoffset: #{dashoffset}; stroke: #{stroke}'></circle>
- </svg>
- """})
- renderOptionalStats: =>
- row = @row
- row.settings.bytes_sent ?= 0
- ratio = (row.settings.bytes_sent/row.settings.bytes_recv).toFixed(1)
- if ratio >= 100
- ratio = "\u221E"
- else if ratio >= 10
- ratio = (row.settings.bytes_sent/row.settings.bytes_recv).toFixed(0)
- ratio_hue = Math.min(555, (row.settings.bytes_sent/row.settings.bytes_recv)*50)
- h("div.site", {key: @key}, [
- h("div.title", [
- h("h3.name", h("a", {href: @getHref()}, row.content.title)),
- h("div.size", {title: "Site size limit: #{Text.formatSize(row.size_limit*1024*1024)}"}, [
- "#{Text.formatSize(row.settings.size)}",
- h("div.bar", h("div.bar-active", {style: "width: #{100*(row.settings.size/(row.size_limit*1024*1024))}%"}))
- ]),
- h("div.plus", "+"),
- h("div.size.size-optional", {title: "Optional files on site: #{Text.formatSize(row.settings.size_optional)}"}, [
- "#{Text.formatSize(row.settings.optional_downloaded)}",
- h("span.size-title", "Optional"),
- h("div.bar", h("div.bar-active", {style: "width: #{100*(row.settings.optional_downloaded/row.settings.size_optional)}%"}))
- ]),
- h("a.helps", {href: "#", onmousedown: @handleHelpsClick, onclick: Page.returnFalse},
- h("div.icon-share"),
- if @row.settings.autodownloadoptional then "\u2661" else @optional_helps.length,
- h("div.icon-arrow-down")
- if @menu_helps then @menu_helps.render()
- ),
- @renderCircle(parseFloat((row.settings.bytes_sent/row.settings.bytes_recv).toFixed(1)), 10),
- h("div.circle-value", {classes: {negative: ratio < 1}, style: "color: hsl(#{ratio_hue}, 70%, 60%)"}, ratio),
- h("div.transfers", [
- h("div.up", {"title": "Uploaded"}, "\u22F0 \u00A0#{Text.formatSize(row.settings.bytes_sent)}"),
- h("div.down", {"title": "Downloaded"}, "\u22F1 \u00A0#{Text.formatSize(row.settings.bytes_recv)}")
- ])
- ])
- @files.render()
- ])
- window.Site = Site
|