Compare commits
174 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b775416be8 | ||
|
|
4595302b6f | ||
|
|
0fd989d42e | ||
|
|
685c88e0ba | ||
|
|
c9b7d55afb | ||
|
|
64bcf8dffc | ||
|
|
560f34eddd | ||
|
|
5aa332ec9d | ||
|
|
cb05ec9b1e | ||
|
|
1fd12ffe50 | ||
|
|
ba4d7cd234 | ||
|
|
0923b15049 | ||
|
|
68b2196a02 | ||
|
|
b9a98307a9 | ||
|
|
f05e641e7e | ||
|
|
2026f23cf7 | ||
|
|
8e11790f6b | ||
|
|
6c480a6ff1 | ||
|
|
984d59d3c7 | ||
|
|
e0e2155db8 | ||
|
|
779bf46474 | ||
|
|
e4fbacf7fe | ||
|
|
9aeed69d0a | ||
|
|
627253465c | ||
|
|
5d961c1f8e | ||
|
|
d1854e5131 | ||
|
|
755d5120f0 | ||
|
|
10aa7fdcaa | ||
|
|
22a0b20a54 | ||
|
|
57fe79e08e | ||
|
|
fd34248033 | ||
|
|
ef5419e71f | ||
|
|
9075b14432 | ||
|
|
f8caa09a45 | ||
|
|
520dba0edf | ||
|
|
5fc565201a | ||
|
|
13fcf45702 | ||
|
|
0aca8c0ff2 | ||
|
|
cf3d5a3def | ||
|
|
9a537e7ad1 | ||
|
|
b1b791a7d5 | ||
|
|
88bd557abd | ||
|
|
0110da4a45 | ||
|
|
33a2dda2a1 | ||
|
|
98a0d020b0 | ||
|
|
0d76d94fc0 | ||
|
|
7a791d2dd2 | ||
|
|
5b43ecc5ed | ||
|
|
4b71e28a47 | ||
|
|
bfa78ee462 | ||
|
|
15b76b62e5 | ||
|
|
0f1ec88b48 | ||
|
|
e899e54464 | ||
|
|
3cb558f487 | ||
|
|
50af14d48d | ||
|
|
0db84aa35d | ||
|
|
850b9b8eb0 | ||
|
|
afb2345aa7 | ||
|
|
df374f06b8 | ||
|
|
72aa964901 | ||
|
|
686e1d46ed | ||
|
|
3ddf2933f6 | ||
|
|
fec6d7e0e2 | ||
|
|
397b5d38b2 | ||
|
|
9cc0cbd2d2 | ||
|
|
a187f3a54e | ||
|
|
d926a9055c | ||
|
|
12d4e0de4a | ||
|
|
92e1e8cf08 | ||
|
|
73735359f8 | ||
|
|
14e9d42452 | ||
|
|
f67d6c6a01 | ||
|
|
8a9c7f3057 | ||
|
|
10c55c4968 | ||
|
|
f1ddc6f338 | ||
|
|
181ec27fed | ||
|
|
ee8dae91e9 | ||
|
|
453aeb09c1 | ||
|
|
f31bec8b24 | ||
|
|
9482abb9ba | ||
|
|
f02f79d5df | ||
|
|
f0be88130f | ||
|
|
39e3814804 | ||
|
|
71d893b9c9 | ||
|
|
eb173ed977 | ||
|
|
611ba7e227 | ||
|
|
d34b4b35f4 | ||
|
|
91afdffd8c | ||
|
|
507e0ff2fb | ||
|
|
28f5474308 | ||
|
|
ddb5faedb9 | ||
|
|
386ffa9b26 | ||
|
|
197abebd91 | ||
|
|
b9f32fa223 | ||
|
|
f818ceca3b | ||
|
|
effb1aeaf1 | ||
|
|
d3a57bc5c7 | ||
|
|
deca44e0dd | ||
|
|
17c73137a2 | ||
|
|
042e060adb | ||
|
|
33edd75bb0 | ||
|
|
0b7172b659 | ||
|
|
b5950f8579 | ||
|
|
9b0ae01a8d | ||
|
|
1fc0c2ce61 | ||
|
|
c4c15fa99a | ||
|
|
0d08141ed6 | ||
|
|
5df51a017c | ||
|
|
1950cb4314 | ||
|
|
5a4b413d57 | ||
|
|
9edee425a9 | ||
|
|
7fd61b3b06 | ||
|
|
1563f7edd6 | ||
|
|
be4ce4cb0f | ||
|
|
8030396c2d | ||
|
|
f66ab5c630 | ||
|
|
4df40842c7 | ||
|
|
7771f094ef | ||
|
|
43c7d1f636 | ||
|
|
f43894dd00 | ||
|
|
a514bf9ad9 | ||
|
|
1fe6348afd | ||
|
|
0984e0a937 | ||
|
|
1f09f838a2 | ||
|
|
762d7688b0 | ||
|
|
8e26723b73 | ||
|
|
8623b79379 | ||
|
|
34c3085115 | ||
|
|
b1a28c201e | ||
|
|
89b6b3f5c0 | ||
|
|
8d794975d4 | ||
|
|
3c53eddaf4 | ||
|
|
fd2b8c3bce | ||
|
|
65810f7ba0 | ||
|
|
366231aaaf | ||
|
|
93a85c0357 | ||
|
|
8db459ce53 | ||
|
|
84133a875f | ||
|
|
4df1e55b18 | ||
|
|
2bda998d6f | ||
|
|
5e2004aa1d | ||
|
|
34e874626a | ||
|
|
5cf2bc4273 | ||
|
|
ca361ad8c2 | ||
|
|
684d8fe3e7 | ||
|
|
b639db89e3 | ||
|
|
cf922c0ce7 | ||
|
|
534391ecf5 | ||
|
|
ada583d0f8 | ||
|
|
5c460457ad | ||
|
|
e22b0f5c6e | ||
|
|
b2946c81dc | ||
|
|
f6fd7a48ad | ||
|
|
74c0d4cf51 | ||
|
|
fdb8ecddca | ||
|
|
3f31b555f1 | ||
|
|
3d46cab28d | ||
|
|
00a4b00194 | ||
|
|
13e4f810d5 | ||
|
|
9622724696 | ||
|
|
d8c0c889c0 | ||
|
|
17803e445f | ||
|
|
0d42c95552 | ||
|
|
9147c3be88 | ||
|
|
ed48331cec | ||
|
|
1d542d1b31 | ||
|
|
40f32aa102 | ||
|
|
3974df9a2d | ||
|
|
238b03fba7 | ||
|
|
f5b7299c2b | ||
|
|
95c6b69d64 | ||
|
|
e7be8d42a0 | ||
|
|
71f992a7fa | ||
|
|
b54fda8ac2 |
@@ -1,2 +1,2 @@
|
||||
https://github.com/heroku/heroku-buildpack-nodejs.git#v248
|
||||
https://github.com/heroku/heroku-buildpack-nodejs.git#v280
|
||||
https://github.com/pkgr/heroku-buildpack-ruby.git#v267-1
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
import '@testing-library/cypress/add-commands'
|
||||
import 'cypress-real-events/support'
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
import './prepare.js'
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
window.__ = (str) => str
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
declare global {
|
||||
// eslint-disable-next-line @typescript-eslint/no-namespace
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
import { merge } from 'lodash-es'
|
||||
import { initializeAppName } from '#shared/composables/useAppName.ts'
|
||||
@@ -38,7 +38,9 @@ export const mountComponent: typeof mount = (
|
||||
options: any,
|
||||
): Cypress.Chainable => {
|
||||
const plugins = []
|
||||
plugins.push(() => { initializeAppName('mobile') })
|
||||
plugins.push(() => {
|
||||
initializeAppName('mobile')
|
||||
})
|
||||
plugins.push(initializeStore)
|
||||
plugins.push(initializeGlobalComponentStyles)
|
||||
plugins.push(initializeGlobalComponents)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
const config = require('./lib.config.js')
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module.exports = [
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
to: "../../<%= withTypeFile ? `app/frontend/${h.componentLibrary(libraryName, h)}/components/${h.componentGenericWitPrefix(name, h)}/types.ts` : null %>"
|
||||
---
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
export interface Dummy {
|
||||
// Add your interface here
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module.exports = {
|
||||
generic: {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
require 'capybara/rspec/matchers'
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
module RuboCop
|
||||
module Cop
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
require_relative 'cop/zammad/active_record_reorder'
|
||||
require_relative 'cop/zammad/correct_migration_timestamp'
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env ruby
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
require 'yaml'
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
/**
|
||||
* @fileoverview Collection of Zammad rules for Eslint.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
/**
|
||||
* @fileoverview Enforce presence of Zammad copyright header
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
/**
|
||||
* @fileoverview Detect unmarked translatable strings
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
/**
|
||||
* @fileoverview Enforces consistent kebab-case for Symbol descriptors
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
/**
|
||||
* @fileoverview Enforce "ltr/rtl" rule, if positioning classes are used
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
/**
|
||||
* @fileoverview Enforce presence of Zammad copyright header
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
/**
|
||||
* @fileoverview Detect unmarked translatable strings
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
/**
|
||||
* @fileoverview Enforce kebab-case for Symbol descriptors
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
/**
|
||||
* @fileoverview Enforce "ltr/rtl" rule, if positioning classes are used
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
// Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||
const fs = require('fs')
|
||||
|
||||
1
.github/workflows/docker-ci.yaml
vendored
1
.github/workflows/docker-ci.yaml
vendored
@@ -29,6 +29,7 @@ jobs:
|
||||
with:
|
||||
context: .
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
pull: true
|
||||
push: false
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
outputs: type=docker,dest=/tmp/zammad-local.tar
|
||||
|
||||
1
.github/workflows/docker-release.yaml
vendored
1
.github/workflows/docker-release.yaml
vendored
@@ -65,6 +65,7 @@ jobs:
|
||||
with:
|
||||
context: .
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
pull: true
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env ruby
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
require File.expand_path('../config/environment', __dir__)
|
||||
|
||||
@@ -10,24 +10,45 @@ class CheckPostgresArrayColumns
|
||||
exit 1
|
||||
end
|
||||
|
||||
puts 'Checking data type of array columns:'
|
||||
puts 'Checking database array columns:'
|
||||
|
||||
check_columns
|
||||
check_columns_type
|
||||
check_columns_array
|
||||
|
||||
puts 'done.'
|
||||
end
|
||||
|
||||
def self.check_columns
|
||||
public_links.concat(object_manager_attributes).each do |item|
|
||||
print " #{item[:table]}.#{item[:column]} ... "
|
||||
def self.check_columns_type
|
||||
puts ' (type == :string):'
|
||||
|
||||
type = data_type(item[:table], item[:column])
|
||||
smime_certificates.concat(pgp_keys).concat(public_links).concat(object_manager_attributes).each do |item|
|
||||
print " #{item[:table]}.#{item[:column]} ... "
|
||||
|
||||
if type == 'ARRAY'
|
||||
type = column(item[:table], item[:column]).type
|
||||
|
||||
if type == :string
|
||||
puts 'OK'
|
||||
else
|
||||
puts 'Not OK!'
|
||||
puts " Expected type ARRAY, but got: #{type}"
|
||||
puts " Expected type :string, but got: #{type}"
|
||||
exit 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.check_columns_array
|
||||
puts ' (array == true):'
|
||||
|
||||
smime_certificates.concat(pgp_keys).concat(public_links).concat(object_manager_attributes).each do |item|
|
||||
print " #{item[:table]}.#{item[:column]} ... "
|
||||
|
||||
array = column(item[:table], item[:column]).array
|
||||
|
||||
if array
|
||||
puts 'OK'
|
||||
else
|
||||
puts 'Not OK!'
|
||||
puts " Expected array true, but got: #{array}"
|
||||
exit 1
|
||||
end
|
||||
end
|
||||
@@ -39,12 +60,20 @@ class CheckPostgresArrayColumns
|
||||
end
|
||||
end
|
||||
|
||||
def self.smime_certificates
|
||||
[{ table: SMIMECertificate.table_name, column: 'email_addresses' }]
|
||||
end
|
||||
|
||||
def self.pgp_keys
|
||||
[{ table: PGPKey.table_name, column: 'email_addresses' }]
|
||||
end
|
||||
|
||||
def self.public_links
|
||||
[{ table: PublicLink.table_name, column: 'screen' }]
|
||||
end
|
||||
|
||||
def self.data_type(table, column)
|
||||
ActiveRecord::Base.connection.execute("select data_type from information_schema.columns where table_name = '#{table}' and column_name = '#{column}' limit 1")[0]['data_type']
|
||||
def self.column(table, column)
|
||||
ActiveRecord::Base.connection.columns(table.to_sym).find { |c| c.name == column }
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -2,10 +2,8 @@
|
||||
source_rvm:
|
||||
- source /etc/profile.d/rvm.sh # ensure RVM is loaded
|
||||
bundle_install:
|
||||
- echo -e "\\e[0Ksection_start:`date +%s`:bundle_install[collapsed=true]\\r\\e[0Kbundle install"
|
||||
- bundle config set --local deployment 'true'
|
||||
- bundle install -j $(nproc)
|
||||
- echo -e "\\e[0Ksection_end:`date +%s`:bundle_install\\r\\e[0K"
|
||||
- bundle install -j $(nproc) > /dev/null
|
||||
pnpm_init: &pnpm_init
|
||||
- pnpm config set store-dir ${CI_PROJECT_DIR}/tmp/cache/pnpm-store
|
||||
pnpm_install: &pnpm_install
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
alias: selenium-firefox
|
||||
|
||||
redis:
|
||||
name: $CI_REGISTRY/docker/zammad-redis:stable
|
||||
name: $CI_REGISTRY/docker/zammad-redis:$REDIS_TAG
|
||||
alias: redis
|
||||
|
||||
memcached:
|
||||
|
||||
@@ -17,10 +17,12 @@ variables:
|
||||
|
||||
# Settings for elasticsearch, if active
|
||||
ES_INDEX: 'estest.ci'
|
||||
ELASTICSEARCH_TAG: '7.16'
|
||||
ELASTICSEARCH_TAG: 'stable'
|
||||
|
||||
# PostgreSQL
|
||||
# Define image versions. Regular commits test against 'stable' (lowest supported version),
|
||||
# scheduled pipelines against 'latest' (newest stable release of the services).
|
||||
POSTGRESQL_TAG: 'stable'
|
||||
REDIS_TAG: 'stable'
|
||||
|
||||
# Compile assets only once.
|
||||
CI_SKIP_ASSETS_PRECOMPILE: 'true'
|
||||
|
||||
@@ -63,9 +63,8 @@
|
||||
- bundle exec .dev/rubocop/validate_todos.rb
|
||||
- bundle exec rubocop --parallel
|
||||
- echo "bundler-audit security check…"
|
||||
- gem install bundler-audit
|
||||
- bundle-audit update
|
||||
- bundle-audit
|
||||
- gem exec bundle-audit update
|
||||
- gem exec bundle-audit
|
||||
- echo "Brakeman security check…"
|
||||
- bundle exec brakeman -o /dev/stdout -o tmp/brakeman-report.html
|
||||
- echo "Checking if yard can generate documentation…"
|
||||
|
||||
@@ -13,21 +13,15 @@
|
||||
- bundle exec rspec --tag searchindex --tag ~type:system --profile 10
|
||||
|
||||
# Lowest supported version
|
||||
rspec:es:7.8:
|
||||
rspec:es:stable:
|
||||
extends:
|
||||
- .template_integration_es
|
||||
variables:
|
||||
ELASTICSEARCH_TAG: '7.8.1'
|
||||
ELASTICSEARCH_TAG: 'stable'
|
||||
|
||||
# Highest supported version (except for newer releases that are not yet in CI)
|
||||
rspec:es:7.16:
|
||||
rspec:es:latest:
|
||||
extends:
|
||||
- .template_integration_es
|
||||
variables:
|
||||
ELASTICSEARCH_TAG: '7.16'
|
||||
|
||||
rspec:es:8.1:
|
||||
extends:
|
||||
- .template_integration_es
|
||||
variables:
|
||||
ELASTICSEARCH_TAG: '8.1'
|
||||
ELASTICSEARCH_TAG: 'latest'
|
||||
|
||||
61
.gitlab/ci/test/packager.io.yml
Normal file
61
.gitlab/ci/test/packager.io.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
.packager.io:
|
||||
image: docker
|
||||
stage: test
|
||||
interruptible: false
|
||||
rules:
|
||||
- if: $CI_PIPELINE_SOURCE == "schedule" || $CI_PIPELINE_SOURCE == "web"
|
||||
services: []
|
||||
cache: []
|
||||
before_script: []
|
||||
script:
|
||||
- .gitlab/packager.io/run_scenarios.sh
|
||||
after_script:
|
||||
- .gitlab/packager.io/cleanup.sh
|
||||
|
||||
packager.io:debian-11:
|
||||
extends: [.packager.io]
|
||||
variables:
|
||||
DISTRIBUTION: debian
|
||||
DISTRIBUTION_VERSION: '11'
|
||||
|
||||
packager.io:debian-12:
|
||||
extends: [.packager.io]
|
||||
variables:
|
||||
DISTRIBUTION: debian
|
||||
DISTRIBUTION_VERSION: '12'
|
||||
|
||||
packager.io:ubuntu-20.04:
|
||||
extends: [.packager.io]
|
||||
variables:
|
||||
DISTRIBUTION: ubuntu
|
||||
DISTRIBUTION_VERSION: '20.04'
|
||||
|
||||
packager.io:ubuntu-22.04:
|
||||
extends: [.packager.io]
|
||||
variables:
|
||||
DISTRIBUTION: ubuntu
|
||||
DISTRIBUTION_VERSION: '22.04'
|
||||
|
||||
packager.io:ubuntu-24.04:
|
||||
extends: [.packager.io]
|
||||
variables:
|
||||
DISTRIBUTION: ubuntu
|
||||
DISTRIBUTION_VERSION: '24.04'
|
||||
|
||||
packager.io:rhel-8:
|
||||
extends: [.packager.io]
|
||||
variables:
|
||||
DISTRIBUTION: rhel
|
||||
DISTRIBUTION_VERSION: '8'
|
||||
|
||||
packager.io:rhel-9:
|
||||
extends: [.packager.io]
|
||||
variables:
|
||||
DISTRIBUTION: rhel
|
||||
DISTRIBUTION_VERSION: '9'
|
||||
|
||||
packager.io:sles-15:
|
||||
extends: [.packager.io]
|
||||
variables:
|
||||
DISTRIBUTION: sles
|
||||
DISTRIBUTION_VERSION: '15'
|
||||
43
.gitlab/ci/test/performance.yml
Normal file
43
.gitlab/ci/test/performance.yml
Normal file
@@ -0,0 +1,43 @@
|
||||
performance:
|
||||
stage: test
|
||||
rules:
|
||||
- if: $CI_PIPELINE_SOURCE == "schedule" || $CI_PIPELINE_SOURCE == "web"
|
||||
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
||||
changes:
|
||||
- .gitlab/ci/test/performance.yml
|
||||
- .gitlab/performance/**/*
|
||||
# Make sure this gets executed exclusively on a runner.
|
||||
tags: ['no_concurrency']
|
||||
services:
|
||||
- !reference [.services, postgresql]
|
||||
- !reference [.services, redis]
|
||||
cache: []
|
||||
before_script:
|
||||
# Copy performance checking code to tmp/ so that it survives branch switching
|
||||
- cp -rv .gitlab/performance tmp/
|
||||
|
||||
# First, checkout stable and set it up.
|
||||
- git fetch --unshallow >/dev/null 2>&1
|
||||
- git checkout stable-6.0
|
||||
- !reference [.scripts, source_rvm]
|
||||
- rvm use 3.1.3
|
||||
- !reference [.scripts, bundle_install]
|
||||
- !reference [.scripts, configure_environment]
|
||||
- !reference [.scripts, zammad_db_init]
|
||||
- yarn install --silent # Required for assets:precompile test
|
||||
script:
|
||||
- bundle exec rails r tmp/performance/fill_db.rb
|
||||
# Run performance tests for stable.
|
||||
- bundle exec rails r tmp/performance/run_tests.rb
|
||||
# Then, switch to the current commit, migrate to it and run a few selected tests.
|
||||
- git checkout $CI_COMMIT_SHA
|
||||
- rvm use 3.2.4
|
||||
- !reference [.scripts, bundle_install]
|
||||
# Force redis usage, even if it was disabled by the initial configure_environment script of stable.
|
||||
- export REDIS_URL=redis://redis
|
||||
- bundle exec rails db:migrate > /dev/null
|
||||
- rm -rf node_modules && pnpm install > /dev/null # Required for assets:precompile test.
|
||||
- bundle exec rails assets:clobber && git checkout public/assets # Clear previously generated assets to have a full regeneration.
|
||||
# Run performance tests for current branch.
|
||||
- bundle exec rails r tmp/performance/run_tests.rb
|
||||
after_script: []
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env ruby
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
require 'yaml'
|
||||
require 'resolv'
|
||||
|
||||
15
.gitlab/packager.io/cleanup.sh
Executable file
15
.gitlab/packager.io/cleanup.sh
Executable file
@@ -0,0 +1,15 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -eu
|
||||
|
||||
cd "$(dirname $0)"
|
||||
|
||||
docker compose down --timeout 0
|
||||
docker volume prune --all --force
|
||||
|
||||
DELETE_IMAGES=$(docker image ls "zammad-packagerio-ci-${CI_JOB_ID}" -q)
|
||||
if [ -n "$DELETE_IMAGES" ]
|
||||
then
|
||||
# shellcheck disable=SC2086
|
||||
docker image rm $DELETE_IMAGES
|
||||
fi
|
||||
16
.gitlab/packager.io/docker-compose.yml
Normal file
16
.gitlab/packager.io/docker-compose.yml
Normal file
@@ -0,0 +1,16 @@
|
||||
---
|
||||
name: zammad-packagerio-ci-${CI_JOB_ID}
|
||||
services:
|
||||
zammad:
|
||||
image: zammad-packagerio-ci-${CI_JOB_ID}:${DISTRIBUTION}-${DISTRIBUTION_VERSION}
|
||||
build:
|
||||
context: "."
|
||||
platforms: ["linux/amd64"]
|
||||
dockerfile: dockerfiles/Dockerfile.${DISTRIBUTION}
|
||||
args:
|
||||
DISTRIBUTION: ${DISTRIBUTION}
|
||||
DISTRIBUTION_VERSION: ${DISTRIBUTION_VERSION}
|
||||
CI_COMMIT_REF_NAME: ${CI_COMMIT_REF_NAME}
|
||||
privileged: true
|
||||
restart: unless-stopped
|
||||
expose: ["80"]
|
||||
9
.gitlab/packager.io/dockerfiles/Dockerfile.debian
Normal file
9
.gitlab/packager.io/dockerfiles/Dockerfile.debian
Normal file
@@ -0,0 +1,9 @@
|
||||
ARG DISTRIBUTION_VERSION
|
||||
FROM docker.io/library/debian:${DISTRIBUTION_VERSION}
|
||||
ARG DISTRIBUTION
|
||||
ARG DISTRIBUTION_VERSION
|
||||
ARG CI_COMMIT_REF_NAME
|
||||
ADD dockerfiles dockerfiles
|
||||
ADD scenarios scenarios
|
||||
RUN bash /dockerfiles/bootstrap.debian.sh
|
||||
ENTRYPOINT [ "/sbin/init" ]
|
||||
9
.gitlab/packager.io/dockerfiles/Dockerfile.rhel
Normal file
9
.gitlab/packager.io/dockerfiles/Dockerfile.rhel
Normal file
@@ -0,0 +1,9 @@
|
||||
ARG DISTRIBUTION_VERSION
|
||||
FROM docker.io/library/rockylinux:${DISTRIBUTION_VERSION}
|
||||
ARG DISTRIBUTION
|
||||
ARG DISTRIBUTION_VERSION
|
||||
ARG CI_COMMIT_REF_NAME
|
||||
ADD dockerfiles dockerfiles
|
||||
ADD scenarios scenarios
|
||||
RUN bash /dockerfiles/bootstrap.rhel.sh
|
||||
ENTRYPOINT [ "/sbin/init" ]
|
||||
9
.gitlab/packager.io/dockerfiles/Dockerfile.sles
Normal file
9
.gitlab/packager.io/dockerfiles/Dockerfile.sles
Normal file
@@ -0,0 +1,9 @@
|
||||
ARG DISTRIBUTION_VERSION
|
||||
FROM docker.io/opensuse/leap:${DISTRIBUTION_VERSION}
|
||||
ARG DISTRIBUTION
|
||||
ARG DISTRIBUTION_VERSION
|
||||
ARG CI_COMMIT_REF_NAME
|
||||
ADD dockerfiles dockerfiles
|
||||
ADD scenarios scenarios
|
||||
RUN bash /dockerfiles/bootstrap.sles.sh
|
||||
ENTRYPOINT [ "/sbin/init" ]
|
||||
9
.gitlab/packager.io/dockerfiles/Dockerfile.ubuntu
Normal file
9
.gitlab/packager.io/dockerfiles/Dockerfile.ubuntu
Normal file
@@ -0,0 +1,9 @@
|
||||
ARG DISTRIBUTION_VERSION
|
||||
FROM docker.io/library/ubuntu:${DISTRIBUTION_VERSION}
|
||||
ARG DISTRIBUTION
|
||||
ARG DISTRIBUTION_VERSION
|
||||
ARG CI_COMMIT_REF_NAME
|
||||
ADD dockerfiles dockerfiles
|
||||
ADD scenarios scenarios
|
||||
RUN bash /dockerfiles/bootstrap.ubuntu.sh
|
||||
ENTRYPOINT [ "/sbin/init" ]
|
||||
12
.gitlab/packager.io/dockerfiles/bootstrap.debian.sh
Executable file
12
.gitlab/packager.io/dockerfiles/bootstrap.debian.sh
Executable file
@@ -0,0 +1,12 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -eu
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
cd "$(dirname $0)"
|
||||
|
||||
bash ./shared.deb.sh
|
||||
|
||||
echo "deb [signed-by=/usr/share/keyrings/zammad-archive-keyring.gpg] https://dl.packager.io/srv/deb/zammad/zammad/${CI_COMMIT_REF_NAME}/debian ${DISTRIBUTION_VERSION} main" > /etc/apt/sources.list.d/zammad.list
|
||||
apt-get update && apt-get install -y --download-only zammad
|
||||
26
.gitlab/packager.io/dockerfiles/bootstrap.rhel.sh
Executable file
26
.gitlab/packager.io/dockerfiles/bootstrap.rhel.sh
Executable file
@@ -0,0 +1,26 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -eu
|
||||
|
||||
dnf update -y
|
||||
|
||||
dnf install -y systemd epel-release
|
||||
|
||||
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
|
||||
echo "[elasticsearch-7.x]
|
||||
name=Elasticsearch repository for 7.x packages
|
||||
baseurl=https://artifacts.elastic.co/packages/7.x/yum
|
||||
gpgcheck=1
|
||||
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
|
||||
enabled=1
|
||||
autorefresh=1
|
||||
type=rpm-md"| tee /etc/yum.repos.d/elasticsearch-7.x.repo
|
||||
dnf install -y elasticsearch
|
||||
|
||||
rpm --import https://dl.packager.io/srv/zammad/zammad/key
|
||||
|
||||
curl -o /etc/yum.repos.d/zammad.repo \
|
||||
https://dl.packager.io/srv/zammad/zammad/${CI_COMMIT_REF_NAME}/installer/el/${DISTRIBUTION_VERSION}.repo
|
||||
|
||||
dnf update -y
|
||||
dnf install -y --downloadonly zammad
|
||||
26
.gitlab/packager.io/dockerfiles/bootstrap.sles.sh
Executable file
26
.gitlab/packager.io/dockerfiles/bootstrap.sles.sh
Executable file
@@ -0,0 +1,26 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -eu
|
||||
|
||||
zypper update -y
|
||||
|
||||
zypper install -y systemd
|
||||
|
||||
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
|
||||
echo "[elasticsearch-7.x]
|
||||
name=Elasticsearch repository for 7.x packages
|
||||
baseurl=https://artifacts.elastic.co/packages/7.x/yum
|
||||
gpgcheck=1
|
||||
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
|
||||
enabled=1
|
||||
autorefresh=1
|
||||
type=rpm-md"| tee /etc/zypp/repos.d/elasticsearch-7.x.repo
|
||||
zypper install -y elasticsearch
|
||||
|
||||
rpm --import https://dl.packager.io/srv/zammad/zammad/key
|
||||
|
||||
curl -o /etc/zypp/repos.d/zammad.repo \
|
||||
https://dl.packager.io/srv/zammad/zammad/${CI_COMMIT_REF_NAME}/installer/sles/${DISTRIBUTION_VERSION}.repo
|
||||
|
||||
zypper update -y
|
||||
zypper install -y --download-only zammad
|
||||
12
.gitlab/packager.io/dockerfiles/bootstrap.ubuntu.sh
Normal file
12
.gitlab/packager.io/dockerfiles/bootstrap.ubuntu.sh
Normal file
@@ -0,0 +1,12 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -eu
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
cd "$(dirname $0)"
|
||||
|
||||
bash ./shared.deb.sh
|
||||
|
||||
echo "deb [signed-by=/usr/share/keyrings/zammad-archive-keyring.gpg] https://dl.packager.io/srv/deb/zammad/zammad/${CI_COMMIT_REF_NAME}/ubuntu ${DISTRIBUTION_VERSION} main" > /etc/apt/sources.list.d/zammad.list
|
||||
apt-get update && apt-get install -y --download-only zammad
|
||||
18
.gitlab/packager.io/dockerfiles/shared.deb.sh
Executable file
18
.gitlab/packager.io/dockerfiles/shared.deb.sh
Executable file
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -ex
|
||||
|
||||
apt-get update && apt-get dist-upgrade -y
|
||||
apt-get install -y systemd systemd-sysv
|
||||
rm -f /usr/sbin/policy-rc.d
|
||||
|
||||
apt-get install -y curl gnupg2
|
||||
echo "deb [signed-by=/etc/apt/trusted.gpg.d/elasticsearch.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | \
|
||||
tee -a /etc/apt/sources.list.d/elastic-7.x.list > /dev/null
|
||||
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | \
|
||||
gpg --dearmor | tee /etc/apt/trusted.gpg.d/elasticsearch.gpg> /dev/null
|
||||
apt-get update
|
||||
apt-get -y install elasticsearch
|
||||
|
||||
curl -1sLf https://dl.packager.io/srv/zammad/zammad/key | \
|
||||
gpg --dearmor -o /usr/share/keyrings/zammad-archive-keyring.gpg
|
||||
26
.gitlab/packager.io/run_scenarios.sh
Executable file
26
.gitlab/packager.io/run_scenarios.sh
Executable file
@@ -0,0 +1,26 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -eu
|
||||
|
||||
: "${DISTRIBUTION:=debian}"
|
||||
: "${DISTRIBUTION_VERSION:=12}"
|
||||
: "${CI_JOB_ID:=1}"
|
||||
: "${CI_COMMIT_REF_NAME:=develop}"
|
||||
|
||||
export DISTRIBUTION DISTRIBUTION_VERSION CI_JOB_ID CI_COMMIT_REF_NAME
|
||||
|
||||
echo "Running tests for ${CI_COMMIT_REF_NAME} on ${DISTRIBUTION}-${DISTRIBUTION_VERSION}…"
|
||||
|
||||
cd "$(dirname $0)"
|
||||
|
||||
docker compose build
|
||||
|
||||
# shellcheck disable=SC2043
|
||||
for SCENARIO in $(cd scenarios; ls -1)
|
||||
do
|
||||
docker compose down --timeout 0
|
||||
docker compose up -d
|
||||
docker compose exec zammad bash "/scenarios/${SCENARIO}/${DISTRIBUTION}.sh"
|
||||
docker compose down --timeout 0
|
||||
done
|
||||
./cleanup.sh
|
||||
7
.gitlab/packager.io/scenarios/internal-services/debian.sh
Executable file
7
.gitlab/packager.io/scenarios/internal-services/debian.sh
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -eu
|
||||
|
||||
cd "$(dirname $0)"
|
||||
|
||||
bash ./shared.deb.sh
|
||||
14
.gitlab/packager.io/scenarios/internal-services/rhel.sh
Executable file
14
.gitlab/packager.io/scenarios/internal-services/rhel.sh
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -eu
|
||||
|
||||
# Workaround: postgresql fails on rhel-9 when it gets installed together with Zammad.
|
||||
dnf install -y postgresql-server
|
||||
|
||||
dnf install -y zammad
|
||||
|
||||
curl --retry 30 --retry-delay 1 --retry-connrefused http://localhost:3000 | grep "Zammad Helpdesk"
|
||||
|
||||
dnf reinstall -y zammad
|
||||
|
||||
curl --retry 30 --retry-delay 1 --retry-connrefused http://localhost:3000 | grep "Zammad Helpdesk"
|
||||
13
.gitlab/packager.io/scenarios/internal-services/shared.deb.sh
Executable file
13
.gitlab/packager.io/scenarios/internal-services/shared.deb.sh
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -eu
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
apt-get install -y zammad
|
||||
|
||||
curl --retry 30 --retry-delay 1 --retry-connrefused http://localhost:3000 | grep "Zammad Helpdesk"
|
||||
|
||||
apt-get install -y --reinstall zammad
|
||||
|
||||
curl --retry 30 --retry-delay 1 --retry-connrefused http://localhost:3000 | grep "Zammad Helpdesk"
|
||||
11
.gitlab/packager.io/scenarios/internal-services/sles.sh
Executable file
11
.gitlab/packager.io/scenarios/internal-services/sles.sh
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -eu
|
||||
|
||||
zypper install -y zammad
|
||||
|
||||
curl --retry 30 --retry-delay 1 --retry-connrefused http://localhost:3000 | grep "Zammad Helpdesk"
|
||||
|
||||
zypper install -y -f zammad
|
||||
|
||||
curl --retry 30 --retry-delay 1 --retry-connrefused http://localhost:3000 | grep "Zammad Helpdesk"
|
||||
7
.gitlab/packager.io/scenarios/internal-services/ubuntu.sh
Executable file
7
.gitlab/packager.io/scenarios/internal-services/ubuntu.sh
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -eu
|
||||
|
||||
cd "$(dirname $0)"
|
||||
|
||||
bash ./shared.deb.sh
|
||||
39
.gitlab/performance/fill_db.rb
Executable file
39
.gitlab/performance/fill_db.rb
Executable file
@@ -0,0 +1,39 @@
|
||||
#!/usr/bin/env ruby
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
require 'rails'
|
||||
|
||||
def run
|
||||
ensure_test_data_present
|
||||
end
|
||||
|
||||
def ensure_test_data_present
|
||||
puts 'Ensuring test data with 15k tickets is present…'
|
||||
|
||||
# Speed up the import
|
||||
Setting.set('import_mode', true)
|
||||
|
||||
suppress_output do
|
||||
FillDb.load(
|
||||
agents: 100,
|
||||
customers: 4000,
|
||||
groups: 80,
|
||||
organizations: 400,
|
||||
overviews: 4,
|
||||
tickets: 15_000,
|
||||
nice: 0,
|
||||
)
|
||||
end
|
||||
|
||||
Setting.set('import_mode', false)
|
||||
end
|
||||
|
||||
def suppress_output
|
||||
original_stdout = $stdout.clone
|
||||
$stdout.reopen(File.new('/dev/null', 'w'))
|
||||
yield
|
||||
ensure
|
||||
$stdout.reopen(original_stdout)
|
||||
end
|
||||
|
||||
run
|
||||
79
.gitlab/performance/run_tests.rb
Executable file
79
.gitlab/performance/run_tests.rb
Executable file
@@ -0,0 +1,79 @@
|
||||
#!/usr/bin/env ruby
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
require 'rails'
|
||||
|
||||
def run
|
||||
puts "# Zammad Performance Tests\n\n"
|
||||
run_tests!
|
||||
end
|
||||
|
||||
def run_tests!
|
||||
puts 'Run test scenarios…'
|
||||
[].tap do |results|
|
||||
run_test_scenarios(results:)
|
||||
|
||||
if results.any? { |r| r[:failed] }
|
||||
puts 'Tests failed.'
|
||||
exit 1
|
||||
end
|
||||
|
||||
puts 'All tests were successful.'
|
||||
end
|
||||
end
|
||||
|
||||
def run_test_scenarios(results:)
|
||||
agent = User.with_permissions('ticket.agent').first
|
||||
|
||||
expect(title: 'assets:precompile', max_time: 120, max_sql_queries: nil, results:) do
|
||||
system('RAILS_ENV=production bundle exec rails assets:precompile > /dev/null 2>&1', exception: true)
|
||||
end
|
||||
|
||||
max_index_queries = version_oldstable? ? 70 : 35
|
||||
expect(title: 'Ticket::Overviews.index', max_time: 1, max_sql_queries: max_index_queries, results:) do
|
||||
Ticket::Overviews.index(agent)
|
||||
end
|
||||
|
||||
expect(title: 'Ticket::Overviews.all', max_time: 0.05, max_sql_queries: 5, results:) do
|
||||
Ticket::Overviews.all(current_user: agent)
|
||||
end
|
||||
|
||||
max_overview_list_time = 20
|
||||
max_overview_list_queries = 25_000
|
||||
puts "Current ticket count: #{Ticket.count}"
|
||||
expect(title: 'Sessions::Backend::TicketOverviewList#push', max_time: max_overview_list_time, max_sql_queries: max_overview_list_queries, results:) do
|
||||
Sessions::Backend::TicketOverviewList.new(agent, {}).push
|
||||
end
|
||||
end
|
||||
|
||||
def version_oldstable?
|
||||
Version.get.match?(%r{^6\.0\.})
|
||||
end
|
||||
|
||||
def expect(title:, max_time:, max_sql_queries:, results:, &block)
|
||||
|
||||
ActiveRecord::Base.connection.query_cache.clear
|
||||
Rails.cache.clear
|
||||
|
||||
sql_queries = 0
|
||||
failed = false
|
||||
callback = ->(_name, _start, _finish, _id, payload) { sql_queries += 1 if !payload[:cached] }
|
||||
time = Benchmark.measure do
|
||||
ActiveSupport::Notifications.subscribed(callback, 'sql.active_record', &block)
|
||||
end
|
||||
puts " #{title}: #{time.real}s (#{sql_queries} queries)"
|
||||
|
||||
if max_time && time.real > max_time
|
||||
puts " ERROR: took #{time.real}s, rather than expected maximum of #{max_time}s"
|
||||
failed = true
|
||||
end
|
||||
|
||||
if max_sql_queries && sql_queries > max_sql_queries
|
||||
puts " ERROR: caused #{sql_queries} SQL queries, rather than expected maximum of #{max_sql_queries}"
|
||||
failed = true
|
||||
end
|
||||
|
||||
results.push({ title:, max_time:, time: time.real, max_sql_queries:, sql_queries:, failed: })
|
||||
end
|
||||
|
||||
run
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env ruby
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
require 'yaml'
|
||||
require 'pathname'
|
||||
|
||||
@@ -14,6 +14,7 @@ targets:
|
||||
- imlib2
|
||||
- shared-mime-info
|
||||
- redis
|
||||
- findutils
|
||||
build_dependencies:
|
||||
- https://download.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/i/imlib2-1.4.9-8.el8.x86_64.rpm
|
||||
- https://download.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/i/imlib2-devel-1.4.9-8.el8.x86_64.rpm
|
||||
@@ -108,10 +109,14 @@ targets:
|
||||
- libImlib2-1
|
||||
- imlib2
|
||||
- shared-mime-info
|
||||
- redis7
|
||||
# We need the fuser binary from the psmisc package to detect the running redis systemd service.
|
||||
# Because on SUSE systems, this service is arbitrarily named (e.g.) redis@foobar.service
|
||||
# So we cannot hardcode the service name as we do for other supported distros.
|
||||
- psmisc
|
||||
- procps
|
||||
- libopenssl1_1
|
||||
- which
|
||||
build_dependencies:
|
||||
# Add packages required for build that are not in the official SLES repo.
|
||||
# Direct URLs must be used since we cannot add repos on packager.io
|
||||
|
||||
219
CHANGELOG.md
219
CHANGELOG.md
@@ -1,9 +1,226 @@
|
||||
# Change Log
|
||||
|
||||
## [6.4.0](https://github.com/zammad/zammad/tree/6.4.0) (2024-xx-xx)
|
||||
## [6.4.2](https://github.com/zammad/zammad/tree/6.4.2) (2025-04-02)
|
||||
[Full Changelog](https://github.com/zammad/zammad/compare/6.4.1...6.4.2)
|
||||
|
||||
**Fixed bugs:**
|
||||
|
||||
- Payload gets lost when a pre-defined webhook is cloned [5524](https://github.com/zammad/zammad/issues/5524) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[webhooks](https://github.com/zammad/zammad/labels/webhooks)]
|
||||
- Mobile View: Highlighting/border of activated profile menu is a square instead of a circle [5519](https://github.com/zammad/zammad/issues/5519) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[📱mobile-view📱](https://github.com/zammad/zammad/labels/%F0%9F%93%B1mobile-view%F0%9F%93%B1)]
|
||||
- Web concurrency setting inconsistently used/reported [5509](https://github.com/zammad/zammad/issues/5509) [[bug](https://github.com/zammad/zammad/labels/bug)] [[docker](https://github.com/zammad/zammad/labels/docker)]
|
||||
- Drag´n´Drop of one attachment in the KnowledgeBase articles results in multiple copies [5499](https://github.com/zammad/zammad/issues/5499) [[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)]
|
||||
- Group selection not scrollable in bulk action with lot of groups [5246](https://github.com/zammad/zammad/issues/5246) [[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)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||
- The ticket zoom overview navigation arrows randomly disappear while switching between tickets [5445](https://github.com/zammad/zammad/issues/5445) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[waiting for feedback](https://github.com/zammad/zammad/labels/waiting%20for%20feedback)] [[overviews](https://github.com/zammad/zammad/labels/overviews)]
|
||||
- Deadlocks on updating taskbars [5491](https://github.com/zammad/zammad/issues/5491) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||
- Organization is removed in the report profile after an reload of the browser tab [5469](https://github.com/zammad/zammad/issues/5469) [[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)]
|
||||
- Organization is missing when used in expert mode conditions [5483](https://github.com/zammad/zammad/issues/5483) [[bug](https://github.com/zammad/zammad/labels/bug)] [[trigger](https://github.com/zammad/zammad/labels/trigger)]
|
||||
- CSV export contains overview_sortings which is always empty [5477](https://github.com/zammad/zammad/issues/5477) [[bug](https://github.com/zammad/zammad/labels/bug)] [[user](https://github.com/zammad/zammad/labels/user)] [[export](https://github.com/zammad/zammad/labels/export)]
|
||||
- Failing import when an existing zendesk custom attribute name is equal an internal Zammad attribute name [5474](https://github.com/zammad/zammad/issues/5474) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||
- Creating a Ticket Object called 'article' will lead to all kinds of errors [5461](https://github.com/zammad/zammad/issues/5461) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[object manager attribute](https://github.com/zammad/zammad/labels/object%20manager%20attribute)]
|
||||
- delete reporting profile with id=1 [5463](https://github.com/zammad/zammad/issues/5463) [[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)]
|
||||
- Reporting Profile - query does not support [owner_id] [5462](https://github.com/zammad/zammad/issues/5462) [[bug](https://github.com/zammad/zammad/labels/bug)] [[reporting](https://github.com/zammad/zammad/labels/reporting)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||
- Subscribe or unsubscribe when used in a trigger is not shown in the ticket history correctly [5444](https://github.com/zammad/zammad/issues/5444) [[bug](https://github.com/zammad/zammad/labels/bug)] [[trigger](https://github.com/zammad/zammad/labels/trigger)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[history](https://github.com/zammad/zammad/labels/history)]
|
||||
- Occasionally puma hangs up after updating to Zammad 6.4 [5438](https://github.com/zammad/zammad/issues/5438) [[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)]
|
||||
- Uploading an avatar is not possible if it was deleted in between [5456](https://github.com/zammad/zammad/issues/5456) [[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)] [[frontend](https://github.com/zammad/zammad/labels/frontend)] [[account: profile](https://github.com/zammad/zammad/labels/account%3A%20profile)]
|
||||
- The "Subscribe" attribute in triggers is not working as intended. [5441](https://github.com/zammad/zammad/issues/5441) [[bug](https://github.com/zammad/zammad/labels/bug)] [[trigger](https://github.com/zammad/zammad/labels/trigger)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||
- Mobile Ticket Information View displaying internalId instead of ticket number [5455](https://github.com/zammad/zammad/issues/5455) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[📱mobile-view📱](https://github.com/zammad/zammad/labels/%F0%9F%93%B1mobile-view%F0%9F%93%B1)]
|
||||
- Most recent data privacy tasks are not shown [5437](https://github.com/zammad/zammad/issues/5437) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[data privacy](https://github.com/zammad/zammad/labels/data%20privacy)]
|
||||
- Adding NGINX_MAX_UPLOAD_SIZE to docker-entrypoint [5443](https://github.com/zammad/zammad/pull/5443)
|
||||
- Translation - Admin / "System Report" - missing translation and bad renderer [5442](https://github.com/zammad/zammad/issues/5442) [[bug](https://github.com/zammad/zammad/labels/bug)] [[translation](https://github.com/zammad/zammad/labels/translation)]
|
||||
- Unsupported message type received by WhatsApp Business API is blocking the whole channel [5439](https://github.com/zammad/zammad/issues/5439) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[whatsapp](https://github.com/zammad/zammad/labels/whatsapp)]
|
||||
- Erroneous error message during password reset [4989](https://github.com/zammad/zammad/issues/4989) [[bug](https://github.com/zammad/zammad/labels/bug)] [[authentication](https://github.com/zammad/zammad/labels/authentication)]
|
||||
- Occasionally scheduler fails to load all needed code for unknown reasons [5420](https://github.com/zammad/zammad/issues/5420) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)] [[scheduler](https://github.com/zammad/zammad/labels/scheduler)]
|
||||
- Notification loops because mail bouncing timeouts do not apply to users in system notifications [5428](https://github.com/zammad/zammad/issues/5428) [[bug](https://github.com/zammad/zammad/labels/bug)] [[notification](https://github.com/zammad/zammad/labels/notification)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised%20by%20payment)]
|
||||
|
||||
## [6.4.1](https://github.com/zammad/zammad/tree/6.4.1) (2024-12-05)
|
||||
|
||||
[Full Changelog](https://github.com/zammad/zammad/compare/6.4.0...6.4.1)
|
||||
|
||||
**Fixed bugs:**
|
||||
|
||||
- Selection of linked answers in the Knowledge Base drop-down menu is lost due to a focus trap [5411](https://github.com/zammad/zammad/issues/5411) [[bug](https://github.com/zammad/zammad/labels/bug)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)]
|
||||
- Package precompile sometimes assumes old code while precompiling [5418](https://github.com/zammad/zammad/issues/5418) [[bug](https://github.com/zammad/zammad/labels/bug)] [[packages](https://github.com/zammad/zammad/labels/packages)]
|
||||
- PGP: Decryption fails if Zammad's address is in BCC [5432](https://github.com/zammad/zammad/issues/5432) [[bug](https://github.com/zammad/zammad/labels/bug)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)] [[pgp](https://github.com/zammad/zammad/labels/pgp)]
|
||||
- External data source object cannot be "set" in Postmaster filter [5425](https://github.com/zammad/zammad/issues/5425) [[bug](https://github.com/zammad/zammad/labels/bug)] [[object manager attribute](https://github.com/zammad/zammad/labels/object%20manager%20attribute)] [[postmaster filter](https://github.com/zammad/zammad/labels/postmaster%20filter)]
|
||||
- Invalid URL translation in text mail footer if URL contains & / & [5424](https://github.com/zammad/zammad/issues/5424) [[bug](https://github.com/zammad/zammad/labels/bug)] [[variable processing](https://github.com/zammad/zammad/labels/variable%20processing)]
|
||||
- Migration is not working: 20241113154014 Issue5409WrongDbColumnArrayType: undefined method `type' for nil:NilClass [5430](https://github.com/zammad/zammad/issues/5430) [[bug](https://github.com/zammad/zammad/labels/bug)] [[object manager attribute](https://github.com/zammad/zammad/labels/object%20manager%20attribute)] [[regression](https://github.com/zammad/zammad/labels/regression)] [[migration / update](https://github.com/zammad/zammad/labels/migration%20%2F%20update)]
|
||||
- Occasionally scheduler fails to load all needed code for unknown reasons [5420](https://github.com/zammad/zammad/issues/5420) [[bug](https://github.com/zammad/zammad/labels/bug)] [[scheduler](https://github.com/zammad/zammad/labels/scheduler)]
|
||||
- Moving/Verifying stored files crashes if any file is missing [5363](https://github.com/zammad/zammad/issues/5363) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Wrong type of table column after migrating from MariaDB to PostgreSQL [5409](https://github.com/zammad/zammad/issues/5409) [[bug](https://github.com/zammad/zammad/labels/bug)] [[migration / update](https://github.com/zammad/zammad/labels/migration%20%2F%20update)]
|
||||
- Pre-defined Microsoft Teams webhook fails because of broken notification messaging templates for some languages [5410](https://github.com/zammad/zammad/issues/5410) [[bug](https://github.com/zammad/zammad/labels/bug)] [[notification](https://github.com/zammad/zammad/labels/notification)] [[webhooks](https://github.com/zammad/zammad/labels/webhooks)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
- Replacing an image in the knowledge base is broken [5417](https://github.com/zammad/zammad/issues/5417) [[bug](https://github.com/zammad/zammad/labels/bug)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)]
|
||||
- Data privacy task dialog confirmation field looses focus [5398](https://github.com/zammad/zammad/issues/5398) [[bug](https://github.com/zammad/zammad/labels/bug)] [[data privacy](https://github.com/zammad/zammad/labels/data%20privacy)]
|
||||
- Storage folder does not exist in Zammad docker container. [5412](https://github.com/zammad/zammad/issues/5412) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Type Error in report page [5402](https://github.com/zammad/zammad/issues/5402) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Checklist feature: inaccessible tickets which are referenced in a checklist are always counted as checked/closed [5405](https://github.com/zammad/zammad/issues/5405) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket: checklist](https://github.com/zammad/zammad/labels/ticket%3A%20checklist)]
|
||||
- Missing history entries for time-event based triggers [5407](https://github.com/zammad/zammad/issues/5407) [[bug](https://github.com/zammad/zammad/labels/bug)] [[trigger](https://github.com/zammad/zammad/labels/trigger)] [[history](https://github.com/zammad/zammad/labels/history)]
|
||||
- zammad:package:bundle_install idea does not work out [5399](https://github.com/zammad/zammad/issues/5399) [[bug](https://github.com/zammad/zammad/labels/bug)] [[packages](https://github.com/zammad/zammad/labels/packages)]
|
||||
- GraphQL operations made over ActionCable may mix up current user [5401](https://github.com/zammad/zammad/issues/5401) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Checklist item can't be edited when checklist created empty [5396](https://github.com/zammad/zammad/issues/5396) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[ticket: checklist](https://github.com/zammad/zammad/labels/ticket%3A%20checklist)]
|
||||
- Groups selection: Display bug when selecting subgroups [5393](https://github.com/zammad/zammad/issues/5393) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
|
||||
- Makros are not translated in drag & drop feature [5391](https://github.com/zammad/zammad/issues/5391) [[bug](https://github.com/zammad/zammad/labels/bug)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
|
||||
## [6.4.0](https://github.com/zammad/zammad/tree/6.4.0) (2024-11-06)
|
||||
|
||||
[Full Changelog](https://github.com/zammad/zammad/compare/6.3.0...6.4.0)
|
||||
|
||||
**Implemented enhancements:**
|
||||
|
||||
- Searching for a ticket with a keyword from an checklist item is not working [5364](https://github.com/zammad/zammad/issues/5364) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[ticket: checklist](https://github.com/zammad/zammad/labels/ticket%3A%20checklist)]
|
||||
- Improve checklist visibility in ticket context [5336](https://github.com/zammad/zammad/issues/5336) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[ticket: checklist](https://github.com/zammad/zammad/labels/ticket%3A%20checklist)]
|
||||
- WhatsApp Feedback - 24h Window Reminder Message / Emoji-Reactions [5224](https://github.com/zammad/zammad/issues/5224) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[whatsapp](https://github.com/zammad/zammad/labels/whatsapp)]
|
||||
- Entry in ticket history should include the checklist item name if someone checks off an item [5320](https://github.com/zammad/zammad/issues/5320) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[history](https://github.com/zammad/zammad/labels/history)] [[ticket: checklist](https://github.com/zammad/zammad/labels/ticket%3A%20checklist)]
|
||||
- Prevent user creation via Third Party Authentication [4945](https://github.com/zammad/zammad/issues/4945) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[authentication](https://github.com/zammad/zammad/labels/authentication)]
|
||||
- Enhance usage of Zammad shortcuts (cross browser and cross platform) [4870](https://github.com/zammad/zammad/issues/4870) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[productivity](https://github.com/zammad/zammad/labels/productivity)]
|
||||
- Checklists / To-do lists [4886](https://github.com/zammad/zammad/issues/4886) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[productivity](https://github.com/zammad/zammad/labels/productivity)] [[A:Miro](https://github.com/zammad/zammad/labels/A%3AMiro)] [[VoteHos](https://github.com/zammad/zammad/labels/VoteHos)]
|
||||
- Pre-defined webhook for Microsoft Teams needs to be updated [5267](https://github.com/zammad/zammad/issues/5267) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[webhooks](https://github.com/zammad/zammad/labels/webhooks)]
|
||||
- Core Workflow: Add a new condition operator to catch modified fields in the UI for existing tickets [5147](https://github.com/zammad/zammad/issues/5147) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[core workflows](https://github.com/zammad/zammad/labels/core%20workflows)]
|
||||
- Subscribe/Unsubscribe from Multiple Tickets at once [5135](https://github.com/zammad/zammad/issues/5135) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[bulk](https://github.com/zammad/zammad/labels/bulk)]
|
||||
- Laggs after ticket overview selection [5214](https://github.com/zammad/zammad/issues/5214) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[overviews](https://github.com/zammad/zammad/labels/overviews)] [[performance](https://github.com/zammad/zammad/labels/performance)] [[core workflows](https://github.com/zammad/zammad/labels/core%20workflows)]
|
||||
- User login flow is interrupted when two-factor authentication method security keys is used [5156](https://github.com/zammad/zammad/issues/5156) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[authentication](https://github.com/zammad/zammad/labels/authentication)]
|
||||
- Improve 24 hours WhatsApp banner to update it's remaining time [5122](https://github.com/zammad/zammad/issues/5122) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
|
||||
- Localization of triggers and schedulers [5089](https://github.com/zammad/zammad/issues/5089) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[trigger](https://github.com/zammad/zammad/labels/trigger)] [[localization](https://github.com/zammad/zammad/labels/localization)] [[scheduler](https://github.com/zammad/zammad/labels/scheduler)]
|
||||
- Zammad should not write to the var/ folder [5022](https://github.com/zammad/zammad/issues/5022) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)]
|
||||
- Translation Management Improvements [4875](https://github.com/zammad/zammad/issues/4875) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
|
||||
**Fixed bugs:**
|
||||
|
||||
- When I try to edit the Checklist fast, the checklist is lagging and then adding items [5367](https://github.com/zammad/zammad/issues/5367) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket: checklist](https://github.com/zammad/zammad/labels/ticket%3A%20checklist)]
|
||||
- Taskbar uniqueness check leads to problems when old unexpected taskbar duplicates already exists [5390](https://github.com/zammad/zammad/issues/5390) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
|
||||
- Missing attachment alert is shown if 'attachment' is written in the signature [5385](https://github.com/zammad/zammad/issues/5385) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket: create](https://github.com/zammad/zammad/labels/ticket%3A%20create)] [[ticket: actions](https://github.com/zammad/zammad/labels/ticket%3A%20actions)]
|
||||
- Typo in database migration of Thirdparty-Login 'No user creation on logon' [5381](https://github.com/zammad/zammad/issues/5381) [[bug](https://github.com/zammad/zammad/labels/bug)] [[translation](https://github.com/zammad/zammad/labels/translation)]
|
||||
- Kayako import ignores closed cases that are older than 30 days [5376](https://github.com/zammad/zammad/issues/5376) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||
- Kayako import fails when post includes json-files as attachment [5375](https://github.com/zammad/zammad/issues/5375) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||
- Fetching mails with protonmail-bridge is not possible due to closed stream error [5361](https://github.com/zammad/zammad/issues/5361) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)]
|
||||
- Icons are not up to date [5310](https://github.com/zammad/zammad/issues/5310) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[frontend](https://github.com/zammad/zammad/labels/frontend)]
|
||||
- Fix behaviour of array values in CSV export/import [5362](https://github.com/zammad/zammad/issues/5362) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)]
|
||||
- Ticket creation with Send Email turns into Net::SMTPSyntaxError if customer has no email address [5308](https://github.com/zammad/zammad/issues/5308) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[ticket: create](https://github.com/zammad/zammad/labels/ticket%3A%20create)]
|
||||
- Apollo client returns an error about exceeding max complexity of the query [5353](https://github.com/zammad/zammad/issues/5353) [[bug](https://github.com/zammad/zammad/labels/bug)] [[📱mobile-view📱](https://github.com/zammad/zammad/labels/%F0%9F%93%B1mobile-view%F0%9F%93%B1)] [[graphql](https://github.com/zammad/zammad/labels/graphql)]
|
||||
- Data types are incorrect for Excel-exports [5358](https://github.com/zammad/zammad/issues/5358) [[bug](https://github.com/zammad/zammad/labels/bug)] [[export](https://github.com/zammad/zammad/labels/export)] [[excel](https://github.com/zammad/zammad/labels/excel)]
|
||||
- The save button is visible in the mobile ticket detail view for an not dirty form [5356](https://github.com/zammad/zammad/issues/5356) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[📱mobile-view📱](https://github.com/zammad/zammad/labels/%F0%9F%93%B1mobile-view%F0%9F%93%B1)] [[form](https://github.com/zammad/zammad/labels/form)]
|
||||
- S/MIME verification does not work when the mail does not contain the chain of certificates [5357](https://github.com/zammad/zammad/issues/5357) [[bug](https://github.com/zammad/zammad/labels/bug)] [[smime](https://github.com/zammad/zammad/labels/smime)]
|
||||
- Cannot create ticket if ticket attribute called "scope" is used [5221](https://github.com/zammad/zammad/issues/5221) [[bug](https://github.com/zammad/zammad/labels/bug)] [[object manager attribute](https://github.com/zammad/zammad/labels/object%20manager%20attribute)]
|
||||
- Tags are not visible in the admin interface under Admin > Manage > Tags [5206](https://github.com/zammad/zammad/issues/5206) [[bug](https://github.com/zammad/zammad/labels/bug)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)]
|
||||
- Admin -> Reports - Translation in French - bad escaping of quote characters [5348](https://github.com/zammad/zammad/issues/5348) [[bug](https://github.com/zammad/zammad/labels/bug)] [[translation](https://github.com/zammad/zammad/labels/translation)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
- WhatsApp Business channel is not flagged with error state in case of permanent errors [5352](https://github.com/zammad/zammad/issues/5352) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[whatsapp](https://github.com/zammad/zammad/labels/whatsapp)]
|
||||
- Object custom attributes - Bad render on admin [5204](https://github.com/zammad/zammad/issues/5204) [[bug](https://github.com/zammad/zammad/labels/bug)] [[object manager attribute](https://github.com/zammad/zammad/labels/object%20manager%20attribute)] [[form](https://github.com/zammad/zammad/labels/form)]
|
||||
- Display Issue - empty article and missing picture when sending multiple pictures over WhatsApp to Zammad [5163](https://github.com/zammad/zammad/issues/5163) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[whatsapp](https://github.com/zammad/zammad/labels/whatsapp)]
|
||||
- Duplicate articles created when sending multiple pictures over WhatsApp [5164](https://github.com/zammad/zammad/issues/5164) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[whatsapp](https://github.com/zammad/zammad/labels/whatsapp)]
|
||||
- Updated by information gets overwritten by handling of 'Sent' event in a WhatsApp Business ticket [5187](https://github.com/zammad/zammad/issues/5187) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[ticket: actions](https://github.com/zammad/zammad/labels/ticket%3A%20actions)] [[whatsapp](https://github.com/zammad/zammad/labels/whatsapp)]
|
||||
- Triggers and schedulers continue to send mails, even if an inactive mailbox is used for this purpose [5201](https://github.com/zammad/zammad/issues/5201) [[bug](https://github.com/zammad/zammad/labels/bug)] [[trigger](https://github.com/zammad/zammad/labels/trigger)] [[scheduler](https://github.com/zammad/zammad/labels/scheduler)]
|
||||
- "Show Search Details" is not translated on language change [5350](https://github.com/zammad/zammad/issues/5350) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Saved organization selection in ticket create screen is not restored properly [5347](https://github.com/zammad/zammad/issues/5347) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[organization](https://github.com/zammad/zammad/labels/organization)] [[ticket: create](https://github.com/zammad/zammad/labels/ticket%3A%20create)]
|
||||
- Marking text is not possible anymore with shift+left [5337](https://github.com/zammad/zammad/issues/5337) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Admin + Profile - Translation in French - bad escaping of quote characters [5346](https://github.com/zammad/zammad/issues/5346) [[bug](https://github.com/zammad/zammad/labels/bug)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
- Changing roles with big group mapping takes very long even if there are no changes [5343](https://github.com/zammad/zammad/issues/5343) [[bug](https://github.com/zammad/zammad/labels/bug)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)] [[performance](https://github.com/zammad/zammad/labels/performance)]
|
||||
- Wrong encoding for ticket state name in ticket overview [5342](https://github.com/zammad/zammad/issues/5342) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)]
|
||||
- Password validation errors containing %s are not interpolated [5327](https://github.com/zammad/zammad/issues/5327) [[bug](https://github.com/zammad/zammad/labels/bug)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
- Inactive customers continue to receive trigger mails when agents update the ticket [4665](https://github.com/zammad/zammad/issues/4665) [[bug](https://github.com/zammad/zammad/labels/bug)] [[trigger](https://github.com/zammad/zammad/labels/trigger)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
|
||||
- Impossible to remove/change user organization, without clicking in the field first [5339](https://github.com/zammad/zammad/issues/5339) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Several admin permissions cannot be assigned or do not work properly [5328](https://github.com/zammad/zammad/issues/5328) [[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)]
|
||||
- Customer is member of Organization and Secondary Organization, tabbing through fields gives error Organization is required [5335](https://github.com/zammad/zammad/issues/5335) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)]
|
||||
- ObjectAttribute of type Date is displayed one day off when client computer's timezone changes [4998](https://github.com/zammad/zammad/issues/4998) [[bug](https://github.com/zammad/zammad/labels/bug)] [[frontend](https://github.com/zammad/zammad/labels/frontend)] [[object manager attribute](https://github.com/zammad/zammad/labels/object%20manager%20attribute)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
- Time Accounting: Repeatedly pressing Enter duplicates the article [5326](https://github.com/zammad/zammad/issues/5326) [[bug](https://github.com/zammad/zammad/labels/bug)] [[time accounting](https://github.com/zammad/zammad/labels/time%20accounting)]
|
||||
- MS365 failing to send articles when mail headers too long [5334](https://github.com/zammad/zammad/issues/5334) [[bug](https://github.com/zammad/zammad/labels/bug)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)]
|
||||
- Values can be changed via keyboard tabbing when the field is read-only [5324](https://github.com/zammad/zammad/issues/5324) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)]
|
||||
- Import as / email archive import no longer triggered [4010](https://github.com/zammad/zammad/issues/4010) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)]
|
||||
- packager post install script enforce_redis() regex check fails on valid redis urls [5331](https://github.com/zammad/zammad/issues/5331) [[bug](https://github.com/zammad/zammad/labels/bug)] [[install](https://github.com/zammad/zammad/labels/install)]
|
||||
- Conflict with the extended follow-up detection - which cannot be deactivated [5286](https://github.com/zammad/zammad/issues/5286) [[bug](https://github.com/zammad/zammad/labels/bug)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)]
|
||||
- Content of checklist items breaks strangely [5329](https://github.com/zammad/zammad/issues/5329) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[ticket: checklist](https://github.com/zammad/zammad/labels/ticket%3A%20checklist)]
|
||||
- Checklist badge counter does not update when linked tickets change state. [5319](https://github.com/zammad/zammad/issues/5319) [[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)]
|
||||
- Checklist: circle is not aligned correctly on long ticket titles [5321](https://github.com/zammad/zammad/issues/5321) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[ticket: checklist](https://github.com/zammad/zammad/labels/ticket%3A%20checklist)]
|
||||
- Scrollbars are rendered always in the light mode [5322](https://github.com/zammad/zammad/issues/5322) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[dark mode](https://github.com/zammad/zammad/labels/dark%20mode)]
|
||||
- Zammad not handling X-Forward-For that is a list [5317](https://github.com/zammad/zammad/issues/5317)
|
||||
- Several problems with postinstall script's function `enforce_redis ()` [5269](https://github.com/zammad/zammad/issues/5269) [[bug](https://github.com/zammad/zammad/labels/bug)] [[install](https://github.com/zammad/zammad/labels/install)]
|
||||
- Unprocessible mail output for mails with missing from should have a specific output [4826](https://github.com/zammad/zammad/issues/4826) [[bug](https://github.com/zammad/zammad/labels/bug)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)]
|
||||
- Make errors on mail sending failures more readable [5261](https://github.com/zammad/zammad/issues/5261) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[frontend](https://github.com/zammad/zammad/labels/frontend)]
|
||||
- Read only Ticket attribute can not be copied properly [5172](https://github.com/zammad/zammad/issues/5172) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Created trigger can not be edited [5298](https://github.com/zammad/zammad/issues/5298) [[bug](https://github.com/zammad/zammad/labels/bug)] [[trigger](https://github.com/zammad/zammad/labels/trigger)]
|
||||
- New keyboard shortcut "t" superseds 'new tab' in some browsers [5312](https://github.com/zammad/zammad/issues/5312) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)]
|
||||
- "Same Subject & References" follow-up detection only works with "RE: some subject" but not with "FWD: some subject" [5287](https://github.com/zammad/zammad/issues/5287) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Avatar is not clickable on tablet devices or devices in tablet modus [4745](https://github.com/zammad/zammad/issues/4745) [[bug](https://github.com/zammad/zammad/labels/bug)] [[mobile-native](https://github.com/zammad/zammad/labels/mobile-native)] [[frontend](https://github.com/zammad/zammad/labels/frontend)]
|
||||
- Translation - Not translated string [5202](https://github.com/zammad/zammad/issues/5202) [[bug](https://github.com/zammad/zammad/labels/bug)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)] [[good first issue](https://github.com/zammad/zammad/labels/good%20first%20issue)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
- "Option" button is labeled "Alt" in shortcut overlay with MacOS [4324](https://github.com/zammad/zammad/issues/4324) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[good first issue](https://github.com/zammad/zammad/labels/good%20first%20issue)]
|
||||
- Microsoft 365 & Google channel ignore Proxy configuration for token refresh / verify [3839](https://github.com/zammad/zammad/issues/3839) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)]
|
||||
- Unprocessable mails that also match a `PostmasterFilter` with the action `{"x-zammad-ignore"=>{"value"=>true}` don't get deleted upon reprocessing [5049](https://github.com/zammad/zammad/issues/5049) [[bug](https://github.com/zammad/zammad/labels/bug)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)] [[postmaster filter](https://github.com/zammad/zammad/labels/postmaster%20filter)]
|
||||
- Gitlab/Github UI loses links when they are renamed [5015](https://github.com/zammad/zammad/issues/5015) [[bug](https://github.com/zammad/zammad/labels/bug)] [[integration](https://github.com/zammad/zammad/labels/integration)]
|
||||
- Translators can destroy the whole UI by wrong format translations [5223](https://github.com/zammad/zammad/issues/5223) [[bug](https://github.com/zammad/zammad/labels/bug)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
- Popup message is not translated [5299](https://github.com/zammad/zammad/issues/5299) [[bug](https://github.com/zammad/zammad/labels/bug)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
- Group hierarchy is not shown while creating a new ticket as a customer [5301](https://github.com/zammad/zammad/issues/5301) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket: create](https://github.com/zammad/zammad/labels/ticket%3A%20create)]
|
||||
- Download from integrated reporting: Missing criteria: last_close_at [5158](https://github.com/zammad/zammad/issues/5158) [[bug](https://github.com/zammad/zammad/labels/bug)] [[reporting](https://github.com/zammad/zammad/labels/reporting)]
|
||||
- Placetel Integration does not end the call [5233](https://github.com/zammad/zammad/issues/5233) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- UserAgent lib does not return a `response.body` for `Net::HTTPClientError` and `Net::HTTPNotFound`. [5304](https://github.com/zammad/zammad/issues/5304) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core](https://github.com/zammad/zammad/labels/core)]
|
||||
- Empty SMS are not allowed [5289](https://github.com/zammad/zammad/issues/5289) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)]
|
||||
- Bad data serialization for JSON database columns [5249](https://github.com/zammad/zammad/issues/5249) [[bug](https://github.com/zammad/zammad/labels/bug)] [[smime](https://github.com/zammad/zammad/labels/smime)]
|
||||
- LDAP role assignment fails when more than 1500 users are part of an active directory group [3634](https://github.com/zammad/zammad/issues/3634) [[bug](https://github.com/zammad/zammad/labels/bug)] [[LDAP](https://github.com/zammad/zammad/labels/LDAP)]
|
||||
- It takes two clicks to show all groups when creating a new ticket [5280](https://github.com/zammad/zammad/issues/5280) [[bug](https://github.com/zammad/zammad/labels/bug)] [[permission](https://github.com/zammad/zammad/labels/permission)] [[ticket: create](https://github.com/zammad/zammad/labels/ticket%3A%20create)]
|
||||
- Untranslated error message in /object_manager [5276](https://github.com/zammad/zammad/issues/5276) [[bug](https://github.com/zammad/zammad/labels/bug)] [[translation](https://github.com/zammad/zammad/labels/translation)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
- Admin password authentication is not possible when 2FA is enabled [5283](https://github.com/zammad/zammad/issues/5283) [[bug](https://github.com/zammad/zammad/labels/bug)] [[authentication](https://github.com/zammad/zammad/labels/authentication)]
|
||||
- Knowledge base search result order is wrong with ES backend [5099](https://github.com/zammad/zammad/issues/5099) [[bug](https://github.com/zammad/zammad/labels/bug)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)] [[VoteSup](https://github.com/zammad/zammad/labels/VoteSup)]
|
||||
- heavy group usage freezes app on user update with many ticket creates open [5282](https://github.com/zammad/zammad/issues/5282) [[bug](https://github.com/zammad/zammad/labels/bug)] [[performance](https://github.com/zammad/zammad/labels/performance)] [[ticket: create](https://github.com/zammad/zammad/labels/ticket%3A%20create)]
|
||||
- Public KB header gets broken if logo is wide [5264](https://github.com/zammad/zammad/issues/5264) [[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)]
|
||||
- SSL verification with SAML fails with valid Let's Encrypt certificates [5106](https://github.com/zammad/zammad/issues/5106) [[bug](https://github.com/zammad/zammad/labels/bug)] [[SAML](https://github.com/zammad/zammad/labels/SAML)]
|
||||
- Activating preserve symlinks option fails the build every time [5273](https://github.com/zammad/zammad/issues/5273) [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||
- Mail filter logs "contains not" instead of "contains" [5271](https://github.com/zammad/zammad/issues/5271) [[bug](https://github.com/zammad/zammad/labels/bug)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)]
|
||||
- Inactive Ticket States selectable in Mobile View [5268](https://github.com/zammad/zammad/issues/5268) [[bug](https://github.com/zammad/zammad/labels/bug)] [[object manager attribute](https://github.com/zammad/zammad/labels/object%20manager%20attribute)] [[ticket: state](https://github.com/zammad/zammad/labels/ticket%3A%20state)]
|
||||
- Inline images in outgoing mails break HTML structure [5258](https://github.com/zammad/zammad/issues/5258) [[bug](https://github.com/zammad/zammad/labels/bug)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)]
|
||||
- Webhook custom payload parser does not accept digits within placeholders [5265](https://github.com/zammad/zammad/issues/5265) [[bug](https://github.com/zammad/zammad/labels/bug)] [[webhooks](https://github.com/zammad/zammad/labels/webhooks)]
|
||||
- "last_close_at" is visible in Core Workflows [5245](https://github.com/zammad/zammad/issues/5245) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core%20workflows)]
|
||||
- Overview is not refreshing [5260](https://github.com/zammad/zammad/issues/5260) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[overviews](https://github.com/zammad/zammad/labels/overviews)]
|
||||
- Email notifications sending will be aborted mid-list if SMTP error code is received [2133](https://github.com/zammad/zammad/issues/2133) [[bug](https://github.com/zammad/zammad/labels/bug)] [[notification](https://github.com/zammad/zammad/labels/notification)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)]
|
||||
- Shared drafts are not applied in a consistent manner in the ticket create screen [5244](https://github.com/zammad/zammad/issues/5244) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[draft sharing](https://github.com/zammad/zammad/labels/draft%20sharing)] [[ticket: create](https://github.com/zammad/zammad/labels/ticket%3A%20create)]
|
||||
- Scheduler - Translation in French - bad escaping of quote characters on one string [5242](https://github.com/zammad/zammad/issues/5242) [[bug](https://github.com/zammad/zammad/labels/bug)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
- Duplicated article after bulk action was executed for newly created tickets without a browser refresh in between [3568](https://github.com/zammad/zammad/issues/3568) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Bulk action form broken on high resolutions [5217](https://github.com/zammad/zammad/issues/5217) [[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)]
|
||||
- Information about remote images is lost/not displayed in Zammad [5193](https://github.com/zammad/zammad/issues/5193) [[bug](https://github.com/zammad/zammad/labels/bug)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)]
|
||||
- Zammads HTML wrapper should not set a semikolon [5234](https://github.com/zammad/zammad/issues/5234) [[bug](https://github.com/zammad/zammad/labels/bug)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)]
|
||||
- Wrong app restart command output [5231](https://github.com/zammad/zammad/issues/5231) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)]
|
||||
- After the upgrade to Zammad 6.3, a lot of translations are displayed as "modified" in the new translation dialog [5189](https://github.com/zammad/zammad/issues/5189) [[bug](https://github.com/zammad/zammad/labels/bug)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
- Notification emails about mails sent from Exchange with inline images are displayed in a compressed long line in e-mail client [5222](https://github.com/zammad/zammad/issues/5222) [[bug](https://github.com/zammad/zammad/labels/bug)] [[notification](https://github.com/zammad/zammad/labels/notification)]
|
||||
- Configuration screen of triggers do not pop up [5196](https://github.com/zammad/zammad/issues/5196) [[bug](https://github.com/zammad/zammad/labels/bug)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)] [[trigger](https://github.com/zammad/zammad/labels/trigger)] [[permission](https://github.com/zammad/zammad/labels/permission)] [[calendar](https://github.com/zammad/zammad/labels/calendar)]
|
||||
- "Article Text as HTML" variable is missing when using "::" in the body of an email in a trigger [5200](https://github.com/zammad/zammad/issues/5200) [[bug](https://github.com/zammad/zammad/labels/bug)] [[text modules](https://github.com/zammad/zammad/labels/text%20modules)] [[variable processing](https://github.com/zammad/zammad/labels/variable%20processing)]
|
||||
- Translation in French - bad escaping of quote characters on one string [5203](https://github.com/zammad/zammad/issues/5203) [[bug](https://github.com/zammad/zammad/labels/bug)] [[admin area](https://github.com/zammad/zammad/labels/admin%20area)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
- Inconsistent tagging behaviour in ticket create vs. ticket edit [4869](https://github.com/zammad/zammad/issues/4869) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[frontend](https://github.com/zammad/zammad/labels/frontend)] [[ticket: create](https://github.com/zammad/zammad/labels/ticket%3A%20create)]
|
||||
- API 301 redirection when accessing through HTTP [5211](https://github.com/zammad/zammad/issues/5211) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Consistent capitalization for WhatsApp [5210](https://github.com/zammad/zammad/pull/5210)
|
||||
- Tables (spreadsheets) in articles are cut off in Zammad UI [4960](https://github.com/zammad/zammad/issues/4960) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)]
|
||||
- External data source search gets stuck when it is added as a condition or an action [5148](https://github.com/zammad/zammad/issues/5148) [[bug](https://github.com/zammad/zammad/labels/bug)] [[trigger](https://github.com/zammad/zammad/labels/trigger)] [[object manager attribute](https://github.com/zammad/zammad/labels/object%20manager%20attribute)]
|
||||
- ".value" in text modules is not working [5116](https://github.com/zammad/zammad/issues/5116) [[bug](https://github.com/zammad/zammad/labels/bug)] [[frontend](https://github.com/zammad/zammad/labels/frontend)] [[variable processing](https://github.com/zammad/zammad/labels/variable%20processing)]
|
||||
- Transparent image is displayed incorrect [4769](https://github.com/zammad/zammad/issues/4769) [[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)]
|
||||
- Exchange token refresh still applied even on inactive Exchange integration [4961](https://github.com/zammad/zammad/issues/4961) [[bug](https://github.com/zammad/zammad/labels/bug)] [[integration](https://github.com/zammad/zammad/labels/integration)] [[background worker](https://github.com/zammad/zammad/labels/background%20worker)] [[monitoring](https://github.com/zammad/zammad/labels/monitoring)]
|
||||
- Copied ticket title text/handle in dark-mode into article is rendered in white color [4944](https://github.com/zammad/zammad/issues/4944) [[bug](https://github.com/zammad/zammad/labels/bug)] [[frontend](https://github.com/zammad/zammad/labels/frontend)] [[text editor](https://github.com/zammad/zammad/labels/text%20editor)]
|
||||
- Add support for new tech stack on package installation [5190](https://github.com/zammad/zammad/issues/5190) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Size of inline images in mails from Zammad are not shown correctly in Microsoft mail clients [4691](https://github.com/zammad/zammad/issues/4691) [[bug](https://github.com/zammad/zammad/labels/bug)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)] [[collaboration](https://github.com/zammad/zammad/labels/collaboration)]
|
||||
- Special characters in a ticket title are escaped if the title is updated by a Trigger [5108](https://github.com/zammad/zammad/issues/5108) [[bug](https://github.com/zammad/zammad/labels/bug)] [[trigger](https://github.com/zammad/zammad/labels/trigger)] [[variable processing](https://github.com/zammad/zammad/labels/variable%20processing)]
|
||||
- Setting datetime attributes with macros is not working [4905](https://github.com/zammad/zammad/issues/4905) [[bug](https://github.com/zammad/zammad/labels/bug)] [[macros](https://github.com/zammad/zammad/labels/macros)]
|
||||
- Webhook custom payload not support complex object attribute values [5060](https://github.com/zammad/zammad/issues/5060) [[bug](https://github.com/zammad/zammad/labels/bug)] [[object manager attribute](https://github.com/zammad/zammad/labels/object%20manager%20attribute)] [[webhooks](https://github.com/zammad/zammad/labels/webhooks)]
|
||||
- No possibility to export merged tickets in reports [4924](https://github.com/zammad/zammad/issues/4924) [[bug](https://github.com/zammad/zammad/labels/bug)] [[reporting](https://github.com/zammad/zammad/labels/reporting)]
|
||||
- Align the mail client behavior for <title> tag with Zammad [4583](https://github.com/zammad/zammad/issues/4583) [[bug](https://github.com/zammad/zammad/labels/bug)] [[mail processing](https://github.com/zammad/zammad/labels/mail%20processing)]
|
||||
- `Mail::AddressList can not parse` error when S/MIME or PGP integration is active [5178](https://github.com/zammad/zammad/issues/5178) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- After Znuny import in Zammad: Users without a valid email address gives an 500 error in Zammad when creating a new mail [5166](https://github.com/zammad/zammad/issues/5166) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[import](https://github.com/zammad/zammad/labels/import)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||
- Many new tickets for one customer leads to massive requests to ticket_customer endpoint [5173](https://github.com/zammad/zammad/issues/5173) [[bug](https://github.com/zammad/zammad/labels/bug)] [[performance](https://github.com/zammad/zammad/labels/performance)]
|
||||
- Ticket history shows html when updating articles [5168](https://github.com/zammad/zammad/issues/5168) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- contrib/packager.io/preinstall.sh does not check the db adapter setting and fails if both psql and mysql are installed [5142](https://github.com/zammad/zammad/issues/5142) [[needs verification](https://github.com/zammad/zammad/labels/needs%20verification)]
|
||||
- fixes #5142| fix db check in preinstall.sh [5143](https://github.com/zammad/zammad/pull/5143)
|
||||
- Public Knowledge Base Bread crumbs unexpectly translated [5145](https://github.com/zammad/zammad/issues/5145) [[bug](https://github.com/zammad/zammad/labels/bug)] [[translation](https://github.com/zammad/zammad/labels/translation)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)]
|
||||
- Ticket templates creation interface is broken if a Ticket attribute has a lengthy name. [5000](https://github.com/zammad/zammad/issues/5000) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Token without expiration timestamp expires "01/01/1970" [478](https://github.com/zammad/zammad/issues/478) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- [CTI] Caller is not identified if the caller has only entered a telephone number (no firstname, lastname, email). [5117](https://github.com/zammad/zammad/issues/5117) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- ".value" in text modules for external data sources breaks ticket zoom [5115](https://github.com/zammad/zammad/issues/5115) [[bug](https://github.com/zammad/zammad/labels/bug)] [[frontend](https://github.com/zammad/zammad/labels/frontend)] [[variable processing](https://github.com/zammad/zammad/labels/variable%20processing)]
|
||||
- Wrong background color for ticket creation links in light mode [5144](https://github.com/zammad/zammad/issues/5144) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX%2FUI)]
|
||||
- Fetching LdapSource for unknown users fails [5101](https://github.com/zammad/zammad/issues/5101) [[bug](https://github.com/zammad/zammad/labels/bug)] [[LDAP](https://github.com/zammad/zammad/labels/LDAP)]
|
||||
- Unable to send WhatsApp automatic reminders after 23 hours [5139](https://github.com/zammad/zammad/issues/5139) [[bug](https://github.com/zammad/zammad/labels/bug)] [[translation](https://github.com/zammad/zammad/labels/translation)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
- Settings cache is applied for 24 hours after the last change only [5134](https://github.com/zammad/zammad/issues/5134) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Massenversand send error exception [5120](https://github.com/zammad/zammad/issues/5120) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Wrong Setting value is broadcasted if interpolation is used [5133](https://github.com/zammad/zammad/issues/5133) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||
- Reporting: Worse performance because UI always request all aggregation data instead of the selection [5138](https://github.com/zammad/zammad/issues/5138) [[bug](https://github.com/zammad/zammad/labels/bug)] [[reporting](https://github.com/zammad/zammad/labels/reporting)] [[performance](https://github.com/zammad/zammad/labels/performance)]
|
||||
- Reporting: No button and output when no tickets found in a time range [5137](https://github.com/zammad/zammad/issues/5137) [[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)]
|
||||
- Once applied kb editor permissions cannot be revoked [5123](https://github.com/zammad/zammad/issues/5123) [[bug](https://github.com/zammad/zammad/labels/bug)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge%20base)]
|
||||
- Duplicates in calendar [5076](https://github.com/zammad/zammad/issues/5076) [[bug](https://github.com/zammad/zammad/labels/bug)] [[calendar](https://github.com/zammad/zammad/labels/calendar)]
|
||||
- Using the greater than symbol in group names displays the hmtl code instead of the symbol [5121](https://github.com/zammad/zammad/issues/5121) [[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)]
|
||||
- Translation in French - bad escaping of quote characters on some strings [5095](https://github.com/zammad/zammad/issues/5095) [[bug](https://github.com/zammad/zammad/labels/bug)] [[localization](https://github.com/zammad/zammad/labels/localization)]
|
||||
- Article notes text is greyed out [5118](https://github.com/zammad/zammad/issues/5118) [[bug](https://github.com/zammad/zammad/labels/bug)] [[frontend](https://github.com/zammad/zammad/labels/frontend)]
|
||||
- When an update via API fails, a notification is send to the agents that the change was made [4834](https://github.com/zammad/zammad/issues/4834) [[bug](https://github.com/zammad/zammad/labels/bug)] [[API](https://github.com/zammad/zammad/labels/API)] [[trigger](https://github.com/zammad/zammad/labels/trigger)] [[notification](https://github.com/zammad/zammad/labels/notification)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[webhooks](https://github.com/zammad/zammad/labels/webhooks)]
|
||||
- OTRS import: When importing queues with a parent queue to Zammad the migration then stops [5114](https://github.com/zammad/zammad/issues/5114) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)] [[VoteSup](https://github.com/zammad/zammad/labels/VoteSup)]
|
||||
- Email Channel cannot update XOauth2 token if identical channel exists [5111](https://github.com/zammad/zammad/issues/5111) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)]
|
||||
- #{user.avatar}-size ignored in mobile-view [5096](https://github.com/zammad/zammad/issues/5096) [[bug](https://github.com/zammad/zammad/labels/bug)] [[frontend](https://github.com/zammad/zammad/labels/frontend)] [[📱mobile-view📱](https://github.com/zammad/zammad/labels/%F0%9F%93%B1mobile-view%F0%9F%93%B1)] [[form](https://github.com/zammad/zammad/labels/form)]
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
FROM node:20-slim AS node
|
||||
RUN npm -g install pnpm
|
||||
FROM node:20-bookworm-slim AS node
|
||||
RUN npm -g install corepack && corepack enable pnpm
|
||||
RUN rm /usr/local/bin/yarn /usr/local/bin/yarnpkg
|
||||
|
||||
|
||||
FROM ruby:3.2.4-slim AS builder
|
||||
FROM ruby:3.2.4-slim-bookworm AS builder
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
ARG RAILS_ENV=production
|
||||
ARG ZAMMAD_DIR=/opt/zammad
|
||||
@@ -17,7 +17,7 @@ RUN contrib/docker/setup.sh builder
|
||||
|
||||
# note: zammad is currently incompatible to alpine because of:
|
||||
# https://github.com/docker-library/ruby/issues/113
|
||||
FROM ruby:3.2.4-slim
|
||||
FROM ruby:3.2.4-slim-bookworm
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
ARG ZAMMAD_USER=zammad
|
||||
ENV RAILS_ENV=production
|
||||
|
||||
9
Gemfile
9
Gemfile
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
source 'https://rubygems.org'
|
||||
|
||||
@@ -63,6 +63,13 @@ gem 'vite_rails'
|
||||
# asset handling - config.assets for pipeline
|
||||
gem 'sprockets-rails'
|
||||
|
||||
# Workaround
|
||||
# Explicitly specify nokogiri, even though it is an internal Rails dependency
|
||||
# to work around issues with precompiled versions not running on RHEL 8 any more.
|
||||
# See https://github.com/sparklemotion/nokogiri/issues/3399.
|
||||
# Consider removing this again after CentOS 8 support was dropped.
|
||||
gem 'nokogiri', force_ruby_platform: true
|
||||
|
||||
# Only load gems for asset compilation if they are needed to avoid
|
||||
# having unneeded runtime dependencies like NodeJS.
|
||||
group :assets do
|
||||
|
||||
148
Gemfile.lock
148
Gemfile.lock
@@ -33,35 +33,35 @@ GEM
|
||||
simple_po_parser (~> 1.1.6)
|
||||
aasm (5.5.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
actioncable (7.1.4)
|
||||
actionpack (= 7.1.4)
|
||||
activesupport (= 7.1.4)
|
||||
actioncable (7.1.5.1)
|
||||
actionpack (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
nio4r (~> 2.0)
|
||||
websocket-driver (>= 0.6.1)
|
||||
zeitwerk (~> 2.6)
|
||||
actionmailbox (7.1.4)
|
||||
actionpack (= 7.1.4)
|
||||
activejob (= 7.1.4)
|
||||
activerecord (= 7.1.4)
|
||||
activestorage (= 7.1.4)
|
||||
activesupport (= 7.1.4)
|
||||
actionmailbox (7.1.5.1)
|
||||
actionpack (= 7.1.5.1)
|
||||
activejob (= 7.1.5.1)
|
||||
activerecord (= 7.1.5.1)
|
||||
activestorage (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
mail (>= 2.7.1)
|
||||
net-imap
|
||||
net-pop
|
||||
net-smtp
|
||||
actionmailer (7.1.4)
|
||||
actionpack (= 7.1.4)
|
||||
actionview (= 7.1.4)
|
||||
activejob (= 7.1.4)
|
||||
activesupport (= 7.1.4)
|
||||
actionmailer (7.1.5.1)
|
||||
actionpack (= 7.1.5.1)
|
||||
actionview (= 7.1.5.1)
|
||||
activejob (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
net-imap
|
||||
net-pop
|
||||
net-smtp
|
||||
rails-dom-testing (~> 2.2)
|
||||
actionpack (7.1.4)
|
||||
actionview (= 7.1.4)
|
||||
activesupport (= 7.1.4)
|
||||
actionpack (7.1.5.1)
|
||||
actionview (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
nokogiri (>= 1.8.5)
|
||||
racc
|
||||
rack (>= 2.2.4)
|
||||
@@ -69,27 +69,27 @@ GEM
|
||||
rack-test (>= 0.6.3)
|
||||
rails-dom-testing (~> 2.2)
|
||||
rails-html-sanitizer (~> 1.6)
|
||||
actiontext (7.1.4)
|
||||
actionpack (= 7.1.4)
|
||||
activerecord (= 7.1.4)
|
||||
activestorage (= 7.1.4)
|
||||
activesupport (= 7.1.4)
|
||||
actiontext (7.1.5.1)
|
||||
actionpack (= 7.1.5.1)
|
||||
activerecord (= 7.1.5.1)
|
||||
activestorage (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
globalid (>= 0.6.0)
|
||||
nokogiri (>= 1.8.5)
|
||||
actionview (7.1.4)
|
||||
activesupport (= 7.1.4)
|
||||
actionview (7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
builder (~> 3.1)
|
||||
erubi (~> 1.11)
|
||||
rails-dom-testing (~> 2.2)
|
||||
rails-html-sanitizer (~> 1.6)
|
||||
activejob (7.1.4)
|
||||
activesupport (= 7.1.4)
|
||||
activejob (7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
globalid (>= 0.3.6)
|
||||
activemodel (7.1.4)
|
||||
activesupport (= 7.1.4)
|
||||
activerecord (7.1.4)
|
||||
activemodel (= 7.1.4)
|
||||
activesupport (= 7.1.4)
|
||||
activemodel (7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
activerecord (7.1.5.1)
|
||||
activemodel (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
timeout (>= 0.4.0)
|
||||
activerecord-import (1.8.1)
|
||||
activerecord (>= 4.2)
|
||||
@@ -100,21 +100,24 @@ GEM
|
||||
multi_json (~> 1.11, >= 1.11.2)
|
||||
rack (>= 2.0.8, < 4)
|
||||
railties (>= 6.1)
|
||||
activestorage (7.1.4)
|
||||
actionpack (= 7.1.4)
|
||||
activejob (= 7.1.4)
|
||||
activerecord (= 7.1.4)
|
||||
activesupport (= 7.1.4)
|
||||
activestorage (7.1.5.1)
|
||||
actionpack (= 7.1.5.1)
|
||||
activejob (= 7.1.5.1)
|
||||
activerecord (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
marcel (~> 1.0)
|
||||
activesupport (7.1.4)
|
||||
activesupport (7.1.5.1)
|
||||
base64
|
||||
benchmark (>= 0.3)
|
||||
bigdecimal
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
connection_pool (>= 2.2.5)
|
||||
drb
|
||||
i18n (>= 1.6, < 2)
|
||||
logger (>= 1.4.2)
|
||||
minitest (>= 5.1)
|
||||
mutex_m
|
||||
securerandom (>= 0.3)
|
||||
tzinfo (~> 2.0)
|
||||
acts_as_list (1.2.2)
|
||||
activerecord (>= 6.1)
|
||||
@@ -146,6 +149,7 @@ GEM
|
||||
aws-sigv4 (1.10.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
base64 (0.2.0)
|
||||
benchmark (0.3.0)
|
||||
bigdecimal (3.1.8)
|
||||
bindata (2.5.0)
|
||||
binding_of_caller (1.0.1)
|
||||
@@ -172,7 +176,7 @@ GEM
|
||||
regexp_parser (>= 1.5, < 3.0)
|
||||
xpath (~> 3.2)
|
||||
cbor (0.5.9.8)
|
||||
cgi (0.4.1)
|
||||
cgi (0.4.2)
|
||||
childprocess (5.1.0)
|
||||
logger (~> 1.5)
|
||||
chunky_png (1.4.0)
|
||||
@@ -275,7 +279,7 @@ GEM
|
||||
gli (2.21.5)
|
||||
globalid (1.2.1)
|
||||
activesupport (>= 6.1)
|
||||
graphql (2.3.16)
|
||||
graphql (2.3.22)
|
||||
base64
|
||||
fiber-storage
|
||||
graphql-batch (0.6.0)
|
||||
@@ -315,7 +319,7 @@ GEM
|
||||
iniparse (1.5.0)
|
||||
interception (0.5)
|
||||
io-console (0.7.2)
|
||||
irb (1.14.0)
|
||||
irb (1.14.1)
|
||||
rdoc (>= 4.0.0)
|
||||
reline (>= 0.4.2)
|
||||
jmespath (1.6.2)
|
||||
@@ -338,7 +342,7 @@ GEM
|
||||
logging (2.4.0)
|
||||
little-plugger (~> 1.1)
|
||||
multi_json (~> 1.14)
|
||||
loofah (2.22.0)
|
||||
loofah (2.23.1)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.12.0)
|
||||
macaddr (1.7.2)
|
||||
@@ -360,8 +364,8 @@ GEM
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2024.1001)
|
||||
mini_mime (1.1.5)
|
||||
mini_portile2 (2.8.7)
|
||||
minitest (5.25.1)
|
||||
mini_portile2 (2.8.8)
|
||||
minitest (5.25.4)
|
||||
msgpack (1.7.2)
|
||||
multi_json (1.15.0)
|
||||
multi_xml (0.7.1)
|
||||
@@ -376,7 +380,7 @@ GEM
|
||||
time
|
||||
net-http (0.4.1)
|
||||
uri
|
||||
net-imap (0.4.16)
|
||||
net-imap (0.4.19)
|
||||
date
|
||||
net-protocol
|
||||
net-ldap (0.19.0)
|
||||
@@ -386,9 +390,9 @@ GEM
|
||||
timeout
|
||||
net-smtp (0.5.0)
|
||||
net-protocol
|
||||
nio4r (2.7.3)
|
||||
nio4r (2.7.4)
|
||||
nkf (0.2.0)
|
||||
nokogiri (1.16.7)
|
||||
nokogiri (1.18.5)
|
||||
mini_portile2 (~> 2.8.2)
|
||||
racc (~> 1.4)
|
||||
nori (2.7.1)
|
||||
@@ -495,7 +499,7 @@ GEM
|
||||
rspec-mocks (~> 3.12)
|
||||
rspec-support (~> 3.12)
|
||||
racc (1.8.1)
|
||||
rack (2.2.9)
|
||||
rack (2.2.13)
|
||||
rack-attack (6.7.0)
|
||||
rack (>= 1.0, < 4)
|
||||
rack-protection (3.2.0)
|
||||
@@ -510,20 +514,20 @@ GEM
|
||||
rackup (1.0.0)
|
||||
rack (< 3)
|
||||
webrick
|
||||
rails (7.1.4)
|
||||
actioncable (= 7.1.4)
|
||||
actionmailbox (= 7.1.4)
|
||||
actionmailer (= 7.1.4)
|
||||
actionpack (= 7.1.4)
|
||||
actiontext (= 7.1.4)
|
||||
actionview (= 7.1.4)
|
||||
activejob (= 7.1.4)
|
||||
activemodel (= 7.1.4)
|
||||
activerecord (= 7.1.4)
|
||||
activestorage (= 7.1.4)
|
||||
activesupport (= 7.1.4)
|
||||
rails (7.1.5.1)
|
||||
actioncable (= 7.1.5.1)
|
||||
actionmailbox (= 7.1.5.1)
|
||||
actionmailer (= 7.1.5.1)
|
||||
actionpack (= 7.1.5.1)
|
||||
actiontext (= 7.1.5.1)
|
||||
actionview (= 7.1.5.1)
|
||||
activejob (= 7.1.5.1)
|
||||
activemodel (= 7.1.5.1)
|
||||
activerecord (= 7.1.5.1)
|
||||
activestorage (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
bundler (>= 1.15.0)
|
||||
railties (= 7.1.4)
|
||||
railties (= 7.1.5.1)
|
||||
rails-controller-testing (1.0.5)
|
||||
actionpack (>= 5.0.1.rc1)
|
||||
actionview (>= 5.0.1.rc1)
|
||||
@@ -532,12 +536,12 @@ GEM
|
||||
activesupport (>= 5.0.0)
|
||||
minitest
|
||||
nokogiri (>= 1.6)
|
||||
rails-html-sanitizer (1.6.0)
|
||||
rails-html-sanitizer (1.6.1)
|
||||
loofah (~> 2.21)
|
||||
nokogiri (~> 1.14)
|
||||
railties (7.1.4)
|
||||
actionpack (= 7.1.4)
|
||||
activesupport (= 7.1.4)
|
||||
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
|
||||
railties (7.1.5.1)
|
||||
actionpack (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
irb
|
||||
rackup (>= 1.0.0)
|
||||
rake (>= 12.2)
|
||||
@@ -553,9 +557,9 @@ GEM
|
||||
psych (>= 4.0.0)
|
||||
redis (4.8.1)
|
||||
regexp_parser (2.9.2)
|
||||
reline (0.5.10)
|
||||
reline (0.5.12)
|
||||
io-console (~> 0.5)
|
||||
rexml (3.3.8)
|
||||
rexml (3.4.1)
|
||||
rotp (6.3.0)
|
||||
rspec-core (3.13.1)
|
||||
rspec-support (~> 3.13.0)
|
||||
@@ -616,7 +620,7 @@ GEM
|
||||
rubocop (~> 1.61)
|
||||
rubocop-rspec (~> 3, >= 3.0.1)
|
||||
ruby-progressbar (1.13.0)
|
||||
ruby-saml (1.17.0)
|
||||
ruby-saml (1.18.0)
|
||||
nokogiri (>= 1.13.10)
|
||||
rexml
|
||||
rubyntlm (0.6.5)
|
||||
@@ -635,6 +639,7 @@ GEM
|
||||
sprockets (>= 2.8, < 4.0)
|
||||
sprockets-rails (>= 2.0, < 4.0)
|
||||
tilt (>= 1.1, < 3)
|
||||
securerandom (0.3.2)
|
||||
selenium-webdriver (4.25.0)
|
||||
base64 (~> 0.2)
|
||||
logger (~> 1.4)
|
||||
@@ -665,7 +670,7 @@ GEM
|
||||
actionpack (>= 6.1)
|
||||
activesupport (>= 6.1)
|
||||
sprockets (>= 3.0.0)
|
||||
stringio (3.1.1)
|
||||
stringio (3.1.2)
|
||||
systemu (2.6.5)
|
||||
tcr (0.4.0)
|
||||
telegram-bot-ruby (2.0.0)
|
||||
@@ -683,7 +688,7 @@ GEM
|
||||
tilt (2.4.0)
|
||||
time (0.4.0)
|
||||
date
|
||||
timeout (0.4.1)
|
||||
timeout (0.4.3)
|
||||
tpm-key_attestation (0.12.1)
|
||||
bindata (~> 2.4)
|
||||
openssl (> 2.0)
|
||||
@@ -708,7 +713,7 @@ GEM
|
||||
tzinfo-data (1.2024.2)
|
||||
tzinfo (>= 1.0.0)
|
||||
unicode-display_width (2.6.0)
|
||||
uri (0.13.1)
|
||||
uri (1.0.3)
|
||||
vcr (6.3.1)
|
||||
base64
|
||||
version_gem (1.1.4)
|
||||
@@ -820,6 +825,7 @@ DEPENDENCIES
|
||||
net-ldap
|
||||
net-pop
|
||||
net-smtp
|
||||
nokogiri
|
||||
oauth2
|
||||
omniauth-facebook
|
||||
omniauth-github
|
||||
|
||||
@@ -764,6 +764,11 @@
|
||||
"url": "",
|
||||
"license": "MIT"
|
||||
},
|
||||
"status-report.svg": {
|
||||
"author": "Zammad",
|
||||
"url": "",
|
||||
"license": "MIT"
|
||||
},
|
||||
"stopwatch.svg": {
|
||||
"author": "Zammad",
|
||||
"url": "",
|
||||
@@ -874,4 +879,4 @@
|
||||
"url": "",
|
||||
"license": "MIT"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,10 +11,10 @@ You're going to love Zammad!
|
||||
|
||||
## Status
|
||||
|
||||
- Toolchain:   [](https://docs.zammad.org)
|
||||
- Toolchain: [](https://github.com/zammad/zammad/actions/workflows/ci.yaml) [](https://github.com/zammad/zammad/actions/workflows/docker-release.yaml) [](https://docs.zammad.org)
|
||||
- Docker container images: [](https://hub.docker.com/r/zammad/zammad-docker-compose) [](https://hub.docker.com/r/zammad/zammad-docker-compose/)
|
||||
- Helm chart for Kubernetes: [](https://artifacthub.io/packages/helm/zammad/zammad) [](https://github.com/zammad/zammad-helm/releases)
|
||||
- Download DEB/RPM: [](https://packager.io/gh/zammad/zammad/refs/stable) [](https://packager.io/gh/zammad/zammad/refs/develop)
|
||||
- Docker container images: [](https://hub.docker.com/r/zammad/zammad-docker-compose)
|
||||
- Helm chart for Kubernetes: [](https://artifacthub.io/packages/helm/zammad/zammad)
|
||||
- License: [](https://github.com/zammad/zammad/blob/develop/LICENSE)
|
||||
|
||||
## Installing & Getting Started
|
||||
|
||||
2
Rakefile
2
Rakefile
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env rake
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
|
||||
# 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.
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
|
||||
| Version | Supported |
|
||||
| -------- | ------------------ |
|
||||
| 6.3.x | :white_check_mark: |
|
||||
| <= 6.2.x | :x: |
|
||||
| 6.4.x | :white_check_mark: |
|
||||
| <= 6.3.x | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
|
||||
# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
|
||||
App.Config.set('api_path', 'api/v1')
|
||||
App.Config.set('image_path', '/assets/images')
|
||||
|
||||
@@ -145,6 +145,8 @@ class ProfileAvatar extends App.ControllerSubContent
|
||||
|
||||
reader.readAsDataURL(@)
|
||||
|
||||
@fileInput.val('')
|
||||
|
||||
App.Config.set('Avatar', { prio: 1100, name: __('Avatar'), parent: '#profile', target: '#profile/avatar', controller: ProfileAvatar, permission: ['user_preferences.avatar'] }, 'NavBarProfile')
|
||||
|
||||
class ImageCropper extends App.ControllerModal
|
||||
|
||||
@@ -34,9 +34,9 @@ class ProfilePassword extends App.ControllerSubContent
|
||||
@startLoading()
|
||||
|
||||
@ajax(
|
||||
id: 'profile_two_factor'
|
||||
id: 'profile_two_factor_personal_configuration'
|
||||
type: 'GET'
|
||||
url: @apiPath + '/users/two_factor_personal_configuration'
|
||||
url: @apiPath + '/users/two_factor/personal_configuration'
|
||||
processData: true
|
||||
success: (data, status, xhr) =>
|
||||
@stopLoading()
|
||||
@@ -175,14 +175,15 @@ class ProfilePassword extends App.ControllerSubContent
|
||||
new App.TwoFactorConfigurationModalPasswordCheck(
|
||||
headPrefix: __('Remove two-factor authentication')
|
||||
buttonSubmit: 'Remove'
|
||||
successCallback: =>
|
||||
successCallback: (data) =>
|
||||
@ajax(
|
||||
id: 'profile_two_factor_removal'
|
||||
type: 'DELETE'
|
||||
url: @apiPath + "/users/#{App.User.current().id}/two_factor_remove_authentication_method"
|
||||
url: @apiPath + '/users/two_factor/remove_authentication_method'
|
||||
processData: true
|
||||
data: JSON.stringify(
|
||||
method: key
|
||||
token: data.token
|
||||
)
|
||||
success: (data, status, xhr) =>
|
||||
@notify
|
||||
|
||||
@@ -158,7 +158,8 @@ class App.UiElement.ApplicationUiElement
|
||||
list = App[ attribute.relation ].search(sortBy: attribute.sortBy)
|
||||
|
||||
# Turn on attribute translation if configured for the relation object.
|
||||
attribute.translate = App[ attribute.relation ].configure_translate
|
||||
if 'configure_translate' in App[attribute.relation]
|
||||
attribute.translate = App[attribute.relation].configure_translate
|
||||
|
||||
App.Log.debug 'ControllerForm', '_getRelationOptionList', attribute, list
|
||||
|
||||
|
||||
@@ -964,7 +964,7 @@ class App.UiElement.object_manager_attribute extends App.UiElement.ApplicationUi
|
||||
|
||||
link = App.Utils.replaceTags(params.data_option?.linktemplate, objects)
|
||||
|
||||
resultLinkIcon = $('<svg class="icon icon-external"><use xlink:href="assets/images/icons.svg#icon-external" /></svg>')
|
||||
resultLinkIcon = $(App.Utils.icon('external'))
|
||||
resultLinkAnchor = $('<a />')
|
||||
.addClass('settings-list-control')
|
||||
.attr('href', link)
|
||||
|
||||
@@ -34,6 +34,9 @@ class App.UiElement.postmaster_set extends App.UiElement.ApplicationAction
|
||||
config.operator = ['static', 'relative']
|
||||
when 'tag'
|
||||
config.operator = ['add', 'remove']
|
||||
when 'autocompletion_ajax_external_data_source'
|
||||
config.objectName = groupMeta.model
|
||||
config.attributeName = config.name
|
||||
|
||||
elements["x-zammad-#{groupKey}-#{config.name}"] = config
|
||||
|
||||
|
||||
@@ -40,11 +40,17 @@ class App.UiElement.richtext.additions.RichTextToolPopup extends App.ControllerF
|
||||
|
||||
$(@event.currentTarget).on('hidden.bs.popover', (e) => @willClose(e))
|
||||
|
||||
$(document).on('click', @onClickingBackround)
|
||||
$(document).on('click', @onClickingBackground)
|
||||
|
||||
onClickingBackround: (e) =>
|
||||
onClickingBackground: (e) =>
|
||||
return true if @el[0].contains(e.target)
|
||||
|
||||
# https://git.zammad.com/zammad/zammad/-/merge_requests/9317
|
||||
# Sometimes DOM element may be no longer a part of the DOM tree by the time it gets to this callback.
|
||||
# For example this happens in searchable select when adding a link to KB Answer.
|
||||
# This treats such cases as clicking inside the popup
|
||||
return true if $(e.target).closest('body').length == 0
|
||||
|
||||
e.preventDefault()
|
||||
e.stopPropagation()
|
||||
|
||||
@@ -54,8 +60,8 @@ class App.UiElement.richtext.additions.RichTextToolPopup extends App.ControllerF
|
||||
@delegate?.getAjaxAttributes?(field, attributes)
|
||||
|
||||
onClear: (e) =>
|
||||
e.preventDefault()
|
||||
e.stopPropagation()
|
||||
e?.preventDefault()
|
||||
e?.stopPropagation()
|
||||
|
||||
@clear()
|
||||
|
||||
@@ -162,5 +168,5 @@ class App.UiElement.richtext.additions.RichTextToolPopup extends App.ControllerF
|
||||
textEditor = $(@event.currentTarget).closest('.richtext.form-control').find('[contenteditable]')
|
||||
textEditor.find('span.highlight-emulator').contents().unwrap()
|
||||
|
||||
$(document).off('click', @onClickingBackround)
|
||||
$(document).off('click', @onClickingBackground)
|
||||
$(@event.currentTarget).off('hidden.bs.popover')
|
||||
|
||||
@@ -3,10 +3,22 @@ class App.UiElement.richtext.additions.RichTextToolPopupImage extends App.UiElem
|
||||
labelExisting: 'Replace'
|
||||
|
||||
apply: (callback) ->
|
||||
@el.find('btn--create').attr('disabled', true)
|
||||
@el.find('.btn--create').attr('disabled', true)
|
||||
|
||||
file = @el.find('input')[0].files[0]
|
||||
|
||||
fileSizeInMb = file.size/1024/1024
|
||||
|
||||
# The browser may fail while reading too large files as data URL.
|
||||
# Here we introduce a safe limit check in order to prevent silent errors.
|
||||
if fileSizeInMb > 25
|
||||
console.error('App.UiElement.richtext.additions.RichTextToolPopupImage', 'image file size too large', fileSizeInMb, 'in mb')
|
||||
@onClear()
|
||||
new App.ControllerErrorModal(
|
||||
message: __('Image file size is too large, please try inserting a smaller file.')
|
||||
)
|
||||
return
|
||||
|
||||
reader = new FileReader()
|
||||
|
||||
reader.addEventListener('load', =>
|
||||
@@ -16,40 +28,49 @@ class App.UiElement.richtext.additions.RichTextToolPopupImage extends App.UiElem
|
||||
|
||||
reader.readAsDataURL(file)
|
||||
|
||||
applyOnto: (dom, base64) ->
|
||||
applyOnto: (dom, base64, width) ->
|
||||
dom.attr('src', base64)
|
||||
dom.attr('width', width)
|
||||
dom.removeAttr('cid')
|
||||
|
||||
insertImage: (base64) ->
|
||||
textEditor = $(@event.currentTarget).closest('.richtext.form-control').find('[contenteditable]')
|
||||
|
||||
switch @selection.type
|
||||
when 'existing'
|
||||
@applyOnto(@selection.dom, base64)
|
||||
when 'append'
|
||||
newElem = $('<img>')[0]
|
||||
newElem.src = base64
|
||||
newElem.style = 'width: 1000px; max-width: 100%;'
|
||||
@selection.dom.append(newElem)
|
||||
when 'caret'
|
||||
newElem = $('<img>')
|
||||
newElem.attr('src', base64)
|
||||
newElem.attr('style', 'width: 1000px; max-width: 100%;')
|
||||
insert = (dataUrl, width, height, isResized) =>
|
||||
switch @selection.type
|
||||
when 'existing'
|
||||
@applyOnto(@selection.dom, dataUrl, width)
|
||||
when 'append'
|
||||
newElem = $('<img>')[0]
|
||||
newElem.src = dataUrl
|
||||
newElem.style = 'width: ' + width + 'px; max-width: 100%;'
|
||||
@selection.dom.append(newElem)
|
||||
when 'caret'
|
||||
newElem = $('<img>')
|
||||
newElem.attr('src', dataUrl)
|
||||
newElem.attr('style', 'width: ' + width + 'px; max-width: 100%;')
|
||||
|
||||
surroundingDom = @selection.dom[0]
|
||||
surroundingDom = @selection.dom[0]
|
||||
|
||||
if surroundingDom instanceof Text
|
||||
@selection.dom[0].splitText(@selection.offset)
|
||||
if surroundingDom instanceof Text
|
||||
@selection.dom[0].splitText(@selection.offset)
|
||||
|
||||
newElem.insertAfter(@selection.dom)
|
||||
when 'range'
|
||||
newElem = $('<img>')
|
||||
newElem.attr('src', base64)
|
||||
newElem.attr('style', 'width: 1000px; max-width: 100%;')
|
||||
newElem.insertAfter(@selection.dom)
|
||||
when 'range'
|
||||
newElem = $('<img>')
|
||||
newElem.attr('src', dataUrl)
|
||||
newElem.attr('style', 'width: ' + width + 'px; max-width: 100%;')
|
||||
|
||||
placeholder = textEditor.find('span.highlight-emulator')
|
||||
placeholder = textEditor.find('span.highlight-emulator')
|
||||
|
||||
placeholder.empty()
|
||||
placeholder.append(newElem)
|
||||
placeholder.empty()
|
||||
placeholder.append(newElem)
|
||||
|
||||
App.ImageService.resize(base64, 1200, 'auto', 2, @getImageType(base64), 'auto', insert)
|
||||
|
||||
getImageType: (base64) ->
|
||||
match = base64.match(/^data:(image\/\w+);base64,/)
|
||||
if match then match[1] else null
|
||||
|
||||
clear: ->
|
||||
switch @selection.type
|
||||
|
||||
@@ -12,6 +12,10 @@ class App.AfterAuthTwoFactorConfiguration extends App.ControllerAfterAuthModal
|
||||
if params.noFadeTransition
|
||||
params.className = 'modal'
|
||||
|
||||
if not params.data?.token
|
||||
@invalidPasswordToken()
|
||||
return
|
||||
|
||||
super(params)
|
||||
|
||||
content: ->
|
||||
@@ -27,10 +31,12 @@ class App.AfterAuthTwoFactorConfiguration extends App.ControllerAfterAuthModal
|
||||
return if !App.User.current()
|
||||
|
||||
@ajax(
|
||||
id: 'two_factor_enabled_authentication_methods'
|
||||
type: 'GET'
|
||||
url: "#{@apiPath}/users/#{App.User.current().id}/two_factor_enabled_authentication_methods"
|
||||
success: @renderAvailableMethods
|
||||
id: 'two_factor_enabled_authentication_methods'
|
||||
type: 'POST'
|
||||
url: "#{@apiPath}/users/two_factor/enabled_authentication_methods"
|
||||
data: JSON.stringify(token: @data?.token)
|
||||
processData: true
|
||||
success: @renderAvailableMethods
|
||||
error: (xhr, status, error) =>
|
||||
return if xhr.status != 403
|
||||
|
||||
@@ -39,6 +45,11 @@ class App.AfterAuthTwoFactorConfiguration extends App.ControllerAfterAuthModal
|
||||
)
|
||||
|
||||
renderAvailableMethods: (data, status, xhr) =>
|
||||
if data?.invalid_password_token
|
||||
@closeWithoutFade()
|
||||
@invalidPasswordToken(true)
|
||||
return
|
||||
|
||||
methodButtons = $(App.view('after_auth/two_factor_configuration/method_buttons')(
|
||||
enabledMethods: @transformTwoFactorMethods(data)
|
||||
))
|
||||
@@ -78,7 +89,30 @@ class App.AfterAuthTwoFactorConfiguration extends App.ControllerAfterAuthModal
|
||||
|
||||
new App['TwoFactorConfigurationMethod' + configurationMethod](
|
||||
mode: 'after_auth'
|
||||
token: @data?.token
|
||||
successCallback: =>
|
||||
@fetchAfterAuth()
|
||||
App.User.current().trigger('two_factor_changed')
|
||||
)
|
||||
|
||||
invalidPasswordToken: (notify = false) =>
|
||||
if notify
|
||||
@notify(
|
||||
type: 'error'
|
||||
msg: __('Invalid password revalidation token, please confirm your password again.')
|
||||
removeAll: true
|
||||
)
|
||||
|
||||
new App.TwoFactorConfigurationModalPasswordCheck(
|
||||
logoutOnCancel: @logoutOnCancel
|
||||
backdrop: @backdrop
|
||||
keyboard: @keyboard
|
||||
buttonClose: @buttonClose
|
||||
buttonCancel: @buttonCancel
|
||||
onCancel: @onCancel
|
||||
successCallback: (data) ->
|
||||
new App.AfterAuthTwoFactorConfiguration(
|
||||
data: data
|
||||
className: 'modal' # no automatic fade transitions
|
||||
)
|
||||
)
|
||||
|
||||
@@ -9,16 +9,24 @@ class Index extends App.ControllerSubContent
|
||||
constructor: ->
|
||||
super
|
||||
@load()
|
||||
@subscribeDataPrivacyTaskId = App.DataPrivacyTask.subscribe(@render)
|
||||
|
||||
@controllerBind(
|
||||
'DataPrivacyTask:create DataPrivacyTask:update DataPrivacyTask:touch DataPrivacyTask:destroy',
|
||||
@load
|
||||
)
|
||||
|
||||
load: =>
|
||||
callback = =>
|
||||
@stopLoading()
|
||||
@render()
|
||||
@startLoading()
|
||||
App.DataPrivacyTask.fetchFull(
|
||||
callback
|
||||
clear: true
|
||||
|
||||
@ajax(
|
||||
id: 'data_privacy_tasks_by_state'
|
||||
type: 'GET'
|
||||
url: "#{@apiPath}/data_privacy_tasks/by_state"
|
||||
success: (data) =>
|
||||
App.DataPrivacyTask.deleteAll()
|
||||
App.Collection.loadAssets(data.assets)
|
||||
@stopLoading()
|
||||
@render(data.record_ids)
|
||||
)
|
||||
|
||||
show: (params) =>
|
||||
@@ -39,30 +47,18 @@ class Index extends App.ControllerSubContent
|
||||
@new(false, @user_id)
|
||||
@user_id = undefined
|
||||
|
||||
render: =>
|
||||
runningTasks = App.DataPrivacyTask.search(
|
||||
filter:
|
||||
state: 'in process'
|
||||
order: 'DESC'
|
||||
)
|
||||
render: (record_ids) =>
|
||||
runningTasks = App.DataPrivacyTask.findAll(record_ids.in_process)
|
||||
runningTasksHTML = App.view('data_privacy/tasks')(
|
||||
tasks: runningTasks
|
||||
)
|
||||
|
||||
failedTasks = App.DataPrivacyTask.search(
|
||||
filter:
|
||||
state: 'failed'
|
||||
order: 'DESC'
|
||||
)
|
||||
failedTasks = App.DataPrivacyTask.findAll(record_ids.failed)
|
||||
failedTasksHTML = App.view('data_privacy/tasks')(
|
||||
tasks: failedTasks
|
||||
)
|
||||
|
||||
completedTasks = App.DataPrivacyTask.search(
|
||||
filter:
|
||||
state: 'completed'
|
||||
order: 'DESC'
|
||||
)
|
||||
completedTasks = App.DataPrivacyTask.findAll(record_ids.completed)
|
||||
completedTasksHTML = App.view('data_privacy/tasks')(
|
||||
tasks: completedTasks
|
||||
)
|
||||
@@ -81,10 +77,6 @@ class Index extends App.ControllerSubContent
|
||||
description: description
|
||||
)
|
||||
|
||||
release: =>
|
||||
if @subscribeDataPrivacyTaskId
|
||||
App.DataPrivacyTask.unsubscribe(@subscribeDataPrivacyTaskId)
|
||||
|
||||
new: (e, user_id = undefined) ->
|
||||
if e
|
||||
e.preventDefault()
|
||||
@@ -134,7 +126,7 @@ class Index extends App.ControllerSubContent
|
||||
container: @el.closest('.content')
|
||||
)
|
||||
|
||||
formHandler: (params, attribute, attributes, classname, form, ui) ->
|
||||
formHandler: (params, attribute, attributes, DataPrivacyTask, form, ui) =>
|
||||
return if !attribute
|
||||
|
||||
userID = params['deletable_id']
|
||||
@@ -146,6 +138,10 @@ class Index extends App.ControllerSubContent
|
||||
|
||||
return if !userID
|
||||
|
||||
return if userID == @previousUserID
|
||||
|
||||
@previousUserID = userID
|
||||
|
||||
conditionCustomer =
|
||||
'condition':
|
||||
'ticket.customer_id':
|
||||
@@ -166,6 +162,8 @@ class Index extends App.ControllerSubContent
|
||||
url: "#{App.Config.get('api_path')}/tickets/selector"
|
||||
data: JSON.stringify(conditionCustomer)
|
||||
processData: true,
|
||||
error: (xhr, statusText, error) =>
|
||||
@previousUserID = undefined
|
||||
success: (dataCustomer, status, xhr) ->
|
||||
App.Collection.loadAssets(dataCustomer.assets)
|
||||
|
||||
@@ -175,7 +173,11 @@ class Index extends App.ControllerSubContent
|
||||
url: "#{App.Config.get('api_path')}/tickets/selector"
|
||||
data: JSON.stringify(conditionOwner)
|
||||
processData: true,
|
||||
error: (xhr, statusText, error) =>
|
||||
@previousUserID = undefined
|
||||
success: (dataOwner, status, xhr) ->
|
||||
isFocused = form.find('.js-preview [name="preferences::sure"]').is(':focus')
|
||||
|
||||
App.Collection.loadAssets(dataOwner.assets)
|
||||
|
||||
user = App.User.find(userID)
|
||||
@@ -184,10 +186,10 @@ class Index extends App.ControllerSubContent
|
||||
organization = App.Organization.find(user.organization_id)
|
||||
if organization && organization.member_ids.length < 2
|
||||
attribute = { name: 'preferences::delete_organization', display: __('Delete organization?'), tag: 'boolean', default: true, translate: true }
|
||||
deleteOrganization = ui.formGenItem(attribute, classname, form).html()
|
||||
deleteOrganization = ui.formGenItem(attribute, DataPrivacyTask, form).html()
|
||||
|
||||
sure_attribute = { name: 'preferences::sure', display: __('Are you sure?'), tag: 'input', translate: false, placeholder: App.i18n.translateInline('delete').toUpperCase() }
|
||||
sureInput = ui.formGenItem(sure_attribute, classname, form).html()
|
||||
sureInput = ui.formGenItem(sure_attribute, DataPrivacyTask, form).html()
|
||||
|
||||
preview_html = App.view('data_privacy/preview')(
|
||||
customer_count: dataCustomer.object_count || 0
|
||||
@@ -208,6 +210,9 @@ class Index extends App.ControllerSubContent
|
||||
ticket_ids: dataCustomer.object_ids
|
||||
)
|
||||
|
||||
if isFocused
|
||||
form.find('.js-preview [name="preferences::sure"]').focus()
|
||||
|
||||
return if !form.find('.js-previewTableOwner').length
|
||||
|
||||
new App.TicketList(
|
||||
|
||||
@@ -28,7 +28,7 @@ class App.KnowledgeBaseAddForm extends App.ControllerModal
|
||||
params = @formController.paramsForSaving()
|
||||
params.translations_attributes[0].content_attributes = { body: '' }
|
||||
|
||||
@parentController.coordinator.saveChanges(@object, params, @)
|
||||
@parentController.coordinator.saveChanges(@object, params, @, e)
|
||||
|
||||
showAlert: (text) ->
|
||||
@formController?.showAlert(text)
|
||||
|
||||
@@ -103,7 +103,7 @@ class App.KnowledgeBaseContentController extends App.Controller
|
||||
additional_action = $(e.currentTarget).data('id')
|
||||
|
||||
if @remoteDidntChangeSinceStart()
|
||||
@parentController.coordinator.saveChanges(@object, paramsForSaving, @, additional_action)
|
||||
@parentController.coordinator.saveChanges(@object, paramsForSaving, @, e, additional_action)
|
||||
return
|
||||
|
||||
new App.ControllerConfirm(
|
||||
@@ -111,7 +111,7 @@ class App.KnowledgeBaseContentController extends App.Controller
|
||||
message: __('Your changes may override someone else\'s changes. Do you really want to save?')
|
||||
buttonClass: 'btn--danger'
|
||||
callback: =>
|
||||
@parentController.coordinator.saveChanges(@object, paramsForSaving, @)
|
||||
@parentController.coordinator.saveChanges(@object, paramsForSaving, @, e)
|
||||
)
|
||||
|
||||
missingTranslation: ->
|
||||
|
||||
@@ -28,8 +28,20 @@ class App.KnowledgeBaseEditorCoordinator
|
||||
else
|
||||
object.url()
|
||||
|
||||
saveChanges: (object, data, formController, action) ->
|
||||
App.ControllerForm.disable(formController.form)
|
||||
submitDisable: (e) =>
|
||||
if e
|
||||
App.ControllerForm.disable(e)
|
||||
return
|
||||
App.ControllerForm.disable(@$('.js-submitContainer'), 'button')
|
||||
|
||||
submitEnable: (e) =>
|
||||
if e
|
||||
App.ControllerForm.enable(e)
|
||||
return
|
||||
App.ControllerForm.enable(@$('.js-submitContainer'), 'button')
|
||||
|
||||
saveChanges: (object, data, formController, e, action) ->
|
||||
@submitDisable(e)
|
||||
|
||||
url = @urlFor(object) + '?full=true'
|
||||
|
||||
@@ -40,11 +52,12 @@ class App.KnowledgeBaseEditorCoordinator
|
||||
type: object.writeMethod()
|
||||
data: JSON.stringify(data)
|
||||
url: url
|
||||
success: (data) ->
|
||||
success: (data) =>
|
||||
App.Collection.loadAssets(data.assets)
|
||||
formController.didSaveCallback(data)
|
||||
error: (xhr) ->
|
||||
@submitEnable(e)
|
||||
error: (xhr) =>
|
||||
data = JSON.parse(xhr.responseText)
|
||||
App.ControllerForm.enable(formController.form)
|
||||
formController.showAlert(data.error || __('The changes could not be saved.'))
|
||||
@submitEnable(e)
|
||||
)
|
||||
|
||||
@@ -29,6 +29,13 @@ class App.KnowledgeBaseSidebarAttachments extends App.Controller
|
||||
attachments: @object.attachments
|
||||
)
|
||||
|
||||
@renderDragAndDropIfNeeded()
|
||||
|
||||
renderDragAndDropIfNeeded: ->
|
||||
return if @dragAndDropRendered
|
||||
|
||||
@dragAndDropRendered = true
|
||||
|
||||
html5Upload.initialize(
|
||||
uploadUrl: @object.generateURL('attachments')
|
||||
dropContainer: @el.get(0)
|
||||
|
||||
@@ -23,6 +23,7 @@ class Package extends App.ControllerSubContent
|
||||
success: (data) =>
|
||||
@packages = data.packages
|
||||
@package_installation = data.package_installation
|
||||
@local_gemfiles = data.local_gemfiles
|
||||
@render()
|
||||
)
|
||||
|
||||
@@ -42,6 +43,7 @@ class Package extends App.ControllerSubContent
|
||||
head: __('Dashboard')
|
||||
packages: @packages
|
||||
package_installation: @package_installation
|
||||
local_gemfiles: @local_gemfiles
|
||||
)
|
||||
|
||||
action: (e) ->
|
||||
|
||||
@@ -101,6 +101,12 @@ class PasswordResetVerify extends App.ControllerFullPage
|
||||
|
||||
renderChanged: (data, status, xhr) =>
|
||||
if data.message is 'ok'
|
||||
@notify(
|
||||
type: 'success'
|
||||
msg: __('Woo hoo! Your password has been changed!')
|
||||
removeAll: true
|
||||
)
|
||||
|
||||
App.Auth.login(
|
||||
data:
|
||||
username: data.user_login
|
||||
@@ -110,25 +116,14 @@ class PasswordResetVerify extends App.ControllerFullPage
|
||||
# login check
|
||||
App.Auth.loginCheck()
|
||||
|
||||
# add notify
|
||||
@notify(
|
||||
type: 'success'
|
||||
msg: __('Woo hoo! Your password has been changed!')
|
||||
removeAll: true
|
||||
)
|
||||
|
||||
# redirect to #
|
||||
@navigate '#'
|
||||
|
||||
error: =>
|
||||
@formEnable(@$('form'))
|
||||
|
||||
# add notify
|
||||
@notify(
|
||||
type: 'error'
|
||||
msg: __('Something went wrong. Please contact your administrator.')
|
||||
removeAll: true
|
||||
)
|
||||
# The user may have an active 2FA method on their account, which will prevent an automatic login (#4989).
|
||||
# Instead, silently redirect to login screen and allow the user to login manually
|
||||
# and complete their 2FA challenge.
|
||||
@navigate '#'
|
||||
)
|
||||
else
|
||||
if data.notice
|
||||
|
||||
@@ -18,7 +18,10 @@ class Reporting extends App.ControllerAppContent
|
||||
objectName: 'Report'
|
||||
)
|
||||
return
|
||||
@config = data.config
|
||||
@config = data.config
|
||||
@profiles = data.profiles
|
||||
@checkStoreParams()
|
||||
|
||||
App.Collection.load(type: 'ReportProfile', data: data.profiles)
|
||||
@render()
|
||||
)
|
||||
@@ -27,7 +30,7 @@ class Reporting extends App.ControllerAppContent
|
||||
return @params if @params
|
||||
|
||||
@params = {}
|
||||
paramsRaw = App.SessionStorage.get('report::params')
|
||||
paramsRaw = @getStoreParams()
|
||||
if paramsRaw
|
||||
@params = paramsRaw
|
||||
return @params
|
||||
@@ -60,7 +63,20 @@ class Reporting extends App.ControllerAppContent
|
||||
|
||||
@params
|
||||
|
||||
storeParams: =>
|
||||
checkStoreParams: =>
|
||||
params = @getStoreParams()
|
||||
return if _.isEmpty(params)
|
||||
|
||||
configProfileIDs = @profiles.map((profile) -> profile.id)
|
||||
storeProfileIDs = Object.keys(params.profileSelected).map((id) -> parseInt(id))
|
||||
return if _.intersection(configProfileIDs, storeProfileIDs).length is storeProfileIDs.length
|
||||
|
||||
App.SessionStorage.delete('report::params')
|
||||
|
||||
getStoreParams: ->
|
||||
App.SessionStorage.get('report::params')
|
||||
|
||||
setStoreParams: =>
|
||||
# store latest params
|
||||
App.SessionStorage.set('report::params', @params)
|
||||
|
||||
@@ -116,7 +132,7 @@ class Graph extends App.Controller
|
||||
for key, value of data.data
|
||||
if @params.backendSelected[key] is true
|
||||
dataNew[key] = value
|
||||
@ui.storeParams()
|
||||
@ui.setStoreParams()
|
||||
|
||||
if !@lastParams
|
||||
@lastParams = {}
|
||||
@@ -252,7 +268,7 @@ class Download extends App.Controller
|
||||
$(e.target).parent().addClass('active')
|
||||
@profileSelectedId = $(e.target).data('profile-id')
|
||||
@params.downloadBackendSelected = $(e.target).data('backend')
|
||||
@ui.storeParams()
|
||||
@ui.setStoreParams()
|
||||
@table = false
|
||||
@render()
|
||||
|
||||
@@ -272,7 +288,7 @@ class Download extends App.Controller
|
||||
for backend in @config.metric[@params.metric].backend
|
||||
if backend.dataDownload && !@params.downloadBackendSelected
|
||||
@params.downloadBackendSelected = backend.name
|
||||
@ui.storeParams()
|
||||
@ui.setStoreParams()
|
||||
|
||||
# get used profiles
|
||||
profiles = []
|
||||
@@ -458,7 +474,7 @@ class TimePicker extends App.Controller
|
||||
$(e.target).parent().parent().find('li').removeClass('active')
|
||||
$(e.target).parent().addClass('active')
|
||||
App.Event.trigger('ui:report:rerender')
|
||||
@ui.storeParams()
|
||||
@ui.setStoreParams()
|
||||
|
||||
selectTimeMonth: (e) =>
|
||||
e.preventDefault()
|
||||
@@ -466,7 +482,7 @@ class TimePicker extends App.Controller
|
||||
$(e.target).parent().parent().find('li').removeClass('active')
|
||||
$(e.target).parent().addClass('active')
|
||||
App.Event.trigger('ui:report:rerender')
|
||||
@ui.storeParams()
|
||||
@ui.setStoreParams()
|
||||
|
||||
selectTimeWeek: (e) =>
|
||||
e.preventDefault()
|
||||
@@ -474,7 +490,7 @@ class TimePicker extends App.Controller
|
||||
$(e.target).parent().parent().find('li').removeClass('active')
|
||||
$(e.target).parent().addClass('active')
|
||||
App.Event.trigger('ui:report:rerender')
|
||||
@ui.storeParams()
|
||||
@ui.setStoreParams()
|
||||
|
||||
selectTimeYear: (e) =>
|
||||
e.preventDefault()
|
||||
@@ -483,7 +499,7 @@ class TimePicker extends App.Controller
|
||||
$(e.target).parent().parent().find('li').removeClass('active')
|
||||
$(e.target).parent().addClass('active')
|
||||
App.Event.trigger('ui:report:rerender')
|
||||
@ui.storeParams()
|
||||
@ui.setStoreParams()
|
||||
|
||||
_timeSlotPicker: ->
|
||||
@timeRangeYear = []
|
||||
@@ -592,7 +608,7 @@ class Sidebar extends App.Controller
|
||||
@params.metric = metric
|
||||
@params.downloadBackendSelected = undefined
|
||||
App.Event.trigger('ui:report:rerender')
|
||||
@ui.storeParams()
|
||||
@ui.setStoreParams()
|
||||
|
||||
selectProfile: (e) =>
|
||||
profile_id = $(e.target).val()
|
||||
@@ -600,7 +616,7 @@ class Sidebar extends App.Controller
|
||||
delete @params.profileSelected[key]
|
||||
@params.profileSelected[profile_id] = true
|
||||
App.Event.trigger('ui:report:rerender')
|
||||
@ui.storeParams()
|
||||
@ui.setStoreParams()
|
||||
|
||||
selectBackend: (e) =>
|
||||
backend = $(e.target).val()
|
||||
@@ -610,7 +626,7 @@ class Sidebar extends App.Controller
|
||||
else
|
||||
delete @params.backendSelected[backend]
|
||||
App.Event.trigger('ui:report:rerender')
|
||||
@ui.storeParams()
|
||||
@ui.setStoreParams()
|
||||
|
||||
App.Config.set('report', Reporting, 'Routes')
|
||||
App.Config.set('Reporting', { prio: 8000, parent: '', name: __('Reporting'), translate: true, target: '#report', icon: 'report', permission: ['report'] }, 'NavBarRight')
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user