Compare commits

..

60 commits

Author SHA1 Message Date
f
ce1527f259 makefile 2021-10-14 19:28:28 -03:00
f
71f35b069e Use gems compiled for Alpine Linux 2021-10-14 19:28:12 -03:00
Rolf Schmidt
3ddb52c9b9 Fixes #3790 - Support workflow mechanism to do pending reminder state hide pending time use case. 2021-10-14 12:01:56 +01:00
Thorsten Eckel
2346eaa005 Follow up - b125b3603e - Maintenance: Docker Chat build image misses yarn installation of dependencies. 2021-10-14 11:00:35 +02:00
Thorsten Eckel
d17e3c5b55 Fixes #3808 - Regression of #3797 causes installation of new instances from package to fail. 2021-10-14 08:33:48 +02:00
Martin Gruner
8762f96810 Fixes #3794 - Example payload in webhook view leads to 500 error 2021-10-13 11:24:04 +00:00
Thorsten Eckel
6281816d4d Maintenance: Bumped Puma to 4.3.10 to resolve CVE-2021-41136. 2021-10-13 08:46:00 +02:00
Dominik Klein
372bbb0751 Maintenance: Try to improve the stabilzation of the maintenance app version selenium test.
(cherry picked from commit 587f36d220)
2021-10-09 13:27:37 +02:00
Dominik Klein
fa8588855c Maintenance: Port maintenance session message test to capybara.
(cherry picked from commit 22cd8f3376)
2021-10-08 14:37:35 +02:00
Martin Edenhofer
905bdd512b Fixes #3797 - OS package upgrade fails (activity_stream_object_id) 2021-10-08 10:59:45 +02:00
Martin Edenhofer
fd99f097d5 Maintenance: Updated to 5.0.1 2021-10-08 09:53:42 +02:00
Martin Gruner
880b2fd131 Follow-up: 276c45b2e9 - Improved ticket policy scope handling. 2021-10-07 15:52:54 +00:00
Romit Choudhary
c4ccbc46ff Fixes #3737 - Bug Report 4.1.x Overview Sort - Grouped by user 2021-10-07 16:05:22 +02:00
Rolf Schmidt
d638f02a12 Fixes #3789 - Article box opening on tickets with no changes. 2021-10-07 08:03:14 +01:00
Dominik Klein
497b6aaeff Maintenance: Port maintenance app version test to capybara.
(cherry picked from commit c1cb4fdd43)
2021-10-06 13:06:55 +02:00
Rolf Schmidt
4e05f0c121 Fixes #3787 - UploadCacheCleanupJob does not execute. 2021-10-05 17:23:14 +02:00
Martin Gruner
f18c0c9571 Fixes: #3788 - lib/fill_db.rb fails to work in production environments. 2021-10-05 14:29:39 +02:00
Martin Edenhofer
d288b48b0a Updated to 5.0.0 2021-10-05 04:02:08 +02:00
Mantas Masalskis
94011846d6 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:06:21 +02:00
Rolf Schmidt
09fc94cf72 Fixes #3779 - Core Workflow: Add organization condition attributes for object User. 2021-10-04 15:47:54 +02:00
Mantas Masalskis
c34452f65e Fixes #3783 - Improve contrasts in answer search for articles 2021-10-04 15:43:18 +02:00
Rolf Schmidt
2b77711150 Maintenance: Add another reload to setup new js for core workflow. 2021-10-04 15:26:07 +02:00
Rolf Schmidt
57945692cc Follow up 5f2181d8a3 - Fixes #3757 - escaped 'Set fixed' workflows don't refresh set values on active ticket sessions. 2021-10-04 15:26:06 +02:00
Martin Gruner
dfb2abe380 Maintenance: Specify a certain PostgreSQL version for the build process that still works with older platforms. 2021-10-04 14:57:48 +02:00
Rolf Schmidt
07c6bdacfb Fixes #3781 - ObjectManager Attribute without screen attribute causes CoreWorkflows migration to fail 2021-10-01 16:54:05 +02:00
benrubson
ff03e664db Fixes #2674, closes #3775 - Zammad preflight check warning output causes Syntax-Error in postinstall.sh and failing installation. 2021-10-01 16:54:05 +02:00
Romit Choudhary
c72006216e Fixes #2780 - Shared Organisation issue create your first ticket 2021-10-01 16:54:04 +02:00
Rolf Schmidt
6efafd37ae Fixes #3776 - Force users to reload after system migration. 2021-10-01 16:54:03 +02:00
Dominik Klein
35f45f690f Maintenance: Port customer ticket create fields test to capybara. 2021-10-01 16:54:03 +02:00
Romit Choudhary
23c8db7e58 Fixes #2351 - Unable to cancel attachment upload 2021-10-01 16:54:02 +02:00
Martin Gruner
8382a71813 Maintenance: Port admin_calendar_sla_test.rb to Capybara. 2021-10-01 16:54:01 +02:00
Thorsten Eckel
9bb1cf6d00 Fixes #3777 - misspelled KnowledgeBase constant breaks update. 2021-10-01 16:54:01 +02:00
Mantas
2bba743dc3 Fixes #2619 - KB header and footer link-color not changeable 2021-10-01 16:54:00 +02:00
Mantas
d7b0c639c4 Fixes #3028 - Syntax errors break scheduler job for good 2021-10-01 16:53:49 +02:00
Martin Edenhofer
13668dfc8b Fixes #3365 - No script content (e. g. JavaScript) in emails 2021-09-29 10:14:34 +02:00
Mantas Masalskis
1e70665d1a Fixes #3772 - Existing tickets: New article modal with padding-left: 0; padding-right: 0; 2021-09-29 10:09:47 +02:00
Rolf Schmidt
4b0d4f798f Fixes #3757 - escaped 'Set fixed' workflows don't refresh set values on active ticket sessions. 2021-09-29 10:03:34 +02:00
Thorsten Eckel
9ad7c43cd5 Maintenance: Pluralize admin navigation entry name for Core Workflows. 2021-09-29 09:59:56 +02:00
Martin Gruner
ab9fa3d23d Maintenance: Bump nokogiri to v1.12.5. 2021-09-28 08:52:18 +02:00
Dominik Klein
5222f4ba6d Maintenance: Port agent ticket update tests to capybara. 2021-09-27 12:50:50 +02:00
Martin Gruner
9689d3d97e Maintenance: Stabilize System > Objects test (another try). 2021-09-27 11:59:17 +02:00
Martin Gruner
6a10308f29 Maintenance: Stabilize System > Objects test. 2021-09-25 06:29:14 +02:00
Martin Gruner
ab3cede8ef Maintenance: Port System > Translations test to capybara. 2021-09-24 16:20:00 +02:00
Martin Gruner
fa3cb1925d Fixes: #3765 - Possible race condition causing OTRS import to fail 2021-09-24 09:28:28 +02:00
Mantas
a7def1d62d Fixes #3746 - Incorrect alignment in the listing of attachments when creating a ticket 2021-09-23 16:35:28 +02:00
Rolf Schmidt
a3df6b8581 Fixes #3758 - Saved conditions break on selections without reloading. 2021-09-23 15:51:18 +02:00
Romit Choudhary
dd201db791 Fixes #3075 - Misleading view of user icons which are on vacation and disabled 2021-09-23 15:48:24 +02:00
Martin Gruner
60c0b08d21 Maintenance: Work around timeouts caused by the sanitizer in slow CI environments. 2021-09-23 15:15:24 +02:00
Martin Gruner
95571b70c9 Maintenance: Improve template rendering. 2021-09-23 12:02:18 +00:00
Dominik Klein
678161be2e Maintenance: Refactoring of Avatar storage logic. 2021-09-23 12:02:18 +00:00
Rolf Schmidt
008053f730 Maintenance: Add assets level to have different data sets based on permissions 2021-09-23 12:02:18 +00:00
Thorsten Eckel
ed1782fafc Maintenance: Enhance attachment preview capabilities 2021-09-23 12:02:18 +00:00
Rolf Schmidt
72f39d0d9d Maintenance: Remove while loop user check login. 2021-09-23 12:02:18 +00:00
Dominik Klein
7a156c5d48 Maintenance: Improve package installation. 2021-09-23 12:02:18 +00:00
Thorsten Eckel
f31aeec8db Maintenance: Improve application boot time by reducing initial asset payload 2021-09-23 12:02:18 +00:00
Dominik Klein
f67cf3ab1e Maintenance: Increase performance of ticket creation via form. 2021-09-23 12:02:18 +00:00
Thorsten Eckel
b125b3603e Maintenance: Improve clipboard handling of website chat 2021-09-23 12:02:18 +00:00
Martin Gruner
b1e8b3afae Maintenance: Improved updating of user records in the front end. 2021-09-23 12:02:18 +00:00
Rolf Schmidt
573c975bad Maintenance: Enhanced GitHub and GitLab GraphQL endpoint check 2021-09-23 12:02:18 +00:00
Martin Gruner
25155eb6a3 Maintenance: Improved updating of user records. 2021-09-23 12:02:18 +00:00
56 changed files with 1545 additions and 990 deletions

View file

@ -1,9 +1,8 @@
## What does this MR do? ## What does this MR do?
<!--Insert the link to a GitHub issue in (), or describe the changes if there is no issue --> <!-- Is there a lot to say? Consider creating an issue. -->
[Issue Link]()
## Screenshots <!-- Optional, very helpful for the reviewer colleagues from other teams --> ## Screenshots <!-- Optional -->
### Before ### Before
@ -13,7 +12,7 @@
![alt text](https://example.com/after.png) ![alt text](https://example.com/after.png)
## Code Changes ## Notes
* This MR * This MR
**does** <!-- KEEP ONLY ONE --> **does** <!-- KEEP ONLY ONE -->
@ -59,36 +58,9 @@ 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!)
--> -->
### Documentation Follow-up Required? ### Follow-up Required <!-- Optional -->
<!-- Keep one of the two sections -->
<!-- <!--
If this MR does change: Does your MR require coordination with the documentation/support teams?
- How the user experiences or uses the application If so, apply the label and explain here.
- 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,8 +6,6 @@ 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,6 +887,10 @@ 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,15 +1,196 @@
# Change Log # Change Log
## [5.1.0](https://github.com/zammad/zammad/tree/5.1.0) (2021-xx-xx) ## [5.0.1](https://github.com/zammad/zammad/tree/5.0.1) (2021-10-08)
[Full Changelog](https://github.com/zammad/zammad/compare/5.0.0...5.1.0) [Full Changelog](https://github.com/zammad/zammad/compare/5.0.0...5.0.1)
**Implemented enhancements:**
**Fixed bugs:** **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:**
- 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:**
- 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.3' ruby '2.7.4'
gem 'rails', '~> 6.0.0' gem 'rails', '~> 6.0'
# core - rails additions # core - rails additions
gem 'activerecord-import' gem 'activerecord-import'
@ -198,7 +198,6 @@ 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.1.1) argon2 (2.0.3)
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.30.1) async (1.29.1)
console (~> 1.10) console (~> 1.10)
nio4r (~> 2.3) nio4r (~> 2.3)
timers (~> 4.1) timers (~> 4.1)
async-http (0.56.5) async-http (0.56.3)
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.2) async-io (1.32.1)
async async (~> 1.14)
async-pool (0.3.9) async-pool (0.3.7)
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.4) doorkeeper (5.5.2)
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.1.0) faraday_middleware (1.0.0)
faraday (~> 1.0) faraday (~> 1.0)
ffi (1.15.4-x86_64-linux-musl) ffi (1.15.3-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.3.0) jwt (2.2.3)
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.7.0) listen (3.5.1)
rb-fsevent (~> 0.10, >= 0.10.3) rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10) rb-inotify (~> 0.9, >= 0.9.10)
little-plugger (1.1.4) little-plugger (1.1.4)
@ -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.2) marcel (1.0.1)
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.0901) mime-types-data (3.2021.0225)
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.5) protocol-http (0.22.4)
protocol-http1 (0.14.2) protocol-http1 (0.14.1)
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.2) rails-html-sanitizer (1.4.1)
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,41 +521,38 @@ 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.22.1) rubocop (1.21.0)
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.12.0, < 2.0) rubocop-ast (>= 1.9.1, < 2.0)
ruby-progressbar (~> 1.7) ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 3.0) unicode-display_width (>= 1.4.0, < 3.0)
rubocop-ast (1.12.0) rubocop-ast (1.11.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.3) rubocop-rails (2.12.2)
activesupport (>= 4.2.0) activesupport (>= 4.2.0)
rack (>= 1.1) rack (>= 1.1)
rubocop (>= 1.7.0, < 2.0) rubocop (>= 1.7.0, < 2.0)
rubocop-rspec (2.5.0) rubocop-rspec (2.5.0)
rubocop (~> 1.19) rubocop (~> 1.19)
ruby-progressbar (1.11.0) ruby-progressbar (1.11.0)
ruby-saml (1.13.0) ruby-saml (1.12.2)
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.2) rubyzip (2.3.0)
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)
@ -619,7 +616,7 @@ GEM
timers (4.3.3) timers (4.3.3)
tins (1.29.1) tins (1.29.1)
sync sync
twilio-ruby (5.59.0) twilio-ruby (5.58.3)
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)
@ -640,8 +637,7 @@ 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.8) unf_ext (0.0.7.7-x86_64-linux-musl)
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)
@ -757,7 +753,7 @@ DEPENDENCIES
pundit pundit
pundit-matchers pundit-matchers
rack-livereload rack-livereload
rails (~> 6.0.0) rails (~> 6.0)
rails-controller-testing rails-controller-testing
rb-fsevent rb-fsevent
rchardet (>= 1.8.0) rchardet (>= 1.8.0)
@ -766,7 +762,6 @@ 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
@ -797,7 +792,7 @@ DEPENDENCIES
zendesk_api zendesk_api
RUBY VERSION RUBY VERSION
ruby 2.7.3p183 ruby 2.7.4p191
BUNDLED WITH BUNDLED WITH
2.2.27 2.2.20

View file

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

View file

@ -497,9 +497,7 @@ class App.ControllerTable extends App.Controller
reference_key = groupBy + '_id' reference_key = groupBy + '_id'
if reference_key of object if reference_key of object
attribute = _.findWhere(object.constructor.configure_attributes, { name: reference_key }) return 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.translatePlain(row.name) row.name = App.i18n.translateInline(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.translatePlain(name_new) name_new = App.i18n.translateInline(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.translatePlain(nameNew) nameNew = App.i18n.translateInline(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 =
Firefox: 78 # ESR Chrome: 37
Chrome: 83 # parallel to FF ESR - Edge is also detected as Chrome Firefox: 36
Opera: 69 # based on Chrome 83 Explorer: 10
Explorer: 11 # 10 is EOL Safari: 6
Safari: 11 # released 2018 Opera: 22
# 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.translatePlain('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.translateInline('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('Log in to %s', @C('fqdn')) %></p> <p><%- @T('Login with %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,8 +7,6 @@ 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
@ -112,7 +110,10 @@ 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 = check_type == 'check' ? CHECK_ONLY_TIMEOUT : DEFAULT_TIMEOUT check_type_timeout = 45
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, File.binread(entry)) ticket, _article, _user, _mail = Channel::EmailParser.new.process(params, IO.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 in conditions where attributes are used by triggers, overviews or schedulers
result = ObjectManager::Attribute.attribute_to_references_hash result = ObjectManager::Attribute.attribute_to_references_hash
@ -696,12 +696,9 @@ where attributes are used in conditions
=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|
attribute_to_references_hash_objects
.map { |elem| elem.select(:name, :condition) }
.flatten
.each do |item|
item.condition.each do |condition_key, _condition_attributes| item.condition.each do |condition_key, _condition_attributes|
attribute_list[condition_key] ||= {} attribute_list[condition_key] ||= {}
attribute_list[condition_key][item.class.name] ||= [] attribute_list[condition_key][item.class.name] ||= []
@ -710,22 +707,11 @@ where attributes are used in conditions
attribute_list[condition_key][item.class.name].push 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,7 +2,6 @@
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.irregular 'base', 'bases' inflect.singular(%r{(knowledge_base)s$}i, '\1')
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%)' add_column :knowledge_bases, :color_header_link, :string, limit: 25, null: false, default: 'hsl(206,8%,50%)' # rubocop:disable Zammad/ExistsResetColumnInformation
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[6.0] class ReloadAfterCoreWorkflow < ActiveRecord::Migration[4.2]
def up def up
# return if it's a new setup # return if it's a new setup

View file

@ -162,7 +162,7 @@ satinize html string based on whiltelist
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
.grep_v(%r{^[^:]+:$}) # URI::extract will match, e.g., 'tel:' .reject { |u| u.match?(%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 konsultanci są zajęci.' 'All colleagues are busy.': 'Wszyscy koledzy 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 konsultanci są zajęci.', 'All colleagues are busy.': 'Wszyscy koledzy 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 konsultanci są zajęci.' 'All colleagues are busy.': 'Wszyscy koledzy 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,8 +11,10 @@ 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
@ -43,11 +45,16 @@ 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
@ -60,8 +67,10 @@ 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
@ -92,11 +101,17 @@ 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
@ -108,8 +123,10 @@ 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
@ -140,11 +157,17 @@ 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
@ -156,8 +179,10 @@ 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
@ -188,11 +213,17 @@ 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
@ -203,8 +234,10 @@ 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
@ -235,11 +268,17 @@ 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
@ -253,8 +292,10 @@ 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
@ -285,11 +326,17 @@ 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 RSpec.describe GitHub, type: :integration, required_envs: %w[GITHUB_ENDPOINT GITHUB_APITOKEN] do # rubocop:disable RSpec/FilePath
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 RSpec.describe GitLab, type: :integration, required_envs: %w[GITLAB_ENDPOINT GITLAB_APITOKEN] do # rubocop:disable RSpec/FilePath
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,12 +148,4 @@ 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,21 +32,6 @@ 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,8 +92,6 @@ 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,6 +3,7 @@
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',
@ -10,35 +11,6 @@ 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,113 +4,6 @@ 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,234 +2,62 @@
require 'rails_helper' require 'rails_helper'
RSpec.describe 'Caller log', type: :system, authenticated_as: :agent do RSpec.describe 'Caller log', type: %i[system request] do
let(:agent_phone) { '0190111' } let(:admin) do
let(:customer_phone) { '0190333' } create(:admin, groups: Group.all)
let(:cti_token) { 'token1234' } end
let(:agent) { create(:agent, phone: agent_phone) }
let(:customer) { create(:customer, phone: customer_phone) } let!(:customer) { create(:customer, phone: '0190333') }
let(:cti_on) { true }
let(:params) do let(:params) do
{ {
direction: 'in', direction: 'in',
from: customer.phone, from: '0190333',
to: agent_phone, to: '0190111',
callId: '111', callId: '111',
cause: 'busy', cause: 'busy'
} }
end end
let(:first_params) { params.merge(event: 'newCall') } def prepare
let(:second_params) { params.merge(event: 'hangup') } Setting.set('cti_integration', true)
Setting.set('cti_token', 'token1234')
let(:place_call) do current_user.update(phone: '0190111')
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
let(:prepare) do
Setting.set('cti_integration', cti_on)
Setting.set('cti_token', cti_token)
end
before { prepare }
context 'when cti 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 cti integration is not on' do
let(:cti_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 'when a customer call is answered' do
let(:second_params) { params.merge(event: 'answer', answeringNumber: agent_phone) }
context 'without active tickets' do context 'without active tickets' do
before do it 'checks opening of the ticket creation screen after phone call inbound' do
prepare
travel(-2.months) travel(-2.months)
create(:ticket, customer: customer) create(:ticket, customer: customer)
travel_back travel_back
visit 'cti' visit 'cti'
place_call post "#{Capybara.app_host}/api/v1/cti/token1234", params: params.merge(event: 'newCall'), as: :json
end post "#{Capybara.app_host}/api/v1/cti/token1234", params: params.merge(event: 'answer', answeringNumber: '0190111'), as: :json
it 'opens a new ticket after phone call inbound' do
within(:active_content) do within(:active_content) do
expect(page).to have_text('New Ticket') expect(page).to have_text('New Ticket', wait: 5)
end end
end end
end end
context 'with active tickets' do context 'with active tickets' do
before do it 'checks opening of the user profile screen after phone call inbound with tickets in the last month' do
prepare
create(:ticket, customer: customer) create(:ticket, customer: customer)
visit 'cti' visit 'cti'
place_call post "#{Capybara.app_host}/api/v1/cti/token1234", params: params.merge(event: 'newCall'), as: :json
end post "#{Capybara.app_host}/api/v1/cti/token1234", params: params.merge(event: 'answer', answeringNumber: '0190111'), as: :json
it 'opens the customer profile screen after phone call inbound with tickets in the last month' do
within(:active_content) do within(:active_content) do
expect(page).to have_text(customer.fullname) expect(page).to have_text(customer.fullname, wait: 5)
end end
end 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(Setting.get('fqdn')) expect(page).to have_text('Login')
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(Setting.get('fqdn')) expect(page).to have_text('Login')
end end
end end
end end

View file

@ -1,24 +0,0 @@
# 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,33 +111,6 @@ 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,19 +66,13 @@ RSpec.describe 'Overview', type: :system do
end end
end end
context 'sorting when group by is set', authenticated_as: :user do context 'sorting when group by is set' do
let(:user) { create(:agent, groups: [group_c, group_a, group_b]) } let(:user) { create(:customer) }
let(:ticket1) { create(:ticket, group: Group.find_by(name: 'Users'), priority_id: 1, customer: user) }
let(:group_a) { create(:group, name: 'aaa') } let(:ticket2) { create(:ticket, group: Group.find_by(name: 'Users'), priority_id: 2, customer: user) }
let(:group_b) { create(:group, name: 'bbb') } let(:ticket3) { create(:ticket, group: Group.find_by(name: 'Users'), priority_id: 3, customer: user) }
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: group_key, group_direction: group_direction, condition: { create(:overview, group_by: 'priority', group_direction: group_direction, condition: {
'ticket.customer_id' => { 'ticket.customer_id' => {
operator: 'is', operator: 'is',
value: user.id value: user.id
@ -92,15 +86,13 @@ RSpec.describe 'Overview', type: :system do
visit "ticket/view/#{overview.link}" visit "ticket/view/#{overview.link}"
end end
context 'when grouping by priority' do
let(:group_key) { 'priority' }
context 'when group direction is default' do context 'when group direction is default' do
let(:group_direction) { nil } let(:group_direction) { nil }
it 'sorts groups 1 > 3' do it 'sorts groups 1 > 3' do
within :active_content do within :active_content do
expect(all('.table-overview table b').map(&:text)).to eq ['1 low', '2 normal', '3 high'] 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')
end end
end end
@ -123,7 +115,8 @@ RSpec.describe 'Overview', type: :system do
it 'sorts groups 1 > 3' do it 'sorts groups 1 > 3' do
within :active_content do within :active_content do
expect(all('.table-overview table b').map(&:text)).to eq ['1 low', '2 normal', '3 high'] 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')
end end
end end
end end
@ -133,19 +126,8 @@ RSpec.describe 'Overview', type: :system do
it 'sorts groups 3 > 1' do it 'sorts groups 3 > 1' do
within :active_content do within :active_content do
expect(all('.table-overview table b').map(&:text)).to eq ['3 high', '2 normal', '1 low'] expect(find('.table-overview table tbody tr:first-child td:nth-child(1)').text).to match('3 high')
end expect(find('.table-overview table tbody tr:nth-child(5) td:nth-child(1)').text).to match('1 low')
end
end
end
context 'when grouping by groups' do
let(:group_key) { 'group' }
let(:group_direction) { 'ASC' }
it 'sorts groups a > b > c' do
within :active_content do
expect(all('.table-overview table b').map(&:text)).to eq %w[aaa bbb ccc]
end end
end end
end end

View file

@ -1,236 +0,0 @@
# 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

@ -1,86 +0,0 @@
# 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

@ -1,24 +0,0 @@
# 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,7 +535,8 @@ 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
# Log out again, so that we can execute the next login. visit 'ticket/create'
logout logout
# Re-create agent session and fetch object attributes. # Re-create agent session and fetch object attributes.
@ -562,25 +563,6 @@ 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

@ -0,0 +1,180 @@
# 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

@ -0,0 +1,68 @@
# 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

89
test/browser/auth_test.rb Normal file
View file

@ -0,0 +1,89 @@
# 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

@ -0,0 +1,293 @@
# 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

@ -0,0 +1,71 @@
# 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,9 +221,10 @@ class KeyboardShortcutsTest < TestCase
shortcut(key: 'e') shortcut(key: 'e')
watch_for( watch_for(
css: '#login', css: 'body',
value: 'username', value: 'login',
timeout: 4, timeout: 4,
) )
end end
end end

View file

@ -0,0 +1,44 @@
# 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

@ -0,0 +1,337 @@
# 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

@ -0,0 +1,53 @@
# 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,7 +104,9 @@ 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).grep(%r{^#{large_message_md5}\.eml$}) target_files = Dir.entries(path).select do |filename|
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
@ -191,7 +193,9 @@ 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).grep(%r{^.+?\.eml$}) target_files = Dir.entries(path).select do |filename|
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: '#login', css: 'body',
value: 'username', value: 'login',
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 = []
File.foreach(file) do |line| IO.foreach(file) do |line|
lines.push line lines.push line
end end
count = 0 count = 0