Init version with postmaster filter.
This commit is contained in:
parent
8edef05d85
commit
965fc4d303
4 changed files with 324 additions and 14 deletions
|
@ -255,6 +255,214 @@ class App.ControllerForm extends App.Controller
|
||||||
|
|
||||||
item = $( App.view('generic/select')( attribute: attribute ) )
|
item = $( App.view('generic/select')( attribute: attribute ) )
|
||||||
|
|
||||||
|
# postmaster_match
|
||||||
|
else if attribute.tag is 'postmaster_match'
|
||||||
|
addItem = (key, displayName, el, defaultValue = '') =>
|
||||||
|
itemInput = $("<div>#{ displayName }: <input name=\"#{ key }\" type=\"input\" value=\"#{ defaultValue }\" class=\"form-control\"/><a href=\"#\" class=\"glyphicon glyphicon-minus remove\"></a></div>")
|
||||||
|
|
||||||
|
# remove on click
|
||||||
|
itemInput.find('.remove').bind('click', (e) ->
|
||||||
|
e.preventDefault()
|
||||||
|
key = $(e.target).prev().attr('name')
|
||||||
|
return if !key
|
||||||
|
$(e.target).parent().parent().parent().find('.addSelection select option[value="' + key + '"]').show()
|
||||||
|
$(e.target).parent().parent().parent().find('.list [name="' + key + '"]').parent().remove()
|
||||||
|
)
|
||||||
|
|
||||||
|
# add new item
|
||||||
|
el.parent().parent().parent().find('.list').append(itemInput)
|
||||||
|
el.parent().parent().parent().find('.addSelection select').val('')
|
||||||
|
el.parent().parent().parent().find('.addSelection select option[value="' + key + '"]').hide()
|
||||||
|
|
||||||
|
# scaffold of match elements
|
||||||
|
item = $('
|
||||||
|
<div class="postmaster_match" style="margin-left: 40px;">
|
||||||
|
<div class="list"></div>
|
||||||
|
<hr>
|
||||||
|
<div>
|
||||||
|
<div class="addSelection"></div>
|
||||||
|
<div class="add"><a href="#" class="glyphicon glyphicon-plus"></a></div>
|
||||||
|
</div>
|
||||||
|
</div>')
|
||||||
|
|
||||||
|
# select shown attributes
|
||||||
|
loopData = [
|
||||||
|
{
|
||||||
|
value: 'from'
|
||||||
|
name: 'From'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'to'
|
||||||
|
name: 'To'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'cc'
|
||||||
|
name: 'Cc'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'subject'
|
||||||
|
name: 'Subject'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'body'
|
||||||
|
name: 'Body'
|
||||||
|
},
|
||||||
|
#{
|
||||||
|
# value: '-'
|
||||||
|
# name: ''
|
||||||
|
# disable: true
|
||||||
|
#},
|
||||||
|
]
|
||||||
|
for listItem in loopData
|
||||||
|
listItem.value = "#{ attribute.name }::#{listItem.value}"
|
||||||
|
add = { name: '', display: '', tag: 'select', multiple: false, null: false, nulloption: true, options: loopData, translate: true }
|
||||||
|
item.find('.addSelection').append( @formGenItem( add ) )
|
||||||
|
|
||||||
|
# bind add click
|
||||||
|
item.find('.add').bind('click', (e) ->
|
||||||
|
e.preventDefault()
|
||||||
|
name = $(@).parent().parent().find('.addSelection').find('select').val()
|
||||||
|
displayName = $(@).parent().parent().find('.addSelection').find('select option:selected').html()
|
||||||
|
return if !name
|
||||||
|
addItem( name, displayName, $(@) )
|
||||||
|
)
|
||||||
|
|
||||||
|
# show default values
|
||||||
|
loopDataValue = {}
|
||||||
|
if attribute.value
|
||||||
|
for key, value of attribute.value
|
||||||
|
displayName = key
|
||||||
|
for listItem in loopData
|
||||||
|
if listItem.value is "#{ attribute.name }::#{key}"
|
||||||
|
addItem( "#{ attribute.name }::#{key}", listItem.name, item.find('.add a'), value )
|
||||||
|
|
||||||
|
# postmaster_set
|
||||||
|
else if attribute.tag is 'postmaster_set'
|
||||||
|
addItem = (key, displayName, el, defaultValue = '') =>
|
||||||
|
itemInput = $("<div>#{ displayName }: <input name=\"#{ key }\" type=\"input\" value=\"#{ defaultValue }\" class=\"form-control\"/><a href=\"#\" class=\"glyphicon glyphicon-minus remove\"></a></div>")
|
||||||
|
|
||||||
|
# remove on click
|
||||||
|
itemInput.find('.remove').bind('click', (e) ->
|
||||||
|
e.preventDefault()
|
||||||
|
key = $(e.target).prev().attr('name')
|
||||||
|
return if !key
|
||||||
|
$(e.target).parent().parent().parent().find('.addSelection select option[value="' + key + '"]').show()
|
||||||
|
$(e.target).parent().parent().parent().find('.list [name="' + key + '"]').parent().remove()
|
||||||
|
)
|
||||||
|
|
||||||
|
# add new item
|
||||||
|
el.parent().parent().parent().find('.list').append(itemInput)
|
||||||
|
el.parent().parent().parent().find('.addSelection select').val('')
|
||||||
|
el.parent().parent().parent().find('.addSelection select option[value="' + key + '"]').hide()
|
||||||
|
|
||||||
|
# scaffold of perform elements
|
||||||
|
item = $('
|
||||||
|
<div class="perform_set" style="margin-left: 40px;">
|
||||||
|
<div class="list"></div>
|
||||||
|
<hr>
|
||||||
|
<div>
|
||||||
|
<div class="addSelection"></div>
|
||||||
|
<div class="add"><a href="#" class="glyphicon glyphicon-plus"></a></div>
|
||||||
|
</div>
|
||||||
|
</div>')
|
||||||
|
|
||||||
|
|
||||||
|
# select shown attributes
|
||||||
|
loopData = [
|
||||||
|
{
|
||||||
|
value: 'from'
|
||||||
|
name: 'From'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'to'
|
||||||
|
name: 'To'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'cc'
|
||||||
|
name: 'Cc'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'subject'
|
||||||
|
name: 'Subject'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'body'
|
||||||
|
name: 'Body'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: ''
|
||||||
|
name: '-'
|
||||||
|
disable: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'x-zammad-ticket-priority'
|
||||||
|
name: 'Ticket Priority'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'x-zammad-ticket-state'
|
||||||
|
name: 'Ticket State'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'x-zammad-ticket-customer'
|
||||||
|
name: 'Ticket Customer'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'x-zammad-ticket-group'
|
||||||
|
name: 'Ticket Group'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'x-zammad-ticket-owner'
|
||||||
|
name: 'Ticket Owner'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: ''
|
||||||
|
name: '-'
|
||||||
|
disable: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'x-zammad-article-visibility'
|
||||||
|
name: 'Article Visibility'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'x-zammad-article-type'
|
||||||
|
name: 'Article Type'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'x-zammad-article-sender'
|
||||||
|
name: 'Article Sender'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: ''
|
||||||
|
name: '-'
|
||||||
|
disable: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'x-zammad-ignore'
|
||||||
|
name: 'Ignore Message'
|
||||||
|
},
|
||||||
|
]
|
||||||
|
for listItem in loopData
|
||||||
|
listItem.value = "#{ attribute.name }::#{listItem.value}"
|
||||||
|
add = { name: '', display: '', tag: 'select', multiple: false, null: false, nulloption: true, options: loopData, translate: true }
|
||||||
|
item.find('.addSelection').append( @formGenItem( add ) )
|
||||||
|
|
||||||
|
item.find('.add').bind('click', (e) ->
|
||||||
|
e.preventDefault()
|
||||||
|
name = $(@).parent().parent().find('.addSelection').find('select').val()
|
||||||
|
displayName = $(@).parent().parent().find('.addSelection').find('select option:selected').html()
|
||||||
|
return if !name
|
||||||
|
addItem( name, displayName, $(@) )
|
||||||
|
)
|
||||||
|
|
||||||
|
# show default values
|
||||||
|
loopDataValue = {}
|
||||||
|
if attribute.value
|
||||||
|
for key, value of attribute.value
|
||||||
|
displayName = key
|
||||||
|
for listItem in loopData
|
||||||
|
if listItem.value is "#{ attribute.name }::#{key}"
|
||||||
|
addItem( "#{ attribute.name }::#{key}", listItem.name, item.find('.add a'), value )
|
||||||
|
|
||||||
# select
|
# select
|
||||||
else if attribute.tag is 'input_select'
|
else if attribute.tag is 'input_select'
|
||||||
item = $('<div class="input_select"></div>')
|
item = $('<div class="input_select"></div>')
|
||||||
|
@ -1231,27 +1439,27 @@ class App.ControllerForm extends App.Controller
|
||||||
param = {}
|
param = {}
|
||||||
|
|
||||||
# create jquery object if not already exists
|
# create jquery object if not already exists
|
||||||
if typeof form isnt 'function'
|
if form instanceof jQuery
|
||||||
|
# do nothing
|
||||||
|
else
|
||||||
form = $(form)
|
form = $(form)
|
||||||
|
|
||||||
# find form based on sub elements
|
# find form if current is <form>
|
||||||
if form.children()[0]
|
if form.is('form')
|
||||||
form = form.children().parents('form')
|
|
||||||
|
|
||||||
# find form based on parents next <form>
|
|
||||||
else if form.is('form')
|
|
||||||
form = form
|
form = form
|
||||||
|
|
||||||
|
# find form based on sub elements
|
||||||
|
else if form.find('form')[0]
|
||||||
|
form = $( form.find('form')[0] )
|
||||||
|
|
||||||
# find form based on parents next <form>
|
# find form based on parents next <form>
|
||||||
else if form.parents('form')[0]
|
else if form.parents('form')[0]
|
||||||
form = form.parents('form')
|
form = $( form.parents('form')[0] )
|
||||||
|
|
||||||
# find form based on parents next <form>, not really good!
|
|
||||||
else if form.parents().find('form')[0]
|
|
||||||
form = form.parents().find('form')
|
|
||||||
else
|
else
|
||||||
App.Log.error 'ControllerForm', 'no form found!', form
|
App.Log.error 'ControllerForm', 'no form found!', form
|
||||||
|
|
||||||
|
# get form elements
|
||||||
array = form.serializeArray()
|
array = form.serializeArray()
|
||||||
|
|
||||||
# 1:1 and boolean params
|
# 1:1 and boolean params
|
||||||
|
|
|
@ -6,8 +6,8 @@ class App.PostmasterFilter extends App.Model
|
||||||
@configure_attributes = [
|
@configure_attributes = [
|
||||||
{ name: 'name', display: 'Name', tag: 'input', type: 'text', limit: 250, 'null': false, 'class': 'span4' },
|
{ name: 'name', display: 'Name', tag: 'input', type: 'text', limit: 250, 'null': false, 'class': 'span4' },
|
||||||
{ name: 'channel', display: 'Channel', type: 'input', readonly: 1 },
|
{ name: 'channel', display: 'Channel', type: 'input', readonly: 1 },
|
||||||
{ name: 'match', display: 'Match all of the following', tag: 'input_select', count_min: 2, count_max: 88, multiple: true, 'null': false, 'class': 'span4', select: { 'class': 'span2', multiple: false, options: { from: 'From', to: 'To', cc: 'Cc', subject: 'Subject', body: 'Body' } }, input: { limit: 250, type: 'text', 'class': 'span3' }, },
|
{ name: 'match', display: 'Match all of the following', tag: 'postmaster_match' },
|
||||||
{ name: 'perform', display: 'Perform action of the following', tag: 'input_select', count_min: 2, count_max: 88, multiple: true, 'null': false, 'class': 'span4', select: { 'class': 'span2', multiple: false, options: { from: 'From', to: 'To', cc: 'Cc', subject: 'Subject', body: 'Body', 'x-zammad-priority': 'Ticket Priority', 'x-zammad-state': 'Ticket State', 'x-zammad-customer': 'Ticket Customer', 'x-zammad-ignore': 'Ignore Message', 'x-zammad-group': 'Ticket Group', 'x-zammad-owner': 'Ticket Owner', 'x-zammad-article-visibility': 'Article Visibility', 'x-zammad-article-type': 'Article Type', 'x-zammad-article-sender': 'Article Sender' } }, input: { limit: 250, type: 'text', 'class': 'span3' }, },
|
{ name: 'perform', display: 'Perform action of the following', tag: 'postmaster_set' },
|
||||||
{ name: 'note', display: 'Note', tag: 'textarea', note: 'Notes are visible to agents only, never to customers.', limit: 250, 'null': true, 'class': 'span4' },
|
{ name: 'note', display: 'Note', tag: 'textarea', note: 'Notes are visible to agents only, never to customers.', limit: 250, 'null': true, 'class': 'span4' },
|
||||||
{ name: 'updated_at', display: 'Updated', type: 'time', readonly: 1 },
|
{ name: 'updated_at', display: 'Updated', type: 'time', readonly: 1 },
|
||||||
{ name: 'active', display: 'Active', tag: 'boolean', type: 'boolean', 'default': true, 'null': false, 'class': 'span4' },
|
{ name: 'active', display: 'Active', tag: 'boolean', type: 'boolean', 'default': true, 'null': false, 'class': 'span4' },
|
||||||
|
|
|
@ -367,3 +367,105 @@ test( "form dependend fields check", function() {
|
||||||
deepEqual( params, test_params, 'form param check' );
|
deepEqual( params, test_params, 'form param check' );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test( "form postmaster filter", function() {
|
||||||
|
|
||||||
|
// check match area
|
||||||
|
|
||||||
|
// check set area
|
||||||
|
|
||||||
|
// add match rule
|
||||||
|
|
||||||
|
// add set rule
|
||||||
|
|
||||||
|
$('#forms').append('<hr><h1>form postmaster filter</h1><form id="form5"></form>')
|
||||||
|
var el = $('#form5')
|
||||||
|
var defaults = {
|
||||||
|
input2: 'some name',
|
||||||
|
match: {
|
||||||
|
from: 'some@address',
|
||||||
|
subject: 'some subject',
|
||||||
|
},
|
||||||
|
set: {
|
||||||
|
to: 'some@address',
|
||||||
|
'x-zammad-ticket-group': 'some group',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
new App.ControllerForm({
|
||||||
|
el: el,
|
||||||
|
model: {
|
||||||
|
configure_attributes: [
|
||||||
|
{ name: 'input1', display: 'Input1', tag: 'input', type: 'text', limit: 100, null: true, default: 'some not used default' },
|
||||||
|
{ name: 'input2', display: 'Input2', tag: 'input', type: 'text', limit: 100, null: true, default: 'some used default' },
|
||||||
|
{ name: 'match', display: 'Match', tag: 'postmaster_match', null: false, default: false},
|
||||||
|
{ name: 'set', display: 'Set', tag: 'postmaster_set', null: false, default: false},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
params: defaults,
|
||||||
|
});
|
||||||
|
params = App.ControllerForm.params( el )
|
||||||
|
test_params = {
|
||||||
|
input1: "some not used default",
|
||||||
|
input2: "some name",
|
||||||
|
match: {
|
||||||
|
from: 'some@address',
|
||||||
|
subject: 'some subject',
|
||||||
|
},
|
||||||
|
set: {
|
||||||
|
to: 'some@address',
|
||||||
|
'x-zammad-ticket-group': 'some group',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
deepEqual( params, test_params, 'form param check' );
|
||||||
|
el.find('[name="set::to"]').next().click()
|
||||||
|
App.Delay.set( function() {
|
||||||
|
test( "form param check after remove click", function() {
|
||||||
|
params = App.ControllerForm.params( el )
|
||||||
|
test_params = {
|
||||||
|
input1: "some not used default",
|
||||||
|
input2: "some name",
|
||||||
|
match: {
|
||||||
|
from: 'some@address',
|
||||||
|
subject: 'some subject',
|
||||||
|
},
|
||||||
|
set: {
|
||||||
|
'x-zammad-ticket-group': 'some group',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
deepEqual( params, test_params, 'form param check' );
|
||||||
|
});
|
||||||
|
},
|
||||||
|
1000
|
||||||
|
);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
test( "form selector", function() {
|
||||||
|
$('#forms').append('<hr><h1>form selector</h1><div><form id="form6"></form></div>')
|
||||||
|
var el = $('#form6')
|
||||||
|
var defaults = {
|
||||||
|
input2: 'some name66',
|
||||||
|
}
|
||||||
|
new App.ControllerForm({
|
||||||
|
el: el,
|
||||||
|
model: {
|
||||||
|
configure_attributes: [
|
||||||
|
{ name: 'input1', display: 'Input1', tag: 'input', type: 'text', limit: 100, null: true, default: 'some not used default33' },
|
||||||
|
{ name: 'input2', display: 'Input2', tag: 'input', type: 'text', limit: 100, null: true, default: 'some used default' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
params: defaults,
|
||||||
|
});
|
||||||
|
test_params = {
|
||||||
|
input1: "some not used default33",
|
||||||
|
input2: "some name66",
|
||||||
|
};
|
||||||
|
params = App.ControllerForm.params( el )
|
||||||
|
deepEqual( params, test_params, 'form param check via $("#form")' );
|
||||||
|
|
||||||
|
params = App.ControllerForm.params( el.find('input') )
|
||||||
|
deepEqual( params, test_params, 'form param check via $("#form").find("input")' );
|
||||||
|
|
||||||
|
params = App.ControllerForm.params( el.parent() )
|
||||||
|
deepEqual( params, test_params, 'form param check via $("#form").parent()' );
|
||||||
|
|
||||||
|
});
|
||||||
|
|
Loading…
Reference in a new issue