CharacterEditor.vue 1.9 KB

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