Browse Source

Feature - Desktop view: Implement ticket update possibilities.

Co-authored-by: Benjamin Scharf <bs@zammad.com>
Co-authored-by: Dominik Klein <dk@zammad.com>
Co-authored-by: Dusan Vuckovic <dv@zammad.com>
Co-authored-by: Florian Liebe <fl@zammad.com>
Co-authored-by: Mantas Masalskis <mm@zammad.com>
Co-authored-by: Martin Gruner <mg@zammad.com>
Florian Liebe 6 months ago
parent
commit
a83b75e308

+ 2 - 1
app/frontend/apps/desktop/components/CommonActionMenu/CommonActionMenu.vue

@@ -43,6 +43,7 @@ const props = withDefaults(defineProps<Props>(), {
   placement: 'arrowStart',
   placement: 'arrowStart',
   orientation: 'autoVertical',
   orientation: 'autoVertical',
   defaultButtonVariant: 'neutral',
   defaultButtonVariant: 'neutral',
+  defaultIcon: 'three-dots-vertical',
   noPaddedDefaultButton: true,
   noPaddedDefaultButton: true,
 })
 })
 
 
@@ -139,7 +140,7 @@ const variantClasses = computed(() => {
         ]"
         ]"
         :variant="defaultButtonVariant as ButtonVariant"
         :variant="defaultButtonVariant as ButtonVariant"
         :size="buttonSize"
         :size="buttonSize"
-        :icon="defaultIcon || 'three-dots-vertical'"
+        :icon="defaultIcon"
         @click="toggle"
         @click="toggle"
       />
       />
 
 

+ 1 - 1
app/frontend/apps/desktop/components/CommonButton/CommonButton.vue

@@ -139,7 +139,7 @@ const iconSizeClass = computed(() => {
 
 
 <template>
 <template>
   <button
   <button
-    class="-:inline-flex -:focus:outline-none -:focus:outline-0 -:focus:outline-offset-0 -:border-0 h-min min-h-min flex-shrink-0 flex-nowrap items-center justify-center gap-x-1 font-normal shadow-none transition duration-200 hover:outline hover:outline-1 hover:outline-offset-1 hover:outline-blue-600 focus:hover:outline focus:hover:outline-1 focus:hover:outline-offset-1 focus-visible:outline-1 focus-visible:outline-offset-1 focus-visible:outline-blue-800 focus:active:scale-[95%] dark:hover:outline-blue-900"
+    class="-:inline-flex -:focus:outline-none -:focus:outline-0 -:focus:outline-offset-0 -:border-0 h-min min-h-min flex-shrink-0 flex-nowrap items-center justify-center gap-x-1 font-normal shadow-none transition duration-200 hover:outline hover:outline-1 hover:outline-offset-1 hover:outline-blue-600 focus:hover:outline focus:hover:outline-1 focus:hover:outline-offset-1 focus-visible:outline-1 focus-visible:outline-offset-1 focus-visible:outline-blue-800 focus:active:scale-[95%] focus:active:!outline-blue-800 dark:hover:outline-blue-900"
     :class="[
     :class="[
       ...variantClasses,
       ...variantClasses,
       ...sizeClasses,
       ...sizeClasses,

+ 4 - 2
app/frontend/apps/desktop/components/CommonConfirmationDialog/CommonConfirmationDialog.vue

@@ -12,11 +12,13 @@ import type { ConfirmationVariantOptions } from './types.ts'
 
 
 const { confirmationOptions } = useConfirmation()
 const { confirmationOptions } = useConfirmation()
 
 
-const handleConfirmation = (isCancel: boolean) => {
+const handleConfirmation = (isCancel?: boolean) => {
   if (isCancel) {
   if (isCancel) {
     confirmationOptions.value?.cancelCallback()
     confirmationOptions.value?.cancelCallback()
-  } else {
+  } else if (isCancel === false) {
     confirmationOptions.value?.confirmCallback()
     confirmationOptions.value?.confirmCallback()
+  } else {
+    confirmationOptions.value?.closeCallback()
   }
   }
 
 
   confirmationOptions.value = undefined
   confirmationOptions.value = undefined

+ 4 - 0
app/frontend/apps/desktop/components/CommonConfirmationDialog/__tests__/CommonConfirmationDialog.spec.ts

@@ -33,6 +33,7 @@ describe('dialog confirm behaviour', () => {
       text: 'Test heading',
       text: 'Test heading',
       confirmCallback: confirmCallbackSpy,
       confirmCallback: confirmCallbackSpy,
       cancelCallback: vi.fn(),
       cancelCallback: vi.fn(),
+      closeCallback: vi.fn(),
     }
     }
 
 
     await waitForNextTick()
     await waitForNextTick()
@@ -53,6 +54,7 @@ describe('dialog confirm behaviour', () => {
       confirmationVariant: 'delete',
       confirmationVariant: 'delete',
       confirmCallback: confirmCallbackSpy,
       confirmCallback: confirmCallbackSpy,
       cancelCallback: vi.fn(),
       cancelCallback: vi.fn(),
+      closeCallback: vi.fn(),
     }
     }
 
 
     await waitForNextTick()
     await waitForNextTick()
@@ -81,6 +83,7 @@ describe('dialog confirm behaviour', () => {
       buttonVariant: 'danger',
       buttonVariant: 'danger',
       confirmCallback: confirmCallbackSpy,
       confirmCallback: confirmCallbackSpy,
       cancelCallback: vi.fn(),
       cancelCallback: vi.fn(),
+      closeCallback: vi.fn(),
     }
     }
 
 
     await waitForNextTick()
     await waitForNextTick()
@@ -103,6 +106,7 @@ describe('dialog confirm behaviour', () => {
       text: 'Test heading',
       text: 'Test heading',
       confirmCallback: confirmCallbackSpy,
       confirmCallback: confirmCallbackSpy,
       cancelCallback: cancelCallbackSpy,
       cancelCallback: cancelCallbackSpy,
+      closeCallback: vi.fn(),
     }
     }
 
 
     await waitForNextTick()
     await waitForNextTick()

+ 3 - 3
app/frontend/apps/desktop/components/CommonDialog/CommonDialog.vue

@@ -42,14 +42,14 @@ defineOptions({
 })
 })
 
 
 const emit = defineEmits<{
 const emit = defineEmits<{
-  close: [cancel: boolean]
+  close: [cancel?: boolean]
 }>()
 }>()
 
 
 const dialogElement = ref<HTMLElement>()
 const dialogElement = ref<HTMLElement>()
 const footerElement = ref<HTMLElement>()
 const footerElement = ref<HTMLElement>()
 const contentElement = ref<HTMLElement>()
 const contentElement = ref<HTMLElement>()
 
 
-const close = async (cancel = true) => {
+const close = async (cancel?: boolean) => {
   emit('close', cancel)
   emit('close', cancel)
   await closeDialog(props.name)
   await closeDialog(props.name)
 }
 }
@@ -127,7 +127,7 @@ onMounted(() => {
         <slot name="footer">
         <slot name="footer">
           <CommonDialogActionFooter
           <CommonDialogActionFooter
             v-bind="footerActionOptions"
             v-bind="footerActionOptions"
-            @cancel="close()"
+            @cancel="close(true)"
             @action="close(false)"
             @action="close(false)"
           />
           />
         </slot>
         </slot>

+ 1 - 1
app/frontend/apps/desktop/components/CommonDialog/__tests__/CommonDialog.spec.ts

@@ -77,7 +77,7 @@ describe('visuals for common dialog', () => {
     const emitted = view.emitted()
     const emitted = view.emitted()
 
 
     expect(emitted.close).toHaveLength(1)
     expect(emitted.close).toHaveLength(1)
-    expect(emitted.close[0]).toEqual([true])
+    expect(emitted.close[0]).toEqual([undefined])
 
 
     await view.events.click(view.getByLabelText('Close dialog'))
     await view.events.click(view.getByLabelText('Close dialog'))
     expect(emitted.close).toHaveLength(2)
     expect(emitted.close).toHaveLength(2)

+ 5 - 5
app/frontend/apps/desktop/components/CommonFlyout/CommonFlyout.vue

@@ -23,8 +23,8 @@ import { getFirstFocusableElement } from '#shared/utils/getFocusableElements.ts'
 
 
 import CommonButton from '#desktop/components/CommonButton/CommonButton.vue'
 import CommonButton from '#desktop/components/CommonButton/CommonButton.vue'
 import CommonOverlayContainer from '#desktop/components/CommonOverlayContainer/CommonOverlayContainer.vue'
 import CommonOverlayContainer from '#desktop/components/CommonOverlayContainer/CommonOverlayContainer.vue'
-import { useResizeLine } from '#desktop/components/ResizeLine/composables/useResizeLine.ts'
 import ResizeLine from '#desktop/components/ResizeLine/ResizeLine.vue'
 import ResizeLine from '#desktop/components/ResizeLine/ResizeLine.vue'
+import { useResizeLine } from '#desktop/components/ResizeLine/useResizeLine.ts'
 
 
 import CommonFlyoutActionFooter from './CommonFlyoutActionFooter.vue'
 import CommonFlyoutActionFooter from './CommonFlyoutActionFooter.vue'
 import { closeFlyout } from './useFlyout.ts'
 import { closeFlyout } from './useFlyout.ts'
@@ -153,12 +153,13 @@ const handleKeyStroke = (e: KeyboardEvent, adjustment: number) => {
   resizeCallback(newWidth)
   resizeCallback(newWidth)
 }
 }
 
 
-const { startResizing, isResizingHorizontal } = useResizeLine(
+const { startResizing, isResizing } = useResizeLine(
   resizeCallback,
   resizeCallback,
   resizeHandleComponent.value?.resizeLine,
   resizeHandleComponent.value?.resizeLine,
   handleKeyStroke,
   handleKeyStroke,
   {
   {
     calculateFromRight: true,
     calculateFromRight: true,
+    orientation: 'vertical',
   },
   },
 )
 )
 
 
@@ -239,7 +240,7 @@ onMounted(() => {
     :no-close-on-backdrop-click="noCloseOnBackdropClick"
     :no-close-on-backdrop-click="noCloseOnBackdropClick"
     :show-backdrop="showBackdrop"
     :show-backdrop="showBackdrop"
     :style="{ width: `${flyoutContainerWidth}px` }"
     :style="{ width: `${flyoutContainerWidth}px` }"
-    :class="{ 'transition-all': !isResizingHorizontal }"
+    :class="{ 'transition-all': !isResizing }"
     :aria-label="$t('Side panel')"
     :aria-label="$t('Side panel')"
     :aria-labelledby="`${flyoutId}-title`"
     :aria-labelledby="`${flyoutId}-title`"
     @click-background="close()"
     @click-background="close()"
@@ -306,8 +307,7 @@ onMounted(() => {
       v-if="resizable"
       v-if="resizable"
       ref="resizeHandleComponent"
       ref="resizeHandleComponent"
       :label="$t('Resize side panel')"
       :label="$t('Resize side panel')"
-      class="absolute top-[7px] h-[calc(100%-14px)] overflow-clip ltr:left-0 ltr:-translate-x-1/2 rtl:right-0 rtl:translate-x-1/2"
-      button-class="ltr:rounded-tl-sm rtl:rounded-tr-sm ltr:rounded-bl-sm rtl:rounded-br-sm"
+      class="absolute top-2 h-[calc(100%-16px)] overflow-clip ltr:left-px ltr:-translate-x-1/2 rtl:right-px rtl:translate-x-1/2"
       orientation="vertical"
       orientation="vertical"
       :values="{
       :values="{
         current: flyoutContainerWidth,
         current: flyoutContainerWidth,

+ 2 - 2
app/frontend/apps/desktop/components/CommonInputCopyToClipboard/CommonInputCopyToClipboard.vue

@@ -1,7 +1,7 @@
 <!-- Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/ -->
 <!-- Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/ -->
 
 
 <script setup lang="ts">
 <script setup lang="ts">
-import { useCopyToClipboard } from '#desktop/composables/useCopyToClipboard.ts'
+import { useCopyToClipboard } from '#shared/composables/useCopyToClipboard.ts'
 
 
 import CommonButton from '../CommonButton/CommonButton.vue'
 import CommonButton from '../CommonButton/CommonButton.vue'
 
 
@@ -30,7 +30,7 @@ const { copyToClipboard } = useCopyToClipboard()
     readonly
     readonly
   >
   >
     <template #link="context">
     <template #link="context">
-      <div class="mb-2 ms-2 flex h-full items-center">
+      <div class="mb-0.5 ms-2 flex h-full items-center">
         <CommonButton
         <CommonButton
           prefix-icon="files"
           prefix-icon="files"
           size="medium"
           size="medium"

+ 1 - 0
app/frontend/apps/desktop/components/CommonPopoverMenu/CommonPopoverMenu.vue

@@ -35,6 +35,7 @@ const showHeaderLabel = computed(() => {
 
 
 const onClickItem = (event: MouseEvent, item: MenuItem) => {
 const onClickItem = (event: MouseEvent, item: MenuItem) => {
   if (item.onClick) {
   if (item.onClick) {
+    event.preventDefault()
     item.onClick(props.entity)
     item.onClick(props.entity)
   }
   }
 
 

+ 1 - 0
app/frontend/apps/desktop/components/CommonSimpleTable/__tests__/CommonSimpleTable.spec.ts.snapshot.txt

@@ -76,6 +76,7 @@
           buttonsize="medium"
           buttonsize="medium"
           class="flex items-center justify-center"
           class="flex items-center justify-center"
           defaultbuttonvariant="neutral"
           defaultbuttonvariant="neutral"
+          defaulticon="three-dots-vertical"
           entity="[object Object]"
           entity="[object Object]"
           hidearrow="false"
           hidearrow="false"
           nopaddeddefaultbutton="true"
           nopaddeddefaultbutton="true"

Some files were not shown because too many files changed in this diff