Skip to content
Snippets Groups Projects

Expand instance-level templates to cover .gitlab-ci.yml, .gitignore and Dockerfile

Merged Nick Thomas requested to merge (removed):5306-more-custom-templates into master
1 unresolved thread
Compare and Show latest version
327 files
+ 94369
4305
Compare changes
  • Side-by-side
  • Inline
Files
327
@@ -23,6 +23,11 @@ export default {
@@ -23,6 +23,11 @@ export default {
required: true,
required: true,
},
},
},
},
 
data() {
 
return {
 
wasValidated: false,
 
};
 
},
computed: {
computed: {
...mapState([
...mapState([
'badgeInAddForm',
'badgeInAddForm',
@@ -39,16 +44,6 @@ export default {
@@ -39,16 +44,6 @@ export default {
return this.badgeInAddForm;
return this.badgeInAddForm;
},
},
canSubmit() {
return (
this.badge !== null &&
this.badge.imageUrl &&
this.badge.imageUrl.trim() !== '' &&
this.badge.linkUrl &&
this.badge.linkUrl.trim() !== '' &&
!this.isSaving
);
},
helpText() {
helpText() {
const placeholders = ['project_path', 'project_id', 'default_branch', 'commit_sha']
const placeholders = ['project_path', 'project_id', 'default_branch', 'commit_sha']
.map(placeholder => `<code>%{${placeholder}}</code>`)
.map(placeholder => `<code>%{${placeholder}}</code>`)
@@ -93,11 +88,18 @@ export default {
@@ -93,11 +88,18 @@ export default {
});
});
},
},
},
},
submitButtonLabel() {
badgeImageUrlExample() {
if (this.isEditing) {
const exampleUrl =
return s__('Badges|Save changes');
'https://example.gitlab.com/%{project_path}/badges/%{default_branch}/badge.svg';
}
return sprintf(s__('Badges|e.g. %{exampleUrl}'), {
return s__('Badges|Add badge');
exampleUrl,
 
});
 
},
 
badgeLinkUrlExample() {
 
const exampleUrl = 'https://example.gitlab.com/%{project_path}';
 
return sprintf(s__('Badges|e.g. %{exampleUrl}'), {
 
exampleUrl,
 
});
},
},
},
},
methods: {
methods: {
@@ -109,7 +111,9 @@ export default {
@@ -109,7 +111,9 @@ export default {
this.stopEditing();
this.stopEditing();
},
},
onSubmit() {
onSubmit() {
if (!this.canSubmit) {
const form = this.$el;
 
if (!form.checkValidity()) {
 
this.wasValidated = true;
return Promise.resolve();
return Promise.resolve();
}
}
@@ -117,6 +121,7 @@ export default {
@@ -117,6 +121,7 @@ export default {
return this.saveBadge()
return this.saveBadge()
.then(() => {
.then(() => {
createFlash(s__('Badges|The badge was saved.'), 'notice');
createFlash(s__('Badges|The badge was saved.'), 'notice');
 
this.wasValidated = false;
})
})
.catch(error => {
.catch(error => {
createFlash(
createFlash(
@@ -129,6 +134,7 @@ export default {
@@ -129,6 +134,7 @@ export default {
return this.addBadge()
return this.addBadge()
.then(() => {
.then(() => {
createFlash(s__('Badges|A new badge was added.'), 'notice');
createFlash(s__('Badges|A new badge was added.'), 'notice');
 
this.wasValidated = false;
})
})
.catch(error => {
.catch(error => {
createFlash(
createFlash(
@@ -138,47 +144,58 @@ export default {
@@ -138,47 +144,58 @@ export default {
});
});
},
},
},
},
badgeImageUrlPlaceholder:
'https://example.gitlab.com/%{project_path}/badges/%{default_branch}/<badge>.svg',
badgeLinkUrlPlaceholder: 'https://example.gitlab.com/%{project_path}',
};
};
</script>
</script>
<template>
<template>
<form
<form
class="prepend-top-default append-bottom-default"
:class="{ 'was-validated': wasValidated }"
 
class="prepend-top-default append-bottom-default needs-validation"
 
novalidate
@submit.prevent.stop="onSubmit"
@submit.prevent.stop="onSubmit"
>
>
<div class="form-group">
<div class="form-group">
<label for="badge-link-url">{{ s__('Badges|Link') }}</label>
<label
 
for="badge-link-url"
 
class="label-bold"
 
>{{ s__('Badges|Link') }}</label>
 
<p v-html="helpText"></p>
<input
<input
id="badge-link-url"
id="badge-link-url"
v-model="linkUrl"
v-model="linkUrl"
:placeholder="$options.badgeLinkUrlPlaceholder"
type="URL"
type="text"
class="form-control"
class="form-control"
 
required
@input="debouncedPreview"
@input="debouncedPreview"
/>
/>
<span
<div class="invalid-feedback">
class="form-text text-muted"
{{ s__('Badges|Please fill in a valid URL') }}
v-html="helpText"
</div>
></span>
<span class="form-text text-muted">
 
{{ badgeLinkUrlExample }}
 
</span>
</div>
</div>
<div class="form-group">
<div class="form-group">
<label for="badge-image-url">{{ s__('Badges|Badge image URL') }}</label>
<label
 
for="badge-image-url"
 
class="label-bold"
 
>{{ s__('Badges|Badge image URL') }}</label>
 
<p v-html="helpText"></p>
<input
<input
id="badge-image-url"
id="badge-image-url"
v-model="imageUrl"
v-model="imageUrl"
:placeholder="$options.badgeImageUrlPlaceholder"
type="URL"
type="text"
class="form-control"
class="form-control"
 
required
@input="debouncedPreview"
@input="debouncedPreview"
/>
/>
<span
<div class="invalid-feedback">
class="form-text text-muted"
{{ s__('Badges|Please fill in a valid URL') }}
v-html="helpText"
</div>
></span>
<span class="form-text text-muted">
 
{{ badgeImageUrlExample }}
 
</span>
</div>
</div>
<div class="form-group">
<div class="form-group">
@@ -200,20 +217,32 @@ export default {
@@ -200,20 +217,32 @@ export default {
>{{ s__('Badges|No image to preview') }}</p>
>{{ s__('Badges|No image to preview') }}</p>
</div>
</div>
<div class="row-content-block">
<div
 
v-if="isEditing"
 
class="row-content-block"
 
>
<loading-button
<loading-button
:disabled="!canSubmit"
:loading="isSaving"
:loading="isSaving"
:label="submitButtonLabel"
:label="s__('Badges|Save changes')"
type="submit"
type="submit"
container-class="btn btn-success"
container-class="btn btn-success"
/>
/>
<button
<button
v-if="isEditing"
class="btn btn-cancel"
class="btn btn-cancel"
type="button"
type="button"
@click="onCancel"
@click="onCancel"
>{{ __('Cancel') }}</button>
>{{ __('Cancel') }}</button>
</div>
</div>
 
<div
 
v-else
 
class="form-group"
 
>
 
<loading-button
 
:loading="isSaving"
 
:label="s__('Badges|Add badge')"
 
type="submit"
 
container-class="btn btn-success"
 
/>
 
</div>
</form>
</form>
</template>
</template>
Loading