|
176 | 176 |
|
177 | 177 | <ProjectPresetItem
|
178 | 178 | :preset="remotePresetInfo"
|
179 |
| - :selected="formData.selectedPreset === 'remote'" |
180 |
| - @click.native="selectPreset('remote')" |
| 179 | + :selected="formData.selectedPreset === '__remote__'" |
| 180 | + :description="formData.remotePreset.url" |
| 181 | + @click.native="selectPreset('__remote__')" |
181 | 182 | />
|
182 | 183 | </div>
|
183 | 184 |
|
|
202 | 203 | icon-left="done"
|
203 | 204 | :label="$t('views.project-create.tabs.presets.buttons.create')"
|
204 | 205 | class="big primary next"
|
| 206 | + :disabled="!formData.selectedPreset" |
205 | 207 | @click="createWithoutSaving()"
|
206 | 208 | />
|
207 | 209 | </div>
|
|
327 | 329 | <VueModal
|
328 | 330 | v-if="showRemotePreset"
|
329 | 331 | :title="$t('views.project-create.tabs.presets.modal.title')"
|
330 |
| - class="medium" |
331 |
| - @close="showRemotePreset = false" |
| 332 | + class="small remove-preset-modal" |
| 333 | + @close="closeRemotePresetModal()" |
332 | 334 | >
|
333 |
| - <div class="default-body"> |
334 |
| - <div class="vue-ui-empty"> |
335 |
| - <VueIcon icon="cake" class="large"/> |
336 |
| - <div> |
337 |
| - {{ $t('views.project-create.tabs.presets.modal.body') }} |
338 |
| - </div> |
339 |
| - </div> |
| 335 | + <div class="default-body vue-ui-grid big-gap col-1"> |
| 336 | + <VueFormField |
| 337 | + :title="$t('views.project-create.tabs.presets.remote.url.title')" |
| 338 | + :subtitle="$t('views.project-create.tabs.presets.remote.url.subtitle')" |
| 339 | + > |
| 340 | + <VueInput |
| 341 | + v-model="formData.remotePreset.url" |
| 342 | + icon-left="language" |
| 343 | + v-focus |
| 344 | + /> |
| 345 | + </VueFormField> |
| 346 | + |
| 347 | + <VueFormField |
| 348 | + :title="$t('views.project-create.tabs.presets.remote.options')" |
| 349 | + > |
| 350 | + <VueSwitch |
| 351 | + v-model="formData.remotePreset.clone" |
| 352 | + class="extend-left" |
| 353 | + :disabled="remoteNotGithub" |
| 354 | + > |
| 355 | + {{ $t('views.project-create.tabs.presets.remote.clone') }} |
| 356 | + </VueSwitch> |
| 357 | + </VueFormField> |
| 358 | + </div> |
| 359 | + |
| 360 | + <div slot="footer" class="actions space-between"> |
| 361 | + <VueButton |
| 362 | + :label="$t('views.project-create.tabs.presets.remote.cancel')" |
| 363 | + class="flat" |
| 364 | + @click="closeRemotePresetModal(true)" |
| 365 | + /> |
| 366 | + |
| 367 | + <VueButton |
| 368 | + :label="$t('views.project-create.tabs.presets.remote.done')" |
| 369 | + :disabled="!formData.remotePreset.url || !remotePresetValid" |
| 370 | + :loading-secondary="remotePresetValid === null" |
| 371 | + icon-left="done" |
| 372 | + class="primary" |
| 373 | + @click="closeRemotePresetModal()" |
| 374 | + /> |
340 | 375 | </div>
|
341 | 376 | </VueModal>
|
342 | 377 |
|
|
420 | 455 | <script>
|
421 | 456 | import Prompts from '../mixins/Prompts'
|
422 | 457 | import { isValidName } from '../util/folders'
|
| 458 | +import debounce from 'lodash.debounce' |
423 | 459 |
|
424 | 460 | import CWD from '../graphql/cwd.gql'
|
425 | 461 | import PROJECT_CREATION from '../graphql/projectCreation.gql'
|
@@ -470,6 +506,7 @@ export default {
|
470 | 506 | showCancel: false,
|
471 | 507 | showRemotePreset: false,
|
472 | 508 | showSavePreset: false,
|
| 509 | + remotePresetValid: false, |
473 | 510 | debug: ''
|
474 | 511 | }
|
475 | 512 | },
|
@@ -508,22 +545,37 @@ export default {
|
508 | 545 | name: 'views.project-create.tabs.presets.remote.name',
|
509 | 546 | description: 'views.project-create.tabs.presets.remote.description'
|
510 | 547 | }
|
| 548 | + }, |
| 549 | +
|
| 550 | + remoteNotGithub () { |
| 551 | + const { url } = this.formData.remotePreset |
| 552 | + return url && /^(gitlab|bitbucket):/.test(url) |
511 | 553 | }
|
512 | 554 | },
|
513 | 555 |
|
| 556 | + watch: { |
| 557 | + 'formData.remotePreset.url' (value) { |
| 558 | + this.debouncedCheckRemotePreset() |
| 559 | + } |
| 560 | + }, |
| 561 | +
|
| 562 | + created () { |
| 563 | + this.debouncedCheckRemotePreset = debounce(this.checkRemotePreset, 1000) |
| 564 | + }, |
| 565 | +
|
514 | 566 | beforeDestroy () {
|
515 | 567 | this.cancel()
|
516 | 568 | },
|
517 | 569 |
|
518 | 570 | methods: {
|
519 | 571 | async selectPreset (id) {
|
520 |
| - if (id === 'remote') { |
| 572 | + this.formData.selectedPreset = id |
| 573 | +
|
| 574 | + if (id === '__remote__') { |
521 | 575 | this.showRemotePreset = true
|
522 | 576 | return
|
523 | 577 | }
|
524 | 578 |
|
525 |
| - this.formData.selectedPreset = id |
526 |
| -
|
527 | 579 | await this.$apollo.mutate({
|
528 | 580 | mutation: PRESET_APPLY,
|
529 | 581 | variables: {
|
@@ -586,6 +638,39 @@ export default {
|
586 | 638 | await this.$apollo.mutate({
|
587 | 639 | mutation: PROJECT_CANCEL_CREATION
|
588 | 640 | })
|
| 641 | + }, |
| 642 | +
|
| 643 | + closeRemotePresetModal (clear = false) { |
| 644 | + if (clear) { |
| 645 | + this.formData.remotePreset.url = '' |
| 646 | + } |
| 647 | +
|
| 648 | + this.showRemotePreset = false |
| 649 | + if (!this.formData.remotePreset.url) { |
| 650 | + this.formData.selectedPreset = null |
| 651 | + } |
| 652 | + }, |
| 653 | +
|
| 654 | + async checkRemotePreset () { |
| 655 | + if (!this.formData.remotePreset.url) { |
| 656 | + this.remotePresetValid = false |
| 657 | + return |
| 658 | + } |
| 659 | +
|
| 660 | + if (this.remoteNotGithub) { |
| 661 | + this.formData.remotePreset.clone = true |
| 662 | + } |
| 663 | +
|
| 664 | + if (this.formData.remotePreset.clone) { |
| 665 | + this.remotePresetValid = true |
| 666 | + } else { |
| 667 | + this.remotePresetValid = null |
| 668 | +
|
| 669 | + const url = `https://raw.githubusercontent.com/${this.formData.remotePreset.url}/master/preset.json` |
| 670 | +
|
| 671 | + const response = await fetch(url) |
| 672 | + this.remotePresetValid = response.ok |
| 673 | + } |
589 | 674 | }
|
590 | 675 | }
|
591 | 676 | }
|
|
0 commit comments