mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 19:17:48 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			188 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			188 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="top-box">
 | |
|     <div class="mode-wrap button-group">
 | |
|       <woot-button
 | |
|         variant="clear"
 | |
|         class="button--reply"
 | |
|         :class="replyButtonClass"
 | |
|         @click="handleReplyClick"
 | |
|       >
 | |
|         {{ $t('CONVERSATION.REPLYBOX.REPLY') }}
 | |
|       </woot-button>
 | |
| 
 | |
|       <woot-button
 | |
|         class="button--note"
 | |
|         variant="clear"
 | |
|         color-scheme="warning"
 | |
|         :class="noteButtonClass"
 | |
|         @click="handleNoteClick"
 | |
|       >
 | |
|         {{ $t('CONVERSATION.REPLYBOX.PRIVATE_NOTE') }}
 | |
|       </woot-button>
 | |
|     </div>
 | |
|     <div class="action-wrap">
 | |
|       <div v-if="isMessageLengthReachingThreshold" class="tabs-title">
 | |
|         <span :class="charLengthClass">
 | |
|           {{ characterLengthWarning }}
 | |
|         </span>
 | |
|       </div>
 | |
|     </div>
 | |
|     <woot-button
 | |
|       v-if="popoutReplyBox"
 | |
|       variant="clear"
 | |
|       icon="dismiss"
 | |
|       color-scheme="secondary"
 | |
|       class-names="popout-button"
 | |
|       @click="$emit('click')"
 | |
|     />
 | |
|     <woot-button
 | |
|       v-else
 | |
|       variant="clear"
 | |
|       icon="resize-large"
 | |
|       color-scheme="secondary"
 | |
|       class-names="popout-button"
 | |
|       @click="$emit('click')"
 | |
|     />
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| import { REPLY_EDITOR_MODES, CHAR_LENGTH_WARNING } from './constants';
 | |
| import {
 | |
|   hasPressedAltAndPKey,
 | |
|   hasPressedAltAndLKey,
 | |
| } from 'shared/helpers/KeyboardHelpers';
 | |
| import eventListenerMixins from 'shared/mixins/eventListenerMixins';
 | |
| export default {
 | |
|   name: 'ReplyTopPanel',
 | |
|   mixins: [eventListenerMixins],
 | |
|   props: {
 | |
|     mode: {
 | |
|       type: String,
 | |
|       default: REPLY_EDITOR_MODES.REPLY,
 | |
|     },
 | |
|     setReplyMode: {
 | |
|       type: Function,
 | |
|       default: () => {},
 | |
|     },
 | |
|     isMessageLengthReachingThreshold: {
 | |
|       type: Boolean,
 | |
|       default: () => false,
 | |
|     },
 | |
|     charactersRemaining: {
 | |
|       type: Number,
 | |
|       default: () => 0,
 | |
|     },
 | |
|     popoutReplyBox: {
 | |
|       type: Boolean,
 | |
|       default: false,
 | |
|     },
 | |
|   },
 | |
|   computed: {
 | |
|     replyButtonClass() {
 | |
|       return {
 | |
|         'is-active': this.mode === REPLY_EDITOR_MODES.REPLY,
 | |
|       };
 | |
|     },
 | |
|     noteButtonClass() {
 | |
|       return {
 | |
|         'is-active': this.mode === REPLY_EDITOR_MODES.NOTE,
 | |
|       };
 | |
|     },
 | |
|     charLengthClass() {
 | |
|       return this.charactersRemaining < 0 ? 'message-error' : 'message-length';
 | |
|     },
 | |
|     characterLengthWarning() {
 | |
|       return this.charactersRemaining < 0
 | |
|         ? `${-this.charactersRemaining} ${CHAR_LENGTH_WARNING.NEGATIVE}`
 | |
|         : `${this.charactersRemaining} ${CHAR_LENGTH_WARNING.UNDER_50}`;
 | |
|     },
 | |
|   },
 | |
|   methods: {
 | |
|     handleKeyEvents(e) {
 | |
|       if (hasPressedAltAndPKey(e)) {
 | |
|         this.handleNoteClick();
 | |
|       }
 | |
|       if (hasPressedAltAndLKey(e)) {
 | |
|         this.handleReplyClick();
 | |
|       }
 | |
|     },
 | |
|     handleReplyClick() {
 | |
|       this.setReplyMode(REPLY_EDITOR_MODES.REPLY);
 | |
|     },
 | |
|     handleNoteClick() {
 | |
|       this.setReplyMode(REPLY_EDITOR_MODES.NOTE);
 | |
|     },
 | |
|   },
 | |
| };
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
| .top-box {
 | |
|   display: flex;
 | |
|   justify-content: space-between;
 | |
|   @apply bg-black-50 dark:bg-slate-800;
 | |
| }
 | |
| 
 | |
| .button-group {
 | |
|   border: 0;
 | |
|   padding: 0;
 | |
|   margin: 0;
 | |
| 
 | |
|   .button {
 | |
|     font-size: var(--font-size-small);
 | |
|     font-weight: var(--font-weight-medium);
 | |
|     padding: var(--space-one) var(--space-normal);
 | |
|     margin: 0;
 | |
|     position: relative;
 | |
|     z-index: 1;
 | |
| 
 | |
|     &.is-active {
 | |
|       background: white;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .button--reply {
 | |
|     border-radius: 0;
 | |
|     @apply border-r border-b-0 border-l-0 border-slate-50 dark:border-slate-700;
 | |
| 
 | |
|     &:hover,
 | |
|     &:focus {
 | |
|       @apply border-r border-slate-50 dark:border-slate-700;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .button--note {
 | |
|     border-radius: 0;
 | |
| 
 | |
|     &.is-active {
 | |
|       @apply border-r border-b-0 border-slate-50 dark:border-slate-700;
 | |
|       background: var(--y-50);
 | |
|     }
 | |
| 
 | |
|     &:hover,
 | |
|     &:active {
 | |
|       color: var(--y-700);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| .button--note {
 | |
|   color: var(--y-600);
 | |
| }
 | |
| 
 | |
| .action-wrap {
 | |
|   display: flex;
 | |
|   align-items: center;
 | |
|   margin: 0 var(--space-normal);
 | |
|   font-size: var(--font-size-mini);
 | |
| 
 | |
|   .message-error {
 | |
|     color: var(--r-600);
 | |
|   }
 | |
|   .message-length {
 | |
|     color: var(--s-600);
 | |
|   }
 | |
| }
 | |
| </style>
 | 
