Skip to content

Commit

Permalink
Improved ticket selector. Added browser tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
martini committed Mar 13, 2016
1 parent df1420d commit 4324db9
Show file tree
Hide file tree
Showing 9 changed files with 641 additions and 293 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ class App.UiElement.ticket_perform_action
name: 'Ticket'
model: 'Ticket'

operators =
'ticket.tags': ['add', 'remove']

# megre config
elements = {}
for groupKey, groupMeta of groups
Expand All @@ -22,13 +19,15 @@ class App.UiElement.ticket_perform_action
# ignore readonly attributes
if !row.readonly
config = _.clone(row)
if config.tag is 'tag'
config.operator = ['add', 'remove']
elements["#{groupKey}.#{config.name}"] = config

[defaults, groups, operators, elements]
[defaults, groups, elements]

@render: (attribute, params = {}) ->

[defaults, groups, operators, elements] = @defaults()
[defaults, groups, elements] = @defaults()

selector = @buildAttributeSelector(groups, elements)

Expand All @@ -42,22 +41,22 @@ class App.UiElement.ticket_perform_action
elementClone = element.clone(true)
element.after(elementClone)
elementClone.find('.js-attributeSelector select').trigger('change')
@updateAttributeSelectors(item)
)

# remove filter
item.find('.js-remove').bind('click', (e) =>
return if $(e.currentTarget).hasClass('is-disabled')
$(e.target).closest('.js-filterElement').remove()
@rebuildAttributeSelectors(item)
@updateAttributeSelectors(item)
)

# change attribute selector
item.find('.js-attributeSelector select').bind('change', (e) =>
groupAndAttribute = $(e.target).find('option:selected').attr('value')
elementRow = $(e.target).closest('.js-filterElement')

@rebuildAttributeSelectors(item, elementRow, groupAndAttribute)
@buildOperator(item, elementRow, groupAndAttribute, elements, undefined, attribute, operators)
@buildValue(item, elementRow, groupAndAttribute, elements, undefined, attribute)
groupAndAttribute = elementRow.find('.js-attributeSelector option:selected').attr('value')
@rebuildAttributeSelectors(item, elementRow, groupAndAttribute, elements, {}, attribute)
@updateAttributeSelectors(item)
)

# build inital params
Expand All @@ -75,81 +74,43 @@ class App.UiElement.ticket_perform_action

# clone, rebuild and append
elementClone = elementFirst.clone(true)
@rebuildAttributeSelectors(item, elementClone, groupAndAttribute)
@buildOperator(item, elementClone, groupAndAttribute, elements, value, attribute, operators, operator)
@buildValue(item, elementClone, groupAndAttribute, elements, value, attribute)
@rebuildAttributeSelectors(item, elementClone, groupAndAttribute, elements, meta, attribute)
elementLast.after(elementClone)

# remove first dummy row
if selectorExists
item.find('.js-filterElement').first().remove()

else
for default_row in defaults
for groupAndAttribute in defaults

# get selector rows
elementFirst = item.find('.js-filterElement').first()
elementLast = item.find('.js-filterElement').last()

# clone, rebuild and append
elementClone = elementFirst.clone(true)
@rebuildAttributeSelectors(item, elementClone, default_row)
@rebuildAttributeSelectors(item, elementClone, groupAndAttribute, elements, {}, attribute)

elementLast.after(elementClone)
item.find('.js-filterElement').first().remove()

item

@buildOperator: (elementFull, elementRow, groupAndAttribute, elements, value, attribute, operators, operator) ->
name = "#{attribute.name}::#{groupAndAttribute}::operator"
if !operators[groupAndAttribute]
elementRow.find('.js-operator').html('')
return

# get current operator
if !operator
operator = elementRow.find('.js-operator select').val()

# build new operator
selection = $("<select class=\"form-control\" name=\"#{name}\"></select>")
for operatorKey in operators[groupAndAttribute]
operatorKeyName = App.i18n.translateInline(operatorKey)
selected = ''
if operatorKey is operator
selected = 'selected'
selection.append("<option value=\"#{operatorKey}\" #{selected}>#{operatorKeyName}</option>")
elementRow.find('.js-operator').html(selection)

@buildValue: (elementFull, elementRow, groupAndAttribute, elements, value, attribute) ->

# do nothing if item already exists
name = "#{attribute.name}::#{groupAndAttribute}::value"
return if elementRow.find("[name=\"#{name}\"]").get(0)
return if elementRow.find("[data-name=\"#{name}\"]").get(0)

# build new item
attributeConfig = elements[groupAndAttribute]
config = _.clone(attributeConfig)
# change attribute selector
item.find('.js-attributeSelector select').bind('change', (e) =>
elementRow = $(e.target).closest('.js-filterElement')
groupAndAttribute = elementRow.find('.js-attributeSelector option:selected').attr('value')
@rebuildAttributeSelectors(item, elementRow, groupAndAttribute, elements, {}, attribute)
@updateAttributeSelectors(item)
)

# force to use auto compition on user lookup
if config.relation is 'User'
config.tag = 'user_autocompletion'
# change operator selector
item.on('change', '.js-operator select', (e) =>
elementRow = $(e.target).closest('.js-filterElement')
groupAndAttribute = elementRow.find('.js-attributeSelector option:selected').attr('value')
@buildOperator(item, elementRow, groupAndAttribute, elements, {}, attribute)
)

# render ui element
item = ''
if config && App.UiElement[config.tag]
config['name'] = name
config['value'] = value
if 'multiple' of config
config.multiple = false
config.nulloption = false
if config.tag is 'checkbox'
config.tag = 'select'
tagSearch = "#{config.tag}_search"
if App.UiElement[tagSearch]
item = App.UiElement[tagSearch].render(config, {})
else
item = App.UiElement[config.tag].render(config, {})
elementRow.find('.js-value').html(item)
item

@buildAttributeSelector: (groups, elements) ->
selection = $('<select class="form-control"></select>')
Expand All @@ -165,7 +126,7 @@ class App.UiElement.ticket_perform_action
optgroup.append("<option value=\"#{elementKey}\">#{displayName}</option>")
selection

@rebuildAttributeSelectors: (elementFull, elementRow, groupAndAttribute) ->
@updateAttributeSelectors: (elementFull) ->

# enable all
elementFull.find('.js-attributeSelector select option').removeAttr('disabled')
Expand All @@ -182,10 +143,147 @@ class App.UiElement.ticket_perform_action
else
elementFull.find('.js-remove').addClass('is-disabled')

@rebuildAttributeSelectors: (elementFull, elementRow, groupAndAttribute, elements, meta, attribute) ->
console.log('aa', groupAndAttribute, meta)
# set attribute
if groupAndAttribute
elementRow.find('.js-attributeSelector select').val(groupAndAttribute)

@buildOperator(elementFull, elementRow, groupAndAttribute, elements, meta, attribute)

@buildOperator: (elementFull, elementRow, groupAndAttribute, elements, meta, attribute) ->
currentOperator = elementRow.find('.js-operator option:selected').attr('value')

if !meta.operator
meta.operator = currentOperator

name = "#{attribute.name}::#{groupAndAttribute}::operator"

selection = $("<select class=\"form-control\" name=\"#{name}\"></select>")

attributeConfig = elements[groupAndAttribute]

if !attributeConfig.operator
elementRow.find('.js-operator').addClass('hide')
else
elementRow.find('.js-operator').removeClass('hide')
if attributeConfig.operator
for operator in attributeConfig.operator
operatorName = App.i18n.translateInline(operator)
selected = ''
if meta.operator is operator
selected = 'selected="selected"'
selection.append("<option value=\"#{operator}\" #{selected}>#{operatorName}</option>")
selection

elementRow.find('.js-operator select').replaceWith(selection)

@buildPreCondition(elementFull, elementRow, groupAndAttribute, elements, meta, attribute)

@buildPreCondition: (elementFull, elementRow, groupAndAttribute, elements, meta, attributeConfig) ->
currentOperator = elementRow.find('.js-operator option:selected').attr('value')
currentPreCondition = elementRow.find('.js-preCondition option:selected').attr('value')

if !meta.pre_condition
meta.pre_condition = currentPreCondition

toggleValue = =>
preCondition = elementRow.find('.js-preCondition option:selected').attr('value')
if preCondition isnt 'specific'
elementRow.find('.js-value select').html('')
elementRow.find('.js-value').addClass('hide')
else
elementRow.find('.js-value').removeClass('hide')
@buildValue(elementFull, elementRow, groupAndAttribute, elements, meta, attribute)

# force to use auto complition on user lookup
attribute = _.clone(attributeConfig)

name = "#{attribute.name}::#{groupAndAttribute}::value"
attributeSelected = elements[groupAndAttribute]

preCondition = false
if attributeSelected.relation is 'User'
preCondition = 'user'
attribute.tag = 'user_autocompletion'
if attributeSelected.relation is 'Organization'
preCondition = 'org'
attribute.tag = 'autocompletion_ajax'
if !preCondition
elementRow.find('.js-preCondition select').html('')
elementRow.find('.js-preCondition').addClass('hide')
toggleValue()
@buildValue(elementFull, elementRow, groupAndAttribute, elements, meta, attribute)
return

elementRow.find('.js-preCondition').removeClass('hide')
name = "#{attribute.name}::#{groupAndAttribute}::pre_condition"

selection = $("<select class=\"form-control\" name=\"#{name}\" ></select>")
options = {}
if preCondition is 'user'
options =
'current_user.id': App.i18n.translateInline('current user')
'specific': App.i18n.translateInline('specific user')
#'set': App.i18n.translateInline('set')
else if preCondition is 'org'
options =
'current_user.organization_id': App.i18n.translateInline('current user organization')
'specific': App.i18n.translateInline('specific organization')
#'set': App.i18n.translateInline('set')

for key, value of options
selected = ''
if key is meta.pre_condition
selected = 'selected="selected"'
selection.append("<option value=\"#{key}\" #{selected}>#{App.i18n.translateInline(value)}</option>")
elementRow.find('.js-preCondition').removeClass('hide')
elementRow.find('.js-preCondition select').replaceWith(selection)

elementRow.find('.js-preCondition select').bind('change', (e) ->
toggleValue()
)

@buildValue(elementFull, elementRow, groupAndAttribute, elements, meta, attribute)
toggleValue()

@buildValue: (elementFull, elementRow, groupAndAttribute, elements, meta, attribute) ->
name = "#{attribute.name}::#{groupAndAttribute}::value"

# build new item
attributeConfig = elements[groupAndAttribute]
config = _.clone(attributeConfig)

if config.relation is 'User'
config.tag = 'user_autocompletion'
if config.relation is 'Organization'
config.tag = 'autocompletion_ajax'

# render ui element
item = ''
if config && App.UiElement[config.tag]
config['name'] = name
if attribute.value && attribute.value[groupAndAttribute]
config['value'] = _.clone(attribute.value[groupAndAttribute]['value'])
config.multiple = false
config.nulloption = false
if config.tag is 'checkbox'
config.tag = 'select'
tagSearch = "#{config.tag}_search"
if App.UiElement[tagSearch]
item = App.UiElement[tagSearch].render(config, {})
else
item = App.UiElement[config.tag].render(config, {})
if meta.operator is 'before (relative)' || meta.operator is 'within next (relative)' || meta.operator is 'within last (relative)' || meta.operator is 'after (relative)'
config['name'] = "#{attribute.name}::#{groupAndAttribute}"
if attribute.value && attribute.value[groupAndAttribute]
config['value'] = _.clone(attribute.value[groupAndAttribute])
item = App.UiElement['time_range'].render(config, {})

elementRow.find('.js-value').removeClass('hide').html(item)



@humanText: (condition) ->
none = App.i18n.translateContent('No filter.')
return [none] if _.isEmpty(condition)
Expand Down
Loading

0 comments on commit 4324db9

Please sign in to comment.