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 { EnumOrderDirection } from '@shared/graphql/types'
 import { waitFor } from '@testing-library/vue'
 import { waitFor } from '@testing-library/vue'
 import { visitView } from '@tests/support/components/visitView'
 import { visitView } from '@tests/support/components/visitView'
+import { mockApplicationConfig } from '@tests/support/mock-applicationConfig'
 import { mockTicketOverviews } from '@tests/support/mocks/ticket-overviews'
 import { mockTicketOverviews } from '@tests/support/mocks/ticket-overviews'
 import { waitForNextTick } from '@tests/support/utils'
 import { waitForNextTick } from '@tests/support/utils'
 import { stringifyQuery } from 'vue-router'
 import { stringifyQuery } from 'vue-router'
@@ -151,6 +152,10 @@ it('pagination loads additional list', async () => {
     endCursor: 'cursor',
     endCursor: 'cursor',
   })
   })
 
 
+  mockApplicationConfig({
+    ui_ticket_overview_ticket_limit: 2000,
+  })
+
   const view = await visitView(`/tickets/view`)
   const view = await visitView(`/tickets/view`)
 
 
   await waitFor(() => view.getByText('Ticket 1'))
   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 CommonLoader from '@mobile/components/CommonLoader/CommonLoader.vue'
 import { useTicketOverviewsStore } from '@mobile/entities/ticket/stores/ticketOverviews'
 import { useTicketOverviewsStore } from '@mobile/entities/ticket/stores/ticketOverviews'
 import CommonSelect from '@mobile/components/CommonSelect/CommonSelect.vue'
 import CommonSelect from '@mobile/components/CommonSelect/CommonSelect.vue'
+import { useApplicationStore } from '@shared/stores/application'
 import { useSessionStore } from '@shared/stores/session'
 import { useSessionStore } from '@shared/stores/session'
 import { useRouteQuery } from '@vueuse/router'
 import { useRouteQuery } from '@vueuse/router'
 import { storeToRefs } from 'pinia'
 import { storeToRefs } from 'pinia'
 import TicketList from '../components/TicketList/TicketList.vue'
 import TicketList from '../components/TicketList/TicketList.vue'
 
 
+const application = useApplicationStore()
+
 const props = defineProps<{
 const props = defineProps<{
   overviewLink: string
   overviewLink: string
 }>()
 }>()
 
 
-const MAX_COUNT_TICKETS = 2000
-
 const router = useRouter()
 const router = useRouter()
 const route = useRoute()
 const route = useRoute()
 
 
@@ -281,7 +282,7 @@ const directionOptions = computed(() => [
         :overview-id="selectedOverview.id"
         :overview-id="selectedOverview.id"
         :order-by="orderBy"
         :order-by="orderBy"
         :order-direction="orderDirection"
         :order-direction="orderDirection"
-        :max-count="MAX_COUNT_TICKETS"
+        :max-count="Number(application.config.ui_ticket_overview_ticket_limit)"
         :hidden-columns="hiddenColumns"
         :hidden-columns="hiddenColumns"
       />
       />
     </CommonLoader>
     </CommonLoader>

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

@@ -87,7 +87,7 @@ returns
         .where(db_query_params.query_condition, *db_query_params.bind_condition)
         .where(db_query_params.query_condition, *db_query_params.bind_condition)
         .joins(db_query_params.tables)
         .joins(db_query_params.tables)
         .order(Arel.sql("#{db_query_params.order_by} #{db_query_params.direction}"))
         .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))
         .pluck(:id, :updated_at, Arel.sql(db_query_params.order_by))
 
 
       tickets = ticket_result.map do |ticket|
       tickets = ticket_result.map do |ticket|
@@ -128,7 +128,7 @@ returns
       .where(db_query_params.query_condition, *db_query_params.bind_condition)
       .where(db_query_params.query_condition, *db_query_params.bind_condition)
       .joins(db_query_params.tables)
       .joins(db_query_params.tables)
       .order(Arel.sql("#{db_query_params.order_by} #{db_query_params.direction}"))
       .order(Arel.sql("#{db_query_params.order_by} #{db_query_params.direction}"))
-      .limit(2000)
+      .limit(limit_per_overview)
   end
   end
 
 
   DB_QUERY_PARAMS = Struct.new(:query_condition, :bind_condition, :tables, :order_by, :direction)
   DB_QUERY_PARAMS = Struct.new(:query_condition, :bind_condition, :tables, :order_by, :direction)
@@ -166,4 +166,7 @@ returns
     result
     result
   end
   end
 
 
+  def self.limit_per_overview
+    Setting.get('ui_ticket_overview_ticket_limit')
+  end
 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
   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(
 Setting.create_if_not_exists(
   title:       __('Password Login'),
   title:       __('Password Login'),
   name:        'user_show_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."
 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 ""
 msgstr ""
 
 
+#: db/seeds/settings.rb
+msgid "Define the maximum number of ticket shown in overviews."
+msgstr ""
+
 #: db/seeds/settings.rb
 #: db/seeds/settings.rb
 msgid "Defines Elasticsearch index name."
 msgid "Defines Elasticsearch index name."
 msgstr ""
 msgstr ""
@@ -6183,6 +6187,10 @@ msgstr ""
 msgid "Maximum number of recursively executed triggers."
 msgid "Maximum number of recursively executed triggers."
 msgstr ""
 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/_ui_element/basedate.coffee
 #: app/assets/javascripts/app/controllers/report.coffee
 #: app/assets/javascripts/app/controllers/report.coffee
 #: app/assets/javascripts/app/controllers/time_accounting.coffee
 #: app/assets/javascripts/app/controllers/time_accounting.coffee