IKHSAN
ENID Baca dalam Bahasa Indonesia

opendesk

Public
Branch
main
Latest commit
08d9f3328 October 2026

TicketSubjectModal.vue

Open raw
<template>
  <Dialog v-model:open="showSubjectDialog" title="Rename Subject">
    <template #default>
      <div class="flex flex-col flex-1 gap-3">
        <Textarea
          ref="subjectInput"
          v-model="renameSubject"
          size="sm"
          variant="subtle"
          :disabled="false"
          @keydown.ctrl.enter.capture.stop="handleRename"
          @keydown.meta.enter.capture.stop="handleRename"
          maxlength="140"
        />
        <Button
          variant="solid"
          :loading="isLoading"
          :label="
            isMobileView
              ? __('Rename')
              : isMac
              ? __('Rename (⌘ + ⏎)')
              : __('Rename (Ctrl + ⏎)')
          "
          @click="handleRename"
          :disabled="!isDirty"
        />
      </div>
    </template>
  </Dialog>
</template>

<script setup lang="ts">
import { Textarea } from "frappe-ui";
import { useDevice } from "@/composables";
import { useScreenSize } from "@/composables/screen";
import { TicketSymbol } from "@/types";
import { computed, inject, nextTick, ref, watch } from "vue";

const ticket = inject(TicketSymbol)!;
const { isMac } = useDevice();
const { isMobileView } = useScreenSize();
const showSubjectDialog = defineModel<boolean>({ default: false });
const renameSubject = ref(ticket.value?.doc?.subject || "");
const isLoading = ref(false);
const subjectInput = ref<any>(null);
const isDirty = computed(() => {
  return renameSubject.value !== ticket?.value?.doc?.subject;
});

watch(
  () => showSubjectDialog.value,
  async (val) => {
    if (val) {
      renameSubject.value = ticket?.value?.doc?.subject || "";
      await nextTick();
      subjectInput.value?.focus();
    }
  }
);

function handleRename() {
  if (!isDirty.value) return;
  isLoading.value = true;
  ticket.value.setValue.submit(
    {
      subject: renameSubject.value,
    },
    {
      onSuccess() {
        isLoading.value = false;
        showSubjectDialog.value = false;
      },
    }
  );
}
</script>

<style scoped></style>
bytes
2,048
lines
80
Type
vue
Latest commit
28 October 2026