new.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <!-- Page de création d'un nouveau sous-domaine -->
  2. <template>
  3. <main>
  4. <v-skeleton-loader
  5. v-if="loading"
  6. type="text"
  7. />
  8. <div v-else>
  9. <LayoutContainer>
  10. <v-card class="mb-5 mt-4">
  11. <FormToolbar title="subdomain" icon="fa-at"/>
  12. <UiForm
  13. :id="item.id"
  14. ref="form"
  15. :model="model"
  16. :query="query()"
  17. :submitActions="submitActions"
  18. >
  19. <template #form.input="{entry, updateRepository}">
  20. <v-container fluid class="container">
  21. <v-row>
  22. <v-col cols="12" sm="6">
  23. <div>{{ $t('pleaseEnterYourNewSubdomain')}} :</div>
  24. </v-col>
  25. </v-row>
  26. <v-row>
  27. <v-col cols="12" sm="6">
  28. <UiInputText
  29. field="subdomain"
  30. label="subdomain"
  31. :data="entry['subdomain']"
  32. type="string"
  33. :rules="rules()"
  34. @change="checkSubdomainHook($event, updateRepository)"
  35. />
  36. </v-col>
  37. </v-row>
  38. <i v-if="validationPending" class="validation_status">{{ $t('validation_ongoing') }}</i>
  39. <i v-else-if="subdomainAvailable === true" class="validation_status valid">{{ $t('this_subdomain_is_available') }}</i>
  40. </v-container>
  41. </template>
  42. <template #form.button>
  43. <NuxtLink :to="{ path: '/parameters/communication'}" class="no-decoration">
  44. <v-btn class="mr-4 ot_light_grey ot_grey--text">
  45. {{ $t('back') }}
  46. </v-btn>
  47. </NuxtLink>
  48. </template>
  49. </UiForm>
  50. </v-card>
  51. </LayoutContainer>
  52. </div>
  53. </main>
  54. </template>
  55. <script lang="ts">
  56. import {computed, defineComponent, ref, Ref, useContext} from '@nuxtjs/composition-api'
  57. import {useDataUtils} from "~/composables/data/useDataUtils";
  58. import {Subdomain} from "~/models/Organization/Subdomain";
  59. import {Repository as VuexRepository} from "@vuex-orm/core/dist/src/repository/Repository";
  60. import {Model, Query} from "@vuex-orm/core";
  61. import {repositoryHelper} from "~/services/store/repository";
  62. import {useValidator} from "~/composables/form/useValidator";
  63. import {AnyJson} from "~/types/interfaces";
  64. import {SUBMIT_TYPE} from "~/types/enums";
  65. export default defineComponent({
  66. name: 'NewFormParametersSubdomain',
  67. setup () {
  68. const subdomainAvailable: Ref<boolean | null> = ref(null)
  69. const form: Ref<HTMLCanvasElement | null> = ref(null);
  70. const validationPending: Ref<boolean> = ref(false)
  71. const {$dataProvider, store, app:{i18n}} = useContext()
  72. const repository: VuexRepository<Model> = repositoryHelper.getRepository(Subdomain)
  73. const query: Query = repository.query()
  74. const { checkSubdomainAvailability } = useValidator($dataProvider, i18n).useHandleSubdomain()
  75. const {createItem} = useDataUtils($dataProvider)
  76. const {create, loading, item} = createItem(store, Subdomain)
  77. const submitActions = computed(() => {
  78. let actions:AnyJson = {}
  79. actions[SUBMIT_TYPE.SAVE_AND_BACK] = { path: `/parameters/communication` }
  80. return actions
  81. })
  82. const checkSubdomainHook = async (subdomain: string | null, updateRepository: any) => {
  83. subdomainAvailable.value = null
  84. if (subdomain !== null && subdomain.match(/^[\w\-]{2,60}$/) !== null) {
  85. validationPending.value = true
  86. subdomainAvailable.value = await checkSubdomainAvailability(subdomain);
  87. validationPending.value = false
  88. }
  89. updateRepository(subdomain, 'subdomain');
  90. (form.value as any).validate()
  91. }
  92. if(process.client){
  93. const itemToCreate: Subdomain = new Subdomain()
  94. create(itemToCreate)
  95. }
  96. /** todo Computed properties needs to be returned as functions until nuxt3 : https://github.com/nuxt-community/composition-api/issues/207 **/
  97. return {
  98. loading,
  99. item,
  100. model: Subdomain,
  101. query: () => query,
  102. submitActions,
  103. form,
  104. checkSubdomainHook,
  105. validationPending,
  106. subdomainAvailable,
  107. rules: () => [
  108. (subdomain: string | null) => (subdomain !== null) || i18n.t('please_enter_a_value_for_the_subdomain'),
  109. (subdomain: string | null) => (subdomain !== null && subdomain.length >= 2 && subdomain.length <=60) || i18n.t('subdomain_need_to_have_0_to_60_cars'),
  110. (subdomain: string | null) => (subdomain !== null && subdomain.match(/^[\w\-]+$/) !== null) || i18n.t('subdomain_can_not_contain_spaces_or_special_cars'),
  111. () => (subdomainAvailable.value !== false) || i18n.t('this_subdomain_is_already_in_use')
  112. ]
  113. }
  114. },
  115. beforeDestroy() {
  116. repositoryHelper.cleanRepository(Subdomain)
  117. }
  118. })
  119. </script>
  120. <style scoped>
  121. .validation_status {
  122. font-size: 13px;
  123. }
  124. .validation_status.valid {
  125. color: green;
  126. }
  127. </style>