Commit 5a0dadf7 authored by Nick Thomas's avatar Nick Thomas

Use the project template endpoints in the frontend

parent 9c0ea135
...@@ -22,6 +22,8 @@ const Api = { ...@@ -22,6 +22,8 @@ const Api = {
ldapGroupsPath: '/api/:version/ldap/:provider/groups.json', ldapGroupsPath: '/api/:version/ldap/:provider/groups.json',
dockerfilePath: '/api/:version/templates/dockerfiles/:key', dockerfilePath: '/api/:version/templates/dockerfiles/:key',
issuableTemplatePath: '/:namespace_path/:project_path/templates/:type/:key', issuableTemplatePath: '/:namespace_path/:project_path/templates/:type/:key',
projectTemplatePath: '/api/:version/projects/:id/templates/:type/:key',
projectTemplatesPath: '/api/:version/projects/:id/templates/:type',
usersPath: '/api/:version/users.json', usersPath: '/api/:version/users.json',
userStatusPath: '/api/:version/user/status', userStatusPath: '/api/:version/user/status',
commitPath: '/api/:version/projects/:id/repository/commits', commitPath: '/api/:version/projects/:id/repository/commits',
...@@ -223,6 +225,23 @@ const Api = { ...@@ -223,6 +225,23 @@ const Api = {
return axios.get(url).then(({ data }) => callback(data)); return axios.get(url).then(({ data }) => callback(data));
}, },
projectTemplate(id, type, key, options, callback) {
const url = Api.buildUrl(this.projectTemplatePath)
.replace(':id', encodeURIComponent(id))
.replace(':type', type)
.replace(':key', encodeURIComponent(key));
return axios.get(url, { params: options }).then(({ data }) => callback(data));
},
projectTemplates(id, type, params = {}, callback) {
const url = Api.buildUrl(this.projectTemplatesPath)
.replace(':id', encodeURIComponent(id))
.replace(':type', type);
return axios.get(url, { params }).then(({ data }) => callback(data));
},
issueTemplate(namespacePath, projectPath, key, type, callback) { issueTemplate(namespacePath, projectPath, key, type, callback) {
const url = Api.buildUrl(Api.issuableTemplatePath) const url = Api.buildUrl(Api.issuableTemplatePath)
.replace(':key', encodeURIComponent(key)) .replace(':key', encodeURIComponent(key))
......
/* eslint-disable class-methods-use-this */ /* eslint-disable class-methods-use-this */
import Api from '~/api';
import $ from 'jquery'; import $ from 'jquery';
import Flash from '../flash'; import Flash from '../flash';
import FileTemplateTypeSelector from './template_selectors/type_selector'; import FileTemplateTypeSelector from './template_selectors/type_selector';
...@@ -9,9 +11,10 @@ import GitignoreSelector from './template_selectors/gitignore_selector'; ...@@ -9,9 +11,10 @@ import GitignoreSelector from './template_selectors/gitignore_selector';
import LicenseSelector from './template_selectors/license_selector'; import LicenseSelector from './template_selectors/license_selector';
export default class FileTemplateMediator { export default class FileTemplateMediator {
constructor({ editor, currentAction }) { constructor({ editor, currentAction, projectId }) {
this.editor = editor; this.editor = editor;
this.currentAction = currentAction; this.currentAction = currentAction;
this.projectId = projectId;
this.initTemplateSelectors(); this.initTemplateSelectors();
this.initTemplateTypeSelector(); this.initTemplateTypeSelector();
...@@ -126,7 +129,7 @@ export default class FileTemplateMediator { ...@@ -126,7 +129,7 @@ export default class FileTemplateMediator {
selector.renderLoading(); selector.renderLoading();
// in case undo menu is already already there // in case undo menu is already already there
this.destroyUndoMenu(); this.destroyUndoMenu();
this.fetchFileTemplate(selector.config.endpoint, query, data) this.fetchFileTemplate(selector.config.type, query, data)
.then((file) => { .then((file) => {
this.showUndoMenu(); this.showUndoMenu();
this.setEditorContent(file); this.setEditorContent(file);
...@@ -149,15 +152,15 @@ export default class FileTemplateMediator { ...@@ -149,15 +152,15 @@ export default class FileTemplateMediator {
}); });
} }
fetchFileTemplate(apiCall, query, data) { fetchFileTemplate(type, query, data) {
return new Promise((resolve) => { return new Promise((resolve) => {
const resolveFile = file => resolve(file); const resolveFile = file => resolve(file);
if (!data) { if (!data) {
apiCall(query, resolveFile); data = {};
} else {
apiCall(query, data, resolveFile);
} }
Api.projectTemplate(this.projectId, type, query, data, resolveFile);
}); });
} }
......
import Api from '../../api';
import FileTemplateSelector from '../file_template_selector'; import FileTemplateSelector from '../file_template_selector';
export default class BlobCiYamlSelector extends FileTemplateSelector { export default class BlobCiYamlSelector extends FileTemplateSelector {
...@@ -9,7 +7,7 @@ export default class BlobCiYamlSelector extends FileTemplateSelector { ...@@ -9,7 +7,7 @@ export default class BlobCiYamlSelector extends FileTemplateSelector {
key: 'gitlab-ci-yaml', key: 'gitlab-ci-yaml',
name: '.gitlab-ci.yml', name: '.gitlab-ci.yml',
pattern: /(.gitlab-ci.yml)/, pattern: /(.gitlab-ci.yml)/,
endpoint: Api.gitlabCiYml, type: 'gitlab_ci_ymls',
dropdown: '.js-gitlab-ci-yml-selector', dropdown: '.js-gitlab-ci-yml-selector',
wrapper: '.js-gitlab-ci-yml-selector-wrap', wrapper: '.js-gitlab-ci-yml-selector-wrap',
}; };
......
import Api from '../../api';
import FileTemplateSelector from '../file_template_selector'; import FileTemplateSelector from '../file_template_selector';
export default class DockerfileSelector extends FileTemplateSelector { export default class DockerfileSelector extends FileTemplateSelector {
...@@ -9,7 +7,7 @@ export default class DockerfileSelector extends FileTemplateSelector { ...@@ -9,7 +7,7 @@ export default class DockerfileSelector extends FileTemplateSelector {
key: 'dockerfile', key: 'dockerfile',
name: 'Dockerfile', name: 'Dockerfile',
pattern: /(Dockerfile)/, pattern: /(Dockerfile)/,
endpoint: Api.dockerfileYml, type: 'dockerfiles',
dropdown: '.js-dockerfile-selector', dropdown: '.js-dockerfile-selector',
wrapper: '.js-dockerfile-selector-wrap', wrapper: '.js-dockerfile-selector-wrap',
}; };
......
import Api from '../../api';
import FileTemplateSelector from '../file_template_selector'; import FileTemplateSelector from '../file_template_selector';
export default class BlobGitignoreSelector extends FileTemplateSelector { export default class BlobGitignoreSelector extends FileTemplateSelector {
...@@ -9,7 +7,7 @@ export default class BlobGitignoreSelector extends FileTemplateSelector { ...@@ -9,7 +7,7 @@ export default class BlobGitignoreSelector extends FileTemplateSelector {
key: 'gitignore', key: 'gitignore',
name: '.gitignore', name: '.gitignore',
pattern: /(.gitignore)/, pattern: /(.gitignore)/,
endpoint: Api.gitignoreText, type: 'gitignores',
dropdown: '.js-gitignore-selector', dropdown: '.js-gitignore-selector',
wrapper: '.js-gitignore-selector-wrap', wrapper: '.js-gitignore-selector-wrap',
}; };
......
import Api from '../../api';
import FileTemplateSelector from '../file_template_selector'; import FileTemplateSelector from '../file_template_selector';
export default class BlobLicenseSelector extends FileTemplateSelector { export default class BlobLicenseSelector extends FileTemplateSelector {
...@@ -9,7 +7,7 @@ export default class BlobLicenseSelector extends FileTemplateSelector { ...@@ -9,7 +7,7 @@ export default class BlobLicenseSelector extends FileTemplateSelector {
key: 'license', key: 'license',
name: 'LICENSE', name: 'LICENSE',
pattern: /^(.+\/)?(licen[sc]e|copying)($|\.)/i, pattern: /^(.+\/)?(licen[sc]e|copying)($|\.)/i,
endpoint: Api.licenseText, type: 'licenses',
dropdown: '.js-license-selector', dropdown: '.js-license-selector',
wrapper: '.js-license-selector-wrap', wrapper: '.js-license-selector-wrap',
}; };
......
...@@ -15,8 +15,9 @@ export default () => { ...@@ -15,8 +15,9 @@ export default () => {
const assetsPath = editBlobForm.data('assetsPrefix'); const assetsPath = editBlobForm.data('assetsPrefix');
const blobLanguage = editBlobForm.data('blobLanguage'); const blobLanguage = editBlobForm.data('blobLanguage');
const currentAction = $('.js-file-title').data('currentAction'); const currentAction = $('.js-file-title').data('currentAction');
const projectId = editBlobForm.data('project-id');
new EditBlob(`${urlRoot}${assetsPath}`, blobLanguage, currentAction); new EditBlob(`${urlRoot}${assetsPath}`, blobLanguage, currentAction, projectId);
new NewCommitForm(editBlobForm); new NewCommitForm(editBlobForm);
} }
......
...@@ -7,11 +7,11 @@ import { __ } from '~/locale'; ...@@ -7,11 +7,11 @@ import { __ } from '~/locale';
import TemplateSelectorMediator from '../blob/file_template_mediator'; import TemplateSelectorMediator from '../blob/file_template_mediator';
export default class EditBlob { export default class EditBlob {
constructor(assetsPath, aceMode, currentAction) { constructor(assetsPath, aceMode, currentAction, projectId) {
this.configureAceEditor(aceMode, assetsPath); this.configureAceEditor(aceMode, assetsPath);
this.initModePanesAndLinks(); this.initModePanesAndLinks();
this.initSoftWrap(); this.initSoftWrap();
this.initFileSelectors(currentAction); this.initFileSelectors(currentAction, projectId);
} }
configureAceEditor(aceMode, assetsPath) { configureAceEditor(aceMode, assetsPath) {
...@@ -30,10 +30,11 @@ export default class EditBlob { ...@@ -30,10 +30,11 @@ export default class EditBlob {
} }
} }
initFileSelectors(currentAction) { initFileSelectors(currentAction, projectId) {
this.fileTemplateMediator = new TemplateSelectorMediator({ this.fileTemplateMediator = new TemplateSelectorMediator({
currentAction, currentAction,
editor: this.editor, editor: this.editor,
projectId
}); });
} }
......
...@@ -28,7 +28,7 @@ export const fetchTemplateTypes = ({ dispatch, state }, page = 1) => { ...@@ -28,7 +28,7 @@ export const fetchTemplateTypes = ({ dispatch, state }, page = 1) => {
dispatch('requestTemplateTypes'); dispatch('requestTemplateTypes');
return Api.templates(state.selectedTemplateType.key, { page }) return Api.projectTemplates(state.currentProjectId, state.selectedTemplateType.key, { page })
.then(({ data, headers }) => { .then(({ data, headers }) => {
const nextPage = parseInt(normalizeHeaders(headers)['X-NEXT-PAGE'], 10); const nextPage = parseInt(normalizeHeaders(headers)['X-NEXT-PAGE'], 10);
...@@ -79,7 +79,7 @@ export const fetchTemplate = ({ dispatch, state }, template) => { ...@@ -79,7 +79,7 @@ export const fetchTemplate = ({ dispatch, state }, template) => {
return dispatch('setFileTemplate', template); return dispatch('setFileTemplate', template);
} }
return Api.templates(`${state.selectedTemplateType.key}/${template.key || template.name}`) return Api.projectTemplate('1', state.selectedTemplateType.key, template.key || template.name)
.then(({ data }) => { .then(({ data }) => {
dispatch('setFileTemplate', data); dispatch('setFileTemplate', data);
}) })
......
...@@ -191,11 +191,12 @@ module BlobHelper ...@@ -191,11 +191,12 @@ module BlobHelper
@dockerfile_names ||= template_dropdown_names(TemplateFinder.build(:dockerfiles, project).execute) @dockerfile_names ||= template_dropdown_names(TemplateFinder.build(:dockerfiles, project).execute)
end end
def blob_editor_paths def blob_editor_paths(project = @project)
{ {
'relative-url-root' => Rails.application.config.relative_url_root, 'relative-url-root' => Rails.application.config.relative_url_root,
'assets-prefix' => Gitlab::Application.config.assets.prefix, 'assets-prefix' => Gitlab::Application.config.assets.prefix,
'blob-language' => @blob && @blob.language.try(:ace_mode) 'blob-language' => @blob && @blob.language.try(:ace_mode),
'project-id' => project.id
} }
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment