|
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