Support for markdown in settings description of model description attributes.
This commit is contained in:
parent
5be3eb29b9
commit
79666ba324
17 changed files with 1571 additions and 40 deletions
|
@ -98,8 +98,9 @@ class App.ControllerGenericEdit extends App.ControllerModal
|
||||||
|
|
||||||
class App.ControllerGenericIndex extends App.Controller
|
class App.ControllerGenericIndex extends App.Controller
|
||||||
events:
|
events:
|
||||||
'click [data-type = edit]': 'edit'
|
'click [data-type=edit]': 'edit'
|
||||||
'click [data-type = new]': 'new'
|
'click [data-type=new]': 'new'
|
||||||
|
'click .js-description': 'description'
|
||||||
|
|
||||||
constructor: ->
|
constructor: ->
|
||||||
super
|
super
|
||||||
|
@ -147,13 +148,25 @@ class App.ControllerGenericIndex extends App.Controller
|
||||||
return item
|
return item
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# show description button, only if content exists
|
||||||
|
showDescription = false
|
||||||
|
if App[ @genericObject ].description && !_.isEmpty(objects)
|
||||||
|
showDescription = true
|
||||||
|
|
||||||
@html App.view('generic/admin/index')(
|
@html App.view('generic/admin/index')(
|
||||||
head: @pageData.objects
|
head: @pageData.objects
|
||||||
notes: @pageData.notes
|
notes: @pageData.notes
|
||||||
buttons: @pageData.buttons
|
buttons: @pageData.buttons
|
||||||
menus: @pageData.menus
|
menus: @pageData.menus
|
||||||
|
showDescription: showDescription
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# show description in content if no no content exists
|
||||||
|
if _.isEmpty(objects) && App[ @genericObject ].description
|
||||||
|
description = marked(App[ @genericObject ].description)
|
||||||
|
@$('.table-overview').html(description)
|
||||||
|
return
|
||||||
|
|
||||||
# append content table
|
# append content table
|
||||||
params = _.extend(
|
params = _.extend(
|
||||||
{
|
{
|
||||||
|
@ -193,6 +206,26 @@ class App.ControllerGenericIndex extends App.Controller
|
||||||
container: @container
|
container: @container
|
||||||
)
|
)
|
||||||
|
|
||||||
|
description: (e) =>
|
||||||
|
new App.ControllerGenericDescription(
|
||||||
|
description: App[ @genericObject ].description
|
||||||
|
container: @container
|
||||||
|
)
|
||||||
|
|
||||||
|
class App.ControllerGenericDescription extends App.ControllerModal
|
||||||
|
constructor: ->
|
||||||
|
super
|
||||||
|
@head = 'Description'
|
||||||
|
@cancel = false
|
||||||
|
@button = 'Close'
|
||||||
|
description = marked(@description)
|
||||||
|
|
||||||
|
@show(description)
|
||||||
|
|
||||||
|
onSubmit: (e) ->
|
||||||
|
e.preventDefault()
|
||||||
|
@hide()
|
||||||
|
|
||||||
class App.ControllerGenericDestroyConfirm extends App.ControllerModal
|
class App.ControllerGenericDestroyConfirm extends App.ControllerModal
|
||||||
constructor: ->
|
constructor: ->
|
||||||
super
|
super
|
||||||
|
|
|
@ -45,6 +45,10 @@ class App.ChannelEmailFilter extends App.Controller
|
||||||
|
|
||||||
template = $( '<div><div class="overview"></div><a data-type="new" class="btn btn--success">' + App.i18n.translateContent('New') + '</a></div>' )
|
template = $( '<div><div class="overview"></div><a data-type="new" class="btn btn--success">' + App.i18n.translateContent('New') + '</a></div>' )
|
||||||
|
|
||||||
|
description = '''
|
||||||
|
With Filters you can e. g. dispatch new Tickets into certain groups or set a certain priority for Tickets of an VIP customer.
|
||||||
|
'''
|
||||||
|
|
||||||
new App.ControllerTable(
|
new App.ControllerTable(
|
||||||
el: template.find('.overview')
|
el: template.find('.overview')
|
||||||
model: App.PostmasterFilter
|
model: App.PostmasterFilter
|
||||||
|
@ -52,6 +56,7 @@ class App.ChannelEmailFilter extends App.Controller
|
||||||
bindRow:
|
bindRow:
|
||||||
events:
|
events:
|
||||||
'click': @edit
|
'click': @edit
|
||||||
|
explanation: description
|
||||||
)
|
)
|
||||||
@html template
|
@html template
|
||||||
|
|
||||||
|
@ -135,6 +140,13 @@ class App.ChannelEmailSignature extends App.Controller
|
||||||
data = App.Signature.search( sortBy: 'name' )
|
data = App.Signature.search( sortBy: 'name' )
|
||||||
|
|
||||||
template = $( '<div><div class="overview"></div><a data-type="new" class="btn btn--success">' + App.i18n.translateContent('New') + '</a></div>' )
|
template = $( '<div><div class="overview"></div><a data-type="new" class="btn btn--success">' + App.i18n.translateContent('New') + '</a></div>' )
|
||||||
|
|
||||||
|
description = '''
|
||||||
|
You can define differenct signatures for each group. So you can have different email signatures for different departments.
|
||||||
|
|
||||||
|
Once you have created a signature here, you need also to edit the groups where you want to use it.
|
||||||
|
'''
|
||||||
|
|
||||||
new App.ControllerTable(
|
new App.ControllerTable(
|
||||||
el: template.find('.overview')
|
el: template.find('.overview')
|
||||||
model: App.Signature
|
model: App.Signature
|
||||||
|
@ -142,6 +154,7 @@ class App.ChannelEmailSignature extends App.Controller
|
||||||
bindRow:
|
bindRow:
|
||||||
events:
|
events:
|
||||||
'click': @edit
|
'click': @edit
|
||||||
|
explanation: description
|
||||||
)
|
)
|
||||||
@html template
|
@html template
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
class Index extends App.ControllerContent
|
class Index extends App.ControllerContent
|
||||||
events:
|
events:
|
||||||
'click .js-new': 'newDialog'
|
'click .js-new': 'newDialog'
|
||||||
|
'click .js-description': 'description'
|
||||||
|
|
||||||
constructor: ->
|
constructor: ->
|
||||||
super
|
super
|
||||||
|
|
||||||
|
@ -11,7 +13,9 @@ class Index extends App.ControllerContent
|
||||||
App.Calendar.fetch()
|
App.Calendar.fetch()
|
||||||
|
|
||||||
render: =>
|
render: =>
|
||||||
calendars = App.Calendar.all()
|
calendars = App.Calendar.search(
|
||||||
|
sortBy: 'name'
|
||||||
|
)
|
||||||
for calendar in calendars
|
for calendar in calendars
|
||||||
|
|
||||||
# get preview public holidays
|
# get preview public holidays
|
||||||
|
@ -27,8 +31,18 @@ class Index extends App.ControllerContent
|
||||||
public_holidays_preview[day] = calendar.public_holidays[day]
|
public_holidays_preview[day] = calendar.public_holidays[day]
|
||||||
calendar.public_holidays_preview = public_holidays_preview
|
calendar.public_holidays_preview = public_holidays_preview
|
||||||
|
|
||||||
|
# show description button, only if content exists
|
||||||
|
showDescription = false
|
||||||
|
if App.Calendar.description
|
||||||
|
if !_.isEmpty(calendars)
|
||||||
|
showDescription = true
|
||||||
|
else
|
||||||
|
description = marked(App[ @genericObject ].description)
|
||||||
|
|
||||||
@html App.view('calendar')(
|
@html App.view('calendar')(
|
||||||
calendars: calendars
|
calendars: calendars
|
||||||
|
showDescription: showDescription
|
||||||
|
description: description
|
||||||
)
|
)
|
||||||
|
|
||||||
release: =>
|
release: =>
|
||||||
|
@ -50,4 +64,10 @@ class Index extends App.ControllerContent
|
||||||
@$('.js-time').timepicker
|
@$('.js-time').timepicker
|
||||||
showMeridian: true # show am/pm
|
showMeridian: true # show am/pm
|
||||||
|
|
||||||
|
description: (e) =>
|
||||||
|
new App.ControllerGenericDescription(
|
||||||
|
description: App.Calendar.description
|
||||||
|
container: @el.closest('.content')
|
||||||
|
)
|
||||||
|
|
||||||
App.Config.set( 'Calendars', { prio: 2400, name: 'Calendars', parent: '#manage', target: '#manage/calendars', controller: Index, role: ['Admin'] }, 'NavBarAdmin' )
|
App.Config.set( 'Calendars', { prio: 2400, name: 'Calendars', parent: '#manage', target: '#manage/calendars', controller: Index, role: ['Admin'] }, 'NavBarAdmin' )
|
|
@ -21,7 +21,6 @@ class Index extends App.ControllerContent
|
||||||
buttons: [
|
buttons: [
|
||||||
{ name: 'New TextModule', 'data-type': 'new', class: 'btn--success' }
|
{ name: 'New TextModule', 'data-type': 'new', class: 'btn--success' }
|
||||||
]
|
]
|
||||||
explanation: 'Create Text Modules to spend less time writing responses. TextModules can include smart variables like the users name or email address.'
|
|
||||||
container: @el.closest('.content')
|
container: @el.closest('.content')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -241,6 +241,15 @@ class App extends Spine.Controller
|
||||||
params.Icon = (name, className = '') ->
|
params.Icon = (name, className = '') ->
|
||||||
"<svg class=\"icon icon-#{name} #{className}\"><use xlink:href=\"#icon-#{name}\" /></svg>"
|
"<svg class=\"icon icon-#{name} #{className}\"><use xlink:href=\"#icon-#{name}\" /></svg>"
|
||||||
|
|
||||||
|
# define richtext helper
|
||||||
|
params.RichText = ( string ) ->
|
||||||
|
if string.match(/@T\('/)
|
||||||
|
string = string.replace(/@T\('(.+?)'\)/g, (match, capture) ->
|
||||||
|
App.i18n.translateContent(capture)
|
||||||
|
)
|
||||||
|
return marked(string)
|
||||||
|
App.i18n.translateContent(string)
|
||||||
|
|
||||||
# define template
|
# define template
|
||||||
JST["app/views/#{name}"](params)
|
JST["app/views/#{name}"](params)
|
||||||
template
|
template
|
||||||
|
|
1285
app/assets/javascripts/app/lib/base/marked.js
Normal file
1285
app/assets/javascripts/app/lib/base/marked.js
Normal file
File diff suppressed because it is too large
Load diff
|
@ -5,3 +5,11 @@ class App.Calendar extends App.Model
|
||||||
|
|
||||||
displayName: ->
|
displayName: ->
|
||||||
"#{@name} - #{@timezone}"
|
"#{@name} - #{@timezone}"
|
||||||
|
|
||||||
|
@description = '''
|
||||||
|
Ein **Kalender** wird benötigt um Eskalationen oder Auswertungen anhand von Geschäftszeiten zu berechnen.
|
||||||
|
|
||||||
|
Definieren Sie einen **"Standard"-Kalender** welcher Systemweit gültig ist. Nur in den angegebenen Geschäftszeiten werden Eskalations-Benachrichtigungen an Agenten versendet.
|
||||||
|
|
||||||
|
Haben Sie Kunden für welche Sie unterschiedliche Geschäftszeiten einhalten müssen, so können Sie mehrere Kalender anlegen. Die Zuweisung zu den Kunden-Tickets geschieht über die **SLAs**.
|
||||||
|
'''
|
|
@ -14,6 +14,13 @@ class App.Organization extends App.Model
|
||||||
'shared',
|
'shared',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@description = '''
|
||||||
|
Mit **Organisationen** können Sie Kunden **gruppieren**. Dies hat u. a. zwei bedeutende Vorteile.
|
||||||
|
|
||||||
|
1. Als **Agent** haben Sie nicht nur die Übersicht über die Tickets eines Kunden sondern zusätzlich die **Übersicht über die gesamte Organisation**. Z. B. über die Suchen nach der Organisation, diese per einfachen klick öffnen.
|
||||||
|
2. Als **Kunde** können Sie die **Tickets ihrer Kollegen mit einsehen** und bearbeiten (sofern die Organisation eine "teilende" ist, dies können Sie je Organisation als Parameter einstellen).
|
||||||
|
'''
|
||||||
|
|
||||||
uiUrl: ->
|
uiUrl: ->
|
||||||
'#organization/profile/' + @id
|
'#organization/profile/' + @id
|
||||||
|
|
||||||
|
@ -36,4 +43,4 @@ class App.Organization extends App.Model
|
||||||
id: @id
|
id: @id
|
||||||
class: "organization organization-popover"
|
class: "organization organization-popover"
|
||||||
url: @uiUrl()
|
url: @uiUrl()
|
||||||
iconClass: "organization"
|
iconClass: "organization"
|
||||||
|
|
|
@ -144,3 +144,9 @@ class App.Overview extends App.Model
|
||||||
'role',
|
'role',
|
||||||
'prio',
|
'prio',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@description = '''
|
||||||
|
Übersichten können Sie Ihren Agenten und Kunden bereitstellen. Sie dienen als eine Art Arbeitslisten von Aufgaben welche der Agent abarbeiten soll.
|
||||||
|
|
||||||
|
Sie können auch individuelle Übersichten für einzelne Agenten oder agenten Gruppen erstellen.
|
||||||
|
'''
|
||||||
|
|
|
@ -18,3 +18,11 @@ class App.Sla extends App.Model
|
||||||
@configure_overview = [
|
@configure_overview = [
|
||||||
'name',
|
'name',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@description = '''
|
||||||
|
**Service-Level-Agreements**, abgekürzt **SLAs**, unterstützen Sie gegenüber Kunden gewisse zeitliche Reaktionen einzuhalten. Somit können Sie z. B. sagen Kunden sollen immer nach spätestens 8 Stunden eine Reaktion von Ihnen bekommen. Falls es zu einer drohenden Unterschreitung oder einer Unterschreitung kommt, weißt Zammad Sie auf solche Ereignisse hin.
|
||||||
|
|
||||||
|
Es können **Reaktionszeit** (Zeit zwischen Erstellung eines Tickets und erster Reaktion eines Agenten), **Aktualisierungszeit** (Zeit zwischen Nachfrage eines Kunden und Reaktion eines Agenten) und **Lösungszeit** (Zeit zwischen Erstellung und schließen eines Tickets) definiert werden.
|
||||||
|
|
||||||
|
Drohenden Unterschreitungen oder Unterschreitungen werden in einer eigenen Ansicht in den Übersichten angezeigt. Zudem können **E-Mail Benachrichtigungen** konfiguriert werden.
|
||||||
|
'''
|
|
@ -15,3 +15,22 @@ class App.TextModule extends App.Model
|
||||||
'keywords',
|
'keywords',
|
||||||
'content',
|
'content',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@description = '''
|
||||||
|
Create Text Modules to **spend less time writing responses**. TextModules can include smart variables like the users name or email address.
|
||||||
|
|
||||||
|
Examples of snippets are:
|
||||||
|
|
||||||
|
* Hallo Frau <%= @ticket.customer.lastname %>,
|
||||||
|
* Hallo Herr <%= @ticket.customer.lastname %>,
|
||||||
|
* Hallo <%= @ticket.customer.firstname %>,
|
||||||
|
|
||||||
|
Of course you can also use multi line snippets.
|
||||||
|
|
||||||
|
Available objects are:
|
||||||
|
* @ticket (e. g. @ticket.state, @ticket.group)
|
||||||
|
* @ticket.customer (e. g. @ticket.customer.firstname, @ticket.customer.lastname)
|
||||||
|
* @ticket.owner (e. g. @ticket.owner.firstname, @ticket.owner.lastname)
|
||||||
|
* @ticket.organization (e. g. @ticket.organization.name)
|
||||||
|
|
||||||
|
'''
|
|
@ -4,10 +4,17 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="page-header-meta">
|
<div class="page-header-meta">
|
||||||
|
<% if @showDescription: %>
|
||||||
|
<a class="btn js-description"><%- @T('Description') %></a>
|
||||||
|
<% end %>
|
||||||
<a class="btn btn--success js-new"><%- @T('New Calendar') %></a>
|
<a class="btn btn--success js-new"><%- @T('New Calendar') %></a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<% if _.isEmpty(@calendars): %>
|
||||||
|
<%- @description %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<% for calendar in @calendars: %>
|
<% for calendar in @calendars: %>
|
||||||
<div class="action">
|
<div class="action">
|
||||||
<div class="action-flow">
|
<div class="action-flow">
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
<p><%= @Ti( @explanation ) %></p>
|
<p><%= @T(@explanation) %></p>
|
|
@ -3,10 +3,13 @@
|
||||||
<h1><%- @T( @head ) %> <small><%- @T( 'Management' ) %></small></h1>
|
<h1><%- @T( @head ) %> <small><%- @T( 'Management' ) %></small></h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="page-header-meta">
|
<div class="page-header-meta">
|
||||||
<% if @buttons: %>
|
<% if @showDescription: %>
|
||||||
<% for button in @buttons: %>
|
<a class="btn js-description"><%- @T('Description') %></a>
|
||||||
<a data-type="<%= button['data-type'] %>" class="btn <%= button['class'] %>"><%- @T( button.name ) %></a>
|
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<% if @buttons: %>
|
||||||
|
<% for button in @buttons: %>
|
||||||
|
<a data-type="<%= button['data-type'] %>" class="btn <%= button['class'] %>"><%- @T( button.name ) %></a>
|
||||||
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<form class="settings-entry" id="<%= @setting.name %>">
|
<form class="settings-entry" id="<%= @setting.name %>">
|
||||||
<h2><%- @T( @setting.title ) %></h2>
|
<h2><%- @T( @setting.title ) %></h2>
|
||||||
<p><%- @T( @setting.description ) %></p>
|
<p><%- @RichText( @setting.description ) %></p>
|
||||||
<div class="horizontal end">
|
<div class="horizontal end">
|
||||||
<div class="form-item flex"></div>
|
<div class="form-item flex"></div>
|
||||||
<button type="submit" class="btn btn--primary"><%- @T( 'Submit' ) %></button>
|
<button type="submit" class="btn btn--primary"><%- @T( 'Submit' ) %></button>
|
||||||
|
|
123
db/migrate/20150971000001_update_settings4.rb
Normal file
123
db/migrate/20150971000001_update_settings4.rb
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
class UpdateSettings4 < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
Setting.create_or_update(
|
||||||
|
title: 'Authentication via Twitter',
|
||||||
|
name: 'auth_twitter',
|
||||||
|
area: 'Security::ThirdPartyAuthentication',
|
||||||
|
description: "@T('Enables user authentication via twitter. Register your app first at [Twitter Developer Site](https://dev.twitter.com/apps)')",
|
||||||
|
options: {
|
||||||
|
form: [
|
||||||
|
{
|
||||||
|
display: '',
|
||||||
|
null: true,
|
||||||
|
name: 'auth_twitter',
|
||||||
|
tag: 'boolean',
|
||||||
|
options: {
|
||||||
|
true => 'yes',
|
||||||
|
false => 'no',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
state: false,
|
||||||
|
frontend: true
|
||||||
|
)
|
||||||
|
Setting.create_or_update(
|
||||||
|
title: 'Authentication via Facebook',
|
||||||
|
name: 'auth_facebook',
|
||||||
|
area: 'Security::ThirdPartyAuthentication',
|
||||||
|
description: "@T('Enables user authentication via Facebook. Register your app first at [Facebook Developer Site](https://developers.facebook.com/apps/)')",
|
||||||
|
options: {
|
||||||
|
form: [
|
||||||
|
{
|
||||||
|
display: '',
|
||||||
|
null: true,
|
||||||
|
name: 'auth_facebook',
|
||||||
|
tag: 'boolean',
|
||||||
|
options: {
|
||||||
|
true => 'yes',
|
||||||
|
false => 'no',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
state: false,
|
||||||
|
frontend: true
|
||||||
|
)
|
||||||
|
Setting.create_or_update(
|
||||||
|
title: 'Ticket Hook Position',
|
||||||
|
name: 'ticket_hook_position',
|
||||||
|
area: 'Ticket::Base',
|
||||||
|
description: "@T('The format of the subject.')
|
||||||
|
* @T('**Right** means **Some Subject [Ticket#12345]**')
|
||||||
|
* @T('**Left** means **[Ticket#12345] Some Subject**')
|
||||||
|
* @T('**None** means **Some Subject** (without ticket number). In the last case you should enable *postmaster_follow_up_search_in* to recognize followups based on email headers and/or body.')",
|
||||||
|
options: {
|
||||||
|
form: [
|
||||||
|
{
|
||||||
|
display: '',
|
||||||
|
null: true,
|
||||||
|
name: 'ticket_hook_position',
|
||||||
|
tag: 'select',
|
||||||
|
options: {
|
||||||
|
'left' => 'Left',
|
||||||
|
'right' => 'Right',
|
||||||
|
'none' => 'None',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
state: 'right',
|
||||||
|
frontend: false
|
||||||
|
)
|
||||||
|
Setting.create_or_update(
|
||||||
|
title: 'Ticket Number Format',
|
||||||
|
name: 'ticket_number',
|
||||||
|
area: 'Ticket::Number',
|
||||||
|
description: "@T('Selects the ticket number generator module.')
|
||||||
|
* @T('**Increment** increments the ticket number, the SystemID and the counter are used with SystemID.Counter format (e.g. 1010138, 1010139).')
|
||||||
|
* @T('With **Date** the ticket numbers will be generated by the current date, the SystemID and the counter. The format looks like Year.Month.Day.SystemID.counter (e.g. 201206231010138, 201206231010139).')
|
||||||
|
|
||||||
|
@T('With param 'Checksum => true' the counter will be appended as checksum to the string. The format looks like SystemID.Counter.CheckSum (e. g. 10101384, 10101392) or Year.Month.Day.SystemID.Counter.CheckSum (e.g. 2012070110101520, 2012070110101535).')",
|
||||||
|
options: {
|
||||||
|
form: [
|
||||||
|
{
|
||||||
|
display: '',
|
||||||
|
null: true,
|
||||||
|
name: 'ticket_number',
|
||||||
|
tag: 'select',
|
||||||
|
options: {
|
||||||
|
'Ticket::Number::Increment' => 'Increment (SystemID.Counter)',
|
||||||
|
'Ticket::Number::Date' => 'Date (Year.Month.Day.SystemID.Counter)',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
state: 'Ticket::Number::Increment',
|
||||||
|
frontend: false
|
||||||
|
)
|
||||||
|
Setting.create_or_update(
|
||||||
|
title: 'Additional follow up detection',
|
||||||
|
name: 'postmaster_follow_up_search_in',
|
||||||
|
area: 'Email::Base',
|
||||||
|
description: 'In default the follow up check is done via the subject of an email. With this setting you can add more fields where the follow up ckeck is executed.',
|
||||||
|
options: {
|
||||||
|
form: [
|
||||||
|
{
|
||||||
|
display: '',
|
||||||
|
null: true,
|
||||||
|
name: 'postmaster_follow_up_search_in',
|
||||||
|
tag: 'checkbox',
|
||||||
|
options: {
|
||||||
|
'references' => 'References - Search for follow up also in In-Reply-To or References headers.',
|
||||||
|
'body' => 'Body - Search for follow up also in mail body.',
|
||||||
|
'attachment' => 'Attachment - Search for follow up also in attachments.',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
state: [],
|
||||||
|
frontend: false
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
39
db/seeds.rb
39
db/seeds.rb
|
@ -417,7 +417,7 @@ Setting.create_if_not_exists(
|
||||||
title: 'Authentication via Twitter',
|
title: 'Authentication via Twitter',
|
||||||
name: 'auth_twitter',
|
name: 'auth_twitter',
|
||||||
area: 'Security::ThirdPartyAuthentication',
|
area: 'Security::ThirdPartyAuthentication',
|
||||||
description: 'Enables user authentication via twitter. Register your app first at https://dev.twitter.com/apps',
|
description: "@T('Enables user authentication via twitter. Register your app first at [Twitter Developer Site](https://dev.twitter.com/apps)')",
|
||||||
options: {
|
options: {
|
||||||
form: [
|
form: [
|
||||||
{
|
{
|
||||||
|
@ -463,7 +463,7 @@ Setting.create_if_not_exists(
|
||||||
title: 'Authentication via Facebook',
|
title: 'Authentication via Facebook',
|
||||||
name: 'auth_facebook',
|
name: 'auth_facebook',
|
||||||
area: 'Security::ThirdPartyAuthentication',
|
area: 'Security::ThirdPartyAuthentication',
|
||||||
description: 'Enables user authentication via Facebook. Register your app first at https://developers.facebook.com/apps/',
|
description: "@T('Enables user authentication via Facebook. Register your app first at [Facebook Developer Site](https://developers.facebook.com/apps/)')",
|
||||||
options: {
|
options: {
|
||||||
form: [
|
form: [
|
||||||
{
|
{
|
||||||
|
@ -760,7 +760,10 @@ Setting.create_if_not_exists(
|
||||||
title: 'Ticket Hook Position',
|
title: 'Ticket Hook Position',
|
||||||
name: 'ticket_hook_position',
|
name: 'ticket_hook_position',
|
||||||
area: 'Ticket::Base',
|
area: 'Ticket::Base',
|
||||||
description: 'The format of the subject. "Left" means "[Ticket#12345] Some Subject", "Right" means "Some Subject [Ticket#12345]", "None" means "Some Subject" and no ticket number. In the last case you should enable "postmaster_follow_up_search_in" to recognize followups based on email headers and/or body.',
|
description: "@T('The format of the subject.')
|
||||||
|
* @T('**Right** means **Some Subject [Ticket#12345]**')
|
||||||
|
* @T('**Left** means **[Ticket#12345] Some Subject**')
|
||||||
|
* @T('**None** means **Some Subject** (without ticket number). In the last case you should enable *postmaster_follow_up_search_in* to recognize followups based on email headers and/or body.')",
|
||||||
options: {
|
options: {
|
||||||
form: [
|
form: [
|
||||||
{
|
{
|
||||||
|
@ -815,27 +818,15 @@ Setting.create_if_not_exists(
|
||||||
state: 'RE',
|
state: 'RE',
|
||||||
frontend: false
|
frontend: false
|
||||||
)
|
)
|
||||||
#Setting.create(
|
|
||||||
# :title => 'Ticket Subject Forward',
|
|
||||||
# :name => 'ticket_subject_fw',
|
|
||||||
# :area => 'Ticket::Base',
|
|
||||||
# :description => 'The text at the beginning of the subject when an email is forwarded, e.g. FW, Fwd, or WG.',
|
|
||||||
# :state => {
|
|
||||||
# :value => 'FW',
|
|
||||||
# },
|
|
||||||
# :frontend => false
|
|
||||||
#)
|
|
||||||
|
|
||||||
Setting.create_if_not_exists(
|
Setting.create_if_not_exists(
|
||||||
title: 'Ticket Number Format',
|
title: 'Ticket Number Format',
|
||||||
name: 'ticket_number',
|
name: 'ticket_number',
|
||||||
area: 'Ticket::Number',
|
area: 'Ticket::Number',
|
||||||
description: 'Selects the ticket number generator module. "Increment" increments the ticket
|
description: "@T('Selects the ticket number generator module.')
|
||||||
number, the SystemID and the counter are used with SystemID.Counter format (e.g. 1010138, 1010139).
|
* @T('**Increment** increments the ticket number, the SystemID and the counter are used with SystemID.Counter format (e.g. 1010138, 1010139).')
|
||||||
With "Date" the ticket numbers will be generated by the current date, the SystemID and the counter.
|
* @T('With **Date** the ticket numbers will be generated by the current date, the SystemID and the counter. The format looks like Year.Month.Day.SystemID.counter (e.g. 201206231010138, 201206231010139).')
|
||||||
The format looks like Year.Month.Day.SystemID.counter (e.g. 201206231010138, 201206231010139).
|
|
||||||
With param "Checksum => true" the counter will be appended as checksum to the string. The format
|
@T('With param 'Checksum => true' the counter will be appended as checksum to the string. The format looks like SystemID.Counter.CheckSum (e. g. 10101384, 10101392) or Year.Month.Day.SystemID.Counter.CheckSum (e.g. 2012070110101520, 2012070110101535).')",
|
||||||
looks like SystemID.Counter.CheckSum (e. g. 10101384, 10101392) or Year.Month.Day.SystemID.Counter.CheckSum (e.g. 2012070110101520, 2012070110101535).',
|
|
||||||
options: {
|
options: {
|
||||||
form: [
|
form: [
|
||||||
{
|
{
|
||||||
|
@ -1115,7 +1106,7 @@ Setting.create_if_not_exists(
|
||||||
title: 'Additional follow up detection',
|
title: 'Additional follow up detection',
|
||||||
name: 'postmaster_follow_up_search_in',
|
name: 'postmaster_follow_up_search_in',
|
||||||
area: 'Email::Base',
|
area: 'Email::Base',
|
||||||
description: 'In default the follow up check is done via the subject of an email. With this setting you can add more fields where the follow up ckeck is executed. "References" - Executes follow up check on In-Reply-To or References headers for mails. "Body" - Executes follow up check in mail body. "Attachment" - Executes follow up check in mail attachments.',
|
description: 'In default the follow up check is done via the subject of an email. With this setting you can add more fields where the follow up ckeck is executed.',
|
||||||
options: {
|
options: {
|
||||||
form: [
|
form: [
|
||||||
{
|
{
|
||||||
|
@ -1124,9 +1115,9 @@ Setting.create_if_not_exists(
|
||||||
name: 'postmaster_follow_up_search_in',
|
name: 'postmaster_follow_up_search_in',
|
||||||
tag: 'checkbox',
|
tag: 'checkbox',
|
||||||
options: {
|
options: {
|
||||||
'references' => 'References',
|
'references' => 'References - Search for follow up also in In-Reply-To or References headers.',
|
||||||
'body' => 'Body',
|
'body' => 'Body - Search for follow up also in mail body.',
|
||||||
'attachment' => 'Attachment',
|
'attachment' => 'Attachment - Search for follow up also in attachments.',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
Loading…
Reference in a new issue