301 lines
9.6 KiB
CoffeeScript
301 lines
9.6 KiB
CoffeeScript
class @TeambuilderView extends Backbone.View
|
|
template: JST['teambuilder/main']
|
|
teamTemplate: JST['teambuilder/team']
|
|
teamsTemplate: JST['teambuilder/teams']
|
|
pokemonListTemplate: JST['teambuilder/pokemon_list']
|
|
|
|
events:
|
|
# Team view
|
|
'click .add-new-team': 'addNewTeamEvent'
|
|
'click .export-team': 'exportTeam'
|
|
'click .clone-team': 'cloneTeam'
|
|
'click .delete-team': 'deleteTeamEvent'
|
|
'click .go-to-team': 'clickTeam'
|
|
'click .import-team': 'renderImportTeamModal'
|
|
|
|
# Teambuild view
|
|
'click .change-format-dropdown a': 'changeTeamFormat'
|
|
'blur .team_name': 'blurTeamName'
|
|
'keypress .team_name': 'keypressTeamName'
|
|
'click .go_back': 'goBackToOverview'
|
|
'click .pokemon_list li': 'clickPokemon'
|
|
'click .add_pokemon': 'addNewPokemonEvent'
|
|
'click .save_team': 'saveTeam'
|
|
|
|
initialize: (attributes) =>
|
|
@selectedPokemon = 0
|
|
@selectedTeam = null
|
|
|
|
@render()
|
|
|
|
@listenTo(PokeBattle.TeamStore, 'reset', @resetTeams)
|
|
@listenTo(PokeBattle.TeamStore, 'add', @addNewTeam)
|
|
@listenTo(PokeBattle.TeamStore, 'remove', @deleteTeam)
|
|
@listenTo(PokeBattle.TeamStore, 'change:id', @changeTeamId)
|
|
@listenTo(PokeBattle.TeamStore, 'reset', @renderTeams)
|
|
@listenTo(PokeBattle.TeamStore, 'saving', @renderSaving)
|
|
@listenTo(PokeBattle.TeamStore, 'saved', @renderSaved)
|
|
@listenTo PokeBattle.TeamStore, 'render', (team) =>
|
|
@renderTeams()
|
|
if @getSelectedTeam() && team.id == @getSelectedTeam().id
|
|
@setSelectedTeam(team)
|
|
|
|
@pokemonEditView = new PokemonEditView(
|
|
el: @$('.pokemon_edit')
|
|
onPokemonChange: (newPokemon) =>
|
|
team = @getSelectedTeam()
|
|
team.replace(@selectedPokemon, newPokemon)
|
|
@renderPBV()
|
|
)
|
|
|
|
clickTeam: (e) =>
|
|
$team = $(e.currentTarget).closest('.select-team')
|
|
team = PokeBattle.TeamStore.get($team.data('cid'))
|
|
@setSelectedTeam(team)
|
|
|
|
clickPokemon: (e) =>
|
|
$listItem = $(e.currentTarget)
|
|
index = @$('.pokemon_list li').index($listItem)
|
|
@setSelectedPokemonIndex(index)
|
|
|
|
attachEventsToTeam: (team) =>
|
|
return if team.attachedTeambuildEvents
|
|
|
|
@listenTo(team, 'add:pokemon', @renderPokemon)
|
|
|
|
# Todo: Make this perform better
|
|
@listenTo(team, 'change:pokemon[*].species change:pokemon[*].forme', (pokemon) =>
|
|
@renderPokemonList()
|
|
@renderPokemon(pokemon)
|
|
)
|
|
|
|
@listenTo(team, 'add:pokemon remove:pokemon', @renderPokemonList)
|
|
@listenTo(team, 'reset:pokemon', (=> @changeTeam(team)))
|
|
@listenTo(team, 'change nested-change reset:pokemon add:pokemon remove:pokemon', @dirty)
|
|
@listenTo(team, 'change:pokemon[*] reset:pokemon add:pokemon remove:pokemon', @renderPBV)
|
|
|
|
# A temporary flag to attach until the teambuilder view is refactored
|
|
team.attachedTeambuildEvents = true
|
|
|
|
addEmptyPokemon: (team) =>
|
|
team.get('pokemon').add(new NullPokemon())
|
|
|
|
addNewTeamEvent: (e) =>
|
|
team = new Team()
|
|
PokeBattle.TeamStore.add(team)
|
|
team.save()
|
|
|
|
addNewTeam: (team) =>
|
|
@addEmptyPokemon(team) while team.get('pokemon').length < 6
|
|
@$('.teambuilder_teams').append @teamTemplate({team, window})
|
|
@attachEventsToTeam(team)
|
|
|
|
resetTeams: (teamStore) =>
|
|
teamStore.forEach (team) =>
|
|
@attachEventsToTeam(team)
|
|
|
|
cloneTeam: (e) =>
|
|
$team = $(e.currentTarget).closest('.select-team')
|
|
cid = $team.data('cid')
|
|
clone = @getTeam(cid).clone().set("id", null)
|
|
PokeBattle.TeamStore.add(clone)
|
|
clone.save()
|
|
return false
|
|
|
|
deleteTeamEvent: (e) =>
|
|
return false if !confirm("Do you really want to delete this team?")
|
|
$team = $(e.currentTarget).closest('.select-team')
|
|
team = @getTeam($team.data('cid'))
|
|
PokeBattle.TeamStore.remove(team)
|
|
team.destroy()
|
|
return false
|
|
|
|
deleteTeam: (team) =>
|
|
@$(".select-team[data-cid=#{team.cid}]").remove()
|
|
|
|
changeTeam: (team) =>
|
|
html = $(@teamTemplate({team, window})).html()
|
|
@$(".select-team[data-cid=#{team.cid}]").html(html)
|
|
|
|
changeTeamId: (team) =>
|
|
@$(".select-team[data-cid=#{team.cid}]").attr('data-id', team.id)
|
|
|
|
exportTeam: (e) =>
|
|
$team = $(e.currentTarget).closest('.select-team')
|
|
id = $team.data('id')
|
|
if not @getTeam(id).hasNonNullPokemon()
|
|
alert("You cannot export empty teams. Please add some pokemon first.")
|
|
return false
|
|
|
|
teamJSON = @getTeam(id).toNonNullJSON()
|
|
teamString = PokeBattle.exportTeam(teamJSON.pokemon)
|
|
|
|
$modal = PokeBattle.modal('modals/export_team')
|
|
$modal.find('.exported-team').val(teamString)
|
|
$modal.find('textarea, input').first().focus().select()
|
|
return false
|
|
|
|
addNewPokemonEvent: =>
|
|
@addNewPokemon(@getSelectedTeam())
|
|
|
|
addNewPokemon: (team) =>
|
|
@addEmptyPokemon(team)
|
|
@$('.pokemon_list li').last().click()
|
|
|
|
saveTeam: =>
|
|
clone = @getSelectedTeam()
|
|
team = PokeBattle.TeamStore.get(clone.id)
|
|
team.save(clone.toJSON(), silent: true)
|
|
@resetHeaderButtons()
|
|
|
|
changeTeamFormat: (e) =>
|
|
$link = $(e.currentTarget)
|
|
format = $link.data('format')
|
|
team = @getSelectedTeam()
|
|
if format != team.get('generation')
|
|
team.set('generation', format)
|
|
@renderTeam()
|
|
@dirty() # renderTeam() removes dirty, so call it again
|
|
|
|
setSelectedPokemonIndex: (index) =>
|
|
pokemon = @getSelectedTeam().at(index)
|
|
@selectedPokemon = index
|
|
|
|
# Render the pokemon
|
|
@pokemonEditView.setPokemon(pokemon)
|
|
@renderPokemon(pokemon)
|
|
|
|
# Set the correct list item to active
|
|
@$(".navigation li").removeClass("active")
|
|
@$(".navigation li").eq(index).addClass("active")
|
|
|
|
getSelectedPokemon: =>
|
|
@getSelectedTeam().at(@selectedPokemon)
|
|
|
|
setSelectedTeam: (team) =>
|
|
# Duplicate the team, so that changes don't stick until saved
|
|
@selectedTeam = team.clone()
|
|
@selectedTeam.id = team.id
|
|
@selectedTeam.cid = team.cid
|
|
@selectedPokemon = 0
|
|
@attachEventsToTeam(@selectedTeam)
|
|
@renderTeam()
|
|
|
|
getAllTeams: =>
|
|
PokeBattle.TeamStore.models
|
|
|
|
getSelectedTeam: =>
|
|
@selectedTeam
|
|
|
|
getTeam: (idx) =>
|
|
PokeBattle.TeamStore.get(idx)
|
|
|
|
blurTeamName: =>
|
|
teamName = @$('.team_name').text()
|
|
@getSelectedTeam().set('name', teamName)
|
|
|
|
keypressTeamName: (e) =>
|
|
if e.which == 13 # [Enter]
|
|
@$('.team_name').blur()
|
|
|
|
goBackToOverview: =>
|
|
@renderTeams()
|
|
|
|
dirty: =>
|
|
@$('.go_back').text('Discard changes')
|
|
@$('.save_team').removeClass('disabled')
|
|
|
|
resetHeaderButtons: =>
|
|
@$('.go_back').text('Back')
|
|
@$('.save_team').addClass('disabled')
|
|
|
|
render: =>
|
|
@$el.html @template(pokemon: @getSelectedTeam(), selected: @selectedPokemon)
|
|
@renderTeams()
|
|
|
|
renderTeams: =>
|
|
@$('.display_teams').html @teamsTemplate(teams: @getAllTeams(), window: window)
|
|
@$('.display_teams').removeClass('hidden')
|
|
@$('.display_pokemon').addClass('hidden')
|
|
this
|
|
|
|
renderTeam: =>
|
|
team = @getSelectedTeam()
|
|
@pokemonEditView.setFormat(team.get('generation') || DEFAULT_FORMAT)
|
|
@resetHeaderButtons()
|
|
@renderFormat()
|
|
@renderPokemonList()
|
|
@setSelectedPokemonIndex(@selectedPokemon)
|
|
@$('.team_name').text(team.getName())
|
|
@$('.display_teams').addClass('hidden')
|
|
@$('.display_pokemon').removeClass('hidden')
|
|
|
|
renderPokemonList: =>
|
|
team = @getSelectedTeam()
|
|
$pokemon_list = @$(".pokemon_list").empty()
|
|
$pokemon_list.html @pokemonListTemplate(window: window, pokemonList: team.get('pokemon').models)
|
|
$pokemon_list.find("li[data-pokemon-index=#{@selectedPokemon}]").addClass("active")
|
|
|
|
# NOTE: this isn't be used, and just amounts to hiding the button, however
|
|
# we may re-enable this functionality in the future
|
|
# Hide add pokemon if there's 6 pokemon
|
|
if team.length < 6
|
|
@$(".add_pokemon").show()
|
|
else
|
|
@$(".add_pokemon").hide()
|
|
|
|
renderPokemon: (pokemon) =>
|
|
@pokemonEditView.setPokemon(pokemon)
|
|
|
|
renderPBV: (pokemon) =>
|
|
if pokemon
|
|
individualPBV = pokemon.getPBV()
|
|
$listItem = @$(".pokemon_list li[data-pokemon-cid=#{pokemon.cid}]")
|
|
$listItem.find(".pbv-value").text(individualPBV)
|
|
|
|
totalPBV = @getSelectedTeam().getPBV()
|
|
@pokemonEditView.setTeamPBV(totalPBV)
|
|
@pokemonEditView.renderPBV()
|
|
|
|
renderFormat: =>
|
|
format = @getSelectedTeam().get("generation")
|
|
format = DEFAULT_FORMAT if format not of Formats
|
|
text = @$(".change-format-dropdown a[data-format='#{format}']").text()
|
|
@$(".current-format").text(text)
|
|
|
|
renderImportTeamModal: =>
|
|
$modal = PokeBattle.modal 'modals/import_team', ($modal) =>
|
|
$modal.on 'click', '.import-team-submit', (e) =>
|
|
teamString = $modal.find('.imported-team').val()
|
|
pokemonJSON = PokeBattle.parseTeam(teamString)
|
|
errors = @validateImportedTeam(pokemonJSON)
|
|
if errors.length > 0
|
|
listErrors = errors.map((e) -> "<li>#{e}</li>").join('')
|
|
$errors = $modal.find('.form-errors')
|
|
$errors.html("<ul>#{listErrors}</ul>").removeClass('hidden')
|
|
else
|
|
team = new Team(pokemon: pokemonJSON, teambuilder: true)
|
|
PokeBattle.TeamStore.add(team)
|
|
team.save()
|
|
$modal.find('.imported-team').val("")
|
|
$modal.modal('hide')
|
|
return false
|
|
$modal.find('.imported-team').first().focus()
|
|
|
|
validateImportedTeam: (json) =>
|
|
errors = []
|
|
pokemonSpecies = (pokemon.species for pokemon in json)
|
|
{SpeciesData} = window.Generations[DEFAULT_GENERATION.toUpperCase()]
|
|
pokemonSpecies = pokemonSpecies.filter((s) -> s not of SpeciesData)
|
|
if pokemonSpecies.length > 0
|
|
errors.push(pokemonSpecies.map((n) -> "#{n} is not a valid Pokemon.")...)
|
|
return errors
|
|
return errors
|
|
|
|
renderSaving: (team) =>
|
|
$team = $(".select-team[data-cid='#{team.cid}']")
|
|
$team.find('.show_spinner').removeClass('hidden')
|
|
|
|
renderSaved: (team) =>
|
|
$team = $(".select-team[data-cid='#{team.cid}']")
|
|
$team.find('.show_spinner').addClass('hidden') |