# Vuetify Generator ## Install with Docker If you use the API Platform distribution with docker, first you have to add the [Vue CLI](https://cli.vuejs.org/guide/) to the `yarn global add` command in `pwa/Dockerfile`: ```dockerfile RUN yarn global add @api-platform/client-generator @vue/cli @vue/cli-service-global ``` Rebuild your containers to install the Vue CLI in docker client container. Remove the directories `client\src\` and `client\public\` and the files `client\package.json\` and `client\yarn.lock\` (because the distribution comes with a prebuilt react app.) Create a new Vue App and install vuetify and other vue packages: ```console docker-compose exec client \ vue create -d . docker-compose exec client \ vue add vuetify docker-compose exec client \ yarn add router lodash moment vue-i18n vue-router vuelidate vuex vuex-map-fields ``` Update the entrypoint: ```javascript // client/src/config/entrypoint.js export const ENTRYPOINT = 'https://localhost:8443'; ``` Update the scripts part of the new `package.json`: ```json "scripts": { "build": "vue-cli-service build", "lint": "vue-cli-service lint", "start": "vue-cli-service serve --port 3000 --https" }, ``` Rebuild the docker containers again to install the Vue App and start the vue server. Generate the vuetify components with the client generator: ```console docker-compose exec client \ generate-api-platform-client -g vuetify --resource book ``` Omit the resource flag to generate files for all resource types exposed by the API. Continue by [generating the VueJS Web App](#generating-the-vuejs-web-app) ## Install without Docker Create a Vuetify application using [Vue CLI 3](https://cli.vuejs.org/guide/): ```console vue create -d vuetify-app cd vuetify-app vue add vuetify ``` Install the required dependencies: ```console yarn add router lodash moment vue-i18n vue-router vuelidate vuex vuex-map-fields yarn global add @api-platform/client-generator ``` In the app directory, generate the files for the resource you want: ```console npx @api-platform/client-generator -g vuetify https://demo.api-platform.com src/ ``` Replace the URL with the entrypoint of your Hydra-enabled API. Omit the resource flag to generate files for all resource types exposed by the API. ## Generating the VueJS Web App The code is ready to be executed! Register the generated routes: ```javascript // src/router/index.js import Vue from 'vue'; import VueRouter from 'vue-router'; import bookRoutes from './book'; import reviewRoutes from './review'; Vue.use(VueRouter); export default new VueRouter({ mode: 'history', routes: [bookRoutes, reviewRoutes] }); ``` Add the modules to the store: ```javascript // src/store/index.js import Vue from 'vue'; import Vuex from 'vuex'; import makeCrudModule from './modules/crud'; import notifications from './modules/notifications'; import bookService from '../services/book'; import reviewService from '../services/review'; Vue.use(Vuex); const store = new Vuex.Store({ modules: { notifications, book: makeCrudModule({ service: bookService }), review: makeCrudModule({ service: reviewService }) }, strict: process.env.NODE_ENV !== 'production' }); export default store; ``` Update the `src/plugins/vuetify.js` file with the following: ```javascript // src/plugins/vuetify.js import Vue from 'vue'; import Vuetify from 'vuetify/lib'; Vue.use(Vuetify); const opts = { icons: { iconfont: 'mdi' } }; export default new Vuetify(opts); ``` The generator comes with a i18n feature to allow quick translations of some labels in the generated code, to make it work, you need to create this file: ```javascript // src/i18n.js import Vue from 'vue'; import VueI18n from 'vue-i18n'; import messages from './locales/en'; Vue.use(VueI18n); export default new VueI18n({ locale: process.env.VUE_APP_I18N_LOCALE || 'en', fallbackLocale: process.env.VUE_APP_I18N_FALLBACK_LOCALE || 'en', messages: { en: messages } }); ``` Update your App.vue: ```vue ``` To finish, update your `main.js`: ```javascript // main.js import Vue from 'vue'; import Vuelidate from 'vuelidate'; import App from './App.vue'; import vuetify from './plugins/vuetify'; import store from './store'; import router from './router'; import i18n from './i18n'; Vue.config.productionTip = false; Vue.use(Vuelidate); new Vue({ i18n, router, store, vuetify, render: h => h(App) }).$mount('#app'); ``` Go to `https://localhost:8000/books/` to start using your app. That's all!