|
@@ -1,11 +1,21 @@
|
|
|
class App.WidgetTag extends App.Controller
|
|
|
+ elements:
|
|
|
+ '.js-newTagLabel': 'newTagLabel'
|
|
|
+ '.js-newTagInput': 'newTagInput'
|
|
|
+
|
|
|
+ events:
|
|
|
+ 'click .js-newTagLabel': 'showInput'
|
|
|
+ 'blur .js-newTagInput': 'hideInput'
|
|
|
+ 'click .js-newTagInput': 'onAddTag'
|
|
|
+ 'submit form': 'onAddTag'
|
|
|
+ 'click .js-delete': 'onRemoveTag'
|
|
|
+
|
|
|
constructor: ->
|
|
|
super
|
|
|
-
|
|
|
- @attribute_id = 'tags_' + @object.id + '_' + @object_type
|
|
|
- tags = App.Store.get( "tags::#{@attribute_id}" )
|
|
|
- if tags
|
|
|
- @render( tags )
|
|
|
+ @cacheKey = "tags::#{@object_type}::#{@object.id}"
|
|
|
+ @tagList = App.Store.get( @cacheKey ) || []
|
|
|
+ @render()
|
|
|
+ if !_.isEmpty(@tagList)
|
|
|
@delay(
|
|
|
=>
|
|
|
@fetch()
|
|
@@ -17,7 +27,7 @@ class App.WidgetTag extends App.Controller
|
|
|
|
|
|
fetch: =>
|
|
|
@ajax(
|
|
|
- id: @attribute_id
|
|
|
+ id: @cacheKey
|
|
|
type: 'GET'
|
|
|
url: @apiPath + '/tags'
|
|
|
data:
|
|
@@ -25,29 +35,38 @@ class App.WidgetTag extends App.Controller
|
|
|
o_id: @object.id
|
|
|
processData: true
|
|
|
success: (data, status, xhr) =>
|
|
|
- App.Store.write( "tags::#{@attribute_id}", data.tags )
|
|
|
- @render(data.tags)
|
|
|
+ @tagList = data.tags
|
|
|
+ App.Store.write( @cacheKey, @tagList )
|
|
|
+ @render()
|
|
|
)
|
|
|
|
|
|
- render: (tags) =>
|
|
|
-
|
|
|
- # insert data
|
|
|
+ render: ->
|
|
|
@html App.view('widget/tag')(
|
|
|
- tags: tags || [],
|
|
|
- tag_id: @attribute_id
|
|
|
- )
|
|
|
- @el.find('#' + @attribute_id ).tokenfield().on(
|
|
|
- 'tokenfield:createtoken'
|
|
|
- (e) =>
|
|
|
- @onAddTag( e.token.value )
|
|
|
- ).on(
|
|
|
- 'tokenfield:removetoken'
|
|
|
- (e) =>
|
|
|
- @onRemoveTag( e.token.value )
|
|
|
+ tags: @tagList || [],
|
|
|
)
|
|
|
- @el.find('#' + @attribute_id ).parent().css('height', 'auto')
|
|
|
|
|
|
- onAddTag: (item) =>
|
|
|
+ showInput: (e) ->
|
|
|
+ e.preventDefault()
|
|
|
+ @newTagLabel.addClass('hide')
|
|
|
+ @newTagInput.removeClass('hide').focus()
|
|
|
+
|
|
|
+ hideInput: (e) ->
|
|
|
+ e.preventDefault()
|
|
|
+ @newTagLabel.removeClass('hide')
|
|
|
+ @newTagInput.addClass('hide')
|
|
|
+
|
|
|
+ onAddTag: (e) =>
|
|
|
+ e.preventDefault()
|
|
|
+ item = @$('[name="new_tag"]').val()
|
|
|
+ return if !item
|
|
|
+
|
|
|
+ if _.contains(@tagList, item)
|
|
|
+ @render()
|
|
|
+ return
|
|
|
+
|
|
|
+ @tagList.push item
|
|
|
+ @render()
|
|
|
+
|
|
|
@ajax(
|
|
|
type: 'GET',
|
|
|
url: @apiPath + '/tags/add',
|
|
@@ -57,13 +76,17 @@ class App.WidgetTag extends App.Controller
|
|
|
item: item
|
|
|
processData: true,
|
|
|
success: (data, status, xhr) =>
|
|
|
- tags = @el.find('#' + @attribute_id ).val()
|
|
|
- if tags
|
|
|
- tags = tags.split(',')
|
|
|
- App.Store.write( "tags::#{@attribute_id}", tags )
|
|
|
+ @fetch()
|
|
|
)
|
|
|
|
|
|
- onRemoveTag: (item) =>
|
|
|
+ onRemoveTag: (e) =>
|
|
|
+ e.preventDefault()
|
|
|
+ item = $(e.target).parents('li').find('.tag').text()
|
|
|
+ return if !item
|
|
|
+
|
|
|
+ @tagList = _.filter(@tagList, (tagItem) -> return tagItem if tagItem isnt item )
|
|
|
+ @render()
|
|
|
+
|
|
|
@ajax(
|
|
|
type: 'GET'
|
|
|
url: @apiPath + '/tags/remove'
|
|
@@ -73,8 +96,5 @@ class App.WidgetTag extends App.Controller
|
|
|
item: item
|
|
|
processData: true
|
|
|
success: (data, status, xhr) =>
|
|
|
- tags = @el.find('#' + @attribute_id ).val()
|
|
|
- if tags
|
|
|
- tags = tags.split(',')
|
|
|
- App.Store.write( "tags::#{@attribute_id}", tags )
|
|
|
+ @fetch()
|
|
|
)
|