Browse Source

Performance: Add setting to control ticket limit per overview (#2706).

Rolf Schmidt 2 years ago
parent
commit
13fb6cb257

+ 5 - 0
app/frontend/apps/mobile/pages/ticket/__tests__/tickets-view.spec.ts

@@ -3,6 +3,7 @@
 import { EnumOrderDirection } from '@shared/graphql/types'
 import { waitFor } from '@testing-library/vue'
 import { visitView } from '@tests/support/components/visitView'
+import { mockApplicationConfig } from '@tests/support/mock-applicationConfig'
 import { mockTicketOverviews } from '@tests/support/mocks/ticket-overviews'
 import { waitForNextTick } from '@tests/support/utils'
 import { stringifyQuery } from 'vue-router'
@@ -151,6 +152,10 @@ it('pagination loads additional list', async () => {
     endCursor: 'cursor',
   })
 
+  mockApplicationConfig({
+    ui_ticket_overview_ticket_limit: 2000,
+  })
+
   const view = await visitView(`/tickets/view`)
 
   await waitFor(() => view.getByText('Ticket 1'))

+ 4 - 3
app/frontend/apps/mobile/pages/ticket/views/TicketOverview.vue

@@ -9,17 +9,18 @@ import { EnumOrderDirection } from '@shared/graphql/types'
 import CommonLoader from '@mobile/components/CommonLoader/CommonLoader.vue'
 import { useTicketOverviewsStore } from '@mobile/entities/ticket/stores/ticketOverviews'
 import CommonSelect from '@mobile/components/CommonSelect/CommonSelect.vue'
+import { useApplicationStore } from '@shared/stores/application'
 import { useSessionStore } from '@shared/stores/session'
 import { useRouteQuery } from '@vueuse/router'
 import { storeToRefs } from 'pinia'
 import TicketList from '../components/TicketList/TicketList.vue'
 
+const application = useApplicationStore()
+
 const props = defineProps<{
   overviewLink: string
 }>()
 
-const MAX_COUNT_TICKETS = 2000
-
 const router = useRouter()
 const route = useRoute()
 
@@ -281,7 +282,7 @@ const directionOptions = computed(() => [
         :overview-id="selectedOverview.id"
         :order-by="orderBy"
         :order-direction="orderDirection"
-        :max-count="MAX_COUNT_TICKETS"
+        :max-count="Number(application.config.ui_ticket_overview_ticket_limit)"
         :hidden-columns="hiddenColumns"
       />
     </CommonLoader>

+ 5 - 2
app/models/ticket/overviews.rb

@@ -87,7 +87,7 @@ returns
         .where(db_query_params.query_condition, *db_query_params.bind_condition)
         .joins(db_query_params.tables)
         .order(Arel.sql("#{db_query_params.order_by} #{db_query_params.direction}"))
-        .limit(2000)
+        .limit(limit_per_overview)
         .pluck(:id, :updated_at, Arel.sql(db_query_params.order_by))
 
       tickets = ticket_result.map do |ticket|
@@ -128,7 +128,7 @@ returns
       .where(db_query_params.query_condition, *db_query_params.bind_condition)
       .joins(db_query_params.tables)
       .order(Arel.sql("#{db_query_params.order_by} #{db_query_params.direction}"))
-      .limit(2000)
+      .limit(limit_per_overview)
   end
 
   DB_QUERY_PARAMS = Struct.new(:query_condition, :bind_condition, :tables, :order_by, :direction)
@@ -166,4 +166,7 @@ returns
     result
   end
 
+  def self.limit_per_overview
+    Setting.get('ui_ticket_overview_ticket_limit')
+  end
 end

+ 21 - 0
db/migrate/20220929130033_ticket_overview_ticket_limit_setting.rb

@@ -0,0 +1,21 @@
+# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
+
+class TicketOverviewTicketLimitSetting < ActiveRecord::Migration[6.1]
+  def change
+    # return if it's a new setup
+    return if !Setting.exists?(name: 'system_init_done')
+
+    Setting.create_if_not_exists(
+      title:       'Maximum number of ticket shown in overviews',
+      name:        'ui_ticket_overview_ticket_limit',
+      area:        'UI::TicketOverview::TicketLimit',
+      description: 'Define the maximum number of ticket shown in overviews.',
+      options:     {},
+      state:       2000,
+      preferences: {
+        permission: ['admin.overview'],
+      },
+      frontend:    true
+    )
+  end
+end

+ 13 - 0
db/seeds/settings.rb

@@ -995,6 +995,19 @@ Setting.create_if_not_exists(
   frontend:    true
 )
 
+Setting.create_if_not_exists(
+  title:       __('Maximum number of ticket shown in overviews'),
+  name:        'ui_ticket_overview_ticket_limit',
+  area:        'UI::TicketOverview::TicketLimit',
+  description: __('Define the maximum number of ticket shown in overviews.'),
+  options:     {},
+  state:       2000,
+  preferences: {
+    permission: ['admin.overview'],
+  },
+  frontend:    true
+)
+
 Setting.create_if_not_exists(
   title:       __('Password Login'),
   name:        'user_show_password_login',

+ 8 - 0
i18n/zammad.pot

@@ -2805,6 +2805,10 @@ msgstr ""
 msgid "Define queues or call destinations (whatever fits your PBX) and map your agents to it. By this, Zammad can support your agents by showing them only relevant call entries and notifications."
 msgstr ""
 
+#: db/seeds/settings.rb
+msgid "Define the maximum number of ticket shown in overviews."
+msgstr ""
+
 #: db/seeds/settings.rb
 msgid "Defines Elasticsearch index name."
 msgstr ""
@@ -6183,6 +6187,10 @@ msgstr ""
 msgid "Maximum number of recursively executed triggers."
 msgstr ""
 
+#: db/seeds/settings.rb
+msgid "Maximum number of ticket shown in overviews"
+msgstr ""
+
 #: app/assets/javascripts/app/controllers/_ui_element/basedate.coffee
 #: app/assets/javascripts/app/controllers/report.coffee
 #: app/assets/javascripts/app/controllers/time_accounting.coffee