setup.vue 12.3 KB
Newer Older
1
<template lang="pug">
2 3 4 5 6 7
  v-app.setup
    v-toolbar(color='blue darken-2', dark, app, clipped-left, fixed, flat)
      v-spacer
      v-toolbar-title
        span.subheading Wiki.js Setup
      v-spacer
8
    v-content.white
9 10 11 12 13 14 15 16 17 18 19
      v-progress-linear.ma-0(indeterminate, height='4', :active='loading')
      v-stepper.elevation-0(v-model='state')
        v-stepper-header
          v-stepper-step(step='1' :complete='state > 1')
            | Welcome
            small Wiki.js Installation Wizard
          v-divider
          v-stepper-step(step='2' :complete='state > 2')
            | Administration Account
            small Create the admin account
          v-divider(v-if='this.conf.upgrade')
20
          v-stepper-step(step='3' :complete='state > 3', v-if='this.conf.upgrade')
21 22 23
            | Upgrade from Wiki.js 1.x
            small Migrate your existing installation
          v-divider
24
          v-stepper-step(:step='this.conf.upgrade ? 4 : 3' :complete='this.conf.upgrade ? state > 3 : state > 4')
25 26
            | Final Steps
            small Finalizing your installation
27

28 29 30 31
        v-stepper-items
          //- ==============================================
          //- WELCOME
          //- ==============================================
32

33 34
          v-stepper-content(step='1')
            v-card.text-xs-center.pa-3(flat)
35
              img(src='/svg/logo-wikijs.svg', alt='Wiki.js Logo', style='width: 300px;')
36
            .text-xs-center
37
              .body-2.py-2 This installation wizard will guide you through the steps needed to get your wiki up and running in no time!
38 39 40 41 42 43 44 45 46 47 48
              .body-1 Detailed information about installation and usage can be found on the #[a(href='https://wiki.requarks.io/docs') official documentation site].
              .body-1 Should you have any question or would like to report something that doesn't look right, feel free to create a new issue on the #[a(href='https://github.com/Requarks/wiki/issues') GitHub project].
              .body-1.py-3
                v-icon.mr-2(color='indigo') open_in_browser
                span.indigo--text You are about to install Wiki.js #[strong {{wikiVersion}}].
              v-btn.mt-4(color='primary', @click='proceedToAdmin', :disabled='loading', large)
                span Start
                v-icon(right) arrow_forward
              v-divider.my-5
              .body-2 Additional Setup Options
              div(style='display:inline-block;')
49 50 51 52 53 54 55 56 57 58 59
                v-checkbox(
                  color='primary',
                  v-model='conf.telemetry',
                  label='Allow Telemetry',
                  persistent-hint,
                  hint='Help Wiki.js developers improve this app with anonymized telemetry.'
                )
                v-checkbox.mt-3(
                  color='primary',
                  v-model='conf.upgrade',
                  label='Upgrade from Wiki.js 1.x',
60
                  disabled
61 62 63
                  persistent-hint,
                  hint='Check this box if you are upgrading from Wiki.js 1.x and wish to migrate your existing data.'
                )
64

65 66 67
          //- ==============================================
          //- ADMINISTRATOR ACCOUNT
          //- ==============================================
68

69
          v-stepper-content(step='2')
70 71 72 73 74 75 76 77 78
            v-card.text-xs-center(flat)
              svg.icons.is-64: use(xlink:href='#nc-man-black')
              .subheading Administrator Account
              .body-2 A root administrator account will be created for local authentication. From this account, you can create or authorize more users.
            v-form
              v-container
                v-layout(row, wrap)
                  v-flex(xs12)
                    v-text-field(
79 80
                      outline
                      background-color='grey lighten-2'
81 82 83
                      v-model='conf.adminEmail',
                      label='Administrator Email',
                      hint='The email address of the administrator account',
84
                      persistent-hint
85 86 87 88 89
                      v-validate='{ required: true, email: true }',
                      data-vv-name='adminEmail',
                      data-vv-as='Administrator Email',
                      data-vv-scope='admin',
                      :error-messages='errors.collect(`adminEmail`)'
90
                      ref='adminEmailInput'
91 92 93
                    )
                  v-flex.pr-3(xs6)
                    v-text-field(
94 95
                      outline
                      background-color='grey lighten-2'
96
                      ref='adminPassword',
97
                      counter='255'
98 99
                      v-model='conf.adminPassword',
                      label='Password',
100
                      :append-icon="pwdMode ? 'visibility' : 'visibility_off'"
101
                      @click:append="() => (pwdMode = !pwdMode)"
102
                      :type="pwdMode ? 'password' : 'text'"
103
                      hint='At least 8 characters long.',
104
                      persistent-hint
105 106 107 108 109 110 111 112
                      v-validate='{ required: true, min: 8 }',
                      data-vv-name='adminPassword',
                      data-vv-as='Password',
                      data-vv-scope='admin',
                      :error-messages='errors.collect(`adminPassword`)'
                    )
                  v-flex(xs6)
                    v-text-field(
113 114
                      outline
                      background-color='grey lighten-2'
115
                      ref='adminPasswordConfirm',
116
                      counter='255'
117 118
                      v-model='conf.adminPasswordConfirm',
                      label='Confirm Password',
119
                      :append-icon="pwdConfirmMode ? 'visibility' : 'visibility_off'"
120
                      @click:append="() => (pwdConfirmMode = !pwdConfirmMode)"
121
                      :type="pwdConfirmMode ? 'password' : 'text'"
122
                      hint='Verify your password again.',
123
                      persistent-hint
124
                      v-validate='{ required: true, min: 8 }',
125 126 127 128
                      data-vv-name='adminPasswordConfirm',
                      data-vv-as='Confirm Password',
                      data-vv-scope='admin',
                      :error-messages='errors.collect(`adminPasswordConfirm`)'
129
                      @keyup.enter='proceedToUpgrade'
130
                    )
131
              .pt-3.text-xs-center
132
                v-btn(@click='proceedToWelcome', :disabled='loading') Back
133
                v-btn(color='primary', @click='proceedToUpgrade', :disabled='loading') Continue
134

135 136 137
          //- ==============================================
          //- UPGRADE FROM 1.x
          //- ==============================================
138

139
          v-stepper-content(step='3', v-if='conf.upgrade')
140 141 142 143 144 145 146 147 148
            v-card.text-xs-center(flat)
              svg.icons.is-64: use(xlink:href='#nc-spaceship')
              .subheading Upgrade from Wiki.js 1.x
              .body-2 Migrating from a Wiki.js 1.x installation is quick and simple.
            v-form
              v-container
                v-layout(row)
                  v-flex(xs12)
                    v-text-field(
149 150
                      outline
                      background-color='grey lighten-2'
151 152 153 154 155 156 157 158 159 160 161
                      v-model='conf.upgMongo',
                      placeholder='mongodb://',
                      label='Connection String to Wiki.js 1.x MongoDB database',
                      persistent-hint,
                      hint='A MongoDB database connection string where a Wiki.js 1.x installation is located. No alterations will be made to this database.',
                      v-validate='{ required: true, min: 2 }',
                      data-vv-name='upgMongo',
                      data-vv-as='MongoDB Connection String',
                      data-vv-scope='upgrade',
                      :error-messages='errors.collect(`upgMongo`)'
                    )
162
            .pt-3.text-xs-center
163 164
              v-btn(@click='proceedToAdmin', :disabled='loading') Back
              v-btn(color='primary', @click='proceedToFinal', :disabled='loading') Continue
165

166 167 168
          //- ==============================================
          //- FINAL
          //- ==============================================
169

170
          v-stepper-content(:step='conf.upgrade ? 4 : 3')
171 172
            v-card.text-xs-center(flat)
              template(v-if='loading')
173 174 175 176 177 178 179
                .mt-3(style='width: 64px; display:inline-block;')
                  atom-spinner(
                    :animation-duration='800'
                    :size='64'
                    color='#1976d2'
                    )
                .subheading.primary--text.mt-3 Finalizing your installation...
180
              template(v-else-if='final.ok')
181
                svg.icons.is-64: use(xlink:href='#nc-check-bold')
182
                .subheading.green--text Installation complete!
183 184
              template(v-else)
                svg.icons.is-64: use(xlink:href='#nc-square-remove')
185
                .subheading.red--text Something went wrong...
186 187 188 189
            v-container
              v-alert(type='success', outline, :value='!loading && final.ok') Wiki.js was configured successfully and is now ready for use.
              v-alert(type='error', outline, :value='!loading && !final.ok') {{ final.error }}
            v-divider
190
            .pt-3.text-xs-center
191 192 193
              v-btn(@click='!conf.upgrade ? proceedToAdmin() : proceedToUpgrade()', :disabled='loading') Back
              v-btn(color='primary', @click='proceedToFinal', v-if='!loading && !final.ok') Try Again
              v-btn(color='success', @click='finish', v-if='loading || final.ok', :disabled='loading') Continue
194

195 196 197 198
    v-footer.pa-3(app, absolute, color='grey darken-3', height='auto')
      .caption.grey--text Wiki.js
      v-spacer
      .caption.grey--text(v-if='conf.telemetry') Telemetry Client ID: {{telemetryId}}
199 200 201 202
</template>

<script>
import axios from 'axios'
203
import _ from 'lodash'
204
import { AtomSpinner } from 'epic-spinners'
205 206

export default {
207 208 209
  components: {
    AtomSpinner
  },
210 211 212 213 214 215 216 217 218 219 220 221 222
  props: {
    telemetryId: {
      type: String,
      required: true
    },
    wikiVersion: {
      type: String,
      required: true
    }
  },
  data() {
    return {
      loading: false,
223
      state: 1,
224 225 226 227 228 229 230 231 232 233 234 235
      final: {
        ok: false,
        error: '',
        redirectUrl: ''
      },
      conf: {
        adminEmail: '',
        adminPassword: '',
        adminPasswordConfirm: '',
        telemetry: true,
        upgrade: false,
        upgMongo: 'mongodb://'
236 237 238
      },
      pwdMode: true,
      pwdConfirmMode: true
239 240 241
    }
  },
  methods: {
242 243
    proceedToWelcome () {
      this.state = 1
244 245
      this.loading = false
    },
246
    async proceedToAdmin () {
247
      if (this.state < 2) {
248 249
        const validationSuccess = await this.$validator.validateAll('general')
        if (!validationSuccess) {
250
          this.state = 1
251 252
          return
        }
253
      }
254
      this.state = 2
255
      this.loading = false
256 257 258
      _.delay(() => {
        this.$refs.adminEmailInput.focus()
      }, 400)
259
    },
260
    async proceedToUpgrade () {
261
      if (this.state < 3) {
262
        const validationSuccess = await this.$validator.validateAll('admin')
263
        if (!validationSuccess || this.conf.adminPassword !== this.conf.adminPasswordConfirm) {
264
          this.state = 2
265 266
          return
        }
267 268 269
      }

      if (this.conf.upgrade) {
270
        this.state = 3
271 272 273 274 275
        this.loading = false
      } else {
        this.proceedToFinal()
      }
    },
276
    async proceedToFinal () {
277
      if (this.conf.upgrade && this.state < 4) {
278 279
        const validationSuccess = await this.$validator.validateAll('upgrade')
        if (!validationSuccess) {
280
          this.state = 3
281 282 283 284
          return
        }
      }

285
      this.state = this.conf.upgrade ? 4 : 3
286 287
      this.loading = true
      this.final = {
288 289 290 291
        ok: false,
        error: '',
        redirectUrl: ''
      }
292 293
      this.$forceUpdate()
      let self = this
294

295
      _.delay(() => {
296 297
        axios.post('/finalize', self.conf).then(resp => {
          if (resp.data.ok === true) {
298
            _.delay(() => {
299 300 301 302 303 304 305 306 307 308 309 310 311 312
              self.final.ok = true
              self.loading = false
            }, 5000)
          } else {
            self.final.ok = false
            self.final.error = resp.data.error
            self.loading = false
          }
          self.$nextTick()
        }).catch(err => {
          window.alert(err.message)
        })
      }, 1000)
    },
313
    finish () {
314
      window.location.assign('/login')
315 316 317 318 319
    }
  }
}

</script>
320 321 322 323

<style lang='scss'>

</style>