Просмотр исходного кода

Followup ca72359 - Feature: Desktop view - Right sidebars for organization...

Mantas Masalskis 8 месяцев назад
Родитель
Сommit
52dcb80880

+ 4 - 1
app/frontend/apps/desktop/pages/ticket/__tests__/ticket-create-shared-drafts.spec.ts

@@ -52,7 +52,10 @@ describe('ticket create view - shared drafts sidebar', async () => {
     it('supports creating shared drafts', async () => {
       const view = await visitView('/ticket/create')
 
-      await view.events.type(view.getByLabelText('Text'), 'foobar')
+      await view.events.type(
+        view.getByLabelText('Text'),
+        'foobar<div data-signature="true">Signature here</div>',
+      )
 
       const formUpdaterCalls = await waitForFormUpdaterQueryCalls()
       await vi.waitUntil(() => formUpdaterCalls.length === 2)

+ 17 - 0
app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue

@@ -8,6 +8,7 @@ import {
   NotificationTypes,
   useNotifications,
 } from '#shared/components/CommonNotifications/index.ts'
+import type { FormFieldValue } from '#shared/components/Form/types.ts'
 import { useTicketSharedDraftStart } from '#shared/entities/ticket-shared-draft-start/composables/useTicketSharedDraftStart.ts'
 import { useTicketSharedDraftStartCreateMutation } from '#shared/entities/ticket-shared-draft-start/graphql/mutations/ticketSharedDraftStartCreate.api.ts'
 import { useTicketSharedDraftStartUpdateMutation } from '#shared/entities/ticket-shared-draft-start/graphql/mutations/ticketSharedDraftStartUpdate.api.ts'
@@ -17,6 +18,7 @@ import {
   GraphQLErrorTypes,
   type GraphQLHandlerError,
 } from '#shared/types/error.ts'
+import { domFrom } from '#shared/utils/dom.ts'
 
 import CommonButton from '#desktop/components/CommonButton/CommonButton.vue'
 import { useFlyout } from '#desktop/components/CommonFlyout/useFlyout.ts'
@@ -73,11 +75,26 @@ const supportedFields = () =>
     ),
   )
 
+const prepareSharedDraftBody = (input: FormFieldValue) => {
+  if (!input || typeof input !== 'string') {
+    return input
+  }
+
+  const dom = domFrom(input)
+
+  dom
+    .querySelectorAll('div[data-signature="true"]')
+    .forEach((elem) => elem.remove())
+
+  return dom.innerHTML
+}
+
 const sharedDraftContent = () => ({
   ...supportedFields(),
   formSenderType: props.context.formValues.articleSenderType, // different key
   cc: ((props.context.formValues.cc as string[]) || []).join(', '),
   tags: ((props.context.formValues.tags as string[]) || []).join(', '),
+  body: prepareSharedDraftBody(props.context.formValues.body),
 })
 
 const createSharedDraft = () => {

+ 4 - 4
app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts

@@ -2,6 +2,7 @@
 
 import type { FileUploaded } from '#shared/components/Form/fields/FieldFile/types.ts'
 import { i18n } from '#shared/i18n.ts'
+import { domFrom } from '#shared/utils/dom.ts'
 
 import { useConfirmation } from '../useConfirmation.ts'
 
@@ -17,15 +18,14 @@ const referenceMatchwords = [
 ]
 
 const removeQuotingFromBody = (body: string) => {
-  const parser = new DOMParser()
-  const document = parser.parseFromString(body, 'text/html')
+  const dom = domFrom(body)
 
   // Remove blockquotes and images
   // To not detect matchwords which are not part of the user-written article
-  document.querySelectorAll('blockquote, img').forEach((elem) => elem.remove())
+  dom.querySelectorAll('blockquote, img').forEach((elem) => elem.remove())
 
   // Return the modified HTML content as a string.
-  return document.body.innerHTML
+  return dom.innerHTML
 }
 
 const bodyAttachmentReferenceMatchwordExists = (body: string) => {

+ 25 - 0
app/frontend/shared/utils/__tests__/dom.spec.ts

@@ -0,0 +1,25 @@
+// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
+
+import { domFrom } from '../dom.ts'
+
+describe('domFrom', () => {
+  const input = '<div>test</div>'
+
+  it('parses dom and returns exact string representation', () => {
+    const dom = domFrom(input)
+
+    expect(dom.innerHTML).toBe(input)
+  })
+
+  it('parses dom and returns matching structure', () => {
+    const dom = domFrom(input)
+
+    expect(dom).toBeInstanceOf(HTMLElement)
+    expect(dom.childNodes.length).toBe(1)
+
+    const firstNode = dom.childNodes[0]
+
+    expect(firstNode.textContent).toBe('test')
+    expect(firstNode.childNodes[0]).toBeInstanceOf(Text)
+  })
+})

+ 7 - 0
app/frontend/shared/utils/dom.ts

@@ -0,0 +1,7 @@
+// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
+
+export const domFrom = (html: string, document_ = document) => {
+  const dom = document_.createElement('div')
+  dom.innerHTML = html
+  return dom
+}

+ 17 - 17
i18n/zammad.pot

@@ -1668,7 +1668,7 @@ msgid "Attach files"
 msgstr ""
 
 #: app/assets/javascripts/app/lib/app_post/utils.coffee:1052
-#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:11
+#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:12
 msgid "Attached"
 msgstr ""
 
@@ -1681,7 +1681,7 @@ msgstr ""
 #: app/frontend/apps/desktop/pages/ticket/views/TicketCreate.vue:181
 #: app/frontend/apps/mobile/pages/ticket/composable/useTicketEditForm.ts:206
 #: app/frontend/apps/mobile/pages/ticket/views/TicketCreate.vue:316
-#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:9
+#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:10
 msgid "Attachment"
 msgstr ""
 
@@ -3258,7 +3258,7 @@ msgstr ""
 msgid "Create Macros"
 msgstr ""
 
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:168
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:185
 msgid "Create Shared Draft"
 msgstr ""
 
@@ -3284,7 +3284,7 @@ msgid "Create a new template in the admin interface."
 msgstr ""
 
 #: app/assets/javascripts/app/views/widget/shared_draft.jst.eco:4
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:163
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:180
 msgid "Create a shared draft"
 msgstr ""
 
@@ -5401,12 +5401,12 @@ msgid "Enables users to create their own account via web interface. This setting
 msgstr ""
 
 #: app/assets/javascripts/app/lib/app_post/utils.coffee:1052
-#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:13
+#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:14
 msgid "Enclosed"
 msgstr ""
 
 #: app/assets/javascripts/app/lib/app_post/utils.coffee:1052
-#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:15
+#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:16
 msgid "Enclosure"
 msgstr ""
 
@@ -8892,7 +8892,7 @@ msgstr ""
 #: app/frontend/apps/desktop/pages/personal-setting/views/PersonalSettingDevices.vue:103
 #: app/frontend/apps/desktop/pages/personal-setting/views/PersonalSettingTokenAccess.vue:90
 #: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftFlyout.vue:142
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:164
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:181
 #: db/seeds/object_manager_attributes.rb:1507
 #: public/assets/form/form.js:24
 msgid "Name"
@@ -9371,7 +9371,7 @@ msgstr ""
 msgid "No settings with area 'Dashboard::Stats' defined"
 msgstr ""
 
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:219
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:236
 msgid "No shared drafts yet"
 msgstr ""
 
@@ -10629,7 +10629,7 @@ msgid "Preview %s"
 msgstr ""
 
 #: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftFlyout.vue:131
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:188
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:205
 msgid "Preview Shared Draft"
 msgstr ""
 
@@ -12228,7 +12228,7 @@ msgstr ""
 
 #: app/assets/javascripts/app/controllers/agent_ticket_create/sidebar_shared_draft.coffee:12
 #: app/assets/javascripts/app/models/group.coffee:17
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:158
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:175
 #: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/plugins/shared-draft-start.ts:13
 #: db/seeds/object_manager_attributes.rb:2093
 msgid "Shared Drafts"
@@ -12239,7 +12239,7 @@ msgstr ""
 msgid "Shared draft cannot be selected for this ticket."
 msgstr ""
 
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:114
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:131
 msgid "Shared draft has been created successfully."
 msgstr ""
 
@@ -12247,7 +12247,7 @@ msgstr ""
 msgid "Shared draft has been deleted."
 msgstr ""
 
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:139
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:156
 msgid "Shared draft has been updated successfully."
 msgstr ""
 
@@ -15725,7 +15725,7 @@ msgstr ""
 msgid "Update In Min"
 msgstr ""
 
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:206
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarSharedDraftStartContent.vue:223
 msgid "Update Shared Draft"
 msgstr ""
 
@@ -17059,12 +17059,12 @@ msgid "at least one letter is required"
 msgstr ""
 
 #: app/assets/javascripts/app/lib/app_post/utils.coffee:1052
-#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:12
+#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:13
 msgid "attached"
 msgstr ""
 
 #: app/assets/javascripts/app/lib/app_post/utils.coffee:1052
-#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:10
+#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:11
 msgid "attachment"
 msgstr ""
 
@@ -17375,12 +17375,12 @@ msgid "email sent to '%s'"
 msgstr ""
 
 #: app/assets/javascripts/app/lib/app_post/utils.coffee:1052
-#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:14
+#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:15
 msgid "enclosed"
 msgstr ""
 
 #: app/assets/javascripts/app/lib/app_post/utils.coffee:1052
-#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:16
+#: app/frontend/shared/composables/form/useCheckBodyAttachmentReference.ts:17
 msgid "enclosure"
 msgstr ""