OpenFn/OpenFn-Site

View on GitHub
app/assets/javascripts/the_bridge_ng/controllers/product_ctrl.js.coffee

Summary

Maintainability
Test Coverage
@controllerModule.controller 'ProductController', ['$scope', '$location', '$modal', '$http', '$routeParams', '$timeout', ($scope, $location, $modal, $http, $routeParams, $timeout) ->
  $scope.product = {}
  $scope.searchText = ""
  $scope.searchTagText = ""
  $scope.editTags = false
  $scope.added_tags = []
  $scope.tags_added = []
  $scope.deleted_tags = []
  $scope.tags_deleted = []
  $scope.loggedIn = false
  id = $routeParams.id

  if id != undefined
    $http.get('/products/' + $routeParams.id + '.json').success((data) ->
      $scope.product = data
      productTags($scope.product)
      # TODO - figure out the weirdness behind product.reviews.
      # The column is empty in all DBs, but this line breaks without it.
      $scope.product.reviews_count = $scope.product.reviews.length
      $scope.productRating($scope.product)
      $scope.tabs = [
        { title:'Description', content: $scope.product.detailed_description },
        { title:'Costs', content: $scope.product.costs, disabled: true },
        { title:'Tech Specs', content: $scope.product.tech_specs, disabled: true },
        { title:'Resources', content: $scope.product.resources, disabled: true }
      ];
      
    )


  $scope.checkVote = (review) ->
    console.log(review)
    $http.get('/review/'+review.id+'/check_vote.json').success (data) ->
      review.voted = data

  $scope.changeVoteFor = (product) ->
    url = $location.url()
    $http.get("/user/check_login?redirect=#{url}").success((data) ->
      if data.status == 'login'
        $scope.showModal()
      else
        $http.get("/products/#{product.id}/vote")
          .success (data) ->
            angular.extend(product,data)
        
          .error (data, status, headers, config) ->
            window.location="/login" if status == 401
      )

  $scope.changeReviewFor = (product) ->
    $http.get("/products/#{product.id}/review")
      .success (data) ->
        angular.extend(product,data)

      .error (data, status, headers, config) ->
        $scope.showModal() if status == 401
        # console.log arguments

  $scope.searchAgain = () ->
    $location.path('/marketplace/search/' + $scope.searchText)

  $scope.productRating = (product) ->
    $http.get("/product/#{product.id}/rating").success((data) ->
      $scope.product.rating = data
  )

      #The else is used so that the review modal is hidden if the user is not logged in
      #Todo: need to call the "write a review" modal here, rather than in the view
  $scope.addReview = (path) ->
      url = if path? then path else $location.url() 

      $http.get("/user/check_login?redirect=#{url}").success((data) ->
        if data.status == 'login'
          $scope.showModal()
        else
          $scope.loggedIn = true
      )


  $scope.vote = (review, up_or_down) ->
    $scope.checkLogin()
    update_vote = false
    create_vote = false
    if up_or_down && (review.voted == -1)
      review.review_score = review.review_score + 2
      review.voted = 1
      update_vote = true
    else if up_or_down && (review.voted == 0)
      review.review_score = review.review_score + 1
      review.voted = 1
      create_vote = true
    else if !up_or_down && (review.voted == 1)
      review.review_score = review.review_score - 2
      review.voted = -1
      update_vote = true
    else if !up_or_down && (review.voted == 0)
      review.review_score = review.review_score - 1
      review.voted = -1
      create_vote = true
    if update_vote || create_vote
      $http.get('review/vote/'+review.id, {params: {vote: review.voted, update: update_vote, create: create_vote}})


  $scope.reviewScore = (review,product) ->
    $http.get("/review/#{review.id}/score").success((data) ->
      i = 0
      while i < product.reviews.length
        if product.reviews[i].id == review.id
          $scope.product.reviews[i].review_score = data
        i++
  )

  $scope.submitReview = (product)->
    $scope.review =
      'review': $scope.post.review
      'rating': $scope.post.rating
      'product_id': product.id

    $http.post("/products/#{product.id}/review/new",$scope.review).success((data) ->
      if data.status == 'duplicate'
        $scope.duplicate_status = true

      if data.status == 'success'
        $scope.success_status = true
        window.location = data.redirect_url
    )

  

  $star_rating = $('.star-rating .fa')

  SetRatingStar = ->
    $star_rating.each ->
      if parseInt($star_rating.siblings('input.rating-value').val()) >= parseInt($(this).data('rating'))
        $(this).removeClass('fa-star-o').addClass('fa-star')
      else
        $(this).removeClass('fa-star').addClass('fa-star-o')

  $star_rating.on 'click', ->
      $star_rating.siblings('input.rating-value').val $(this).data('rating')
      SetRatingStar()

  SetRatingStar()


  productTags = (product) ->
    $http.get("/products/#{product.id}/tags").success((data) ->
      $scope.product.deep_tag_list = data.tags
    )


    $http.get("/tags/get_all").success((data) ->
      $scope.tags = data.tags
     )

  $scope.deleteTag = (tag,product) ->
    index = $scope.product.deep_tag_list.indexOf(tag)
    $scope.product.deep_tag_list.splice(index, 1);
    i = 0
    addToArray = true
    while i < $scope.added_tags.length
      if $scope.added_tags[i].name == tag.name
        addToArray = false
      i++
    if addToArray
      $scope.deleted_tags.push tag
    $scope.tags_deleted = JSON.stringify($scope.deleted_tags)

  $scope.addTag = (tag,product) ->
    addToArray = true
    i = 0
    while i < $scope.product.deep_tag_list.length
      if $scope.product.deep_tag_list[i].name == tag.name
        addToArray = false
      i++
    if addToArray
      $scope.product.deep_tag_list.push tag
      $scope.added_tags.push tag
    $scope.tags_added = JSON.stringify($scope.added_tags)

  $scope.searchTags = (tagText,product) ->
    $scope.tag_match = []
    lowercaseSearchText = angular.lowercase($scope.searchTagText)
    x = 0
    if (lowercaseSearchText)
      $scope.new_tag = false
      while x < $scope.tags.length
        value = $scope.tags[x].name.toLowerCase().search(lowercaseSearchText)
        if (value > -1)
          i = 0
          unique = true
          while i < $scope.product.deep_tag_list.length
            if $scope.tags[x].name == $scope.product.deep_tag_list[i].name
              unique = false
            i++
          if unique
            $scope.tag_match.push $scope.tags[x]
            $scope.new_tag = false
        x++
        if lowercaseSearchText !=  $scope.tags[x].name.toLowerCase()
          $scope.new_tag = true
          $scope.newTag = lowercaseSearchText
        else
          $scope.new_tag = false
    else
      $scope.tag_match = []
      $scope.new_tag = false


  $scope.addNewTag = (product) ->
    newTagName =
      'name': $scope.newTag
    $http.post("/products/#{product.id}/tags/add",newTagName).success((data) ->
      if data.status == 'login'
        $scope.showModal()
      productTags(product)
    )

  $scope.showEditTagsBox = () ->
    $http.get("/user/check_login").success((data) ->
      if data.status == 'login'
        $scope.showModal()
      else
        $scope.editTags = true
    )


# TODO: Eventually, we will want to turn showModal and checkLogin into services
  $scope.showModal = () ->
    modalInstance = $modal.open
      templateUrl: 'modalTemplate.html',
      controller: 'ModalController'


  $scope.checkLogin = (path) ->
    redirect = if path? then true else false
    url = if path? then path else $location.url()
    $http.get("/user/check_login?redirect=#{url}").success((data) ->
      if data.status == 'login'
        $scope.showModal()
      else
        if redirect
          window.location = url
        else
          $scope.loggedIn = true
        )

  $scope.editProduct = (product) ->
    url = "/product/#{product.id}/edit"
    $scope.checkLogin(url)

  $scope.updateProduct = (product) ->
    productEdit =
      'id': product.id
      'name': product.name
      'email': product.email
      'website': product.website
      'twitter': product.twitter
      'description': product.description
      'detailed_description': product.detailed_description
      'tech_specs': product.tech_specs
      'costs': product.costs
      'resources': product.resources
      'logo_url': product.logo_url

    $http.post("/admin/products/#{product.id}/tags/add",$scope.tags_added).success((data) ->
    )

    $http.post("/admin/products/#{product.id}/tags/delete",$scope.tags_deleted).success((data) ->
    )

    $http.post("/products/#{product.id}/admin_edit",productEdit).success((data) ->
      window.location = "/product/#{product.id}"
    )

  $scope.newProduct = ()->
    $http.post("/products/admin_new", $scope.product).success((data) ->
      window.location = "/marketplace"
    )

]