CharacterEditor.vue 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <template>
  2. <div>
  3. <SpinnerModal
  4. v-if="isPending"
  5. :visible="true"
  6. />
  7. <EditorCard
  8. v-else
  9. name="character"
  10. :modelId="props.characterId"
  11. :action="props.action"
  12. :fields="characterFields"
  13. :initialValue="props.initialValue"
  14. :options="options"
  15. :isSaved="isSaved"
  16. :redirectBack="{ name: 'characters' }"
  17. :schema="schema"
  18. @create="create"
  19. @update="update"
  20. @delete="destroy"
  21. />
  22. </div>
  23. </template>
  24. <script setup>
  25. const props = defineProps({
  26. action: {
  27. type: String,
  28. default: "view",
  29. validator: (value) => _includes(["create", "update", "view"], value)
  30. },
  31. characterId: {
  32. type: String,
  33. required: false,
  34. validator: (value, props) => props.action === "create" || isPresent(value)
  35. },
  36. initialValue: {
  37. type: Object,
  38. default: {},
  39. required: false
  40. }
  41. })
  42. const toast = useToast()
  43. const { createCharacter } = useCreateCharacter()
  44. const { updateCharacter } = useUpdateCharacter()
  45. const { deleteCharacter } = useDeleteCharacter()
  46. const { data: options, isPending } = useQuery(characterOptionsQuery)
  47. const schema =
  48. props.action === "create" ? createCharacterSchema : updateCharacterSchema
  49. const isSaved = ref(false)
  50. async function create(character) {
  51. createCharacter(character)
  52. isSaved.value = true
  53. toast.add({
  54. severity: "success",
  55. summary: "Saved.",
  56. detail: "The character is saved.",
  57. life: 3000
  58. })
  59. await navigateTo({ name: "characters" })
  60. }
  61. async function update(editedFields) {
  62. updateCharacter(props.characterId, editedFields)
  63. isSaved.value = true
  64. toast.add({
  65. severity: "success",
  66. summary: "Updated.",
  67. detail: "The character is updated.",
  68. life: 3000
  69. })
  70. await navigateTo({ name: "characters" })
  71. }
  72. async function destroy() {
  73. deleteCharacter(props.characterId)
  74. isSaved.value = true
  75. toast.add({
  76. severity: "success",
  77. summary: "Deleted.",
  78. detail: "The character is deleted.",
  79. life: 3000
  80. })
  81. await navigateTo({ name: "characters" })
  82. }
  83. </script>
  84. <style scoped></style>