1
0

Rename.vue 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <script setup lang="ts">
  2. import config from '@/api/config'
  3. import NodeSelector from '@/components/NodeSelector/NodeSelector.vue'
  4. import use2FAModal from '@/components/TwoFA/use2FAModal'
  5. import { message } from 'ant-design-vue'
  6. const emit = defineEmits(['renamed'])
  7. const visible = ref(false)
  8. const isDirFlag = ref(false)
  9. const data = ref({
  10. basePath: '',
  11. orig_name: '',
  12. new_name: '',
  13. sync_node_ids: [] as number[],
  14. })
  15. // eslint-disable-next-line vue/require-typed-ref
  16. const refForm = ref()
  17. function open(basePath: string, origName: string, isDir: boolean) {
  18. visible.value = true
  19. data.value.orig_name = origName
  20. data.value.new_name = origName
  21. data.value.basePath = basePath
  22. isDirFlag.value = isDir
  23. }
  24. defineExpose({
  25. open,
  26. })
  27. function ok() {
  28. refForm.value.validate().then(() => {
  29. const { basePath, orig_name, new_name, sync_node_ids } = data.value
  30. const otpModal = use2FAModal()
  31. otpModal.open().then(() => {
  32. // Note: API will handle URL encoding of path segments
  33. config.rename(basePath, orig_name, new_name, sync_node_ids).then(r => {
  34. visible.value = false
  35. message.success($gettext('Rename successfully'))
  36. emit('renamed')
  37. })
  38. })
  39. })
  40. }
  41. </script>
  42. <template>
  43. <AModal
  44. v-model:open="visible"
  45. :mask="false"
  46. :title="$gettext('Rename')"
  47. @ok="ok"
  48. >
  49. <AForm
  50. ref="refForm"
  51. layout="vertical"
  52. :model="data"
  53. :rules="{
  54. new_name: [
  55. { required: true, message: $gettext('Please input a filename') },
  56. { pattern: /^[^\\/]+$/, message: $gettext('Invalid filename') },
  57. ],
  58. }"
  59. >
  60. <AFormItem :label="$gettext('Original name')">
  61. <p>{{ data.orig_name }}</p>
  62. </AFormItem>
  63. <AFormItem
  64. :label="$gettext('New name')"
  65. name="new_name"
  66. >
  67. <AInput v-model:value="data.new_name" />
  68. </AFormItem>
  69. <AFormItem
  70. v-if="isDirFlag"
  71. :label="$gettext('Sync')"
  72. >
  73. <NodeSelector
  74. v-model:target="data.sync_node_ids"
  75. hidden-local
  76. />
  77. </AFormItem>
  78. </AForm>
  79. </AModal>
  80. </template>
  81. <style scoped lang="less">
  82. </style>