Skip to content

Commit 7402148

Browse files
author
Guillaume Chau
committedJun 17, 2018
feat(ui): remote preset support
1 parent 4413dee commit 7402148

File tree

7 files changed

+122
-19
lines changed

7 files changed

+122
-19
lines changed
 

‎packages/@vue/cli-ui/locales/en.json

+9-1
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,15 @@
258258
},
259259
"remote": {
260260
"name": "Remote preset",
261-
"description": "Fetch a preset from a git repository"
261+
"description": "Fetch a preset from a git repository",
262+
"url": {
263+
"title": "Preset URL",
264+
"subtitle": "Git repo, for example 'username/repo'. You can also prefix with 'gitlab:' or 'bitbucket:'."
265+
},
266+
"options": "Other options",
267+
"clone": "Private repository",
268+
"cancel": "Cancel",
269+
"done": "Done"
262270
},
263271
"default-preset": "Default preset"
264272
},

‎packages/@vue/cli-ui/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
"eslint": "^4.16.0",
5757
"eslint-plugin-graphql": "^2.1.1",
5858
"lint-staged": "^6.0.0",
59+
"lodash.debounce": "^4.0.8",
5960
"portal-vue": "^1.3.0",
6061
"rimraf": "^2.6.2",
6162
"start-server-and-test": "^1.4.1",

‎packages/@vue/cli-ui/src/components/ProjectPresetItem.vue

+6-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
<ListItemInfo
2020
:name="$t(preset.name)"
21-
:description="$t(preset.description)"
21+
:description="description || $t(preset.description)"
2222
:link="preset.link"
2323
:selected="selected"
2424
/>
@@ -37,6 +37,11 @@ export default {
3737
selected: {
3838
type: Boolean,
3939
required: true
40+
},
41+
42+
description: {
43+
type: String,
44+
default: null
4045
}
4146
}
4247
}

‎packages/@vue/cli-ui/src/graphql-api/connectors/projects.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -302,9 +302,9 @@ async function create (input, context) {
302302
info: 'Resolving preset...'
303303
})
304304
let preset
305-
if (input.remote) {
305+
if (input.preset === '__remote__' && input.remote) {
306306
// vue create foo --preset bar
307-
preset = await creator.resolvePreset(input.preset, input.clone)
307+
preset = await creator.resolvePreset(input.remote, input.clone)
308308
} else if (input.preset === 'default') {
309309
// vue create foo --default
310310
preset = defaults.presets.default

‎packages/@vue/cli-ui/src/graphql-api/schema/project.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ input ProjectCreateInput {
3636
force: Boolean!
3737
packageManager: PackageManager
3838
preset: String!
39-
remote: Boolean
39+
remote: String
4040
clone: Boolean
4141
save: String
4242
enableGit: Boolean!

‎packages/@vue/cli-ui/src/views/ProjectCreate.vue

+99-14
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,9 @@
176176

177177
<ProjectPresetItem
178178
: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__')"
181182
/>
182183
</div>
183184

@@ -202,6 +203,7 @@
202203
icon-left="done"
203204
:label="$t('views.project-create.tabs.presets.buttons.create')"
204205
class="big primary next"
206+
:disabled="!formData.selectedPreset"
205207
@click="createWithoutSaving()"
206208
/>
207209
</div>
@@ -327,16 +329,49 @@
327329
<VueModal
328330
v-if="showRemotePreset"
329331
: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()"
332334
>
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+
/>
340375
</div>
341376
</VueModal>
342377

@@ -420,6 +455,7 @@
420455
<script>
421456
import Prompts from '../mixins/Prompts'
422457
import { isValidName } from '../util/folders'
458+
import debounce from 'lodash.debounce'
423459
424460
import CWD from '../graphql/cwd.gql'
425461
import PROJECT_CREATION from '../graphql/projectCreation.gql'
@@ -470,6 +506,7 @@ export default {
470506
showCancel: false,
471507
showRemotePreset: false,
472508
showSavePreset: false,
509+
remotePresetValid: false,
473510
debug: ''
474511
}
475512
},
@@ -508,22 +545,37 @@ export default {
508545
name: 'views.project-create.tabs.presets.remote.name',
509546
description: 'views.project-create.tabs.presets.remote.description'
510547
}
548+
},
549+
550+
remoteNotGithub () {
551+
const { url } = this.formData.remotePreset
552+
return url && /^(gitlab|bitbucket):/.test(url)
511553
}
512554
},
513555
556+
watch: {
557+
'formData.remotePreset.url' (value) {
558+
this.debouncedCheckRemotePreset()
559+
}
560+
},
561+
562+
created () {
563+
this.debouncedCheckRemotePreset = debounce(this.checkRemotePreset, 1000)
564+
},
565+
514566
beforeDestroy () {
515567
this.cancel()
516568
},
517569
518570
methods: {
519571
async selectPreset (id) {
520-
if (id === 'remote') {
572+
this.formData.selectedPreset = id
573+
574+
if (id === '__remote__') {
521575
this.showRemotePreset = true
522576
return
523577
}
524578
525-
this.formData.selectedPreset = id
526-
527579
await this.$apollo.mutate({
528580
mutation: PRESET_APPLY,
529581
variables: {
@@ -586,6 +638,39 @@ export default {
586638
await this.$apollo.mutate({
587639
mutation: PROJECT_CANCEL_CREATION
588640
})
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+
}
589674
}
590675
}
591676
}

‎yarn.lock

+4
Original file line numberDiff line numberDiff line change
@@ -7762,6 +7762,10 @@ lodash.create@3.1.1:
77627762
lodash._basecreate "^3.0.0"
77637763
lodash._isiterateecall "^3.0.0"
77647764

7765+
lodash.debounce@^4.0.8:
7766+
version "4.0.8"
7767+
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
7768+
77657769
lodash.defaultsdeep@4.3.2:
77667770
version "4.3.2"
77677771
resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.3.2.tgz#6c1a586e6c5647b0e64e2d798141b8836158be8a"

0 commit comments

Comments
 (0)
Please sign in to comment.