Compare commits
495 commits
antifascis
...
antifascis
Author | SHA1 | Date | |
---|---|---|---|
|
64a3c7e02c | ||
|
dbe63a1ee1 | ||
|
f7f1068bf0 | ||
|
74c7a6b5f6 | ||
|
d1d67c3230 | ||
|
8a0d4ddd48 | ||
|
58e6657b79 | ||
|
0fb34f24cf | ||
|
3b513dc670 | ||
|
76fe4ce0e7 | ||
|
cadb462208 | ||
|
fbc1e4a252 | ||
|
a7643fec73 | ||
|
439b17800f | ||
|
e50ba0aca5 | ||
|
85649f8894 | ||
|
927ecff993 | ||
|
7279cb88b5 | ||
|
7c718d9c18 | ||
|
9ff3d80f49 | ||
|
aeb3486602 | ||
|
ab37cfe972 | ||
|
81408f7e87 | ||
|
3f81df1925 | ||
|
bb80177a02 | ||
|
62ae0e9944 | ||
|
c38c4e6226 | ||
|
757a9b274e | ||
|
08934daaf3 | ||
|
321aa0ea4c | ||
|
5a6df7fc82 | ||
|
5995c0e676 | ||
|
83414a365e | ||
|
1a41fdc4f8 | ||
|
ea163bb02f | ||
|
473cc70d3b | ||
|
79997ca992 | ||
|
e06d10978e | ||
|
d095cd6612 | ||
|
5fae57a8ce | ||
|
e00c2187a8 | ||
|
a19fee34f6 | ||
|
6f2f507385 | ||
|
49944a93e0 | ||
|
8042a609cd | ||
|
61f42f950f | ||
|
e552795183 | ||
|
13e3887dd8 | ||
|
ee6f1650cb | ||
|
e386190851 | ||
|
2c77e73c39 | ||
|
a969cd44d8 | ||
|
28c5b986d4 | ||
|
2cc110fd42 | ||
|
43aa552d8c | ||
|
54227e82ac | ||
|
652d2c27e9 | ||
|
bb7ff179ed | ||
|
339807b0a0 | ||
|
57f6b8ce6c | ||
|
07dd0e8c5a | ||
|
4ec64cf850 | ||
|
d71bd90ef9 | ||
|
6bdcbf933e | ||
|
858474dc4c | ||
|
177952f2f9 | ||
|
545289c29b | ||
|
bc7494dde2 | ||
|
a060554586 | ||
|
cfe2028210 | ||
|
d628b76258 | ||
|
859c851522 | ||
|
d0e872fcad | ||
|
88fc907599 | ||
|
f8e72c64c0 | ||
|
3cada0f15a | ||
|
52834f0d85 | ||
|
5bf0d6a106 | ||
|
cbf22c332d | ||
|
92d19a6221 | ||
|
b85bd1fe79 | ||
|
e667b48a1b | ||
|
8274bb8a11 | ||
|
0a3e7628b4 | ||
|
2844b6d95d | ||
|
74da7fa014 | ||
|
68a034e159 | ||
|
2c6710cd3f | ||
|
346ef5b3b2 | ||
|
68d7592610 | ||
|
94a467a2a3 | ||
|
7fad439870 | ||
|
49b73de11a | ||
|
772bf3516c | ||
|
a3a8661e90 | ||
|
62c527c772 | ||
|
9e1581d9b6 | ||
|
909715136e | ||
|
1e91639a4c | ||
|
83e9138014 | ||
|
740f8bf4d2 | ||
|
1049368fc7 | ||
|
f111d0cce3 | ||
|
58f3cd6737 | ||
|
76d8a83f0f | ||
|
2d6149234d | ||
|
2e02221535 | ||
|
cb90521e13 | ||
|
56ae3eb8e8 | ||
|
dcfe8759ff | ||
|
38f5768eb0 | ||
|
dbbd3095d7 | ||
|
1d344d5ec9 | ||
|
be44c36a02 | ||
|
8eb588a370 | ||
|
eefae45c2a | ||
|
0a0e77dab8 | ||
|
a7f312bec7 | ||
|
1cfd323845 | ||
|
b5feb6f4c9 | ||
|
2df8c9c7bf | ||
|
69755b6afd | ||
|
900f67f796 | ||
|
d0ccd3b194 | ||
|
459bbd405f | ||
|
4fe37d7193 | ||
|
6a6166f9a5 | ||
|
4a71dc4eeb | ||
|
20015da4d3 | ||
|
a2ed9a767e | ||
|
4ba97f797d | ||
|
513fadc8dc | ||
|
d6236a3afa | ||
|
86683b341e | ||
|
f052c2a33f | ||
|
e74af6e4bc | ||
|
381713e5db | ||
|
eb9882f39f | ||
|
765d2b2cd7 | ||
|
f254a97cc6 | ||
|
b7ebd470dd | ||
|
0b0bb8bc40 | ||
|
2fc02a9012 | ||
|
a95e9fae2d | ||
|
65bd4c7ce7 | ||
|
91e108fc97 | ||
|
e83f9b88ca | ||
|
f84ac43cdd | ||
|
25c971ed00 | ||
|
8e537754bf | ||
|
6937b4667f | ||
|
940e22db6d | ||
|
032995eeef | ||
|
4acf9cac67 | ||
|
cc9977460e | ||
|
8671aea0b4 | ||
|
6e42aeb1ee | ||
|
0fcbb11684 | ||
|
c6d9abd96e | ||
|
aae15bcf4d | ||
|
073d947f3f | ||
|
9bccb2d2d2 | ||
|
b6151cb0da | ||
|
26e833cace | ||
|
3abe4fbcef | ||
|
563d2d1e3d | ||
|
b8f5eb6a7d | ||
|
b924dbfa80 | ||
|
e32418e02c | ||
|
c1ae526ac0 | ||
|
c1d467aa3d | ||
|
92b7c39879 | ||
|
154b3accf9 | ||
|
3a4ada93b4 | ||
|
f0a8114af6 | ||
|
f7f6291504 | ||
|
b18a28bdbe | ||
|
7a6539b262 | ||
|
1183354321 | ||
|
8167915f52 | ||
|
b3e6e8a703 | ||
|
74895cde35 | ||
|
792a858bb3 | ||
|
f3c6741143 | ||
|
d3ca97a95d | ||
|
5867cf392c | ||
|
29a3b5fd54 | ||
|
2434aeb133 | ||
|
f40c5ea01e | ||
|
f7bf58b022 | ||
|
257ab2fc60 | ||
|
c73502d976 | ||
|
fc461e74c1 | ||
|
e9f0d3bcb1 | ||
|
84d2421c5c | ||
|
9f9df552e7 | ||
|
502aa2cde3 | ||
|
c68a376388 | ||
|
58f690069a | ||
|
5aee2830b6 | ||
|
09ec1be0ac | ||
|
334a629959 | ||
|
98438adeb1 | ||
|
294df1de2f | ||
|
4a2302b2ae | ||
|
502e60b051 | ||
|
dd71e0c219 | ||
|
d9e62c7110 | ||
|
4c83541c21 | ||
|
56fc5859e6 | ||
|
de30ba60ac | ||
|
170bfc6e59 | ||
|
e6aec87df1 | ||
|
fcd49d7135 | ||
|
85315f88dc | ||
|
62b6e34647 | ||
|
5c7f940f81 | ||
|
bf945b4ea1 | ||
|
5707517181 | ||
|
0b449839ea | ||
|
b61a3989dc | ||
|
ad2b3e1dca | ||
|
a7861725a1 | ||
|
98f789610a | ||
|
ffb958d22d | ||
|
ac3e020ef9 | ||
|
3d8398769a | ||
|
52ced8dd40 | ||
|
bb52f04db9 | ||
|
02d4ead4e3 | ||
|
c86ead67e4 | ||
|
b858b97742 | ||
|
7e9ec397be | ||
|
b2cc0d6a12 | ||
|
98604f84da | ||
|
ceac28ce4d | ||
|
48cfdc8697 | ||
|
afb75b23ae | ||
|
048ce041e7 | ||
|
7e62d3da88 | ||
|
83f35186e6 | ||
|
a70de9620a | ||
|
eeb3f1779c | ||
|
296d402ba0 | ||
|
04ad3348b7 | ||
|
bd373de069 | ||
|
b40ca87b2a | ||
|
f79e8c72cd | ||
|
8dd045af75 | ||
|
6b093828a5 | ||
|
0d98e453ef | ||
|
5b47ce9afd | ||
|
2aa1381c80 | ||
|
d63090e67e | ||
|
572d91f65e | ||
|
5b6ce4935f | ||
|
94ff5bccac | ||
|
2b78f5fff7 | ||
|
b5b1c88b54 | ||
|
63ae3d0838 | ||
|
8989916f21 | ||
|
a1af43d3e7 | ||
|
273b46b810 | ||
|
e65e787d61 | ||
|
e8259758b8 | ||
|
344d647079 | ||
|
c04a599f21 | ||
|
52780f64ce | ||
|
f087b9eb4d | ||
|
b2ecb71043 | ||
|
fd816b3c71 | ||
|
ff246de1d7 | ||
|
a1512f4f93 | ||
|
fdccd3cafd | ||
|
93932055dd | ||
|
db0eb45fe1 | ||
|
104e2b415e | ||
|
05cd060dbd | ||
|
1a1ec2e74a | ||
|
1214516ff7 | ||
|
d5a2890745 | ||
|
4186b0faaf | ||
|
1eed05d61d | ||
|
ce9267b5be | ||
|
4018904fd8 | ||
|
84b071a039 | ||
|
539f4bc0e4 | ||
|
4a954178b9 | ||
|
46b5761b9a | ||
|
6489fc7602 | ||
|
93fcc862e5 | ||
|
2dea7318a6 | ||
|
cd16bd29a5 | ||
|
bf3067d908 | ||
|
50e3b98955 | ||
|
04ce38a6f8 | ||
|
958d47412b | ||
|
47c75294f4 | ||
|
920d034412 | ||
|
9886d713d0 | ||
|
dcc1be937b | ||
|
2a86a454c5 | ||
|
1218912494 | ||
|
20516d6f6e | ||
|
2708704835 | ||
|
aaa87b4b06 | ||
|
4e1623cd50 | ||
|
b180a85e7f | ||
|
f2f36d0489 | ||
|
2793733829 | ||
|
6714b5f1a4 | ||
|
2c4ca0adfa | ||
|
2393fc85f2 | ||
|
eb0393dbc5 | ||
|
d215de138b | ||
|
24c3bdfd87 | ||
|
33753a3e16 | ||
|
fac03ff7ff | ||
|
9451ed6bc3 | ||
|
09f3b36056 | ||
|
f984a6fefb | ||
|
c3c8db139c | ||
|
4d245ce1de | ||
|
9765654723 | ||
|
f5b385fcf9 | ||
|
db52adaec1 | ||
|
a3779a2e10 | ||
|
5f01547258 | ||
|
818eb7a336 | ||
|
a6bbce9070 | ||
|
250d0bbd5e | ||
|
a5c728609d | ||
|
ee8fafe8ea | ||
|
d72dc2e6ec | ||
|
4c6effb5cf | ||
|
26a46c43d8 | ||
|
ccce4342d1 | ||
|
210c8e6159 | ||
|
933e82c06f | ||
|
c814e79a1b | ||
|
616c436b44 | ||
|
19287675c9 | ||
|
75683d30a2 | ||
|
a7569a796f | ||
|
e057d76e59 | ||
|
6e90f4bfa2 | ||
|
0aa3b153bc | ||
|
e052194036 | ||
|
0ccdfb398e | ||
|
80e76fc43d | ||
|
a9f014c700 | ||
|
429256ef39 | ||
|
39e8eae2d0 | ||
|
54e994e064 | ||
|
7b2a80a162 | ||
|
0456cce951 | ||
|
90d03cf542 | ||
|
1af052015f | ||
|
566fbe49fe | ||
|
5aa7d7c5b2 | ||
|
525476d539 | ||
|
41d72e92e9 | ||
|
3a76defc83 | ||
|
e0f7e8a530 | ||
|
4e2f310fbd | ||
|
c71be5b808 | ||
|
be407c23da | ||
|
b3de8b2afa | ||
|
c84416aec0 | ||
|
0b860a58f6 | ||
|
15f1c970c8 | ||
|
c0c30a9e01 | ||
|
ce53820726 | ||
|
a6e387cf9b | ||
|
2b532fe414 | ||
|
e7355e6d92 | ||
|
bc16e6c404 | ||
|
03fc7fd35f | ||
|
8735dc0090 | ||
|
03a6721958 | ||
|
f3d3eefc46 | ||
|
32b10f5023 | ||
|
32f3c88613 | ||
|
139ad5f566 | ||
|
19d13f15ec | ||
|
414b0a6f9b | ||
|
52969d690f | ||
|
7bbc2e64e8 | ||
|
fb32d57308 | ||
|
e959aa1160 | ||
|
d5f48bb195 | ||
|
f0ffe24b4e | ||
|
16df780314 | ||
|
cde6aa513a | ||
|
8c4683ca5a | ||
|
965372daee | ||
|
9218333699 | ||
|
e4a14268d6 | ||
|
059e2f90e4 | ||
|
99c8000c5f | ||
|
1f5d1bf8d3 | ||
|
8a97a41dc9 | ||
|
890853aa4b | ||
|
e1750ef7e1 | ||
|
a0d39cdc2c | ||
|
2070a58e2b | ||
|
a534752301 | ||
|
54388cece5 | ||
|
3fdbd59b20 | ||
|
9e128bf74b | ||
|
a77594d5bb | ||
|
36a662fff7 | ||
|
aefdee8d7f | ||
|
ccc9628804 | ||
|
64a87b1c67 | ||
|
6a6b19b4e6 | ||
|
939ffa445b | ||
|
e21d6c5414 | ||
|
44422c5357 | ||
|
92cd364ec2 | ||
|
1d2549b41f | ||
|
59ecff9274 | ||
|
8f5a74a560 | ||
|
08ea556eac | ||
|
ee613f8420 | ||
|
cb36109bc6 | ||
|
9318f2046e | ||
|
2b94843bb7 | ||
|
58898239d4 | ||
|
b7440faad1 | ||
|
94d9533e37 | ||
|
2b58a97c68 | ||
|
35d2e018f1 | ||
|
52aa34bb20 | ||
|
71d6b9e413 | ||
|
70e6a52a10 | ||
|
44bab0be75 | ||
|
be89a8bf5e | ||
|
189ccb21db | ||
|
614724aa62 | ||
|
e7c6ea63d0 | ||
|
c422acf885 | ||
|
f8b41a79f1 | ||
|
937f17e1a3 | ||
|
c7f7af1199 | ||
|
4f3b06036e | ||
|
cdd2980a2a | ||
|
5c333430ca | ||
|
d61932de6e | ||
|
41a04193da | ||
|
fd1a9c179b | ||
|
15b8fd472b | ||
|
9973839e44 | ||
|
d0e5614689 | ||
|
a9dedbaa52 | ||
|
32ca7239ed | ||
|
b94d728a05 | ||
|
1d67c84bef | ||
|
5bb17cb776 | ||
|
e338309791 | ||
|
fff31fc6fb | ||
|
a3aa9fa337 | ||
|
6d5134ab62 | ||
|
eccc9a79a9 | ||
|
8530951154 | ||
|
501a98b6c2 | ||
|
de9bb8bda9 | ||
|
d4dfd750b7 | ||
|
febed2e8a3 | ||
|
af9bcf96e4 | ||
|
191385714b | ||
|
3cf7b79edc | ||
|
dd30b18285 | ||
|
d4f997f0fd | ||
|
3515d3ca71 | ||
|
b68cf4b68d | ||
|
bcc0540f41 | ||
|
f83c48fc00 | ||
|
65b4ce9e65 | ||
|
f90225ace5 | ||
|
8561d97ddc | ||
|
4264327d9b | ||
|
94ff01a5c5 | ||
|
daad716b24 | ||
|
ba1b9e502f | ||
|
f73d9c5603 | ||
|
a3d62a72fb | ||
|
ee6d8c2eac | ||
|
76c6031ba1 | ||
|
0b9e95c5af | ||
|
2174ea8e85 | ||
|
711c517c52 | ||
|
77d147efaf | ||
|
e26d3ecfd3 | ||
|
3f48c222b5 |
3785 changed files with 665121 additions and 115050 deletions
91
.coffeelint/rules/detect_translatable_string.coffee
Normal file
91
.coffeelint/rules/detect_translatable_string.coffee
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
module.exports = class DetectTranslatableString
|
||||||
|
|
||||||
|
# coffeelint: disable=detect_translatable_string
|
||||||
|
rule:
|
||||||
|
name: 'detect_translatable_string'
|
||||||
|
level: 'ignore'
|
||||||
|
message: 'The following string looks like it should be marked as translatable via __(...)'
|
||||||
|
description: '''
|
||||||
|
'''
|
||||||
|
|
||||||
|
constructor: ->
|
||||||
|
@callTokens = []
|
||||||
|
|
||||||
|
tokens: ['STRING', 'CALL_START', 'CALL_END']
|
||||||
|
|
||||||
|
lintToken: (token, tokenApi) ->
|
||||||
|
[type, tokenValue] = token
|
||||||
|
|
||||||
|
if type in ['CALL_START', 'CALL_END']
|
||||||
|
@trackCall token, tokenApi
|
||||||
|
return
|
||||||
|
|
||||||
|
return false if @isInIgnoredMethod()
|
||||||
|
|
||||||
|
return @lintString(token, tokenApi)
|
||||||
|
|
||||||
|
lintString: (token, tokenApi) ->
|
||||||
|
[type, tokenValue] = token
|
||||||
|
|
||||||
|
# Remove quotes.
|
||||||
|
string = tokenValue[1..-2]
|
||||||
|
|
||||||
|
# Ignore strings with less than two words.
|
||||||
|
return false if string.split(' ').length < 2
|
||||||
|
|
||||||
|
# Ignore strings that are being used as exception; unlike Ruby exceptions, these should not reach the user.
|
||||||
|
return false if tokenApi.peek(-3)[1] == 'throw'
|
||||||
|
return false if tokenApi.peek(-2)[1] == 'throw'
|
||||||
|
return false if tokenApi.peek(-1)[1] == 'throw'
|
||||||
|
|
||||||
|
# Ignore strings that are being used for comparison
|
||||||
|
return false if tokenApi.peek(-1)[1] == '=='
|
||||||
|
|
||||||
|
# String interpolation is handled via concatenation, ignore such strings.
|
||||||
|
return false if tokenApi.peek(1)[1] == '+'
|
||||||
|
return false if tokenApi.peek(2)[1] == '+'
|
||||||
|
|
||||||
|
BLOCKLIST = [
|
||||||
|
# Only look at strings starting with upper case letters
|
||||||
|
/^[^A-Z]/,
|
||||||
|
# # Ignore strings starting with three upper case letters like SELECT, POST etc.
|
||||||
|
# /^[A-Z]{3}/,
|
||||||
|
]
|
||||||
|
|
||||||
|
return false if BLOCKLIST.some (entry) ->
|
||||||
|
#console.log([string, entry, string.match(entry), token, tokenApi.peek(-1), tokenApi.peek(1)])
|
||||||
|
string.match(entry)
|
||||||
|
|
||||||
|
# console.log(tokenApi.peek(-3))
|
||||||
|
# console.log(tokenApi.peek(-2))
|
||||||
|
# console.log(tokenApi.peek(-1))
|
||||||
|
# console.log(token)
|
||||||
|
|
||||||
|
return { context: "Found: #{token[1]}" }
|
||||||
|
|
||||||
|
ignoredMethods: {
|
||||||
|
'__': true,
|
||||||
|
'log': true,
|
||||||
|
'T': true,
|
||||||
|
'controllerBind': true,
|
||||||
|
'error': true, # App.Log.error
|
||||||
|
'set': true, # App.Config.set
|
||||||
|
'translateInline': true,
|
||||||
|
'translateContent': true,
|
||||||
|
'translatePlain': true,
|
||||||
|
}
|
||||||
|
|
||||||
|
isInIgnoredMethod: ->
|
||||||
|
#console.log(@callTokens)
|
||||||
|
for t in @callTokens
|
||||||
|
return true if t.isIgnoredMethod
|
||||||
|
return false
|
||||||
|
|
||||||
|
trackCall: (token, tokenApi) ->
|
||||||
|
if token[0] is 'CALL_START'
|
||||||
|
p = tokenApi.peek(-1)
|
||||||
|
token.isIgnoredMethod = p and @ignoredMethods[p[1]]
|
||||||
|
@callTokens.push(token)
|
||||||
|
else
|
||||||
|
@callTokens.pop()
|
||||||
|
return null
|
|
@ -1,2 +0,0 @@
|
||||||
--exclude-exts=.min.css
|
|
||||||
--ignore=adjoining-classes,box-model,ids,order-alphabetical,unqualified-attributes
|
|
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
public/assets/** filter=lfs diff=lfs merge=lfs -text
|
|
@ -1,10 +0,0 @@
|
||||||
user=zammad
|
|
||||||
project=zammad
|
|
||||||
output=CHANGELOG.md
|
|
||||||
since-tag=1.0.0
|
|
||||||
bug-labels=bug,minor bug,security
|
|
||||||
enhancement-labels=enhancement,feature,feature backlog
|
|
||||||
issues-wo-labels=false
|
|
||||||
include-labels=security,trigger,UX/UI,admin area,API,browser,bug,channel,chat,email filter,enhancement,feature,feature backlog,import,minor bug,notification,email filter,ticket templates,
|
|
||||||
issue-line-labels=enhancement,feature,feature backlog,bug,minor bug,notification,reporting,security,ticket templates,translation,trigger,UX/UI
|
|
||||||
exclude-tags=9.0.1,0.9.1,v0.1.8,v0.1.7,unittests_passed
|
|
27
.gitignore
vendored
27
.gitignore
vendored
|
@ -37,20 +37,15 @@
|
||||||
/db/*.sqlite3
|
/db/*.sqlite3
|
||||||
/db/schema.rb
|
/db/schema.rb
|
||||||
|
|
||||||
# translation cache files
|
# legacy translation cache files
|
||||||
/config/locales*.yml
|
/config/locales-*.yml
|
||||||
/config/translations/*.yml
|
/config/translations/*.yml
|
||||||
|
|
||||||
# NPM / Yarn
|
# NPM / Yarn
|
||||||
/node_modules
|
/node_modules
|
||||||
/yarn.lock
|
|
||||||
|
|
||||||
# logfiles and tempfiles
|
# logfiles and tempfiles
|
||||||
/log
|
/log
|
||||||
/public/assets/*.*
|
|
||||||
/public/assets/addons
|
|
||||||
/public/assets/app
|
|
||||||
/public/assets/custom
|
|
||||||
/public/assets/chat/node_modules
|
/public/assets/chat/node_modules
|
||||||
/tmp/*
|
/tmp/*
|
||||||
!/tmp/pids
|
!/tmp/pids
|
||||||
|
@ -58,17 +53,9 @@
|
||||||
!/tmp/pids/.keep
|
!/tmp/pids/.keep
|
||||||
/storage/fs
|
/storage/fs
|
||||||
|
|
||||||
# doorkeeper (OAuth 2)
|
|
||||||
/public/assets/doorkeeper
|
|
||||||
|
|
||||||
# images
|
# images
|
||||||
/public/assets/images/*
|
/public/assets/images/yarn.lock
|
||||||
!/public/assets/images/icons/
|
/public/assets/images/node_modules
|
||||||
!/public/assets/images/avatar-bg.png
|
|
||||||
!/public/assets/images/chat-demo-avatar.png
|
|
||||||
!/public/assets/images/eyedropper.gif
|
|
||||||
!/public/assets/images/icons.svg
|
|
||||||
!/public/assets/images/logo.svg
|
|
||||||
|
|
||||||
# Third-Party ------------------------------------------------------------------
|
# Third-Party ------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -84,12 +71,12 @@
|
||||||
# Eclipse
|
# Eclipse
|
||||||
/.project
|
/.project
|
||||||
|
|
||||||
|
# VSCode
|
||||||
|
/.vscode
|
||||||
|
|
||||||
# Byebug
|
# Byebug
|
||||||
/.byebug_history
|
/.byebug_history
|
||||||
|
|
||||||
# SimpleCov
|
|
||||||
/coverage
|
|
||||||
|
|
||||||
# RDoc / YARD
|
# RDoc / YARD
|
||||||
/doc
|
/doc
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
default:
|
default:
|
||||||
image: registry.znuny.com/docker/zammad-ci:2.7.4
|
image: $CI_REGISTRY/docker/zammad-ci:2.7.4
|
||||||
|
|
||||||
include:
|
include:
|
||||||
- local: '/.gitlab/ci/base.yml'
|
- local: '/.gitlab/ci/base.yml'
|
||||||
|
@ -55,7 +55,9 @@ cache:
|
||||||
# Initialize application env
|
# Initialize application env
|
||||||
before_script:
|
before_script:
|
||||||
- source /etc/profile.d/rvm.sh
|
- source /etc/profile.d/rvm.sh
|
||||||
- source /opt/rh/rh-nodejs12/enable
|
- source /opt/rh/rh-nodejs*/enable
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:bundle_install[collapsed=true]\\r\\e[0Kbundle install"
|
||||||
- bundle install -j $(nproc) --path vendor
|
- bundle install -j $(nproc) --path vendor
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:bundle_install\\r\\e[0K"
|
||||||
- bundle exec ruby .gitlab/configure_environment.rb
|
- bundle exec ruby .gitlab/configure_environment.rb
|
||||||
- source .gitlab/environment.env
|
- source .gitlab/environment.env
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Artifacts are stored for failed jobs for 2 days
|
# Artifacts are stored for failed jobs
|
||||||
.artifacts_error: &artifacts_error
|
.artifacts_error: &artifacts_error
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: 2 days
|
expire_in: 1 week
|
||||||
when: on_failure
|
when: on_failure
|
||||||
paths:
|
paths:
|
||||||
- tmp/screenshot*
|
- tmp/screenshot*
|
||||||
|
@ -12,6 +12,7 @@
|
||||||
variables:
|
variables:
|
||||||
ES_INDEX_RAND: "true"
|
ES_INDEX_RAND: "true"
|
||||||
ES_URL: "http://elasticsearch:9200"
|
ES_URL: "http://elasticsearch:9200"
|
||||||
|
ELASTICSEARCH_TAG: '7.16'
|
||||||
|
|
||||||
.variables_redis_memcached: &variables_redis_memcached
|
.variables_redis_memcached: &variables_redis_memcached
|
||||||
variables:
|
variables:
|
||||||
|
@ -22,17 +23,19 @@
|
||||||
variables:
|
variables:
|
||||||
REMOTE_URL: "http://selenium-firefox:4444/wd/hub"
|
REMOTE_URL: "http://selenium-firefox:4444/wd/hub"
|
||||||
BROWSER: "firefox"
|
BROWSER: "firefox"
|
||||||
# Settings for Selenium 3:
|
BROWSER_HEADLESS: "true"
|
||||||
NODE_MAX_INSTANCES: "5"
|
START_XVFB: "false" # not needed for headless mode
|
||||||
NODE_MAX_SESSION: "5"
|
SE_NODE_MAX_SESSIONS: "5"
|
||||||
|
SE_NODE_OVERRIDE_MAX_SESSIONS: "true"
|
||||||
|
|
||||||
.variables_selenium_chrome: &variables_selenium_chrome
|
.variables_selenium_chrome: &variables_selenium_chrome
|
||||||
variables:
|
variables:
|
||||||
REMOTE_URL: "http://selenium-chrome:4444/wd/hub"
|
REMOTE_URL: "http://selenium-chrome:4444/wd/hub"
|
||||||
BROWSER: chrome
|
BROWSER: chrome
|
||||||
# Settings for Selenium 3:
|
BROWSER_HEADLESS: "true"
|
||||||
NODE_MAX_INSTANCES: "5"
|
START_XVFB: "false" # not needed for headless mode
|
||||||
NODE_MAX_SESSION: "5"
|
SE_NODE_MAX_SESSIONS: "5"
|
||||||
|
SE_NODE_OVERRIDE_MAX_SESSIONS: "true"
|
||||||
|
|
||||||
.variables_app_restart_cmd: &variables_app_restart_cmd
|
.variables_app_restart_cmd: &variables_app_restart_cmd
|
||||||
variables:
|
variables:
|
||||||
|
@ -62,6 +65,11 @@
|
||||||
tags:
|
tags:
|
||||||
- docker
|
- docker
|
||||||
|
|
||||||
|
.tags_docker_low_concurrency: &tags_docker_low_concurrency
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
- low_concurrency
|
||||||
|
|
||||||
# Workaround for blocked port 25 access on cloud provider infrastructure
|
# Workaround for blocked port 25 access on cloud provider infrastructure
|
||||||
.tags_mail: &tags_mail
|
.tags_mail: &tags_mail
|
||||||
tags:
|
tags:
|
||||||
|
@ -74,35 +82,35 @@
|
||||||
|
|
||||||
# DB Docker
|
# DB Docker
|
||||||
.docker_mysql: &docker_mysql
|
.docker_mysql: &docker_mysql
|
||||||
name: registry.znuny.com/docker/zammad-mysql:stable
|
name: $CI_REGISTRY/docker/zammad-mysql:stable
|
||||||
alias: mysql
|
alias: mysql
|
||||||
|
|
||||||
.docker_postgresql: &docker_postgresql
|
.docker_postgresql: &docker_postgresql
|
||||||
name: registry.znuny.com/docker/zammad-postgresql:stable
|
name: $CI_REGISTRY/docker/zammad-postgresql:stable
|
||||||
alias: postgresql
|
alias: postgresql
|
||||||
|
|
||||||
.docker_elasticsearch: &docker_elasticsearch
|
.docker_elasticsearch: &docker_elasticsearch
|
||||||
name: registry.znuny.com/docker/zammad-elasticsearch:$ELASTICSEARCH_TAG
|
name: $CI_REGISTRY/docker/zammad-elasticsearch:$ELASTICSEARCH_TAG
|
||||||
alias: elasticsearch
|
alias: elasticsearch
|
||||||
|
|
||||||
.docker_selenium_chrome: &docker_selenium_chrome
|
.docker_selenium_chrome: &docker_selenium_chrome
|
||||||
name: registry.znuny.com/docker/zammad-selenium-chrome:stable
|
name: $CI_REGISTRY/docker/zammad-selenium-chrome:stable
|
||||||
alias: selenium-chrome
|
alias: selenium-chrome
|
||||||
|
|
||||||
.docker_selenium_firefox: &docker_selenium_firefox
|
.docker_selenium_firefox: &docker_selenium_firefox
|
||||||
name: registry.znuny.com/docker/zammad-selenium-firefox:stable
|
name: $CI_REGISTRY/docker/zammad-selenium-firefox:stable
|
||||||
alias: selenium-firefox
|
alias: selenium-firefox
|
||||||
|
|
||||||
.docker_imap: &docker_imap
|
.docker_imap: &docker_imap
|
||||||
name: registry.znuny.com/docker/zammad-imap:stable
|
name: $CI_REGISTRY/docker/zammad-imap:stable
|
||||||
alias: mail
|
alias: mail
|
||||||
|
|
||||||
.docker_redis: &docker_redis
|
.docker_redis: &docker_redis
|
||||||
name: registry.znuny.com/docker/zammad-redis:stable
|
name: $CI_REGISTRY/docker/zammad-redis:stable
|
||||||
alias: redis
|
alias: redis
|
||||||
|
|
||||||
.docker_memcached: &docker_memcached
|
.docker_memcached: &docker_memcached
|
||||||
name: registry.znuny.com/docker/zammad-memcached:stable
|
name: $CI_REGISTRY/docker/zammad-memcached:stable
|
||||||
alias: memcached
|
alias: memcached
|
||||||
command: ["memcached", "-m", "256M"]
|
command: ["memcached", "-m", "256M"]
|
||||||
|
|
||||||
|
@ -131,11 +139,6 @@
|
||||||
- <<: *docker_redis
|
- <<: *docker_redis
|
||||||
- <<: *docker_memcached
|
- <<: *docker_memcached
|
||||||
|
|
||||||
.services_mysql_postgresql: &services_mysql_postgresql
|
|
||||||
services:
|
|
||||||
- <<: *docker_mysql
|
|
||||||
- <<: *docker_postgresql
|
|
||||||
|
|
||||||
.services_mysql_postgresql_redis_memcached: &services_mysql_postgresql_redis_memcached
|
.services_mysql_postgresql_redis_memcached: &services_mysql_postgresql_redis_memcached
|
||||||
extends:
|
extends:
|
||||||
- .variables_redis_memcached
|
- .variables_redis_memcached
|
||||||
|
@ -166,8 +169,6 @@
|
||||||
- <<: *docker_imap
|
- <<: *docker_imap
|
||||||
|
|
||||||
.services_mysql_postgresql_elasticsearch: &services_mysql_postgresql_elasticsearch
|
.services_mysql_postgresql_elasticsearch: &services_mysql_postgresql_elasticsearch
|
||||||
variables:
|
|
||||||
ELASTICSEARCH_TAG: 'stable'
|
|
||||||
services:
|
services:
|
||||||
- <<: *docker_mysql
|
- <<: *docker_mysql
|
||||||
- <<: *docker_postgresql
|
- <<: *docker_postgresql
|
||||||
|
@ -176,8 +177,6 @@
|
||||||
.services_mysql_postgresql_elasticsearch_selenium_chrome_imap: &services_mysql_postgresql_elasticsearch_selenium_chrome_imap
|
.services_mysql_postgresql_elasticsearch_selenium_chrome_imap: &services_mysql_postgresql_elasticsearch_selenium_chrome_imap
|
||||||
extends:
|
extends:
|
||||||
- .variables_selenium_chrome
|
- .variables_selenium_chrome
|
||||||
variables:
|
|
||||||
ELASTICSEARCH_TAG: 'stable'
|
|
||||||
services:
|
services:
|
||||||
- <<: *docker_mysql
|
- <<: *docker_mysql
|
||||||
- <<: *docker_postgresql
|
- <<: *docker_postgresql
|
||||||
|
@ -188,8 +187,6 @@
|
||||||
.services_mysql_postgresql_elasticsearch_selenium_firefox_imap: &services_mysql_postgresql_elasticsearch_selenium_firefox_imap
|
.services_mysql_postgresql_elasticsearch_selenium_firefox_imap: &services_mysql_postgresql_elasticsearch_selenium_firefox_imap
|
||||||
extends:
|
extends:
|
||||||
- .variables_selenium_firefox
|
- .variables_selenium_firefox
|
||||||
variables:
|
|
||||||
ELASTICSEARCH_TAG: 'stable'
|
|
||||||
services:
|
services:
|
||||||
- <<: *docker_mysql
|
- <<: *docker_mysql
|
||||||
- <<: *docker_postgresql
|
- <<: *docker_postgresql
|
||||||
|
@ -201,8 +198,6 @@
|
||||||
extends:
|
extends:
|
||||||
- .variables_selenium_chrome
|
- .variables_selenium_chrome
|
||||||
- .variables_redis_memcached
|
- .variables_redis_memcached
|
||||||
variables:
|
|
||||||
ELASTICSEARCH_TAG: 'stable'
|
|
||||||
services:
|
services:
|
||||||
- <<: *docker_mysql
|
- <<: *docker_mysql
|
||||||
- <<: *docker_postgresql
|
- <<: *docker_postgresql
|
||||||
|
@ -216,8 +211,6 @@
|
||||||
extends:
|
extends:
|
||||||
- .variables_selenium_firefox
|
- .variables_selenium_firefox
|
||||||
- .variables_redis_memcached
|
- .variables_redis_memcached
|
||||||
variables:
|
|
||||||
ELASTICSEARCH_TAG: 'stable'
|
|
||||||
services:
|
services:
|
||||||
- <<: *docker_mysql
|
- <<: *docker_mysql
|
||||||
- <<: *docker_postgresql
|
- <<: *docker_postgresql
|
||||||
|
|
|
@ -19,12 +19,15 @@ include:
|
||||||
- .env_base
|
- .env_base
|
||||||
- .variables_es
|
- .variables_es
|
||||||
- .variables_app_restart_cmd
|
- .variables_app_restart_cmd
|
||||||
|
- .tags_docker_low_concurrency
|
||||||
variables:
|
variables:
|
||||||
RAILS_ENV: "production"
|
RAILS_ENV: "production"
|
||||||
script:
|
script:
|
||||||
- script/build/test_slice_tests.sh $TEST_SLICE
|
- script/build/test_slice_tests.sh $TEST_SLICE
|
||||||
- RAILS_ENV=test bundle exec rake db:create
|
- RAILS_ENV=test bundle exec rake db:create
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_ci_test_start[collapsed=true]\\r\\e[0Kbundle exec rake zammad:ci:test:start"
|
||||||
- bundle exec rake zammad:ci:test:start[with_elasticsearch]
|
- bundle exec rake zammad:ci:test:start[with_elasticsearch]
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_ci_test_start\\r\\e[0K"
|
||||||
- time bundle exec rails test --fail-fast test/browser
|
- time bundle exec rails test --fail-fast test/browser
|
||||||
|
|
||||||
.template_browser-core_chrome: &template_browser-core_chrome
|
.template_browser-core_chrome: &template_browser-core_chrome
|
||||||
|
@ -44,6 +47,7 @@ include:
|
||||||
extends:
|
extends:
|
||||||
- .env_base
|
- .env_base
|
||||||
- .variables_app_restart_cmd
|
- .variables_app_restart_cmd
|
||||||
|
- .tags_docker_low_concurrency
|
||||||
variables:
|
variables:
|
||||||
RAILS_ENV: "production"
|
RAILS_ENV: "production"
|
||||||
AUTO_WIZARD_FILE: "contrib/auto_wizard_example.json"
|
AUTO_WIZARD_FILE: "contrib/auto_wizard_example.json"
|
||||||
|
@ -51,7 +55,9 @@ include:
|
||||||
script:
|
script:
|
||||||
- RAILS_ENV=test bundle exec rake db:create
|
- RAILS_ENV=test bundle exec rake db:create
|
||||||
- cp $AUTO_WIZARD_FILE auto_wizard.json
|
- cp $AUTO_WIZARD_FILE auto_wizard.json
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_ci_test_start[collapsed=true]\\r\\e[0Kbundle exec rake zammad:ci:test:start"
|
||||||
- bundle exec rake zammad:ci:test:start
|
- bundle exec rake zammad:ci:test:start
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_ci_test_start\\r\\e[0K"
|
||||||
- bundle exec rails test $TEST_FILE
|
- bundle exec rails test $TEST_FILE
|
||||||
|
|
||||||
.template_browser-core_autowizard_chrome: &template_browser-core_autowizard_chrome
|
.template_browser-core_autowizard_chrome: &template_browser-core_autowizard_chrome
|
||||||
|
@ -72,6 +78,7 @@ include:
|
||||||
- .env_base
|
- .env_base
|
||||||
- .variables_app_restart_cmd
|
- .variables_app_restart_cmd
|
||||||
- .services_mysql_postgresql_redis_memcached
|
- .services_mysql_postgresql_redis_memcached
|
||||||
|
- .tags_docker_low_concurrency
|
||||||
variables:
|
variables:
|
||||||
RAILS_ENV: "production"
|
RAILS_ENV: "production"
|
||||||
|
|
||||||
|
@ -83,10 +90,13 @@ include:
|
||||||
- .env_base
|
- .env_base
|
||||||
- .variables_es
|
- .variables_es
|
||||||
- .variables_rspec_slicing
|
- .variables_rspec_slicing
|
||||||
|
- .tags_docker_low_concurrency
|
||||||
variables:
|
variables:
|
||||||
RAILS_ENV: "test"
|
RAILS_ENV: "test"
|
||||||
script:
|
script:
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_ci_test_prepare[collapsed=true]\\r\\e[0Kbundle exec rake zammad:ci:test:prepare"
|
||||||
- bundle exec rake zammad:ci:test:prepare
|
- bundle exec rake zammad:ci:test:prepare
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_ci_test_prepare\\r\\e[0K"
|
||||||
- echo "RSpec filter:" "$RSPEC_EXAMPLE_MATCHES"
|
- echo "RSpec filter:" "$RSPEC_EXAMPLE_MATCHES"
|
||||||
- bundle exec rspec --require ./spec/rspec_extensions.rb --example-matches "$RSPEC_EXAMPLE_MATCHES" --fail-fast -t ~integration --profile 10 spec/system
|
- bundle exec rspec --require ./spec/rspec_extensions.rb --example-matches "$RSPEC_EXAMPLE_MATCHES" --fail-fast -t ~integration --profile 10 spec/system
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,9 @@ api_client_php:
|
||||||
ZAMMAD_PHP_API_CLIENT_UNIT_TESTS_PASSWORD: "test"
|
ZAMMAD_PHP_API_CLIENT_UNIT_TESTS_PASSWORD: "test"
|
||||||
script:
|
script:
|
||||||
- RAILS_ENV=test bundle exec rake db:create
|
- RAILS_ENV=test bundle exec rake db:create
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_ci_test_start[collapsed=true]\\r\\e[0Kbundle exec rake zammad:ci:test:start"
|
||||||
- RAILS_ENV=test bundle exec rake zammad:ci:test:start zammad:setup:auto_wizard
|
- RAILS_ENV=test bundle exec rake zammad:ci:test:start zammad:setup:auto_wizard
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_ci_test_start\\r\\e[0K"
|
||||||
- git clone https://github.com/zammad/zammad-api-client-php.git
|
- git clone https://github.com/zammad/zammad-api-client-php.git
|
||||||
- php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
|
- php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
|
||||||
- php composer-setup.php --install-dir=/usr/local/bin
|
- php composer-setup.php --install-dir=/usr/local/bin
|
||||||
|
|
|
@ -4,7 +4,9 @@ api_client_ruby:
|
||||||
script:
|
script:
|
||||||
- RAILS_ENV=test bundle exec rake db:create
|
- RAILS_ENV=test bundle exec rake db:create
|
||||||
- cp contrib/auto_wizard_test.json auto_wizard.json
|
- cp contrib/auto_wizard_test.json auto_wizard.json
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_ci_test_start[collapsed=true]\\r\\e[0Kbundle exec rake zammad:ci:test:start"
|
||||||
- bundle exec rake zammad:ci:test:start
|
- bundle exec rake zammad:ci:test:start
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_ci_test_start\\r\\e[0K"
|
||||||
- git clone https://github.com/zammad/zammad-api-client-ruby.git
|
- git clone https://github.com/zammad/zammad-api-client-ruby.git
|
||||||
- cd zammad-api-client-ruby
|
- cd zammad-api-client-ruby
|
||||||
- bundle update --bundler
|
- bundle update --bundler
|
||||||
|
|
|
@ -13,5 +13,7 @@ browser:build:
|
||||||
variables:
|
variables:
|
||||||
RAILS_ENV: "production"
|
RAILS_ENV: "production"
|
||||||
script:
|
script:
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_db_unseeded[collapsed=true]\\r\\e[0Kbundle exec rake zammad:db:unseeded"
|
||||||
- bundle exec rake zammad:db:unseeded
|
- bundle exec rake zammad:db:unseeded
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_db_unseeded\\r\\e[0K"
|
||||||
- bundle exec rake assets:precompile
|
- bundle exec rake assets:precompile
|
||||||
|
|
|
@ -27,9 +27,3 @@
|
||||||
- .template_browser-core_chrome
|
- .template_browser-core_chrome
|
||||||
variables:
|
variables:
|
||||||
TEST_SLICE: "5"
|
TEST_SLICE: "5"
|
||||||
|
|
||||||
6_chrome:
|
|
||||||
extends:
|
|
||||||
- .template_browser-core_chrome
|
|
||||||
variables:
|
|
||||||
TEST_SLICE: "6"
|
|
||||||
|
|
|
@ -28,9 +28,3 @@
|
||||||
- .template_browser-core_firefox
|
- .template_browser-core_firefox
|
||||||
variables:
|
variables:
|
||||||
TEST_SLICE: "5"
|
TEST_SLICE: "5"
|
||||||
|
|
||||||
6_firefox:
|
|
||||||
extends:
|
|
||||||
- .template_browser-core_firefox
|
|
||||||
variables:
|
|
||||||
TEST_SLICE: "6"
|
|
||||||
|
|
|
@ -14,10 +14,13 @@ include:
|
||||||
- .env_base
|
- .env_base
|
||||||
- .variables_app_restart_cmd
|
- .variables_app_restart_cmd
|
||||||
- .variables_es
|
- .variables_es
|
||||||
|
- .tags_docker_low_concurrency
|
||||||
variables:
|
variables:
|
||||||
RAILS_ENV: "test"
|
RAILS_ENV: "test"
|
||||||
script:
|
script:
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_ci_test_prepare[collapsed=true]\\r\\e[0Kbundle exec rake zammad:ci:test:prepare"
|
||||||
- bundle exec rake zammad:ci:test:prepare
|
- bundle exec rake zammad:ci:test:prepare
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_ci_test_prepare\\r\\e[0K"
|
||||||
- bundle exec rspec --fail-fast --pattern "spec/system/**/*_spec.rb" -t integration --profile 10
|
- bundle exec rspec --fail-fast --pattern "spec/system/**/*_spec.rb" -t integration --profile 10
|
||||||
|
|
||||||
.template_browser-integration_capybara_chrome: &template_browser-integration_capybara_chrome
|
.template_browser-integration_capybara_chrome: &template_browser-integration_capybara_chrome
|
||||||
|
@ -38,13 +41,16 @@ include:
|
||||||
- .env_base
|
- .env_base
|
||||||
- .variables_app_restart_cmd
|
- .variables_app_restart_cmd
|
||||||
- .services_postgresql_selenium_chrome
|
- .services_postgresql_selenium_chrome
|
||||||
|
- .tags_docker_low_concurrency
|
||||||
variables:
|
variables:
|
||||||
RAILS_ENV: "production"
|
RAILS_ENV: "production"
|
||||||
AUTO_WIZARD_FILE: "contrib/auto_wizard_test.json"
|
AUTO_WIZARD_FILE: "contrib/auto_wizard_test.json"
|
||||||
script:
|
script:
|
||||||
- RAILS_ENV=test bundle exec rake db:create
|
- RAILS_ENV=test bundle exec rake db:create
|
||||||
- cp $AUTO_WIZARD_FILE auto_wizard.json
|
- cp $AUTO_WIZARD_FILE auto_wizard.json
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_ci_test_start[collapsed=true]\\r\\e[0Kbundle exec rake zammad:ci:test:start"
|
||||||
- bundle exec rake zammad:ci:test:start
|
- bundle exec rake zammad:ci:test:start
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_ci_test_start\\r\\e[0K"
|
||||||
- bundle exec rails test $TEST_FILE
|
- bundle exec rails test $TEST_FILE
|
||||||
|
|
||||||
.template_browser-integration_import_chrome: &template_browser-integration_import_chrome
|
.template_browser-integration_import_chrome: &template_browser-integration_import_chrome
|
||||||
|
@ -54,12 +60,15 @@ include:
|
||||||
extends:
|
extends:
|
||||||
- .env_base
|
- .env_base
|
||||||
- .services_postgresql_selenium_chrome
|
- .services_postgresql_selenium_chrome
|
||||||
|
- .tags_docker_low_concurrency
|
||||||
variables:
|
variables:
|
||||||
RAILS_ENV: "production"
|
RAILS_ENV: "production"
|
||||||
RAILS_SERVE_STATIC_FILES: "true"
|
RAILS_SERVE_STATIC_FILES: "true"
|
||||||
script:
|
script:
|
||||||
- RAILS_ENV=test bundle exec rake db:create
|
- RAILS_ENV=test bundle exec rake db:create
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_ci_test_start[collapsed=true]\\r\\e[0Kbundle exec rake zammad:ci:test:start"
|
||||||
- bundle exec rake zammad:ci:test:start
|
- bundle exec rake zammad:ci:test:start
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_ci_test_start\\r\\e[0K"
|
||||||
- bundle exec rails test $TEST_FILE
|
- bundle exec rails test $TEST_FILE
|
||||||
|
|
||||||
# we need at least one job to store and include this template
|
# we need at least one job to store and include this template
|
||||||
|
|
|
@ -7,11 +7,11 @@ otrs_chrome:
|
||||||
IMPORT_OTRS_ENDPOINT: "http://zammad-ci-otrsimport-app/otrs/public.pl?Action=ZammadMigrator"
|
IMPORT_OTRS_ENDPOINT: "http://zammad-ci-otrsimport-app/otrs/public.pl?Action=ZammadMigrator"
|
||||||
TZ: "Europe/Berlin" # Required for the zammad-ci-otrsimport-app containers
|
TZ: "Europe/Berlin" # Required for the zammad-ci-otrsimport-app containers
|
||||||
services:
|
services:
|
||||||
- name: registry.znuny.com/docker/zammad-postgresql:stable
|
- name: $CI_REGISTRY/docker/zammad-postgresql:stable
|
||||||
alias: postgresql
|
alias: postgresql
|
||||||
- name: registry.znuny.com/docker/zammad-selenium-chrome:stable
|
- name: $CI_REGISTRY/docker/zammad-selenium-chrome:stable
|
||||||
alias: selenium-chrome
|
alias: selenium-chrome
|
||||||
- name: registry.znuny.com/docker/zammad-ci-otrsimport-db:otrs6
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-db:otrs6
|
||||||
alias: zammad-ci-otrsimport-db
|
alias: zammad-ci-otrsimport-db
|
||||||
- name: registry.znuny.com/docker/zammad-ci-otrsimport-app:otrs6
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs6
|
||||||
alias: zammad-ci-otrsimport-app
|
alias: zammad-ci-otrsimport-app
|
||||||
|
|
|
@ -1,16 +1,12 @@
|
||||||
include:
|
include:
|
||||||
- local: '/.gitlab/ci/integration/clearbit.yml'
|
|
||||||
- local: '/.gitlab/ci/integration/email_helper_deliver.yml'
|
|
||||||
- local: '/.gitlab/ci/integration/es.yml'
|
- local: '/.gitlab/ci/integration/es.yml'
|
||||||
- local: '/.gitlab/ci/integration/geo.yml'
|
- local: '/.gitlab/ci/integration/other.yml'
|
||||||
- local: '/.gitlab/ci/integration/otrs.yml'
|
- local: '/.gitlab/ci/integration/otrs.yml'
|
||||||
- local: '/.gitlab/ci/integration/slack.yml'
|
|
||||||
- local: '/.gitlab/ci/integration/user_agent.yml'
|
|
||||||
|
|
||||||
.template_integration: &template_integration
|
.template_integration: &template_integration
|
||||||
extends:
|
extends:
|
||||||
- .env_base
|
- .env_base
|
||||||
- .services_mysql_postgresql
|
- .services_mysql_postgresql_imap
|
||||||
- .rules_integration_manual_start
|
- .rules_integration_manual_start
|
||||||
tags:
|
tags:
|
||||||
- integration
|
- integration
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
clearbit:
|
|
||||||
extends:
|
|
||||||
- .template_integration
|
|
||||||
script:
|
|
||||||
- bundle exec rake zammad:db:unseeded
|
|
||||||
- bundle exec rails test test/integration/clearbit_test.rb
|
|
||||||
allow_failure: true
|
|
|
@ -1,11 +0,0 @@
|
||||||
email_helper_deliver:
|
|
||||||
extends:
|
|
||||||
- .template_integration
|
|
||||||
- .tags_mail
|
|
||||||
- .services_mysql_postgresql_imap
|
|
||||||
script:
|
|
||||||
- bundle exec rake zammad:db:unseeded
|
|
||||||
- bundle exec rails test test/integration/email_helper_test.rb
|
|
||||||
- bundle exec rails test test/integration/email_deliver_test.rb
|
|
||||||
- bundle exec rails test test/integration/email_keep_on_server_test.rb
|
|
||||||
- bundle exec rails test test/integration/email_postmaster_to_sender.rb
|
|
|
@ -7,20 +7,23 @@
|
||||||
tags:
|
tags:
|
||||||
- integration
|
- integration
|
||||||
script:
|
script:
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_db_unseeded[collapsed=true]\\r\\e[0Kbundle exec rake zammad:db:unseeded"
|
||||||
- bundle exec rake zammad:db:unseeded
|
- bundle exec rake zammad:db:unseeded
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_db_unseeded\\r\\e[0K"
|
||||||
- bundle exec rails test test/integration/elasticsearch_active_test.rb
|
- bundle exec rails test test/integration/elasticsearch_active_test.rb
|
||||||
- bundle exec rails test test/integration/elasticsearch_test.rb
|
- bundle exec rails test test/integration/elasticsearch_test.rb
|
||||||
- bundle exec rspec --tag searchindex --tag ~type:system --profile 10
|
- bundle exec rspec --tag searchindex --tag ~type:system --profile 10
|
||||||
- bundle exec rails test test/integration/report_test.rb
|
|
||||||
|
|
||||||
es:7:
|
# Lowest supported version
|
||||||
<<: *template_integration_es
|
"rspec:es:7.8":
|
||||||
variables:
|
|
||||||
ELASTICSEARCH_TAG: '7'
|
|
||||||
RAILS_ENV: "test"
|
|
||||||
|
|
||||||
es:7.8:
|
|
||||||
<<: *template_integration_es
|
<<: *template_integration_es
|
||||||
variables:
|
variables:
|
||||||
ELASTICSEARCH_TAG: '7.8.1'
|
ELASTICSEARCH_TAG: '7.8.1'
|
||||||
RAILS_ENV: "test"
|
RAILS_ENV: "test"
|
||||||
|
|
||||||
|
# Highest supported version (except for newer releases that are not yet in CI)
|
||||||
|
"rspec:es:7.16":
|
||||||
|
<<: *template_integration_es
|
||||||
|
variables:
|
||||||
|
ELASTICSEARCH_TAG: '7.16'
|
||||||
|
RAILS_ENV: "test"
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
geo:
|
|
||||||
extends:
|
|
||||||
- .template_integration
|
|
||||||
script:
|
|
||||||
- bundle exec rake zammad:db:unseeded
|
|
||||||
- bundle exec rails test test/integration/geo_calendar_test.rb
|
|
||||||
- bundle exec rails test test/integration/geo_location_test.rb
|
|
||||||
- bundle exec rails test test/integration/geo_ip_test.rb
|
|
27
.gitlab/ci/integration/other.yml
Normal file
27
.gitlab/ci/integration/other.yml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
"minitest:integration:other":
|
||||||
|
extends:
|
||||||
|
- .template_integration
|
||||||
|
script:
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_db_unseeded[collapsed=true]\\r\\e[0Kbundle exec rake zammad:db:unseeded"
|
||||||
|
- bundle exec rake zammad:db:unseeded
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_db_unseeded\\r\\e[0K"
|
||||||
|
- echo "email_helper_deliver tests..."
|
||||||
|
- bundle exec rails test test/integration/email_helper_test.rb
|
||||||
|
- bundle exec rails test test/integration/email_deliver_test.rb
|
||||||
|
- bundle exec rails test test/integration/email_keep_on_server_test.rb
|
||||||
|
- bundle exec rails test test/integration/email_postmaster_to_sender.rb
|
||||||
|
- echo "Clearbit test..."
|
||||||
|
- bundle exec rails test test/integration/clearbit_test.rb
|
||||||
|
- echo "Geo tests..."
|
||||||
|
- bundle exec rails test test/integration/geo_calendar_test.rb
|
||||||
|
- bundle exec rails test test/integration/geo_location_test.rb
|
||||||
|
- bundle exec rails test test/integration/geo_ip_test.rb
|
||||||
|
- echo "Slack test..."
|
||||||
|
- bundle exec rails test test/integration/slack_test.rb
|
||||||
|
- echo "UserAgent tests..."
|
||||||
|
- bundle exec rails test test/integration/user_agent_test.rb
|
||||||
|
- export ZAMMAD_PROXY_TEST=true
|
||||||
|
- bundle exec rails test test/integration/user_agent_test.rb
|
||||||
|
|
||||||
|
|
||||||
|
allow_failure: true
|
|
@ -2,81 +2,83 @@
|
||||||
extends:
|
extends:
|
||||||
- .template_integration
|
- .template_integration
|
||||||
script:
|
script:
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_db_unseeded[collapsed=true]\\r\\e[0Kbundle exec rake zammad:db:unseeded"
|
||||||
- bundle exec rake zammad:db:unseeded
|
- bundle exec rake zammad:db:unseeded
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_db_unseeded\\r\\e[0K"
|
||||||
- bundle exec rails test test/integration/otrs_import_test.rb
|
- bundle exec rails test test/integration/otrs_import_test.rb
|
||||||
variables:
|
variables:
|
||||||
FF_NETWORK_PER_BUILD: 1 # https://docs.gitlab.com/runner/configuration/feature-flags.html
|
FF_NETWORK_PER_BUILD: 1 # https://docs.gitlab.com/runner/configuration/feature-flags.html
|
||||||
IMPORT_OTRS_ENDPOINT: "http://zammad-ci-otrsimport-app/otrs/public.pl?Action=ZammadMigrator"
|
IMPORT_OTRS_ENDPOINT: 'http://zammad-ci-otrsimport-app/otrs/public.pl?Action=ZammadMigrator'
|
||||||
TZ: "Europe/Berlin" # Required for the zammad-ci-otrsimport-app containers
|
TZ: 'Europe/Berlin' # Required for the zammad-ci-otrsimport-app containers
|
||||||
|
|
||||||
otrs:6:
|
'minitest:integration:otrs:6':
|
||||||
<<: *template_integration_otrs
|
<<: *template_integration_otrs
|
||||||
services:
|
services:
|
||||||
- name: registry.znuny.com/docker/zammad-mysql:stable
|
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
||||||
alias: mysql
|
alias: mysql
|
||||||
- name: registry.znuny.com/docker/zammad-postgresql:stable
|
- name: $CI_REGISTRY/docker/zammad-postgresql:stable
|
||||||
alias: postgresql
|
alias: postgresql
|
||||||
- name: registry.znuny.com/docker/zammad-ci-otrsimport-db:otrs6
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-db:otrs6
|
||||||
alias: zammad-ci-otrsimport-db
|
alias: zammad-ci-otrsimport-db
|
||||||
- name: registry.znuny.com/docker/zammad-ci-otrsimport-app:otrs6
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs6
|
||||||
alias: zammad-ci-otrsimport-app
|
alias: zammad-ci-otrsimport-app
|
||||||
|
|
||||||
otrs:5:
|
'minitest:integration:otrs:5':
|
||||||
<<: *template_integration_otrs
|
<<: *template_integration_otrs
|
||||||
services:
|
services:
|
||||||
- name: registry.znuny.com/docker/zammad-mysql:stable
|
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
||||||
alias: mysql
|
alias: mysql
|
||||||
- name: registry.znuny.com/docker/zammad-postgresql:stable
|
- name: $CI_REGISTRY/docker/zammad-postgresql:stable
|
||||||
alias: postgresql
|
alias: postgresql
|
||||||
- name: registry.znuny.com/docker/zammad-ci-otrsimport-db:otrs5
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-db:otrs5
|
||||||
alias: zammad-ci-otrsimport-db
|
alias: zammad-ci-otrsimport-db
|
||||||
- name: registry.znuny.com/docker/zammad-ci-otrsimport-app:otrs5
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs5
|
||||||
alias: zammad-ci-otrsimport-app
|
alias: zammad-ci-otrsimport-app
|
||||||
|
|
||||||
otrs:4:
|
'minitest:integration:otrs:4':
|
||||||
<<: *template_integration_otrs
|
<<: *template_integration_otrs
|
||||||
services:
|
services:
|
||||||
- name: registry.znuny.com/docker/zammad-mysql:stable
|
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
||||||
alias: mysql
|
alias: mysql
|
||||||
- name: registry.znuny.com/docker/zammad-postgresql:stable
|
- name: $CI_REGISTRY/docker/zammad-postgresql:stable
|
||||||
alias: postgresql
|
alias: postgresql
|
||||||
- name: registry.znuny.com/docker/zammad-ci-otrsimport-db:otrs4
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-db:otrs4
|
||||||
alias: zammad-ci-otrsimport-db
|
alias: zammad-ci-otrsimport-db
|
||||||
- name: registry.znuny.com/docker/zammad-ci-otrsimport-app:otrs4
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs4
|
||||||
alias: zammad-ci-otrsimport-app
|
alias: zammad-ci-otrsimport-app
|
||||||
|
|
||||||
otrs:33:
|
'minitest:integration:otrs:33':
|
||||||
<<: *template_integration_otrs
|
<<: *template_integration_otrs
|
||||||
services:
|
services:
|
||||||
- name: registry.znuny.com/docker/zammad-mysql:stable
|
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
||||||
alias: mysql
|
alias: mysql
|
||||||
- name: registry.znuny.com/docker/zammad-postgresql:stable
|
- name: $CI_REGISTRY/docker/zammad-postgresql:stable
|
||||||
alias: postgresql
|
alias: postgresql
|
||||||
- name: registry.znuny.com/docker/zammad-ci-otrsimport-db:otrs33
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-db:otrs33
|
||||||
alias: zammad-ci-otrsimport-db
|
alias: zammad-ci-otrsimport-db
|
||||||
- name: registry.znuny.com/docker/zammad-ci-otrsimport-app:otrs33
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs33
|
||||||
alias: zammad-ci-otrsimport-app
|
alias: zammad-ci-otrsimport-app
|
||||||
|
|
||||||
otrs:32:
|
'minitest:integration:otrs:32':
|
||||||
<<: *template_integration_otrs
|
<<: *template_integration_otrs
|
||||||
services:
|
services:
|
||||||
- name: registry.znuny.com/docker/zammad-mysql:stable
|
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
||||||
alias: mysql
|
alias: mysql
|
||||||
- name: registry.znuny.com/docker/zammad-postgresql:stable
|
- name: $CI_REGISTRY/docker/zammad-postgresql:stable
|
||||||
alias: postgresql
|
alias: postgresql
|
||||||
- name: registry.znuny.com/docker/zammad-ci-otrsimport-db:otrs32
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-db:otrs32
|
||||||
alias: zammad-ci-otrsimport-db
|
alias: zammad-ci-otrsimport-db
|
||||||
- name: registry.znuny.com/docker/zammad-ci-otrsimport-app:otrs32
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs32
|
||||||
alias: zammad-ci-otrsimport-app
|
alias: zammad-ci-otrsimport-app
|
||||||
|
|
||||||
otrs:31:
|
'minitest:integration:otrs:31':
|
||||||
<<: *template_integration_otrs
|
<<: *template_integration_otrs
|
||||||
services:
|
services:
|
||||||
- name: registry.znuny.com/docker/zammad-mysql:stable
|
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
||||||
alias: mysql
|
alias: mysql
|
||||||
- name: registry.znuny.com/docker/zammad-postgresql:stable
|
- name: $CI_REGISTRY/docker/zammad-postgresql:stable
|
||||||
alias: postgresql
|
alias: postgresql
|
||||||
- name: registry.znuny.com/docker/zammad-ci-otrsimport-db:otrs31
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-db:otrs31
|
||||||
alias: zammad-ci-otrsimport-db
|
alias: zammad-ci-otrsimport-db
|
||||||
- name: registry.znuny.com/docker/zammad-ci-otrsimport-app:otrs31
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs31
|
||||||
alias: zammad-ci-otrsimport-app
|
alias: zammad-ci-otrsimport-app
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
slack:
|
|
||||||
extends:
|
|
||||||
- .template_integration
|
|
||||||
rules:
|
|
||||||
- if: $CI_MERGE_REQUEST_ID
|
|
||||||
when: never
|
|
||||||
- if: '$CI_COMMIT_BRANCH =~ /^private/'
|
|
||||||
when: manual
|
|
||||||
allow_failure: true
|
|
||||||
- when: on_success
|
|
||||||
script:
|
|
||||||
- bundle exec rake zammad:db:unseeded
|
|
||||||
- bundle exec rails test test/integration/slack_test.rb
|
|
|
@ -1,8 +0,0 @@
|
||||||
user_agent:
|
|
||||||
extends:
|
|
||||||
- .template_integration
|
|
||||||
script:
|
|
||||||
- bundle exec rake zammad:db:unseeded
|
|
||||||
- bundle exec rails test test/integration/user_agent_test.rb
|
|
||||||
- export ZAMMAD_PROXY_TEST=true
|
|
||||||
- bundle exec rails test test/integration/user_agent_test.rb
|
|
|
@ -6,15 +6,28 @@
|
||||||
- .rules_singletest
|
- .rules_singletest
|
||||||
before_script:
|
before_script:
|
||||||
- source /etc/profile.d/rvm.sh # ensure RVM is loaded
|
- source /etc/profile.d/rvm.sh # ensure RVM is loaded
|
||||||
- source /opt/rh/rh-nodejs12/enable # ensure Node.js is available
|
- source /opt/rh/rh-nodejs*/enable # ensure Node.js is available
|
||||||
|
|
||||||
rubocop:
|
.template_pre_rails: &template_pre_rails
|
||||||
<<: *template_pre
|
stage: pre
|
||||||
script:
|
extends:
|
||||||
|
- .tags_docker
|
||||||
|
- .rules_singletest
|
||||||
|
- .services_postgresql
|
||||||
|
before_script:
|
||||||
|
- source /etc/profile.d/rvm.sh # ensure RVM is loaded
|
||||||
|
- source /opt/rh/rh-nodejs*/enable # ensure Node.js is available
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:bundle_install[collapsed=true]\\r\\e[0Kbundle install"
|
||||||
- bundle install -j $(nproc) --path vendor
|
- bundle install -j $(nproc) --path vendor
|
||||||
- bundle exec rubocop --parallel
|
- echo -e "\\e[0Ksection_end:`date +%s`:bundle_install\\r\\e[0K"
|
||||||
|
- bundle exec ruby .gitlab/configure_environment.rb
|
||||||
|
- source .gitlab/environment.env
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_db_init[collapsed=true]\\r\\e[0Kbundle exec rake zammad:db:init"
|
||||||
|
- bundle exec rake zammad:db:init
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_db_init\\r\\e[0K"
|
||||||
|
|
||||||
shellcheck:
|
# Must be a separate job because it uses a custom image.
|
||||||
|
"lint: shellcheck":
|
||||||
<<: *template_pre
|
<<: *template_pre
|
||||||
image: koalaman/shellcheck-alpine:stable
|
image: koalaman/shellcheck-alpine:stable
|
||||||
before_script:
|
before_script:
|
||||||
|
@ -22,48 +35,65 @@ shellcheck:
|
||||||
script:
|
script:
|
||||||
- shellcheck -S warning $(find . -name "*.sh" -o -name "functions" | grep -v "/vendor/")
|
- shellcheck -S warning $(find . -name "*.sh" -o -name "functions" | grep -v "/vendor/")
|
||||||
|
|
||||||
zeitwerk_check:
|
"lint: i18n, rails & security":
|
||||||
<<: *template_pre
|
<<: *template_pre_rails
|
||||||
extends:
|
|
||||||
- .tags_docker
|
|
||||||
- .services_postgresql
|
|
||||||
script:
|
|
||||||
- bundle install -j $(nproc) --path vendor
|
|
||||||
- bundle exec ruby .gitlab/configure_environment.rb
|
|
||||||
- source .gitlab/environment.env
|
|
||||||
- bundle exec rake zammad:db:init
|
|
||||||
- bundle exec rails zeitwerk:check
|
|
||||||
|
|
||||||
brakeman:
|
|
||||||
<<: *template_pre
|
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: 1 week
|
expire_in: 1 week
|
||||||
paths:
|
paths:
|
||||||
- tmp/brakeman-report.html
|
- tmp/brakeman-report.html
|
||||||
when: on_failure
|
when: on_failure
|
||||||
script:
|
script:
|
||||||
- bundle install -j $(nproc) --path vendor
|
- echo "Checking .po file syntax..."
|
||||||
|
- for FILE in i18n/*.pot i18n/*.po; do echo "Checking $FILE"; msgfmt -o /dev/null -c $FILE; done
|
||||||
|
- echo "Checking .pot catalog consistency..."
|
||||||
|
- bundle exec rails generate translation_catalog --check
|
||||||
|
- echo "Brakeman security check..."
|
||||||
- bundle exec brakeman -o /dev/stdout -o tmp/brakeman-report.html
|
- bundle exec brakeman -o /dev/stdout -o tmp/brakeman-report.html
|
||||||
|
- echo "bundler-audit security check..."
|
||||||
coffeelint:
|
|
||||||
<<: *template_pre
|
|
||||||
script:
|
|
||||||
- coffeelint app/
|
|
||||||
|
|
||||||
bundle-audit:
|
|
||||||
<<: *template_pre
|
|
||||||
script:
|
|
||||||
- gem install bundler-audit
|
- gem install bundler-audit
|
||||||
- bundle-audit update
|
- bundle-audit update
|
||||||
- bundle-audit --ignore CVE-2015-9284
|
- bundle-audit --ignore CVE-2015-9284
|
||||||
|
- echo "Rails zeitwerk:check autoloader check..."
|
||||||
|
- bundle exec rails zeitwerk:check
|
||||||
|
|
||||||
github:
|
"lint: ruby, js & css":
|
||||||
<<: *template_pre
|
<<: *template_pre
|
||||||
tags:
|
|
||||||
- deploy
|
|
||||||
before_script:
|
|
||||||
- "" # no RVM present in deploy ENV
|
|
||||||
script:
|
script:
|
||||||
|
- echo "Coffeelint check..."
|
||||||
|
- coffeelint --rules ./.coffeelint/rules/* app/
|
||||||
|
- echo "Stylelint check..."
|
||||||
|
- yarn install
|
||||||
|
- yarn lint:css
|
||||||
|
- echo "Rubocop check..."
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:bundle_install[collapsed=true]\\r\\e[0Kbundle install"
|
||||||
|
- bundle install -j $(nproc) --path vendor
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:bundle_install\\r\\e[0K"
|
||||||
|
- bundle exec rubocop --parallel
|
||||||
|
|
||||||
|
# Must be a separate job because it may fail and is only executed for develop.
|
||||||
|
"lint: orphaned ruby gems":
|
||||||
|
<<: *template_pre_rails
|
||||||
|
allow_failure: true
|
||||||
|
rules:
|
||||||
|
- if: $CI_MERGE_REQUEST_ID
|
||||||
|
when: never
|
||||||
|
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
|
||||||
|
when: always
|
||||||
|
- when: manual
|
||||||
|
script:
|
||||||
|
- bundle exec rake zammad:ci:bundle:orphaned 5
|
||||||
|
|
||||||
|
# Executed on a dedicated runner.
|
||||||
|
"push to github":
|
||||||
|
<<: *template_pre
|
||||||
|
before_script:
|
||||||
|
- test -d $HOME/.ssh || mkdir $HOME/.ssh
|
||||||
|
- ssh-keyscan github.com >> $HOME/.ssh/known_hosts
|
||||||
|
- eval $(ssh-agent -s)
|
||||||
|
- echo "$PUSH_TO_GITHUB_SSH_PRIVATE_KEY" | ssh-add -
|
||||||
|
- ssh-add -l
|
||||||
|
script:
|
||||||
|
- git fetch --unshallow
|
||||||
- script/build/sync_repo.sh git@github.com:zammad/zammad.git
|
- script/build/sync_repo.sh git@github.com:zammad/zammad.git
|
||||||
|
|
||||||
global_refresh_envs:
|
global_refresh_envs:
|
||||||
|
@ -75,7 +105,7 @@ global_refresh_envs:
|
||||||
resource_group: global_refresh_envs
|
resource_group: global_refresh_envs
|
||||||
# allow download via the web UI to restore ENVs in case global cache got deleted (see: `.gitlab-ci.yml`)
|
# allow download via the web UI to restore ENVs in case global cache got deleted (see: `.gitlab-ci.yml`)
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: 1 day
|
expire_in: 1 week
|
||||||
paths:
|
paths:
|
||||||
- fresh.env
|
- fresh.env
|
||||||
rules:
|
rules:
|
||||||
|
|
|
@ -7,7 +7,9 @@ include:
|
||||||
- .env_base
|
- .env_base
|
||||||
- .variables_rspec_slicing
|
- .variables_rspec_slicing
|
||||||
script:
|
script:
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_db_init[collapsed=true]\\r\\e[0Kbundle exec rake zammad:db:init"
|
||||||
- bundle exec rake zammad:db:init
|
- bundle exec rake zammad:db:init
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_db_init\\r\\e[0K"
|
||||||
- echo "RSpec filter:" "$RSPEC_EXAMPLE_MATCHES"
|
- echo "RSpec filter:" "$RSPEC_EXAMPLE_MATCHES"
|
||||||
- bundle exec rspec --require ./spec/rspec_extensions.rb --example-matches "$RSPEC_EXAMPLE_MATCHES" --exclude-pattern "spec/{system,integration}/**/*_spec.rb" -t ~searchindex --profile 10
|
- bundle exec rspec --require ./spec/rspec_extensions.rb --example-matches "$RSPEC_EXAMPLE_MATCHES" --exclude-pattern "spec/{system,integration}/**/*_spec.rb" -t ~searchindex --profile 10
|
||||||
|
|
||||||
|
@ -23,13 +25,8 @@ rspec:integration:
|
||||||
- .rules_integration_manual_start
|
- .rules_integration_manual_start
|
||||||
variables:
|
variables:
|
||||||
RAILS_ENV: "test"
|
RAILS_ENV: "test"
|
||||||
rules:
|
|
||||||
- if: $CI_MERGE_REQUEST_ID
|
|
||||||
when: never
|
|
||||||
- if: '$CI_COMMIT_BRANCH =~ /^private/ && $INTEGRATION_TESTS != "enabled"'
|
|
||||||
when: manual
|
|
||||||
allow_failure: true
|
|
||||||
- when: always
|
|
||||||
script:
|
script:
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_db_init[collapsed=true]\\r\\e[0Kbundle exec rake zammad:db:init"
|
||||||
- bundle exec rake zammad:db:init
|
- bundle exec rake zammad:db:init
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_db_init\\r\\e[0K"
|
||||||
- bundle exec rspec -t type:integration --profile 10
|
- bundle exec rspec -t type:integration --profile 10
|
||||||
|
|
|
@ -8,7 +8,9 @@ include:
|
||||||
variables:
|
variables:
|
||||||
RAILS_ENV: "test"
|
RAILS_ENV: "test"
|
||||||
script:
|
script:
|
||||||
|
- echo -e "\\e[0Ksection_start:`date +%s`:zammad_db_init[collapsed=true]\\r\\e[0Kbundle exec rake zammad:db:init"
|
||||||
- bundle exec rake zammad:db:init
|
- bundle exec rake zammad:db:init
|
||||||
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_db_init\\r\\e[0K"
|
||||||
- bundle exec rake test:units
|
- bundle exec rake test:units
|
||||||
- bundle exec rails test test/integration/object_manager_test.rb
|
- bundle exec rails test test/integration/object_manager_test.rb
|
||||||
- bundle exec rails test test/integration/package_test.rb
|
- bundle exec rails test test/integration/package_test.rb
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#!/usr/bin/env ruby
|
#!/usr/bin/env ruby
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
require 'resolv'
|
require 'resolv'
|
||||||
|
|
|
@ -86,7 +86,7 @@ This MR does not require any follow-up.
|
||||||
|
|
||||||
- [ ] Implementation satisfies specification
|
- [ ] Implementation satisfies specification
|
||||||
- [ ] Changes confirmed by manual testing
|
- [ ] Changes confirmed by manual testing
|
||||||
- [ ] [Code style](https://git.znuny.com/zammad/zammad/-/wikis/Coding-style-guide) is appropriate
|
- [ ] [Code style](https://git.zammad.com/zammad/zammad/-/wikis/Coding-style-guide) is appropriate
|
||||||
- [ ] Performance will not degrade
|
- [ ] Performance will not degrade
|
||||||
- [ ] Code is properly covered with tests
|
- [ ] Code is properly covered with tests
|
||||||
- If follow-up by the documentation team is needed:
|
- If follow-up by the documentation team is needed:
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
## What does this MR do?
|
||||||
|
|
||||||
|
<!--Insert the link to a Asana card in (), or describe the task/changec if there is no related task (but normally there should be always a referenced task) -->
|
||||||
|
[Asana Task Link]()
|
||||||
|
|
||||||
|
## ToDo Checklist
|
||||||
|
|
||||||
|
- [ ] Checked that the needed functionality is not already available in a common component.
|
||||||
|
- [ ] Checked if newly created components can be added in a common way (e.g. common component).
|
||||||
|
- [ ] Created or changed story for common component.
|
||||||
|
- [ ] Covered common component with Jest-Test
|
||||||
|
- [ ] Checked that i didn't add a API request inside of a common component.
|
||||||
|
- [ ] Covered new functionality with Jest-Test(*)
|
||||||
|
- [ ] When relevant: Covered new GraphQL (Mutation/Query) with a request test.
|
||||||
|
|
||||||
|
(*) Jest tests are normally only needed for the common components or other typescript functionality, because the other functionality will be tested with selenium tests and own GraphQL-API tests (with this we avoid that we need always to mock the graphql calls). But for sure special frontend handling should also be tested with a jest test.
|
||||||
|
|
||||||
|
## QA Checklist (to be filled by the reviewer)
|
||||||
|
|
||||||
|
- [ ] Implementation satisfies specification
|
||||||
|
- [ ] Changes confirmed by manual testing
|
||||||
|
- [ ] [Code style](https://git.zammad.com/zammad/zammad/-/wikis/Coding-style-guide) is appropriate
|
||||||
|
- [ ] Code is properly covered with tests
|
|
@ -0,0 +1,17 @@
|
||||||
|
## What does this MR do?
|
||||||
|
|
||||||
|
<!--Insert the link to a Asana card in (), or describe the task/changec if there is no related task (but normally there should be always a referenced task) -->
|
||||||
|
[Asana Task Link]()
|
||||||
|
|
||||||
|
## ToDo Checklist
|
||||||
|
|
||||||
|
- [ ] Checked that the feature will also work in the scope of packages.
|
||||||
|
- [ ] Added comments for "special" core code parts.
|
||||||
|
- [ ] Added the feature in the "developer manual" with some clear explanation and examples for the usage.
|
||||||
|
|
||||||
|
## QA Checklist (to be filled by the reviewer)
|
||||||
|
|
||||||
|
- [ ] Implementation satisfies specification
|
||||||
|
- [ ] Changes confirmed by manual testing
|
||||||
|
- [ ] [Code style](https://git.zammad.com/zammad/zammad/-/wikis/Coding-style-guide) is appropriate
|
||||||
|
- [ ] Code is properly covered with tests
|
|
@ -1,3 +1,6 @@
|
||||||
|
# Don't complain when changing branches with different overcommit configurations.
|
||||||
|
verify_signatures: false
|
||||||
|
|
||||||
CommitMsg:
|
CommitMsg:
|
||||||
ALL:
|
ALL:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
@ -9,10 +12,25 @@ PreCommit:
|
||||||
enabled: false
|
enabled: false
|
||||||
RuboCop:
|
RuboCop:
|
||||||
enabled: true
|
enabled: true
|
||||||
on_warn: fail # Treat all warnings as failures
|
on_warn: fail
|
||||||
CoffeeLint:
|
CoffeeLint:
|
||||||
|
# .coffeelint/rules/* not supported in YAML, specify all rules separately.
|
||||||
|
flags:
|
||||||
|
[
|
||||||
|
'--reporter=csv',
|
||||||
|
'--rules',
|
||||||
|
'./.coffeelint/rules/detect_translatable_string.coffee',
|
||||||
|
]
|
||||||
|
enabled: true
|
||||||
|
on_warn: fail
|
||||||
|
exclude: 'public/assets/chat/**/*'
|
||||||
|
CustomScript:
|
||||||
|
enabled: true
|
||||||
|
description: 'Check if translation catalog is up-to-date'
|
||||||
|
required_executable: 'rails'
|
||||||
|
flags: ['generate', 'translation_catalog', '--check']
|
||||||
|
Stylelint:
|
||||||
enabled: true
|
enabled: true
|
||||||
on_warn: fail # Treat all warnings as failures
|
|
||||||
|
|
||||||
PostCheckout:
|
PostCheckout:
|
||||||
ALL:
|
ALL:
|
||||||
|
@ -41,4 +59,3 @@ PreRebase:
|
||||||
PrepareCommitMsg:
|
PrepareCommitMsg:
|
||||||
ALL:
|
ALL:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
|
||||||
|
|
12
.pkgr.yml
12
.pkgr.yml
|
@ -56,6 +56,18 @@ targets:
|
||||||
- libimlib2
|
- libimlib2
|
||||||
- libimlib2-dev
|
- libimlib2-dev
|
||||||
- shared-mime-info
|
- shared-mime-info
|
||||||
|
debian-11:
|
||||||
|
dependencies:
|
||||||
|
- curl
|
||||||
|
- elasticsearch|elasticsearch-oss
|
||||||
|
- nginx|apache2
|
||||||
|
- postgresql|mariadb-server
|
||||||
|
- libimlib2
|
||||||
|
- shared-mime-info
|
||||||
|
build_dependencies:
|
||||||
|
- libimlib2
|
||||||
|
- libimlib2-dev
|
||||||
|
- shared-mime-info
|
||||||
ubuntu-16.04:
|
ubuntu-16.04:
|
||||||
dependencies:
|
dependencies:
|
||||||
- curl
|
- curl
|
||||||
|
|
6
.prettierrc.json
Normal file
6
.prettierrc.json
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"semi": false,
|
||||||
|
"singleQuote": true,
|
||||||
|
"tabWidth": 2,
|
||||||
|
"trailingComma": "all"
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
module RuboCop
|
module RuboCop
|
||||||
module Cop
|
module Cop
|
||||||
|
|
90
.rubocop/cop/zammad/detect_translatable_string.rb
Normal file
90
.rubocop/cop/zammad/detect_translatable_string.rb
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
|
module RuboCop
|
||||||
|
module Cop
|
||||||
|
module Zammad
|
||||||
|
class DetectTranslatableString < Base
|
||||||
|
extend AutoCorrector
|
||||||
|
|
||||||
|
MSG = 'This string looks like it should be marked as translatable via __(...).'.freeze
|
||||||
|
|
||||||
|
def on_str(node)
|
||||||
|
# Constants like __FILE__ are handled as strings, but don't respond to begin.
|
||||||
|
return if !node.loc.respond_to?(:begin) || !node.loc.begin
|
||||||
|
return if part_of_ignored_node?(node)
|
||||||
|
|
||||||
|
return if !offense?(node)
|
||||||
|
|
||||||
|
add_offense(node) do |corrector|
|
||||||
|
corrector.replace(node, "__(#{node.source})")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def on_regexp(node)
|
||||||
|
ignore_node(node)
|
||||||
|
end
|
||||||
|
|
||||||
|
METHOD_NAME_BLOCKLIST = %i[
|
||||||
|
__ translate
|
||||||
|
include? eql? parse
|
||||||
|
debug info warn error fatal unknown log log_error
|
||||||
|
].freeze
|
||||||
|
|
||||||
|
def on_send(node)
|
||||||
|
ignore_node(node) if METHOD_NAME_BLOCKLIST.include? node.method_name
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
PARENT_SOURCE_BLOCKLIST = [
|
||||||
|
# Ignore logged strings
|
||||||
|
'Rails.logger'
|
||||||
|
].freeze
|
||||||
|
|
||||||
|
NODE_START_BLOCKLIST = [
|
||||||
|
# Only look at strings starting with upper case letters
|
||||||
|
%r{[^A-Z]},
|
||||||
|
# Ignore strings starting with three upper case letters like SELECT, POST etc.
|
||||||
|
%r{[A-Z]{3}},
|
||||||
|
].freeze
|
||||||
|
|
||||||
|
NODE_CONTAIN_BLOCKLIST = [
|
||||||
|
# Ignore strings with interpolation.
|
||||||
|
'#{',
|
||||||
|
# Ignore Email addresses
|
||||||
|
'@'
|
||||||
|
].freeze
|
||||||
|
|
||||||
|
def offense?(node) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
||||||
|
|
||||||
|
# Ignore Hash Keys
|
||||||
|
return false if node.parent.type.eql?(:pair) && node.parent.children.first.equal?(node)
|
||||||
|
|
||||||
|
# Ignore equality checks like ... == 'My String'
|
||||||
|
return false if node.left_sibling.eql?(:==)
|
||||||
|
|
||||||
|
# Remove quotes
|
||||||
|
node_source = node.source[1..-2]
|
||||||
|
|
||||||
|
# Only match strings with at least two words
|
||||||
|
return false if node_source.split.count < 2
|
||||||
|
|
||||||
|
NODE_START_BLOCKLIST.each do |entry|
|
||||||
|
return false if node_source.start_with? entry
|
||||||
|
end
|
||||||
|
|
||||||
|
NODE_CONTAIN_BLOCKLIST.each do |entry|
|
||||||
|
return false if node_source.include? entry
|
||||||
|
end
|
||||||
|
|
||||||
|
parent_source = node.parent.source
|
||||||
|
PARENT_SOURCE_BLOCKLIST.each do |entry|
|
||||||
|
return false if parent_source.include? entry
|
||||||
|
end
|
||||||
|
|
||||||
|
true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
module RuboCop
|
module RuboCop
|
||||||
module Cop
|
module Cop
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
module RuboCop
|
module RuboCop
|
||||||
module Cop
|
module Cop
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
module RuboCop
|
module RuboCop
|
||||||
module Cop
|
module Cop
|
||||||
|
@ -17,7 +17,7 @@ module RuboCop
|
||||||
PATTERN
|
PATTERN
|
||||||
|
|
||||||
def_node_matcher :has_reset?, <<-PATTERN
|
def_node_matcher :has_reset?, <<-PATTERN
|
||||||
$(send _ {:describe :context :it} (_ ...) (hash ... (pair (sym :db_strategy) (sym {:reset :reset_all}))))
|
$(send _ {:describe :context :it :shared_examples} (_ ...) (hash <(pair (sym :db_strategy) (sym {:reset :reset_all})) ...> ))
|
||||||
PATTERN
|
PATTERN
|
||||||
|
|
||||||
MSG = 'Add a `db_strategy: :reset` to your context/decribe when you are creating object manager attributes!'.freeze
|
MSG = 'Add a `db_strategy: :reset` to your context/decribe when you are creating object manager attributes!'.freeze
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
module RuboCop
|
module RuboCop
|
||||||
module Cop
|
module Cop
|
||||||
|
@ -54,7 +54,9 @@ and check if there are reset_column_information function calls existing for the
|
||||||
end
|
end
|
||||||
|
|
||||||
def reset_class(node)
|
def reset_class(node)
|
||||||
node.children[0].children[1].to_s
|
# simplify namespaced class names
|
||||||
|
# Rubocop can't reliably convert table names to namespaced class names
|
||||||
|
node.children[0].const_name.gsub '::', ''
|
||||||
end
|
end
|
||||||
|
|
||||||
def table_class(node)
|
def table_class(node)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
module RuboCop
|
module RuboCop
|
||||||
module Cop
|
module Cop
|
||||||
|
|
17
.rubocop/cop/zammad/forbid_translatable_marker.rb
Normal file
17
.rubocop/cop/zammad/forbid_translatable_marker.rb
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
|
module RuboCop
|
||||||
|
module Cop
|
||||||
|
module Zammad
|
||||||
|
class ForbidTranslatableMarker < Base
|
||||||
|
MSG = <<~ERROR_MESSAGE.freeze
|
||||||
|
Don't use __() in Zammad core migrations. Translatable strings should be marked where they are defined, e.g. in the DB seeds.
|
||||||
|
ERROR_MESSAGE
|
||||||
|
|
||||||
|
def on_send(node)
|
||||||
|
add_offense(node) if node.method_name.eql? :__
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
require 'capybara/rspec/matchers'
|
require 'capybara/rspec/matchers'
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
module RuboCop
|
module RuboCop
|
||||||
module Cop
|
module Cop
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
module RuboCop
|
module RuboCop
|
||||||
module Cop
|
module Cop
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
module RuboCop
|
module RuboCop
|
||||||
module Cop
|
module Cop
|
||||||
|
@ -9,7 +9,7 @@ module RuboCop
|
||||||
extend AutoCorrector
|
extend AutoCorrector
|
||||||
|
|
||||||
MSG = 'Copyright update required (use auto-correct to rectify this).'.freeze
|
MSG = 'Copyright update required (use auto-correct to rectify this).'.freeze
|
||||||
COPYRIGHT = "# Copyright (C) 2012-#{Date.today.year} Zammad Foundation, http://zammad-foundation.org/".freeze # rubocop:disable Rails/Date
|
COPYRIGHT = "# Copyright (C) 2012-#{Date.today.year} Zammad Foundation, https://zammad-foundation.org/".freeze # rubocop:disable Rails/Date
|
||||||
|
|
||||||
def on_new_investigation
|
def on_new_investigation
|
||||||
if processed_source.raw_source.include? '# Copyright (C) 2012-'
|
if processed_source.raw_source.include? '# Copyright (C) 2012-'
|
||||||
|
|
|
@ -189,6 +189,10 @@ Rails/SkipsModelValidations:
|
||||||
- "**/*_spec.rb"
|
- "**/*_spec.rb"
|
||||||
- "**/*_examples.rb"
|
- "**/*_examples.rb"
|
||||||
|
|
||||||
|
Rails/ReversibleMigration:
|
||||||
|
Description: This cop checks whether the change method of the migration file is reversible.
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
Style/ClassAndModuleChildren:
|
Style/ClassAndModuleChildren:
|
||||||
Description: 'Checks style of children classes and modules.'
|
Description: 'Checks style of children classes and modules.'
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
@ -317,6 +321,25 @@ Zammad/ExistsResetColumnInformation:
|
||||||
- 'db/migrate/201*_*.rb'
|
- 'db/migrate/201*_*.rb'
|
||||||
- 'db/migrate/2020*_*.rb'
|
- 'db/migrate/2020*_*.rb'
|
||||||
|
|
||||||
|
Zammad/DetectTranslatableString:
|
||||||
|
Enabled: true
|
||||||
|
Include:
|
||||||
|
- "app/**/*.rb"
|
||||||
|
- "db/**/*.rb"
|
||||||
|
- "lib/**/*.rb"
|
||||||
|
Exclude:
|
||||||
|
- "db/migrate/**/*.rb"
|
||||||
|
- "db/addon/**/*.rb"
|
||||||
|
- "lib/generators/**/*.rb"
|
||||||
|
- "lib/sequencer/**/*.rb"
|
||||||
|
- "lib/import/**/*.rb"
|
||||||
|
- "lib/tasks/**/*.rb"
|
||||||
|
|
||||||
|
Zammad/ForbidTranslatableMarker:
|
||||||
|
Enabled: true
|
||||||
|
Include:
|
||||||
|
- "db/migrate/*.rb"
|
||||||
|
|
||||||
Zammad/ExistsDbStrategy:
|
Zammad/ExistsDbStrategy:
|
||||||
Include:
|
Include:
|
||||||
- "spec/**/*.rb"
|
- "spec/**/*.rb"
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
require_relative 'cop/zammad/exists_condition'
|
require_relative 'cop/zammad/exists_condition'
|
||||||
|
require_relative 'cop/zammad/detect_translatable_string'
|
||||||
require_relative 'cop/zammad/exists_date_time_precision'
|
require_relative 'cop/zammad/exists_date_time_precision'
|
||||||
require_relative 'cop/zammad/exists_db_strategy'
|
require_relative 'cop/zammad/exists_db_strategy'
|
||||||
require_relative 'cop/zammad/exists_reset_column_information'
|
require_relative 'cop/zammad/exists_reset_column_information'
|
||||||
|
@ -10,3 +11,4 @@ require_relative 'cop/zammad/no_to_sym_on_string'
|
||||||
require_relative 'cop/zammad/prefer_negated_if_over_unless'
|
require_relative 'cop/zammad/prefer_negated_if_over_unless'
|
||||||
require_relative 'cop/zammad/update_copyright'
|
require_relative 'cop/zammad/update_copyright'
|
||||||
require_relative 'cop/zammad/forbid_rand'
|
require_relative 'cop/zammad/forbid_rand'
|
||||||
|
require_relative 'cop/zammad/forbid_translatable_marker'
|
||||||
|
|
|
@ -412,16 +412,6 @@ RSpec/MessageSpies:
|
||||||
- 'spec/lib/import/otrs/ticket_spec.rb'
|
- 'spec/lib/import/otrs/ticket_spec.rb'
|
||||||
- 'spec/lib/import/otrs/user_factory_spec.rb'
|
- 'spec/lib/import/otrs/user_factory_spec.rb'
|
||||||
- 'spec/lib/import/otrs/user_spec.rb'
|
- 'spec/lib/import/otrs/user_spec.rb'
|
||||||
- 'spec/lib/import/zendesk/object_attribute/base_examples.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/checkbox_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/date_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/decimal_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/dropdown_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/integer_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/regexp_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/tagger_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/text_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/textarea_spec.rb'
|
|
||||||
- 'spec/lib/ldap/group_spec.rb'
|
- 'spec/lib/ldap/group_spec.rb'
|
||||||
- 'spec/lib/ldap/guid_spec.rb'
|
- 'spec/lib/ldap/guid_spec.rb'
|
||||||
- 'spec/lib/ldap/user_spec.rb'
|
- 'spec/lib/ldap/user_spec.rb'
|
||||||
|
@ -483,16 +473,6 @@ RSpec/MultipleExpectations:
|
||||||
- 'spec/lib/import/otrs/priority_factory_spec.rb'
|
- 'spec/lib/import/otrs/priority_factory_spec.rb'
|
||||||
- 'spec/lib/import/otrs/requester_spec.rb'
|
- 'spec/lib/import/otrs/requester_spec.rb'
|
||||||
- 'spec/lib/import/otrs/state_factory_spec.rb'
|
- 'spec/lib/import/otrs/state_factory_spec.rb'
|
||||||
- 'spec/lib/import/zendesk/object_attribute/base_examples.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/checkbox_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/date_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/decimal_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/dropdown_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/integer_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/regexp_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/tagger_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/text_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/textarea_spec.rb'
|
|
||||||
- 'spec/lib/ldap/group_spec.rb'
|
- 'spec/lib/ldap/group_spec.rb'
|
||||||
- 'spec/lib/ldap/guid_spec.rb'
|
- 'spec/lib/ldap/guid_spec.rb'
|
||||||
- 'spec/lib/ldap/user_spec.rb'
|
- 'spec/lib/ldap/user_spec.rb'
|
||||||
|
@ -660,16 +640,6 @@ RSpec/VerifiedDoubles:
|
||||||
- 'spec/db/migrate/issue_2460_fix_corrupted_twitter_ids_spec.rb'
|
- 'spec/db/migrate/issue_2460_fix_corrupted_twitter_ids_spec.rb'
|
||||||
- 'spec/jobs/communicate_twitter_job_spec.rb'
|
- 'spec/jobs/communicate_twitter_job_spec.rb'
|
||||||
- 'spec/lib/external_sync_spec.rb'
|
- 'spec/lib/external_sync_spec.rb'
|
||||||
- 'spec/lib/import/zendesk/object_attribute/base_examples.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/checkbox_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/date_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/decimal_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/dropdown_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/integer_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/regexp_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/tagger_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/text_spec.rb'
|
|
||||||
- 'spec/lib/import/zendesk/object_attribute/textarea_spec.rb'
|
|
||||||
- 'spec/lib/ldap_spec.rb'
|
- 'spec/lib/ldap_spec.rb'
|
||||||
- 'spec/lib/sequencer/sequence/import/ldap/users_spec.rb'
|
- 'spec/lib/sequencer/sequence/import/ldap/users_spec.rb'
|
||||||
- 'spec/lib/sequencer/unit/import/zendesk/sub_sequence/base_examples.rb'
|
- 'spec/lib/sequencer/unit/import/zendesk/sub_sequence/base_examples.rb'
|
||||||
|
|
|
@ -883,7 +883,6 @@ Metrics/PerceivedComplexity:
|
||||||
- 'lib/twitter_sync.rb'
|
- 'lib/twitter_sync.rb'
|
||||||
- 'lib/user_agent.rb'
|
- 'lib/user_agent.rb'
|
||||||
- 'test/browser/admin_object_manager_test.rb'
|
- 'test/browser/admin_object_manager_test.rb'
|
||||||
- 'test/browser/keyboard_shortcuts_test.rb'
|
|
||||||
- 'test/browser_test_helper.rb'
|
- 'test/browser_test_helper.rb'
|
||||||
- 'test/integration/slack_test.rb'
|
- 'test/integration/slack_test.rb'
|
||||||
|
|
||||||
|
|
50
.stylelintrc.json
Normal file
50
.stylelintrc.json
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
{
|
||||||
|
"extends": [
|
||||||
|
"stylelint-config-standard",
|
||||||
|
"stylelint-config-standard-scss",
|
||||||
|
"stylelint-prettier/recommended"
|
||||||
|
],
|
||||||
|
"rules": {
|
||||||
|
"alpha-value-notation": null,
|
||||||
|
"block-no-empty": null,
|
||||||
|
"color-function-notation": "legacy",
|
||||||
|
"declaration-block-no-duplicate-properties": null,
|
||||||
|
"declaration-block-no-redundant-longhand-properties": null,
|
||||||
|
"declaration-block-no-shorthand-property-overrides": null,
|
||||||
|
"declaration-block-single-line-max-declarations": null,
|
||||||
|
"font-family-no-missing-generic-family-keyword": null,
|
||||||
|
"function-calc-no-unspaced-operator": null,
|
||||||
|
"function-comma-space-after": null,
|
||||||
|
"hue-degree-notation": null,
|
||||||
|
"keyframes-name-pattern": null,
|
||||||
|
"max-empty-lines": null,
|
||||||
|
"no-descending-specificity": null,
|
||||||
|
"no-duplicate-selectors": null,
|
||||||
|
"number-max-precision": null,
|
||||||
|
"selector-class-pattern": null,
|
||||||
|
"selector-list-comma-newline-after": null,
|
||||||
|
"selector-no-vendor-prefix": null,
|
||||||
|
"selector-pseudo-element-no-unknown": null,
|
||||||
|
"scss/at-extend-no-missing-placeholder": null,
|
||||||
|
"scss/at-rule-no-unknown": null,
|
||||||
|
"scss/dollar-variable-pattern": null,
|
||||||
|
"scss/double-slash-comment-whitespace-inside": null,
|
||||||
|
"scss/no-global-function-names": null,
|
||||||
|
"value-no-vendor-prefix": null,
|
||||||
|
"property-no-unknown": [true, { "ignoreProperties": ["scroll-snap-mode"] }],
|
||||||
|
"property-no-vendor-prefix": null
|
||||||
|
},
|
||||||
|
"ignoreFiles": [
|
||||||
|
"public/assets/*.css",
|
||||||
|
"public/assets/chat/chat.css",
|
||||||
|
"public/assets/doorkeeper/**",
|
||||||
|
"**/reset*.css",
|
||||||
|
"**/bootstrap*.css",
|
||||||
|
"**/jquery*.css",
|
||||||
|
"**/cropper.css",
|
||||||
|
"**/fineuploader.css",
|
||||||
|
"**/qunit*.css",
|
||||||
|
"**/svg-dimensions.css",
|
||||||
|
"vendor/**"
|
||||||
|
]
|
||||||
|
}
|
192
CHANGELOG.md
192
CHANGELOG.md
|
@ -1,15 +1,195 @@
|
||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
## [5.1.0](https://github.com/zammad/zammad/tree/5.1.0) (2021-xx-xx)
|
## [5.1.1](https://github.com/zammad/zammad/tree/5.1.1) (2022-04-20)
|
||||||
|
[Full Changelog](https://github.com/zammad/zammad/compare/5.1.0...5.1.1)
|
||||||
|
|
||||||
|
**Implemented enhancements:**
|
||||||
|
|
||||||
|
- Allow reauthentication of Google / Microsoft 365 accounts [3240](https://github.com/zammad/zammad/issues/3240) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[channel](https://github.com/zammad/zammad/labels/channel)]
|
||||||
|
|
||||||
|
**Fixed bugs:**
|
||||||
|
|
||||||
|
- Error on second migration of an microsoft365 channel undefined method `options' for nil:NilClass [4060](https://github.com/zammad/zammad/issues/4060) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Freshdesk migration which doesn't support time entries runs in unwanted behaviour [4052](https://github.com/zammad/zammad/issues/4052) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- Freshdesk-Migration does not like no Companies / Organisations within the source [4051](https://github.com/zammad/zammad/issues/4051) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- Cannot encrypt if multiple S/MIME certificates exist and one is expired [4029](https://github.com/zammad/zammad/issues/4029) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Core Workflow: Does show wrong field list if you only have admin permissions and not ticket.agent permissions [4035](https://github.com/zammad/zammad/issues/4035) [[bug](https://github.com/zammad/zammad/labels/bug)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Can't delete smime certificate - ERROR: duplicate key value violates unique constraint [4049](https://github.com/zammad/zammad/issues/4049) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Knowledge Base on-the-fly updating does not work [4026](https://github.com/zammad/zammad/issues/4026) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Core Workflow - Unable to select "has changed" logic when creating new workflow. It is also replaced with "is" in previously created workflows. [4046](https://github.com/zammad/zammad/issues/4046) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- undefined method `to_hash` on editing select fields in the admin interface after migration to 5.1 [4027](https://github.com/zammad/zammad/issues/4027) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- KB Public menus scroll bar positioning incorrect [4008](https://github.com/zammad/zammad/issues/4008) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)]
|
||||||
|
- Problems with duplicate records in Translations table [4020](https://github.com/zammad/zammad/issues/4020) [[bug](https://github.com/zammad/zammad/labels/bug)] [[translation](https://github.com/zammad/zammad/labels/translation)]
|
||||||
|
- Tree select value cannot be set to "-" (empty) with Trigger/Scheduler/Core workflow [4024](https://github.com/zammad/zammad/issues/4024) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Admin macros are not usable with admin permissions only [4032](https://github.com/zammad/zammad/issues/4032) [[bug](https://github.com/zammad/zammad/labels/bug)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Admin SLA index view does not show update time if "for agent respond" is selected [4033](https://github.com/zammad/zammad/issues/4033) [[bug](https://github.com/zammad/zammad/labels/bug)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Core Workflow: Stop after match is not saved [4034](https://github.com/zammad/zammad/issues/4034) [[bug](https://github.com/zammad/zammad/labels/bug)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[core workflows](https://github.com/zammad/zammad/labels/core%20workflows)]
|
||||||
|
- Freshdesk import error when a inline image source attribute contains no clean url [4028](https://github.com/zammad/zammad/issues/4028) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Mention history does not show properly who got added [3984](https://github.com/zammad/zammad/issues/3984) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[history](https://github.com/zammad/zammad/labels/history)]
|
||||||
|
- Obsolete notice field in admin calendar view [4023](https://github.com/zammad/zammad/issues/4023) [[bug](https://github.com/zammad/zammad/labels/bug)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)]
|
||||||
|
- Error “customer_id required” on Macro execution [4022](https://github.com/zammad/zammad/issues/4022) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[macros](https://github.com/zammad/zammad/labels/macros)]
|
||||||
|
- Translations are not available in API after syncing [4016](https://github.com/zammad/zammad/issues/4016) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Upgraded to 5.1.0: pending time doesn’t show a date [4018](https://github.com/zammad/zammad/issues/4018) [[bug](https://github.com/zammad/zammad/labels/bug)] [[translation](https://github.com/zammad/zammad/labels/translation)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- UI is not updated right after importing users csv file [3919](https://github.com/zammad/zammad/issues/3919) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- LDAP with many groups (<5k) and group role relation (>50) will crash in frontend [3994](https://github.com/zammad/zammad/issues/3994) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[LDAP](https://github.com/zammad/zammad/labels/LDAP)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
|
||||||
|
|
||||||
|
## [5.1.0](https://github.com/zammad/zammad/tree/5.1.0) (2022-03-14)
|
||||||
[Full Changelog](https://github.com/zammad/zammad/compare/5.0.0...5.1.0)
|
[Full Changelog](https://github.com/zammad/zammad/compare/5.0.0...5.1.0)
|
||||||
|
|
||||||
**Implemented enhancements:**
|
**Implemented enhancements:**
|
||||||
|
|
||||||
|
- added russian translations to mail notifications [3780](https://github.com/zammad/zammad/pull/3780) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[notification](https://github.com/zammad/zammad/labels/notification)]
|
||||||
|
- Draft Sharing: Add history entry for updating and deleting of a draft [3983](https://github.com/zammad/zammad/issues/3983) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[draft sharing](https://github.com/zammad/zammad/labels/draft%20sharing)]
|
||||||
|
- Draft Sharing: Improve sidebar icon order for ticket creation [3982](https://github.com/zammad/zammad/issues/3982) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[draft sharing](https://github.com/zammad/zammad/labels/draft%20sharing)]
|
||||||
|
- Make sidebar attachments unique [3930](https://github.com/zammad/zammad/issues/3930) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Draft Sharing [629](https://github.com/zammad/zammad/issues/629) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[feature backlog](https://github.com/zammad/zammad/labels/feature%20backlog)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Limit access to KB Categories based on roles [2603](https://github.com/zammad/zammad/issues/2603) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)]
|
||||||
|
- Enhance CTI integration texts [2753](https://github.com/zammad/zammad/issues/2753) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)]
|
||||||
|
- Show which escalation type escalated in ticket zoom [3928](https://github.com/zammad/zammad/issues/3928) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Enable migration button feature for account migration MS365/Google channel [3960](https://github.com/zammad/zammad/issues/3960) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[needs verification](https://github.com/zammad/zammad/labels/needs%20verification)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Rename Third-Party login: Office 365 to Microsoft 365 [3245](https://github.com/zammad/zammad/issues/3245) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[third party issue](https://github.com/zammad/zammad/labels/third%20party%20issue)]
|
||||||
|
- Zammad backups (database and filesystem) are world-readable by default [3893](https://github.com/zammad/zammad/issues/3893) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)]
|
||||||
|
- Add confirmation dialog on visibility change of an article or in article creation [3924](https://github.com/zammad/zammad/issues/3924) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Be able to select more than one owner or organization in condition for overviews/triggers/schedulers like you can do it for state, priority or group [3900](https://github.com/zammad/zammad/issues/3900) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)]
|
||||||
|
- Zammad misses "weeks" for relative time events [2371](https://github.com/zammad/zammad/issues/2371) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Note is not being updated because of the lack of lastname [2429](https://github.com/zammad/zammad/issues/2429) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend%20%2F%20JS%20app)]
|
||||||
|
- Display callback urls for third-party applications [3622](https://github.com/zammad/zammad/issues/3622) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)]
|
||||||
|
- SLA description only available in english [556](https://github.com/zammad/zammad/issues/556) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)] [[translation](https://github.com/zammad/zammad/labels/translation)]
|
||||||
|
- Add clear selection action or has changed condition [3821](https://github.com/zammad/zammad/issues/3821) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[specification required](https://github.com/zammad/zammad/labels/specification%20required)] [[core workflows](https://github.com/zammad/zammad/labels/core%20workflows)]
|
||||||
|
- Allow image popup and download within Chat [3210](https://github.com/zammad/zammad/issues/3210) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[chat](https://github.com/zammad/zammad/labels/chat)]
|
||||||
|
- Display name not used [2275](https://github.com/zammad/zammad/issues/2275) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend%20%2F%20JS%20app)]
|
||||||
|
- Possibility to specify the order of objects [294](https://github.com/zammad/zammad/issues/294) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[object manager attribute](https://github.com/zammad/zammad/labels/object%20manager%20attribute)]
|
||||||
|
- Import for kayako during the setup [3698](https://github.com/zammad/zammad/issues/3698) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- Login site wording could be better [3000](https://github.com/zammad/zammad/issues/3000) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[translation](https://github.com/zammad/zammad/labels/translation)]
|
||||||
|
- Core Workflow: Add organization condition attributes for object User [3779](https://github.com/zammad/zammad/issues/3779) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- No script content (e. g. javascript) in emails [3365](https://github.com/zammad/zammad/issues/3365) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)]
|
||||||
|
|
||||||
**Fixed bugs:**
|
**Fixed bugs:**
|
||||||
|
|
||||||
|
- Report profile "new profile" button does not match coloring scheme [4007](https://github.com/zammad/zammad/issues/4007) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)]
|
||||||
|
- "Note - visibility confirmation dialog" setting also requests confirmation for e.g. email and phone articles [4009](https://github.com/zammad/zammad/issues/4009) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
|
||||||
|
- Ensure 4 column selections within UI does not cover add/remove buttons [3609](https://github.com/zammad/zammad/issues/3609) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)]
|
||||||
|
- KB RTL text direction has wrong spacing between some elements [3925](https://github.com/zammad/zammad/issues/3925) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[regression](https://github.com/zammad/zammad/labels/regression)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)] [[good first issue](https://github.com/zammad/zammad/labels/good%20first%20issue)]
|
||||||
|
- Fixes: Fix knowledge base spacing and layout [3987](https://github.com/zammad/zammad/pull/3987)
|
||||||
|
- Longer category names break boxes in mobile version [3665](https://github.com/zammad/zammad/issues/3665) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)]
|
||||||
|
- KB: granular permissions misconfiguration is allowed by UI [3997](https://github.com/zammad/zammad/issues/3997) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)]
|
||||||
|
- Can not start a row in a knowledge base article with a linked answer [3965](https://github.com/zammad/zammad/issues/3965) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)]
|
||||||
|
- Long role names get broken due to bad overflow [3999](https://github.com/zammad/zammad/issues/3999) [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)]
|
||||||
|
- Overviews are not shown if `group_by` is used with a tree select attribute [4004](https://github.com/zammad/zammad/issues/4004) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[overviews](https://github.com/zammad/zammad/labels/overviews)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Unable to upgrade to Zammad 5.1 [4000](https://github.com/zammad/zammad/issues/4000) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Select field in bulk operations out of view port [3995](https://github.com/zammad/zammad/issues/3995) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[overviews](https://github.com/zammad/zammad/labels/overviews)]
|
||||||
|
- No longer public KB answers do not return http 404 [3915](https://github.com/zammad/zammad/issues/3915) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)]
|
||||||
|
- Selecting custom ports for mail channel ends in 'host not reachable' [3964](https://github.com/zammad/zammad/issues/3964) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Draft Sharing: Draft stays after new ticket creation [3981](https://github.com/zammad/zammad/issues/3981) [[bug](https://github.com/zammad/zammad/labels/bug)] [[question](https://github.com/zammad/zammad/labels/question)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[draft sharing](https://github.com/zammad/zammad/labels/draft%20sharing)]
|
||||||
|
- Modal backdrop not covering some UI parts [3974](https://github.com/zammad/zammad/issues/3974) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)]
|
||||||
|
- KB: Roles are displayed twice in permission dialog [3977](https://github.com/zammad/zammad/issues/3977) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)]
|
||||||
|
- KB: Unpermitted categories are displayed after browsing [3978](https://github.com/zammad/zammad/issues/3978) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)]
|
||||||
|
- Frequent “Lost connection to MySQL server during query” errors resulting in client-side Error 500 [3969](https://github.com/zammad/zammad/issues/3969) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Not translated text with forwarding e-mails [3920](https://github.com/zammad/zammad/issues/3920) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- S/MIME function buttons no longer working in tickets [3957](https://github.com/zammad/zammad/issues/3957) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)]
|
||||||
|
- Migration of the MS365 account fails by upper and lower case differences in email address [3956](https://github.com/zammad/zammad/issues/3956) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Opening organization views throws console traces [3958](https://github.com/zammad/zammad/issues/3958) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)]
|
||||||
|
- Elasticsearch-Rebuild does not index from new to old [3955](https://github.com/zammad/zammad/issues/3955) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Can not chose SSL yes and port 143 when setting up mail account [3921](https://github.com/zammad/zammad/issues/3921) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Uncaught TypeError in ticket zoom highlighter [3950](https://github.com/zammad/zammad/issues/3950)
|
||||||
|
- New online notifications blocks data privacy user deletion [3942](https://github.com/zammad/zammad/issues/3942) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[data privacy](https://github.com/zammad/zammad/labels/data%20privacy)]
|
||||||
|
- Multiselects shows wrong display values in overviews [3944](https://github.com/zammad/zammad/issues/3944) [[bug](https://github.com/zammad/zammad/labels/bug)] [[overviews](https://github.com/zammad/zammad/labels/overviews)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- dead lock on user update in high load environment [3940](https://github.com/zammad/zammad/issues/3940) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Zammad UI should silently discard Cache / apply2file errors [3685](https://github.com/zammad/zammad/issues/3685) [[bug](https://github.com/zammad/zammad/labels/bug)] [[waiting for feedback](https://github.com/zammad/zammad/labels/waiting%20for%20feedback)] [[can't reproduce](https://github.com/zammad/zammad/labels/can%27t%20reproduce)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Startup of Zammad does not synchronize the custom branding logo [3933](https://github.com/zammad/zammad/issues/3933) [[bug](https://github.com/zammad/zammad/labels/bug)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Postgresql Backup & Restore failing on default package installations [3865](https://github.com/zammad/zammad/issues/3865) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Multiselect field support [3917](https://github.com/zammad/zammad/issues/3917) [[feature backlog](https://github.com/zammad/zammad/labels/feature%20backlog)] [[API](https://github.com/zammad/zammad/labels/API)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[form](https://github.com/zammad/zammad/labels/form)]
|
||||||
|
- JS error on editing textareas admin object manager attributes [3889](https://github.com/zammad/zammad/issues/3889) [[bug](https://github.com/zammad/zammad/labels/bug)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)] [[object manager attribute](https://github.com/zammad/zammad/labels/object%20manager%20attribute)]
|
||||||
|
- Various translation fixes [3918](https://github.com/zammad/zammad/pull/3918)
|
||||||
|
- Make form style for `customer`-input consistent [3886](https://github.com/zammad/zammad/pull/3886) [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)]
|
||||||
|
- Wrong size for textareas in triggers and core workflow [3909](https://github.com/zammad/zammad/issues/3909) [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[trigger](https://github.com/zammad/zammad/labels/trigger)] [[core workflows](https://github.com/zammad/zammad/labels/core%20workflows)]
|
||||||
|
- Placetel API v1 EOL within January 2022 [3910](https://github.com/zammad/zammad/issues/3910) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[third party issue](https://github.com/zammad/zammad/labels/third%20party%20issue)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Freshdesk import ends up in Zammad interface without navigation [3879](https://github.com/zammad/zammad/issues/3879) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- Changing ticket status from "new" to any other status always results in uncommited status "closed" [3880](https://github.com/zammad/zammad/issues/3880) [[bug](https://github.com/zammad/zammad/labels/bug)] [[can't reproduce](https://github.com/zammad/zammad/labels/can%27t%20reproduce)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[core workflows](https://github.com/zammad/zammad/labels/core%20workflows)]
|
||||||
|
- Usage of freshdesk import without freshdesk admin permission leads to an unstable system/missing data [3905](https://github.com/zammad/zammad/issues/3905) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- Deactivation of signature does not clear it from groups [3129](https://github.com/zammad/zammad/issues/3129) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)]
|
||||||
|
- Ticket object does not get a rollback after failing bulk action [3817](https://github.com/zammad/zammad/issues/3817) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[bulk](https://github.com/zammad/zammad/labels/bulk)]
|
||||||
|
- `/assets/fonts/` changed to `/fonts/` [3892](https://github.com/zammad/zammad/issues/3892) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Search is not triggered/updated if url of search is updated new search item or new search is triggered via global search [3873](https://github.com/zammad/zammad/issues/3873) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Overview select fields are sorted by key [3869](https://github.com/zammad/zammad/issues/3869) [[bug](https://github.com/zammad/zammad/labels/bug)] [[overviews](https://github.com/zammad/zammad/labels/overviews)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Text rendering does not work for e-mails (no new lines) received in Zammad [3870](https://github.com/zammad/zammad/issues/3870) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Zammad 5 mail template double signature [3816](https://github.com/zammad/zammad/issues/3816) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Missing ticket updates on high load in MariaDB/MySQL environments [3877](https://github.com/zammad/zammad/issues/3877) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- API creates empty tickets without articles if data is missing [2421](https://github.com/zammad/zammad/issues/2421) [[bug](https://github.com/zammad/zammad/labels/bug)] [[API](https://github.com/zammad/zammad/labels/API)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
|
||||||
|
- Wrong SLA is used (alphabetical order is ignored) [3871](https://github.com/zammad/zammad/issues/3871) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Provide meaningful modal if report profile tries to use dates out side the filtered date range [3616](https://github.com/zammad/zammad/issues/3616) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[reporting](https://github.com/zammad/zammad/labels/reporting)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Till label not assigned to corresponding input fields in calendar edit view [3793](https://github.com/zammad/zammad/issues/3793) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend%20%2F%20JS%20app)]
|
||||||
|
- Date of datepicker is not localized [3866](https://github.com/zammad/zammad/issues/3866) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Simple quote characters (`'`) not properly displayed [3846](https://github.com/zammad/zammad/issues/3846) [[bug](https://github.com/zammad/zammad/labels/bug)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend%20%2F%20JS%20app)]
|
||||||
|
- Remove api user and password for sipgate integration [3848](https://github.com/zammad/zammad/issues/3848) [[bug](https://github.com/zammad/zammad/labels/bug)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- No signature on new ticket if email is default message type [3844](https://github.com/zammad/zammad/issues/3844) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Forwarding no longer possible for email and web articles [3855](https://github.com/zammad/zammad/issues/3855) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Default values of new group dialog is different in german vs. english [3851](https://github.com/zammad/zammad/issues/3851) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- If no date is set the UI show it's shown as NaN.NaN.NaN. [3850](https://github.com/zammad/zammad/issues/3850) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Number of to show caller log entries is inconsistent setting wise [3852](https://github.com/zammad/zammad/issues/3852) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)] [[integration](https://github.com/zammad/zammad/labels/integration)]
|
||||||
|
- "Is required" untranslatable [2709](https://github.com/zammad/zammad/issues/2709) [[translation](https://github.com/zammad/zammad/labels/translation)]
|
||||||
|
- Profile out of office toasters untranslatable [2666](https://github.com/zammad/zammad/issues/2666) [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[translation](https://github.com/zammad/zammad/labels/translation)]
|
||||||
|
- obsolete / double translations [2665](https://github.com/zammad/zammad/issues/2665) [[translation](https://github.com/zammad/zammad/labels/translation)]
|
||||||
|
- Missing translation for insufficient permissions for <object> [3275](https://github.com/zammad/zammad/issues/3275) [[translation](https://github.com/zammad/zammad/labels/translation)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
|
||||||
|
- Reply all: Duplicate email on changing recipient and cc in a certain way [3825](https://github.com/zammad/zammad/issues/3825) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Email address not shown inside forwarded email [3824](https://github.com/zammad/zammad/issues/3824) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Removing calendars via UI and API does not check for references [3845](https://github.com/zammad/zammad/issues/3845) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[escalation logic](https://github.com/zammad/zammad/labels/escalation%20logic)]
|
||||||
|
- Removing tags from tickets return HTTP 201 [3842](https://github.com/zammad/zammad/issues/3842) [[bug](https://github.com/zammad/zammad/labels/bug)] [[API](https://github.com/zammad/zammad/labels/API)]
|
||||||
|
- Wrong escalation update time in admin interface is shown [3837](https://github.com/zammad/zammad/issues/3837) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Zammad returns stack error when one tries to remove groups via API [3841](https://github.com/zammad/zammad/issues/3841) [[bug](https://github.com/zammad/zammad/labels/bug)] [[API](https://github.com/zammad/zammad/labels/API)]
|
||||||
|
- Zammad ignores relative GitLab URLs [3830](https://github.com/zammad/zammad/issues/3830) [[bug](https://github.com/zammad/zammad/labels/bug)] [[integration](https://github.com/zammad/zammad/labels/integration)]
|
||||||
|
- Ticket zoom will loose attachments on rerender [3831](https://github.com/zammad/zammad/issues/3831) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Invalid group and owner list for tickets created via customer profile [3835](https://github.com/zammad/zammad/issues/3835) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core%20workflows)]
|
||||||
|
- Package installation creates database.yml as `root` and thus breaks the installation until next update [3834](https://github.com/zammad/zammad/issues/3834) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Ticket create screen will loose attachments by time [3827](https://github.com/zammad/zammad/issues/3827) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Zammad database credentials are world-readable [3828](https://github.com/zammad/zammad/issues/3828) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- If selected value is not part of the restriction of set_fixed_to it should recalculate it with the new value [3822](https://github.com/zammad/zammad/issues/3822) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Update time SLAs escalates tickets with agent response [3140](https://github.com/zammad/zammad/issues/3140) [[bug](https://github.com/zammad/zammad/labels/bug)] [[escalation logic](https://github.com/zammad/zammad/labels/escalation%20logic)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Allow `position` to determine an attributes position entirely [3594](https://github.com/zammad/zammad/issues/3594) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[object manager attribute](https://github.com/zammad/zammad/labels/object%20manager%20attribute)] [[specification required](https://github.com/zammad/zammad/labels/specification%20required)]
|
||||||
|
- Not displayed fields should not impact the edit screen [3819](https://github.com/zammad/zammad/issues/3819) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core%20workflows)]
|
||||||
|
- When looking for customers, it is no longer possible to change into organizations [3815](https://github.com/zammad/zammad/issues/3815) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)]
|
||||||
|
- Default Priority on ticket creation not changeable [2852](https://github.com/zammad/zammad/issues/2852) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[:construction: refactoring :construction:](https://github.com/zammad/zammad/labels/%3Aconstruction%3A%20refactoring%20%3Aconstruction%3A)]
|
||||||
|
- When quoting, no breakout from div container possible [3094](https://github.com/zammad/zammad/issues/3094) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
|
||||||
|
- Quoting not working cleanly, if content gets too much [2334](https://github.com/zammad/zammad/issues/2334) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Owner should get cleared if not listed in changed group [3818](https://github.com/zammad/zammad/issues/3818) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[core workflows](https://github.com/zammad/zammad/labels/core%20workflows)]
|
||||||
|
- Custom date and datetime attributes are filled with dates on creation of tickets/users after update from 4.1 to 5.x [3810](https://github.com/zammad/zammad/issues/3810) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- ActionController::UnknownHttpMethod FRAGE [3807](https://github.com/zammad/zammad/issues/3807) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[overviews](https://github.com/zammad/zammad/labels/overviews)] [[macros](https://github.com/zammad/zammad/labels/macros)]
|
||||||
|
- [REVIEW] Fix/trigger variables missing [3225](https://github.com/zammad/zammad/pull/3225)
|
||||||
|
- Adding private keys allows adding certificates [3727](https://github.com/zammad/zammad/issues/3727) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Agent role permissions are ignored when there is only a single group [3437](https://github.com/zammad/zammad/issues/3437) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)]
|
||||||
|
- Remote change of the group id does show it falsly as user change and not render the new value to the ticket [3801](https://github.com/zammad/zammad/issues/3801) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[core workflows](https://github.com/zammad/zammad/labels/core%20workflows)]
|
||||||
|
- Able to create custom fields for existing relation (e. g. ticket.state) - will lead to non bootable Zammad [3811](https://github.com/zammad/zammad/issues/3811) [[bug](https://github.com/zammad/zammad/labels/bug)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Ticket owner selection is not updated if owner selection should be empty [3809](https://github.com/zammad/zammad/issues/3809) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core%20workflows)]
|
||||||
|
- Job scheduling respects time zone [3802](https://github.com/zammad/zammad/issues/3802) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Chat can't be closed after timeout [2471](https://github.com/zammad/zammad/issues/2471) [[bug](https://github.com/zammad/zammad/labels/bug)] [[chat](https://github.com/zammad/zammad/labels/chat)]
|
||||||
|
- Support workflow mechanism to do pending reminder state hide pending time use case [3790](https://github.com/zammad/zammad/issues/3790) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Cache.clear in postinstall.sh throws ugly errors on fresh installations [3808](https://github.com/zammad/zammad/issues/3808) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- OS package upgrade fails (activity_stream_object_id) [3797](https://github.com/zammad/zammad/issues/3797) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Simple quote characters (`'`) not properly displayed [3733](https://github.com/zammad/zammad/issues/3733) [[bug](https://github.com/zammad/zammad/labels/bug)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend%20%2F%20JS%20app)]
|
||||||
|
- Example payload in webhook view leads to 500 error [3794](https://github.com/zammad/zammad/issues/3794) [[bug](https://github.com/zammad/zammad/labels/bug)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Sort order group_by broken (alphabetical) [3800](https://github.com/zammad/zammad/issues/3800) [[bug](https://github.com/zammad/zammad/labels/bug)] [[overviews](https://github.com/zammad/zammad/labels/overviews)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Bug Report 4.1.x Overview Sort - Grouped by user [3737](https://github.com/zammad/zammad/issues/3737) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[overviews](https://github.com/zammad/zammad/labels/overviews)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Article box opening on tickets with no changes [3789](https://github.com/zammad/zammad/issues/3789) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)]
|
||||||
|
- UploadCacheCleanupJob does not execute [3787](https://github.com/zammad/zammad/issues/3787) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- lib/fill_db.rb fails to work in production environments [3788](https://github.com/zammad/zammad/issues/3788) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Usage of inactive object attributes in SLAs will crash admin SLA interface [3769](https://github.com/zammad/zammad/issues/3769) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Inconstant alignment in the listing of attachments/submit button in new article area [3773](https://github.com/zammad/zammad/issues/3773) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Broken dialog whiling uploading oversized attachment [3774](https://github.com/zammad/zammad/issues/3774) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Improve contrasts in answer search for articles [3783](https://github.com/zammad/zammad/issues/3783) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)]
|
||||||
|
- escaped 'Set fixed' workflows don't refresh set values on active ticket sessions [3757](https://github.com/zammad/zammad/issues/3757) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core%20workflows)]
|
||||||
|
- ObjectManager Attribute without screen attribute causes CoreWorkflows migration to fail [3781](https://github.com/zammad/zammad/issues/3781) [[bug](https://github.com/zammad/zammad/labels/bug)] [[migration / update](https://github.com/zammad/zammad/labels/migration%20%2F%20update)]
|
||||||
|
- Force users to reload after system migration [3776](https://github.com/zammad/zammad/issues/3776) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||||
|
- Zammad preflight check warning output causes Syntax-Error in postinstall.sh and failing installation [2674](https://github.com/zammad/zammad/issues/2674) [[bug](https://github.com/zammad/zammad/labels/bug)] [[migration / update](https://github.com/zammad/zammad/labels/migration%20%2F%20update)]
|
||||||
|
- Fix postinstall.sh getting es_url [3775](https://github.com/zammad/zammad/pull/3775)
|
||||||
|
- Shared organization issue (Create your first ticket) [2780](https://github.com/zammad/zammad/issues/2780) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
|
||||||
|
- [BUG] miss spell in db/migrate/20210923172256_issue_2619_kb_header_link_color.rb [3777](https://github.com/zammad/zammad/issues/3777) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[migration / update](https://github.com/zammad/zammad/labels/migration%20%2F%20update)]
|
||||||
|
- Unable to cancel attachment upload [2351](https://github.com/zammad/zammad/issues/2351) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)]
|
||||||
|
- KB header and footer link-color not changeable [2619](https://github.com/zammad/zammad/issues/2619) [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)] [[specification required](https://github.com/zammad/zammad/labels/specification%20required)] [[theming / skinning](https://github.com/zammad/zammad/labels/theming%20%2F%20skinning)]
|
||||||
|
- Syntax errors break scheduler job for good [3028](https://github.com/zammad/zammad/issues/3028) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Existing tickets: New article modal with padding-left: 0; padding-right: 0; [3772](https://github.com/zammad/zammad/issues/3772) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Fix polish translations [3760](https://github.com/zammad/zammad/pull/3760)
|
||||||
|
- Possible race condition causing OTRS import to fail [3765](https://github.com/zammad/zammad/issues/3765) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- Incorrect alignment in the listing of attachments when creating a ticket [3746](https://github.com/zammad/zammad/issues/3746) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Saved conditions break on selections without reloading [3758](https://github.com/zammad/zammad/issues/3758) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core%20workflows)]
|
||||||
|
- Misleading view of user icons which are on vacation and disabled [3075](https://github.com/zammad/zammad/issues/3075) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
|
||||||
|
|
27
Gemfile
27
Gemfile
|
@ -1,9 +1,9 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
source 'https://rubygems.org'
|
source 'https://gems.sutty.nl'
|
||||||
|
|
||||||
# core - base
|
# core - base
|
||||||
ruby '2.7.4'
|
ruby '2.7.5'
|
||||||
gem 'rails', '~> 6.0.0'
|
gem 'rails', '~> 6.0.0'
|
||||||
|
|
||||||
# core - rails additions
|
# core - rails additions
|
||||||
|
@ -94,6 +94,9 @@ gem 'omniauth-saml'
|
||||||
gem 'omniauth-twitter'
|
gem 'omniauth-twitter'
|
||||||
gem 'omniauth-weibo-oauth2'
|
gem 'omniauth-weibo-oauth2'
|
||||||
|
|
||||||
|
# Rate limiting
|
||||||
|
gem 'rack-attack'
|
||||||
|
|
||||||
# channels
|
# channels
|
||||||
gem 'gmail_xoauth'
|
gem 'gmail_xoauth'
|
||||||
gem 'koala'
|
gem 'koala'
|
||||||
|
@ -149,14 +152,17 @@ gem 'viewpoint', require: false
|
||||||
# integrations - S/MIME
|
# integrations - S/MIME
|
||||||
gem 'openssl'
|
gem 'openssl'
|
||||||
|
|
||||||
|
gem 'lograge'
|
||||||
|
|
||||||
|
# Translation sync
|
||||||
|
gem 'PoParser', require: false
|
||||||
|
|
||||||
# Gems used only for develop/test and not required
|
# Gems used only for develop/test and not required
|
||||||
# in production environments by default.
|
# in production environments by default.
|
||||||
group :development, :test do
|
group :development, :test do
|
||||||
|
|
||||||
# app boottime improvement
|
# app boottime improvement
|
||||||
gem 'spring'
|
gem 'spring'
|
||||||
gem 'spring-commands-rspec'
|
|
||||||
gem 'spring-commands-testunit'
|
|
||||||
|
|
||||||
# debugging
|
# debugging
|
||||||
gem 'byebug'
|
gem 'byebug'
|
||||||
|
@ -168,17 +174,13 @@ group :development, :test do
|
||||||
# test frameworks
|
# test frameworks
|
||||||
gem 'rails-controller-testing'
|
gem 'rails-controller-testing'
|
||||||
gem 'rspec-rails'
|
gem 'rspec-rails'
|
||||||
|
gem 'rspec-retry'
|
||||||
gem 'shoulda-matchers'
|
gem 'shoulda-matchers'
|
||||||
gem 'test-unit'
|
gem 'test-unit'
|
||||||
|
|
||||||
# for testing Pundit authorisation policies in RSpec
|
# for testing Pundit authorisation policies in RSpec
|
||||||
gem 'pundit-matchers'
|
gem 'pundit-matchers'
|
||||||
|
|
||||||
# code coverage
|
|
||||||
gem 'coveralls', require: false
|
|
||||||
gem 'simplecov'
|
|
||||||
gem 'simplecov-rcov'
|
|
||||||
|
|
||||||
# UI tests w/ Selenium
|
# UI tests w/ Selenium
|
||||||
gem 'capybara'
|
gem 'capybara'
|
||||||
gem 'selenium-webdriver'
|
gem 'selenium-webdriver'
|
||||||
|
@ -203,9 +205,6 @@ group :development, :test do
|
||||||
gem 'rubocop-rails'
|
gem 'rubocop-rails'
|
||||||
gem 'rubocop-rspec'
|
gem 'rubocop-rspec'
|
||||||
|
|
||||||
# changelog generation
|
|
||||||
gem 'github_changelog_generator'
|
|
||||||
|
|
||||||
# generate random test data
|
# generate random test data
|
||||||
gem 'factory_bot_rails'
|
gem 'factory_bot_rails'
|
||||||
gem 'faker'
|
gem 'faker'
|
||||||
|
@ -236,5 +235,5 @@ end
|
||||||
# without having your changes overwritten during upgrades.)
|
# without having your changes overwritten during upgrades.)
|
||||||
# ZAMMAD DEVS: Consult the internal wiki
|
# ZAMMAD DEVS: Consult the internal wiki
|
||||||
# (or else risk pushing unwanted changes to Gemfile.lock!)
|
# (or else risk pushing unwanted changes to Gemfile.lock!)
|
||||||
# https://git.znuny.com/zammad/zammad/wikis/Tips#user-content-customizing-the-gemfile
|
# https://git.zammad.com/zammad/zammad/wikis/Tips#user-content-customizing-the-gemfile
|
||||||
eval_gemfile 'Gemfile.local' if File.exist?('Gemfile.local')
|
eval_gemfile 'Gemfile.local' if File.exist?('Gemfile.local')
|
||||||
|
|
444
Gemfile.lock
444
Gemfile.lock
|
@ -17,70 +17,72 @@ GIT
|
||||||
mini_mime (>= 0.1.1)
|
mini_mime (>= 0.1.1)
|
||||||
|
|
||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://gems.sutty.nl/
|
||||||
specs:
|
specs:
|
||||||
|
PoParser (3.2.6)
|
||||||
|
simple_po_parser (~> 1.1.6)
|
||||||
aasm (5.2.0)
|
aasm (5.2.0)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
actioncable (6.0.4.1)
|
actioncable (6.0.4.8)
|
||||||
actionpack (= 6.0.4.1)
|
actionpack (= 6.0.4.8)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
websocket-driver (>= 0.6.1)
|
websocket-driver (>= 0.6.1)
|
||||||
actionmailbox (6.0.4.1)
|
actionmailbox (6.0.4.8)
|
||||||
actionpack (= 6.0.4.1)
|
actionpack (= 6.0.4.8)
|
||||||
activejob (= 6.0.4.1)
|
activejob (= 6.0.4.8)
|
||||||
activerecord (= 6.0.4.1)
|
activerecord (= 6.0.4.8)
|
||||||
activestorage (= 6.0.4.1)
|
activestorage (= 6.0.4.8)
|
||||||
activesupport (= 6.0.4.1)
|
activesupport (= 6.0.4.8)
|
||||||
mail (>= 2.7.1)
|
mail (>= 2.7.1)
|
||||||
actionmailer (6.0.4.1)
|
actionmailer (6.0.4.8)
|
||||||
actionpack (= 6.0.4.1)
|
actionpack (= 6.0.4.8)
|
||||||
actionview (= 6.0.4.1)
|
actionview (= 6.0.4.8)
|
||||||
activejob (= 6.0.4.1)
|
activejob (= 6.0.4.8)
|
||||||
mail (~> 2.5, >= 2.5.4)
|
mail (~> 2.5, >= 2.5.4)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
actionpack (6.0.4.1)
|
actionpack (6.0.4.8)
|
||||||
actionview (= 6.0.4.1)
|
actionview (= 6.0.4.8)
|
||||||
activesupport (= 6.0.4.1)
|
activesupport (= 6.0.4.8)
|
||||||
rack (~> 2.0, >= 2.0.8)
|
rack (~> 2.0, >= 2.0.8)
|
||||||
rack-test (>= 0.6.3)
|
rack-test (>= 0.6.3)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||||
actiontext (6.0.4.1)
|
actiontext (6.0.4.8)
|
||||||
actionpack (= 6.0.4.1)
|
actionpack (= 6.0.4.8)
|
||||||
activerecord (= 6.0.4.1)
|
activerecord (= 6.0.4.8)
|
||||||
activestorage (= 6.0.4.1)
|
activestorage (= 6.0.4.8)
|
||||||
activesupport (= 6.0.4.1)
|
activesupport (= 6.0.4.8)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
actionview (6.0.4.1)
|
actionview (6.0.4.8)
|
||||||
activesupport (= 6.0.4.1)
|
activesupport (= 6.0.4.8)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
erubi (~> 1.4)
|
erubi (~> 1.4)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||||
activejob (6.0.4.1)
|
activejob (6.0.4.8)
|
||||||
activesupport (= 6.0.4.1)
|
activesupport (= 6.0.4.8)
|
||||||
globalid (>= 0.3.6)
|
globalid (>= 0.3.6)
|
||||||
activemodel (6.0.4.1)
|
activemodel (6.0.4.8)
|
||||||
activesupport (= 6.0.4.1)
|
activesupport (= 6.0.4.8)
|
||||||
activerecord (6.0.4.1)
|
activerecord (6.0.4.8)
|
||||||
activemodel (= 6.0.4.1)
|
activemodel (= 6.0.4.8)
|
||||||
activesupport (= 6.0.4.1)
|
activesupport (= 6.0.4.8)
|
||||||
activerecord-import (1.2.0)
|
activerecord-import (1.3.0)
|
||||||
activerecord (>= 3.2)
|
activerecord (>= 4.2)
|
||||||
activerecord-nulldb-adapter (0.7.0)
|
activerecord-nulldb-adapter (0.8.0)
|
||||||
activerecord (>= 5.2.0, < 6.3)
|
activerecord (>= 5.2.0, < 7.1)
|
||||||
activerecord-session_store (2.0.0)
|
activerecord-session_store (2.0.0)
|
||||||
actionpack (>= 5.2.4.1)
|
actionpack (>= 5.2.4.1)
|
||||||
activerecord (>= 5.2.4.1)
|
activerecord (>= 5.2.4.1)
|
||||||
multi_json (~> 1.11, >= 1.11.2)
|
multi_json (~> 1.11, >= 1.11.2)
|
||||||
rack (>= 2.0.8, < 3)
|
rack (>= 2.0.8, < 3)
|
||||||
railties (>= 5.2.4.1)
|
railties (>= 5.2.4.1)
|
||||||
activestorage (6.0.4.1)
|
activestorage (6.0.4.8)
|
||||||
actionpack (= 6.0.4.1)
|
actionpack (= 6.0.4.8)
|
||||||
activejob (= 6.0.4.1)
|
activejob (= 6.0.4.8)
|
||||||
activerecord (= 6.0.4.1)
|
activerecord (= 6.0.4.8)
|
||||||
marcel (~> 1.0.0)
|
marcel (~> 1.0.0)
|
||||||
activesupport (6.0.4.1)
|
activesupport (6.0.4.8)
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
i18n (>= 0.7, < 2)
|
i18n (>= 0.7, < 2)
|
||||||
minitest (~> 5.1)
|
minitest (~> 5.1)
|
||||||
|
@ -93,48 +95,37 @@ GEM
|
||||||
argon2 (2.1.1)
|
argon2 (2.1.1)
|
||||||
ffi (~> 1.14)
|
ffi (~> 1.14)
|
||||||
ffi-compiler (~> 1.0)
|
ffi-compiler (~> 1.0)
|
||||||
|
argon2 (2.1.1-x86_64-linux-musl)
|
||||||
|
ffi (~> 1.14)
|
||||||
|
ffi-compiler (~> 1.0)
|
||||||
ast (2.4.2)
|
ast (2.4.2)
|
||||||
async (1.30.1)
|
autoprefixer-rails (10.4.2.0)
|
||||||
console (~> 1.10)
|
|
||||||
nio4r (~> 2.3)
|
|
||||||
timers (~> 4.1)
|
|
||||||
async-http (0.56.5)
|
|
||||||
async (>= 1.25)
|
|
||||||
async-io (>= 1.28)
|
|
||||||
async-pool (>= 0.2)
|
|
||||||
protocol-http (~> 0.22.0)
|
|
||||||
protocol-http1 (~> 0.14.0)
|
|
||||||
protocol-http2 (~> 0.14.0)
|
|
||||||
async-http-faraday (0.11.0)
|
|
||||||
async-http (~> 0.42)
|
|
||||||
faraday
|
|
||||||
async-io (1.32.2)
|
|
||||||
async
|
|
||||||
async-pool (0.3.9)
|
|
||||||
async (>= 1.25)
|
|
||||||
autoprefixer-rails (10.3.3.0)
|
|
||||||
execjs (~> 2)
|
execjs (~> 2)
|
||||||
binding_of_caller (1.0.0)
|
binding_of_caller (1.0.0)
|
||||||
debug_inspector (>= 0.0.1)
|
debug_inspector (>= 0.0.1)
|
||||||
biz (1.8.2)
|
biz (1.8.2)
|
||||||
clavius (~> 1.0)
|
clavius (~> 1.0)
|
||||||
tzinfo
|
tzinfo
|
||||||
bootsnap (1.9.1)
|
bootsnap (1.11.1)
|
||||||
msgpack (~> 1.0)
|
msgpack (~> 1.2)
|
||||||
brakeman (5.1.1)
|
bootsnap (1.11.1-x86_64-linux-musl)
|
||||||
|
msgpack (~> 1.2)
|
||||||
|
brakeman (5.2.1)
|
||||||
browser (5.3.1)
|
browser (5.3.1)
|
||||||
buftok (0.2.0)
|
buftok (0.2.0)
|
||||||
builder (3.2.4)
|
builder (3.2.4)
|
||||||
byebug (11.1.3)
|
byebug (11.1.3)
|
||||||
capybara (3.35.3)
|
byebug (11.1.3-x86_64-linux-musl)
|
||||||
|
capybara (3.36.0)
|
||||||
addressable
|
addressable
|
||||||
|
matrix
|
||||||
mini_mime (>= 0.1.3)
|
mini_mime (>= 0.1.3)
|
||||||
nokogiri (~> 1.8)
|
nokogiri (~> 1.8)
|
||||||
rack (>= 1.6.0)
|
rack (>= 1.6.0)
|
||||||
rack-test (>= 0.6.3)
|
rack-test (>= 0.6.3)
|
||||||
regexp_parser (>= 1.5, < 3.0)
|
regexp_parser (>= 1.5, < 3.0)
|
||||||
xpath (~> 3.2)
|
xpath (~> 3.2)
|
||||||
childprocess (3.0.0)
|
childprocess (4.1.0)
|
||||||
chunky_png (1.4.0)
|
chunky_png (1.4.0)
|
||||||
clavius (1.0.4)
|
clavius (1.0.4)
|
||||||
clearbit (0.3.3)
|
clearbit (0.3.3)
|
||||||
|
@ -153,32 +144,24 @@ GEM
|
||||||
json
|
json
|
||||||
composite_primary_keys (12.0.10)
|
composite_primary_keys (12.0.10)
|
||||||
activerecord (~> 6.0.0)
|
activerecord (~> 6.0.0)
|
||||||
concurrent-ruby (1.1.9)
|
concurrent-ruby (1.1.10)
|
||||||
console (1.13.1)
|
|
||||||
fiber-local
|
|
||||||
coveralls (0.7.1)
|
|
||||||
multi_json (~> 1.3)
|
|
||||||
rest-client
|
|
||||||
simplecov (>= 0.7)
|
|
||||||
term-ansicolor
|
|
||||||
thor
|
|
||||||
crack (0.4.5)
|
crack (0.4.5)
|
||||||
rexml
|
rexml
|
||||||
crass (1.0.6)
|
crass (1.0.6)
|
||||||
csv (3.2.0)
|
csv (3.2.2)
|
||||||
daemons (1.4.1)
|
daemons (1.4.1)
|
||||||
dalli (2.7.11)
|
dalli (3.2.1)
|
||||||
debug_inspector (1.1.0)
|
debug_inspector (1.1.0)
|
||||||
delayed_job (4.1.9)
|
debug_inspector (1.1.0-x86_64-linux-musl)
|
||||||
activesupport (>= 3.0, < 6.2)
|
delayed_job (4.1.10)
|
||||||
delayed_job_active_record (4.1.6)
|
activesupport (>= 3.0, < 8.0)
|
||||||
activerecord (>= 3.0, < 6.2)
|
delayed_job_active_record (4.1.7)
|
||||||
|
activerecord (>= 3.0, < 8.0)
|
||||||
delayed_job (>= 3.0, < 5)
|
delayed_job (>= 3.0, < 5)
|
||||||
deprecation_toolkit (1.5.1)
|
deprecation_toolkit (1.5.1)
|
||||||
activesupport (>= 4.2)
|
activesupport (>= 4.2)
|
||||||
diff-lcs (1.4.4)
|
diff-lcs (1.5.0)
|
||||||
diffy (3.4.0)
|
diffy (3.4.0)
|
||||||
docile (1.4.0)
|
|
||||||
domain_name (0.5.20190701)
|
domain_name (0.5.20190701)
|
||||||
unf (>= 0.0.5, < 1.0.0)
|
unf (>= 0.0.5, < 1.0.0)
|
||||||
doorkeeper (5.5.4)
|
doorkeeper (5.5.4)
|
||||||
|
@ -189,60 +172,54 @@ GEM
|
||||||
eco-source
|
eco-source
|
||||||
execjs
|
execjs
|
||||||
eco-source (1.1.0.rc.1)
|
eco-source (1.1.0.rc.1)
|
||||||
em-websocket (0.5.2)
|
em-websocket (0.5.3)
|
||||||
eventmachine (>= 0.12.9)
|
eventmachine (>= 0.12.9)
|
||||||
http_parser.rb (~> 0.6.0)
|
http_parser.rb (~> 0)
|
||||||
equalizer (0.0.11)
|
equalizer (0.0.11)
|
||||||
erubi (1.10.0)
|
erubi (1.10.0)
|
||||||
eventmachine (1.2.7)
|
eventmachine (1.2.7)
|
||||||
|
eventmachine (1.2.7-x86_64-linux-musl)
|
||||||
execjs (2.8.1)
|
execjs (2.8.1)
|
||||||
factory_bot (6.2.0)
|
factory_bot (6.2.1)
|
||||||
activesupport (>= 5.0.0)
|
activesupport (>= 5.0.0)
|
||||||
factory_bot_rails (6.2.0)
|
factory_bot_rails (6.2.0)
|
||||||
factory_bot (~> 6.2.0)
|
factory_bot (~> 6.2.0)
|
||||||
railties (>= 5.0.0)
|
railties (>= 5.0.0)
|
||||||
faker (2.19.0)
|
faker (2.20.0)
|
||||||
i18n (>= 1.6, < 2)
|
i18n (>= 1.8.11, < 2)
|
||||||
faraday (1.8.0)
|
faraday (1.10.0)
|
||||||
faraday-em_http (~> 1.0)
|
faraday-em_http (~> 1.0)
|
||||||
faraday-em_synchrony (~> 1.0)
|
faraday-em_synchrony (~> 1.0)
|
||||||
faraday-excon (~> 1.1)
|
faraday-excon (~> 1.1)
|
||||||
faraday-httpclient (~> 1.0.1)
|
faraday-httpclient (~> 1.0)
|
||||||
|
faraday-multipart (~> 1.0)
|
||||||
faraday-net_http (~> 1.0)
|
faraday-net_http (~> 1.0)
|
||||||
faraday-net_http_persistent (~> 1.1)
|
faraday-net_http_persistent (~> 1.0)
|
||||||
faraday-patron (~> 1.0)
|
faraday-patron (~> 1.0)
|
||||||
faraday-rack (~> 1.0)
|
faraday-rack (~> 1.0)
|
||||||
multipart-post (>= 1.2, < 3)
|
faraday-retry (~> 1.0)
|
||||||
ruby2_keywords (>= 0.0.4)
|
ruby2_keywords (>= 0.0.4)
|
||||||
faraday-em_http (1.0.0)
|
faraday-em_http (1.0.0)
|
||||||
faraday-em_synchrony (1.0.0)
|
faraday-em_synchrony (1.0.0)
|
||||||
faraday-excon (1.1.0)
|
faraday-excon (1.1.0)
|
||||||
faraday-http-cache (2.2.0)
|
|
||||||
faraday (>= 0.8)
|
|
||||||
faraday-httpclient (1.0.1)
|
faraday-httpclient (1.0.1)
|
||||||
|
faraday-multipart (1.0.3)
|
||||||
|
multipart-post (>= 1.2, < 3)
|
||||||
faraday-net_http (1.0.1)
|
faraday-net_http (1.0.1)
|
||||||
faraday-net_http_persistent (1.2.0)
|
faraday-net_http_persistent (1.2.0)
|
||||||
faraday-patron (1.0.0)
|
faraday-patron (1.0.0)
|
||||||
faraday-rack (1.0.0)
|
faraday-rack (1.0.0)
|
||||||
faraday_middleware (1.1.0)
|
faraday-retry (1.0.3)
|
||||||
|
faraday_middleware (1.2.0)
|
||||||
faraday (~> 1.0)
|
faraday (~> 1.0)
|
||||||
ffi (1.15.4)
|
ffi (1.15.5)
|
||||||
|
ffi (1.15.5-x86_64-linux-musl)
|
||||||
ffi-compiler (1.0.1)
|
ffi-compiler (1.0.1)
|
||||||
ffi (>= 1.0.0)
|
ffi (>= 1.0.0)
|
||||||
rake
|
rake
|
||||||
fiber-local (1.0.0)
|
formatador (1.1.0)
|
||||||
formatador (0.3.0)
|
gli (2.21.0)
|
||||||
github_changelog_generator (1.16.4)
|
globalid (1.0.0)
|
||||||
activesupport
|
|
||||||
async (>= 1.25.0)
|
|
||||||
async-http-faraday
|
|
||||||
faraday-http-cache
|
|
||||||
multi_json
|
|
||||||
octokit (~> 4.6)
|
|
||||||
rainbow (>= 2.2.1)
|
|
||||||
rake (>= 10.0)
|
|
||||||
gli (2.20.1)
|
|
||||||
globalid (0.5.2)
|
|
||||||
activesupport (>= 5.0)
|
activesupport (>= 5.0)
|
||||||
gmail_xoauth (0.4.2)
|
gmail_xoauth (0.4.2)
|
||||||
oauth (>= 0.3.6)
|
oauth (>= 0.3.6)
|
||||||
|
@ -265,8 +242,9 @@ GEM
|
||||||
guard
|
guard
|
||||||
guard-compat (~> 1.1)
|
guard-compat (~> 1.1)
|
||||||
hashdiff (1.0.1)
|
hashdiff (1.0.1)
|
||||||
hashie (4.1.0)
|
hashie (5.0.0)
|
||||||
hiredis (0.6.3)
|
hiredis (0.6.3)
|
||||||
|
hiredis (0.6.3-x86_64-linux-musl)
|
||||||
htmlentities (4.3.4)
|
htmlentities (4.3.4)
|
||||||
http (4.4.1)
|
http (4.4.1)
|
||||||
addressable (~> 2.3)
|
addressable (~> 2.3)
|
||||||
|
@ -279,83 +257,99 @@ GEM
|
||||||
http-form_data (2.3.0)
|
http-form_data (2.3.0)
|
||||||
http-parser (1.2.3)
|
http-parser (1.2.3)
|
||||||
ffi-compiler (>= 1.0, < 2.0)
|
ffi-compiler (>= 1.0, < 2.0)
|
||||||
|
http-parser (1.2.3-x86_64-linux-musl)
|
||||||
|
ffi-compiler (>= 1.0, < 2.0)
|
||||||
http_parser.rb (0.6.0)
|
http_parser.rb (0.6.0)
|
||||||
|
http_parser.rb (0.6.0-x86_64-linux-musl)
|
||||||
httpclient (2.8.3)
|
httpclient (2.8.3)
|
||||||
i18n (1.8.10)
|
i18n (1.10.0)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
icalendar (2.7.1)
|
icalendar (2.7.1)
|
||||||
ice_cube (~> 0.16)
|
ice_cube (~> 0.16)
|
||||||
icalendar-recurrence (1.1.3)
|
icalendar-recurrence (1.1.3)
|
||||||
icalendar (~> 2.0)
|
icalendar (~> 2.0)
|
||||||
ice_cube (~> 0.16)
|
ice_cube (~> 0.16)
|
||||||
ice_cube (0.16.3)
|
ice_cube (0.16.4)
|
||||||
inflection (1.0.0)
|
inflection (1.0.0)
|
||||||
iniparse (1.5.0)
|
iniparse (1.5.0)
|
||||||
interception (0.5)
|
interception (0.5)
|
||||||
json (2.5.1)
|
json (2.6.1)
|
||||||
|
json (2.6.1-x86_64-linux-musl)
|
||||||
jwt (2.3.0)
|
jwt (2.3.0)
|
||||||
kgio (2.11.4)
|
kgio (2.11.4)
|
||||||
koala (3.0.0)
|
kgio (2.11.4-x86_64-linux-musl)
|
||||||
|
koala (3.1.0)
|
||||||
addressable
|
addressable
|
||||||
faraday
|
faraday (< 2)
|
||||||
json (>= 1.8)
|
json (>= 1.8)
|
||||||
|
rexml
|
||||||
libv8 (8.4.255.0)
|
libv8 (8.4.255.0)
|
||||||
listen (3.7.0)
|
libv8 (8.4.255.0-x86_64-linux)
|
||||||
|
listen (3.7.1)
|
||||||
rb-fsevent (~> 0.10, >= 0.10.3)
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||||
rb-inotify (~> 0.9, >= 0.9.10)
|
rb-inotify (~> 0.9, >= 0.9.10)
|
||||||
little-plugger (1.1.4)
|
little-plugger (1.1.4)
|
||||||
logging (2.3.0)
|
logging (2.3.0)
|
||||||
little-plugger (~> 1.1)
|
little-plugger (~> 1.1)
|
||||||
multi_json (~> 1.14)
|
multi_json (~> 1.14)
|
||||||
loofah (2.12.0)
|
lograge (0.12.0)
|
||||||
|
actionpack (>= 4)
|
||||||
|
activesupport (>= 4)
|
||||||
|
railties (>= 4)
|
||||||
|
request_store (~> 1.0)
|
||||||
|
loofah (2.16.0)
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.5.9)
|
nokogiri (>= 1.5.9)
|
||||||
lumberjack (1.2.8)
|
lumberjack (1.2.8)
|
||||||
marcel (1.0.2)
|
marcel (1.0.2)
|
||||||
|
matrix (0.4.2)
|
||||||
memoizable (0.4.2)
|
memoizable (0.4.2)
|
||||||
thread_safe (~> 0.3, >= 0.3.1)
|
thread_safe (~> 0.3, >= 0.3.1)
|
||||||
messagebird-rest (3.0.0)
|
messagebird-rest (3.0.0)
|
||||||
method_source (1.0.0)
|
method_source (1.0.0)
|
||||||
mime-types (3.3.1)
|
mime-types (3.4.1)
|
||||||
mime-types-data (~> 3.2015)
|
mime-types-data (~> 3.2015)
|
||||||
mime-types-data (3.2021.0901)
|
mime-types-data (3.2022.0105)
|
||||||
mini_mime (1.1.1)
|
mini_mime (1.1.2)
|
||||||
mini_portile2 (2.6.1)
|
mini_portile2 (2.8.0)
|
||||||
mini_racer (0.2.9)
|
mini_racer (0.2.9)
|
||||||
libv8 (>= 6.9.411)
|
libv8 (>= 6.9.411)
|
||||||
minitest (5.14.4)
|
minitest (5.15.0)
|
||||||
msgpack (1.4.2)
|
msgpack (1.4.5)
|
||||||
|
msgpack (1.4.5-x86_64-linux-musl)
|
||||||
multi_json (1.15.0)
|
multi_json (1.15.0)
|
||||||
multi_xml (0.6.0)
|
multi_xml (0.6.0)
|
||||||
multipart-post (2.1.1)
|
multipart-post (2.1.1)
|
||||||
mysql2 (0.5.3)
|
mysql2 (0.5.3)
|
||||||
|
mysql2 (0.5.3-x86_64-linux-musl)
|
||||||
naught (1.1.0)
|
naught (1.1.0)
|
||||||
nenv (0.3.0)
|
nenv (0.3.0)
|
||||||
nestful (1.1.4)
|
nestful (1.1.4)
|
||||||
net-ldap (0.17.0)
|
net-ldap (0.17.0)
|
||||||
netrc (0.11.0)
|
netrc (0.11.0)
|
||||||
nio4r (2.5.8)
|
nio4r (2.5.8)
|
||||||
nokogiri (1.12.5)
|
nio4r (2.5.8-x86_64-linux-musl)
|
||||||
mini_portile2 (~> 2.6.1)
|
nokogiri (1.13.6)
|
||||||
|
mini_portile2 (~> 2.8.0)
|
||||||
|
racc (~> 1.4)
|
||||||
|
nokogiri (1.13.6-x86_64-linux-musl)
|
||||||
|
mini_portile2 (~> 2.8.0)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
nori (2.6.0)
|
nori (2.6.0)
|
||||||
notiffany (0.1.3)
|
notiffany (0.1.3)
|
||||||
nenv (~> 0.1)
|
nenv (~> 0.1)
|
||||||
shellany (~> 0.0)
|
shellany (~> 0.0)
|
||||||
oauth (0.5.6)
|
oauth (0.5.8)
|
||||||
oauth2 (1.4.7)
|
oauth2 (1.4.9)
|
||||||
faraday (>= 0.8, < 2.0)
|
faraday (>= 0.17.3, < 3.0)
|
||||||
jwt (>= 1.0, < 3.0)
|
jwt (>= 1.0, < 3.0)
|
||||||
multi_json (~> 1.3)
|
multi_json (~> 1.3)
|
||||||
multi_xml (~> 0.5)
|
multi_xml (~> 0.5)
|
||||||
rack (>= 1.2, < 3)
|
rack (>= 1.2, < 3)
|
||||||
octokit (4.21.0)
|
|
||||||
faraday (>= 0.9)
|
|
||||||
sawyer (~> 0.8.0, >= 0.5.3)
|
|
||||||
omniauth (1.9.1)
|
omniauth (1.9.1)
|
||||||
hashie (>= 3.4.6)
|
hashie (>= 3.4.6)
|
||||||
rack (>= 1.6.2, < 3)
|
rack (>= 1.6.2, < 3)
|
||||||
omniauth-facebook (8.0.0)
|
omniauth-facebook (9.0.0)
|
||||||
omniauth-oauth2 (~> 1.2)
|
omniauth-oauth2 (~> 1.2)
|
||||||
omniauth-github (1.4.0)
|
omniauth-github (1.4.0)
|
||||||
omniauth (~> 1.5)
|
omniauth (~> 1.5)
|
||||||
|
@ -376,7 +370,7 @@ GEM
|
||||||
omniauth-oauth (1.2.0)
|
omniauth-oauth (1.2.0)
|
||||||
oauth
|
oauth
|
||||||
omniauth (>= 1.0, < 3)
|
omniauth (>= 1.0, < 3)
|
||||||
omniauth-oauth2 (1.7.1)
|
omniauth-oauth2 (1.7.2)
|
||||||
oauth2 (~> 1.4)
|
oauth2 (~> 1.4)
|
||||||
omniauth (>= 1.9, < 3)
|
omniauth (>= 1.9, < 3)
|
||||||
omniauth-rails_csrf_protection (0.1.2)
|
omniauth-rails_csrf_protection (0.1.2)
|
||||||
|
@ -391,23 +385,18 @@ GEM
|
||||||
omniauth-weibo-oauth2 (0.5.2)
|
omniauth-weibo-oauth2 (0.5.2)
|
||||||
omniauth (~> 1.5)
|
omniauth (~> 1.5)
|
||||||
omniauth-oauth2 (>= 1.4.0)
|
omniauth-oauth2 (>= 1.4.0)
|
||||||
openssl (2.2.0)
|
openssl (3.0.0)
|
||||||
|
openssl (3.0.0-x86_64-linux-musl)
|
||||||
overcommit (0.58.0)
|
overcommit (0.58.0)
|
||||||
childprocess (>= 0.6.3, < 5)
|
childprocess (>= 0.6.3, < 5)
|
||||||
iniparse (~> 1.4)
|
iniparse (~> 1.4)
|
||||||
rexml (~> 3.2)
|
rexml (~> 3.2)
|
||||||
parallel (1.21.0)
|
parallel (1.21.0)
|
||||||
parser (3.0.2.0)
|
parser (3.1.1.0)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
pg (0.21.0)
|
pg (0.21.0)
|
||||||
|
pg (0.21.0-x86_64-linux-musl)
|
||||||
power_assert (2.0.1)
|
power_assert (2.0.1)
|
||||||
protocol-hpack (1.4.2)
|
|
||||||
protocol-http (0.22.5)
|
|
||||||
protocol-http1 (0.14.2)
|
|
||||||
protocol-http (~> 0.22)
|
|
||||||
protocol-http2 (0.14.2)
|
|
||||||
protocol-hpack (~> 1.4)
|
|
||||||
protocol-http (~> 0.18)
|
|
||||||
pry (0.14.1)
|
pry (0.14.1)
|
||||||
coderay (~> 1.1)
|
coderay (~> 1.1)
|
||||||
method_source (~> 1.0)
|
method_source (~> 1.0)
|
||||||
|
@ -423,32 +412,37 @@ GEM
|
||||||
binding_of_caller (~> 1.0)
|
binding_of_caller (~> 1.0)
|
||||||
pry (~> 0.13)
|
pry (~> 0.13)
|
||||||
public_suffix (4.0.6)
|
public_suffix (4.0.6)
|
||||||
puma (4.3.10)
|
puma (4.3.12)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
pundit (2.1.1)
|
puma (4.3.12-x86_64-linux-musl)
|
||||||
|
nio4r (~> 2.0)
|
||||||
|
pundit (2.2.0)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
pundit-matchers (1.7.0)
|
pundit-matchers (1.7.0)
|
||||||
rspec-rails (>= 3.0.0)
|
rspec-rails (>= 3.0.0)
|
||||||
racc (1.5.2)
|
racc (1.6.0)
|
||||||
rack (2.2.3)
|
racc (1.6.0-x86_64-linux-musl)
|
||||||
|
rack (2.2.3.1)
|
||||||
|
rack-attack (6.6.0)
|
||||||
|
rack (>= 1.0, < 3)
|
||||||
rack-livereload (0.3.17)
|
rack-livereload (0.3.17)
|
||||||
rack
|
rack
|
||||||
rack-test (1.1.0)
|
rack-test (1.1.0)
|
||||||
rack (>= 1.0, < 3)
|
rack (>= 1.0, < 3)
|
||||||
rails (6.0.4.1)
|
rails (6.0.4.8)
|
||||||
actioncable (= 6.0.4.1)
|
actioncable (= 6.0.4.8)
|
||||||
actionmailbox (= 6.0.4.1)
|
actionmailbox (= 6.0.4.8)
|
||||||
actionmailer (= 6.0.4.1)
|
actionmailer (= 6.0.4.8)
|
||||||
actionpack (= 6.0.4.1)
|
actionpack (= 6.0.4.8)
|
||||||
actiontext (= 6.0.4.1)
|
actiontext (= 6.0.4.8)
|
||||||
actionview (= 6.0.4.1)
|
actionview (= 6.0.4.8)
|
||||||
activejob (= 6.0.4.1)
|
activejob (= 6.0.4.8)
|
||||||
activemodel (= 6.0.4.1)
|
activemodel (= 6.0.4.8)
|
||||||
activerecord (= 6.0.4.1)
|
activerecord (= 6.0.4.8)
|
||||||
activestorage (= 6.0.4.1)
|
activestorage (= 6.0.4.8)
|
||||||
activesupport (= 6.0.4.1)
|
activesupport (= 6.0.4.8)
|
||||||
bundler (>= 1.3.0)
|
bundler (>= 1.3.0)
|
||||||
railties (= 6.0.4.1)
|
railties (= 6.0.4.8)
|
||||||
sprockets-rails (>= 2.0.0)
|
sprockets-rails (>= 2.0.0)
|
||||||
rails-controller-testing (1.0.5)
|
rails-controller-testing (1.0.5)
|
||||||
actionpack (>= 5.0.1.rc1)
|
actionpack (>= 5.0.1.rc1)
|
||||||
|
@ -459,36 +453,39 @@ GEM
|
||||||
nokogiri (>= 1.6)
|
nokogiri (>= 1.6)
|
||||||
rails-html-sanitizer (1.4.2)
|
rails-html-sanitizer (1.4.2)
|
||||||
loofah (~> 2.3)
|
loofah (~> 2.3)
|
||||||
railties (6.0.4.1)
|
railties (6.0.4.8)
|
||||||
actionpack (= 6.0.4.1)
|
actionpack (= 6.0.4.8)
|
||||||
activesupport (= 6.0.4.1)
|
activesupport (= 6.0.4.8)
|
||||||
method_source
|
method_source
|
||||||
rake (>= 0.8.7)
|
rake (>= 0.8.7)
|
||||||
thor (>= 0.20.3, < 2.0)
|
thor (>= 0.20.3, < 2.0)
|
||||||
rainbow (3.0.0)
|
rainbow (3.1.1)
|
||||||
raindrops (0.19.2)
|
raindrops (0.20.0)
|
||||||
|
raindrops (0.20.0-x86_64-linux-musl)
|
||||||
rake (13.0.6)
|
rake (13.0.6)
|
||||||
rb-fsevent (0.11.0)
|
rb-fsevent (0.11.1)
|
||||||
rb-inotify (0.10.1)
|
rb-inotify (0.10.1)
|
||||||
ffi (~> 1.0)
|
ffi (~> 1.0)
|
||||||
rchardet (1.8.0)
|
rchardet (1.8.0)
|
||||||
redis (4.4.0)
|
redis (4.6.0)
|
||||||
regexp_parser (2.1.1)
|
regexp_parser (2.2.1)
|
||||||
|
request_store (1.5.1)
|
||||||
|
rack (>= 1.4)
|
||||||
rest-client (2.1.0)
|
rest-client (2.1.0)
|
||||||
http-accept (>= 1.7.0, < 2.0)
|
http-accept (>= 1.7.0, < 2.0)
|
||||||
http-cookie (>= 1.0.2, < 2.0)
|
http-cookie (>= 1.0.2, < 2.0)
|
||||||
mime-types (>= 1.16, < 4.0)
|
mime-types (>= 1.16, < 4.0)
|
||||||
netrc (~> 0.8)
|
netrc (~> 0.8)
|
||||||
rexml (3.2.5)
|
rexml (3.2.5)
|
||||||
rspec-core (3.10.1)
|
rspec-core (3.11.0)
|
||||||
rspec-support (~> 3.10.0)
|
rspec-support (~> 3.11.0)
|
||||||
rspec-expectations (3.10.1)
|
rspec-expectations (3.11.0)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.10.0)
|
rspec-support (~> 3.11.0)
|
||||||
rspec-mocks (3.10.2)
|
rspec-mocks (3.11.0)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.10.0)
|
rspec-support (~> 3.11.0)
|
||||||
rspec-rails (5.0.2)
|
rspec-rails (5.1.1)
|
||||||
actionpack (>= 5.2)
|
actionpack (>= 5.2)
|
||||||
activesupport (>= 5.2)
|
activesupport (>= 5.2)
|
||||||
railties (>= 5.2)
|
railties (>= 5.2)
|
||||||
|
@ -496,19 +493,22 @@ GEM
|
||||||
rspec-expectations (~> 3.10)
|
rspec-expectations (~> 3.10)
|
||||||
rspec-mocks (~> 3.10)
|
rspec-mocks (~> 3.10)
|
||||||
rspec-support (~> 3.10)
|
rspec-support (~> 3.10)
|
||||||
rspec-support (3.10.2)
|
rspec-retry (0.6.2)
|
||||||
|
rspec-core (> 3.3)
|
||||||
|
rspec-support (3.11.0)
|
||||||
rszr (0.5.2)
|
rszr (0.5.2)
|
||||||
rubocop (1.22.1)
|
rszr (0.5.2-x86_64-linux-musl)
|
||||||
|
rubocop (1.26.0)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 3.0.0.0)
|
parser (>= 3.1.0.0)
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
regexp_parser (>= 1.8, < 3.0)
|
regexp_parser (>= 1.8, < 3.0)
|
||||||
rexml
|
rexml
|
||||||
rubocop-ast (>= 1.12.0, < 2.0)
|
rubocop-ast (>= 1.16.0, < 2.0)
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (>= 1.4.0, < 3.0)
|
unicode-display_width (>= 1.4.0, < 3.0)
|
||||||
rubocop-ast (1.12.0)
|
rubocop-ast (1.16.0)
|
||||||
parser (>= 3.0.1.1)
|
parser (>= 3.1.1.0)
|
||||||
rubocop-faker (1.1.0)
|
rubocop-faker (1.1.0)
|
||||||
faker (>= 2.12.0)
|
faker (>= 2.12.0)
|
||||||
rubocop (>= 0.82.0)
|
rubocop (>= 0.82.0)
|
||||||
|
@ -516,17 +516,17 @@ GEM
|
||||||
activesupport
|
activesupport
|
||||||
rubocop
|
rubocop
|
||||||
rubocop-rspec
|
rubocop-rspec
|
||||||
rubocop-performance (1.11.5)
|
rubocop-performance (1.13.3)
|
||||||
rubocop (>= 1.7.0, < 2.0)
|
rubocop (>= 1.7.0, < 2.0)
|
||||||
rubocop-ast (>= 0.4.0)
|
rubocop-ast (>= 0.4.0)
|
||||||
rubocop-rails (2.12.3)
|
rubocop-rails (2.13.2)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
rack (>= 1.1)
|
rack (>= 1.1)
|
||||||
rubocop (>= 1.7.0, < 2.0)
|
rubocop (>= 1.7.0, < 2.0)
|
||||||
rubocop-rspec (2.5.0)
|
rubocop-rspec (2.9.0)
|
||||||
rubocop (~> 1.19)
|
rubocop (~> 1.19)
|
||||||
ruby-progressbar (1.11.0)
|
ruby-progressbar (1.11.0)
|
||||||
ruby-saml (1.13.0)
|
ruby-saml (1.14.0)
|
||||||
nokogiri (>= 1.10.5)
|
nokogiri (>= 1.10.5)
|
||||||
rexml
|
rexml
|
||||||
ruby2_keywords (0.0.5)
|
ruby2_keywords (0.0.5)
|
||||||
|
@ -534,66 +534,49 @@ GEM
|
||||||
rubyzip (2.3.2)
|
rubyzip (2.3.2)
|
||||||
sassc (2.4.0)
|
sassc (2.4.0)
|
||||||
ffi (~> 1.9)
|
ffi (~> 1.9)
|
||||||
|
sassc (2.4.0-x86_64-linux-musl)
|
||||||
|
ffi (~> 1.9)
|
||||||
sassc-rails (2.1.2)
|
sassc-rails (2.1.2)
|
||||||
railties (>= 4.0.0)
|
railties (>= 4.0.0)
|
||||||
sassc (>= 2.0)
|
sassc (>= 2.0)
|
||||||
sprockets (> 3.0)
|
sprockets (> 3.0)
|
||||||
sprockets-rails
|
sprockets-rails
|
||||||
tilt
|
tilt
|
||||||
sawyer (0.8.2)
|
selenium-webdriver (4.1.0)
|
||||||
addressable (>= 2.3.5)
|
childprocess (>= 0.5, < 5.0)
|
||||||
faraday (> 0.8, < 2.0)
|
rexml (~> 3.2, >= 3.2.5)
|
||||||
selenium-webdriver (3.142.7)
|
|
||||||
childprocess (>= 0.5, < 4.0)
|
|
||||||
rubyzip (>= 1.2.2)
|
rubyzip (>= 1.2.2)
|
||||||
shellany (0.0.1)
|
shellany (0.0.1)
|
||||||
shoulda-matchers (5.0.0)
|
shoulda-matchers (5.1.0)
|
||||||
activesupport (>= 5.2.0)
|
activesupport (>= 5.2.0)
|
||||||
simple_oauth (0.3.1)
|
simple_oauth (0.3.1)
|
||||||
simplecov (0.21.2)
|
simple_po_parser (1.1.6)
|
||||||
docile (~> 1.1)
|
|
||||||
simplecov-html (~> 0.11)
|
|
||||||
simplecov_json_formatter (~> 0.1)
|
|
||||||
simplecov-html (0.12.3)
|
|
||||||
simplecov-rcov (0.2.3)
|
|
||||||
simplecov (>= 0.4.1)
|
|
||||||
simplecov_json_formatter (0.1.3)
|
|
||||||
slack-notifier (2.4.0)
|
slack-notifier (2.4.0)
|
||||||
slack-ruby-client (0.17.0)
|
slack-ruby-client (1.0.0)
|
||||||
faraday (>= 1.0)
|
faraday (>= 1.0)
|
||||||
faraday_middleware
|
faraday_middleware
|
||||||
gli
|
gli
|
||||||
hashie
|
hashie
|
||||||
websocket-driver
|
websocket-driver
|
||||||
slop (3.6.0)
|
slop (3.6.0)
|
||||||
spring (3.0.0)
|
spring (4.0.0)
|
||||||
spring-commands-rspec (1.0.4)
|
|
||||||
spring (>= 0.9.1)
|
|
||||||
spring-commands-testunit (1.0.1)
|
|
||||||
spring (>= 0.9.1)
|
|
||||||
sprockets (3.7.2)
|
sprockets (3.7.2)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
rack (> 1, < 3)
|
rack (> 1, < 3)
|
||||||
sprockets-rails (3.2.2)
|
sprockets-rails (3.4.2)
|
||||||
actionpack (>= 4.0)
|
actionpack (>= 5.2)
|
||||||
activesupport (>= 4.0)
|
activesupport (>= 5.2)
|
||||||
sprockets (>= 3.0.0)
|
sprockets (>= 3.0.0)
|
||||||
sync (0.5.0)
|
|
||||||
tcr (0.2.2)
|
tcr (0.2.2)
|
||||||
telegramAPI (1.4.2)
|
telegramAPI (1.4.2)
|
||||||
rest-client (~> 2.0, >= 2.0.2)
|
rest-client (~> 2.0, >= 2.0.2)
|
||||||
telephone_number (1.4.12)
|
telephone_number (1.4.14)
|
||||||
term-ansicolor (1.7.1)
|
test-unit (3.5.3)
|
||||||
tins (~> 1.0)
|
|
||||||
test-unit (3.4.7)
|
|
||||||
power_assert
|
power_assert
|
||||||
thor (1.1.0)
|
thor (1.2.1)
|
||||||
thread_safe (0.3.6)
|
thread_safe (0.3.6)
|
||||||
tilt (2.0.10)
|
tilt (2.0.10)
|
||||||
timers (4.3.3)
|
twilio-ruby (5.65.1)
|
||||||
tins (1.29.1)
|
|
||||||
sync
|
|
||||||
twilio-ruby (5.59.0)
|
|
||||||
faraday (>= 0.9, < 2.0)
|
faraday (>= 0.9, < 2.0)
|
||||||
jwt (>= 1.5, <= 2.5)
|
jwt (>= 1.5, <= 2.5)
|
||||||
nokogiri (>= 1.6, < 2.0)
|
nokogiri (>= 1.6, < 2.0)
|
||||||
|
@ -615,14 +598,18 @@ GEM
|
||||||
unf (0.1.4)
|
unf (0.1.4)
|
||||||
unf_ext
|
unf_ext
|
||||||
unf_ext (0.0.8)
|
unf_ext (0.0.8)
|
||||||
|
unf_ext (0.0.8-x86_64-linux-musl)
|
||||||
unicode-display_width (2.1.0)
|
unicode-display_width (2.1.0)
|
||||||
unicorn (6.0.0)
|
unicorn (6.1.0)
|
||||||
kgio (~> 2.6)
|
kgio (~> 2.6)
|
||||||
raindrops (~> 0.7)
|
raindrops (~> 0.7)
|
||||||
valid_email2 (4.0.0)
|
unicorn (6.1.0-x86_64-linux-musl)
|
||||||
|
kgio (~> 2.6)
|
||||||
|
raindrops (~> 0.7)
|
||||||
|
valid_email2 (4.0.3)
|
||||||
activemodel (>= 3.2)
|
activemodel (>= 3.2)
|
||||||
mail (~> 2.5)
|
mail (~> 2.5)
|
||||||
vcr (6.0.0)
|
vcr (6.1.0)
|
||||||
viewpoint (1.1.1)
|
viewpoint (1.1.1)
|
||||||
httpclient
|
httpclient
|
||||||
logging
|
logging
|
||||||
|
@ -634,22 +621,26 @@ GEM
|
||||||
hashdiff (>= 0.4.0, < 2.0.0)
|
hashdiff (>= 0.4.0, < 2.0.0)
|
||||||
websocket-driver (0.7.5)
|
websocket-driver (0.7.5)
|
||||||
websocket-extensions (>= 0.1.0)
|
websocket-extensions (>= 0.1.0)
|
||||||
|
websocket-driver (0.7.5-x86_64-linux-musl)
|
||||||
|
websocket-extensions (>= 0.1.0)
|
||||||
websocket-extensions (0.1.5)
|
websocket-extensions (0.1.5)
|
||||||
writeexcel (1.0.5)
|
writeexcel (1.0.5)
|
||||||
xpath (3.2.0)
|
xpath (3.2.0)
|
||||||
nokogiri (~> 1.8)
|
nokogiri (~> 1.8)
|
||||||
zeitwerk (2.4.2)
|
zeitwerk (2.5.4)
|
||||||
zendesk_api (1.33.0)
|
zendesk_api (1.35.0)
|
||||||
faraday (>= 0.9.0, < 2.0.0)
|
faraday (>= 0.9.0, < 2.0.0)
|
||||||
hashie (>= 3.5.2, < 5.0.0)
|
hashie (>= 3.5.2, < 6.0.0)
|
||||||
inflection
|
inflection
|
||||||
mini_mime
|
mini_mime
|
||||||
multipart-post (~> 2.0)
|
multipart-post (~> 2.0)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
x86_64-linux-musl
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
|
PoParser
|
||||||
aasm
|
aasm
|
||||||
activerecord-import
|
activerecord-import
|
||||||
activerecord-nulldb-adapter
|
activerecord-nulldb-adapter
|
||||||
|
@ -669,7 +660,6 @@ DEPENDENCIES
|
||||||
coffee-rails
|
coffee-rails
|
||||||
coffeelint
|
coffeelint
|
||||||
composite_primary_keys
|
composite_primary_keys
|
||||||
coveralls
|
|
||||||
csv
|
csv
|
||||||
daemons
|
daemons
|
||||||
dalli
|
dalli
|
||||||
|
@ -684,7 +674,6 @@ DEPENDENCIES
|
||||||
execjs
|
execjs
|
||||||
factory_bot_rails
|
factory_bot_rails
|
||||||
faker
|
faker
|
||||||
github_changelog_generator
|
|
||||||
gmail_xoauth
|
gmail_xoauth
|
||||||
guard
|
guard
|
||||||
guard-livereload
|
guard-livereload
|
||||||
|
@ -696,6 +685,7 @@ DEPENDENCIES
|
||||||
json
|
json
|
||||||
koala
|
koala
|
||||||
libv8
|
libv8
|
||||||
|
lograge
|
||||||
mail!
|
mail!
|
||||||
messagebird-rest
|
messagebird-rest
|
||||||
mime-types
|
mime-types
|
||||||
|
@ -723,6 +713,7 @@ DEPENDENCIES
|
||||||
puma (~> 4)
|
puma (~> 4)
|
||||||
pundit
|
pundit
|
||||||
pundit-matchers
|
pundit-matchers
|
||||||
|
rack-attack
|
||||||
rack-livereload
|
rack-livereload
|
||||||
rails (~> 6.0.0)
|
rails (~> 6.0.0)
|
||||||
rails-controller-testing
|
rails-controller-testing
|
||||||
|
@ -730,6 +721,7 @@ DEPENDENCIES
|
||||||
rchardet (>= 1.8.0)
|
rchardet (>= 1.8.0)
|
||||||
redis
|
redis
|
||||||
rspec-rails
|
rspec-rails
|
||||||
|
rspec-retry
|
||||||
rszr (= 0.5.2)
|
rszr (= 0.5.2)
|
||||||
rubocop
|
rubocop
|
||||||
rubocop-faker
|
rubocop-faker
|
||||||
|
@ -740,13 +732,9 @@ DEPENDENCIES
|
||||||
sassc-rails
|
sassc-rails
|
||||||
selenium-webdriver
|
selenium-webdriver
|
||||||
shoulda-matchers
|
shoulda-matchers
|
||||||
simplecov
|
|
||||||
simplecov-rcov
|
|
||||||
slack-notifier
|
slack-notifier
|
||||||
slack-ruby-client
|
slack-ruby-client
|
||||||
spring
|
spring
|
||||||
spring-commands-rspec
|
|
||||||
spring-commands-testunit
|
|
||||||
sprockets (~> 3.7.2)
|
sprockets (~> 3.7.2)
|
||||||
tcr
|
tcr
|
||||||
telegramAPI
|
telegramAPI
|
||||||
|
@ -764,7 +752,7 @@ DEPENDENCIES
|
||||||
zendesk_api
|
zendesk_api
|
||||||
|
|
||||||
RUBY VERSION
|
RUBY VERSION
|
||||||
ruby 2.7.4p191
|
ruby 2.7.5p203
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
2.2.27
|
2.2.20
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
# A sample Guardfile
|
# A sample Guardfile
|
||||||
# More info at https://github.com/guard/guard#readme
|
# More info at https://github.com/guard/guard#readme
|
||||||
|
|
149
Makefile
Normal file
149
Makefile
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
SHELL := /bin/bash
|
||||||
|
.DEFAULT_GOAL := help
|
||||||
|
|
||||||
|
# Copiar el archivo de configuración y avisar cuando hay que
|
||||||
|
# actualizarlo.
|
||||||
|
.env: .env.example
|
||||||
|
@test -f $@ || cp -v $< $@
|
||||||
|
@test -f $@ && echo "Revisa $@ para actualizarlo con respecto a $<"
|
||||||
|
@test -f $@ && diff -auN --color $@ $<
|
||||||
|
|
||||||
|
include .env
|
||||||
|
|
||||||
|
export
|
||||||
|
|
||||||
|
# XXX: El espacio antes del comentario cuenta como espacio
|
||||||
|
args ?=## Argumentos para Hain
|
||||||
|
commit ?= origin/rails## Commit desde el que actualizar
|
||||||
|
env ?= staging## Entorno del nodo delegado
|
||||||
|
sutty ?= $(SUTTY)## Dirección local
|
||||||
|
delegate ?= $(DELEGATE)## Cambia el nodo delegado
|
||||||
|
hain ?= $(HAINISH)## Ubicación de Hainish
|
||||||
|
|
||||||
|
# El nodo delegado tiene dos entornos, production y staging.
|
||||||
|
# Dependiendo del entorno que elijamos, se van a generar los assets y el
|
||||||
|
# contenedor y subirse a un servidor u otro. No utilizamos CI/CD (aún).
|
||||||
|
#
|
||||||
|
# Production es el entorno de panel.sutty.nl
|
||||||
|
ifeq ($(env),production)
|
||||||
|
container ?= sutty
|
||||||
|
## TODO: Cambiar a otra cosa
|
||||||
|
branch ?= rails
|
||||||
|
public ?= public
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Staging es el entorno de panel.staging.sutty.nl
|
||||||
|
ifeq ($(env),staging)
|
||||||
|
container := staging
|
||||||
|
branch := staging
|
||||||
|
public := staging
|
||||||
|
endif
|
||||||
|
|
||||||
|
help: always ## Ayuda
|
||||||
|
@echo -e "Sutty\n" | sed -re "s/^.*/\x1B[38;5;197m&\x1B[0m/"
|
||||||
|
@echo -e "Servidor: https://panel.$(SUTTY_WITH_PORT)/\n"
|
||||||
|
@echo -e "Uso: make TAREA args=\"ARGUMENTOS\"\n"
|
||||||
|
@echo -e "Tareas:\n"
|
||||||
|
@grep -E "^[a-z\-]+:.*##" Makefile | sed -re "s/(.*):.*##(.*)/\1;\2/" | column -s ";" -t | sed -re "s/^([^ ]+) /\x1B[38;5;197m\1\x1B[0m/"
|
||||||
|
@echo -e "\nArgumentos:\n"
|
||||||
|
@grep -E "^[a-z\-]+ \?=.*##" Makefile | sed -re "s/(.*) \?=.*##(.*)/\1;\2/" | column -s ";" -t | sed -re "s/^([^ ]+) /\x1B[38;5;197m\1\x1B[0m/"
|
||||||
|
|
||||||
|
assets: node_modules public/packs/manifest.json.br ## Compilar los assets
|
||||||
|
|
||||||
|
test: always ## Ejecutar los tests
|
||||||
|
$(MAKE) rake args="test RAILS_ENV=test $(args)"
|
||||||
|
|
||||||
|
postgresql: /etc/hosts ## Iniciar la base de datos
|
||||||
|
pgrep postgres >/dev/null || $(hain) postgresql
|
||||||
|
|
||||||
|
serve-js: /etc/hosts node_modules ## Iniciar el servidor de desarrollo de Javascript
|
||||||
|
$(hain) 'bundle exec ./bin/webpack-dev-server'
|
||||||
|
|
||||||
|
serve: /etc/hosts postgresql Gemfile.lock ## Iniciar el servidor de desarrollo de Rails
|
||||||
|
$(MAKE) rails args=server
|
||||||
|
|
||||||
|
rails: ## Corre rails dentro del entorno de desarrollo (pasar argumentos con args=).
|
||||||
|
$(MAKE) bundle args="exec rails $(args)"
|
||||||
|
|
||||||
|
rake: ## Corre rake dentro del entorno de desarrollo (pasar argumentos con args=).
|
||||||
|
$(MAKE) bundle args="exec rake $(args)"
|
||||||
|
|
||||||
|
bundle: ## Corre bundle dentro del entorno de desarrollo (pasar argumentos con args=).
|
||||||
|
$(hain) 'bundle $(args)'
|
||||||
|
|
||||||
|
rubocop: ## Yutea el código que está por ser commiteado
|
||||||
|
git status --porcelain \
|
||||||
|
| grep -E "^(A|M)" \
|
||||||
|
| sed "s/^...//" \
|
||||||
|
| grep ".rb$$" \
|
||||||
|
| ../haini.sh/haini.sh "xargs -r ./bin/rubocop --auto-correct"
|
||||||
|
|
||||||
|
audit: ## Encuentra dependencias con vulnerabilidades
|
||||||
|
$(hain) 'gem install bundler-audit'
|
||||||
|
$(hain) 'bundle audit --update'
|
||||||
|
|
||||||
|
brakeman: ## Busca posibles vulnerabilidades en Sutty
|
||||||
|
$(MAKE) bundle args='exec brakeman'
|
||||||
|
|
||||||
|
yarn: ## Tareas de yarn
|
||||||
|
$(hain) 'yarn $(args)'
|
||||||
|
|
||||||
|
clean: ## Limpieza
|
||||||
|
rm -rf _sites/test-* _deploy/test-* log/*.log tmp/cache tmp/letter_opener tmp/miniprofiler tmp/storage
|
||||||
|
|
||||||
|
build: Gemfile.lock ## Generar la imagen Docker
|
||||||
|
time docker build --build-arg="BRANCH=$(branch)" --build-arg="RAILS_MASTER_KEY=`cat config/master.key`" -t sutty/$(container) .
|
||||||
|
docker tag sutty/$(container):latest sutty:keep
|
||||||
|
@echo -e "\a"
|
||||||
|
|
||||||
|
save: ## Subir la imagen Docker al nodo delegado
|
||||||
|
time docker save sutty/$(container):latest | ssh root@$(delegate) docker load
|
||||||
|
date +%F | xargs -I {} git tag -f $(container)-{}
|
||||||
|
@echo -e "\a"
|
||||||
|
|
||||||
|
ota-js: assets ## Actualizar Javascript en el nodo delegado
|
||||||
|
sudo chgrp -R 82 public/
|
||||||
|
rsync -avi --delete-after public/ root@$(delegate):/srv/sutty/srv/http/data/_$(public)/
|
||||||
|
ssh root@$(delegate) docker exec $(container) sh -c "cat /srv/http/tmp/puma.pid | xargs -r kill -USR2"
|
||||||
|
|
||||||
|
ota: ## Actualizar Rails en el nodo delegado
|
||||||
|
umask 022; git format-patch $(commit)
|
||||||
|
scp ./0*.patch $(delegate):/tmp/
|
||||||
|
ssh $(delegate) mkdir -p /tmp/patches-$(commit)/
|
||||||
|
scp ./0*.patch $(delegate):/tmp/patches-$(commit)/
|
||||||
|
scp ./ota.sh $(delegate):/tmp/
|
||||||
|
ssh $(delegate) docker cp /tmp/patches-$(shell echo $(commit) | cut -d / -f 1) $(container):/tmp/
|
||||||
|
ssh $(delegate) docker cp /tmp/ota.sh $(container):/usr/local/bin/ota
|
||||||
|
ssh $(delegate) docker exec $(container) apk add --no-cache patch
|
||||||
|
ssh $(delegate) docker exec $(container) ota $(commit)
|
||||||
|
rm ./0*.patch
|
||||||
|
|
||||||
|
# Todos los archivos de assets. Si alguno cambia, se van a recompilar
|
||||||
|
# los assets que luego se suben al nodo delegado.
|
||||||
|
assets := package.json yarn.lock $(shell find app/assets/ app/javascript/ -type f)
|
||||||
|
public/packs/manifest.json.br: $(assets)
|
||||||
|
$(hain) 'PANEL_URL=https://panel.sutty.nl RAILS_ENV=production NODE_ENV=production bundle exec rake assets:precompile assets:clean'
|
||||||
|
|
||||||
|
# Correr un test en particular por ejemplo
|
||||||
|
# `make test/models/usuarie_test.rb`
|
||||||
|
tests := $(shell find test/ -name "*_test.rb")
|
||||||
|
$(tests): always
|
||||||
|
$(MAKE) test args="TEST=$@"
|
||||||
|
|
||||||
|
# Agrega las direcciones locales al sistema
|
||||||
|
/etc/hosts: always
|
||||||
|
@echo "Chequeando si es necesario agregar el dominio local $(SUTTY)"
|
||||||
|
@grep -q " $(SUTTY)$$" $@ || echo -e "127.0.0.1 $(SUTTY)\n::1 $(SUTTY)" | sudo tee -a $@
|
||||||
|
@grep -q " api.$(SUTTY)$$" $@ || echo -e "127.0.0.1 api.$(SUTTY)\n::1 api.$(SUTTY)" | sudo tee -a $@
|
||||||
|
@grep -q " panel.$(SUTTY)$$" $@ || echo -e "127.0.0.1 panel.$(SUTTY)\n::1 panel.$(SUTTY)" | sudo tee -a $@
|
||||||
|
@grep -q " postgresql.$(SUTTY)$$" $@ || echo -e "127.0.0.1 postgresql.$(SUTTY)\n::1 postgresql.$(SUTTY)" | sudo tee -a $@
|
||||||
|
|
||||||
|
# Instala las dependencias de Javascript
|
||||||
|
node_modules: package.json
|
||||||
|
$(MAKE) yarn
|
||||||
|
|
||||||
|
# Instala las dependencias de Rails
|
||||||
|
Gemfile.lock: Gemfile
|
||||||
|
$(MAKE) bundle args=install
|
||||||
|
|
||||||
|
.PHONY: always
|
2
Rakefile
2
Rakefile
|
@ -1,5 +1,5 @@
|
||||||
#!/usr/bin/env rake
|
#!/usr/bin/env rake
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
|
|
||||||
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
||||||
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
||||||
App.Config.set('api_path', 'api/v1')
|
App.Config.set('api_path', 'api/v1')
|
||||||
App.Config.set('image_path', '/assets/images')
|
App.Config.set('image_path', '/assets/images')
|
|
@ -77,8 +77,7 @@ class App.Controller extends Spine.Controller
|
||||||
|
|
||||||
# release bindings
|
# release bindings
|
||||||
if @el
|
if @el
|
||||||
@el.undelegate()
|
@el.off()
|
||||||
@el.unbind()
|
|
||||||
@el.empty()
|
@el.empty()
|
||||||
|
|
||||||
# release spine bindings (see release() of spine.coffee)
|
# release spine bindings (see release() of spine.coffee)
|
||||||
|
@ -114,7 +113,7 @@ class App.Controller extends Spine.Controller
|
||||||
if window.clipboardData # IE
|
if window.clipboardData # IE
|
||||||
window.clipboardData.setData('Text', text)
|
window.clipboardData.setData('Text', text)
|
||||||
else
|
else
|
||||||
window.prompt('Copy to clipboard: Ctrl+C, Enter', text)
|
window.prompt(__('Copy to clipboard: Ctrl+C, Enter'), text)
|
||||||
|
|
||||||
# disable all delay's and interval's
|
# disable all delay's and interval's
|
||||||
disconnectClient: ->
|
disconnectClient: ->
|
||||||
|
@ -220,7 +219,7 @@ class App.Controller extends Spine.Controller
|
||||||
|
|
||||||
userInfo: (data) ->
|
userInfo: (data) ->
|
||||||
el = data.el || $('[data-id="customer_info"]')
|
el = data.el || $('[data-id="customer_info"]')
|
||||||
el.unbind()
|
el.off()
|
||||||
|
|
||||||
# start customer info controller
|
# start customer info controller
|
||||||
new App.WidgetUser(
|
new App.WidgetUser(
|
||||||
|
@ -300,15 +299,17 @@ class App.Controller extends Spine.Controller
|
||||||
|
|
||||||
frontendTimeUpdateItem: (item, currentVal) =>
|
frontendTimeUpdateItem: (item, currentVal) =>
|
||||||
timestamp = item.attr('datetime')
|
timestamp = item.attr('datetime')
|
||||||
time = @humanTime(timestamp, item.hasClass('escalation'))
|
return if timestamp is 'null'
|
||||||
|
|
||||||
# only do dom updates on changes
|
# only do dom updates on changes
|
||||||
|
time = @humanTime(timestamp, item.hasClass('escalation'))
|
||||||
return if time is currentVal
|
return if time is currentVal
|
||||||
|
|
||||||
newTitle = App.i18n.translateTimestamp(timestamp)
|
newTitle = App.i18n.translateTimestamp(timestamp)
|
||||||
if item.attr('timezone')
|
if item.attr('timezone')
|
||||||
newTitle += ' ' + item.attr('timezone')
|
newTitle += ' ' + item.attr('timezone')
|
||||||
|
|
||||||
|
if !item.hasClass('noTitle')
|
||||||
item.attr('title', newTitle)
|
item.attr('title', newTitle)
|
||||||
item.html(time)
|
item.html(time)
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,9 @@ class App.ControllerModal extends App.Controller
|
||||||
false
|
false
|
||||||
|
|
||||||
content: ->
|
content: ->
|
||||||
'You need to implement a one @content()!'
|
# coffeelint: disable=detect_translatable_string
|
||||||
|
"You need to implement a '@content()' method!"
|
||||||
|
# coffeelint: enable=detect_translatable_string
|
||||||
|
|
||||||
update: =>
|
update: =>
|
||||||
if @message
|
if @message
|
||||||
|
@ -106,7 +108,7 @@ class App.ControllerModal extends App.Controller
|
||||||
if @buttonSubmit is true
|
if @buttonSubmit is true
|
||||||
@buttonSubmit = 'Submit'
|
@buttonSubmit = 'Submit'
|
||||||
if @buttonCancel is true
|
if @buttonCancel is true
|
||||||
@buttonCancel = 'Cancel & Go Back'
|
@buttonCancel = __('Cancel & Go Back')
|
||||||
|
|
||||||
@update()
|
@update()
|
||||||
|
|
||||||
|
@ -179,7 +181,7 @@ class App.ControllerModal extends App.Controller
|
||||||
form = @el
|
form = @el
|
||||||
|
|
||||||
# focus first input, select or textarea
|
# focus first input, select or textarea
|
||||||
form.find('input:not([disabled]):not([type="hidden"]):not(".btn"), select:not([disabled]), textarea:not([disabled])').first().focus()
|
form.find('input:not([disabled]):not([type="hidden"]):not(".btn"), select:not([disabled]), textarea:not([disabled])').first().trigger('focus')
|
||||||
|
|
||||||
@initalFormParams = @formParams()
|
@initalFormParams = @formParams()
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
class App.ControllerConfirm extends App.ControllerModal
|
||||||
|
buttonClose: true
|
||||||
|
buttonCancel: true
|
||||||
|
buttonSubmit: __('Yes')
|
||||||
|
buttonClass: 'btn--danger'
|
||||||
|
head: __('Confirmation')
|
||||||
|
small: true
|
||||||
|
|
||||||
|
content: ->
|
||||||
|
App.i18n.translateContent(@message)
|
||||||
|
|
||||||
|
onSubmit: =>
|
||||||
|
@close()
|
||||||
|
if @callback
|
||||||
|
@callback()
|
|
@ -1,8 +1,8 @@
|
||||||
class App.ControllerGenericDescription extends App.ControllerModal
|
class App.ControllerGenericDescription extends App.ControllerModal
|
||||||
buttonClose: true
|
buttonClose: true
|
||||||
buttonCancel: false
|
buttonCancel: false
|
||||||
buttonSubmit: 'Close'
|
buttonSubmit: __('Close')
|
||||||
head: 'Description'
|
head: __('Description')
|
||||||
|
|
||||||
content: =>
|
content: =>
|
||||||
marked(App.i18n.translateContent(@description))
|
marked(App.i18n.translateContent(@description))
|
|
@ -1,13 +1,13 @@
|
||||||
class App.ControllerGenericDestroyConfirm extends App.ControllerModal
|
class App.ControllerGenericDestroyConfirm extends App.ControllerModal
|
||||||
buttonClose: true
|
buttonClose: true
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
buttonSubmit: 'delete'
|
buttonSubmit: __('delete')
|
||||||
buttonClass: 'btn--danger'
|
buttonClass: 'btn--danger'
|
||||||
head: 'Confirm'
|
head: __('Confirmation')
|
||||||
small: true
|
small: true
|
||||||
|
|
||||||
content: ->
|
content: ->
|
||||||
App.i18n.translateContent('Sure to delete this object?')
|
App.i18n.translateContent('Do you really want to delete this object?')
|
||||||
|
|
||||||
onSubmit: =>
|
onSubmit: =>
|
||||||
options = @options || {}
|
options = @options || {}
|
||||||
|
@ -19,19 +19,3 @@ class App.ControllerGenericDestroyConfirm extends App.ControllerModal
|
||||||
@log 'errors'
|
@log 'errors'
|
||||||
@showAlert(data.human_error || data.error)
|
@showAlert(data.human_error || data.error)
|
||||||
@item.destroy(options)
|
@item.destroy(options)
|
||||||
|
|
||||||
class App.ControllerConfirm extends App.ControllerModal
|
|
||||||
buttonClose: true
|
|
||||||
buttonCancel: true
|
|
||||||
buttonSubmit: 'yes'
|
|
||||||
buttonClass: 'btn--danger'
|
|
||||||
head: 'Confirm'
|
|
||||||
small: true
|
|
||||||
|
|
||||||
content: ->
|
|
||||||
App.i18n.translateContent(@message)
|
|
||||||
|
|
||||||
onSubmit: =>
|
|
||||||
@close()
|
|
||||||
if @callback
|
|
||||||
@callback()
|
|
|
@ -51,5 +51,5 @@ class App.ControllerGenericEdit extends App.ControllerModal
|
||||||
App[ ui.genericObject ].fetch(id: @id)
|
App[ ui.genericObject ].fetch(id: @id)
|
||||||
ui.log 'errors'
|
ui.log 'errors'
|
||||||
ui.formEnable(e)
|
ui.formEnable(e)
|
||||||
ui.controller.showAlert(details.error_human || details.error || 'Unable to update object!')
|
ui.controller.showAlert(details.error_human || details.error || __('The object could not be updated.'))
|
||||||
)
|
)
|
|
@ -1,9 +1,9 @@
|
||||||
class App.ControllerErrorModal extends App.ControllerModal
|
class App.ControllerErrorModal extends App.ControllerModal
|
||||||
buttonClose: true
|
buttonClose: true
|
||||||
buttonCancel: false
|
buttonCancel: false
|
||||||
buttonSubmit: 'Close'
|
buttonSubmit: __('Close')
|
||||||
#buttonClass: 'btn--danger'
|
#buttonClass: 'btn--danger'
|
||||||
head: 'Error'
|
head: __('Error')
|
||||||
#small: true
|
#small: true
|
||||||
#shown: true
|
#shown: true
|
||||||
showTrySupport: true
|
showTrySupport: true
|
|
@ -5,7 +5,7 @@ class App.GenericHistory extends App.ControllerModal
|
||||||
buttonClose: true
|
buttonClose: true
|
||||||
buttonCancel: false
|
buttonCancel: false
|
||||||
buttonSubmit: false
|
buttonSubmit: false
|
||||||
head: 'History'
|
head: __('History')
|
||||||
shown: false
|
shown: false
|
||||||
|
|
||||||
constructor: ->
|
constructor: ->
|
||||||
|
@ -18,7 +18,7 @@ class App.GenericHistory extends App.ControllerModal
|
||||||
content = $ App.view('generic/history')(
|
content = $ App.view('generic/history')(
|
||||||
items: localItem
|
items: localItem
|
||||||
)
|
)
|
||||||
content.find('a[data-type="sortorder"]').bind('click', (e) =>
|
content.find('a[data-type="sortorder"]').on('click', (e) =>
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
@sortorder()
|
@sortorder()
|
||||||
)
|
)
|
||||||
|
@ -44,6 +44,8 @@ class App.GenericHistory extends App.ControllerModal
|
||||||
|
|
||||||
if item.object is 'Ticket::Article'
|
if item.object is 'Ticket::Article'
|
||||||
item.object = 'Article'
|
item.object = 'Article'
|
||||||
|
if item.object is 'Ticket::SharedDraftZoom'
|
||||||
|
item.object = 'Draft'
|
||||||
|
|
||||||
data = item
|
data = item
|
||||||
data.created_by = App.User.find( item.created_by_id )
|
data.created_by = App.User.find( item.created_by_id )
|
||||||
|
@ -98,7 +100,7 @@ class App.GenericHistory extends App.ControllerModal
|
||||||
content += " '#{ @translateItemValue(item, item.value_from) }'"
|
content += " '#{ @translateItemValue(item, item.value_from) }'"
|
||||||
|
|
||||||
if item.value_to
|
if item.value_to
|
||||||
if item.value_from
|
if item.value_from || item.object is 'Mention'
|
||||||
content += ' →'
|
content += ' →'
|
||||||
content += " '#{ @translateItemValue(item, item.value_to) }'"
|
content += " '#{ @translateItemValue(item, item.value_to) }'"
|
||||||
else if item.value_from
|
else if item.value_from
|
||||||
|
@ -112,6 +114,14 @@ class App.GenericHistory extends App.ControllerModal
|
||||||
newItems
|
newItems
|
||||||
|
|
||||||
translateItemValue: ({object, attribute}, value) ->
|
translateItemValue: ({object, attribute}, value) ->
|
||||||
|
if object is 'Mention'
|
||||||
|
result = '-'
|
||||||
|
if value
|
||||||
|
user = App.User.find(value)
|
||||||
|
if user
|
||||||
|
result = user.displayName()
|
||||||
|
return result
|
||||||
|
|
||||||
localAttribute = @objectAttribute(object, attribute)
|
localAttribute = @objectAttribute(object, attribute)
|
||||||
if localAttribute && localAttribute.tag is 'datetime'
|
if localAttribute && localAttribute.tag is 'datetime'
|
||||||
return App.i18n.translateTimestamp(value)
|
return App.i18n.translateTimestamp(value)
|
|
@ -51,5 +51,5 @@ class App.ControllerGenericNew extends App.ControllerModal
|
||||||
fail: (settings, details) ->
|
fail: (settings, details) ->
|
||||||
ui.log 'errors', details
|
ui.log 'errors', details
|
||||||
ui.formEnable(e)
|
ui.formEnable(e)
|
||||||
ui.controller.showAlert(details.error_human || details.error || 'Unable to create object!')
|
ui.controller.showAlert(details.error_human || details.error || __('The object could not be created.'))
|
||||||
)
|
)
|
|
@ -0,0 +1,3 @@
|
||||||
|
class App.ControllerArticlePublicConfirm extends App.ControllerConfirm
|
||||||
|
head: __('Publish Article')
|
||||||
|
message: __('Do you really want to set the visibility of this article to "public"?')
|
|
@ -1,5 +1,5 @@
|
||||||
class App.ControllerForm extends App.Controller
|
class App.ControllerForm extends App.Controller
|
||||||
fullFormSubmitLabel: 'Submit'
|
fullFormSubmitLabel: __('Submit')
|
||||||
fullFormSubmitAdditionalClasses: ''
|
fullFormSubmitAdditionalClasses: ''
|
||||||
fullFormButtonsContainerClass: ''
|
fullFormButtonsContainerClass: ''
|
||||||
fullFormAdditionalButtons: [] # [{className: 'js-class', text: 'Label'}]
|
fullFormAdditionalButtons: [] # [{className: 'js-class', text: 'Label'}]
|
||||||
|
@ -34,11 +34,8 @@ class App.ControllerForm extends App.Controller
|
||||||
@form.prepend('<div class="alert alert--danger js-danger js-alert hide" role="alert"></div>')
|
@form.prepend('<div class="alert alert--danger js-danger js-alert hide" role="alert"></div>')
|
||||||
@form.prepend('<div class="alert alert--success js-success hide" role="alert"></div>')
|
@form.prepend('<div class="alert alert--success js-success hide" role="alert"></div>')
|
||||||
|
|
||||||
# Fix for Issue #2510 - Zammad Customers shown as Agents in IE
|
|
||||||
# Previously the handlers are called directly, before the DOM elements are ready, thereby causing a race condition under IE11.
|
|
||||||
# Now we only dispatch the handlers after the DOM is ready.
|
|
||||||
if @handlers.length
|
if @handlers.length
|
||||||
$(@dispatchHandlers)
|
@dispatchHandlers()
|
||||||
|
|
||||||
# if element is given, prepend form to it
|
# if element is given, prepend form to it
|
||||||
if @el
|
if @el
|
||||||
|
@ -160,7 +157,7 @@ class App.ControllerForm extends App.Controller
|
||||||
for eventSelector, callback of @events
|
for eventSelector, callback of @events
|
||||||
do (eventSelector, callback) ->
|
do (eventSelector, callback) ->
|
||||||
evs = eventSelector.split(' ')
|
evs = eventSelector.split(' ')
|
||||||
fieldset.find(evs[1]).bind(evs[0], (e) -> callback(e))
|
fieldset.find(evs[1]).on(evs[0], (e) -> callback(e))
|
||||||
|
|
||||||
# bind tool tips
|
# bind tool tips
|
||||||
fieldset.find('.js-helpMessage').tooltip()
|
fieldset.find('.js-helpMessage').tooltip()
|
||||||
|
@ -173,7 +170,7 @@ class App.ControllerForm extends App.Controller
|
||||||
# input text field with max. 100 size
|
# input text field with max. 100 size
|
||||||
attribute_config = {
|
attribute_config = {
|
||||||
name: 'subject'
|
name: 'subject'
|
||||||
display: 'Subject'
|
display: __('Subject')
|
||||||
tag: 'input'
|
tag: 'input'
|
||||||
type: 'text'
|
type: 'text'
|
||||||
limit: 100
|
limit: 100
|
||||||
|
@ -185,7 +182,7 @@ class App.ControllerForm extends App.Controller
|
||||||
# colection as relation with auto completion
|
# colection as relation with auto completion
|
||||||
attribute_config = {
|
attribute_config = {
|
||||||
name: 'customer_id'
|
name: 'customer_id'
|
||||||
display: 'Customer'
|
display: __('Customer')
|
||||||
tag: 'autocompletion'
|
tag: 'autocompletion'
|
||||||
# auto completion params, endpoints, ui,...
|
# auto completion params, endpoints, ui,...
|
||||||
type: 'text'
|
type: 'text'
|
||||||
|
@ -193,7 +190,7 @@ class App.ControllerForm extends App.Controller
|
||||||
null: false
|
null: false
|
||||||
relation: 'User'
|
relation: 'User'
|
||||||
autocapitalize: false
|
autocapitalize: false
|
||||||
help: 'Select the customer of the ticket or create one.'
|
help: __('Select the customer of the ticket or create one.')
|
||||||
helpLink: '<a href="" class="customer_new">»</a>'
|
helpLink: '<a href="" class="customer_new">»</a>'
|
||||||
callback: @userInfo
|
callback: @userInfo
|
||||||
class: 'span7'
|
class: 'span7'
|
||||||
|
@ -202,7 +199,7 @@ class App.ControllerForm extends App.Controller
|
||||||
# colection as relation
|
# colection as relation
|
||||||
attribute_config = {
|
attribute_config = {
|
||||||
name: 'priority_id'
|
name: 'priority_id'
|
||||||
display: 'Priority'
|
display: __('Priority')
|
||||||
tag: 'select'
|
tag: 'select'
|
||||||
multiple: false
|
multiple: false
|
||||||
null: false
|
null: false
|
||||||
|
@ -216,7 +213,7 @@ class App.ControllerForm extends App.Controller
|
||||||
# colection as options
|
# colection as options
|
||||||
attribute_config = {
|
attribute_config = {
|
||||||
name: 'priority_id'
|
name: 'priority_id'
|
||||||
display: 'Priority'
|
display: __('Priority')
|
||||||
tag: 'select'
|
tag: 'select'
|
||||||
multiple: false
|
multiple: false
|
||||||
null: false
|
null: false
|
||||||
|
@ -278,7 +275,7 @@ class App.ControllerForm extends App.Controller
|
||||||
attribute.autocomplete = 'autocomplete="' + attribute.autocomplete + '"'
|
attribute.autocomplete = 'autocomplete="' + attribute.autocomplete + '"'
|
||||||
|
|
||||||
# set default values
|
# set default values
|
||||||
if attribute.value is undefined && 'default' of attribute
|
if attribute.value is undefined && 'default' of attribute && !@params?.id
|
||||||
attribute.value = attribute.default
|
attribute.value = attribute.default
|
||||||
|
|
||||||
# set params value
|
# set params value
|
||||||
|
@ -316,7 +313,7 @@ class App.ControllerForm extends App.Controller
|
||||||
item_bind = item.find('.richtext-content')
|
item_bind = item.find('.richtext-content')
|
||||||
item_event = 'blur'
|
item_event = 'blur'
|
||||||
|
|
||||||
item_bind.bind(item_event, (e) =>
|
item_bind.on(item_event, (e) =>
|
||||||
@lastChangedAttribute = attribute.name
|
@lastChangedAttribute = attribute.name
|
||||||
params = App.ControllerForm.params(@form)
|
params = App.ControllerForm.params(@form)
|
||||||
for handler in @handlers
|
for handler in @handlers
|
||||||
|
@ -418,11 +415,11 @@ class App.ControllerForm extends App.Controller
|
||||||
|
|
||||||
if !@constructor.fieldIsMandatory(field_by_name)
|
if !@constructor.fieldIsMandatory(field_by_name)
|
||||||
field_by_name.attr('required', true)
|
field_by_name.attr('required', true)
|
||||||
field_by_name.parents('.form-group').find('label span').html('*')
|
field_by_name.closest('.form-group').find('label span').html('*')
|
||||||
field_by_name.closest('.form-group').addClass('is-required')
|
field_by_name.closest('.form-group').addClass('is-required')
|
||||||
if !@constructor.fieldIsMandatory(field_by_data)
|
if !@constructor.fieldIsMandatory(field_by_data)
|
||||||
field_by_data.attr('required', true)
|
field_by_data.attr('required', true)
|
||||||
field_by_data.parents('.form-group').find('label span').html('*')
|
field_by_data.closest('.form-group').find('label span').html('*')
|
||||||
field_by_data.closest('.form-group').addClass('is-required')
|
field_by_data.closest('.form-group').addClass('is-required')
|
||||||
|
|
||||||
optional: (name, el = @form) ->
|
optional: (name, el = @form) ->
|
||||||
|
@ -434,11 +431,11 @@ class App.ControllerForm extends App.Controller
|
||||||
|
|
||||||
if @constructor.fieldIsMandatory(field_by_name)
|
if @constructor.fieldIsMandatory(field_by_name)
|
||||||
field_by_name.attr('required', false)
|
field_by_name.attr('required', false)
|
||||||
field_by_name.parents('.form-group').find('label span').html('')
|
field_by_name.closest('.form-group').find('label span').html('')
|
||||||
field_by_name.closest('.form-group').removeClass('is-required')
|
field_by_name.closest('.form-group').removeClass('is-required')
|
||||||
if @constructor.fieldIsMandatory(field_by_data)
|
if @constructor.fieldIsMandatory(field_by_data)
|
||||||
field_by_data.attr('required', false)
|
field_by_data.attr('required', false)
|
||||||
field_by_data.parents('.form-group').find('label span').html('')
|
field_by_data.closest('.form-group').find('label span').html('')
|
||||||
field_by_data.closest('.form-group').removeClass('is-required')
|
field_by_data.closest('.form-group').removeClass('is-required')
|
||||||
|
|
||||||
readonly: (name, el = @form) ->
|
readonly: (name, el = @form) ->
|
||||||
|
@ -530,6 +527,9 @@ class App.ControllerForm extends App.Controller
|
||||||
param[item.name] = [param[item.name], value]
|
param[item.name] = [param[item.name], value]
|
||||||
else
|
else
|
||||||
param[item.name].push value
|
param[item.name].push value
|
||||||
|
else
|
||||||
|
if item.multiselect && typeof value is 'string'
|
||||||
|
param[item.name] = new Array(value)
|
||||||
else
|
else
|
||||||
param[item.name] = value
|
param[item.name] = value
|
||||||
|
|
||||||
|
@ -784,7 +784,7 @@ class App.ControllerForm extends App.Controller
|
||||||
# set autofocus by delay to make validation testable
|
# set autofocus by delay to make validation testable
|
||||||
App.Delay.set(
|
App.Delay.set(
|
||||||
->
|
->
|
||||||
lookupForm.find('.has-error').find('input, textarea, select').first().focus()
|
lookupForm.find('.has-error').find('input, textarea, select').first().trigger('focus')
|
||||||
200
|
200
|
||||||
'validate'
|
'validate'
|
||||||
)
|
)
|
||||||
|
|
|
@ -2,6 +2,7 @@ class App.ControllerObserver extends App.Controller
|
||||||
model: 'Ticket'
|
model: 'Ticket'
|
||||||
template: 'tba'
|
template: 'tba'
|
||||||
globalRerender: true
|
globalRerender: true
|
||||||
|
lastAttributes: undefined
|
||||||
|
|
||||||
###
|
###
|
||||||
observe:
|
observe:
|
||||||
|
@ -25,7 +26,7 @@ class App.ControllerObserver extends App.Controller
|
||||||
# rerender, e. g. on language change
|
# rerender, e. g. on language change
|
||||||
if @globalRerender
|
if @globalRerender
|
||||||
@controllerBind('ui:rerender', =>
|
@controllerBind('ui:rerender', =>
|
||||||
@lastAttributres = undefined
|
@lastAttributes = undefined
|
||||||
@maybeRender(App[@model].fullLocal(@object_id))
|
@maybeRender(App[@model].fullLocal(@object_id))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -43,32 +44,40 @@ class App.ControllerObserver extends App.Controller
|
||||||
if !@subscribeId
|
if !@subscribeId
|
||||||
@subscribeId = object.subscribe(@subscribe)
|
@subscribeId = object.subscribe(@subscribe)
|
||||||
|
|
||||||
# remember current attributes
|
return if !@hasChanged(object)
|
||||||
|
|
||||||
|
@render(object)
|
||||||
|
|
||||||
|
hasChanged: (object) =>
|
||||||
currentAttributes = {}
|
currentAttributes = {}
|
||||||
|
|
||||||
|
objectCloned = $.extend(true, {}, object)
|
||||||
if @observe
|
if @observe
|
||||||
for key, active of @observe
|
for key, active of @observe
|
||||||
if active
|
if active && !_.isFunction(value)
|
||||||
currentAttributes[key] = object[key]
|
currentAttributes[key] = objectCloned[key]
|
||||||
|
|
||||||
if @observeNot
|
if @observeNot
|
||||||
for key, value of object
|
for key, value of objectCloned
|
||||||
if key isnt 'cid' && !@observeNot[key] && !_.isFunction(value) && !_.isObject(value)
|
if key isnt 'cid' && !@observeNot[key] && !_.isFunction(value)
|
||||||
currentAttributes[key] = value
|
currentAttributes[key] = value
|
||||||
|
|
||||||
if !@lastAttributres
|
if !@lastAttributes
|
||||||
@lastAttributres = {}
|
@lastAttributes = currentAttributes
|
||||||
else
|
return true
|
||||||
diff = difference(currentAttributes, @lastAttributres)
|
|
||||||
|
diff = difference(currentAttributes, @lastAttributes)
|
||||||
if _.isEmpty(diff)
|
if _.isEmpty(diff)
|
||||||
@log 'debug', 'maybeRender no diff, no rerender'
|
@log 'debug', 'maybeRender no diff, no rerender'
|
||||||
return
|
return false
|
||||||
|
|
||||||
@log 'debug', 'maybeRender.diff', diff, @observe, @model
|
@log 'debug', 'maybeRender.diff', diff, @observe, @model
|
||||||
@lastAttributres = currentAttributes
|
@lastAttributes = currentAttributes
|
||||||
|
|
||||||
@render(object, diff)
|
true
|
||||||
|
|
||||||
render: (object, diff) =>
|
render: (object) =>
|
||||||
@log 'debug', 'render', @template, object, diff
|
@log 'debug', 'render', @template, object
|
||||||
@html App.view(@template)(
|
@html App.view(@template)(
|
||||||
object: object
|
object: object
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
class App.ControllerReorderModal extends App.ControllerModal
|
class App.ControllerReorderModal extends App.ControllerModal
|
||||||
head: 'Drag to reorder'
|
head: __('Drag to reorder')
|
||||||
content: ->
|
content: ->
|
||||||
view = $(App.view('reorder_modal')())
|
view = $(App.view('reorder_modal')())
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ class App.ControllerReorderModal extends App.ControllerModal
|
||||||
true
|
true
|
||||||
overview: ['title']
|
overview: ['title']
|
||||||
attribute_list: [
|
attribute_list: [
|
||||||
{ name: 'title', display: 'Name' }
|
{ name: 'title', display: __('Name') }
|
||||||
]
|
]
|
||||||
objects: @items
|
objects: @items
|
||||||
)
|
)
|
||||||
|
@ -21,7 +21,7 @@ class App.ControllerReorderModal extends App.ControllerModal
|
||||||
|
|
||||||
onShown: ->
|
onShown: ->
|
||||||
super
|
super
|
||||||
@$('.js-submit').focus()
|
@$('.js-submit').trigger('focus')
|
||||||
|
|
||||||
save: ->
|
save: ->
|
||||||
ids = @$('tr.item').toArray().map (el) -> parseInt(el.dataset.id)
|
ids = @$('tr.item').toArray().map (el) -> parseInt(el.dataset.id)
|
||||||
|
@ -49,4 +49,3 @@ class App.ControllerReorderModal extends App.ControllerModal
|
||||||
onSubmit: ->
|
onSubmit: ->
|
||||||
super
|
super
|
||||||
@save()
|
@save()
|
||||||
|
|
||||||
|
|
|
@ -406,7 +406,7 @@ class App.ControllerTable extends App.Controller
|
||||||
if @bindCheckbox.events
|
if @bindCheckbox.events
|
||||||
for event, callback of @bindCheckbox.events
|
for event, callback of @bindCheckbox.events
|
||||||
do (table, event, callback) ->
|
do (table, event, callback) ->
|
||||||
table.delegate('input[name="bulk"]', event, (e) ->
|
table.on(event, 'input[name="bulk"]', (e) ->
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
id = $(e.currentTarget).parents('tr').data('id')
|
id = $(e.currentTarget).parents('tr').data('id')
|
||||||
checked = $(e.currentTarget).prop('checked')
|
checked = $(e.currentTarget).prop('checked')
|
||||||
|
@ -424,12 +424,12 @@ class App.ControllerTable extends App.Controller
|
||||||
if @checkbox
|
if @checkbox
|
||||||
|
|
||||||
# click first tr>td, catch click
|
# click first tr>td, catch click
|
||||||
table.delegate('tr > td:nth-child(1)', 'click', (e) ->
|
table.on('click', 'tr > td:nth-child(1)', (e) ->
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
)
|
)
|
||||||
|
|
||||||
# bind on full bulk click
|
# bind on full bulk click
|
||||||
table.delegate('input[name="bulk_all"]', 'change', (e) =>
|
table.on('change', 'input[name="bulk_all"]', (e) =>
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
clicks = []
|
clicks = []
|
||||||
if $(e.currentTarget).prop('checked')
|
if $(e.currentTarget).prop('checked')
|
||||||
|
@ -493,16 +493,6 @@ class App.ControllerTable extends App.Controller
|
||||||
sortable: @dndCallback
|
sortable: @dndCallback
|
||||||
))
|
))
|
||||||
|
|
||||||
getGroupByKeyName: (object, groupBy) ->
|
|
||||||
reference_key = groupBy + '_id'
|
|
||||||
|
|
||||||
if reference_key of object
|
|
||||||
attribute = _.findWhere(object.constructor.configure_attributes, { name: reference_key })
|
|
||||||
|
|
||||||
return App[attribute.relation]?.find(object[reference_key])?.displayName() || reference_key
|
|
||||||
|
|
||||||
groupBy
|
|
||||||
|
|
||||||
sortObjectKeys: (objects, direction) ->
|
sortObjectKeys: (objects, direction) ->
|
||||||
sorted = Object.keys(objects).sort()
|
sorted = Object.keys(objects).sort()
|
||||||
|
|
||||||
|
@ -525,7 +515,7 @@ class App.ControllerTable extends App.Controller
|
||||||
objectsToShow = @objectsOfPage(@pagerShownPage)
|
objectsToShow = @objectsOfPage(@pagerShownPage)
|
||||||
if @groupBy
|
if @groupBy
|
||||||
# group by raw (and not printable) value so dates work also
|
# group by raw (and not printable) value so dates work also
|
||||||
objectsGrouped = _.groupBy(objectsToShow, (object) => object[@getGroupByKeyName(object, @groupBy)])
|
objectsGrouped = _.groupBy(objectsToShow, (object) => @groupObjectName(object, @groupBy, excludeTags: ['date', 'datetime']))
|
||||||
else
|
else
|
||||||
objectsGrouped = { '': objectsToShow }
|
objectsGrouped = { '': objectsToShow }
|
||||||
|
|
||||||
|
@ -641,7 +631,7 @@ class App.ControllerTable extends App.Controller
|
||||||
if @clone
|
if @clone
|
||||||
@actions.push
|
@actions.push
|
||||||
name: 'clone'
|
name: 'clone'
|
||||||
display: 'Clone'
|
display: __('Clone')
|
||||||
icon: 'clipboard'
|
icon: 'clipboard'
|
||||||
class: 'create js-clone'
|
class: 'create js-clone'
|
||||||
callback: (id) =>
|
callback: (id) =>
|
||||||
|
@ -660,7 +650,7 @@ class App.ControllerTable extends App.Controller
|
||||||
if @destroy
|
if @destroy
|
||||||
@actions.push
|
@actions.push
|
||||||
name: 'delete'
|
name: 'delete'
|
||||||
display: 'Delete'
|
display: __('Delete')
|
||||||
icon: 'trash'
|
icon: 'trash'
|
||||||
class: 'danger js-delete'
|
class: 'danger js-delete'
|
||||||
callback: (id) =>
|
callback: (id) =>
|
||||||
|
@ -672,7 +662,7 @@ class App.ControllerTable extends App.Controller
|
||||||
if @actions.length
|
if @actions.length
|
||||||
@headers.push
|
@headers.push
|
||||||
name: 'action'
|
name: 'action'
|
||||||
display: 'Action'
|
display: __('Action')
|
||||||
width: '50px'
|
width: '50px'
|
||||||
displayWidth: 50
|
displayWidth: 50
|
||||||
align: 'right'
|
align: 'right'
|
||||||
|
@ -865,11 +855,15 @@ class App.ControllerTable extends App.Controller
|
||||||
@objects = localObjects
|
@objects = localObjects
|
||||||
@lastSortedobjects = localObjects
|
@lastSortedobjects = localObjects
|
||||||
|
|
||||||
groupObjectName: (object, key = undefined) ->
|
groupObjectName: (object, key = undefined, options = {}) ->
|
||||||
group = object
|
group = object
|
||||||
if key
|
if key
|
||||||
if key not of object
|
if key not of object
|
||||||
key += '_id'
|
key += '_id'
|
||||||
|
|
||||||
|
# return internal value if needed
|
||||||
|
return object[key] if options.excludeTags && _.find(@attributesList, (attr) -> attr.name == key && _.contains(options.excludeTags, attr.tag))
|
||||||
|
|
||||||
group = App.viewPrint(object, key, @attributesList)
|
group = App.viewPrint(object, key, @attributesList)
|
||||||
if _.isEmpty(group)
|
if _.isEmpty(group)
|
||||||
group = ''
|
group = ''
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
class App.ControllerTechnicalErrorModal extends App.ControllerModal
|
||||||
|
head: "StatusCode: #{status}"
|
||||||
|
contentCode: ''
|
||||||
|
buttonClose: false
|
||||||
|
buttonSubmit: 'Ok'
|
||||||
|
onSubmit: (e) -> @close(e)
|
||||||
|
|
||||||
|
content: ->
|
||||||
|
"<pre><code>#{@contentCode}</code></pre>"
|
|
@ -20,7 +20,7 @@ class App.ControllerWizardModal extends App.ControllerFullPage
|
||||||
@hideAlert(name)
|
@hideAlert(name)
|
||||||
@$('.setup.wizard').addClass('hide')
|
@$('.setup.wizard').addClass('hide')
|
||||||
@$(".setup.wizard.#{name}").removeClass('hide')
|
@$(".setup.wizard.#{name}").removeClass('hide')
|
||||||
@$(".setup.wizard.#{name} input, .setup.wizard.#{name} select").first().focus()
|
@$(".setup.wizard.#{name} input, .setup.wizard.#{name} select").first().trigger('focus')
|
||||||
|
|
||||||
showAlert: (screen, message) =>
|
showAlert: (screen, message) =>
|
||||||
@$(".#{screen}").find('.alert').first().removeClass('hide').text(App.i18n.translatePlain(message))
|
@$(".#{screen}").find('.alert').first().removeClass('hide').text(App.i18n.translatePlain(message))
|
||||||
|
|
|
@ -11,7 +11,7 @@ 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 a VIP customer.'
|
description = __('With filters you can e. g. dispatch new tickets into certain groups or set a certain priority for tickets of a VIP customer.')
|
||||||
|
|
||||||
new App.ControllerTable(
|
new App.ControllerTable(
|
||||||
el: template.find('.overview')
|
el: template.find('.overview')
|
||||||
|
@ -28,7 +28,7 @@ class App.ChannelEmailFilter extends App.Controller
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
new App.ControllerGenericNew(
|
new App.ControllerGenericNew(
|
||||||
pageData:
|
pageData:
|
||||||
object: 'Postmaster Filter'
|
object: __('Postmaster Filter')
|
||||||
genericObject: 'PostmasterFilter'
|
genericObject: 'PostmasterFilter'
|
||||||
container: @el.closest('.content')
|
container: @el.closest('.content')
|
||||||
callback: @load
|
callback: @load
|
||||||
|
@ -40,7 +40,7 @@ class App.ChannelEmailFilter extends App.Controller
|
||||||
new App.ControllerGenericEdit(
|
new App.ControllerGenericEdit(
|
||||||
id: id,
|
id: id,
|
||||||
pageData:
|
pageData:
|
||||||
object: 'Postmaster Filter'
|
object: __('Postmaster Filter')
|
||||||
genericObject: 'PostmasterFilter'
|
genericObject: 'PostmasterFilter'
|
||||||
container: @el.closest('.content')
|
container: @el.closest('.content')
|
||||||
callback: @load
|
callback: @load
|
||||||
|
|
|
@ -11,11 +11,11 @@ class App.ChannelEmailSignature 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 = '''
|
description = __('''
|
||||||
You can define different signatures for each group. So you can have different email signatures for different departments.
|
You can define different signatures for each group, which allows you to use a different signature for every department.
|
||||||
|
|
||||||
Once you have created a signature here, you need also to edit the groups where you want to use it.
|
Once you have created a signature here, you will also need to edit the groups where you want to use it.
|
||||||
'''
|
''')
|
||||||
|
|
||||||
new App.ControllerTable(
|
new App.ControllerTable(
|
||||||
el: template.find('.overview')
|
el: template.find('.overview')
|
||||||
|
@ -46,7 +46,7 @@ class ChannelEmailSignatureEdit extends App.ControllerModal
|
||||||
buttonClose: true
|
buttonClose: true
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
buttonSubmit: true
|
buttonSubmit: true
|
||||||
head: 'Signature'
|
head: __('Signature')
|
||||||
|
|
||||||
content: =>
|
content: =>
|
||||||
if @object
|
if @object
|
||||||
|
@ -90,5 +90,5 @@ class ChannelEmailSignatureEdit extends App.ControllerModal
|
||||||
fail: (settings, details) =>
|
fail: (settings, details) =>
|
||||||
@log 'errors', details
|
@log 'errors', details
|
||||||
@formEnable(e)
|
@formEnable(e)
|
||||||
@form.showAlert(details.error_human || details.error || 'Unable to create object!')
|
@form.showAlert(details.error_human || details.error || __('The object could not be created.'))
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
class ChannelChat extends App.ControllerSubContent
|
class ChannelChat extends App.ControllerSubContent
|
||||||
requiredPermission: 'admin.channel_chat'
|
requiredPermission: 'admin.channel_chat'
|
||||||
header: 'Chat'
|
header: __('Chat')
|
||||||
events:
|
events:
|
||||||
'change .js-params': 'updateParams'
|
'change .js-params': 'updateParams'
|
||||||
'input .js-params': 'updateParams'
|
'input .js-params': 'updateParams'
|
||||||
|
@ -32,74 +32,74 @@ class ChannelChat extends App.ControllerSubContent
|
||||||
name: 'chatId'
|
name: 'chatId'
|
||||||
default: '1'
|
default: '1'
|
||||||
type: 'Number'
|
type: 'Number'
|
||||||
description: 'Identifier of the chat-topic.'
|
description: __('Identifier of the chat topic.')
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'show'
|
name: 'show'
|
||||||
default: true
|
default: true
|
||||||
type: 'Boolean'
|
type: 'Boolean'
|
||||||
description: 'Show the chat when ready.'
|
description: __('Show the chat when ready.')
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'target'
|
name: 'target'
|
||||||
default: "$('body')"
|
default: "$('body')"
|
||||||
type: 'jQuery Object'
|
type: 'jQuery Object'
|
||||||
description: 'Where to append the chat to.'
|
description: __('Where to append the chat to.')
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'host'
|
name: 'host'
|
||||||
default: '(Empty)'
|
default: '(Empty)'
|
||||||
type: 'String'
|
type: 'String'
|
||||||
description: "If left empty, the host gets auto-detected - in this case %s. The auto-detection reads out the host from the <script> tag. If you don't include it via a <script> tag you need to specify the host."
|
description: __("If left empty, the host gets auto-detected - in this case %s. The auto-detection reads out the host from the <script> tag. If you don't include it via a <script> tag you need to specify the host.")
|
||||||
descriptionSubstitute: window.location.origin
|
descriptionSubstitute: window.location.origin
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'debug'
|
name: 'debug'
|
||||||
default: false
|
default: false
|
||||||
type: 'Boolean'
|
type: 'Boolean'
|
||||||
description: 'Enables console logging.'
|
description: __('Enables console logging.')
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'title'
|
name: 'title'
|
||||||
default: "'<strong>Chat</strong> with us!'"
|
default: "'<strong>Chat</strong> with us!'"
|
||||||
type: 'String'
|
type: 'String'
|
||||||
description: 'Welcome Title shown on the closed chat. Can contain HTML.'
|
description: __('Welcome Title shown on the closed chat. Can contain HTML.')
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'fontSize'
|
name: 'fontSize'
|
||||||
default: 'undefined'
|
default: 'undefined'
|
||||||
type: 'String'
|
type: 'String'
|
||||||
description: 'CSS font-size with a unit like 12px, 1.5em. If left to undefined it inherits the font-size of the website.'
|
description: __('CSS font-size with a unit like 12px, 1.5em. If left undefined it inherits the font-size of the website.')
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'flat'
|
name: 'flat'
|
||||||
default: 'false'
|
default: 'false'
|
||||||
type: 'Boolean'
|
type: 'Boolean'
|
||||||
description: 'Removes the shadows for a flat look.'
|
description: __('Removes the shadows for a flat look.')
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'buttonClass'
|
name: 'buttonClass'
|
||||||
default: "'open-zammad-chat'"
|
default: "'open-zammad-chat'"
|
||||||
type: 'String'
|
type: 'String'
|
||||||
description: 'Add this class to a button on your page that should open the chat.'
|
description: __('Add this class to a button on your page that should open the chat.')
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'inactiveClass'
|
name: 'inactiveClass'
|
||||||
default: "'is-inactive'"
|
default: "'is-inactive'"
|
||||||
type: 'String'
|
type: 'String'
|
||||||
description: 'This class gets added to the button on initialization and gets removed once the chat connection got established.'
|
description: __('This class gets added to the button on initialization and will be removed once the chat connection is established.')
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'cssAutoload'
|
name: 'cssAutoload'
|
||||||
default: 'true'
|
default: 'true'
|
||||||
type: 'Boolean'
|
type: 'Boolean'
|
||||||
description: 'Automatically loads the chat.css file. If you want to use your own css, just set it to false.'
|
description: __('Automatically loads the chat.css file. If you want to use your own css, just set it to false.')
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name: 'cssUrl'
|
name: 'cssUrl'
|
||||||
default: 'undefined'
|
default: 'undefined'
|
||||||
type: 'String'
|
type: 'String'
|
||||||
description: 'Location of an external chat.css file.'
|
description: __('Location of an external chat.css file.')
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -204,7 +204,7 @@ class ChannelChat extends App.ControllerSubContent
|
||||||
|
|
||||||
onUrlSubmit: (event) ->
|
onUrlSubmit: (event) ->
|
||||||
event.preventDefault() if event
|
event.preventDefault() if event
|
||||||
@urlInput.focus()
|
@urlInput.trigger('focus')
|
||||||
@changeDemoWebsite()
|
@changeDemoWebsite()
|
||||||
|
|
||||||
changeDemoWebsite: ->
|
changeDemoWebsite: ->
|
||||||
|
@ -353,7 +353,7 @@ class ChannelChat extends App.ControllerSubContent
|
||||||
@code.each (i, block) ->
|
@code.each (i, block) ->
|
||||||
hljs.highlightBlock block
|
hljs.highlightBlock block
|
||||||
|
|
||||||
App.Config.set('Chat', { prio: 4000, name: 'Chat', parent: '#channels', target: '#channels/chat', controller: ChannelChat, permission: ['admin.channel_chat'] }, 'NavBarAdmin')
|
App.Config.set('Chat', { prio: 4000, name: __('Chat'), parent: '#channels', target: '#channels/chat', controller: ChannelChat, permission: ['admin.channel_chat'] }, 'NavBarAdmin')
|
||||||
|
|
||||||
class Topics extends App.Controller
|
class Topics extends App.Controller
|
||||||
events:
|
events:
|
||||||
|
@ -373,9 +373,9 @@ class Topics extends App.Controller
|
||||||
new: (e) =>
|
new: (e) =>
|
||||||
new App.ControllerGenericNew(
|
new App.ControllerGenericNew(
|
||||||
pageData:
|
pageData:
|
||||||
title: 'Chats'
|
title: __('Chats')
|
||||||
object: 'Chat'
|
object: __('Chat')
|
||||||
objects: 'Chats'
|
objects: __('Chats')
|
||||||
genericObject: 'Chat'
|
genericObject: 'Chat'
|
||||||
callback: @render
|
callback: @render
|
||||||
container: @el.closest('.content')
|
container: @el.closest('.content')
|
||||||
|
@ -389,7 +389,7 @@ class Topics extends App.Controller
|
||||||
id: id
|
id: id
|
||||||
genericObject: 'Chat'
|
genericObject: 'Chat'
|
||||||
pageData:
|
pageData:
|
||||||
object: 'Chat'
|
object: __('Chat')
|
||||||
container: @el.closest('.content')
|
container: @el.closest('.content')
|
||||||
callback: @render
|
callback: @render
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,29 +1,29 @@
|
||||||
class ChannelEmail extends App.ControllerTabs
|
class ChannelEmail extends App.ControllerTabs
|
||||||
requiredPermission: 'admin.channel_email'
|
requiredPermission: 'admin.channel_email'
|
||||||
header: 'Email'
|
header: __('Email')
|
||||||
constructor: ->
|
constructor: ->
|
||||||
super
|
super
|
||||||
|
|
||||||
@title 'Email', true
|
@title __('Email'), true
|
||||||
|
|
||||||
@tabs = [
|
@tabs = [
|
||||||
{
|
{
|
||||||
name: 'Accounts',
|
name: __('Accounts'),
|
||||||
target: 'c-account',
|
target: 'c-account',
|
||||||
controller: ChannelEmailAccountOverview,
|
controller: ChannelEmailAccountOverview,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Filter',
|
name: __('Filter'),
|
||||||
target: 'c-filter',
|
target: 'c-filter',
|
||||||
controller: App.ChannelEmailFilter,
|
controller: App.ChannelEmailFilter,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Signatures',
|
name: __('Signatures'),
|
||||||
target: 'c-signature',
|
target: 'c-signature',
|
||||||
controller: App.ChannelEmailSignature,
|
controller: App.ChannelEmailSignature,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Settings',
|
name: __('Settings'),
|
||||||
target: 'c-setting',
|
target: 'c-setting',
|
||||||
controller: App.SettingsArea,
|
controller: App.SettingsArea,
|
||||||
params: { area: 'Email::Base' },
|
params: { area: 'Email::Base' },
|
||||||
|
@ -142,7 +142,7 @@ class ChannelEmailAccountOverview extends App.Controller
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
id = $(e.target).closest('.action').data('id')
|
id = $(e.target).closest('.action').data('id')
|
||||||
new App.ControllerConfirm(
|
new App.ControllerConfirm(
|
||||||
message: 'Sure?'
|
message: __('Are you sure?')
|
||||||
callback: =>
|
callback: =>
|
||||||
@ajax(
|
@ajax(
|
||||||
id: 'email_delete'
|
id: 'email_delete'
|
||||||
|
@ -197,7 +197,7 @@ class ChannelEmailAccountOverview extends App.Controller
|
||||||
channel_id = $(e.target).closest('.action').data('id')
|
channel_id = $(e.target).closest('.action').data('id')
|
||||||
new App.ControllerGenericNew(
|
new App.ControllerGenericNew(
|
||||||
pageData:
|
pageData:
|
||||||
object: 'Email Address'
|
object: __('Email Address')
|
||||||
genericObject: 'EmailAddress'
|
genericObject: 'EmailAddress'
|
||||||
container: @el.closest('.content')
|
container: @el.closest('.content')
|
||||||
item:
|
item:
|
||||||
|
@ -210,7 +210,7 @@ class ChannelEmailAccountOverview extends App.Controller
|
||||||
id = $(e.target).closest('li').data('id')
|
id = $(e.target).closest('li').data('id')
|
||||||
new App.ControllerGenericEdit(
|
new App.ControllerGenericEdit(
|
||||||
pageData:
|
pageData:
|
||||||
object: 'Email Address'
|
object: __('Email Address')
|
||||||
genericObject: 'EmailAddress'
|
genericObject: 'EmailAddress'
|
||||||
container: @el.closest('.content')
|
container: @el.closest('.content')
|
||||||
id: id
|
id: id
|
||||||
|
@ -254,11 +254,11 @@ class ChannelEmailEdit extends App.ControllerModal
|
||||||
buttonClose: true
|
buttonClose: true
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
buttonSubmit: true
|
buttonSubmit: true
|
||||||
head: 'Channel'
|
head: __('Channel')
|
||||||
|
|
||||||
content: =>
|
content: =>
|
||||||
configureAttributesBase = [
|
configureAttributesBase = [
|
||||||
{ name: 'group_id', display: 'Destination Group', tag: 'select', null: false, relation: 'Group', nulloption: true, filter: { active: true } },
|
{ name: 'group_id', display: __('Destination Group'), tag: 'select', null: false, relation: 'Group', nulloption: true, filter: { active: true } },
|
||||||
]
|
]
|
||||||
@form = new App.ControllerForm(
|
@form = new App.ControllerForm(
|
||||||
model:
|
model:
|
||||||
|
@ -298,7 +298,7 @@ class ChannelEmailEdit extends App.ControllerModal
|
||||||
error: (xhr) =>
|
error: (xhr) =>
|
||||||
data = JSON.parse(xhr.responseText)
|
data = JSON.parse(xhr.responseText)
|
||||||
@formEnable(e)
|
@formEnable(e)
|
||||||
@el.find('.alert').removeClass('hidden').text(data.error || 'Unable to save changes.')
|
@el.find('.alert').removeClass('hidden').text(data.error || __('The changes could not be saved.'))
|
||||||
)
|
)
|
||||||
|
|
||||||
class ChannelEmailAccountWizard extends App.ControllerWizardModal
|
class ChannelEmailAccountWizard extends App.ControllerWizardModal
|
||||||
|
@ -307,6 +307,7 @@ class ChannelEmailAccountWizard extends App.ControllerWizardModal
|
||||||
events:
|
events:
|
||||||
'submit .js-intro': 'probeBasedOnIntro'
|
'submit .js-intro': 'probeBasedOnIntro'
|
||||||
'submit .js-inbound': 'probeInbound'
|
'submit .js-inbound': 'probeInbound'
|
||||||
|
'change .js-inbound [name=adapter]': 'toggleInboundAdapter'
|
||||||
'change .js-outbound [name=adapter]': 'toggleOutboundAdapter'
|
'change .js-outbound [name=adapter]': 'toggleOutboundAdapter'
|
||||||
'submit .js-outbound': 'probleOutbound'
|
'submit .js-outbound': 'probleOutbound'
|
||||||
'click .js-goToSlide': 'goToSlide'
|
'click .js-goToSlide': 'goToSlide'
|
||||||
|
@ -371,10 +372,10 @@ class ChannelEmailAccountWizard extends App.ControllerWizardModal
|
||||||
|
|
||||||
# base
|
# base
|
||||||
configureAttributesBase = [
|
configureAttributesBase = [
|
||||||
{ name: 'realname', display: 'Organization & Department Name', tag: 'input', type: 'text', limit: 160, null: false, placeholder: 'Organization Support', autocomplete: 'off' },
|
{ name: 'realname', display: __('Organization & Department Name'), tag: 'input', type: 'text', limit: 160, null: false, placeholder: __('Organization Support'), autocomplete: 'off' },
|
||||||
{ name: 'email', display: 'Email', tag: 'input', type: 'email', limit: 120, null: false, placeholder: 'support@example.com', autocapitalize: false, autocomplete: 'off' },
|
{ name: 'email', display: __('Email'), tag: 'input', type: 'email', limit: 120, null: false, placeholder: 'support@example.com', autocapitalize: false, autocomplete: 'off' },
|
||||||
{ name: 'password', display: 'Password', tag: 'input', type: 'password', limit: 120, null: false, autocapitalize: false, autocomplete: 'new-password', single: true },
|
{ name: 'password', display: __('Password'), tag: 'input', type: 'password', limit: 120, null: false, autocapitalize: false, autocomplete: 'new-password', single: true },
|
||||||
{ name: 'group_id', display: 'Destination Group', tag: 'select', null: false, relation: 'Group', nulloption: true },
|
{ name: 'group_id', display: __('Destination Group'), tag: 'select', null: false, relation: 'Group', nulloption: true },
|
||||||
]
|
]
|
||||||
@formMeta = new App.ControllerForm(
|
@formMeta = new App.ControllerForm(
|
||||||
el: @$('.base-settings'),
|
el: @$('.base-settings'),
|
||||||
|
@ -386,7 +387,7 @@ class ChannelEmailAccountWizard extends App.ControllerWizardModal
|
||||||
|
|
||||||
# outbound
|
# outbound
|
||||||
configureAttributesOutbound = [
|
configureAttributesOutbound = [
|
||||||
{ name: 'adapter', display: 'Send Mails via', tag: 'select', multiple: false, null: false, options: @channelDriver.email.outbound },
|
{ name: 'adapter', display: __('Send Mails via'), tag: 'select', multiple: false, null: false, options: @channelDriver.email.outbound },
|
||||||
]
|
]
|
||||||
new App.ControllerForm(
|
new App.ControllerForm(
|
||||||
el: @$('.base-outbound-type')
|
el: @$('.base-outbound-type')
|
||||||
|
@ -400,22 +401,22 @@ class ChannelEmailAccountWizard extends App.ControllerWizardModal
|
||||||
|
|
||||||
# inbound
|
# inbound
|
||||||
configureAttributesInbound = [
|
configureAttributesInbound = [
|
||||||
{ name: 'adapter', display: 'Type', tag: 'select', multiple: false, null: false, options: @channelDriver.email.inbound },
|
{ name: 'adapter', display: __('Type'), tag: 'select', multiple: false, null: false, options: @channelDriver.email.inbound },
|
||||||
{ name: 'options::host', display: 'Host', tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false },
|
{ name: 'options::host', display: __('Host'), tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false },
|
||||||
{ name: 'options::user', display: 'User', tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false, autocomplete: 'off' },
|
{ name: 'options::user', display: __('User'), tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false, autocomplete: 'off' },
|
||||||
{ name: 'options::password', display: 'Password', tag: 'input', type: 'password', limit: 120, null: false, autocapitalize: false, autocomplete: 'new-password', single: true },
|
{ name: 'options::password', display: __('Password'), tag: 'input', type: 'password', limit: 120, null: false, autocapitalize: false, autocomplete: 'new-password', single: true },
|
||||||
{ name: 'options::ssl', display: 'SSL/STARTTLS', tag: 'boolean', null: true, options: { true: 'yes', false: 'no' }, default: true, translate: true, item_class: 'formGroup--halfSize' },
|
{ name: 'options::ssl', display: __('SSL/STARTTLS'), tag: 'select', null: true, options: { 'off': __('No SSL'), 'ssl': __('SSL'), 'starttls': __('STARTTLS') }, default: 'ssl', translate: true, item_class: 'formGroup--halfSize' },
|
||||||
{ name: 'options::port', display: 'Port', tag: 'input', type: 'text', limit: 6, null: true, autocapitalize: false, default: '993', item_class: 'formGroup--halfSize' },
|
{ name: 'options::port', display: __('Port'), tag: 'input', type: 'text', limit: 6, null: true, autocapitalize: false, default: '993', item_class: 'formGroup--halfSize' },
|
||||||
{ name: 'options::folder', display: 'Folder', tag: 'input', type: 'text', limit: 120, null: true, autocapitalize: false, item_class: 'formGroup--halfSize' },
|
{ name: 'options::folder', display: __('Folder'), tag: 'input', type: 'text', limit: 120, null: true, autocapitalize: false, item_class: 'formGroup--halfSize' },
|
||||||
{ name: 'options::keep_on_server', display: 'Keep messages on server', tag: 'boolean', null: true, options: { true: 'yes', false: 'no' }, translate: true, default: false, item_class: 'formGroup--halfSize' },
|
{ name: 'options::keep_on_server', display: __('Keep messages on server'), tag: 'boolean', null: true, options: { true: 'yes', false: 'no' }, translate: true, default: false, item_class: 'formGroup--halfSize' },
|
||||||
]
|
]
|
||||||
|
|
||||||
if !@channel
|
if !@channel
|
||||||
#Email Inbound form opened from new email wizard, show full settings
|
#Email Inbound form opened from new email wizard, show full settings
|
||||||
configureAttributesInbound = [
|
configureAttributesInbound = [
|
||||||
{ name: 'options::realname', display: 'Organization & Department Name', tag: 'input', type: 'text', limit: 160, null: false, placeholder: 'Organization Support', autocomplete: 'off' },
|
{ name: 'options::realname', display: __('Organization & Department Name'), tag: 'input', type: 'text', limit: 160, null: false, placeholder: __('Organization Support'), autocomplete: 'off' },
|
||||||
{ name: 'options::email', display: 'Email', tag: 'input', type: 'email', limit: 120, null: false, placeholder: 'support@example.com', autocapitalize: false, autocomplete: 'off' },
|
{ name: 'options::email', display: __('Email'), tag: 'input', type: 'email', limit: 120, null: false, placeholder: 'support@example.com', autocapitalize: false, autocomplete: 'off' },
|
||||||
{ name: 'options::group_id', display: 'Destination Group', tag: 'select', null: false, relation: 'Group', nulloption: true },
|
{ name: 'options::group_id', display: __('Destination Group'), tag: 'select', null: false, relation: 'Group', nulloption: true },
|
||||||
].concat(configureAttributesInbound)
|
].concat(configureAttributesInbound)
|
||||||
|
|
||||||
|
|
||||||
|
@ -428,20 +429,7 @@ class ChannelEmailAccountWizard extends App.ControllerWizardModal
|
||||||
ui.hide('options::folder')
|
ui.hide('options::folder')
|
||||||
ui.hide('options::keep_on_server')
|
ui.hide('options::keep_on_server')
|
||||||
|
|
||||||
handlePort = (params, attribute, attributes, classname, form, ui) ->
|
form = new App.ControllerForm(
|
||||||
return if !params
|
|
||||||
return if !params.options
|
|
||||||
currentPort = @$('[name="options::port"]').val()
|
|
||||||
if params.options.ssl is true
|
|
||||||
if !currentPort || currentPort is '143'
|
|
||||||
@$('[name="options::port"]').val('993')
|
|
||||||
return
|
|
||||||
if params.options.ssl is false
|
|
||||||
if !currentPort || currentPort is '993'
|
|
||||||
@$('[name="options::port"]').val('143')
|
|
||||||
return
|
|
||||||
|
|
||||||
new App.ControllerForm(
|
|
||||||
el: @$('.base-inbound-settings'),
|
el: @$('.base-inbound-settings'),
|
||||||
model:
|
model:
|
||||||
configure_attributes: configureAttributesInbound
|
configure_attributes: configureAttributesInbound
|
||||||
|
@ -449,9 +437,27 @@ class ChannelEmailAccountWizard extends App.ControllerWizardModal
|
||||||
params: @account.inbound
|
params: @account.inbound
|
||||||
handlers: [
|
handlers: [
|
||||||
showHideFolder,
|
showHideFolder,
|
||||||
handlePort,
|
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
@toggleInboundAdapter()
|
||||||
|
|
||||||
|
form.el.find("select[name='options::ssl']").off('change').on('change', (e) ->
|
||||||
|
if $(e.target).val() is 'ssl'
|
||||||
|
form.el.find("[name='options::port']").val('993')
|
||||||
|
else if $(e.target).val() is 'off'
|
||||||
|
form.el.find("[name='options::port']").val('143')
|
||||||
|
)
|
||||||
|
|
||||||
|
toggleInboundAdapter: =>
|
||||||
|
form = @$('.base-inbound-settings')
|
||||||
|
adapter = form.find("select[name='adapter']")
|
||||||
|
starttls = form.find("select[name='options::ssl'] option[value='starttls']")
|
||||||
|
|
||||||
|
if adapter.val() isnt 'imap'
|
||||||
|
starttls.remove()
|
||||||
|
else if starttls.length < 1
|
||||||
|
starttls = $('<option/>').attr('value', 'starttls').text(__('STARTTLS'))
|
||||||
|
form.find("select[name='options::ssl']").append(starttls)
|
||||||
|
|
||||||
toggleOutboundAdapter: =>
|
toggleOutboundAdapter: =>
|
||||||
|
|
||||||
|
@ -468,10 +474,10 @@ class ChannelEmailAccountWizard extends App.ControllerWizardModal
|
||||||
adapter = @$('.js-outbound [name=adapter]').val()
|
adapter = @$('.js-outbound [name=adapter]').val()
|
||||||
if adapter is 'smtp'
|
if adapter is 'smtp'
|
||||||
configureAttributesOutbound = [
|
configureAttributesOutbound = [
|
||||||
{ name: 'options::host', display: 'Host', tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false, autofocus: true },
|
{ name: 'options::host', display: __('Host'), tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false, autofocus: true },
|
||||||
{ name: 'options::user', display: 'User', tag: 'input', type: 'text', limit: 120, null: true, autocapitalize: false, autocomplete: 'off', },
|
{ name: 'options::user', display: __('User'), tag: 'input', type: 'text', limit: 120, null: true, autocapitalize: false, autocomplete: 'off', },
|
||||||
{ name: 'options::password', display: 'Password', tag: 'input', type: 'password', limit: 120, null: true, autocapitalize: false, autocomplete: 'new-password', single: true },
|
{ name: 'options::password', display: __('Password'), tag: 'input', type: 'password', limit: 120, null: true, autocapitalize: false, autocomplete: 'new-password', single: true },
|
||||||
{ name: 'options::port', display: 'Port', tag: 'input', type: 'text', limit: 6, null: true, autocapitalize: false },
|
{ name: 'options::port', display: __('Port'), tag: 'input', type: 'text', limit: 6, null: true, autocapitalize: false },
|
||||||
]
|
]
|
||||||
@form = new App.ControllerForm(
|
@form = new App.ControllerForm(
|
||||||
el: @$('.base-outbound-settings')
|
el: @$('.base-outbound-settings')
|
||||||
|
@ -525,10 +531,10 @@ class ChannelEmailAccountWizard extends App.ControllerWizardModal
|
||||||
|
|
||||||
else if data.result is 'duplicate'
|
else if data.result is 'duplicate'
|
||||||
@showSlide('js-intro')
|
@showSlide('js-intro')
|
||||||
@showAlert('js-intro', 'Account already exists!')
|
@showAlert('js-intro', __('Account already exists!'))
|
||||||
else
|
else
|
||||||
@showSlide('js-inbound')
|
@showSlide('js-inbound')
|
||||||
@showAlert('js-inbound', 'Unable to detect your server settings. Manual configuration needed.')
|
@showAlert('js-inbound', __('The server settings could not be automatically detected. Please configure them manually.'))
|
||||||
@$('.js-inbound [name="options::user"]').val(@account['meta']['email'])
|
@$('.js-inbound [name="options::user"]').val(@account['meta']['email'])
|
||||||
@$('.js-inbound [name="options::password"]').val(@account['meta']['password'])
|
@$('.js-inbound [name="options::password"]').val(@account['meta']['password'])
|
||||||
@$('.js-inbound [name="options::email"]').val(@account['meta']['email'])
|
@$('.js-inbound [name="options::email"]').val(@account['meta']['email'])
|
||||||
|
@ -605,16 +611,16 @@ class ChannelEmailAccountWizard extends App.ControllerWizardModal
|
||||||
)
|
)
|
||||||
|
|
||||||
probeInboundMessagesFound: (data, verify) =>
|
probeInboundMessagesFound: (data, verify) =>
|
||||||
message = App.i18n.translateContent('We have already found %s email(s) in your mailbox. Zammad will move it all from your mailbox into Zammad.', data.content_messages)
|
message = App.i18n.translateContent('We have already found %s email(s) in your mailbox. We will move them all from your mailbox into Zammad.', data.content_messages)
|
||||||
@$('.js-inbound-acknowledge .js-messageFound').html(message)
|
@$('.js-inbound-acknowledge .js-messageFound').html(message)
|
||||||
|
|
||||||
if !verify
|
if !verify
|
||||||
@$('.js-inbound-acknowledge .js-back').attr('data-slide', 'js-inbound')
|
@$('.js-inbound-acknowledge .js-back').attr('data-slide', 'js-inbound')
|
||||||
@$('.js-inbound-acknowledge .js-next').unbind('click.verify')
|
@$('.js-inbound-acknowledge .js-next').off('click.verify')
|
||||||
else
|
else
|
||||||
@$('.js-inbound-acknowledge .js-back').attr('data-slide', 'js-intro')
|
@$('.js-inbound-acknowledge .js-back').attr('data-slide', 'js-intro')
|
||||||
@$('.js-inbound-acknowledge .js-next').attr('data-slide', '')
|
@$('.js-inbound-acknowledge .js-next').attr('data-slide', '')
|
||||||
@$('.js-inbound-acknowledge .js-next').unbind('click.verify').bind('click.verify', (e) =>
|
@$('.js-inbound-acknowledge .js-next').off('click.verify').on('click.verify', (e) =>
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
@verify(@account)
|
@verify(@account)
|
||||||
)
|
)
|
||||||
|
@ -749,7 +755,7 @@ class ChannelEmailAccountWizard extends App.ControllerWizardModal
|
||||||
@delay(
|
@delay(
|
||||||
=>
|
=>
|
||||||
@showSlide('js-intro')
|
@showSlide('js-intro')
|
||||||
@showAlert('js-intro', 'Unable to verify sending and receiving. Please check your settings.')
|
@showAlert('js-intro', __('Email sending and receiving could not be verified. Please check your settings.'))
|
||||||
|
|
||||||
2300
|
2300
|
||||||
)
|
)
|
||||||
|
@ -759,7 +765,7 @@ class ChannelEmailAccountWizard extends App.ControllerWizardModal
|
||||||
@verify(@account, count + 1)
|
@verify(@account, count + 1)
|
||||||
error: =>
|
error: =>
|
||||||
@showSlide('js-intro')
|
@showSlide('js-intro')
|
||||||
@showAlert('js-intro', 'Unable to verify sending and receiving. Please check your settings.')
|
@showAlert('js-intro', __('Email sending and receiving could not be verified. Please check your settings.'))
|
||||||
)
|
)
|
||||||
|
|
||||||
hide: (e) =>
|
hide: (e) =>
|
||||||
|
@ -830,7 +836,7 @@ class ChannelEmailNotificationWizard extends App.ControllerWizardModal
|
||||||
|
|
||||||
# outbound
|
# outbound
|
||||||
configureAttributesOutbound = [
|
configureAttributesOutbound = [
|
||||||
{ name: 'adapter', display: 'Send Mails via', tag: 'select', multiple: false, null: false, options: @channelDriver.email.outbound },
|
{ name: 'adapter', display: __('Send Mails via'), tag: 'select', multiple: false, null: false, options: @channelDriver.email.outbound },
|
||||||
]
|
]
|
||||||
new App.ControllerForm(
|
new App.ControllerForm(
|
||||||
el: @$('.base-outbound-type')
|
el: @$('.base-outbound-type')
|
||||||
|
@ -849,10 +855,10 @@ class ChannelEmailNotificationWizard extends App.ControllerWizardModal
|
||||||
adapter = @$('.js-outbound [name=adapter]').val()
|
adapter = @$('.js-outbound [name=adapter]').val()
|
||||||
if adapter is 'smtp'
|
if adapter is 'smtp'
|
||||||
configureAttributesOutbound = [
|
configureAttributesOutbound = [
|
||||||
{ name: 'options::host', display: 'Host', tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false, autofocus: true },
|
{ name: 'options::host', display: __('Host'), tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false, autofocus: true },
|
||||||
{ name: 'options::user', display: 'User', tag: 'input', type: 'text', limit: 120, null: true, autocapitalize: false, autocomplete: 'off' },
|
{ name: 'options::user', display: __('User'), tag: 'input', type: 'text', limit: 120, null: true, autocapitalize: false, autocomplete: 'off' },
|
||||||
{ name: 'options::password', display: 'Password', tag: 'input', type: 'password', limit: 120, null: true, autocapitalize: false, autocomplete: 'new-password', single: true },
|
{ name: 'options::password', display: __('Password'), tag: 'input', type: 'password', limit: 120, null: true, autocapitalize: false, autocomplete: 'new-password', single: true },
|
||||||
{ name: 'options::port', display: 'Port', tag: 'input', type: 'text', limit: 6, null: true, autocapitalize: false },
|
{ name: 'options::port', display: __('Port'), tag: 'input', type: 'text', limit: 6, null: true, autocapitalize: false },
|
||||||
]
|
]
|
||||||
@form = new App.ControllerForm(
|
@form = new App.ControllerForm(
|
||||||
el: @$('.base-outbound-settings')
|
el: @$('.base-outbound-settings')
|
||||||
|
@ -900,4 +906,4 @@ class ChannelEmailNotificationWizard extends App.ControllerWizardModal
|
||||||
@enable(e)
|
@enable(e)
|
||||||
)
|
)
|
||||||
|
|
||||||
App.Config.set('Email', { prio: 3000, name: 'Email', parent: '#channels', target: '#channels/email', controller: ChannelEmail, permission: ['admin.channel_email'] }, 'NavBarAdmin')
|
App.Config.set('Email', { prio: 3000, name: __('Email'), parent: '#channels', target: '#channels/email', controller: ChannelEmail, permission: ['admin.channel_email'] }, 'NavBarAdmin')
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
class ChannelFacebook extends App.ControllerSubContent
|
class ChannelFacebook extends App.ControllerSubContent
|
||||||
requiredPermission: 'admin.channel_facebook'
|
requiredPermission: 'admin.channel_facebook'
|
||||||
header: 'Facebook'
|
header: __('Facebook')
|
||||||
events:
|
events:
|
||||||
'click .js-new': 'new'
|
'click .js-new': 'new'
|
||||||
'click .js-edit': 'edit'
|
'click .js-edit': 'edit'
|
||||||
|
@ -95,7 +95,7 @@ class ChannelFacebook extends App.ControllerSubContent
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
id = $(e.target).closest('.action').data('id')
|
id = $(e.target).closest('.action').data('id')
|
||||||
new App.ControllerConfirm(
|
new App.ControllerConfirm(
|
||||||
message: 'Sure?'
|
message: __('Are you sure?')
|
||||||
callback: =>
|
callback: =>
|
||||||
@ajax(
|
@ajax(
|
||||||
id: 'facebook_delete'
|
id: 'facebook_delete'
|
||||||
|
@ -136,7 +136,7 @@ class ChannelFacebook extends App.ControllerSubContent
|
||||||
)
|
)
|
||||||
|
|
||||||
class AppConfig extends App.ControllerModal
|
class AppConfig extends App.ControllerModal
|
||||||
head: 'Connect Facebook App'
|
head: __('Connect Facebook App')
|
||||||
shown: true
|
shown: true
|
||||||
button: 'Connect'
|
button: 'Connect'
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
|
@ -178,15 +178,15 @@ class AppConfig extends App.ControllerModal
|
||||||
@isChanged = true
|
@isChanged = true
|
||||||
@close()
|
@close()
|
||||||
fail: =>
|
fail: =>
|
||||||
@el.find('.alert').removeClass('hidden').text('Unable to create entry.')
|
@el.find('.alert').removeClass('hidden').text(__('The entry could not be created.'))
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
@formEnable(e)
|
@formEnable(e)
|
||||||
@el.find('.alert').removeClass('hidden').text(data.error || 'Unable to verify App.')
|
@el.find('.alert').removeClass('hidden').text(data.error || __('App could not be verified.'))
|
||||||
)
|
)
|
||||||
|
|
||||||
class AccountEdit extends App.ControllerModal
|
class AccountEdit extends App.ControllerModal
|
||||||
head: 'Facebook Account'
|
head: __('Facebook Account')
|
||||||
shown: true
|
shown: true
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
|
|
||||||
|
@ -242,7 +242,7 @@ class AccountEdit extends App.ControllerModal
|
||||||
error: (xhr) =>
|
error: (xhr) =>
|
||||||
data = JSON.parse(xhr.responseText)
|
data = JSON.parse(xhr.responseText)
|
||||||
@formEnable(e)
|
@formEnable(e)
|
||||||
@el.find('.alert').removeClass('hidden').text(data.error || 'Unable to save changes.')
|
@el.find('.alert').removeClass('hidden').text(data.error || __('The changes could not be saved.'))
|
||||||
)
|
)
|
||||||
|
|
||||||
App.Config.set('Facebook', { prio: 5100, name: 'Facebook', parent: '#channels', target: '#channels/facebook', controller: ChannelFacebook, permission: ['admin.channel_facebook'] }, 'NavBarAdmin')
|
App.Config.set('Facebook', { prio: 5100, name: __('Facebook'), parent: '#channels', target: '#channels/facebook', controller: ChannelFacebook, permission: ['admin.channel_facebook'] }, 'NavBarAdmin')
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# coffeelint: disable=no_unnecessary_double_quotes
|
# coffeelint: disable=no_unnecessary_double_quotes
|
||||||
class ChannelForm extends App.ControllerSubContent
|
class ChannelForm extends App.ControllerSubContent
|
||||||
requiredPermission: 'admin.channel_formular'
|
requiredPermission: 'admin.channel_formular'
|
||||||
header: 'Form'
|
header: __('Form')
|
||||||
events:
|
events:
|
||||||
'change form.js-paramsDesigner': 'updateParamsDesigner'
|
'change form.js-paramsDesigner': 'updateParamsDesigner'
|
||||||
'keyup form.js-paramsDesigner': 'updateParamsDesigner'
|
'keyup form.js-paramsDesigner': 'updateParamsDesigner'
|
||||||
|
@ -88,4 +88,4 @@ class ChannelForm extends App.ControllerSubContent
|
||||||
value = @paramsSetting.find('[name=group_id]').val()
|
value = @paramsSetting.find('[name=group_id]').val()
|
||||||
App.Setting.set('form_ticket_create_group_id', value)
|
App.Setting.set('form_ticket_create_group_id', value)
|
||||||
|
|
||||||
App.Config.set('Form', { prio: 2000, name: 'Form', parent: '#channels', target: '#channels/form', controller: ChannelForm, permission: ['admin.channel_formular'] }, 'NavBarAdmin')
|
App.Config.set('Form', { prio: 2000, name: __('Form'), parent: '#channels', target: '#channels/form', controller: ChannelForm, permission: ['admin.channel_formular'] }, 'NavBarAdmin')
|
||||||
|
|
|
@ -1,29 +1,29 @@
|
||||||
class App.ChannelGoogle extends App.ControllerTabs
|
class App.ChannelGoogle extends App.ControllerTabs
|
||||||
requiredPermission: 'admin.channel_google'
|
requiredPermission: 'admin.channel_google'
|
||||||
header: 'Google'
|
header: __('Google')
|
||||||
constructor: ->
|
constructor: ->
|
||||||
super
|
super
|
||||||
|
|
||||||
@title 'Google', true
|
@title __('Google'), true
|
||||||
|
|
||||||
@tabs = [
|
@tabs = [
|
||||||
{
|
{
|
||||||
name: 'Accounts',
|
name: __('Accounts'),
|
||||||
target: 'c-account',
|
target: 'c-account',
|
||||||
controller: ChannelAccountOverview,
|
controller: ChannelAccountOverview,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Filter',
|
name: __('Filter'),
|
||||||
target: 'c-filter',
|
target: 'c-filter',
|
||||||
controller: App.ChannelEmailFilter,
|
controller: App.ChannelEmailFilter,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Signatures',
|
name: __('Signatures'),
|
||||||
target: 'c-signature',
|
target: 'c-signature',
|
||||||
controller: App.ChannelEmailSignature,
|
controller: App.ChannelEmailSignature,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Settings',
|
name: __('Settings'),
|
||||||
target: 'c-setting',
|
target: 'c-setting',
|
||||||
controller: App.SettingsArea,
|
controller: App.SettingsArea,
|
||||||
params: { area: 'Email::Base' },
|
params: { area: 'Email::Base' },
|
||||||
|
@ -145,7 +145,7 @@ class ChannelAccountOverview extends App.ControllerSubContent
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
id = $(e.target).closest('.action').data('id')
|
id = $(e.target).closest('.action').data('id')
|
||||||
new App.ControllerConfirm(
|
new App.ControllerConfirm(
|
||||||
message: 'Sure?'
|
message: __('Are you sure?')
|
||||||
callback: =>
|
callback: =>
|
||||||
@ajax(
|
@ajax(
|
||||||
id: 'google_delete'
|
id: 'google_delete'
|
||||||
|
@ -215,11 +215,11 @@ class ChannelAccountOverview extends App.ControllerSubContent
|
||||||
@load()
|
@load()
|
||||||
@notify
|
@notify
|
||||||
type: 'success'
|
type: 'success'
|
||||||
msg: 'Rollback of channel migration succeeded!'
|
msg: __('Rollback of channel migration succeeded!')
|
||||||
error: (data) =>
|
error: (data) =>
|
||||||
@notify
|
@notify
|
||||||
type: 'error'
|
type: 'error'
|
||||||
msg: 'Failed to rollback migration of the channel!'
|
msg: __('Failed to roll back the migration of the channel!')
|
||||||
)
|
)
|
||||||
|
|
||||||
groupChange: (e) =>
|
groupChange: (e) =>
|
||||||
|
@ -237,7 +237,7 @@ class ChannelAccountOverview extends App.ControllerSubContent
|
||||||
channel_id = $(e.target).closest('.action').data('id')
|
channel_id = $(e.target).closest('.action').data('id')
|
||||||
new App.ControllerGenericNew(
|
new App.ControllerGenericNew(
|
||||||
pageData:
|
pageData:
|
||||||
object: 'Email Address'
|
object: __('Email Address')
|
||||||
genericObject: 'EmailAddress'
|
genericObject: 'EmailAddress'
|
||||||
container: @el.closest('.content')
|
container: @el.closest('.content')
|
||||||
item:
|
item:
|
||||||
|
@ -250,7 +250,7 @@ class ChannelAccountOverview extends App.ControllerSubContent
|
||||||
id = $(e.target).closest('li').data('id')
|
id = $(e.target).closest('li').data('id')
|
||||||
new App.ControllerGenericEdit(
|
new App.ControllerGenericEdit(
|
||||||
pageData:
|
pageData:
|
||||||
object: 'Email Address'
|
object: __('Email Address')
|
||||||
genericObject: 'EmailAddress'
|
genericObject: 'EmailAddress'
|
||||||
container: @el.closest('.content')
|
container: @el.closest('.content')
|
||||||
id: id
|
id: id
|
||||||
|
@ -271,12 +271,12 @@ class ChannelInboundEdit extends App.ControllerModal
|
||||||
buttonClose: true
|
buttonClose: true
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
buttonSubmit: true
|
buttonSubmit: true
|
||||||
head: 'Channel'
|
head: __('Channel')
|
||||||
|
|
||||||
content: =>
|
content: =>
|
||||||
configureAttributesBase = [
|
configureAttributesBase = [
|
||||||
{ name: 'options::folder', display: 'Folder', tag: 'input', type: 'text', limit: 120, null: true, autocapitalize: false, placeholder: 'optional' },
|
{ name: 'options::folder', display: __('Folder'), tag: 'input', type: 'text', limit: 120, null: true, autocapitalize: false, placeholder: __('optional') },
|
||||||
{ name: 'options::keep_on_server', display: 'Keep messages on server', tag: 'boolean', null: true, options: { true: 'yes', false: 'no' }, translate: true, default: false },
|
{ name: 'options::keep_on_server', display: __('Keep messages on server'), tag: 'boolean', null: true, options: { true: 'yes', false: 'no' }, translate: true, default: false },
|
||||||
]
|
]
|
||||||
@form = new App.ControllerForm(
|
@form = new App.ControllerForm(
|
||||||
model:
|
model:
|
||||||
|
@ -323,7 +323,7 @@ class ChannelInboundEdit extends App.ControllerModal
|
||||||
details = xhr.responseJSON || {}
|
details = xhr.responseJSON || {}
|
||||||
@notify
|
@notify
|
||||||
type: 'error'
|
type: 'error'
|
||||||
msg: App.i18n.translateContent(details.error_human || details.error || 'Unable to save changes.')
|
msg: App.i18n.translateContent(details.error_human || details.error || __('The changes could not be saved.'))
|
||||||
timeout: 6000
|
timeout: 6000
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -331,11 +331,11 @@ class ChannelGroupEdit extends App.ControllerModal
|
||||||
buttonClose: true
|
buttonClose: true
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
buttonSubmit: true
|
buttonSubmit: true
|
||||||
head: 'Channel'
|
head: __('Channel')
|
||||||
|
|
||||||
content: =>
|
content: =>
|
||||||
configureAttributesBase = [
|
configureAttributesBase = [
|
||||||
{ name: 'group_id', display: 'Destination Group', tag: 'select', null: false, relation: 'Group', nulloption: true, filter: { active: true } },
|
{ name: 'group_id', display: __('Destination Group'), tag: 'select', null: false, relation: 'Group', nulloption: true, filter: { active: true } },
|
||||||
]
|
]
|
||||||
@form = new App.ControllerForm(
|
@form = new App.ControllerForm(
|
||||||
model:
|
model:
|
||||||
|
@ -375,11 +375,11 @@ class ChannelGroupEdit extends App.ControllerModal
|
||||||
error: (xhr) =>
|
error: (xhr) =>
|
||||||
data = JSON.parse(xhr.responseText)
|
data = JSON.parse(xhr.responseText)
|
||||||
@formEnable(e)
|
@formEnable(e)
|
||||||
@el.find('.alert').removeClass('hidden').text(data.error || 'Unable to save changes.')
|
@el.find('.alert').removeClass('hidden').text(data.error || __('The changes could not be saved.'))
|
||||||
)
|
)
|
||||||
|
|
||||||
class AppConfig extends App.ControllerModal
|
class AppConfig extends App.ControllerModal
|
||||||
head: 'Connect Google App'
|
head: __('Connect Google App')
|
||||||
shown: true
|
shown: true
|
||||||
button: 'Connect'
|
button: 'Connect'
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
|
@ -421,11 +421,11 @@ class AppConfig extends App.ControllerModal
|
||||||
@isChanged = true
|
@isChanged = true
|
||||||
@close()
|
@close()
|
||||||
fail: =>
|
fail: =>
|
||||||
@el.find('.alert').removeClass('hidden').text('Unable to create entry.')
|
@el.find('.alert').removeClass('hidden').text(__('The entry could not be created.'))
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
@formEnable(e)
|
@formEnable(e)
|
||||||
@el.find('.alert').removeClass('hidden').text(data.error || 'Unable to verify App.')
|
@el.find('.alert').removeClass('hidden').text(data.error || __('App could not be verified.'))
|
||||||
)
|
)
|
||||||
|
|
||||||
App.Config.set('google', { prio: 5000, name: 'Google', parent: '#channels', target: '#channels/google', controller: App.ChannelGoogle, permission: ['admin.channel_google'] }, 'NavBarAdmin')
|
App.Config.set('google', { prio: 5000, name: __('Google'), parent: '#channels', target: '#channels/google', controller: App.ChannelGoogle, permission: ['admin.channel_google'] }, 'NavBarAdmin')
|
||||||
|
|
|
@ -1,29 +1,29 @@
|
||||||
class App.ChannelMicrosoft365 extends App.ControllerTabs
|
class App.ChannelMicrosoft365 extends App.ControllerTabs
|
||||||
requiredPermission: 'admin.channel_microsoft365'
|
requiredPermission: 'admin.channel_microsoft365'
|
||||||
header: 'Microsoft 365'
|
header: __('Microsoft 365')
|
||||||
constructor: ->
|
constructor: ->
|
||||||
super
|
super
|
||||||
|
|
||||||
@title 'Microsoft 365', true
|
@title __('Microsoft 365'), true
|
||||||
|
|
||||||
@tabs = [
|
@tabs = [
|
||||||
{
|
{
|
||||||
name: 'Accounts',
|
name: __('Accounts'),
|
||||||
target: 'c-account',
|
target: 'c-account',
|
||||||
controller: ChannelAccountOverview,
|
controller: ChannelAccountOverview,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Filter',
|
name: __('Filter'),
|
||||||
target: 'c-filter',
|
target: 'c-filter',
|
||||||
controller: App.ChannelEmailFilter,
|
controller: App.ChannelEmailFilter,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Signatures',
|
name: __('Signatures'),
|
||||||
target: 'c-signature',
|
target: 'c-signature',
|
||||||
controller: App.ChannelEmailSignature,
|
controller: App.ChannelEmailSignature,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Settings',
|
name: __('Settings'),
|
||||||
target: 'c-setting',
|
target: 'c-setting',
|
||||||
controller: App.SettingsArea,
|
controller: App.SettingsArea,
|
||||||
params: { area: 'Email::Base' },
|
params: { area: 'Email::Base' },
|
||||||
|
@ -95,8 +95,12 @@ class ChannelAccountOverview extends App.ControllerSubContent
|
||||||
|
|
||||||
channels.push channel
|
channels.push channel
|
||||||
|
|
||||||
# auto redirect to gmail account linking if we have no account
|
# on a channel migration we need to auto redirect
|
||||||
if @channel_id && channels.length < 1
|
# the user to the "Add Account" functionality after
|
||||||
|
# the filled up the external credentials
|
||||||
|
if @channel_id
|
||||||
|
item = App.Channel.find(@channel_id)
|
||||||
|
if item && item.area != 'Microsoft365::Account'
|
||||||
@new()
|
@new()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -111,9 +115,14 @@ class ChannelAccountOverview extends App.ControllerSubContent
|
||||||
not_used_email_addresses: not_used_email_addresses
|
not_used_email_addresses: not_used_email_addresses
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# on a channel creation we will auto open the edit
|
||||||
|
# dialog after the redirect back to zammad to optional
|
||||||
|
# change the inbound configuration, but not for
|
||||||
|
# migrated channel because we guess that the inbound configuration
|
||||||
|
# is already correct for them.
|
||||||
if @channel_id
|
if @channel_id
|
||||||
item = App.Channel.find(@channel_id)
|
item = App.Channel.find(@channel_id)
|
||||||
if item && item.options && item.options.backup_imap_classic is undefined
|
if item && item.area == 'Microsoft365::Account' && item.options && item.options.backup_imap_classic is undefined
|
||||||
@editInbound(undefined, @channel_id, true)
|
@editInbound(undefined, @channel_id, true)
|
||||||
@channel_id = undefined
|
@channel_id = undefined
|
||||||
|
|
||||||
|
@ -136,7 +145,7 @@ class ChannelAccountOverview extends App.ControllerSubContent
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
id = $(e.target).closest('.action').data('id')
|
id = $(e.target).closest('.action').data('id')
|
||||||
new App.ControllerConfirm(
|
new App.ControllerConfirm(
|
||||||
message: 'Sure?'
|
message: __('Are you sure?')
|
||||||
callback: =>
|
callback: =>
|
||||||
@ajax(
|
@ajax(
|
||||||
id: 'microsoft365_delete'
|
id: 'microsoft365_delete'
|
||||||
|
@ -206,11 +215,11 @@ class ChannelAccountOverview extends App.ControllerSubContent
|
||||||
@load()
|
@load()
|
||||||
@notify
|
@notify
|
||||||
type: 'success'
|
type: 'success'
|
||||||
msg: 'Rollback of channel migration succeeded!'
|
msg: __('Rollback of channel migration succeeded!')
|
||||||
error: (data) =>
|
error: (data) =>
|
||||||
@notify
|
@notify
|
||||||
type: 'error'
|
type: 'error'
|
||||||
msg: 'Failed to rollback migration of the channel!'
|
msg: __('Failed to roll back the migration of the channel!')
|
||||||
)
|
)
|
||||||
|
|
||||||
groupChange: (e) =>
|
groupChange: (e) =>
|
||||||
|
@ -228,7 +237,7 @@ class ChannelAccountOverview extends App.ControllerSubContent
|
||||||
channel_id = $(e.target).closest('.action').data('id')
|
channel_id = $(e.target).closest('.action').data('id')
|
||||||
new App.ControllerGenericNew(
|
new App.ControllerGenericNew(
|
||||||
pageData:
|
pageData:
|
||||||
object: 'Email Address'
|
object: __('Email Address')
|
||||||
genericObject: 'EmailAddress'
|
genericObject: 'EmailAddress'
|
||||||
container: @el.closest('.content')
|
container: @el.closest('.content')
|
||||||
item:
|
item:
|
||||||
|
@ -241,7 +250,7 @@ class ChannelAccountOverview extends App.ControllerSubContent
|
||||||
id = $(e.target).closest('li').data('id')
|
id = $(e.target).closest('li').data('id')
|
||||||
new App.ControllerGenericEdit(
|
new App.ControllerGenericEdit(
|
||||||
pageData:
|
pageData:
|
||||||
object: 'Email Address'
|
object: __('Email Address')
|
||||||
genericObject: 'EmailAddress'
|
genericObject: 'EmailAddress'
|
||||||
container: @el.closest('.content')
|
container: @el.closest('.content')
|
||||||
id: id
|
id: id
|
||||||
|
@ -262,12 +271,12 @@ class ChannelInboundEdit extends App.ControllerModal
|
||||||
buttonClose: true
|
buttonClose: true
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
buttonSubmit: true
|
buttonSubmit: true
|
||||||
head: 'Channel'
|
head: __('Channel')
|
||||||
|
|
||||||
content: =>
|
content: =>
|
||||||
configureAttributesBase = [
|
configureAttributesBase = [
|
||||||
{ name: 'options::folder', display: 'Folder', tag: 'input', type: 'text', limit: 120, null: true, autocapitalize: false },
|
{ name: 'options::folder', display: __('Folder'), tag: 'input', type: 'text', limit: 120, null: true, autocapitalize: false },
|
||||||
{ name: 'options::keep_on_server', display: 'Keep messages on server', tag: 'boolean', null: true, options: { true: 'yes', false: 'no' }, translate: true, default: false },
|
{ name: 'options::keep_on_server', display: __('Keep messages on server'), tag: 'boolean', null: true, options: { true: 'yes', false: 'no' }, translate: true, default: false },
|
||||||
]
|
]
|
||||||
@form = new App.ControllerForm(
|
@form = new App.ControllerForm(
|
||||||
model:
|
model:
|
||||||
|
@ -314,7 +323,7 @@ class ChannelInboundEdit extends App.ControllerModal
|
||||||
details = xhr.responseJSON || {}
|
details = xhr.responseJSON || {}
|
||||||
@notify
|
@notify
|
||||||
type: 'error'
|
type: 'error'
|
||||||
msg: App.i18n.translateContent(details.error_human || details.error || 'Unable to save changes.')
|
msg: App.i18n.translateContent(details.error_human || details.error || __('The changes could not be saved.'))
|
||||||
timeout: 6000
|
timeout: 6000
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -322,11 +331,11 @@ class ChannelGroupEdit extends App.ControllerModal
|
||||||
buttonClose: true
|
buttonClose: true
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
buttonSubmit: true
|
buttonSubmit: true
|
||||||
head: 'Channel'
|
head: __('Channel')
|
||||||
|
|
||||||
content: =>
|
content: =>
|
||||||
configureAttributesBase = [
|
configureAttributesBase = [
|
||||||
{ name: 'group_id', display: 'Destination Group', tag: 'select', null: false, relation: 'Group', nulloption: true, filter: { active: true } },
|
{ name: 'group_id', display: __('Destination Group'), tag: 'select', null: false, relation: 'Group', nulloption: true, filter: { active: true } },
|
||||||
]
|
]
|
||||||
@form = new App.ControllerForm(
|
@form = new App.ControllerForm(
|
||||||
model:
|
model:
|
||||||
|
@ -366,11 +375,11 @@ class ChannelGroupEdit extends App.ControllerModal
|
||||||
error: (xhr) =>
|
error: (xhr) =>
|
||||||
data = JSON.parse(xhr.responseText)
|
data = JSON.parse(xhr.responseText)
|
||||||
@formEnable(e)
|
@formEnable(e)
|
||||||
@el.find('.alert').removeClass('hidden').text(data.error || 'Unable to save changes.')
|
@el.find('.alert').removeClass('hidden').text(data.error || __('The changes could not be saved.'))
|
||||||
)
|
)
|
||||||
|
|
||||||
class AppConfig extends App.ControllerModal
|
class AppConfig extends App.ControllerModal
|
||||||
head: 'Connect Microsoft 365 App'
|
head: __('Connect Microsoft 365 App')
|
||||||
shown: true
|
shown: true
|
||||||
button: 'Connect'
|
button: 'Connect'
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
|
@ -412,11 +421,11 @@ class AppConfig extends App.ControllerModal
|
||||||
@isChanged = true
|
@isChanged = true
|
||||||
@close()
|
@close()
|
||||||
fail: =>
|
fail: =>
|
||||||
@el.find('.alert').removeClass('hidden').text('Unable to create entry.')
|
@el.find('.alert').removeClass('hidden').text(__('The entry could not be created.'))
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
@formEnable(e)
|
@formEnable(e)
|
||||||
@el.find('.alert').removeClass('hidden').text(data.error || 'Unable to verify App.')
|
@el.find('.alert').removeClass('hidden').text(data.error || __('App could not be verified.'))
|
||||||
)
|
)
|
||||||
|
|
||||||
App.Config.set('microsoft365', { prio: 5000, name: 'Microsoft 365', parent: '#channels', target: '#channels/microsoft365', controller: App.ChannelMicrosoft365, permission: ['admin.channel_microsoft365'] }, 'NavBarAdmin')
|
App.Config.set('microsoft365', { prio: 5000, name: __('Microsoft 365'), parent: '#channels', target: '#channels/microsoft365', controller: App.ChannelMicrosoft365, permission: ['admin.channel_microsoft365'] }, 'NavBarAdmin')
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
class ChannelSms extends App.ControllerTabs
|
class ChannelSms extends App.ControllerTabs
|
||||||
requiredPermission: 'admin.channel_sms'
|
requiredPermission: 'admin.channel_sms'
|
||||||
header: 'SMS'
|
header: __('SMS')
|
||||||
constructor: ->
|
constructor: ->
|
||||||
super
|
super
|
||||||
|
|
||||||
@title 'SMS', true
|
@title __('SMS'), true
|
||||||
@tabs = [
|
@tabs = [
|
||||||
{
|
{
|
||||||
name: 'Accounts',
|
name: __('Accounts'),
|
||||||
target: 'c-account',
|
target: 'c-account',
|
||||||
controller: ChannelSmsAccountOverview,
|
controller: ChannelSmsAccountOverview,
|
||||||
},
|
},
|
||||||
|
@ -136,11 +136,11 @@ class ChannelSmsAccountOverview extends App.Controller
|
||||||
)
|
)
|
||||||
|
|
||||||
class ChannelSmsAccount extends App.ControllerModal
|
class ChannelSmsAccount extends App.ControllerModal
|
||||||
head: 'SMS Account'
|
head: __('SMS Account')
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
centerButtons: [
|
centerButtons: [
|
||||||
{
|
{
|
||||||
text: 'Test'
|
text: __('Test')
|
||||||
className: 'js-test'
|
className: 'js-test'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -164,13 +164,13 @@ class ChannelSmsAccount extends App.ControllerModal
|
||||||
el: el.find('.js-channelAdapterSelector')
|
el: el.find('.js-channelAdapterSelector')
|
||||||
model:
|
model:
|
||||||
configure_attributes: [
|
configure_attributes: [
|
||||||
{ name: 'options::adapter', display: 'Provider', tag: 'select', null: false, options: options, nulloption: true }
|
{ name: 'options::adapter', display: __('Provider'), tag: 'select', null: false, options: options, nulloption: true }
|
||||||
]
|
]
|
||||||
className: ''
|
className: ''
|
||||||
params: @channel
|
params: @channel
|
||||||
)
|
)
|
||||||
@renderAdapterOptions(@channel.options?.adapter, el)
|
@renderAdapterOptions(@channel.options?.adapter, el)
|
||||||
el.find('[name="options::adapter"]').bind('change', (e) =>
|
el.find('[name="options::adapter"]').on('change', (e) =>
|
||||||
@renderAdapterOptions(e.target.value, el)
|
@renderAdapterOptions(e.target.value, el)
|
||||||
)
|
)
|
||||||
el
|
el
|
||||||
|
@ -198,7 +198,7 @@ class ChannelSmsAccount extends App.ControllerModal
|
||||||
el: el.find('.js-channelWebhook')
|
el: el.find('.js-channelWebhook')
|
||||||
model:
|
model:
|
||||||
configure_attributes: [
|
configure_attributes: [
|
||||||
{ name: 'options::webhook', display: 'Webhook', tag: 'input', type: 'text', limit: 200, null: false, default: webhook, disabled: true },
|
{ name: 'options::webhook', display: __('Webhook'), tag: 'input', type: 'text', limit: 200, null: false, default: webhook, disabled: true },
|
||||||
]
|
]
|
||||||
className: ''
|
className: ''
|
||||||
params: @channel
|
params: @channel
|
||||||
|
@ -262,7 +262,7 @@ class ChannelSmsAccount extends App.ControllerModal
|
||||||
fail: (settings, details) ->
|
fail: (settings, details) ->
|
||||||
ui.log 'errors', details
|
ui.log 'errors', details
|
||||||
ui.formEnable(e)
|
ui.formEnable(e)
|
||||||
ui.showAlert(details.error_human || details.error || 'Unable to update object!')
|
ui.showAlert(details.error_human || details.error || __('The object could not be updated.'))
|
||||||
)
|
)
|
||||||
|
|
||||||
onTest: (e) ->
|
onTest: (e) ->
|
||||||
|
@ -273,11 +273,11 @@ class ChannelSmsAccount extends App.ControllerModal
|
||||||
)
|
)
|
||||||
|
|
||||||
class ChannelSmsNotification extends App.ControllerModal
|
class ChannelSmsNotification extends App.ControllerModal
|
||||||
head: 'SMS Notification'
|
head: __('SMS Notification')
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
centerButtons: [
|
centerButtons: [
|
||||||
{
|
{
|
||||||
text: 'Test'
|
text: __('Test')
|
||||||
className: 'js-test'
|
className: 'js-test'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -303,13 +303,13 @@ class ChannelSmsNotification extends App.ControllerModal
|
||||||
el: el.find('.js-channelAdapterSelector')
|
el: el.find('.js-channelAdapterSelector')
|
||||||
model:
|
model:
|
||||||
configure_attributes: [
|
configure_attributes: [
|
||||||
{ name: 'options::adapter', display: 'Provider', tag: 'select', null: false, options: options, nulloption: true }
|
{ name: 'options::adapter', display: __('Provider'), tag: 'select', null: false, options: options, nulloption: true }
|
||||||
]
|
]
|
||||||
className: ''
|
className: ''
|
||||||
params: @channel
|
params: @channel
|
||||||
)
|
)
|
||||||
@renderAdapterOptions(@channel.options?.adapter, el)
|
@renderAdapterOptions(@channel.options?.adapter, el)
|
||||||
el.find('[name="options::adapter"]').bind('change', (e) =>
|
el.find('[name="options::adapter"]').on('change', (e) =>
|
||||||
@renderAdapterOptions(e.target.value, el)
|
@renderAdapterOptions(e.target.value, el)
|
||||||
)
|
)
|
||||||
el
|
el
|
||||||
|
@ -376,7 +376,7 @@ class ChannelSmsNotification extends App.ControllerModal
|
||||||
fail: (settings, details) ->
|
fail: (settings, details) ->
|
||||||
ui.log 'errors', details
|
ui.log 'errors', details
|
||||||
ui.formEnable(e)
|
ui.formEnable(e)
|
||||||
ui.showAlert(details.error_human || details.error || 'Unable to update object!')
|
ui.showAlert(details.error_human || details.error || __('The object could not be updated.'))
|
||||||
)
|
)
|
||||||
|
|
||||||
onTest: (e) ->
|
onTest: (e) ->
|
||||||
|
@ -387,15 +387,15 @@ class ChannelSmsNotification extends App.ControllerModal
|
||||||
)
|
)
|
||||||
|
|
||||||
class TestModal extends App.ControllerModal
|
class TestModal extends App.ControllerModal
|
||||||
head: 'Test SMS provider'
|
head: __('Test SMS provider')
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
|
|
||||||
content: ->
|
content: ->
|
||||||
form = new App.ControllerForm(
|
form = new App.ControllerForm(
|
||||||
model:
|
model:
|
||||||
configure_attributes: [
|
configure_attributes: [
|
||||||
{ name: 'recipient', display: 'Recipient', tag: 'input', null: false }
|
{ name: 'recipient', display: __('Recipient'), tag: 'input', null: false }
|
||||||
{ name: 'message', display: 'Message', tag: 'input', null: false, default: 'Test message from Zammad' }
|
{ name: 'message', display: __('Message'), tag: 'input', null: false, default: __('Test message from Zammad') }
|
||||||
]
|
]
|
||||||
className: ''
|
className: ''
|
||||||
)
|
)
|
||||||
|
@ -435,8 +435,8 @@ class TestModal extends App.ControllerModal
|
||||||
data = JSON.parse(xhr.responseText)
|
data = JSON.parse(xhr.responseText)
|
||||||
@formEnable(@el)
|
@formEnable(@el)
|
||||||
@el.find('.js-danger')
|
@el.find('.js-danger')
|
||||||
.text(@T(data.error || 'Unable to perform test'))
|
.text(@T(data.error || __('SMS test failed.')))
|
||||||
.removeClass('hide')
|
.removeClass('hide')
|
||||||
)
|
)
|
||||||
|
|
||||||
App.Config.set('SMS', { prio: 3100, name: 'SMS', parent: '#channels', target: '#channels/sms', controller: ChannelSms, permission: ['admin.channel_sms'] }, 'NavBarAdmin')
|
App.Config.set('SMS', { prio: 3100, name: __('SMS'), parent: '#channels', target: '#channels/sms', controller: ChannelSms, permission: ['admin.channel_sms'] }, 'NavBarAdmin')
|
||||||
|
|
|
@ -63,7 +63,7 @@ class ChannelTelegram extends App.ControllerSubContent
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
id = $(e.target).closest('.action').data('id')
|
id = $(e.target).closest('.action').data('id')
|
||||||
new App.ControllerConfirm(
|
new App.ControllerConfirm(
|
||||||
message: 'Sure?'
|
message: __('Are you sure?')
|
||||||
callback: =>
|
callback: =>
|
||||||
@ajax(
|
@ajax(
|
||||||
id: 'telegram_delete'
|
id: 'telegram_delete'
|
||||||
|
@ -104,7 +104,7 @@ class ChannelTelegram extends App.ControllerSubContent
|
||||||
)
|
)
|
||||||
|
|
||||||
class BotAdd extends App.ControllerModal
|
class BotAdd extends App.ControllerModal
|
||||||
head: 'Add Telegram Bot'
|
head: __('Add Telegram Bot')
|
||||||
shown: true
|
shown: true
|
||||||
button: 'Add'
|
button: 'Add'
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
|
@ -149,12 +149,12 @@ class BotAdd extends App.ControllerModal
|
||||||
error: (xhr) =>
|
error: (xhr) =>
|
||||||
data = JSON.parse(xhr.responseText)
|
data = JSON.parse(xhr.responseText)
|
||||||
@formEnable(e)
|
@formEnable(e)
|
||||||
error_message = App.i18n.translateContent(data.error || 'Unable to save Bot.')
|
error_message = App.i18n.translateContent(data.error || __('The Telegram bot could not be saved.'))
|
||||||
@el.find('.alert').removeClass('hidden').text(error_message)
|
@el.find('.alert').removeClass('hidden').text(error_message)
|
||||||
)
|
)
|
||||||
|
|
||||||
class BotEdit extends App.ControllerModal
|
class BotEdit extends App.ControllerModal
|
||||||
head: 'Telegram Account'
|
head: __('Telegram Account')
|
||||||
shown: true
|
shown: true
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
|
|
||||||
|
@ -197,8 +197,8 @@ class BotEdit extends App.ControllerModal
|
||||||
error: (xhr) =>
|
error: (xhr) =>
|
||||||
data = JSON.parse(xhr.responseText)
|
data = JSON.parse(xhr.responseText)
|
||||||
@formEnable(e)
|
@formEnable(e)
|
||||||
error_message = App.i18n.translateContent(data.error || 'Unable to save changes.')
|
error_message = App.i18n.translateContent(data.error || __('The changes could not be saved.'))
|
||||||
@el.find('.alert').removeClass('hidden').text(error_message)
|
@el.find('.alert').removeClass('hidden').text(error_message)
|
||||||
)
|
)
|
||||||
|
|
||||||
App.Config.set('Telegram', { prio: 5100, name: 'Telegram', parent: '#channels', target: '#channels/telegram', controller: ChannelTelegram, permission: ['admin.channel_telegram'] }, 'NavBarAdmin')
|
App.Config.set('Telegram', { prio: 5100, name: __('Telegram'), parent: '#channels', target: '#channels/telegram', controller: ChannelTelegram, permission: ['admin.channel_telegram'] }, 'NavBarAdmin')
|
||||||
|
|
|
@ -102,7 +102,7 @@ class ChannelTwitter extends App.ControllerSubContent
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
id = $(e.target).closest('.action').data('id')
|
id = $(e.target).closest('.action').data('id')
|
||||||
new App.ControllerConfirm(
|
new App.ControllerConfirm(
|
||||||
message: 'Sure?'
|
message: __('Are you sure?')
|
||||||
callback: =>
|
callback: =>
|
||||||
@ajax(
|
@ajax(
|
||||||
id: 'twitter_delete'
|
id: 'twitter_delete'
|
||||||
|
@ -143,7 +143,7 @@ class ChannelTwitter extends App.ControllerSubContent
|
||||||
)
|
)
|
||||||
|
|
||||||
class AppConfig extends App.ControllerModal
|
class AppConfig extends App.ControllerModal
|
||||||
head: 'Connect Twitter App'
|
head: __('Connect Twitter App')
|
||||||
shown: true
|
shown: true
|
||||||
button: 'Connect'
|
button: 'Connect'
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
|
@ -185,15 +185,15 @@ class AppConfig extends App.ControllerModal
|
||||||
@isChanged = true
|
@isChanged = true
|
||||||
@close()
|
@close()
|
||||||
fail: =>
|
fail: =>
|
||||||
@el.find('.alert').removeClass('hidden').text('Unable to create entry.')
|
@el.find('.alert').removeClass('hidden').text(__('The entry could not be created.'))
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
@formEnable(e)
|
@formEnable(e)
|
||||||
@el.find('.alert').removeClass('hidden').text(data.error || 'Unable to verify App.')
|
@el.find('.alert').removeClass('hidden').text(data.error || __('App could not be verified.'))
|
||||||
)
|
)
|
||||||
|
|
||||||
class AccountEdit extends App.ControllerModal
|
class AccountEdit extends App.ControllerModal
|
||||||
head: 'Twitter Account'
|
head: __('Twitter Account')
|
||||||
shown: true
|
shown: true
|
||||||
buttonCancel: true
|
buttonCancel: true
|
||||||
|
|
||||||
|
@ -219,7 +219,7 @@ class AccountEdit extends App.ControllerModal
|
||||||
term: ''
|
term: ''
|
||||||
group_id: ''
|
group_id: ''
|
||||||
renderSearchTerms()
|
renderSearchTerms()
|
||||||
content.find('.js-searchTermList [name="search::term"]').last().focus()
|
content.find('.js-searchTermList [name="search::term"]').last().trigger('focus')
|
||||||
|
|
||||||
removeSearchTerm = (event) =>
|
removeSearchTerm = (event) =>
|
||||||
index = $(event.currentTarget).attr('data-index')
|
index = $(event.currentTarget).attr('data-index')
|
||||||
|
@ -248,7 +248,7 @@ class AccountEdit extends App.ControllerModal
|
||||||
|
|
||||||
renderSearchTerms()
|
renderSearchTerms()
|
||||||
|
|
||||||
content.find('.js-searchTermAdd').click(addSearchTerm)
|
content.find('.js-searchTermAdd').on('click', addSearchTerm)
|
||||||
content.find('.js-searchTermList').on('click', '.js-searchTermRemove', removeSearchTerm)
|
content.find('.js-searchTermList').on('click', '.js-searchTermRemove', removeSearchTerm)
|
||||||
|
|
||||||
content.find('.js-mentionsGroup').replaceWith createGroupSelection(@channel.options.sync.mentions.group_id, 'mentions')
|
content.find('.js-mentionsGroup').replaceWith createGroupSelection(@channel.options.sync.mentions.group_id, 'mentions')
|
||||||
|
@ -296,7 +296,7 @@ class AccountEdit extends App.ControllerModal
|
||||||
error: (xhr) =>
|
error: (xhr) =>
|
||||||
data = JSON.parse(xhr.responseText)
|
data = JSON.parse(xhr.responseText)
|
||||||
@formEnable(e)
|
@formEnable(e)
|
||||||
@el.find('.alert').removeClass('hidden').text(data.error || 'Unable to save changes.')
|
@el.find('.alert').removeClass('hidden').text(data.error || __('The changes could not be saved.'))
|
||||||
)
|
)
|
||||||
|
|
||||||
App.Config.set('Twitter', { prio: 5000, name: 'Twitter', parent: '#channels', target: '#channels/twitter', controller: ChannelTwitter, permission: ['admin.channel_twitter'] }, 'NavBarAdmin')
|
App.Config.set('Twitter', { prio: 5000, name: __('Twitter'), parent: '#channels', target: '#channels/twitter', controller: ChannelTwitter, permission: ['admin.channel_twitter'] }, 'NavBarAdmin')
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
class ChannelWeb extends App.ControllerTabs
|
class ChannelWeb extends App.ControllerTabs
|
||||||
requiredPermission: 'admin.channel_web'
|
requiredPermission: 'admin.channel_web'
|
||||||
header: 'Web'
|
header: __('Web')
|
||||||
constructor: ->
|
constructor: ->
|
||||||
super
|
super
|
||||||
|
|
||||||
@title 'Web', true
|
@title __('Web'), true
|
||||||
|
|
||||||
@tabs = [
|
@tabs = [
|
||||||
{
|
{
|
||||||
name: 'Settings',
|
name: __('Settings'),
|
||||||
target: 'w-setting',
|
target: 'w-setting',
|
||||||
controller: App.SettingsArea, params: { area: 'CustomerWeb::Base' },
|
controller: App.SettingsArea, params: { area: 'CustomerWeb::Base' },
|
||||||
},
|
},
|
||||||
|
@ -16,4 +16,4 @@ class ChannelWeb extends App.ControllerTabs
|
||||||
|
|
||||||
@render()
|
@render()
|
||||||
|
|
||||||
App.Config.set('Web', { prio: 1000, name: 'Web', parent: '#channels', target: '#channels/web', controller: ChannelWeb, permission: ['admin.channel_web'] }, 'NavBarAdmin')
|
App.Config.set('Web', { prio: 1000, name: __('Web'), parent: '#channels', target: '#channels/web', controller: ChannelWeb, permission: ['admin.channel_web'] }, 'NavBarAdmin')
|
||||||
|
|
|
@ -38,7 +38,7 @@ class App.DashboardFirstSteps extends App.Controller
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
new App.InviteUser(
|
new App.InviteUser(
|
||||||
#container: @el.closest('.content')
|
#container: @el.closest('.content')
|
||||||
head: 'Invite Colleagues'
|
head: __('Invite Colleagues')
|
||||||
screen: 'invite_agent'
|
screen: 'invite_agent'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ class App.DashboardFirstSteps extends App.Controller
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
new App.InviteUser(
|
new App.InviteUser(
|
||||||
#container: @el.closest('.content')
|
#container: @el.closest('.content')
|
||||||
head: 'Invite Customer'
|
head: __('Invite Customer')
|
||||||
screen: 'invite_customer'
|
screen: 'invite_customer'
|
||||||
signup: true
|
signup: true
|
||||||
)
|
)
|
||||||
|
@ -82,7 +82,7 @@ class App.DashboardFirstSteps extends App.Controller
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
|
|
||||||
modal = new App.ControllerModal(
|
modal = new App.ControllerModal(
|
||||||
head: 'Test Ticket'
|
head: __('Test Ticket')
|
||||||
#container: @el.parents('.content')
|
#container: @el.parents('.content')
|
||||||
content: @testTicketLoading
|
content: @testTicketLoading
|
||||||
shown: true
|
shown: true
|
||||||
|
|
|
@ -2,22 +2,22 @@ class App.FirstStepsClues extends App.Controller
|
||||||
clues: [
|
clues: [
|
||||||
{
|
{
|
||||||
container: '.js-dashboardMenuItem'
|
container: '.js-dashboardMenuItem'
|
||||||
headline: 'Dashboard'
|
headline: __('Dashboard')
|
||||||
text: 'Here you see a quick overview of your and other agents\' performance.'
|
text: __('Here you see a quick overview of your and other agents\' performance.')
|
||||||
actions: [
|
actions: [
|
||||||
'hover'
|
'hover'
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
container: '.search-holder'
|
container: '.search-holder'
|
||||||
headline: 'Search'
|
headline: __('Search')
|
||||||
text: 'Here you can search for tickets, customers and organizations. Use the wildcard §*§ to find everything. E. g. §smi*§ or §rosent*l§. You also can use ||double quotes|| for searching phrases §"some phrase"§.'
|
text: __('Here you can search for tickets, customers, and organizations. Use the asterisk §*§ to find anything, e.g. §smi*§ or §rosent*l§. You also can use ||quotation marks|| for searching phrases: §"some phrase"§.')
|
||||||
actions: []
|
actions: []
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
container: '.user-menu .add'
|
container: '.user-menu .add'
|
||||||
headline: 'Create'
|
headline: __('Create')
|
||||||
text: 'Here you can create new tickets. Also if you have the permissions you can create new customers and organizations.'
|
text: __('Here you can create new tickets. Also, if you have the permission, you can create new customers and organizations.')
|
||||||
actions: [
|
actions: [
|
||||||
'hover .navigation',
|
'hover .navigation',
|
||||||
'hover .user-menu .add'
|
'hover .user-menu .add'
|
||||||
|
@ -25,8 +25,8 @@ class App.FirstStepsClues extends App.Controller
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
container: '.user-menu .user .dropdown-menu'
|
container: '.user-menu .user .dropdown-menu'
|
||||||
headline: 'Personal Settings'
|
headline: __('Personal Settings')
|
||||||
text: 'Here you can sign out, change the frontend language and see your last viewed items.'
|
text: __('Here you can sign out, change the frontend language, and see your last viewed items.')
|
||||||
actions: [
|
actions: [
|
||||||
'hover .navigation',
|
'hover .navigation',
|
||||||
'click .user-menu .user .js-action',
|
'click .user-menu .user .js-action',
|
||||||
|
@ -35,8 +35,8 @@ class App.FirstStepsClues extends App.Controller
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
container: '.js-overviewsMenuItem'
|
container: '.js-overviewsMenuItem'
|
||||||
headline: 'Overviews'
|
headline: __('Overviews')
|
||||||
text: 'Here you find your ticket overviews for open, assigned and escalated tickets.'
|
text: __('Here you find your ticket overviews for open, assigned, and escalated tickets.')
|
||||||
actions: [
|
actions: [
|
||||||
'hover'
|
'hover'
|
||||||
]
|
]
|
||||||
|
|
|
@ -24,7 +24,7 @@ class Stats extends App.ControllerDashboardStatsBase
|
||||||
for id, channel of data.StatsTicketChannelDistribution.channels
|
for id, channel of data.StatsTicketChannelDistribution.channels
|
||||||
channel.overal_percentage = Math.round((channel.inbound + channel.outbound) / totalTickets * 100) || 0
|
channel.overal_percentage = Math.round((channel.inbound + channel.outbound) / totalTickets * 100) || 0
|
||||||
|
|
||||||
data.StatsTicketChannelDistribution.description = 'How many of your tickets are coming from email, phone, Twitter, or Facebook? (Shows percentages for both inbound and outbound tickets.)'
|
data.StatsTicketChannelDistribution.description = __('How many of your tickets are coming from email, phone, Twitter, or Facebook? (Shows percentages for both inbound and outbound tickets.)')
|
||||||
|
|
||||||
content = App.view('dashboard/stats/ticket_channel_distribution')(data)
|
content = App.view('dashboard/stats/ticket_channel_distribution')(data)
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ class Stats extends App.ControllerDashboardStatsBase
|
||||||
own: 0
|
own: 0
|
||||||
total: 0
|
total: 0
|
||||||
|
|
||||||
data.StatsTicketEscalation.description = 'How many escalated tickets do you have open? (Mr. Bubbles gets grumpy if you have too many…)'
|
data.StatsTicketEscalation.description = __('How many escalated tickets do you have open? (Mr. Bubbles gets grumpy if you have too many…)')
|
||||||
|
|
||||||
content = App.view('dashboard/stats/ticket_escalation')(data)
|
content = App.view('dashboard/stats/ticket_escalation')(data)
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ class Stats extends App.ControllerDashboardStatsBase
|
||||||
in_process: 0
|
in_process: 0
|
||||||
average_per_agent: 0
|
average_per_agent: 0
|
||||||
|
|
||||||
data.StatsTicketInProcess.description = 'What percentage of your tickets have you responded to, updated, or modified in some way today?'
|
data.StatsTicketInProcess.description = __('What percentage of your tickets have you responded to, updated, or modified in some way today?')
|
||||||
|
|
||||||
content = App.view('dashboard/stats/ticket_in_process')(data)
|
content = App.view('dashboard/stats/ticket_in_process')(data)
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ class Stats extends App.ControllerDashboardStatsBase
|
||||||
total: 0
|
total: 0
|
||||||
average_per_agent: 0
|
average_per_agent: 0
|
||||||
|
|
||||||
data.StatsTicketLoadMeasure.description = 'Out of all open tickets (company-wide), how many are assigned to you?'
|
data.StatsTicketLoadMeasure.description = __('Out of all open tickets (company-wide), how many are assigned to you?')
|
||||||
|
|
||||||
content = App.view('dashboard/stats/ticket_load_measure')(data)
|
content = App.view('dashboard/stats/ticket_load_measure')(data)
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ class Stats extends App.ControllerDashboardStatsBase
|
||||||
percent: 0
|
percent: 0
|
||||||
average_per_agent: 0
|
average_per_agent: 0
|
||||||
|
|
||||||
data.StatsTicketReopen.description = 'How many of your tickets have been re-opened after being marked “closed”?'
|
data.StatsTicketReopen.description = __('How many of your tickets have been re-opened after being marked “closed”?')
|
||||||
|
|
||||||
content = App.view('dashboard/stats/ticket_reopen')(data)
|
content = App.view('dashboard/stats/ticket_reopen')(data)
|
||||||
if @$('.ticket_reopen').length > 0
|
if @$('.ticket_reopen').length > 0
|
||||||
|
|
|
@ -7,7 +7,7 @@ class Stats extends App.ControllerDashboardStatsBase
|
||||||
state: 'supergood'
|
state: 'supergood'
|
||||||
average_per_agent: 0
|
average_per_agent: 0
|
||||||
|
|
||||||
data.StatsTicketWaitingTime.description = 'How long has each customer had to wait, on average, to get a response from you today?'
|
data.StatsTicketWaitingTime.description = __('How long did each customer have to wait, on average, to get a response from you today?')
|
||||||
|
|
||||||
content = App.view('dashboard/stats/ticket_waiting_time')(data)
|
content = App.view('dashboard/stats/ticket_waiting_time')(data)
|
||||||
if @$('.ticket_waiting_time').length > 0
|
if @$('.ticket_waiting_time').length > 0
|
||||||
|
|
|
@ -10,9 +10,9 @@ App.Config.set('User', {
|
||||||
class: 'user'
|
class: 'user'
|
||||||
}, 'NavBarRight' )
|
}, 'NavBarRight' )
|
||||||
|
|
||||||
App.Config.set('Admin', { prio: 9000, parent: '', name: 'Admin', translate: true, target: '#manage', icon: 'cog', permission: ['admin.*'] }, 'NavBarRight')
|
App.Config.set('Admin', { prio: 9000, parent: '', name: __('Admin'), translate: true, target: '#manage', icon: 'cog', permission: ['admin.*'] }, 'NavBarRight')
|
||||||
App.Config.set('New', { prio: 20000, parent: '', name: 'New', translate: true, target: '#new', class: 'add', icon: 'plus' }, 'NavBarRight')
|
App.Config.set('New', { prio: 20000, parent: '', name: __('New'), translate: true, target: '#new', class: 'add', icon: 'plus' }, 'NavBarRight')
|
||||||
App.Config.set('Misc', { prio: 90000, parent: '', name: 'Tools', translate: true, target: '#tools', child: true, class: 'tools' }, 'NavBar')
|
App.Config.set('Misc', { prio: 90000, parent: '', name: __('Tools'), translate: true, target: '#tools', child: true, class: 'tools' }, 'NavBar')
|
||||||
# only for testing
|
# only for testing
|
||||||
#App.Config.set('Misc1', { prio: 1600, parent: '#tools', name: 'Test 1', target: '#test1', permission: ['admin'] }, 'NavBar')
|
#App.Config.set('Misc1', { prio: 1600, parent: '#tools', name: __('Test 1'), target: '#test1', permission: ['admin'] }, 'NavBar')
|
||||||
#App.Config.set('Misc2', { prio: 1700, parent: '#tools', name: 'Test 2', target: '#test2', permission: ['admin'] }, 'NavBar')
|
#App.Config.set('Misc2', { prio: 1700, parent: '#tools', name: __('Test 2'), target: '#test2', permission: ['admin'] }, 'NavBar')
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
class CheckMk extends App.ControllerIntegrationBase
|
class CheckMk extends App.ControllerIntegrationBase
|
||||||
featureIntegration: 'check_mk_integration'
|
featureIntegration: 'check_mk_integration'
|
||||||
featureName: 'Checkmk'
|
featureName: __('Checkmk')
|
||||||
featureConfig: 'check_mk_config'
|
featureConfig: 'check_mk_config'
|
||||||
description: [
|
description: [
|
||||||
['This service receives http requests or emails from %s and creates tickets with host and service.', 'Checkmk']
|
[__('This service receives HTTP requests or emails from %s and creates tickets with host and service.'), 'Checkmk']
|
||||||
['If the host and service has recovered, the ticket can be closed automatically.']
|
[__('If the host and service have recovered, the ticket can be closed automatically.')]
|
||||||
]
|
]
|
||||||
|
|
||||||
render: =>
|
render: =>
|
||||||
|
@ -52,9 +52,9 @@ class Form extends App.Controller
|
||||||
App.Config.set(
|
App.Config.set(
|
||||||
'IntegrationCheckMk'
|
'IntegrationCheckMk'
|
||||||
{
|
{
|
||||||
name: 'Checkmk'
|
name: __('Checkmk')
|
||||||
target: '#system/integration/check_mk'
|
target: '#system/integration/check_mk'
|
||||||
description: 'An open source monitoring tool.'
|
description: __('An open-source monitoring tool.')
|
||||||
controller: CheckMk
|
controller: CheckMk
|
||||||
state: State
|
state: State
|
||||||
permission: ['admin.integration.check_mk']
|
permission: ['admin.integration.check_mk']
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
class Clearbit extends App.ControllerIntegrationBase
|
class Clearbit extends App.ControllerIntegrationBase
|
||||||
featureIntegration: 'clearbit_integration'
|
featureIntegration: 'clearbit_integration'
|
||||||
featureName: 'Clearbit'
|
featureName: __('Clearbit')
|
||||||
featureConfig: 'clearbit_config'
|
featureConfig: 'clearbit_config'
|
||||||
description: [
|
description: [
|
||||||
['Automatically enrich your customers and organizations with fresh, up-to-date intel. Map data directly to object fields.
|
[__('Automatically enrich your customers and organizations with fresh, up-to-date intel. Map data directly to object fields.')]
|
||||||
']
|
|
||||||
]
|
]
|
||||||
|
|
||||||
render: =>
|
render: =>
|
||||||
|
@ -62,9 +61,9 @@ class Form extends App.Controller
|
||||||
if !@config
|
if !@config
|
||||||
@config = @currentConfig()
|
@config = @currentConfig()
|
||||||
settings = [
|
settings = [
|
||||||
{ name: 'api_key', display: 'API Key', tag: 'input', type: 'text', limit: 100, null: false, placeholder: '...', note: 'Your api key.' },
|
{ name: 'api_key', display: __('API Key'), tag: 'input', type: 'text', limit: 100, null: false, placeholder: '...', note: __('Your API key.') },
|
||||||
{ name: 'organization_autocreate', display: 'Auto create', tag: 'boolean', type: 'boolean', null: false, note: 'Create organizations automatically if record has one.' },
|
{ name: 'organization_autocreate', display: __('Auto create'), tag: 'boolean', type: 'boolean', null: false, note: __('Create organizations automatically if record has one.') },
|
||||||
{ name: 'organization_shared', display: 'Shared', tag: 'boolean', type: 'boolean', null: false, note: 'New organizations are shared.' },
|
{ name: 'organization_shared', display: __('Shared'), tag: 'boolean', type: 'boolean', null: false, note: __('New organizations are shared.') },
|
||||||
]
|
]
|
||||||
|
|
||||||
@html App.view('integration/clearbit')(
|
@html App.view('integration/clearbit')(
|
||||||
|
@ -152,9 +151,9 @@ class State
|
||||||
App.Config.set(
|
App.Config.set(
|
||||||
'IntegrationClearbit'
|
'IntegrationClearbit'
|
||||||
{
|
{
|
||||||
name: 'Clearbit'
|
name: __('Clearbit')
|
||||||
target: '#system/integration/clearbit'
|
target: '#system/integration/clearbit'
|
||||||
description: 'A powerful service to get more information about your customers.'
|
description: __('A powerful service to get more information about your customers.')
|
||||||
controller: Clearbit
|
controller: Clearbit
|
||||||
state: State
|
state: State
|
||||||
permission: ['admin.integration.clearbit']
|
permission: ['admin.integration.clearbit']
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
class Cti extends App.ControllerIntegrationBase
|
class Cti extends App.ControllerIntegrationBase
|
||||||
featureIntegration: 'cti_integration'
|
featureIntegration: 'cti_integration'
|
||||||
featureName: 'CTI (generic)'
|
featureName: __('CTI (generic)')
|
||||||
featureConfig: 'cti_config'
|
featureConfig: 'cti_config'
|
||||||
description: [
|
description: [
|
||||||
['This service shows you contacts of incoming calls and a caller list in realtime.']
|
[__('This service shows you contacts of incoming calls and a caller list in realtime.')]
|
||||||
['Also caller id of outbound calls can be changed.']
|
[__('Caller ID of outbound calls can be changed as well.')]
|
||||||
]
|
]
|
||||||
events:
|
events:
|
||||||
'click .js-select': 'selectAll'
|
'click .js-select': 'selectAll'
|
||||||
|
@ -135,7 +135,7 @@ class Form extends App.Controller
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
# blocked caller ids
|
# blocked caller IDs
|
||||||
config.inbound.block_caller_ids = []
|
config.inbound.block_caller_ids = []
|
||||||
@$('.js-inboundBlockCallerId .js-row').each(->
|
@$('.js-inboundBlockCallerId .js-row').each(->
|
||||||
caller_id = $(@).find('input[name="caller_id"]').val()
|
caller_id = $(@).find('input[name="caller_id"]').val()
|
||||||
|
@ -259,9 +259,9 @@ class State
|
||||||
App.Config.set(
|
App.Config.set(
|
||||||
'IntegrationCti'
|
'IntegrationCti'
|
||||||
{
|
{
|
||||||
name: 'CTI (generic)'
|
name: __('CTI (generic)')
|
||||||
target: '#system/integration/cti'
|
target: '#system/integration/cti'
|
||||||
description: 'Generic API to integrate VoIP service provider with realtime push.'
|
description: __('Generic API to integrate VoIP service provider with real-time push.')
|
||||||
controller: Cti
|
controller: Cti
|
||||||
state: State
|
state: State
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
class Exchange extends App.ControllerIntegrationBase
|
class Exchange extends App.ControllerIntegrationBase
|
||||||
featureIntegration: 'exchange_integration'
|
featureIntegration: 'exchange_integration'
|
||||||
featureName: 'Exchange'
|
featureName: __('Exchange')
|
||||||
featureConfig: 'exchange_config'
|
featureConfig: 'exchange_config'
|
||||||
description: [
|
description: [
|
||||||
['This service enables Zammad to connect with your Exchange server.']
|
[__('This service enables Zammad to connect with your Exchange server.')]
|
||||||
]
|
]
|
||||||
events:
|
events:
|
||||||
'change .js-switch input': 'switch'
|
'change .js-switch input': 'switch'
|
||||||
|
@ -282,7 +282,7 @@ class ConnectionWizard extends App.ControllerWizardModal
|
||||||
if !_.isEmpty(detailsRaw)
|
if !_.isEmpty(detailsRaw)
|
||||||
details = JSON.parse(detailsRaw)
|
details = JSON.parse(detailsRaw)
|
||||||
@showSlide('js-discover')
|
@showSlide('js-discover')
|
||||||
@showAlert('js-discover', details.error || 'Unable to perform backend.')
|
@showAlert('js-discover', details.error || __('Server operation failed.'))
|
||||||
)
|
)
|
||||||
|
|
||||||
folders: (e) =>
|
folders: (e) =>
|
||||||
|
@ -323,7 +323,7 @@ class ConnectionWizard extends App.ControllerWizardModal
|
||||||
if !_.isEmpty(detailsRaw)
|
if !_.isEmpty(detailsRaw)
|
||||||
details = JSON.parse(detailsRaw)
|
details = JSON.parse(detailsRaw)
|
||||||
@showSlide('js-bind')
|
@showSlide('js-bind')
|
||||||
@showAlert('js-bind', details.error || 'Unable to perform backend.')
|
@showAlert('js-bind', details.error || __('Server operation failed.'))
|
||||||
)
|
)
|
||||||
|
|
||||||
foldersShow: (alreadyShown) =>
|
foldersShow: (alreadyShown) =>
|
||||||
|
@ -429,7 +429,7 @@ class ConnectionWizard extends App.ControllerWizardModal
|
||||||
if !_.isEmpty(detailsRaw)
|
if !_.isEmpty(detailsRaw)
|
||||||
details = JSON.parse(detailsRaw)
|
details = JSON.parse(detailsRaw)
|
||||||
@showSlide('js-folders')
|
@showSlide('js-folders')
|
||||||
@showAlert('js-folders', details.error || 'Unable to perform backend.')
|
@showAlert('js-folders', details.error || __('Server operation failed.'))
|
||||||
)
|
)
|
||||||
|
|
||||||
mappingShow: (alreadyShown) =>
|
mappingShow: (alreadyShown) =>
|
||||||
|
@ -554,9 +554,9 @@ class ConnectionWizard extends App.ControllerWizardModal
|
||||||
App.Config.set(
|
App.Config.set(
|
||||||
'IntegrationExchange'
|
'IntegrationExchange'
|
||||||
{
|
{
|
||||||
name: 'Exchange'
|
name: __('Exchange')
|
||||||
target: '#system/integration/exchange'
|
target: '#system/integration/exchange'
|
||||||
description: 'Exchange integration for contacts management.'
|
description: __('Exchange integration for contacts management.')
|
||||||
controller: Exchange
|
controller: Exchange
|
||||||
state: State
|
state: State
|
||||||
permission: ['admin.integration.exchange']
|
permission: ['admin.integration.exchange']
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue