1
0
mirror of https://github.com/github/choosealicense.com synced 2024-06-26 21:53:02 +02:00
choosealicense.com/assets/js/app.coffee

160 lines
5.7 KiB
CoffeeScript
Raw Normal View History

2014-07-31 18:36:56 +02:00
---
---
2013-07-13 21:18:57 +02:00
class Choosealicense
# Selects the content of a given element
selectText: (element) ->
if document.body.createTextRange
2013-11-30 00:08:27 +01:00
range = document.body.createTextRange()
range.moveToElementText(element)
range.select()
else if window.getSelection
selection = window.getSelection()
range = document.createRange()
range.selectNodeContents(element)
2013-11-30 00:08:27 +01:00
selection.removeAllRanges()
selection.addRange(range)
2023-08-27 15:17:13 +02:00
tooltipAttributesMapperByRuleType:
permissions:
2023-08-31 09:38:53 +02:00
heading: 'Permission'
2023-08-27 15:17:13 +02:00
color: 'hint--success'
conditions:
2023-08-31 09:38:53 +02:00
heading: 'Condition'
2023-08-27 15:17:13 +02:00
color: 'hint--info'
limitations:
2023-08-31 09:38:53 +02:00
heading: 'Limitation'
2023-08-27 15:17:13 +02:00
color: 'hint--error'
2013-07-13 21:18:57 +02:00
# fire on document.ready
constructor: ->
@initTooltips()
@initClipboard()
2018-10-15 01:21:54 +02:00
@initLicenseSuggestion()
2013-07-13 21:18:57 +02:00
# Init tooltip action
initTooltips: ->
# Dynamically add annotations as title attribute to rule list items
for ruletype, rules of window.annotations
2014-09-05 17:26:54 +02:00
for rule in rules
2023-08-27 15:17:13 +02:00
licenseLiElement = $(".license-#{ruletype} .#{rule["tag"]}")
tooltipAttr = @tooltipAttributesMapperByRuleType[ruletype]
licenseLiElement.attr "aria-label", "#{tooltipAttr.heading}: #{rule.description}"
licenseLiElement.addClass("hint--bottom
hint--large
hint--no-animate
#{tooltipAttr.color}
orverride-hint-inline")
2013-07-13 21:18:57 +02:00
# Initializes Clipboard.js
initClipboard: ->
2013-11-30 00:08:27 +01:00
# Backup the clipboard button's original text.
$(".js-clipboard-button").data "clipboard-prompt", $(".js-clipboard-button").text()
2013-11-30 00:08:27 +01:00
# Hook up copy to clipboard buttons
clip = new Clipboard ".js-clipboard-button"
2013-11-30 00:08:27 +01:00
clip.on "mouseout", @clipboardMouseout
clip.on "complete", @clipboardComplete
2013-07-13 21:18:57 +02:00
# Callback to restore the clipboard button's original text
clipboardMouseout: (client, args) ->
@textContent = $(this).data("clipboard-prompt")
2013-07-13 21:18:57 +02:00
# Post-copy user feedback callback
clipboardComplete: (client, args) ->
@textContent = "Copied!"
2018-10-15 01:21:54 +02:00
# Initializes the repository suggestion feature
initLicenseSuggestion: ->
inputEl = $("#repository-url")
licenseId = inputEl.attr("data-license-id")
statusIndicator = $(".status-indicator")
new LicenseSuggestion(inputEl, licenseId, statusIndicator)
2013-07-13 21:18:57 +02:00
2018-10-15 01:21:54 +02:00
class LicenseSuggestion
constructor: (@inputEl, @licenseId, @statusIndicator) ->
@bindEventHandlers()
inputWraper: $('.input-wrapper')
tooltipErrorClasses: 'hint--bottom hint--error hint--always'
2018-10-15 01:21:54 +02:00
# Main event handlers for user input
bindEventHandlers: =>
2018-10-15 01:21:54 +02:00
@inputEl.on "input", (event) =>
@setStatus ""
.on "keyup", (event) =>
2018-10-15 01:21:54 +02:00
if event.keyCode == 13 and event.target.value
# Validate the user input first
try
repositoryFullName = @parseUserInput event.target.value
catch
@setStatus "Error", "Invalid URL."
return
@setStatus "Fetching"
2018-10-15 01:21:54 +02:00
@fetchInfoFromGithubAPI repositoryFullName, (err, repositoryInfo=null) =>
if (err)
@setStatus "Error", err.message
return
if repositoryInfo.license # The repository already has a license
license = repositoryInfo.license
@setStatus "Error", @repositoryLicense repositoryFullName, license
2018-10-19 08:23:57 +02:00
else # The repository is not licensed
licenseUrl = encodeURIComponent "https://github.com/#{repositoryFullName}/community/license/new?template=#{@licenseId}"
# Provide the chance to the user log-in, since the URL to suggest a license is restricted
window.location.href = "https://github.com/login?return_to=#{licenseUrl}"
2018-10-15 01:21:54 +02:00
@setStatus ""
@inputEl.val("")
# Try to extract the repository full name from the user input
parseUserInput: (userInput) ->
repository = /https?:\/\/github\.com\/(.*?)\/(.+)(\.git)?$/.exec userInput
[_, username, project] = repository
project = project
.split /\/|\.git/
.filter (str) -> str
.slice 0, 1
.join ""
return username + '/' + project
2018-10-15 01:21:54 +02:00
# Displays an indicator and tooltips to the user about the current status
setStatus: (status="", message="") =>
statusClass = status.toLowerCase()
displayTooltip = (status, message) =>
@inputWraper.attr('aria-label', "#{status}: #{message}")
@inputWraper.addClass(@tooltipErrorClasses)
2018-10-15 01:21:54 +02:00
switch status
when "Fetching"
@statusIndicator.removeClass("error #{@tooltipErrorClasses}").addClass(statusClass)
2018-10-15 01:21:54 +02:00
when "Error"
@statusIndicator.removeClass('fetching').addClass(statusClass)
displayTooltip status, message
2018-10-15 01:21:54 +02:00
else
@statusIndicator.removeClass('fetching error')
@inputWraper.removeClass(@tooltipErrorClasses)
2018-10-15 01:21:54 +02:00
# Fetches information about a repository from the Github API
fetchInfoFromGithubAPI: (repositoryFullName, callback) ->
$.getJSON "https://api.github.com/repos/"+repositoryFullName, (info) ->
callback null, info
.fail (e) ->
2018-10-15 01:21:54 +02:00
if e.status == 404
callback new Error "Repository <b>#{repositoryFullName}</b> not found."
else
callback new Error "Network error when trying to get information about <b>#{repositoryFullName}</b>."
2018-10-15 01:21:54 +02:00
# Generates a message showing that a repository is already licensed
repositoryLicense: (repositoryFullName, license) ->
foundLicense = window.licenses.find (lic) -> lic.spdx_id == license.spdx_id
if foundLicense # Links the license to its page on this site
"The repository #{repositoryFullName} is already licensed under the #{foundLicense.title}."
2018-10-15 01:21:54 +02:00
else
"The repository #{repositoryFullName} is already licensed."
2013-07-13 21:18:57 +02:00
$ ->
new Choosealicense()