Compare commits

..

86 commits

Author SHA1 Message Date
f
af9baadea7 Merge branch 'develop' into antifascista 2021-10-14 10:40:22 -03:00
Rolf Schmidt
4b0fa96cc9 Fixes #3790 - Support workflow mechanism to do pending reminder state hide pending time use case. 2021-10-14 13:00:42 +02:00
Thorsten Eckel
fc4ab53c1a Follow up - b125b3603e - Maintenance: Docker Chat build image misses yarn installation of dependencies. 2021-10-14 08:59:37 +00:00
Thorsten Eckel
405b80cbe2 Fixes #3808 - Regression of #3797 causes installation of new instances from package to fail. 2021-10-14 08:31:04 +02:00
f
6c1a6b48a4 Merge branch 'develop' into antifascista 2021-10-13 12:39:26 -03:00
Dominik Klein
2bd4ceeedf Fixes #3733 - Simple quote characters (') not properly displayed. 2021-10-13 11:27:28 +00:00
Thorsten Eckel
c435fa4b23 Maintenance: Bumped Puma to 4.3.10 to resolve CVE-2021-41136. 2021-10-13 08:44:52 +02:00
Thorsten Eckel
16870853e1 Follow up - d7cdb308dd - Maintenance: Remove wrongly re-added switch_to_user_test.rb in browser slicing. 2021-10-12 17:18:07 +02:00
Martin Gruner
54417cd416 Fixes #3794 - Example payload in webhook view leads to 500 error 2021-10-12 14:34:42 +00:00
Bola Ahmed Buari
e6c3b07b0d Maintenance: Port old cti integration tests to capybara. 2021-10-12 16:16:59 +02:00
Bola Ahmed Buari
d7cdb308dd Maintenance: Port old preferences permission language tests to capybara. 2021-10-12 16:11:47 +02:00
Dominik Klein
3036453a0f Maintenance: Ported auth test to capybara. 2021-10-12 16:02:34 +02:00
Mantas Masalskis
55e99d7aa8 Fixes #3800 - Sort order group_by broken (alphabetical) 2021-10-12 15:46:46 +02:00
Dominik Klein
61996989b0 Maintenance: Deleted already ported switch to user test. 2021-10-11 10:58:01 +02:00
Dominik Klein
587f36d220 Maintenance: Try to improve the stabilzation of the maintenance app version selenium test. 2021-10-08 18:48:08 +02:00
Martin Gruner
52587ca9e2 Maintenance: Port System > Monitoring test to capybara. 2021-10-08 11:47:47 +00:00
Martin Gruner
1de9c8d803 Maintenance: Ported admin_permissions_granular_vs_full_test.rb to Capybara. 2021-10-08 11:42:56 +00:00
Dominik Klein
22cd8f3376 Maintenance: Port maintenance session message test to capybara. 2021-10-08 12:34:31 +02:00
Martin Edenhofer
df6fe54b66 Fixes #3797 - OS package upgrade fails (activity_stream_object_id) 2021-10-08 09:30:34 +02:00
Martin Gruner
da22f4b1bd Maintenance: Ported Manage > Channels > Email test to capybara. 2021-10-08 08:41:05 +02:00
Martin Gruner
445700d0aa Follow-up: 276c45b2e9 - Improved ticket policy scope handling. 2021-10-07 16:37:57 +02:00
Romit Choudhary
c5ba0563a5 Fixes #3737 - Bug Report 4.1.x Overview Sort - Grouped by user 2021-10-07 15:43:44 +02:00
Dominik Klein
4a2c8dd234 Maintenance: Try to improve the stabilzation of the ticket create selenium test. 2021-10-07 13:20:51 +02:00
Martin Gruner
73cb552846 Maintenance: Bump rubocop-rails from 2.12.2 to 2.12.3
Bumps [rubocop-rails](https://github.com/rubocop/rubocop-rails) from 2.12.2 to 2.12.3.
- [Release notes](https://github.com/rubocop/rubocop-rails/releases)
- [Changelog](https://github.com/rubocop/rubocop-rails/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop-rails/compare/v2.12.2...v2.12.3)
2021-10-07 08:12:42 +00:00
Rolf Schmidt
a7e0d460aa Fixes #3789 - Article box opening on tickets with no changes. 2021-10-07 09:01:07 +02:00
Martin Gruner
9f9ec58230 Maintenance: Bump twilio-ruby from 5.58.3 to 5.59.0
Bumps [twilio-ruby](https://github.com/twilio/twilio-ruby) from 5.58.3 to 5.59.0.
- [Release notes](https://github.com/twilio/twilio-ruby/releases)
- [Changelog](https://github.com/twilio/twilio-ruby/blob/main/CHANGES.md)
- [Commits](https://github.com/twilio/twilio-ruby/compare/5.58.3...5.59.0)
2021-10-07 03:05:18 +02:00
Dominik Klein
3c2cea9a22 Fixes #3000 - Login site wording could be better. 2021-10-06 15:06:49 +02:00
Dominik Klein
c1cb4fdd43 Maintenance: Port maintenance app version test to capybara. 2021-10-06 08:35:18 +00:00
Martin Gruner
45cbbde2be Maintenance: Updated argon2 and doorkeeper gems. 2021-10-06 07:44:50 +02:00
f
ea2cf81ab4 makefile 2021-10-05 20:21:45 -03:00
Rolf Schmidt
3df384c758 Fixes #3787 - UploadCacheCleanupJob does not execute. 2021-10-05 17:18:31 +02:00
Martin Gruner
b33bca9910 Fixes: #3788 - lib/fill_db.rb fails to work in production environments. 2021-10-05 14:00:33 +02:00
Martin Edenhofer
9df0aaed7c Prepared 5.1. 2021-10-05 11:10:44 +02:00
Martin Gruner
de30a5c1b1 Maintenance: Improve template rendering. 2021-10-05 08:52:23 +02:00
Dominik Klein
7f178484c7 Maintenance: Refactoring of Avatar storage logic. 2021-10-05 06:42:26 +00:00
Rolf Schmidt
867b36baa8 Maintenance: Add assets level to have different data sets based on permissions 2021-10-05 06:42:26 +00:00
Thorsten Eckel
acc93a23fb Maintenance: Enhance attachment preview capabilities 2021-10-05 06:42:26 +00:00
Rolf Schmidt
7dbd1c1b15 Maintenance: Remove while loop user check login. 2021-10-05 06:42:26 +00:00
Dominik Klein
57b9ac91f3 Maintenance: Improve package installation. 2021-10-05 06:42:26 +00:00
Thorsten Eckel
f86576c1e4 Maintenance: Improve application boot time by reducing initial asset payload 2021-10-05 06:42:26 +00:00
Dominik Klein
1285c88ca3 Maintenance: Increase performance of ticket creation via form. 2021-10-05 06:42:26 +00:00
Thorsten Eckel
ecbda834bc Maintenance: Improve clipboard handling of website chat 2021-10-05 06:42:26 +00:00
Martin Gruner
0f5807d6fe Maintenance: Improved updating of user records in the front end. 2021-10-05 06:42:26 +00:00
Rolf Schmidt
6602d19dbf Maintenance: Enhanced GitHub and GitLab GraphQL endpoint check 2021-10-05 06:42:26 +00:00
Martin Gruner
5ddec48643 Maintenance: Improved updating of user records. 2021-10-05 06:42:26 +00:00
Mantas
4c72d5b9d9 Fixes #3769 - Usage of inactive object attributes in SLAs will crash admin SLA interface 2021-10-04 19:09:10 +00:00
Mantas Masalskis
90eca0f1eb Fixes #3773 - Inconstant alignment in the listing of attachments/submit button in new article area
Fixes #3774 - Broken dialog whiling uploading oversized attachment
2021-10-04 21:05:32 +02:00
Rolf Schmidt
ffa8814d02 Fixes #3779 - Core Workflow: Add organization condition attributes for object User. 2021-10-04 15:47:30 +02:00
Mantas Masalskis
32a23f9e8b Fixes #3783 - Improve contrasts in answer search for articles 2021-10-04 15:42:35 +02:00
Rolf Schmidt
798d45b299 Maintenance: Add another reload to setup new js for core workflow. 2021-10-04 13:24:50 +00:00
Martin Gruner
ca6e510ed4 Maintenance: Specify a certain PostgreSQL version for the build process that still works with older platforms. 2021-10-04 11:57:32 +02:00
Rolf Schmidt
dd66c30d59 Follow up 5f2181d8a3 - Fixes #3757 - escaped 'Set fixed' workflows don't refresh set values on active ticket sessions. 2021-10-04 10:50:14 +02:00
Martin Gruner
03bcf66126 Maintenance: Updated argon2, async-pool, jwt and rubocop gems. 2021-10-04 07:02:01 +02:00
f
1bf468a262 Use gems compiled for Alpine Linux 2021-10-03 19:41:28 -03:00
Rolf Schmidt
5bd714878a Fixes #3781 - ObjectManager Attribute without screen attribute causes CoreWorkflows migration to fail 2021-10-01 12:25:06 +02:00
Rolf Schmidt
79bacb14aa Follow up 4e4ba091d4 - Fixes #3776 - Force users to reload after system migration. 2021-10-01 09:56:43 +00:00
Mantas Masalskis
9c5a11f36e Maintenance: Rubocop uses custom inflections 2021-10-01 11:56:09 +02:00
benrubson
489177cca1 Fixes #2674, closes #3775 - Zammad preflight check warning output causes Syntax-Error in postinstall.sh and failing installation. 2021-09-30 11:09:15 +02:00
Martin Gruner
dbb93bf02c Maintenance: Improve MR template. 2021-09-30 10:15:34 +02:00
Romit Choudhary
4f3e7f4003 Fixes #2780 - Shared Organisation issue create your first ticket 2021-09-30 09:25:13 +02:00
Martin Gruner
51933e3b76 Maintenance: Bump rubocop from 1.21.0 to 1.22.0 2021-09-30 09:18:16 +02:00
Rolf Schmidt
4e4ba091d4 Fixes #3776 - Force users to reload after system migration. 2021-09-30 06:31:13 +00:00
Dominik Klein
c335147d62 Maintenance: Port customer ticket create fields test to capybara. 2021-09-29 17:17:21 +02:00
Martin Gruner
36aa35f765 Maintenance: Port admin_calendar_sla_test.rb to Capybara. 2021-09-29 12:43:58 +00:00
Thorsten Eckel
6d8f5b7d95 Fixes #3777 - misspelled KnowledgeBase constant breaks update. 2021-09-29 12:16:16 +02:00
Romit Choudhary
bf6da241d8 Fixes #2351 - Unable to cancel attachment upload 2021-09-29 11:24:50 +02:00
Mantas
1404f7b2fc Fixes #2619 - KB header and footer link-color not changeable 2021-09-29 08:29:54 +00:00
Mantas
68adb3974e Fixes #3028 - Syntax errors break scheduler job for good 2021-09-29 08:19:39 +00:00
Martin Edenhofer
0cc5764ab3 Fixes #3365 - No script content (e. g. JavaScript) in emails 2021-09-29 10:13:40 +02:00
Mantas Masalskis
8d37feceb6 Fixes #3772 - Existing tickets: New article modal with padding-left: 0; padding-right: 0; 2021-09-29 10:09:08 +02:00
Rolf Schmidt
5f2181d8a3 Fixes #3757 - escaped 'Set fixed' workflows don't refresh set values on active ticket sessions. 2021-09-29 10:03:04 +02:00
Thorsten Eckel
b85e402807 Maintenance: Pluralize admin navigation entry name for Core Workflows. 2021-09-28 15:29:44 +02:00
Martin Gruner
b17f1be9a0 Maintenance: Updated Browser requirements. 2021-09-28 11:21:57 +02:00
Martin Gruner
8d77ac4579 Maintenance: Update various gem dependencies. 2021-09-28 08:58:38 +02:00
Martin Gruner
98065e1df8 Maintenance: Bump nokogiri to v1.12.5. 2021-09-28 08:02:08 +02:00
Dominik Klein
63335652cb Maintenance: Port agent ticket update tests to capybara. 2021-09-27 12:49:55 +02:00
Martin Gruner
1b3530f2ae Maintenance: Stabilize System > Objects test (another try). 2021-09-27 09:57:56 +00:00
Bartosz Pijet
b82e8544f0 Fixes #3760 - Fix polish translations 2021-09-27 08:59:06 +00:00
Martin Gruner
24830cf814 Maintenance: Stabilize System > Objects test. 2021-09-25 06:28:00 +02:00
Martin Gruner
4f2e7b9e52 Maintenance: Port System > Translations test to capybara. 2021-09-24 15:59:07 +02:00
Martin Gruner
59f1824c3a Fixes: #3765 - Possible race condition causing OTRS import to fail 2021-09-24 07:00:41 +00:00
Martin Gruner
e88fec5bb3 Maintenance: Bump doorkeeper from 5.5.2 to 5.5.3
Bumps [doorkeeper](https://github.com/doorkeeper-gem/doorkeeper) from 5.5.2 to 5.5.3.
- [Release notes](https://github.com/doorkeeper-gem/doorkeeper/releases)
- [Changelog](https://github.com/doorkeeper-gem/doorkeeper/blob/main/CHANGELOG.md)
- [Commits](https://github.com/doorkeeper-gem/doorkeeper/compare/v5.5.2...v5.5.3)
2021-09-24 03:09:06 +02:00
Mantas
39179c83f8 Fixes #3746 - Incorrect alignment in the listing of attachments when creating a ticket 2021-09-23 14:31:03 +00:00
Rolf Schmidt
c099698c71 Fixes #3758 - Saved conditions break on selections without reloading. 2021-09-23 13:50:21 +00:00
Romit Choudhary
1fe7611bab Fixes #3075 - Misleading view of user icons which are on vacation and disabled 2021-09-23 13:44:57 +00:00
Martin Gruner
0b659776e9 Maintenance: Work around timeouts caused by the sanitizer in slow CI environments. 2021-09-23 15:14:15 +02:00
56 changed files with 993 additions and 1548 deletions

View file

@ -1,8 +1,9 @@
## What does this MR do? ## What does this MR do?
<!-- Is there a lot to say? Consider creating an issue. --> <!--Insert the link to a GitHub issue in (), or describe the changes if there is no issue -->
[Issue Link]()
## Screenshots <!-- Optional --> ## Screenshots <!-- Optional, very helpful for the reviewer colleagues from other teams -->
### Before ### Before
@ -12,7 +13,7 @@
![alt text](https://example.com/after.png) ![alt text](https://example.com/after.png)
## Notes ## Code Changes
* This MR * This MR
**does** <!-- KEEP ONLY ONE --> **does** <!-- KEEP ONLY ONE -->
@ -58,9 +59,36 @@ How do your performance changes scale on a system of this size?
they are really big customers, and we want to keep their business!) they are really big customers, and we want to keep their business!)
--> -->
### Follow-up Required <!-- Optional --> ### Documentation Follow-up Required?
<!-- Keep one of the two sections -->
<!-- <!--
Does your MR require coordination with the documentation/support teams? If this MR does change:
If so, apply the label and explain here. - How the user experiences or uses the application
- Visual appearance
- Screen flow
- Texts
- How the application is deployed an maintained
- Deployment process
- System requirements
- Command line interfaces
-->
This MR may require follow-up by the documentation team.
/label ~Documentation
<!--
Otherwise
--> -->
This MR does not require any follow-up.
## QA Checklist (to be filled by the reviewer)
- [ ] Implementation satisfies specification
- [ ] Changes confirmed by manual testing
- [ ] [Code style](https://git.znuny.com/zammad/zammad/-/wikis/Coding-style-guide) is appropriate
- [ ] Performance will not degrade
- [ ] Code is properly covered with tests
- If follow-up by the documentation team is needed:
- [ ] Add a comment with this text
> @<!-- don't treat this as a mention until copied -->MrGeneration please check if this MR requires changes to the documentation. Thanks!

View file

@ -6,6 +6,8 @@ require:
- rubocop-performance - rubocop-performance
- rubocop-rails - rubocop-rails
- rubocop-rspec - rubocop-rspec
- rubocop-inflector
- ../config/initializers/inflections.rb
- ./rubocop_zammad.rb - ./rubocop_zammad.rb
inherit_from: inherit_from:

View file

@ -887,10 +887,6 @@ Metrics/PerceivedComplexity:
- 'test/browser_test_helper.rb' - 'test/browser_test_helper.rb'
- 'test/integration/slack_test.rb' - 'test/integration/slack_test.rb'
Rails/AssertNot:
Exclude:
- 'test/browser/admin_permissions_granular_vs_full_test.rb'
Rails/CreateTableWithTimestamps: Rails/CreateTableWithTimestamps:
Exclude: Exclude:
- 'db/migrate/20120101000001_create_base.rb' - 'db/migrate/20120101000001_create_base.rb'

View file

@ -1,196 +1,15 @@
# Change Log # Change Log
## [5.0.1](https://github.com/zammad/zammad/tree/5.0.1) (2021-10-08) ## [5.1.0](https://github.com/zammad/zammad/tree/5.1.0) (2021-xx-xx)
[Full Changelog](https://github.com/zammad/zammad/compare/5.0.0...5.0.1) [Full Changelog](https://github.com/zammad/zammad/compare/5.0.0...5.1.0)
**Fixed bugs:**
- Bug Report 4.1.x Overview Sort - Grouped by user [3737](https://github.com/zammad/zammad/issues/3737) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[overviews](https://github.com/zammad/zammad/labels/overviews)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[regression](https://github.com/zammad/zammad/labels/regression)]
- Article box opening on tickets with no changes [3789](https://github.com/zammad/zammad/issues/3789) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
- UploadCacheCleanupJob does not execute [3787](https://github.com/zammad/zammad/issues/3787) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- lib/fill_db.rb fails to work in production environments [3788](https://github.com/zammad/zammad/issues/3788) [[bug](https://github.com/zammad/zammad/labels/bug)]
## [5.0.0](https://github.com/zammad/zammad/tree/5.0.0) (2021-10-05)
[Full Changelog](https://github.com/zammad/zammad/compare/4.1.0...5.0.0)
**Implemented enhancements:** **Implemented enhancements:**
- Core Workflow: Add organization condition attributes for object User [3779](https://github.com/zammad/zammad/issues/3779) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- No script content (e. g. javascript) in emails [3365](https://github.com/zammad/zammad/issues/3365) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[mail processing](https://github.com/zammad/zammad/labels/mail processing)]
- Read-only custom objects [2102](https://github.com/zammad/zammad/issues/2102) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[object manager attribute](https://github.com/zammad/zammad/labels/object manager attribute)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
- Granular admin permission for google channel is missing [3194](https://github.com/zammad/zammad/issues/3194) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)]
- Use country codes (e.g. `DE` or `ES`) for knowledgebase answer selection [3574](https://github.com/zammad/zammad/issues/3574) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
- New email account expert view cannot be opened without filling in all fields [3137](https://github.com/zammad/zammad/issues/3137) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
- Don't provide option to create API-Token if authentication via API token is disabled [3168](https://github.com/zammad/zammad/issues/3168) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
- Define default "stay on tab" / "close tab" behavior [257](https://github.com/zammad/zammad/issues/257) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Space after ticket hook in ticket/zoom [3265](https://github.com/zammad/zammad/issues/3265) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
- Enhance LDAP login to not affect "failed logins" [2389](https://github.com/zammad/zammad/issues/2389) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[LDAP](https://github.com/zammad/zammad/labels/LDAP)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Detect Jira follow-ups [3695](https://github.com/zammad/zammad/issues/3695) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[mail processing](https://github.com/zammad/zammad/labels/mail processing)]
- csv import example file download (organizations) is empty [3514](https://github.com/zammad/zammad/issues/3514) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)]
- Add bulk option to extended search [445](https://github.com/zammad/zammad/issues/445) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- MessageBird integration [3672](https://github.com/zammad/zammad/issues/3672) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Add attachment via Trigger and scheduler if wanted by admin [2485](https://github.com/zammad/zammad/issues/2485) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[admin area](https://github.com/zammad/zammad/labels/admin area)] [[trigger](https://github.com/zammad/zammad/labels/trigger)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Tag KB Answers [2612](https://github.com/zammad/zammad/issues/2612) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
- Backtrace lines pollute log [3556](https://github.com/zammad/zammad/issues/3556) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[authentication](https://github.com/zammad/zammad/labels/authentication)]
- Visualise locked users in UI and make them unlock-able for admin [2565](https://github.com/zammad/zammad/issues/2565) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Representation of inactive customers and orgnizations [3302](https://github.com/zammad/zammad/issues/3302) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- No possibility to enforce auto response if one of the blocking auto response mail header exists [3667](https://github.com/zammad/zammad/issues/3667) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[mail processing](https://github.com/zammad/zammad/labels/mail processing)]
- REST doc of Online Notification controler is outdated/wrong and expand param is missing. [3635](https://github.com/zammad/zammad/issues/3635) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)]
- Scroll background instead of foreground [978](https://github.com/zammad/zammad/issues/978) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend / JS app)]
- Log if a active user (in UI) has been logged out due to SessionTimeout [3614](https://github.com/zammad/zammad/issues/3614) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)]
- The rake task `zammad:package:migrate` does not execute migrations for linked packages. [3606](https://github.com/zammad/zammad/issues/3606) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[developer experience](https://github.com/zammad/zammad/labels/developer experience)]
- Accept 2xx as response for requests in UserAgent [3573](https://github.com/zammad/zammad/pull/3573) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)]
- Don't fail job is `deletable_id` is no longer available [3536](https://github.com/zammad/zammad/issues/3536) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[data privacy](https://github.com/zammad/zammad/labels/data privacy)]
- Add console output for searchindex rebuild status [3562](https://github.com/zammad/zammad/issues/3562) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)]
- Display minutes for session timeouts instead of seconds [3575](https://github.com/zammad/zammad/issues/3575) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[admin area](https://github.com/zammad/zammad/labels/admin area)]
**Fixed bugs:** **Fixed bugs:**
- Inconstant alignment in the listing of attachments/submit button in new article area [3773](https://github.com/zammad/zammad/issues/3773) [[bug](https://github.com/zammad/zammad/labels/bug)]
- Improve contrasts in answer search for articles [3783](https://github.com/zammad/zammad/issues/3783) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
- escaped 'Set fixed' workflows don't refresh set values on active ticket sessions [3757](https://github.com/zammad/zammad/issues/3757) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
- ObjectManager Attribute without screen attribute causes CoreWorkflows migration to fail [3781](https://github.com/zammad/zammad/issues/3781) [[bug](https://github.com/zammad/zammad/labels/bug)] [[migration / update](https://github.com/zammad/zammad/labels/migration / update)]
- Zammad preflight check warning output causes Syntax-Error in postinstall.sh and failing installation [2674](https://github.com/zammad/zammad/issues/2674) [[bug](https://github.com/zammad/zammad/labels/bug)] [[migration / update](https://github.com/zammad/zammad/labels/migration / update)]
- Shared organization issue (Create your first ticket) [2780](https://github.com/zammad/zammad/issues/2780) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
- Force users to reload after system migration [3776](https://github.com/zammad/zammad/issues/3776) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Unable to cancel attachment upload [2351](https://github.com/zammad/zammad/issues/2351) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
- [BUG] miss spell in db/migrate/20210923172256_issue_2619_kb_header_link_color.rb [3777](https://github.com/zammad/zammad/issues/3777) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[migration / update](https://github.com/zammad/zammad/labels/migration / update)]
- KB header and footer link-color not changeable [2619](https://github.com/zammad/zammad/issues/2619) [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)] [[specification required](https://github.com/zammad/zammad/labels/specification required)] [[theming / skinning](https://github.com/zammad/zammad/labels/theming / skinning)]
- Syntax errors break scheduler job for good [3028](https://github.com/zammad/zammad/issues/3028) [[bug](https://github.com/zammad/zammad/labels/bug)]
- Existing tickets: New article modal with padding-left: 0; padding-right: 0; [3772](https://github.com/zammad/zammad/issues/3772) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[regression](https://github.com/zammad/zammad/labels/regression)]
- Possible race condition causing OTRS import to fail [3765](https://github.com/zammad/zammad/issues/3765) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
- Incorrect alignment in the listing of attachments when creating a ticket [3746](https://github.com/zammad/zammad/issues/3746) [[bug](https://github.com/zammad/zammad/labels/bug)]
- Saved conditions break on selections without reloading [3758](https://github.com/zammad/zammad/issues/3758) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
- Misleading view of user icons which are on vacation and disabled [3075](https://github.com/zammad/zammad/issues/3075) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
- User with user_id 1 is show in admin interface (which should not) [3755](https://github.com/zammad/zammad/issues/3755) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)]
- Unable to close tickets in certran cases if core workflow is used [3710](https://github.com/zammad/zammad/issues/3710) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
- Login failed after upgrade to zammad 5.0 [3759](https://github.com/zammad/zammad/issues/3759) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[migration / update](https://github.com/zammad/zammad/labels/migration / update)]
- Unable to create a ticket in web app if default for additional boolean value is FALSE [3762](https://github.com/zammad/zammad/issues/3762) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- User search / selection does not always work if you want to correct your search [3696](https://github.com/zammad/zammad/issues/3696) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Unable to create new organization [3751](https://github.com/zammad/zammad/issues/3751) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
- Core Workflow "is not" operator is working unexpected [3752](https://github.com/zammad/zammad/issues/3752) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
- scrollPageHeader disappears when answering via email [3736](https://github.com/zammad/zammad/issues/3736) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
- Scheduler ignores "disable notifications == no" [3684](https://github.com/zammad/zammad/issues/3684) [[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 by payment)]
- Notes on existing ticks are discarded by editing profile settings [3088](https://github.com/zammad/zammad/issues/3088) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
- Owner selection empty or pending reminder data picker not shown if customer field has content but no customer is selected (in ticket create screen) [3743](https://github.com/zammad/zammad/issues/3743) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
- Removal of Microsoft365-Channel not possible via UI when having no email address relation [3741](https://github.com/zammad/zammad/issues/3741) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)]
- Removal of Google-Channel not possible via UI when having a normal email channel of same account [3203](https://github.com/zammad/zammad/issues/3203) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[channel](https://github.com/zammad/zammad/labels/channel)]
- Core-Workflow: Option manipulation of boolean attributes not possible [3740](https://github.com/zammad/zammad/issues/3740) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
- Core Workflow: Show hidden attributes on group selection (ticket edit) [3739](https://github.com/zammad/zammad/issues/3739) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
- OTRS migration doesn't import article creation time [3235](https://github.com/zammad/zammad/issues/3235) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
- Spaces stay URL-encoded when going back to search results on KB for agents [3378](https://github.com/zammad/zammad/issues/3378) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
- Not working unpack of mail body if decrypted body is in signed-data attachment [3705](https://github.com/zammad/zammad/issues/3705) [[bug](https://github.com/zammad/zammad/labels/bug)] [[mail processing](https://github.com/zammad/zammad/labels/mail processing)]
- It should be possible to show attributes which are configured `shown` false [3726](https://github.com/zammad/zammad/issues/3726) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
- admin.core_workflow permission is missing [3732](https://github.com/zammad/zammad/issues/3732) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
- AttributeManager doesn't display boolean default values within the UI [3271](https://github.com/zammad/zammad/issues/3271) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[object manager attribute](https://github.com/zammad/zammad/labels/object manager attribute)]
- Spaces in front of mentions can cause partly content removal [3717](https://github.com/zammad/zammad/issues/3717) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Drop files here not disappearing after dropping a file [3725](https://github.com/zammad/zammad/issues/3725) [[bug](https://github.com/zammad/zammad/labels/bug)] [[regression](https://github.com/zammad/zammad/labels/regression)]
- ⚙ -> Manage -> Calendars -> Edit: "Subscribe to public holidays in" sorted wrong [2528](https://github.com/zammad/zammad/issues/2528) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
- Pending reminder notifications are not sent if ticket is opened in tab [2931](https://github.com/zammad/zammad/issues/2931) [[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 by payment)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend / JS app)]
- Fields are falsey displayed as mandatory if they contain historic screen values [3721](https://github.com/zammad/zammad/issues/3721) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
- `ticket.customer_id` is `current_user` breaks email fetching [3503](https://github.com/zammad/zammad/issues/3503) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
- Scheduler jobs don't ensure current ticket information if they're running a long time [3329](https://github.com/zammad/zammad/issues/3329) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- groups selection for customer panel is not working anymore (with core workflows) [3713](https://github.com/zammad/zammad/issues/3713) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
- Scheduler Time offset [457](https://github.com/zammad/zammad/issues/457) [[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 by payment)]
- "Warten auf Erinnerung" - Inconsistent timestamps [2366](https://github.com/zammad/zammad/issues/2366) [[bug](https://github.com/zammad/zammad/labels/bug)]
- Ical escaltion update the calendar entry to 2:00 am [2157](https://github.com/zammad/zammad/issues/2157) [[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 by payment)]
- Inheritance of out of office settings [3694](https://github.com/zammad/zammad/issues/3694) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Core worflow perform action "select" should not make multiple values selectable [3712](https://github.com/zammad/zammad/issues/3712) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
- Setting for CheckMK not saved in zammad [3707](https://github.com/zammad/zammad/issues/3707) [[bug](https://github.com/zammad/zammad/labels/bug)]
- Any user can be set as a replacement for out of office [2293](https://github.com/zammad/zammad/issues/2293) [[bug](https://github.com/zammad/zammad/labels/bug)] [[personal settings/menu](https://github.com/zammad/zammad/labels/personal settings/menu)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Core Workflow Implementation [3709](https://github.com/zammad/zammad/issues/3709) [[feature backlog](https://github.com/zammad/zammad/labels/feature backlog)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[core](https://github.com/zammad/zammad/labels/core)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
- Can't remove auto assignment timeout [2544](https://github.com/zammad/zammad/issues/2544) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Assign Follow ups has no affect [2455](https://github.com/zammad/zammad/issues/2455) [[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 by payment)]
- The calendar shows Chilean holidays one day in advance [3706](https://github.com/zammad/zammad/issues/3706) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[regression](https://github.com/zammad/zammad/labels/regression)]
- Organization removal does not clear organization_id from Tickets [3703](https://github.com/zammad/zammad/issues/3703) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[regression](https://github.com/zammad/zammad/labels/regression)]
- Merge not possible with not set, required attributes [2634](https://github.com/zammad/zammad/issues/2634) [[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 by payment)] [[object manager attribute](https://github.com/zammad/zammad/labels/object manager attribute)]
- Merging tickets doesnt trigger notification for target ticket [3105](https://github.com/zammad/zammad/issues/3105) [[bug](https://github.com/zammad/zammad/labels/bug)] [[notification](https://github.com/zammad/zammad/labels/notification)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
- One of DB migrations timestamp breaks migrations queue [3702](https://github.com/zammad/zammad/issues/3702) [[bug](https://github.com/zammad/zammad/labels/bug)]
- Tags in ticket create screen displayed wrong [3701](https://github.com/zammad/zammad/issues/3701) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[regression](https://github.com/zammad/zammad/labels/regression)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
- Custom date attributes provide inconsistent sorting within grouping [3663](https://github.com/zammad/zammad/issues/3663) [[bug](https://github.com/zammad/zammad/labels/bug)] [[overviews](https://github.com/zammad/zammad/labels/overviews)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Mix of binary encoded ISO-8859-1 data in header fields (e.g. to) fails mail processing [3697](https://github.com/zammad/zammad/issues/3697) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[mail processing](https://github.com/zammad/zammad/labels/mail processing)]
- Zammad sends mails even though there is no email address visible in TO or CC fields (any more) [3554](https://github.com/zammad/zammad/issues/3554) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
- Error 500 / zammad {"error":" 123456 is out of range for ActiveModel::Type::Integer with limit 4 bytes"} [3647](https://github.com/zammad/zammad/issues/3647) [[bug](https://github.com/zammad/zammad/labels/bug)]
- Default value not set for attributes of type input, select, tree_select, richtext, textarea, checkbox [1653](https://github.com/zammad/zammad/issues/1653) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[object manager attribute](https://github.com/zammad/zammad/labels/object manager attribute)]
- When replying, quote article content only [3539](https://github.com/zammad/zammad/issues/3539) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Trigger ignores changes on some Ticket attributes [3428](https://github.com/zammad/zammad/issues/3428) [[bug](https://github.com/zammad/zammad/labels/bug)] [[trigger](https://github.com/zammad/zammad/labels/trigger)]
- KB search does not allow pagination on endpoint [3068](https://github.com/zammad/zammad/issues/3068) [[bug](https://github.com/zammad/zammad/labels/bug)] [[API](https://github.com/zammad/zammad/labels/API)] [[search](https://github.com/zammad/zammad/labels/search)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
- “You have not created a ticket yet” shown but I already have closed tickets [3053](https://github.com/zammad/zammad/issues/3053) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[overviews](https://github.com/zammad/zammad/labels/overviews)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[🚧 refactoring 2.0 🚧](https://github.com/zammad/zammad/labels/🚧 refactoring 2.0 🚧)]
- Support HTML5 'required' attribute in forms [1890](https://github.com/zammad/zammad/pull/1890)
- Freshdesk import works not with more then 30_000 tickets [3681](https://github.com/zammad/zammad/issues/3681) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
- Pagination for knowledge base answer sorting breaks sorting [3660](https://github.com/zammad/zammad/issues/3660) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[admin area](https://github.com/zammad/zammad/labels/admin area)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
- Zendesk-Import `Connection reset by peer` cancels import [3583](https://github.com/zammad/zammad/issues/3583) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)] [[waiting for feedback](https://github.com/zammad/zammad/labels/waiting for feedback)]
- Prefer HTTP standard header "From" over custom "X-On-Behalf-Of" for impersonation [3113](https://github.com/zammad/zammad/issues/3113) [[API](https://github.com/zammad/zammad/labels/API)] [[help appreciated](https://github.com/zammad/zammad/labels/help appreciated)] [[authentication](https://github.com/zammad/zammad/labels/authentication)] [[hacktoberfest](https://github.com/zammad/zammad/labels/hacktoberfest)] [[:construction: refactoring :construction:](https://github.com/zammad/zammad/labels/:construction: refactoring :construction:)] [[specification required](https://github.com/zammad/zammad/labels/specification required)] [[good first issue](https://github.com/zammad/zammad/labels/good first issue)] [[deprecation](https://github.com/zammad/zammad/labels/deprecation)]
- Do not send `domain` and migrate `domain` out of Google and Microsoft 365 channels [3669](https://github.com/zammad/zammad/issues/3669) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- high organization user count relates to bad performance [3648](https://github.com/zammad/zammad/issues/3648) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[performance](https://github.com/zammad/zammad/labels/performance)]
- Removing organizations removes user and ticket as well [3688](https://github.com/zammad/zammad/issues/3688) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Wrong user is used when "X-On-Behalf-Of” header value is an email that starts with digits [2851](https://github.com/zammad/zammad/issues/2851) [[bug](https://github.com/zammad/zammad/labels/bug)] [[API](https://github.com/zammad/zammad/labels/API)]
- Allow out of office for one day without setting two days [3590](https://github.com/zammad/zammad/issues/3590) [[bug](https://github.com/zammad/zammad/labels/bug)] [[personal settings/menu](https://github.com/zammad/zammad/labels/personal settings/menu)]
- FreshDesk Import doesn't pull in auto-assign domain(s) for organizations [3687](https://github.com/zammad/zammad/issues/3687) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
- FreshDesk Import brings in all users as inactive [3689](https://github.com/zammad/zammad/issues/3689) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
- KB Public UI icons are misspaced [3680](https://github.com/zammad/zammad/issues/3680) [[bug](https://github.com/zammad/zammad/labels/bug)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
- FreshDesk Import Error - undefined method `body' for 10:Integer [3661](https://github.com/zammad/zammad/issues/3661) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
- Cannot select multiple tickets in ticket overview with shift+click in Firefox [3449](https://github.com/zammad/zammad/issues/3449) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[overviews](https://github.com/zammad/zammad/labels/overviews)]
- "Drop files here" drag area not always hiding [3460](https://github.com/zammad/zammad/issues/3460) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[help appreciated](https://github.com/zammad/zammad/labels/help appreciated)]
- CTI Callerlog signaling hides "+" for new ticket if more than one user is found [2930](https://github.com/zammad/zammad/issues/2930) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend / JS app)]
- Zendesk URL check fails with Net::HTTPForbidden 403 error [3679](https://github.com/zammad/zammad/issues/3679) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
- Mac Mail inline PDF destroys E-Mail-Body [2407](https://github.com/zammad/zammad/issues/2407) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[mail processing](https://github.com/zammad/zammad/labels/mail processing)]
- Outdated urls on security page (third-party logins) [3627](https://github.com/zammad/zammad/issues/3627) [[bug](https://github.com/zammad/zammad/labels/bug)]
- 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)]
- Text Editor deletes text unrecoverably if quicktext was canceled with Ctrl+Backspace [2886](https://github.com/zammad/zammad/issues/2886) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend / JS app)]
- The defined ignored attributes in the popover context are not working [3668](https://github.com/zammad/zammad/issues/3668) [[bug](https://github.com/zammad/zammad/labels/bug)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend / JS app)]
- Ensure Upload Cache files are removed after grace period [3579](https://github.com/zammad/zammad/issues/3579) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Package installation fails because of too long file names [3666](https://github.com/zammad/zammad/issues/3666) [[bug](https://github.com/zammad/zammad/labels/bug)]
- Package migrations fail on package installation or update due to codebase self-modification [3580](https://github.com/zammad/zammad/issues/3580) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core](https://github.com/zammad/zammad/labels/core)]
- saving Boolean field with empty values [2973](https://github.com/zammad/zammad/issues/2973) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
- CTI-API should handle doubled requests better [3247](https://github.com/zammad/zammad/issues/3247) [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[CTI](https://github.com/zammad/zammad/labels/CTI)] [[specification required](https://github.com/zammad/zammad/labels/specification required)]
- In some situations the chat button is visible without a active websocket connection [2258](https://github.com/zammad/zammad/issues/2258) [[bug](https://github.com/zammad/zammad/labels/bug)] [[chat](https://github.com/zammad/zammad/labels/chat)]
- Fixes mistypes in article_view.coffee [3658](https://github.com/zammad/zammad/pull/3658)
- Creating and editing users via office 365 failes with Image source is invalid [3617](https://github.com/zammad/zammad/issues/3617) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- FreshDesk Import fails with timeout error [3653](https://github.com/zammad/zammad/issues/3653) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
- Chat widget cannot load CSS on (sub)domains that contain "ws" characters [3654](https://github.com/zammad/zammad/issues/3654) [[bug](https://github.com/zammad/zammad/labels/bug)] [[chat](https://github.com/zammad/zammad/labels/chat)]
- timezone issue with elasticsearch [2085](https://github.com/zammad/zammad/issues/2085) [[duplicate](https://github.com/zammad/zammad/labels/duplicate)]
- Invalid html signature detection for exchange warning boxes [3571](https://github.com/zammad/zammad/issues/3571) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Searching for integer fields does not work as expected [3599](https://github.com/zammad/zammad/issues/3599) [[bug](https://github.com/zammad/zammad/labels/bug)] [[search](https://github.com/zammad/zammad/labels/search)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- FreshDesk import fails on certain custom field types [3628](https://github.com/zammad/zammad/issues/3628) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
- Freshdesk import subdomain selection fails [3631](https://github.com/zammad/zammad/issues/3631) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
- Search results missing for users with two names within lastname [3598](https://github.com/zammad/zammad/issues/3598) [[bug](https://github.com/zammad/zammad/labels/bug)] [[search](https://github.com/zammad/zammad/labels/search)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- New location notification with X-On-Behalf [3611](https://github.com/zammad/zammad/issues/3611) [[bug](https://github.com/zammad/zammad/labels/bug)] [[API](https://github.com/zammad/zammad/labels/API)] [[notification](https://github.com/zammad/zammad/labels/notification)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- State list of tickets ignore locale for their sorting [3335](https://github.com/zammad/zammad/issues/3335) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Newly created users are only shown in the admin interface after reload [3050](https://github.com/zammad/zammad/issues/3050) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend / JS app)]
- Migration 3.6.1 to 4.1 : No configured business hours found! [3641](https://github.com/zammad/zammad/issues/3641) [[bug](https://github.com/zammad/zammad/labels/bug)]
- Verification tokens questionable behavior in developer mode [3116](https://github.com/zammad/zammad/issues/3116) [[developer experience](https://github.com/zammad/zammad/labels/developer experience)]
- Replacing a mention with a new leads to mentioning both agents [3636](https://github.com/zammad/zammad/issues/3636) [[bug](https://github.com/zammad/zammad/labels/bug)]
- Attachment order is wrong [3584](https://github.com/zammad/zammad/issues/3584) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
- When disconnecting a Chat, customer can still continue posting messages [2559](https://github.com/zammad/zammad/issues/2559) [[bug](https://github.com/zammad/zammad/labels/bug)] [[chat](https://github.com/zammad/zammad/labels/chat)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- some macros are hidden in the drag & drop- overview with a small screen size [3359](https://github.com/zammad/zammad/issues/3359) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Add redis as an (optional) session store backend [3450](https://github.com/zammad/zammad/pull/3450)
- Text Module widget is broken/hidden after pressing backspace (once) [3637](https://github.com/zammad/zammad/issues/3637) [[bug](https://github.com/zammad/zammad/labels/bug)]
- Mention widget show same users several times (if rest requests will return in different order) [3639](https://github.com/zammad/zammad/issues/3639) [[bug](https://github.com/zammad/zammad/labels/bug)]
- The rebuild of the index is failing [3633](https://github.com/zammad/zammad/issues/3633) [[bug](https://github.com/zammad/zammad/labels/bug)] [[chat](https://github.com/zammad/zammad/labels/chat)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Monitoring endpoint complains about `Failed to run SessionTimeoutJob.perform_now after 10 tries #<NoMethodError: undefined method `id' for nil:NilClass` [3632](https://github.com/zammad/zammad/issues/3632) [[bug](https://github.com/zammad/zammad/labels/bug)]
- Updating package-based installations can break the front end. [3629](https://github.com/zammad/zammad/issues/3629) [[bug](https://github.com/zammad/zammad/labels/bug)]
- backup: stop using su for pg_dump [3352](https://github.com/zammad/zammad/pull/3352) [[waiting for feedback](https://github.com/zammad/zammad/labels/waiting for feedback)]
- Reply-to header ignored if from contains a system address [2551](https://github.com/zammad/zammad/issues/2551) [[bug](https://github.com/zammad/zammad/labels/bug)]
- Maintenance: Fix handling of test that require secrets not to run for GitHub PRs. [3626](https://github.com/zammad/zammad/pull/3626)
- replacing find -mtime with find -mmin [3570](https://github.com/zammad/zammad/pull/3570)
- Ensure to migrate old calendar URLs for google calendar sources [3618](https://github.com/zammad/zammad/issues/3618) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[regression](https://github.com/zammad/zammad/labels/regression)]
- Mentions/Subscribe with read permissions [3615](https://github.com/zammad/zammad/issues/3615) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Chat-Message references not cleared with data privacy task [3610](https://github.com/zammad/zammad/issues/3610) [[bug](https://github.com/zammad/zammad/labels/bug)] [[data privacy](https://github.com/zammad/zammad/labels/data privacy)]
- Overview names are hidden in mobile view for RTL languages [3500](https://github.com/zammad/zammad/issues/3500) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[mobile](https://github.com/zammad/zammad/labels/mobile)]
- SMTP-Attachments missing when using the API under high load [2991](https://github.com/zammad/zammad/issues/2991) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Inline image conversion from jpeg to png causes huge overhead [3538](https://github.com/zammad/zammad/issues/3538) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- session timeout does regulary logout active users before timeout because of dead old sessions [3605](https://github.com/zammad/zammad/issues/3605) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Zendesk import creates new ticket numbers rather than using the Zendesk ticket IDs also as ticket numbers in Zammad [3593](https://github.com/zammad/zammad/issues/3593) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- wrong behaviour for the disabled option in session timeout [3600](https://github.com/zammad/zammad/issues/3600) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Header links are not responsive [3133](https://github.com/zammad/zammad/issues/3133) [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
- Update description of the session timeout setting [3597](https://github.com/zammad/zammad/issues/3597) [[bug](https://github.com/zammad/zammad/labels/bug)] [[admin area](https://github.com/zammad/zammad/labels/admin area)]
- Escalation calculation breaks data privacy ticket deletion [3588](https://github.com/zammad/zammad/issues/3588) [[bug](https://github.com/zammad/zammad/labels/bug)] [[data privacy](https://github.com/zammad/zammad/labels/data privacy)]
- `SessionTimeoutJob.perform_now` fails if user no longer exists [3586](https://github.com/zammad/zammad/issues/3586) [[bug](https://github.com/zammad/zammad/labels/bug)]
- Robots.txt should allow indexing Knowledge Base on custom URLs [3164](https://github.com/zammad/zammad/issues/3164) [[bug](https://github.com/zammad/zammad/labels/bug)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
- DataPrivacy may fail to clear user relations [3585](https://github.com/zammad/zammad/issues/3585) [[bug](https://github.com/zammad/zammad/labels/bug)] [[data privacy](https://github.com/zammad/zammad/labels/data privacy)]
- SessionTimeoutJob.perform_now scheduler job fails on update if scheduler process wasn't restarted [3581](https://github.com/zammad/zammad/issues/3581) [[bug](https://github.com/zammad/zammad/labels/bug)]
- Freshdesk import attribute ID mapping lookup constants fail application boot in systems with changed default names [3582](https://github.com/zammad/zammad/issues/3582) [[bug](https://github.com/zammad/zammad/labels/bug)]
- mentioned KB entries with the same title in different categories can not distinguished [3559](https://github.com/zammad/zammad/issues/3559) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
- Invalid auto assignment conditions may break ticket view for unassigned tickets [3567](https://github.com/zammad/zammad/issues/3567) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
- Add Greek translation for chat [3569](https://github.com/zammad/zammad/pull/3569) [[chat](https://github.com/zammad/zammad/labels/chat)] [[translation](https://github.com/zammad/zammad/labels/translation)]
- Freshdesk [865](https://github.com/zammad/zammad/issues/865) [[feature backlog](https://github.com/zammad/zammad/labels/feature backlog)] [[import](https://github.com/zammad/zammad/labels/import)]
- Old JQuery version delivered [3431](https://github.com/zammad/zammad/issues/3431) [[bug](https://github.com/zammad/zammad/labels/bug)] [[chat](https://github.com/zammad/zammad/labels/chat)]

View file

@ -3,8 +3,8 @@
source 'https://gems.sutty.nl' source 'https://gems.sutty.nl'
# core - base # core - base
ruby '2.7.4' ruby '2.7.3'
gem 'rails', '~> 6.0' gem 'rails', '~> 6.0.0'
# core - rails additions # core - rails additions
gem 'activerecord-import' gem 'activerecord-import'
@ -198,6 +198,7 @@ group :development, :test do
gem 'overcommit' gem 'overcommit'
gem 'rubocop' gem 'rubocop'
gem 'rubocop-faker' gem 'rubocop-faker'
gem 'rubocop-inflector'
gem 'rubocop-performance' gem 'rubocop-performance'
gem 'rubocop-rails' gem 'rubocop-rails'
gem 'rubocop-rspec' gem 'rubocop-rspec'

View file

@ -90,31 +90,31 @@ GEM
activerecord (>= 4.2) activerecord (>= 4.2)
addressable (2.8.0) addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0) public_suffix (>= 2.0.2, < 5.0)
argon2 (2.0.3) argon2 (2.1.1)
ffi (~> 1.14) ffi (~> 1.14)
ffi-compiler (~> 1.0) ffi-compiler (~> 1.0)
argon2 (2.0.3-x86_64-linux-musl) argon2 (2.0.3-x86_64-linux-musl)
ffi (~> 1.14) ffi (~> 1.14)
ffi-compiler (~> 1.0) ffi-compiler (~> 1.0)
ast (2.4.2) ast (2.4.2)
async (1.29.1) async (1.30.1)
console (~> 1.10) console (~> 1.10)
nio4r (~> 2.3) nio4r (~> 2.3)
timers (~> 4.1) timers (~> 4.1)
async-http (0.56.3) async-http (0.56.5)
async (~> 1.25) async (>= 1.25)
async-io (~> 1.28) async-io (>= 1.28)
async-pool (~> 0.2) async-pool (>= 0.2)
protocol-http (~> 0.22.0) protocol-http (~> 0.22.0)
protocol-http1 (~> 0.14.0) protocol-http1 (~> 0.14.0)
protocol-http2 (~> 0.14.0) protocol-http2 (~> 0.14.0)
async-http-faraday (0.11.0) async-http-faraday (0.11.0)
async-http (~> 0.42) async-http (~> 0.42)
faraday faraday
async-io (1.32.1) async-io (1.32.2)
async (~> 1.14) async
async-pool (0.3.7) async-pool (0.3.9)
async (~> 1.25) async (>= 1.25)
autoprefixer-rails (10.3.3.0) autoprefixer-rails (10.3.3.0)
execjs (~> 2) execjs (~> 2)
binding_of_caller (1.0.0) binding_of_caller (1.0.0)
@ -188,7 +188,7 @@ GEM
docile (1.4.0) docile (1.4.0)
domain_name (0.5.20190701) domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0) unf (>= 0.0.5, < 1.0.0)
doorkeeper (5.5.2) doorkeeper (5.5.4)
railties (>= 5) railties (>= 5)
dotenv (2.7.6) dotenv (2.7.6)
eco (1.0.0) eco (1.0.0)
@ -232,9 +232,9 @@ GEM
faraday-net_http_persistent (1.2.0) faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0) faraday-patron (1.0.0)
faraday-rack (1.0.0) faraday-rack (1.0.0)
faraday_middleware (1.0.0) faraday_middleware (1.1.0)
faraday (~> 1.0) faraday (~> 1.0)
ffi (1.15.3-x86_64-linux-musl) ffi (1.15.4-x86_64-linux-musl)
ffi-compiler (1.0.1) ffi-compiler (1.0.1)
ffi (>= 1.0.0) ffi (>= 1.0.0)
rake rake
@ -302,17 +302,17 @@ GEM
inflection (1.0.0) inflection (1.0.0)
iniparse (1.5.0) iniparse (1.5.0)
interception (0.5) interception (0.5)
json (2.5.1)
json (2.5.1-x86_64-linux-musl) json (2.5.1-x86_64-linux-musl)
jwt (2.2.3) jwt (2.3.0)
kgio (2.11.4) kgio (2.11.4)
kgio (2.11.4-x86_64-linux-musl) kgio (2.11.4-x86_64-linux-musl)
koala (3.0.0) koala (3.0.0)
addressable addressable
faraday faraday
json (>= 1.8) json (>= 1.8)
libv8 (8.4.255.0)
libv8 (8.4.255.0-x86_64-linux) libv8 (8.4.255.0-x86_64-linux)
listen (3.5.1) listen (3.7.0)
rb-fsevent (~> 0.10, >= 0.10.3) rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10) rb-inotify (~> 0.9, >= 0.9.10)
little-plugger (1.1.4) little-plugger (1.1.4)
@ -323,14 +323,14 @@ GEM
crass (~> 1.0.2) crass (~> 1.0.2)
nokogiri (>= 1.5.9) nokogiri (>= 1.5.9)
lumberjack (1.2.8) lumberjack (1.2.8)
marcel (1.0.1) marcel (1.0.2)
memoizable (0.4.2) memoizable (0.4.2)
thread_safe (~> 0.3, >= 0.3.1) thread_safe (~> 0.3, >= 0.3.1)
messagebird-rest (3.0.0) messagebird-rest (3.0.0)
method_source (1.0.0) method_source (1.0.0)
mime-types (3.3.1) mime-types (3.3.1)
mime-types-data (~> 3.2015) mime-types-data (~> 3.2015)
mime-types-data (3.2021.0225) mime-types-data (3.2021.0901)
mini_mime (1.1.1) mini_mime (1.1.1)
mini_portile2 (2.6.1) mini_portile2 (2.6.1)
mini_racer (0.2.9) mini_racer (0.2.9)
@ -422,8 +422,8 @@ GEM
pg (0.21.0-x86_64-linux-musl) pg (0.21.0-x86_64-linux-musl)
power_assert (2.0.1) power_assert (2.0.1)
protocol-hpack (1.4.2) protocol-hpack (1.4.2)
protocol-http (0.22.4) protocol-http (0.22.5)
protocol-http1 (0.14.1) protocol-http1 (0.14.2)
protocol-http (~> 0.22) protocol-http (~> 0.22)
protocol-http2 (0.14.2) protocol-http2 (0.14.2)
protocol-hpack (~> 1.4) protocol-hpack (~> 1.4)
@ -480,7 +480,7 @@ GEM
rails-dom-testing (2.0.3) rails-dom-testing (2.0.3)
activesupport (>= 4.2.0) activesupport (>= 4.2.0)
nokogiri (>= 1.6) nokogiri (>= 1.6)
rails-html-sanitizer (1.4.1) rails-html-sanitizer (1.4.2)
loofah (~> 2.3) loofah (~> 2.3)
railties (6.0.4.1) railties (6.0.4.1)
actionpack (= 6.0.4.1) actionpack (= 6.0.4.1)
@ -521,38 +521,41 @@ GEM
rspec-mocks (~> 3.10) rspec-mocks (~> 3.10)
rspec-support (~> 3.10) rspec-support (~> 3.10)
rspec-support (3.10.2) rspec-support (3.10.2)
rszr (0.5.2)
rszr (0.5.2-x86_64-linux-musl) rszr (0.5.2-x86_64-linux-musl)
rubocop (1.21.0) rubocop (1.22.1)
parallel (~> 1.10) parallel (~> 1.10)
parser (>= 3.0.0.0) parser (>= 3.0.0.0)
rainbow (>= 2.2.2, < 4.0) rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0) regexp_parser (>= 1.8, < 3.0)
rexml rexml
rubocop-ast (>= 1.9.1, < 2.0) rubocop-ast (>= 1.12.0, < 2.0)
ruby-progressbar (~> 1.7) ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 3.0) unicode-display_width (>= 1.4.0, < 3.0)
rubocop-ast (1.11.0) rubocop-ast (1.12.0)
parser (>= 3.0.1.1) parser (>= 3.0.1.1)
rubocop-faker (1.1.0) rubocop-faker (1.1.0)
faker (>= 2.12.0) faker (>= 2.12.0)
rubocop (>= 0.82.0) rubocop (>= 0.82.0)
rubocop-inflector (0.1.1)
activesupport
rubocop
rubocop-rspec
rubocop-performance (1.11.5) rubocop-performance (1.11.5)
rubocop (>= 1.7.0, < 2.0) rubocop (>= 1.7.0, < 2.0)
rubocop-ast (>= 0.4.0) rubocop-ast (>= 0.4.0)
rubocop-rails (2.12.2) rubocop-rails (2.12.3)
activesupport (>= 4.2.0) activesupport (>= 4.2.0)
rack (>= 1.1) rack (>= 1.1)
rubocop (>= 1.7.0, < 2.0) rubocop (>= 1.7.0, < 2.0)
rubocop-rspec (2.5.0) rubocop-rspec (2.5.0)
rubocop (~> 1.19) rubocop (~> 1.19)
ruby-progressbar (1.11.0) ruby-progressbar (1.11.0)
ruby-saml (1.12.2) ruby-saml (1.13.0)
nokogiri (>= 1.10.5) nokogiri (>= 1.10.5)
rexml rexml
ruby2_keywords (0.0.5) ruby2_keywords (0.0.5)
rubyntlm (0.6.3) rubyntlm (0.6.3)
rubyzip (2.3.0) rubyzip (2.3.2)
sassc (2.4.0) sassc (2.4.0)
ffi (~> 1.9) ffi (~> 1.9)
sassc (2.4.0-x86_64-linux-musl) sassc (2.4.0-x86_64-linux-musl)
@ -616,7 +619,7 @@ GEM
timers (4.3.3) timers (4.3.3)
tins (1.29.1) tins (1.29.1)
sync sync
twilio-ruby (5.58.3) twilio-ruby (5.59.0)
faraday (>= 0.9, < 2.0) faraday (>= 0.9, < 2.0)
jwt (>= 1.5, <= 2.5) jwt (>= 1.5, <= 2.5)
nokogiri (>= 1.6, < 2.0) nokogiri (>= 1.6, < 2.0)
@ -637,7 +640,8 @@ GEM
execjs (>= 0.3.0, < 3) execjs (>= 0.3.0, < 3)
unf (0.1.4) unf (0.1.4)
unf_ext unf_ext
unf_ext (0.0.7.7-x86_64-linux-musl) unf_ext (0.0.8)
unf_ext (0.0.8-x86_64-linux-musl)
unicode-display_width (2.1.0) unicode-display_width (2.1.0)
unicorn (6.0.0) unicorn (6.0.0)
kgio (~> 2.6) kgio (~> 2.6)
@ -753,7 +757,7 @@ DEPENDENCIES
pundit pundit
pundit-matchers pundit-matchers
rack-livereload rack-livereload
rails (~> 6.0) rails (~> 6.0.0)
rails-controller-testing rails-controller-testing
rb-fsevent rb-fsevent
rchardet (>= 1.8.0) rchardet (>= 1.8.0)
@ -762,6 +766,7 @@ DEPENDENCIES
rszr (= 0.5.2) rszr (= 0.5.2)
rubocop rubocop
rubocop-faker rubocop-faker
rubocop-inflector
rubocop-performance rubocop-performance
rubocop-rails rubocop-rails
rubocop-rspec rubocop-rspec
@ -792,7 +797,7 @@ DEPENDENCIES
zendesk_api zendesk_api
RUBY VERSION RUBY VERSION
ruby 2.7.4p191 ruby 2.7.3p183
BUNDLED WITH BUNDLED WITH
2.2.20 2.2.27

View file

@ -1 +1 @@
5.0.x 5.1.x

View file

@ -497,7 +497,9 @@ class App.ControllerTable extends App.Controller
reference_key = groupBy + '_id' reference_key = groupBy + '_id'
if reference_key of object if reference_key of object
return reference_key attribute = _.findWhere(object.constructor.configure_attributes, { name: reference_key })
return App[attribute.relation]?.find(object[reference_key])?.displayName() || reference_key
groupBy groupBy

View file

@ -46,7 +46,7 @@ class App.UiElement.ApplicationUiElement
result = [] result = []
for row in selection for row in selection
if attribute.translate if attribute.translate
row.name = App.i18n.translateInline(row.name) row.name = App.i18n.translatePlain(row.name)
if !_.isEmpty(row.children) if !_.isEmpty(row.children)
row.children = @getConfigOptionListArray(attribute, row.children) row.children = @getConfigOptionListArray(attribute, row.children)
result.push row result.push row
@ -65,7 +65,7 @@ class App.UiElement.ApplicationUiElement
for key in order for key in order
name_new = selection[key] name_new = selection[key]
if attribute.translate if attribute.translate
name_new = App.i18n.translateInline(name_new) name_new = App.i18n.translatePlain(name_new)
attribute.options.push { attribute.options.push {
name: name_new name: name_new
value: key value: key
@ -162,7 +162,7 @@ class App.UiElement.ApplicationUiElement
nameNew = item.name nameNew = item.name
if attribute.translate if attribute.translate
nameNew = App.i18n.translateInline(nameNew) nameNew = App.i18n.translatePlain(nameNew)
row = row =
value: item.id, value: item.id,

View file

@ -37,11 +37,11 @@ class App.Browser
# define min. required browser version # define min. required browser version
map = map =
Chrome: 37 Firefox: 78 # ESR
Firefox: 36 Chrome: 83 # parallel to FF ESR - Edge is also detected as Chrome
Explorer: 10 Opera: 69 # based on Chrome 83
Safari: 6 Explorer: 11 # 10 is EOL
Opera: 22 Safari: 11 # released 2018
# disable id older # disable id older
if data.browser if data.browser

View file

@ -14,7 +14,7 @@
</div> </div>
<div class="form-group js-sure"> <div class="form-group js-sure">
<h3 class="danger-color"><%- @T('Warning') %></h3> <h3 class="danger-color"><%- @T('Warning') %></h3>
<p class="danger-color"><%- @T('There is no rollback of this deletion possible. If you are absolutely sure to do this, then type in "%s" into the input.', App.i18n.translateInline('delete').toUpperCase()) %></p> <p class="danger-color"><%- @T('There is no rollback of this deletion possible. If you are absolutely sure to do this, then type in "%s" into the input.', App.i18n.translatePlain('delete').toUpperCase()) %></p>
<%- @sure_html %> <%- @sure_html %>
</div> </div>
</div> </div>

View file

@ -1,7 +1,7 @@
<div class="login fullscreen"> <div class="login fullscreen">
<div class="fullscreen-center"> <div class="fullscreen-center">
<div class="fullscreen-body"> <div class="fullscreen-body">
<p><%- @T('Login with %s', @C('fqdn')) %></p> <p><%- @T('Log in to %s', @C('fqdn')) %></p>
<% if @C('maintenance_mode'): %> <% if @C('maintenance_mode'): %>
<div class="hero-unit alert alert--danger js-maintenanceMode"><%- @T('Zammad is currently in maintenance mode. Only administrators can login. Please wait until the maintenance window is over.') %></div> <div class="hero-unit alert alert--danger js-maintenanceMode"><%- @T('Zammad is currently in maintenance mode. Only administrators can login. Please wait until the maintenance window is over.') %></div>

View file

@ -7,6 +7,8 @@ class Channel::Driver::Imap < Channel::EmailParser
FETCH_METADATA_TIMEOUT = 2.minutes FETCH_METADATA_TIMEOUT = 2.minutes
FETCH_MSG_TIMEOUT = 4.minutes FETCH_MSG_TIMEOUT = 4.minutes
EXPUNGE_TIMEOUT = 16.minutes EXPUNGE_TIMEOUT = 16.minutes
DEFAULT_TIMEOUT = 45.seconds
CHECK_ONLY_TIMEOUT = 6.seconds
def fetchable?(_channel) def fetchable?(_channel)
true true
@ -110,10 +112,7 @@ example
Rails.logger.info "fetching imap (#{options[:host]}/#{options[:user]} port=#{port},ssl=#{ssl},starttls=#{starttls},folder=#{folder},keep_on_server=#{keep_on_server},auth_type=#{options.fetch(:auth_type, 'LOGIN')})" Rails.logger.info "fetching imap (#{options[:host]}/#{options[:user]} port=#{port},ssl=#{ssl},starttls=#{starttls},folder=#{folder},keep_on_server=#{keep_on_server},auth_type=#{options.fetch(:auth_type, 'LOGIN')})"
# on check, reduce open_timeout to have faster probing # on check, reduce open_timeout to have faster probing
check_type_timeout = 45 check_type_timeout = check_type == 'check' ? CHECK_ONLY_TIMEOUT : DEFAULT_TIMEOUT
if check_type == 'check'
check_type_timeout = 6
end
timeout(check_type_timeout) do timeout(check_type_timeout) do
@imap = ::Net::IMAP.new(options[:host], port, ssl, nil, false) @imap = ::Net::IMAP.new(options[:host], port, ssl, nil, false)

View file

@ -502,7 +502,7 @@ process unprocessable_mails (tmp/unprocessable_mail/*.eml) again
path = Rails.root.join('tmp/unprocessable_mail') path = Rails.root.join('tmp/unprocessable_mail')
files = [] files = []
Dir.glob("#{path}/*.eml") do |entry| Dir.glob("#{path}/*.eml") do |entry|
ticket, _article, _user, _mail = Channel::EmailParser.new.process(params, IO.binread(entry)) ticket, _article, _user, _mail = Channel::EmailParser.new.process(params, File.binread(entry))
next if ticket.blank? next if ticket.blank?
files.push entry files.push entry

View file

@ -678,7 +678,7 @@ to send no browser reload event, pass false
=begin =begin
where attributes are used by triggers, overviews or schedulers where attributes are used in conditions
result = ObjectManager::Attribute.attribute_to_references_hash result = ObjectManager::Attribute.attribute_to_references_hash
@ -696,22 +696,36 @@ where attributes are used by triggers, overviews or schedulers
=end =end
def self.attribute_to_references_hash def self.attribute_to_references_hash
objects = Trigger.select(:name, :condition) + Overview.select(:name, :condition) + Job.select(:name, :condition)
attribute_list = {} attribute_list = {}
objects.each do |item|
item.condition.each do |condition_key, _condition_attributes|
attribute_list[condition_key] ||= {}
attribute_list[condition_key][item.class.name] ||= []
next if attribute_list[condition_key][item.class.name].include?(item.name)
attribute_list[condition_key][item.class.name].push item.name attribute_to_references_hash_objects
.map { |elem| elem.select(:name, :condition) }
.flatten
.each do |item|
item.condition.each do |condition_key, _condition_attributes|
attribute_list[condition_key] ||= {}
attribute_list[condition_key][item.class.name] ||= []
next if attribute_list[condition_key][item.class.name].include?(item.name)
attribute_list[condition_key][item.class.name].push item.name
end
end end
end
attribute_list attribute_list
end end
=begin =begin
models that may reference attributes
=end
def self.attribute_to_references_hash_objects
Models.all.keys.select { |elem| elem.include? ChecksConditionValidation }
end
=begin
is certain attribute used by triggers, overviews or schedulers is certain attribute used by triggers, overviews or schedulers
ObjectManager::Attribute.attribute_used_by_references?('Ticket', 'attribute_name') ObjectManager::Attribute.attribute_used_by_references?('Ticket', 'attribute_name')

View file

@ -2,6 +2,7 @@
class Report::Profile < ApplicationModel class Report::Profile < ApplicationModel
self.table_name = 'report_profiles' self.table_name = 'report_profiles'
include ChecksConditionValidation
validates :name, presence: true validates :name, presence: true
store :condition store :condition

View file

@ -21,7 +21,7 @@ ActiveSupport::Inflector.inflections(:en) do |inflect|
# Rails thinks the singularized version of knowledge_bases is knowledge_basis?! # Rails thinks the singularized version of knowledge_bases is knowledge_basis?!
# see: KnowledgeBase.table_name.singularize # see: KnowledgeBase.table_name.singularize
inflect.singular(%r{(knowledge_base)s$}i, '\1') inflect.irregular 'base', 'bases'
inflect.acronym 'SMIME' inflect.acronym 'SMIME'
inflect.acronym 'GitLab' inflect.acronym 'GitLab'
inflect.acronym 'GitHub' inflect.acronym 'GitHub'

View file

@ -4,7 +4,7 @@ class Issue2619KbHeaderLinkColor < ActiveRecord::Migration[6.0]
def up def up
return if !Setting.exists?(name: 'system_init_done') return if !Setting.exists?(name: 'system_init_done')
add_column :knowledge_bases, :color_header_link, :string, limit: 25, null: false, default: 'hsl(206,8%,50%)' # rubocop:disable Zammad/ExistsResetColumnInformation add_column :knowledge_bases, :color_header_link, :string, limit: 25, null: false, default: 'hsl(206,8%,50%)'
change_column_default :knowledge_bases, :color_header_link, nil change_column_default :knowledge_bases, :color_header_link, nil
KnowledgeBase.reset_column_information KnowledgeBase.reset_column_information
end end

View file

@ -1,6 +1,6 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ # Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
class ReloadAfterCoreWorkflow < ActiveRecord::Migration[4.2] class ReloadAfterCoreWorkflow < ActiveRecord::Migration[6.0]
def up def up
# return if it's a new setup # return if it's a new setup

View file

@ -161,8 +161,8 @@ satinize html string based on whiltelist
# wrap plain-text URLs in <a> tags # wrap plain-text URLs in <a> tags
if node.is_a?(Nokogiri::XML::Text) && node.content.present? && node.content.include?(':') && node.ancestors.map(&:name).exclude?('a') if node.is_a?(Nokogiri::XML::Text) && node.content.present? && node.content.include?(':') && node.ancestors.map(&:name).exclude?('a')
urls = URI.extract(node.content, LINKABLE_URL_SCHEMES) urls = URI.extract(node.content, LINKABLE_URL_SCHEMES)
.map { |u| u.sub(%r{[,.]$}, '') } # URI::extract captures trailing dots/commas .map { |u| u.sub(%r{[,.]$}, '') } # URI::extract captures trailing dots/commas
.reject { |u| u.match?(%r{^[^:]+:$}) } # URI::extract will match, e.g., 'tel:' .grep_v(%r{^[^:]+:$}) # URI::extract will match, e.g., 'tel:'
next if urls.blank? next if urls.blank?

View file

@ -360,7 +360,7 @@ do(window) ->
'Send': 'Wyślij' 'Send': 'Wyślij'
'Chat closed by %s': 'Czat zamknięty przez %s' 'Chat closed by %s': 'Czat zamknięty przez %s'
'Compose your message...': 'Utwórz swoją wiadomość...' 'Compose your message...': 'Utwórz swoją wiadomość...'
'All colleagues are busy.': 'Wszyscy koledzy są zajęci.' 'All colleagues are busy.': 'Wszyscy konsultanci są zajęci.'
'You are on waiting list position <strong>%s</strong>.': 'Na liście oczekujących znajduje się pozycja <strong>%s</strong>.' 'You are on waiting list position <strong>%s</strong>.': 'Na liście oczekujących znajduje się pozycja <strong>%s</strong>.'
'Start new conversation': 'Rozpoczęcie nowej konwersacji' 'Start new conversation': 'Rozpoczęcie nowej konwersacji'
'Since you didn\'t respond in the last %s minutes your conversation with <strong>%s</strong> got closed.': 'Ponieważ w ciągu ostatnich %s minut nie odpowiedziałeś, Twoja rozmowa z <strong>%s</strong> została zamknięta.' 'Since you didn\'t respond in the last %s minutes your conversation with <strong>%s</strong> got closed.': 'Ponieważ w ciągu ostatnich %s minut nie odpowiedziałeś, Twoja rozmowa z <strong>%s</strong> została zamknięta.'

View file

@ -578,7 +578,7 @@ var extend = function(child, parent) { for (var key in parent) { if (hasProp.cal
'Send': 'Wyślij', 'Send': 'Wyślij',
'Chat closed by %s': 'Czat zamknięty przez %s', 'Chat closed by %s': 'Czat zamknięty przez %s',
'Compose your message...': 'Utwórz swoją wiadomość...', 'Compose your message...': 'Utwórz swoją wiadomość...',
'All colleagues are busy.': 'Wszyscy koledzy są zajęci.', 'All colleagues are busy.': 'Wszyscy konsultanci są zajęci.',
'You are on waiting list position <strong>%s</strong>.': 'Na liście oczekujących znajduje się pozycja <strong>%s</strong>.', 'You are on waiting list position <strong>%s</strong>.': 'Na liście oczekujących znajduje się pozycja <strong>%s</strong>.',
'Start new conversation': 'Rozpoczęcie nowej konwersacji', 'Start new conversation': 'Rozpoczęcie nowej konwersacji',
'Since you didn\'t respond in the last %s minutes your conversation with <strong>%s</strong> got closed.': 'Ponieważ w ciągu ostatnich %s minut nie odpowiedziałeś, Twoja rozmowa z <strong>%s</strong> została zamknięta.', 'Since you didn\'t respond in the last %s minutes your conversation with <strong>%s</strong> got closed.': 'Ponieważ w ciągu ostatnich %s minut nie odpowiedziałeś, Twoja rozmowa z <strong>%s</strong> została zamknięta.',

File diff suppressed because one or more lines are too long

View file

@ -358,7 +358,7 @@ do($ = window.jQuery, window) ->
'Send': 'Wyślij' 'Send': 'Wyślij'
'Chat closed by %s': 'Czat zamknięty przez %s' 'Chat closed by %s': 'Czat zamknięty przez %s'
'Compose your message...': 'Utwórz swoją wiadomość...' 'Compose your message...': 'Utwórz swoją wiadomość...'
'All colleagues are busy.': 'Wszyscy koledzy są zajęci.' 'All colleagues are busy.': 'Wszyscy konsultanci są zajęci.'
'You are on waiting list position <strong>%s</strong>.': 'Na liście oczekujących znajduje się pozycja <strong>%s</strong>.' 'You are on waiting list position <strong>%s</strong>.': 'Na liście oczekujących znajduje się pozycja <strong>%s</strong>.'
'Start new conversation': 'Rozpoczęcie nowej konwersacji' 'Start new conversation': 'Rozpoczęcie nowej konwersacji'
'Since you didn\'t respond in the last %s minutes your conversation with <strong>%s</strong> got closed.': 'Ponieważ w ciągu ostatnich %s minut nie odpowiedziałeś, Twoja rozmowa z <strong>%s</strong> została zamknięta.' 'Since you didn\'t respond in the last %s minutes your conversation with <strong>%s</strong> got closed.': 'Ponieważ w ciągu ostatnich %s minut nie odpowiedziałeś, Twoja rozmowa z <strong>%s</strong> została zamknięta.'

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -11,10 +11,8 @@ if [ "$LEVEL" == '1' ]; then
cp contrib/auto_wizard_test.json auto_wizard.json cp contrib/auto_wizard_test.json auto_wizard.json
cp test/integration/aaa_auto_wizard_base_setup_test.rb test/browser/aaa_auto_wizard_base_setup_test.rb cp test/integration/aaa_auto_wizard_base_setup_test.rb test/browser/aaa_auto_wizard_base_setup_test.rb
rm test/browser/abb_one_group_test.rb rm test/browser/abb_one_group_test.rb
rm test/browser/admin_channel_email_test.rb
rm test/browser/admin_drag_drop_to_new_group_test.rb rm test/browser/admin_drag_drop_to_new_group_test.rb
rm test/browser/admin_overview_test.rb rm test/browser/admin_overview_test.rb
rm test/browser/admin_permissions_granular_vs_full_test.rb
rm test/browser/admin_role_test.rb rm test/browser/admin_role_test.rb
# test/browser/agent_navigation_and_title_test.rb # test/browser/agent_navigation_and_title_test.rb
# test/browser/agent_organization_profile_test.rb # test/browser/agent_organization_profile_test.rb
@ -45,16 +43,11 @@ if [ "$LEVEL" == '1' ]; then
rm test/browser/agent_ticket_zoom_hide_test.rb rm test/browser/agent_ticket_zoom_hide_test.rb
rm test/browser/agent_user_manage_test.rb rm test/browser/agent_user_manage_test.rb
rm test/browser/agent_user_profile_test.rb rm test/browser/agent_user_profile_test.rb
# test/browser/auth_test.rb
rm test/browser/customer_ticket_create_test.rb rm test/browser/customer_ticket_create_test.rb
rm test/browser/first_steps_test.rb rm test/browser/first_steps_test.rb
rm test/browser/integration_test.rb rm test/browser/integration_test.rb
rm test/browser/keyboard_shortcuts_test.rb rm test/browser/keyboard_shortcuts_test.rb
# test/browser/manage_test.rb # test/browser/manage_test.rb
# test/browser/monitoring_test.rb
rm test/browser/integration_sipgate_test.rb
rm test/browser/integration_cti_test.rb
rm test/browser/preferences_language_test.rb
# test/browser/swich_to_user_test.rb # test/browser/swich_to_user_test.rb
# test/browser/taskbar_session_test.rb # test/browser/taskbar_session_test.rb
# test/browser/taskbar_task_test.rb # test/browser/taskbar_task_test.rb
@ -67,10 +60,8 @@ elif [ "$LEVEL" == '2' ]; then
# only ticket action 2/3 # only ticket action 2/3
# test/browser/aaa_getting_started_test.rb # test/browser/aaa_getting_started_test.rb
# test/browser/abb_one_group_test.rb # test/browser/abb_one_group_test.rb
rm test/browser/admin_channel_email_test.rb
rm test/browser/admin_drag_drop_to_new_group_test.rb rm test/browser/admin_drag_drop_to_new_group_test.rb
rm test/browser/admin_overview_test.rb rm test/browser/admin_overview_test.rb
rm test/browser/admin_permissions_granular_vs_full_test.rb
#rm test/browser/admin_role_test.rb #rm test/browser/admin_role_test.rb
rm test/browser/agent_navigation_and_title_test.rb rm test/browser/agent_navigation_and_title_test.rb
rm test/browser/agent_organization_profile_test.rb rm test/browser/agent_organization_profile_test.rb
@ -101,17 +92,11 @@ elif [ "$LEVEL" == '2' ]; then
# test/browser/agent_ticket_zoom_hide_test.rb # test/browser/agent_ticket_zoom_hide_test.rb
rm test/browser/agent_user_manage_test.rb rm test/browser/agent_user_manage_test.rb
rm test/browser/agent_user_profile_test.rb rm test/browser/agent_user_profile_test.rb
rm test/browser/auth_test.rb
rm test/browser/customer_ticket_create_test.rb rm test/browser/customer_ticket_create_test.rb
rm test/browser/first_steps_test.rb rm test/browser/first_steps_test.rb
rm test/browser/integration_test.rb rm test/browser/integration_test.rb
rm test/browser/keyboard_shortcuts_test.rb rm test/browser/keyboard_shortcuts_test.rb
rm test/browser/manage_test.rb rm test/browser/manage_test.rb
rm test/browser/monitoring_test.rb
rm test/browser/integration_sipgate_test.rb
rm test/browser/integration_cti_test.rb
rm test/browser/preferences_language_test.rb
rm test/browser/switch_to_user_test.rb
rm test/browser/taskbar_session_test.rb rm test/browser/taskbar_session_test.rb
rm test/browser/taskbar_task_test.rb rm test/browser/taskbar_task_test.rb
# test/browser/user_access_permissions_test.rb # test/browser/user_access_permissions_test.rb
@ -123,10 +108,8 @@ elif [ "$LEVEL" == '3' ]; then
# only ticket action 2/3 # only ticket action 2/3
# test/browser/aaa_getting_started_test.rb # test/browser/aaa_getting_started_test.rb
# test/browser/abb_one_group_test.rb # test/browser/abb_one_group_test.rb
rm test/browser/admin_channel_email_test.rb
rm test/browser/admin_drag_drop_to_new_group_test.rb rm test/browser/admin_drag_drop_to_new_group_test.rb
rm test/browser/admin_overview_test.rb rm test/browser/admin_overview_test.rb
rm test/browser/admin_permissions_granular_vs_full_test.rb
rm test/browser/admin_role_test.rb rm test/browser/admin_role_test.rb
rm test/browser/agent_navigation_and_title_test.rb rm test/browser/agent_navigation_and_title_test.rb
rm test/browser/agent_organization_profile_test.rb rm test/browser/agent_organization_profile_test.rb
@ -157,17 +140,11 @@ elif [ "$LEVEL" == '3' ]; then
rm test/browser/agent_ticket_zoom_hide_test.rb rm test/browser/agent_ticket_zoom_hide_test.rb
rm test/browser/agent_user_manage_test.rb rm test/browser/agent_user_manage_test.rb
rm test/browser/agent_user_profile_test.rb rm test/browser/agent_user_profile_test.rb
rm test/browser/auth_test.rb
rm test/browser/customer_ticket_create_test.rb rm test/browser/customer_ticket_create_test.rb
rm test/browser/first_steps_test.rb rm test/browser/first_steps_test.rb
rm test/browser/integration_test.rb rm test/browser/integration_test.rb
rm test/browser/keyboard_shortcuts_test.rb rm test/browser/keyboard_shortcuts_test.rb
rm test/browser/manage_test.rb rm test/browser/manage_test.rb
rm test/browser/monitoring_test.rb
rm test/browser/integration_sipgate_test.rb
rm test/browser/integration_cti_test.rb
rm test/browser/preferences_language_test.rb
rm test/browser/switch_to_user_test.rb
rm test/browser/taskbar_session_test.rb rm test/browser/taskbar_session_test.rb
rm test/browser/taskbar_task_test.rb rm test/browser/taskbar_task_test.rb
rm test/browser/user_access_permissions_test.rb rm test/browser/user_access_permissions_test.rb
@ -179,10 +156,8 @@ elif [ "$LEVEL" == '4' ]; then
# only ticket action 3/3 # only ticket action 3/3
# test/browser/aaa_getting_started_test.rb # test/browser/aaa_getting_started_test.rb
# test/browser/abb_one_group_test.rb # test/browser/abb_one_group_test.rb
rm test/browser/admin_channel_email_test.rb
rm test/browser/admin_drag_drop_to_new_group_test.rb rm test/browser/admin_drag_drop_to_new_group_test.rb
rm test/browser/admin_overview_test.rb rm test/browser/admin_overview_test.rb
rm test/browser/admin_permissions_granular_vs_full_test.rb
rm test/browser/admin_role_test.rb rm test/browser/admin_role_test.rb
rm test/browser/agent_navigation_and_title_test.rb rm test/browser/agent_navigation_and_title_test.rb
rm test/browser/agent_organization_profile_test.rb rm test/browser/agent_organization_profile_test.rb
@ -213,17 +188,11 @@ elif [ "$LEVEL" == '4' ]; then
rm test/browser/agent_ticket_zoom_hide_test.rb rm test/browser/agent_ticket_zoom_hide_test.rb
rm test/browser/agent_user_manage_test.rb rm test/browser/agent_user_manage_test.rb
rm test/browser/agent_user_profile_test.rb rm test/browser/agent_user_profile_test.rb
rm test/browser/auth_test.rb
# test/browser/customer_ticket_create_test.rb # test/browser/customer_ticket_create_test.rb
rm test/browser/first_steps_test.rb rm test/browser/first_steps_test.rb
rm test/browser/integration_test.rb rm test/browser/integration_test.rb
rm test/browser/keyboard_shortcuts_test.rb rm test/browser/keyboard_shortcuts_test.rb
rm test/browser/manage_test.rb rm test/browser/manage_test.rb
rm test/browser/monitoring_test.rb
rm test/browser/integration_sipgate_test.rb
rm test/browser/integration_cti_test.rb
rm test/browser/preferences_language_test.rb
rm test/browser/switch_to_user_test.rb
rm test/browser/taskbar_session_test.rb rm test/browser/taskbar_session_test.rb
rm test/browser/taskbar_task_test.rb rm test/browser/taskbar_task_test.rb
rm test/browser/user_access_permissions_test.rb rm test/browser/user_access_permissions_test.rb
@ -234,10 +203,8 @@ elif [ "$LEVEL" == '5' ]; then
# only profile action & admin # only profile action & admin
# test/browser/abb_one_group_test.rb # test/browser/abb_one_group_test.rb
# test/browser/admin_channel_email_test.rb
# rm test/browser/admin_drag_drop_to_new_group_test.rb # rm test/browser/admin_drag_drop_to_new_group_test.rb
# test/browser/admin_overview_test.rb # test/browser/admin_overview_test.rb
# rm test/browser/admin_permissions_granular_vs_full_test.rb
rm test/browser/admin_role_test.rb rm test/browser/admin_role_test.rb
rm test/browser/agent_navigation_and_title_test.rb rm test/browser/agent_navigation_and_title_test.rb
rm test/browser/agent_organization_profile_test.rb rm test/browser/agent_organization_profile_test.rb
@ -268,17 +235,11 @@ elif [ "$LEVEL" == '5' ]; then
rm test/browser/agent_ticket_zoom_hide_test.rb rm test/browser/agent_ticket_zoom_hide_test.rb
# test/browser/agent_user_manage_test.rb # test/browser/agent_user_manage_test.rb
# test/browser/agent_user_profile_test.rb # test/browser/agent_user_profile_test.rb
rm test/browser/auth_test.rb
rm test/browser/customer_ticket_create_test.rb rm test/browser/customer_ticket_create_test.rb
rm test/browser/first_steps_test.rb rm test/browser/first_steps_test.rb
rm test/browser/integration_test.rb rm test/browser/integration_test.rb
rm test/browser/keyboard_shortcuts_test.rb rm test/browser/keyboard_shortcuts_test.rb
rm test/browser/manage_test.rb rm test/browser/manage_test.rb
rm test/browser/monitoring_test.rb
rm test/browser/integration_sipgate_test.rb
rm test/browser/integration_cti_test.rb
rm test/browser/preferences_language_test.rb
rm test/browser/switch_to_user_test.rb
rm test/browser/taskbar_session_test.rb rm test/browser/taskbar_session_test.rb
rm test/browser/taskbar_task_test.rb rm test/browser/taskbar_task_test.rb
rm test/browser/user_access_permissions_test.rb rm test/browser/user_access_permissions_test.rb
@ -292,10 +253,8 @@ elif [ "$LEVEL" == '6' ]; then
cp contrib/auto_wizard_test.json auto_wizard.json cp contrib/auto_wizard_test.json auto_wizard.json
cp test/integration/aaa_auto_wizard_base_setup_test.rb test/browser/aaa_auto_wizard_base_setup_test.rb cp test/integration/aaa_auto_wizard_base_setup_test.rb test/browser/aaa_auto_wizard_base_setup_test.rb
rm test/browser/abb_one_group_test.rb rm test/browser/abb_one_group_test.rb
rm test/browser/admin_channel_email_test.rb
rm test/browser/admin_drag_drop_to_new_group_test.rb rm test/browser/admin_drag_drop_to_new_group_test.rb
rm test/browser/admin_overview_test.rb rm test/browser/admin_overview_test.rb
rm test/browser/admin_permissions_granular_vs_full_test.rb
rm test/browser/admin_role_test.rb rm test/browser/admin_role_test.rb
rm test/browser/agent_navigation_and_title_test.rb rm test/browser/agent_navigation_and_title_test.rb
rm test/browser/agent_organization_profile_test.rb rm test/browser/agent_organization_profile_test.rb
@ -326,17 +285,11 @@ elif [ "$LEVEL" == '6' ]; then
rm test/browser/agent_ticket_zoom_hide_test.rb rm test/browser/agent_ticket_zoom_hide_test.rb
rm test/browser/agent_user_manage_test.rb rm test/browser/agent_user_manage_test.rb
rm test/browser/agent_user_profile_test.rb rm test/browser/agent_user_profile_test.rb
rm test/browser/auth_test.rb
rm test/browser/customer_ticket_create_test.rb rm test/browser/customer_ticket_create_test.rb
# test/browser/first_steps_test.rb # test/browser/first_steps_test.rb
# test/browser/integration_test.rb # test/browser/integration_test.rb
# test/browser/keyboard_shortcuts_test.rb # test/browser/keyboard_shortcuts_test.rb
rm test/browser/manage_test.rb rm test/browser/manage_test.rb
rm test/browser/monitoring_test.rb
# rm test/browser/integration_sipgate_test.rb
# rm test/browser/integration_cti_test.rb
# test/browser/preferences_language_test.rb
rm test/browser/switch_to_user_test.rb
rm test/browser/taskbar_session_test.rb rm test/browser/taskbar_session_test.rb
rm test/browser/taskbar_task_test.rb rm test/browser/taskbar_task_test.rb
rm test/browser/user_access_permissions_test.rb rm test/browser/user_access_permissions_test.rb

View file

@ -1,7 +1,7 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ # Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
require 'rails_helper' require 'rails_helper'
RSpec.describe GitHub, type: :integration, required_envs: %w[GITHUB_ENDPOINT GITHUB_APITOKEN] do # rubocop:disable RSpec/FilePath RSpec.describe GitHub, type: :integration, required_envs: %w[GITHUB_ENDPOINT GITHUB_APITOKEN] do
let(:instance) { described_class.new(ENV['GITHUB_ENDPOINT'], ENV['GITHUB_APITOKEN']) } let(:instance) { described_class.new(ENV['GITHUB_ENDPOINT'], ENV['GITHUB_APITOKEN']) }
let(:issue_data) do let(:issue_data) do

View file

@ -1,7 +1,7 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ # Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
require 'rails_helper' require 'rails_helper'
RSpec.describe GitLab, type: :integration, required_envs: %w[GITLAB_ENDPOINT GITLAB_APITOKEN] do # rubocop:disable RSpec/FilePath RSpec.describe GitLab, type: :integration, required_envs: %w[GITLAB_ENDPOINT GITLAB_APITOKEN] do
let(:instance) { described_class.new(ENV['GITLAB_ENDPOINT'], ENV['GITLAB_APITOKEN']) } let(:instance) { described_class.new(ENV['GITLAB_ENDPOINT'], ENV['GITLAB_APITOKEN']) }
let(:issue_data) do let(:issue_data) do

View file

@ -148,4 +148,12 @@ RSpec.describe ObjectManager::Attribute, type: :model do
it { is_expected.to be_valid } it { is_expected.to be_valid }
end end
end end
describe 'Class methods:' do
describe '.attribute_to_references_hash_objects' do
it 'returns classes with conditions' do
expect(described_class.attribute_to_references_hash_objects).to match_array [Trigger, Overview, Job, Sla, Report::Profile ]
end
end
end
end end

View file

@ -32,6 +32,21 @@ module BrowserTestHelper
sleep wait_time sleep wait_time
end end
# Get the current cookies from the browser with the driver object.
#
def cookies
page.driver.browser.manage.all_cookies
end
# Get a single cookie by the given name (regex possible)
#
# @example
# cookie('cookie-name')
#
def cookie(name)
cookies.find { |cookie| cookie[:name].match?(name) }
end
# Finds an element and clicks it - wrapped in one method. # Finds an element and clicks it - wrapped in one method.
# #
# @example # @example

View file

@ -92,6 +92,8 @@ module CommonActions
# #
def logout def logout
visit('logout') visit('logout')
wait.until_disappears { find('.user-menu .user a', wait: false) }
end end
# Overwrites the Capybara::Session#visit method to allow SPA navigation # Overwrites the Capybara::Session#visit method to allow SPA navigation

View file

@ -3,7 +3,6 @@
require 'rails_helper' require 'rails_helper'
RSpec.describe 'Authentication', type: :system do RSpec.describe 'Authentication', type: :system do
it 'Login', authenticated_as: false do it 'Login', authenticated_as: false do
login( login(
username: 'admin@example.com', username: 'admin@example.com',
@ -11,6 +10,35 @@ RSpec.describe 'Authentication', type: :system do
) )
expect_current_route 'dashboard' expect_current_route 'dashboard'
refresh
# Check that cookies is temporary.
cookie = cookie('^_zammad.+?')
expect(cookie[:expires]).to eq(nil)
end
it 'Login with remember me', authenticated_as: false do
login(
username: 'admin@example.com',
password: 'test',
remember_me: true
)
expect_current_route 'dashboard'
refresh
# Check that cookies has a expire date.
cookie = cookie('^_zammad.+?')
expect(cookie[:expires]).to be_truthy
logout
expect_current_route 'login', wait: 10
# Check that cookies has no longer a expire date after logout.
cookie = cookie('^_zammad.+?')
expect(cookie[:expires]).to eq(nil)
end end
it 'Logout' do it 'Logout' do

View file

@ -4,6 +4,113 @@ require 'rails_helper'
RSpec.describe 'Manage > Channels > Email', type: :system do RSpec.describe 'Manage > Channels > Email', type: :system do
context 'when managing email channels', required_envs: %w[MAILBOX_INIT] do
before do
visit '/#channels/email'
end
context 'when looking at the default screen' do
it 'has correct default settings' do
within :active_content do
# check if postmaster filters are shown
click 'a[href="#c-filter"]'
expect(find('#c-filter .overview')).to have_text 'NO ENTRIES'
# check if signatures are shown
click 'a[href="#c-signature"]'
expect(find('#c-signature .overview')).to have_text 'default'
end
end
end
context 'when creating new channels' do
let(:mailbox_user) { ENV['MAILBOX_INIT'].split(':')[0] }
let(:mailbox_password) { ENV['MAILBOX_INIT'].split(':')[1] }
before do
# Make sure the channel is loaded
'Channel::Driver::Imap'.constantize
# The normal timeout may be too low in slow CI environments.
stub_const 'Channel::Driver::Imap::CHECK_ONLY_TIMEOUT', 1.minute
end
it 'refuses wrong credentials' do
click 'a[href="#c-account"]'
click '.js-channelNew'
modal_ready
within '.modal' do
fill_in 'realname', with: 'My System'
fill_in 'email', with: "unknown_user.#{mailbox_user}"
fill_in 'password', with: mailbox_password
select 'Users', from: 'group_id'
click '.js-submit'
expect(page).to have_text('Unable to detect your server settings. Manual configuration needed.')
end
end
it 'accepts correct credentials' do
click 'a[href="#c-account"]'
click '.js-channelNew'
modal_ready
within '.modal' do
fill_in 'realname', with: 'My System'
fill_in 'email', with: mailbox_user
fill_in 'password', with: mailbox_password
select 'Users', from: 'group_id'
click '.js-submit'
end
modal_disappear timeout: 2.minutes
within :active_content do
expect(page).to have_text(mailbox_user)
all('.js-editInbound').last.click
fill_in 'options::folder', with: 'nonexisting_folder'
click '.js-submit'
expect(page).to have_text("Mailbox doesn\'t exist")
end
end
end
context 'when managing filters' do
let(:filter_name) { "Test Filter #{SecureRandom.uuid}" }
it 'works as expected' do
click 'a[href="#c-filter"]'
click '.content.active a[data-type="new"]'
modal_ready
within '.modal' do
fill_in 'name', with: filter_name
fill_in 'match::from::value', with: 'target'
click '.js-submit'
end
modal_disappear
expect(page).to have_text(filter_name)
click '.content.active .table .dropdown .btn--table'
click '.content.active .table .dropdown .js-clone'
modal_ready
click '.modal .js-submit'
modal_disappear
expect(page).to have_text("Clone: #{filter_name}")
end
end
end
context 'non editable' do context 'non editable' do
it 'hides "Edit" links' do it 'hides "Edit" links' do

View file

@ -2,62 +2,234 @@
require 'rails_helper' require 'rails_helper'
RSpec.describe 'Caller log', type: %i[system request] do RSpec.describe 'Caller log', type: :system, authenticated_as: :agent do
let(:admin) do let(:agent_phone) { '0190111' }
create(:admin, groups: Group.all) let(:customer_phone) { '0190333' }
end let(:cti_token) { 'token1234' }
let(:agent) { create(:agent, phone: agent_phone) }
let!(:customer) { create(:customer, phone: '0190333') } let(:customer) { create(:customer, phone: customer_phone) }
let(:cti_on) { true }
let(:params) do let(:params) do
{ {
direction: 'in', direction: 'in',
from: '0190333', from: customer.phone,
to: '0190111', to: agent_phone,
callId: '111', callId: '111',
cause: 'busy' cause: 'busy',
} }
end end
def prepare let(:first_params) { params.merge(event: 'newCall') }
Setting.set('cti_integration', true) let(:second_params) { params.merge(event: 'hangup') }
Setting.set('cti_token', 'token1234')
current_user.update(phone: '0190111') let(:place_call) do
post "#{Capybara.app_host}/api/v1/cti/#{cti_token}", params: first_params
post "#{Capybara.app_host}/api/v1/cti/#{cti_token}", params: second_params
end end
context 'without active tickets' do let(:prepare) do
it 'checks opening of the ticket creation screen after phone call inbound' do Setting.set('cti_integration', cti_on)
prepare Setting.set('cti_token', cti_token)
end
travel(-2.months) before { prepare }
create(:ticket, customer: customer)
travel_back
visit 'cti' context 'when cti integration is on' do
it 'shows the phone menu in nav bar' do
post "#{Capybara.app_host}/api/v1/cti/token1234", params: params.merge(event: 'newCall'), as: :json within '#navigation .menu' do
post "#{Capybara.app_host}/api/v1/cti/token1234", params: params.merge(event: 'answer', answeringNumber: '0190111'), as: :json expect(page).to have_link('Phone', href: '#cti')
within(:active_content) do
expect(page).to have_text('New Ticket', wait: 5)
end end
end end
end end
context 'with active tickets' do context 'when cti integration is not on' do
it 'checks opening of the user profile screen after phone call inbound with tickets in the last month' do let(:cti_on) { false }
prepare
create(:ticket, customer: customer) it 'does not show the phone menu in nav bar' do
visit 'cti' within '#navigation .menu' do
expect(page).to have_no_link('Phone', href: '#cti')
post "#{Capybara.app_host}/api/v1/cti/token1234", params: params.merge(event: 'newCall'), as: :json
post "#{Capybara.app_host}/api/v1/cti/token1234", params: params.merge(event: 'answer', answeringNumber: '0190111'), as: :json
within(:active_content) do
expect(page).to have_text(customer.fullname, wait: 5)
end end
end end
end end
context 'when a customer call is answered' do
let(:second_params) { params.merge(event: 'answer', answeringNumber: agent_phone) }
context 'without active tickets' do
before do
travel(-2.months)
create(:ticket, customer: customer)
travel_back
visit 'cti'
place_call
end
it 'opens a new ticket after phone call inbound' do
within(:active_content) do
expect(page).to have_text('New Ticket')
end
end
end
context 'with active tickets' do
before do
create(:ticket, customer: customer)
visit 'cti'
place_call
end
it 'opens the customer profile screen after phone call inbound with tickets in the last month' do
within(:active_content) do
expect(page).to have_text(customer.fullname)
end
end
end
end
context 'with incoming call' do
before do
visit 'cti'
place_call
end
it 'increments the call counter notification badge' do
within '[href="#cti"].js-phoneMenuItem' do
counter = find('.counter')
expect(counter).to have_content 1
end
end
end
context 'when incoming call is checked' do
before do
visit 'cti'
place_call
end
it 'clears the call counter notification badge' do
within :active_content do
find('.table-checkbox input.js-check', visible: :all).check allow_label_click: true
end
within '[href="#cti"].js-phoneMenuItem' do
expect(page).to have_no_selector('.counter')
end
end
end
# Regression test for #2018
context 'phone numbers format' do
before do
visit 'cti'
place_call
end
context 'with private number' do
let(:customer_phone) { '007' }
let(:agent_phone) { '008' }
it 'appears verbatim' do
within :active_content do
expect(page).to have_selector('.js-callerLog', text: customer_phone)
.and have_selector('.js-callerLog', text: agent_phone)
end
end
end
context 'with e164 number' do
let(:customer_phone) { '4930609854180' }
let(:agent_phone) { '4930609811111' }
let(:prettified_customer_phone) { '+49 30 609854180' }
let(:prettified_current_user_phone) { '+49 30 609811111' }
it 'appears prettified' do
within :active_content do
expect(page).to have_selector('.js-callerLog', text: prettified_customer_phone)
.and have_selector('.js-callerLog', text: prettified_current_user_phone)
end
end
it 'done not appear verbatim' do
within :active_content do
expect(page).to have_no_selector('.js-callerLog', text: customer_phone)
end
end
end
end
# Regression test for #2096
context 'with inactive user' do
before do
visit 'cti'
place_call
end
let(:customer) do
create(:customer,
phone: customer_phone,
active: false,
firstname: 'John',
lastname: 'Doe')
end
it 'appears inactive' do
within :active_content do
expect(page).to have_selector('span.avatar--inactive', text: 'JD')
end
end
end
# Regression test for #2075
context 'when user is with organization name' do
before do
visit 'cti'
place_call
end
let(:firstname) { 'John' }
let(:lastname) { 'Doe' }
let(:organization_name) { 'Test Organization' }
let(:organization) { create(:organization, name: organization_name) }
let(:full_name) { "#{firstname} #{lastname}" }
let(:customer) do
create(:customer,
phone: customer_phone,
firstname: firstname,
lastname: lastname,
organization: organization)
end
shared_examples 'showing user with thier organization name' do
it 'shows user with thier organization name' do
within :active_content do
expect(page).to have_selector(
'.js-callerLog tr div.user-popover',
text: "#{full_name} (#{organization_name})"
)
end
end
end
context 'with call direction out' do
let(:first_params) { params.merge(event: 'newCall', direction: 'out', from: agent_phone, to: customer.phone) }
let(:second_params) { params.merge(event: 'hangup', direction: 'out', from: agent_phone, to: customer.phone) }
it_behaves_like 'showing user with thier organization name'
end
context 'with call direction in' do
let(:first_params) { params.merge(event: 'newCall', direction: 'in') }
let(:second_params) { params.merge(event: 'hangup', direction: 'in') }
it_behaves_like 'showing user with thier organization name'
end
end
end end

View file

@ -112,7 +112,7 @@ RSpec.describe 'Import Freshdesk', type: :system, set_up: false, authenticated_a
Rake::Task['zammad:setup:auto_wizard'].execute Rake::Task['zammad:setup:auto_wizard'].execute
expect(page).to have_text('Login') expect(page).to have_text(Setting.get('fqdn'))
end end
end end
end end

View file

@ -121,7 +121,7 @@ RSpec.describe 'Import Zendesk', type: :system, set_up: false, authenticated_as:
Rake::Task['zammad:setup:auto_wizard'].execute Rake::Task['zammad:setup:auto_wizard'].execute
expect(page).to have_text('Login') expect(page).to have_text(Setting.get('fqdn'))
end end
end end
end end

24
spec/system/login_spec.rb Normal file
View file

@ -0,0 +1,24 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
require 'rails_helper'
RSpec.describe 'Login', type: :system, authenticated_as: false do
before do
visit '/'
end
it 'fqdn is visible on login page' do
expect(page).to have_css('.login p', text: Setting.get('fqdn'))
end
it 'Login with wrong credentials' do
within('#login') do
fill_in 'username', with: 'admin@example.com'
fill_in 'password', with: 'wrong'
click_button
end
expect(page).to have_css('#login .alert')
end
end

View file

@ -111,6 +111,33 @@ RSpec.describe 'Manage > Users', type: :system do
end end
end end
context 'updating a user' do
before do
create(:admin)
end
it 'handles permission checkboxes correctly' do
visit '#manage/users'
within(:active_content) do
click 'table.user-list tbody tr:first-child'
end
in_modal disappears: false do
scroll_into_view 'table.settings-list'
within 'table.settings-list tbody tr:first-child' do
click 'input[value="full"]', visible: :all
expect(find('input[value="full"]', visible: :all).checked?).to be true
click 'input[value="read"]', visible: :all
expect(find('input[value="full"]', visible: :all).checked?).to be false
expect(find('input[value="read"]', visible: :all).checked?).to be true
click 'input[value="full"]', visible: :all
expect(find('input[value="full"]', visible: :all).checked?).to be true
expect(find('input[value="read"]', visible: :all).checked?).to be false
end
end
end
end
describe 'check user edit permissions', authenticated_as: -> { user } do describe 'check user edit permissions', authenticated_as: -> { user } do
shared_examples 'user permission' do |allow| shared_examples 'user permission' do |allow|

View file

@ -66,13 +66,19 @@ RSpec.describe 'Overview', type: :system do
end end
end end
context 'sorting when group by is set' do context 'sorting when group by is set', authenticated_as: :user do
let(:user) { create(:customer) } let(:user) { create(:agent, groups: [group_c, group_a, group_b]) }
let(:ticket1) { create(:ticket, group: Group.find_by(name: 'Users'), priority_id: 1, customer: user) }
let(:ticket2) { create(:ticket, group: Group.find_by(name: 'Users'), priority_id: 2, customer: user) } let(:group_a) { create(:group, name: 'aaa') }
let(:ticket3) { create(:ticket, group: Group.find_by(name: 'Users'), priority_id: 3, customer: user) } let(:group_b) { create(:group, name: 'bbb') }
let(:group_c) { create(:group, name: 'ccc') }
let(:ticket1) { create(:ticket, group: group_a, priority_id: 1, customer: user) }
let(:ticket2) { create(:ticket, group: group_c, priority_id: 2, customer: user) }
let(:ticket3) { create(:ticket, group: group_b, priority_id: 3, customer: user) }
let(:overview) do let(:overview) do
create(:overview, group_by: 'priority', group_direction: group_direction, condition: { create(:overview, group_by: group_key, group_direction: group_direction, condition: {
'ticket.customer_id' => { 'ticket.customer_id' => {
operator: 'is', operator: 'is',
value: user.id value: user.id
@ -86,48 +92,60 @@ RSpec.describe 'Overview', type: :system do
visit "ticket/view/#{overview.link}" visit "ticket/view/#{overview.link}"
end end
context 'when group direction is default' do context 'when grouping by priority' do
let(:group_direction) { nil } let(:group_key) { 'priority' }
it 'sorts groups 1 > 3' do context 'when group direction is default' do
within :active_content do let(:group_direction) { nil }
expect(find('.table-overview table tbody tr:first-child td:nth-child(1)').text).to match('1 low')
expect(find('.table-overview table tbody tr:nth-child(5) td:nth-child(1)').text).to match('3 high') it 'sorts groups 1 > 3' do
within :active_content do
expect(all('.table-overview table b').map(&:text)).to eq ['1 low', '2 normal', '3 high']
end
end
it 'does not show duplicates when any ticket attribute is updated using bulk update' do
find("tr[data-id='#{ticket3.id}']").check('bulk', allow_label_click: true)
select '2 normal', from: 'priority_id'
click '.js-confirm'
find('.js-confirm-step textarea').fill_in with: 'test tickets ordering'
click '.js-submit'
within :active_content do
expect(page).to have_css("tr[data-id='#{ticket3.id}']", count: 1)
end
end end
end end
it 'does not show duplicates when any ticket attribute is updated using bulk update' do context 'when group direction is ASC' do
find("tr[data-id='#{ticket3.id}']").check('bulk', allow_label_click: true) let(:group_direction) { 'ASC' }
select '2 normal', from: 'priority_id'
click '.js-confirm' it 'sorts groups 1 > 3' do
find('.js-confirm-step textarea').fill_in with: 'test tickets ordering' within :active_content do
click '.js-submit' expect(all('.table-overview table b').map(&:text)).to eq ['1 low', '2 normal', '3 high']
end
end
end
within :active_content do context 'when group direction is DESC' do
expect(page).to have_css("tr[data-id='#{ticket3.id}']", count: 1) let(:group_direction) { 'DESC' }
it 'sorts groups 3 > 1' do
within :active_content do
expect(all('.table-overview table b').map(&:text)).to eq ['3 high', '2 normal', '1 low']
end
end end
end end
end end
context 'when group direction is ASC' do context 'when grouping by groups' do
let(:group_key) { 'group' }
let(:group_direction) { 'ASC' } let(:group_direction) { 'ASC' }
it 'sorts groups 1 > 3' do it 'sorts groups a > b > c' do
within :active_content do within :active_content do
expect(find('.table-overview table tbody tr:first-child td:nth-child(1)').text).to match('1 low') expect(all('.table-overview table b').map(&:text)).to eq %w[aaa bbb ccc]
expect(find('.table-overview table tbody tr:nth-child(5) td:nth-child(1)').text).to match('3 high')
end
end
end
context 'when group direction is DESC' do
let(:group_direction) { 'DESC' }
it 'sorts groups 3 > 1' do
within :active_content do
expect(find('.table-overview table tbody tr:first-child td:nth-child(1)').text).to match('3 high')
expect(find('.table-overview table tbody tr:nth-child(5) td:nth-child(1)').text).to match('1 low')
end end
end end
end end

View file

@ -0,0 +1,236 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
require 'rails_helper'
RSpec.describe 'Profile > Language', type: :system do
let(:group) { create(:group) }
let(:session_user) { create(:admin, preferences: { locale: locale }, groups: Group.all) }
let(:path) { 'profile/language' }
shared_examples 'having translated content in' do |current_element|
it "the '#{current_element}' element" do
within current_element do
expect(page).to have_text(translated_content)
end
end
end
shared_examples 'having translated content in the page title' do
it 'shows the translated content' do
expect(page).to have_title(translated_content)
end
end
shared_examples 'displaying the current language' do
it 'shows the current language' do
within :active_content do
within '.page-content' do
expect(page).to have_field(with: full_current_locale)
end
end
end
end
shared_examples 'have translations in ticket page' do |translated_element|
it_behaves_like 'having translated content in the page title'
context 'when translated content is ticket priority' do
let(:translated_content) { priority }
it_behaves_like 'having translated content in', translated_element
end
context 'when translated content is ticket owner' do
let(:translated_content) { owner }
it_behaves_like 'having translated content in', translated_element
end
context 'when translated content is ticket title' do
let(:translated_content) { title }
it_behaves_like 'having translated content in', :active_content
end
end
context 'when user locale is English (en-gb)', authenticated_as: :session_user do
let(:locale) { 'en-gb' }
let(:translated_content) { 'Overview' }
let(:full_current_locale) { 'English (Great Britain)' }
let(:priority) { 'PRIORITY' }
let(:owner) { 'OWNER' }
before { visit path }
it_behaves_like 'displaying the current language'
it_behaves_like 'having translated content in', '.js-menu'
context 'when profile language is changed' do
let(:new_locale) { 'de-de' }
let(:full_current_locale) { 'Deutsch' }
before do
within :active_content do
within '.page-content' do
find('input.searchableSelect-main.js-input').click
find("[data-value=#{new_locale}].js-option").click
click_button
session_user.reload
end
end
end
it 'changes the user preference language' do
expect(session_user.preferences[:locale]).to eq(new_locale)
end
it_behaves_like 'displaying the current language'
end
context 'with language page visited' do
let(:translated_content) { 'Language' }
it_behaves_like 'having translated content in', '.page-header'
it_behaves_like 'having translated content in', '.sidebar.NavBarProfile'
end
context 'with dashboard page visited' do
let(:path) { 'dashboard' }
let(:translated_content) { 'My Stats' }
it_behaves_like 'having translated content in', :active_content
end
context 'with overview page visited' do
let(:path) { 'ticket/view' }
let(:translated_content) { 'My assigned Tickets' }
it_behaves_like 'having translated content in the page title'
it_behaves_like 'having translated content in', :active_content
end
context 'with drafted ticket create' do
let(:path) { 'ticket/create' }
let(:title) { 'preferences lang check #1' }
let(:customer) { 'nicole' }
let(:translated_content) { "Call Inbound: #{title}" }
translated_element = '.newTicket .ticket-create'
before do
fill_in 'title', with: title
fill_in 'customer_id_completion', with: customer
send_keys(:enter, :tab)
find('[data-name="body"]').set(title)
select 'Users', from: 'group_id'
end
include_examples 'have translations in ticket page', translated_element
end
context 'with ticket zoom page' do
let(:path) { "ticket/zoom/#{ticket.id}" }
let(:title) { 'preferences lang check #2' }
let(:translated_content) { title }
let(:user_group) { Group.lookup(name: 'Users') }
let(:ticket) { create(:ticket, group: user_group, title: title) }
translated_element = '.content.active .sidebar-content'
include_examples 'have translations in ticket page', translated_element
end
end
context 'when user locale is Deutsch', authenticated_as: :session_user do
let(:locale) { 'de-de' }
let(:translated_content) { 'Übersichten' }
let(:full_current_locale) { 'Deutsch' }
let(:priority) { 'PRIORITÄT' }
let(:owner) { 'BESITZER' }
before { visit path }
it_behaves_like 'displaying the current language'
it_behaves_like 'having translated content in', '.js-menu'
context 'when profile language is changed' do
let(:new_locale) { 'en-gb' }
let(:full_current_locale) { 'English (Great Britain)' }
let(:translated_content) { 'Übersichten' }
before do
within :active_content do
within '.page-content' do
find('input.searchableSelect-main.js-input').click
find("[data-value=#{new_locale}].js-option").click
click_button
session_user.reload
end
end
end
it 'changes the user preference language' do
expect(session_user.preferences[:locale]).to eq(new_locale)
end
it_behaves_like 'displaying the current language'
end
context 'with language page visited' do
let(:translated_content) { 'Sprache' }
it_behaves_like 'having translated content in', '.page-header'
it_behaves_like 'having translated content in', '.sidebar.NavBarProfile'
end
context 'with dashboard page visited' do
let(:path) { 'dashboard' }
let(:translated_content) { 'Meine Statistik' }
it_behaves_like 'having translated content in', :active_content
end
context 'with overview page visited' do
let(:path) { 'ticket/view' }
let(:translated_content) { 'Meine zugewiesenen Tickets' }
it_behaves_like 'having translated content in the page title'
it_behaves_like 'having translated content in', :active_content
end
context 'with drafted ticket create' do
let(:path) { 'ticket/create' }
let(:title) { 'preferences lang check #1' }
let(:customer) { 'nicole' }
let(:translated_content) { "Anruf eingehend: #{title}" }
translated_element = '.newTicket .ticket-create'
before do
fill_in 'title', with: title
fill_in 'customer_id_completion', with: customer
send_keys(:enter, :tab)
find('[data-name="body"]').set(title)
select 'Users', from: 'group_id'
end
include_examples 'have translations in ticket page', translated_element
end
context 'with ticket zoom page' do
let(:path) { "ticket/zoom/#{ticket.id}" }
let(:title) { 'preferences lang check #2' }
let(:translated_content) { title }
let(:user_group) { Group.lookup(name: 'Users') }
let(:ticket) { create(:ticket, group: user_group, title: title) }
translated_element = '.content.active .sidebar-content'
include_examples 'have translations in ticket page', translated_element
end
end
end

View file

@ -0,0 +1,86 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
require 'rails_helper'
RSpec.describe 'Caller log', type: :system, authenticated_as: :agent do
let(:agent_phone) { '0190111' }
let(:customer_phone) { '0190333' }
let(:agent) { create(:agent, phone: agent_phone) }
let(:customer) { create(:customer, phone: customer_phone) }
let(:sipgate_on) { true }
let(:params) do
{
direction: 'in',
from: customer.phone,
to: agent_phone,
callId: '111',
cause: 'busy',
}
end
let(:first_params) { params.merge(event: 'newCall') }
let(:second_params) { params.merge(event: 'hangup') }
let(:place_call) do
post "#{Capybara.app_host}/api/v1/sipgate/in", params: first_params
post "#{Capybara.app_host}/api/v1/sipgate/in", params: second_params
end
let(:prepare) do
Setting.set('sipgate_integration', sipgate_on)
end
before { prepare }
context 'when sipgate integration is on' do
it 'shows the phone menu in nav bar' do
within '#navigation .menu' do
expect(page).to have_link('Phone', href: '#cti')
end
end
end
context 'when sipgate integration is not on' do
let(:sipgate_on) { false }
it 'does not show the phone menu in nav bar' do
within '#navigation .menu' do
expect(page).to have_no_link('Phone', href: '#cti')
end
end
end
context 'with incoming call' do
before do
visit 'cti'
place_call
end
it 'increments the call counter notification badge' do
within '[href="#cti"].js-phoneMenuItem' do
counter = find('.counter')
expect(counter).to have_content 1
end
end
end
context 'when incoming call is checked' do
before do
visit 'cti'
place_call
end
it 'clears the call counter notification badge' do
within :active_content do
find('.table-checkbox input.js-check', visible: :all).check allow_label_click: true
end
within '[href="#cti"].js-phoneMenuItem' do
expect(page).to have_no_selector('.counter')
end
end
end
end

View file

@ -0,0 +1,24 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
require 'rails_helper'
RSpec.describe 'System > Monitoring', type: :system do
context 'when showing the token' do
it 'works correctly' do
visit 'system/monitoring'
within :active_content do
token = find('.js-token').value
url = find('.js-url').value
expect(url).to include(token)
click '.js-resetToken'
new_token = find('.js-token').value
new_url = find('.js-url').value
expect(new_url).to include(new_token)
expect(token).not_to eq(new_token)
end
end
end
end

View file

@ -535,8 +535,7 @@ RSpec.describe 'Ticket Create', type: :system do
let(:customer) { create(:customer, password: 'test') } let(:customer) { create(:customer, password: 'test') }
it 'customer user should not have agent object attributes', authenticated_as: :agent do it 'customer user should not have agent object attributes', authenticated_as: :agent do
visit 'ticket/create' # Log out again, so that we can execute the next login.
logout logout
# Re-create agent session and fetch object attributes. # Re-create agent session and fetch object attributes.
@ -563,6 +562,25 @@ RSpec.describe 'Ticket Create', type: :system do
end end
end end
context 'when state options have a special translation', authenticated_as: :authenticate do
let(:admin_de) { create(:admin, preferences: { locale: 'de-de' }) }
context 'when translated state option has a single quote' do
def authenticate
open_tranlation = Translation.where(locale: 'de-de', source: 'open')
open_tranlation.update(target: "off'en")
admin_de
end
it 'shows the translated state options correctly' do
visit 'ticket/create'
expect(page).to have_select('state_id', with_options: ["off'en"])
end
end
end
describe 'It should be possible to show attributes which are configured shown false #3726', authenticated_as: :authenticate, db_strategy: :reset do describe 'It should be possible to show attributes which are configured shown false #3726', authenticated_as: :authenticate, db_strategy: :reset do
let(:field_name) { SecureRandom.uuid } let(:field_name) { SecureRandom.uuid }
let(:field) do let(:field) do

View file

@ -1,180 +0,0 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
require 'browser_test_helper'
class AdminChannelEmailTest < TestCase
def test_account_add
if !ENV['MAILBOX_INIT']
# raise "Need MAILBOX_INIT as ENV variable like export MAILBOX_INIT='unittest01@znuny.com:somepass'"
puts "NOTICE: Need MAILBOX_INIT as ENV variable like export MAILBOX_INIT='unittest01@znuny.com:somepass'"
return
end
mailbox_user = ENV['MAILBOX_INIT'].split(':')[0]
mailbox_password = ENV['MAILBOX_INIT'].split(':')[1]
@browser = browser_instance
login(
username: 'admin@example.com',
password: 'test',
url: browser_url,
)
tasks_close_all
click(css: 'a[href="#manage"]')
click(css: '.content.active a[href="#channels/email"]')
# check if postmaster filter are shown
click(css: '.content.active a[href="#c-filter"]')
match(
css: '.content.active #c-filter .overview',
value: 'No Entries',
)
# check if signatures are shown
click(css: '.content.active a[href="#c-signature"]')
match(
css: '.content.active #c-signature .overview',
value: 'default',
)
click(css: '.content.active a[href="#c-account"]')
click(css: '.content.active .js-channelNew')
modal_ready
set(
css: '.modal input[name="realname"]',
value: 'My System',
)
set(
css: '.modal input[name="email"]',
value: mailbox_user,
)
set(
css: '.modal input[name="password"]',
value: mailbox_password,
)
select(
css: '.modal select[name="group_id"]',
value: 'Users',
)
click(css: '.modal button.js-submit')
sleep 4
watch_for(
css: '.modal',
value: '(already exists|unknown mailbox)',
)
click(css: '.modal .js-close')
# delete all channels
loop do
break if !@browser.find_elements(css: '.content.active .js-channelDelete')[0]
click(css: '.content.active .js-channelDelete')
sleep 2
# flanky
click(css: '.modal .js-submit')
sleep 2
end
# re-create
click(css: '.content.active .js-channelNew')
modal_ready
set(
css: '.modal input[name="realname"]',
value: 'My System',
)
set(
css: '.modal input[name="email"]',
value: mailbox_user,
)
set(
css: '.modal input[name="password"]',
value: mailbox_password,
)
select(
css: '.modal select[name="group_id"]',
value: 'Users',
)
click(css: '.modal button.js-submit')
modal_disappear(timeout: 20)
watch_for(
css: '.content.active',
value: mailbox_user,
)
# set invalid folder
click(css: '.content.active .js-editInbound')
modal_ready
set(
css: '.modal input[name="options::folder"]',
value: 'not_existing_folder',
)
click(css: '.modal .js-inbound button.js-submit')
watch_for(
css: '.modal',
value: 'Mailbox doesn\'t exist',
)
end
# test the creation and cloning of Postmaster filters
# confirm fix for issue #2170 - Cannot clone PostmasterFilter
def test_filter_clone
filter_name = "Test Filter #{SecureRandom.uuid}"
@browser = browser_instance
login(
username: 'admin@example.com',
password: 'test',
url: browser_url,
)
tasks_close_all
click(css: 'a[href="#manage"]')
click(css: '.content.active a[href="#channels/email"]')
click(css: '.content.active a[href="#c-filter"]')
# create a new email filter
click(css: '.content.active a[data-type="new"]')
modal_ready
set(
css: '.modal input[name="name"]',
value: filter_name,
)
set(
css: '.modal input[name="match::from::value"]',
value: 'target',
)
click(css: '.modal .js-submit')
modal_disappear
watch_for(
css: '.content.active .table',
value: filter_name,
)
# now clone filter that we just created
click(css: '.content.active .table .dropdown .btn--table')
click(css: '.content.active .table .dropdown .js-clone')
modal_ready
click(css: '.modal .js-submit')
modal_disappear
# confirm the clone exists in the table
watch_for(
css: '.content.active .table',
value: "Clone: #{filter_name}",
)
end
end

View file

@ -1,68 +0,0 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
require 'browser_test_helper'
class AdminPermissionsGranularVsFullTest < TestCase
def test_permissions_selecting
new_group_name = "permissions_test_group#{SecureRandom.uuid}"
@browser = browser_instance
login(
username: 'admin@example.com',
password: 'test',
url: browser_url,
)
tasks_close_all
click(css: 'a[href="#manage"]')
click(css: '.content.active a[href="#manage/groups"]')
click(css: '.content.active a[data-type="new"]')
modal_ready
element = @browser.find_element(css: '.modal input[name=name]')
element.clear
element.send_keys(new_group_name)
click(css: '.modal button.js-submit')
modal_disappear
click(css: '.content.active a[href="#manage/users"]')
user_css = '.user-list .js-tableBody tr td'
watch_for(css: user_css)
@browser.find_elements(css: '.content.active .user-list td:first-child').each do |entry|
next if entry.text.strip != 'admin@example.com'
entry.click
break
end
modal_ready
scroll_script = "var el = document.getElementsByClassName('modal')[0];"
scroll_script += 'el.scrollTo(0, el.scrollHeight);'
@browser.execute_script scroll_script
group = @browser.find_elements(css: '.modal .settings-list tbody tr').find do |el|
el.find_element(css: 'td').text == new_group_name
end
if !group
screenshot(comment: 'group_not_found')
raise "Can't find group #{new_group_name}"
end
toggle_checkbox(group, 'full')
sleep(1)
assert(checkbox_is_selected(group, 'full'))
toggle_checkbox(group, 'read')
sleep(1)
assert(!checkbox_is_selected(group, 'full'))
assert(checkbox_is_selected(group, 'read'))
toggle_checkbox(group, 'full')
sleep(1)
assert(checkbox_is_selected(group, 'full'))
assert(!checkbox_is_selected(group, 'read'))
end
end

View file

@ -1,89 +0,0 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
require 'browser_test_helper'
class AuthTest < TestCase
def test_authentication
@browser = browser_instance
location(url: browser_url)
match(
css: '#login',
value: 'username',
)
click(css: '#login button')
sleep 4
match(
css: '#login',
value: 'username',
)
# login with username/password
login(
username: 'nicole.braun@zammad.org',
password: 'test',
)
tasks_close_all
# reload page
reload
# check if cookie is temporarily
watch_for(
css: 'body',
value: 'Overviews',
)
# verify session cookie
cookie(
name: '^_zammad.+?',
value: '.+?',
expires: '',
)
end
def test_authentication_new_browser_without_permanent_cookie_no_session_should_be
@browser = browser_instance
location(url: browser_url)
match(
css: '#login',
value: 'username',
)
end
def test_new_browser_with_permanent_cookie_login
@browser = browser_instance
location(url: browser_url)
# login with username/password
login(
username: 'nicole.braun@zammad.org',
password: 'test',
remember_me: true,
)
# check if cookie is temporarily
watch_for(
css: 'body',
value: 'Overviews',
)
# verify session cookie
cookie(
name: '^_zammad.+?',
value: '.+?',
expires: '\d{4}-\d{1,2}-\d{1,2}.+?',
)
logout
# verify session cookie
sleep 2
cookie(
name: '^_zammad.+?',
value: '.+?',
expires: '',
)
end
end

View file

@ -1,293 +0,0 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
require 'browser_test_helper'
class IntegrationCtiTest < TestCase
setup do
if !ENV['CTI_TOKEN']
raise "ERROR: Need CTI_TOKEN - hint CTI_TOKEN='some_token'"
end
end
# Regression test for #2017
def test_nav_menu_notification_badge_clears
id = SecureRandom.uuid
@browser = browser_instance
login(
username: 'admin@example.com',
password: 'test',
url: browser_url,
)
click(css: 'a[href="#manage"]')
click(css: 'a[href="#system/integration"]')
click(css: 'a[href="#system/integration/cti"]')
switch(
css: '.content.active .js-switch',
type: 'on'
)
watch_for(
css: 'a[href="#cti"]',
timeout: 4,
)
click(css: 'a[href="#cti"]')
call_counter = @browser.find_elements(css: '.js-phoneMenuItem .counter')
.first&.text.to_i
# simulate cti callbacks
url = URI.join(browser_url, "api/v1/cti/#{ENV['CTI_TOKEN']}")
params = {
direction: 'in',
from: '491715000002',
to: '4930600000000',
callId: "4991155921769858278-#{id}",
cause: 'busy'
}
Net::HTTP.post_form(url, params.merge(event: 'newCall'))
Net::HTTP.post_form(url, params.merge(event: 'hangup'))
# flanky
watch_for(
css: '.js-phoneMenuItem .counter',
value: (call_counter + 1).to_s,
timeout: 4,
)
check(css: '.content.active .table-checkbox input')
watch_for_disappear(
css: '.js-phoneMenuItem .counter',
timeout: 15,
)
click(css: 'a[href="#manage"]')
click(css: 'a[href="#system/integration"]')
click(css: 'a[href="#system/integration/cti"]')
switch(
css: '.content.active .js-switch',
type: 'off'
)
end
# Regression test for #2018
def test_e164_numbers_displayed_in_prettified_format
id = SecureRandom.uuid
@browser = browser_instance
login(
username: 'admin@example.com',
password: 'test',
url: browser_url,
)
click(css: 'a[href="#manage"]')
click(css: 'a[href="#system/integration"]')
click(css: 'a[href="#system/integration/cti"]')
switch(
css: '.content.active .js-switch',
type: 'on'
)
watch_for(
css: 'a[href="#cti"]'
)
click(css: 'a[href="#cti"]')
# simulate cti callbacks...
url = URI.join(browser_url, "api/v1/cti/#{ENV['CTI_TOKEN']}")
# ...for private network number
params = {
direction: 'in',
from: '007',
to: '008',
callId: "4991155921769858278-#{id}",
cause: 'busy'
}
Net::HTTP.post_form(url, params.merge(event: 'newCall'))
Net::HTTP.post_form(url, params.merge(event: 'hangup'))
# ...for e164 number
params = {
direction: 'in',
from: '4930609854180',
to: '4930609811111',
callId: "4991155921769858278-#{id.next}",
cause: 'busy'
}
Net::HTTP.post_form(url, params.merge(event: 'newCall'))
Net::HTTP.post_form(url, params.merge(event: 'hangup'))
# view caller log
click(css: 'a[href="#cti"]')
# assertion: private network numbers appear verbatim
watch_for(
css: '.content.active .js-callerLog',
value: '007',
timeout: 3,
)
match(
css: '.content.active .js-callerLog',
value: '008',
)
# assertion: E164 numbers appear prettified
match(
css: '.content.active .js-callerLog',
value: '+49 30 609854180',
)
match(
css: '.content.active .js-callerLog',
value: '+49 30 609811111',
)
end
# Regression test for #2096
def test_inactive_users_displayed_inactive_in_caller_log
id = SecureRandom.uuid
@browser = browser_instance
login(
username: 'admin@example.com',
password: 'test',
url: browser_url,
)
# create inactive user with phone number (via API)
user_create(
data: {
login: 'test_user',
firstname: 'John',
lastname: 'Doe',
phone: '1234567890',
active: false,
},
)
# enable CTI
click(css: 'a[href="#manage"]')
click(css: 'a[href="#system/integration"]')
click(css: 'a[href="#system/integration/cti"]')
switch(
css: '.content.active .js-switch',
type: 'on'
)
watch_for(
css: 'a[href="#cti"]'
)
click(css: 'a[href="#cti"]')
# simulate CTI callback to/from inactive user
url = URI.join(browser_url, "api/v1/cti/#{ENV['CTI_TOKEN']}")
params = {
direction: 'in',
from: '1234567890',
to: '1234567890',
callId: "4991155921769858278-#{id}",
cause: 'busy'
}
Net::HTTP.post_form(url, params.merge(event: 'newCall'))
Net::HTTP.post_form(url, params.merge(event: 'hangup'))
# view caller log
click(css: 'a[href="#cti"]')
# assertion: names appear in inactive
match(
css: 'span.avatar--inactive',
value: 'JD',
)
end
# Regression test for #2075
def test_caller_ids_include_organization_names
id = SecureRandom.uuid
@browser = browser_instance
login(
username: 'admin@example.com',
password: 'test',
url: browser_url,
)
# create user with organization (via API)
user_create(
data: {
login: 'test_user',
firstname: 'John',
lastname: 'Doe',
phone: '1234567890',
organization: 'Zammad Foundation'
},
)
# enable CTI
click(css: 'a[href="#manage"]')
click(css: 'a[href="#system/integration"]')
click(css: 'a[href="#system/integration/cti"]')
switch(
css: '.content.active .js-switch',
type: 'on'
)
watch_for(
css: 'a[href="#cti"]'
)
# view caller log
click(css: 'a[href="#cti"]')
# simulate CTI callbacks to/from target user
url = URI.join(browser_url, "api/v1/cti/#{ENV['CTI_TOKEN']}")
params = {
direction: 'out',
from: '1234567890',
to: '1234567890',
callId: "4991155921769858278-#{id}",
cause: 'busy'
}
Net::HTTP.post_form(url, params.merge(event: 'newCall'))
Net::HTTP.post_form(url, params.merge(event: 'hangup'))
params = {
direction: 'in',
from: '1234567890',
to: '1234567890',
callId: "4991155921769858278-#{id.next}",
cause: 'busy'
}
Net::HTTP.post_form(url, params.merge(event: 'newCall'))
Net::HTTP.post_form(url, params.merge(event: 'hangup'))
watch_for(
css: '.js-callerLog tr:nth-of-type(2)'
)
# assertions: Caller ID includes user organization
match(
css: '.js-callerLog tr:first-of-type div.user-popover',
value: 'John Doe (Zammad Foundation)',
)
match(
css: '.js-callerLog tr:last-of-type div.user-popover',
value: 'John Doe (Zammad Foundation)',
)
end
end

View file

@ -1,71 +0,0 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
require 'browser_test_helper'
class IntegrationSipgateTest < TestCase
# Regression test for #2017
def test_nav_menu_notification_badge_clears
id = SecureRandom.uuid
@browser = browser_instance
login(
username: 'admin@example.com',
password: 'test',
url: browser_url,
)
click(css: 'a[href="#manage"]')
click(css: 'a[href="#system/integration"]')
click(css: 'a[href="#system/integration/sipgate"]')
switch(
css: '.content.active .js-switch',
type: 'on'
)
watch_for(
css: 'a[href="#cti"]',
timeout: 4,
)
click(css: 'a[href="#cti"]')
call_counter = @browser.find_elements(css: '.js-phoneMenuItem .counter')
.first&.text.to_i
# simulate cti callbacks
url = URI.join(browser_url, 'api/v1/sipgate/in')
params = {
direction: 'in',
from: '491715000003',
to: '4930600000004',
callId: "4991155921769858279-#{id}",
cause: 'busy'
}
Net::HTTP.post_form(url, params.merge(event: 'newCall'))
Net::HTTP.post_form(url, params.merge(event: 'hangup'))
# flanky
watch_for(
css: '.js-phoneMenuItem .counter',
value: (call_counter + 1).to_s,
timeout: 4,
)
check(css: '.content.active .table-checkbox input')
watch_for_disappear(
css: '.js-phoneMenuItem .counter',
timeout: 6,
)
click(css: 'a[href="#manage"]')
click(css: 'a[href="#system/integration"]')
click(css: 'a[href="#system/integration/sipgate"]')
switch(
css: '.content.active .js-switch',
type: 'off'
)
end
end

View file

@ -221,10 +221,9 @@ class KeyboardShortcutsTest < TestCase
shortcut(key: 'e') shortcut(key: 'e')
watch_for( watch_for(
css: 'body', css: '#login',
value: 'login', value: 'username',
timeout: 4, timeout: 4,
) )
end end
end end

View file

@ -1,44 +0,0 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
require 'browser_test_helper'
class MonitoringTest < TestCase
def test_mode
browser1 = browser_instance
login(
browser: browser1,
username: 'admin@example.com',
password: 'test',
url: browser_url,
)
click(
browser: browser1,
css: 'a[href="#manage"]',
)
click(
browser: browser1,
css: 'a[href="#system/monitoring"]',
)
token = browser1.find_elements(css: '.active.content .js-token')[0].attribute('value')
url = browser1.find_elements(css: '.active.content .js-url')[0].attribute('value')
assert_match(token.to_s, url)
click(
browser: browser1,
css: '.active.content .js-resetToken',
)
sleep 3
token_new = browser1.find_elements(css: '.active.content .js-token')[0].attribute('value')
url_new = browser1.find_elements(css: '.active.content .js-url')[0].attribute('value')
assert_not_equal(token, token_new)
assert_not_equal(url, url_new)
assert_match(token_new.to_s, url_new)
end
end

View file

@ -1,337 +0,0 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
require 'browser_test_helper'
class PreferencesLanguageTest < TestCase
def test_lang_change
@browser = browser_instance
login(
username: 'admin@example.com',
password: 'test',
url: browser_url,
)
tasks_close_all
# start ticket create
ticket_create(
data: {
customer: 'nicole',
group: 'Users',
title: 'preferences lang check #1',
body: 'preferences lang check #1',
},
do_not_submit: true,
)
# start ticket zoom
ticket_create(
data: {
customer: 'nicole',
group: 'Users',
title: 'preferences lang check #2',
body: 'preferences lang check #2',
},
)
# start user profile
user_open_by_search(
value: 'Nicole',
)
# start organization profile
organization_open_by_search(
value: 'Zammad Foundation',
)
click(css: 'a[href="#current_user"]')
click(css: 'a[href="#profile"]')
click(css: 'a[href="#profile/language"]')
select(
css: '.js-language [name="locale"]',
value: 'Deutsch',
)
click(css: '.content.active button[type="submit"]')
watch_for(
css: 'body',
value: 'Sprache',
)
# check language in navbar
watch_for(
css: '.js-menu',
value: 'Übersicht'
)
# check language in dashboard
click(css: '.js-menu a[href="#dashboard"]')
watch_for(
css: '.content.active',
value: 'Meine Statistik'
)
# check language in overview
click(css: '.js-menu a[href="#ticket/view"]')
watch_for(
css: '.content.active',
value: 'Meine'
)
verify_title(
value: 'Meine zugewiesenen',
)
# check language in ticket create
open_task(
data: {
title: 'Anruf',
}
)
verify_task(
data: {
title: 'Anruf',
}
)
open_task(
data: {
title: 'preferences lang check #1',
}
)
watch_for(
css: '.content.active',
value: 'kunde'
)
watch_for(
css: '.content.active',
value: 'priorität'
)
watch_for(
css: '.content.active [data-name="body"]',
value: 'preferences lang check #1'
)
verify_title(
value: 'anruf',
)
# check language in ticket zoom
open_task(
data: {
title: 'preferences lang check #2',
}
)
watch_for(
css: '.content.active',
value: 'erstellt'
)
watch_for(
css: '.content.active',
value: 'priorität'
)
# check language in user profile
open_task(
data: {
title: 'Nicole',
}
)
watch_for(
css: '.content.active',
value: 'notiz'
)
watch_for(
css: '.content.active',
value: 'e-mail'
)
watch_for(
css: '.content.active',
value: 'aktion'
)
# check language in organization profile
open_task(
data: {
title: 'Zammad',
}
)
watch_for(
css: '.content.active',
value: 'notiz'
)
click(css: 'a[href="#current_user"]')
click(css: 'a[href="#profile"]')
click(css: 'a[href="#profile/language"]')
select(
css: '.js-language [name="locale"]',
value: 'English (United States)',
)
click(css: '.content.active button[type="submit"]')
sleep 2
watch_for(
css: 'body',
value: 'Language',
)
# check language in navbar
watch_for(
css: '.js-menu',
value: 'Overview'
)
# check language in dashboard
click(css: '.js-menu a[href="#dashboard"]')
watch_for(
css: '.content.active',
value: 'My Stats'
)
# check language in overview
click(css: '.js-menu a[href="#ticket/view"]')
watch_for(
css: '.content.active',
value: 'My'
)
verify_title(
value: 'My assig',
)
# check language in ticket create
open_task(
data: {
title: 'Call',
}
)
verify_task(
data: {
title: 'Call',
}
)
open_task(
data: {
title: 'preferences lang check #1',
}
)
watch_for(
css: '.content.active',
value: 'customer'
)
watch_for(
css: '.content.active',
value: 'priority'
)
watch_for(
css: '.content.active [data-name="body"]',
value: 'preferences lang check #1'
)
verify_title(
value: 'call',
)
# check language in ticket zoom
open_task(
data: {
title: 'preferences lang check #2',
}
)
watch_for(
css: '.content.active',
value: 'create'
)
watch_for(
css: '.content.active',
value: 'priority'
)
# check language in user profile
open_task(
data: {
title: 'Nicole',
}
)
watch_for(
css: '.content.active',
value: 'note'
)
watch_for(
css: '.content.active',
value: 'email'
)
# check language in organization profile
open_task(
data: {
title: 'Zammad',
}
)
watch_for(
css: '.content.active',
value: 'note'
)
watch_for(
css: '.content.active',
value: 'action'
)
# switch to de again
click(css: 'a[href="#current_user"]')
click(css: 'a[href="#profile"]')
click(css: 'a[href="#profile/language"]')
sleep 4
select(
css: '.js-language [name="locale"]',
value: 'Deutsch',
)
click(css: '.content.active button[type="submit"]')
sleep 4
watch_for(
css: 'body',
value: 'Sprache',
)
sleep 6
# check if language is still used after reload
reload
sleep 2
watch_for(
css: 'body',
value: 'Sprache',
)
# check language in navbar
watch_for(
css: '.js-menu',
value: 'Übersicht'
)
# check language in dashboard
click(css: '.js-menu a[href="#dashboard"]')
watch_for(
css: '.content.active',
value: 'Meine Statistik'
)
# check language in overview
click(css: '.js-menu a[href="#ticket/view"]')
watch_for(
css: '.content.active',
value: 'Meine'
)
# switch to en again
click(css: 'a[href="#current_user"]')
click(css: 'a[href="#profile"]')
click(css: 'a[href="#profile/language"]')
select(
css: '.js-language [name="locale"]',
value: 'English (United States)',
)
click(css: '.content.active button[type="submit"]')
sleep 2
watch_for(
css: 'body',
value: 'Language',
)
end
end

View file

@ -1,53 +0,0 @@
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
require 'browser_test_helper'
class SwitchToUserTest < TestCase
def test_agent_user
@browser = browser_instance
login(
username: 'admin@example.com',
password: 'test',
url: browser_url,
)
tasks_close_all
click(css: 'a[href="#manage"]')
click(css: '.content.active a[href="#manage/users"]')
set(
css: '.content.active .js-search',
value: 'nicole',
)
sleep 3
@browser.action.move_to(@browser.find_elements({ css: '.content.active .table-overview tbody tr:first-child' })[0]).release.perform
sleep 0.5
click(
css: '.content.active .dropdown--actions',
)
click(
css: '.content.active .icon-switchView',
ajax: false
)
sleep 3
watch_for(
css: '.switchBackToUser',
value: 'zammad looks like',
)
watch_for(
css: '.switchBackToUser',
value: 'Nicole',
)
login = @browser.find_elements({ css: '.user-menu .user a' })[0].attribute('title')
assert_equal(login, 'nicole.braun@zammad.org')
click(css: '.switchBackToUser .js-close', ajax: false)
sleep 5
login = @browser.find_elements({ css: '.user-menu .user a' })[0].attribute('title')
assert_equal(login, 'admin@example.com')
end
end

View file

@ -104,9 +104,7 @@ Oversized Email Message Body #{'#' * 120_000}
# 1. verify that the oversized email has been saved locally to: # 1. verify that the oversized email has been saved locally to:
# /tmp/oversized_mail/yyyy-mm-ddThh:mm:ss-:md5.eml # /tmp/oversized_mail/yyyy-mm-ddThh:mm:ss-:md5.eml
path = Rails.root.join('tmp/oversized_mail') path = Rails.root.join('tmp/oversized_mail')
target_files = Dir.entries(path).select do |filename| target_files = Dir.entries(path).grep(%r{^#{large_message_md5}\.eml$})
filename =~ %r{^#{large_message_md5}\.eml$}
end
assert(target_files.present?, 'Large message .eml log file must be present.') assert(target_files.present?, 'Large message .eml log file must be present.')
# pick the latest file that matches the criteria # pick the latest file that matches the criteria
@ -193,9 +191,7 @@ Oversized Email Message Body #{'#' * 120_000}
# 1. verify that the oversized email has been saved locally to: # 1. verify that the oversized email has been saved locally to:
# /tmp/oversized_mail/yyyy-mm-ddThh:mm:ss-:md5.eml # /tmp/oversized_mail/yyyy-mm-ddThh:mm:ss-:md5.eml
path = Rails.root.join('tmp/oversized_mail') path = Rails.root.join('tmp/oversized_mail')
target_files = Dir.entries(path).select do |filename| target_files = Dir.entries(path).grep(%r{^.+?\.eml$})
filename =~ %r{^.+?\.eml$}
end
assert_not(target_files.blank?, 'Large message .eml log file must be blank.') assert_not(target_files.blank?, 'Large message .eml log file must be blank.')
# 2. verify that a postmaster response email has been sent to the sender # 2. verify that a postmaster response email has been sent to the sender

View file

@ -55,8 +55,8 @@ class OtrsImportBrowserTest < TestCase
click(css: '.js-migration-start') click(css: '.js-migration-start')
watch_for( watch_for(
css: 'body', css: '#login',
value: 'login', value: 'username',
timeout: 600, timeout: 600,
) )

View file

@ -62,7 +62,7 @@ class ActiveSupport::TestCase
# read config file and count type & recipients # read config file and count type & recipients
file = Rails.root.join('log', "#{Rails.env}.log") file = Rails.root.join('log', "#{Rails.env}.log")
lines = [] lines = []
IO.foreach(file) do |line| File.foreach(file) do |line|
lines.push line lines.push line
end end
count = 0 count = 0