diff --git a/web/app/assets/javascripts/jam_track_screen.js.coffee b/web/app/assets/javascripts/jam_track_screen.js.coffee
index d2f1f21a0..9aaedfe3a 100644
--- a/web/app/assets/javascripts/jam_track_screen.js.coffee
+++ b/web/app/assets/javascripts/jam_track_screen.js.coffee
@@ -20,8 +20,8 @@ context.JK.JamTrackScreen=class JamTrackScreen
@currentPage = 0
@next = null
@currentQuery = this.defaultQuery()
- @expanded = false
-
+ @expanded = null
+
beforeShow:(data) =>
this.setFilterFromURL()
this.refresh()
@@ -67,10 +67,10 @@ context.JK.JamTrackScreen=class JamTrackScreen
refresh:() =>
@currentQuery = this.buildQuery()
that = this
- rest.getJamtracks(@currentQuery).done((response) ->
+ rest.getJamtracks(@currentQuery).done((response) =>
that.clearResults()
that.handleJamtrackResponse(response)
- ).fail (jqXHR) ->
+ ).fail (jqXHR) =>
that.clearResults()
that.noMoreJamtracks.show()
that.app.notifyServerError jqXHR, 'Jamtrack Unavailable'
@@ -118,7 +118,7 @@ context.JK.JamTrackScreen=class JamTrackScreen
# if we less results than asked for, end searching
@scroller.infinitescroll 'pause'
if @currentPage == 0 and response.jamtracks.length == 0
- @content.append '
There\'s no jamtracks.
'
+ @content.append 'No JamTracks found.
'
if @currentPage > 0
@noMoreJamtracks.show()
# there are bugs with infinitescroll not removing the 'loading'.
@@ -131,6 +131,7 @@ context.JK.JamTrackScreen=class JamTrackScreen
registerInfiniteScroll:() =>
+ that = this
@scroller.infinitescroll {
behavior: 'local'
navSelector: '#jamtrackScreen .btn-next-pager'
@@ -143,10 +144,10 @@ context.JK.JamTrackScreen=class JamTrackScreen
loading:
msg: $('Loading ...
')
img: '/assets/shared/spinner.gif'
- path: (page) ->
- '/api/jamtracks?' + $.param(this.buildQuery())
+ path: (page) =>
+ '/api/jamtracks?' + $.param(that.buildQuery())
- }, (json, opts) ->
+ }, (json, opts) =>
this.handleJamtrackResponse(json)
@scroller.infinitescroll 'resume'
@@ -156,7 +157,7 @@ context.JK.JamTrackScreen=class JamTrackScreen
addToCartJamtrack:(e) =>
e.preventDefault()
params = id: $(e.target).attr('data-jamtrack-id')
- rest.addJamtrackToShoppingCart(params).done((response) ->
+ rest.addJamtrackToShoppingCart(params).done((response) =>
context.location = '/client#/shoppingCart'
).fail @app.ajaxError
@@ -165,33 +166,61 @@ context.JK.JamTrackScreen=class JamTrackScreen
@app.layout.showDialog 'jamtrack-availability-dialog'
registerEvents:() =>
- @screen.find('.jamtrack-detail-btn').on 'click', this.showJamtrackDescription
+ #@screen.find('.jamtrack-detail-btn').on 'click', this.showJamtrackDescription
@screen.find('.play-button').on 'click', this.playJamtrack
@screen.find('.jamtrack-add-cart').on 'click', this.addToCartJamtrack
@screen.find('.license-us-why').on 'click', this.licenseUSWhy
@screen.find('.jamtrack-detail-btn').on 'click', this.toggleExpanded
-
+ # @screen.find('.jamtrack-preview').each (index, element) =>
+ # new JK.JamTrackPreview(data.app, $element, jamTrack, track, {master_shows_duration: true})
+
+ rerenderJamtracks:() =>
+ if @currentData?
+ @clearResults()
+ @renderJamtracks(@currentData)
+ false
+
renderJamtracks:(data) =>
+ @currentData = data
that = this
for jamtrack in data.jamtracks
+ jamtrackExpanded = this.expanded==jamtrack.id
+ trackRow = _.clone(jamtrack)
+ trackRow.track_cnt = jamtrack.tracks.length
+ trackRow.tracks = []
for track in jamtrack.tracks
- continue if track.track_type=='Master'
- inst = '../assets/content/icon_instrument_default24.png'
- if track.instrument.id in instrument_logo_map
- inst = instrument_logo_map[track.instrument.id].asset
- track.instrument_url = inst
- track.instrument_desc = track.instrument.description
- if track.part != ''
- track.instrument_desc += ' (' + track.part + ')'
+ if track.track_type != 'Master'
+ trackRow.tracks.push(track)
+ if track.track_type=='Master'
+ track.instrument_desc = "Master"
+ else
+ inst = '../assets/content/icon_instrument_default24.png'
+ if track.instrument?
+ if track.instrument.id in instrument_logo_map
+ inst = instrument_logo_map[track.instrument.id].asset
+ track.instrument_desc = track.instrument.description
+ track.instrument_url = inst
+
+ if track.part != ''
+ track.instrument_desc += ' (' + track.part + ')'
options =
- jamtrack: jamtrack
- expanded: that.expanded
-
+ jamtrack: trackRow
+ expanded: jamtrackExpanded
@jamtrackItem = $(context._.template($('#template-jamtrack').html(), options, variable: 'data'))
- that.renderJamtrack(@jamtrackItem)
+ that.renderJamtrack(@jamtrackItem, jamtrack)
+
this.registerEvents()
+ renderJamtrack:(jamtrackElement, jamTrack) =>
+ @content.append jamtrackElement
+
+ if this.expanded==jamTrack.id
+ for track in jamTrack.tracks
+ trackRow = jamtrackElement.find("[jamtrack-track-id='#{track.id}']")
+ previewElement = trackRow.find(".jamtrack-preview")
+ new JK.JamTrackPreview(@app, previewElement, jamTrack, track, {master_shows_duration: false})
+
showJamtrackDescription:(e) =>
e.preventDefault()
@description = $(e.target).parent('.detail-arrow').next()
@@ -200,13 +229,16 @@ context.JK.JamTrackScreen=class JamTrackScreen
else
@description.hide()
- toggleExpanded:() =>
- this.expanded = !this.expanded
- this.refresh()
-
- renderJamtrack:(jamtrack) =>
- @content.append jamtrack
-
+ toggleExpanded:(e) =>
+ e.preventDefault()
+ jamtrackRecord = $(e.target).parents('.jamtrack-record')
+ jamTrackId = jamtrackRecord.attr("jamtrack-id")
+ if this.expanded==jamTrackId
+ this.expanded = null
+ else
+ this.expanded = jamTrackId
+ this.rerenderJamtracks()
+
initialize:() =>
screenBindings =
'beforeShow': this.beforeShow
diff --git a/web/app/assets/javascripts/jamtrack.js.coffee b/web/app/assets/javascripts/jamtrack.js.coffee
deleted file mode 100644
index 95a1c89f0..000000000
--- a/web/app/assets/javascripts/jamtrack.js.coffee
+++ /dev/null
@@ -1,243 +0,0 @@
-$ = jQuery
-context = window
-context.JK ||= {}
-
-context.JK.JamTrackScreen=class JamTrackScreen
- LIMIT = 10
- instrument_logo_map = context.JK.getInstrumentIconMap24()
-
- constructor: (@app) ->
- @logger = context.JK.logger
- @screen = null
- @content = null
- @scroller = null
- @genre = null
- @artist = null
- @instrument = null
- @availability = null
- @nextPager = null
- @noMoreJamtracks = null
- @currentPage = 0
- @next = null
- @currentQuery = this.defaultQuery()
- @expanded = false
-
- beforeShow:(data) =>
- this.setFilterFromURL()
- this.refresh()
-
- afterShow:(data) =>
-
- events:() =>
- @genre.on 'change', this.search
- @artist.on 'change', this.search
- @instrument.on 'change', this.search
- @availability.on 'change', this.search
-
- clearResults:() =>
- #$logger.debug("CLEARING CONTENT")
- @currentPage = 0
- @content.empty()
- @noMoreJamtracks.hide()
- @next = null
-
- setFilterFromURL:() =>
- # Grab parms from URL for artist, instrument, and availability
- parms=this.getParams()
- this.logger.debug("parms", parms)
- if(parms.artist?)
- @artist.val(parms.artist)
- if(parms.instrument?)
- @instrument.val(parms.instrument)
- if(parms.availability?)
- @availability.val(parms.availability)
- window.history.replaceState({}, "", "/client#/jamtrack")
-
- getParams:() =>
- params = {}
- q = window.location.href.split("?")[1]
- if q?
- q = q.split('#')[0]
- raw_vars = q.split("&")
- for v in raw_vars
- [key, val] = v.split("=")
- params[key] = decodeURIComponent(val)
- params
-
- refresh:() =>
- @currentQuery = this.buildQuery()
- that = this
- rest.getJamtracks(@currentQuery).done((response) ->
- that.clearResults()
- that.handleJamtrackResponse(response)
- ).fail (jqXHR) ->
- that.clearResults()
- that.noMoreJamtracks.show()
- that.app.notifyServerError jqXHR, 'Jamtrack Unavailable'
-
- search:() =>
- this.refresh()
- false
-
- defaultQuery:() =>
- query =
- per_page: LIMIT
- page: @currentPage+1
- if @next
- query.since = @next
- query
-
- buildQuery:() =>
- @currentQuery = this.defaultQuery()
- # genre filter
- # var genres = @screen.find('#jamtrack_genre').val()
- # if (genres !== undefined) {
- # @currentQuery.genre = genres
- # }
- # instrument filter
-
- instrument = @instrument.val()
- if instrument?
- @currentQuery.instrument = instrument
-
- # artist filter
- art = @artist.val()
- if art?
- @currentQuery.artist = art
-
- # availability filter
- availability = @availability.val()
- if availability?
- @currentQuery.availability = availability
- @currentQuery
-
- handleJamtrackResponse:(response) =>
- #logger.debug("Handling response", JSON.stringify(response))
- @next = response.next
- this.renderJamtracks(response)
- if response.next == null
- # if we less results than asked for, end searching
- @scroller.infinitescroll 'pause'
- if @currentPage == 0 and response.jamtracks.length == 0
- @content.append 'There\'s no jamtracks.
'
- if @currentPage > 0
- @noMoreJamtracks.show()
- # there are bugs with infinitescroll not removing the 'loading'.
- # it's most noticeable at the end of the list, so whack all such entries
- $('.infinite-scroll-loader').remove()
- else
- @currentPage++
- this.buildQuery()
- this.registerInfiniteScroll()
-
-
- registerInfiniteScroll:() =>
- @scroller.infinitescroll {
- behavior: 'local'
- navSelector: '#jamtrackScreen .btn-next-pager'
- nextSelector: '#jamtrackScreen .btn-next-pager'
- binder: @scroller
- dataType: 'json'
- appendCallback: false
- prefill: false
- bufferPx: 100
- loading:
- msg: $('Loading ...
')
- img: '/assets/shared/spinner.gif'
- path: (page) ->
- '/api/jamtracks?' + $.param(this.buildQuery())
-
- }, (json, opts) ->
- this.handleJamtrackResponse(json)
- @scroller.infinitescroll 'resume'
-
- playJamtrack:(e) =>
- e.preventDefault()
-
- addToCartJamtrack:(e) =>
- e.preventDefault()
- params = id: $(e.target).attr('data-jamtrack-id')
- rest.addJamtrackToShoppingCart(params).done((response) ->
- context.location = '/client#/shoppingCart'
- ).fail @app.ajaxError
-
- licenseUSWhy:(e) =>
- e.preventDefault()
- @app.layout.showDialog 'jamtrack-availability-dialog'
-
- registerEvents:() =>
- @screen.find('.jamtrack-detail-btn').on 'click', this.showJamtrackDescription
- @screen.find('.play-button').on 'click', this.playJamtrack
- @screen.find('.jamtrack-add-cart').on 'click', this.addToCartJamtrack
- @screen.find('.license-us-why').on 'click', this.licenseUSWhy
- @screen.find('.jamtrack-detail-btn').on 'click', this.toggleExpanded
-
- renderJamtracks:(data) =>
- that = this
- for jamtrack in data.jamtracks
- for track in jamtrack.tracks
- continue if track.track_type=='Master'
- inst = '../assets/content/icon_instrument_default24.png'
- if track.instrument.id in instrument_logo_map
- inst = instrument_logo_map[track.instrument.id].asset
- track.instrument_url = inst
- track.instrument_desc = track.instrument.description
- if track.part != ''
- track.instrument_desc += ' (' + track.part + ')'
-
- options =
- jamtrack: jamtrack
- expanded: that.expanded
-
- @jamtrackItem = $(context._.template($('#template-jamtrack').html(), options, variable: 'data'))
- that.renderJamtrack(@jamtrackItem)
- this.registerEvents()
-
- showJamtrackDescription:(e) =>
- e.preventDefault()
- @description = $(e.target).parent('.detail-arrow').next()
- if @description.css('display') == 'none'
- @description.show()
- else
- @description.hide()
-
- toggleExpanded:() =>
- this.expanded = !this.expanded
- this.refresh()
-
- renderJamtrack:(jamtrack) =>
- @content.append jamtrack
-
- initialize:() =>
- screenBindings =
- 'beforeShow': this.beforeShow
- 'afterShow': this.afterShow
- @app.bindScreen 'jamtrack', screenBindings
- @screen = $('#jamtrack-find-form')
- @scroller = @screen.find('.content-body-scroller')
- @content = @screen.find('.jamtrack-content')
- @genre = @screen.find('#jamtrack_genre')
- @artist = @screen.find('#jamtrack_artist')
- @instrument = @screen.find('#jamtrack_instrument')
- @availability = @screen.find('#jamtrack_availability')
- @nextPager = @screen.find('a.btn-next-pager')
- @noMoreJamtracks = @screen.find('.end-of-jamtrack-list')
- if @screen.length == 0
- throw new Error('@screen must be specified')
- if @scroller.length == 0
- throw new Error('@scroller must be specified')
- if @content.length == 0
- throw new Error('@content must be specified')
- if @noMoreJamtracks.length == 0
- throw new Error('@noMoreJamtracks must be specified')
- #if(@genre.length == 0) throw new Error("@genre must be specified")
-
- if @artist.length == 0
- throw new Error('@artist must be specified')
- if @instrument.length == 0
- throw new Error('@instrument must be specified')
- if @availability.length == 0
- throw new Error('@availability must be specified')
- this.events()
-
-
diff --git a/web/app/assets/stylesheets/client/jamtrack.css.scss b/web/app/assets/stylesheets/client/jamtrack.css.scss
index d63839387..b1aaf02e5 100644
--- a/web/app/assets/stylesheets/client/jamtrack.css.scss
+++ b/web/app/assets/stylesheets/client/jamtrack.css.scss
@@ -90,13 +90,13 @@
}
.jamtrack-record {
- border-bottom: 1px solid black;
+ //border-bottom: 1px solid black;
text-align: left;
}
.jamtrack-detail {
+ width: 35%;
@include border_box_sizing;
- float: left;
width: 30%;
padding: 10px 0px;
.detail-label {
@@ -127,22 +127,21 @@
.jamtrack-description {
display: none;
}
+
+ }
- .jamtrack-detail-btn {
- cursor: pointer;
- margin-top: 7px;
- margin-right: 5px;
- padding-top: 5px;
- vertical-align: bottom;
- }
+ .jamtrack-detail-btn {
+ cursor: pointer;
+ margin-top: 7px;
+ margin-right: 5px;
+ padding-top: 5px;
+ vertical-align: bottom;
}
.jamtrack-tracks {
@include border_box_sizing;
- float: left;
- width: 50%;
- padding: 10px 0px;
-
+ width: 35%;
+ padding: 10px 0px;
.tracks-caption {
margin-top: 5px;
margin-bottom: 10px;
@@ -163,14 +162,17 @@
margin-left: 10px;
}
}
+
+ .jamtrack-track {
+ margin-left: 7px;
+ }
.jamtrack-action {
@include border_box_sizing;
- float: left;
- width: 20%;
- padding: 10px 0px;
+ width: 35%;
+ // padding: 0px 0px;
text-align: center;
-
+ // vertical-align: top;
.play-button {
margin-top: 5px;
}
diff --git a/web/app/views/clients/_jamtrack.html.slim b/web/app/views/clients/_jamtrack.html.slim
index 79e2cf17e..6cf0504e2 100644
--- a/web/app/views/clients/_jamtrack.html.slim
+++ b/web/app/views/clients/_jamtrack.html.slim
@@ -9,30 +9,24 @@
=render(:partial => "web_filter", :locals => {:search_type => Search::PARAM_JAMTRACK})
.filter-body
.content-body-scroller
- .profile-wrapper
- .jamtrack-content
+ .profile-wrapper
+ table.generaltable
+ thead
+ tr
+ th JAMTRACK
+ th TRACKS INCLUDED/PREVIEW
+ th SHOP
+ tbody.jamtrack-content
a.btn-next-pager href="/api/jamtracks?page=1" Next
.end-of-jamtrack-list.end-of-list="No more Jamtracks"
script#template-jamtrack type='text/template'
- .jamtrack-record jamtrack-id="{{data.jamtrack.id}}"
- .top_bar
- .jamtrack-detail.jamtrack-header JAMTRACK
- .jamtrack-tracks.jamtrack-header TRACKS INCLUDED/PREVIEW
- .jamtrack-action.jamtrack-header SHOP
- .jamtrack-detail
+ tr.jamtrack-record jamtrack-id="{{data.jamtrack.id}}"
+ td.jamtrack-detail
.detail-label
| Title:
.detail-value
| {{data.jamtrack.name}}
- / .clearall.detail-label
- / | Type:
- / .detail-value
- / | {{data.jamtrack.recording_type}}
- / .clearall.detail-label
- / | Original Artist:
- / .detail-value
- / | {{data.jamtrack.original_artist}}
.clearall.detail-label
| Original Artist:
.detail-value
@@ -55,46 +49,27 @@ script#template-jamtrack type='text/template'
.detail-value
| {{data.jamtrack.description}}
="{% } %}"
-
-
- / / / .clearall.detail-label
- / | Copyright:
- / .copyright-value
- / ="{% if (data.jamtrack.licensor !=null) { %}"
- / | {{data.jamtrack.licensor.name}}
- / ="{% }; %}"
- / .clearall.jamtrack-description
- / .detail-label
- / | Description
- / .detail-value
- / | {{data.jamtrack.description}}
- / .clearall
- .jamtrack-tracks
- / .tracks-caption
- / | Tracks in This Recording:
- ="{% counter = 0 %}"
- ="{% _.each(data.jamtrack.tracks, function(track) { %}"
- ="{% if(track.track_type == JK.MASTER_TRACK) return; %}"
- .track-instrument href="{{track.url_44}}"
- .instrument-image
- img src="/assets/shared/play_button.png" width=24 height=24
- .instrument-image
- img src="{{track.instrument_url}}" width=24 height=24
- .instrument-desc
- | {{track.instrument_desc}}
- .clearall
- ="{% }); %}"
+ td.jamtrack-tracks
.detail-arrow
- .jamtrack-detail-btn
+ .jamtrack-detail-btn.orange
="{% if (data.expanded) { %}"
- | hide tracks
- =image_tag("up_arrow.png")
+ | hide tracks ({{data.jamtrack.tracks.length}})
+ a.details-arrow.arrow-up-orange
="{% } else { %}"
- | preview all tracks
- =image_tag("down_arrow.png")
+ | show tracks ({{data.jamtrack.tracks.length}})
+ a.details-arrow.arrow-down-orange
="{% } %}"
-
- .jamtrack-action
+ ="{% if (data.expanded) { %}"
+ ="{% _.each(data.jamtrack.tracks, function(track) { %}"
+ .jamtrack-track jamtrack-track-id="{{track.id}}"
+ / .instrument-desc
+ / | {{track.instrument_desc}}
+ /.track-instrument
+ .jamtrack-preview
+ .clearall
+ ="{% }); %}"
+ ="{% } %}"
+ td.jamtrack-action
/ a.play-button href="#" data-jamtrack-id="{{data.jamtrack.id}}"
/ =image_tag "shared/play_button.png"
.jamtrack-price
@@ -108,7 +83,6 @@ script#template-jamtrack type='text/template'
="{% }; %}"
="{% if (data.jamtrack.sales_region==JK.AVAILABILITY_US) { %}"
.jamtrack-license
- | This JamTrack available only to US customers.
- a.license-us-why href="#", why?
+ | This JamTrack available only to US customers.
+ a.license-us-why.orange href="#" why?
="{% }; %}"
- .clearall
diff --git a/web/spec/features/jamtrack_shopping_spec.rb b/web/spec/features/jamtrack_shopping_spec.rb
index daeb34152..95f887979 100644
--- a/web/spec/features/jamtrack_shopping_spec.rb
+++ b/web/spec/features/jamtrack_shopping_spec.rb
@@ -49,15 +49,12 @@ describe "JamTrack Shopping", :js => true, :type => :feature, :capybara_feature
find('#jamtrack-availability-dialog #dialog-close-button').trigger(:click)
end
- jamtrack.jam_track_tracks.each do |track|
- jamtrack_record.find('.instrument-desc', "#{track.instrument.description} ( #{track.part} }")
- end
-
if options[:added_cart]
jamtrack_record.find('a.jamtrack-add-cart-disabled', text: 'Already In Cart')
else
jamtrack_record.find('a.jamtrack-add-cart.button-orange', text: 'Add to Cart')
end
+ jamtrack_record
end
def not_find_jamtrack jamtrack
@@ -144,5 +141,16 @@ describe "JamTrack Shopping", :js => true, :type => :feature, :capybara_feature
find('.shopping-sub-total', text: "Subtotal: $ #{jt_us.price + jt_ww.price}")
end
+
+ it "can expand" do
+ jamtrack = find_jamtrack(jt_us)
+ jamtrack.find('.jamtrack-detail-btn').trigger(:click)
+
+ jt_us.jam_track_tracks.each do |track|
+ jamtrack.find('.instrument-name', track.instrument.description)
+ jamtrack.find('.part', "(#{track.part}}")
+ end
+ end
+
end
end