You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
3.3 KiB

  1. <template lang='pug'>
  2. v-dialog(v-model='isShown', max-width='550', persistent)
  3. v-card.wiki-form
  4. .dialog-header.is-short.is-red
  5. v-icon.mr-2(color='white') highlight_off
  6. span {{$t('common:page.delete')}}
  7. v-card-text
  8. i18next.body-2(path='common:page.deleteTitle', tag='div')
  9. span.red--text.text--darken-2(place='title') {{pageTitle}}
  10. .caption {{$t('common:page.deleteSubtitle')}}
  11. v-chip.mt-3.ml-0.mr-1(label, color='red lighten-4', disabled, small)
  12. .caption.red--text.text--darken-2 {{pageLocale.toUpperCase()}}
  13. v-chip.mt-3.mx-0(label, color='red lighten-5', disabled, small)
  14. span.red--text.text--darken-2 /{{pagePath}}
  15. v-card-chin
  16. v-spacer
  17. v-btn(flat, @click='discard', :disabled='loading') {{$t('common:actions.cancel')}}
  18. v-btn(color='red darken-2', @click='deletePage', :loading='loading').white--text {{$t('common:actions.delete')}}
  19. </template>
  20. <script>
  21. import _ from 'lodash'
  22. import { get } from 'vuex-pathify'
  23. import deletePageMutation from 'gql/common/common-pages-mutation-delete.gql'
  24. export default {
  25. props: {
  26. value: {
  27. type: Boolean,
  28. default: false
  29. }
  30. },
  31. data() {
  32. return {
  33. loading: false
  34. }
  35. },
  36. computed: {
  37. isShown: {
  38. get() { return this.value },
  39. set(val) { this.$emit('input', val) }
  40. },
  41. pageTitle: get('page/title'),
  42. pagePath: get('page/path'),
  43. pageLocale: get('page/locale'),
  44. pageId: get('page/id')
  45. },
  46. watch: {
  47. isShown(newValue, oldValue) {
  48. if (newValue) {
  49. document.body.classList.add('page-deleted-pending')
  50. }
  51. }
  52. },
  53. methods: {
  54. discard() {
  55. document.body.classList.remove('page-deleted-pending')
  56. this.isShown = false
  57. },
  58. async deletePage() {
  59. this.loading = true
  60. this.$store.commit(`loadingStart`, 'page-delete')
  61. this.$nextTick(async () => {
  62. try {
  63. const resp = await this.$apollo.mutate({
  64. mutation: deletePageMutation,
  65. variables: {
  66. id: this.pageId
  67. }
  68. })
  69. if (_.get(resp, 'data.pages.delete.responseResult.succeeded', false)) {
  70. this.isShown = false
  71. _.delay(() => {
  72. document.body.classList.add('page-deleted')
  73. _.delay(() => {
  74. window.location.assign('/')
  75. }, 1200)
  76. }, 400)
  77. } else {
  78. throw new Error(_.get(resp, 'data.pages.delete.responseResult.message', this.$t('common:error.unexpected')))
  79. }
  80. } catch (err) {
  81. this.$store.commit('pushGraphError', err)
  82. }
  83. this.$store.commit(`loadingStop`, 'page-delete')
  84. this.loading = false
  85. })
  86. }
  87. }
  88. }
  89. </script>
  90. <style lang='scss'>
  91. body.page-deleted-pending {
  92. perspective: 50vw;
  93. height: 100vh;
  94. overflow: hidden;
  95. .application {
  96. background-color: mc('grey', '900');
  97. }
  98. .application--wrap {
  99. transform-style: preserve-3d;
  100. transform: translateZ(-5vw) rotateX(2deg);
  101. border-radius: 7px;
  102. overflow: hidden;
  103. }
  104. }
  105. body.page-deleted {
  106. perspective: 50vw;
  107. .application--wrap {
  108. transform-style: preserve-3d;
  109. transform: translateZ(-1000vw) rotateX(60deg);
  110. opacity: 0;
  111. }
  112. }
  113. </style>