diff options
author | Phil Hughes <me@iamphill.com> | 2018-01-11 12:38:30 +0000 |
---|---|---|
committer | Phil Hughes <me@iamphill.com> | 2018-01-16 16:45:33 +0000 |
commit | b69d7ac3c9de7b0ba3e60ede70f1de630a53dfe6 (patch) | |
tree | d6169abee8bc535276d3118665b9d15ab649dc43 /app/assets/javascripts/projects | |
parent | f084525fe4cceee1c6c3d86d5bd3150fa6334e42 (diff) | |
download | gitlab-ce-b69d7ac3c9de7b0ba3e60ede70f1de630a53dfe6.tar.gz |
Added dispatcher imports for some project routes
Diffstat (limited to 'app/assets/javascripts/projects')
7 files changed, 0 insertions, 640 deletions
diff --git a/app/assets/javascripts/projects/permissions/components/project_feature_setting.vue b/app/assets/javascripts/projects/permissions/components/project_feature_setting.vue deleted file mode 100644 index 3ebfe82597a..00000000000 --- a/app/assets/javascripts/projects/permissions/components/project_feature_setting.vue +++ /dev/null @@ -1,111 +0,0 @@ -<script> - import projectFeatureToggle from '../../../vue_shared/components/toggle_button.vue'; - - export default { - components: { - projectFeatureToggle, - }, - - model: { - prop: 'value', - event: 'change', - }, - - props: { - name: { - type: String, - required: false, - default: '', - }, - options: { - type: Array, - required: false, - default: () => [], - }, - value: { - type: Number, - required: false, - default: 0, - }, - disabledInput: { - type: Boolean, - required: false, - default: false, - }, - }, - - computed: { - featureEnabled() { - return this.value !== 0; - }, - - displayOptions() { - if (this.featureEnabled) { - return this.options; - } - return [ - [0, 'Enable feature to choose access level'], - ]; - }, - - displaySelectInput() { - return this.disabledInput || !this.featureEnabled || this.displayOptions.length < 2; - }, - }, - - methods: { - toggleFeature(featureEnabled) { - if (featureEnabled === false || this.options.length < 1) { - this.$emit('change', 0); - } else { - const [firstOptionValue] = this.options[this.options.length - 1]; - this.$emit('change', firstOptionValue); - } - }, - - selectOption(e) { - this.$emit('change', Number(e.target.value)); - }, - }, - }; -</script> - -<template> - <div - class="project-feature-controls" - :data-for="name" - > - <input - v-if="name" - type="hidden" - :name="name" - :value="value" - /> - <project-feature-toggle - :value="featureEnabled" - @change="toggleFeature" - :disabled-input="disabledInput" - /> - <div class="select-wrapper"> - <select - class="form-control project-repo-select select-control" - @change="selectOption" - :disabled="displaySelectInput" - > - <option - v-for="[optionValue, optionName] in displayOptions" - :key="optionValue" - :value="optionValue" - :selected="optionValue === value" - > - {{ optionName }} - </option> - </select> - <i - aria-hidden="true" - class="fa fa-chevron-down" - > - </i> - </div> - </div> -</template> diff --git a/app/assets/javascripts/projects/permissions/components/project_setting_row.vue b/app/assets/javascripts/projects/permissions/components/project_setting_row.vue deleted file mode 100644 index 25a88f846eb..00000000000 --- a/app/assets/javascripts/projects/permissions/components/project_setting_row.vue +++ /dev/null @@ -1,51 +0,0 @@ -<script> - export default { - props: { - label: { - type: String, - required: false, - default: null, - }, - helpPath: { - type: String, - required: false, - default: null, - }, - helpText: { - type: String, - required: false, - default: null, - }, - }, - }; -</script> - -<template> - <div class="project-feature-row"> - <label - v-if="label" - class="label-light" - > - {{ label }} - <a - v-if="helpPath" - :href="helpPath" - target="_blank" - > - <i - aria-hidden="true" - data-hidden="true" - class="fa fa-question-circle" - > - </i> - </a> - </label> - <span - v-if="helpText" - class="help-block" - > - {{ helpText }} - </span> - <slot></slot> - </div> -</template> diff --git a/app/assets/javascripts/projects/permissions/components/settings_panel.vue b/app/assets/javascripts/projects/permissions/components/settings_panel.vue deleted file mode 100644 index c96ce12d9fb..00000000000 --- a/app/assets/javascripts/projects/permissions/components/settings_panel.vue +++ /dev/null @@ -1,328 +0,0 @@ -<script> - import projectFeatureSetting from './project_feature_setting.vue'; - import projectFeatureToggle from '../../../vue_shared/components/toggle_button.vue'; - import projectSettingRow from './project_setting_row.vue'; - import { visibilityOptions, visibilityLevelDescriptions } from '../constants'; - import { toggleHiddenClassBySelector } from '../external'; - - export default { - components: { - projectFeatureSetting, - projectFeatureToggle, - projectSettingRow, - }, - - props: { - currentSettings: { - type: Object, - required: true, - }, - canChangeVisibilityLevel: { - type: Boolean, - required: false, - default: false, - }, - allowedVisibilityOptions: { - type: Array, - required: false, - default: () => [0, 10, 20], - }, - lfsAvailable: { - type: Boolean, - required: false, - default: false, - }, - registryAvailable: { - type: Boolean, - required: false, - default: false, - }, - visibilityHelpPath: { - type: String, - required: false, - default: '', - }, - lfsHelpPath: { - type: String, - required: false, - default: '', - }, - registryHelpPath: { - type: String, - required: false, - default: '', - }, - }, - - data() { - const defaults = { - visibilityOptions, - visibilityLevel: visibilityOptions.PUBLIC, - issuesAccessLevel: 20, - repositoryAccessLevel: 20, - mergeRequestsAccessLevel: 20, - buildsAccessLevel: 20, - wikiAccessLevel: 20, - snippetsAccessLevel: 20, - containerRegistryEnabled: true, - lfsEnabled: true, - requestAccessEnabled: true, - highlightChangesClass: false, - }; - - return { ...defaults, ...this.currentSettings }; - }, - - computed: { - featureAccessLevelOptions() { - const options = [ - [10, 'Only Project Members'], - ]; - if (this.visibilityLevel !== visibilityOptions.PRIVATE) { - options.push([20, 'Everyone With Access']); - } - return options; - }, - - repoFeatureAccessLevelOptions() { - return this.featureAccessLevelOptions.filter( - ([value]) => value <= this.repositoryAccessLevel, - ); - }, - - repositoryEnabled() { - return this.repositoryAccessLevel > 0; - }, - - visibilityLevelDescription() { - return visibilityLevelDescriptions[this.visibilityLevel]; - }, - }, - - watch: { - visibilityLevel(value, oldValue) { - if (value === visibilityOptions.PRIVATE) { - // when private, features are restricted to "only team members" - this.issuesAccessLevel = Math.min(10, this.issuesAccessLevel); - this.repositoryAccessLevel = Math.min(10, this.repositoryAccessLevel); - this.mergeRequestsAccessLevel = Math.min(10, this.mergeRequestsAccessLevel); - this.buildsAccessLevel = Math.min(10, this.buildsAccessLevel); - this.wikiAccessLevel = Math.min(10, this.wikiAccessLevel); - this.snippetsAccessLevel = Math.min(10, this.snippetsAccessLevel); - this.highlightChanges(); - } else if (oldValue === visibilityOptions.PRIVATE) { - // if changing away from private, make enabled features more permissive - if (this.issuesAccessLevel > 0) this.issuesAccessLevel = 20; - if (this.repositoryAccessLevel > 0) this.repositoryAccessLevel = 20; - if (this.mergeRequestsAccessLevel > 0) this.mergeRequestsAccessLevel = 20; - if (this.buildsAccessLevel > 0) this.buildsAccessLevel = 20; - if (this.wikiAccessLevel > 0) this.wikiAccessLevel = 20; - if (this.snippetsAccessLevel > 0) this.snippetsAccessLevel = 20; - this.highlightChanges(); - } - }, - - repositoryAccessLevel(value, oldValue) { - if (value < oldValue) { - // sub-features cannot have more premissive access level - this.mergeRequestsAccessLevel = Math.min(this.mergeRequestsAccessLevel, value); - this.buildsAccessLevel = Math.min(this.buildsAccessLevel, value); - - if (value === 0) { - this.containerRegistryEnabled = false; - this.lfsEnabled = false; - } - } else if (oldValue === 0) { - this.mergeRequestsAccessLevel = value; - this.buildsAccessLevel = value; - this.containerRegistryEnabled = true; - this.lfsEnabled = true; - } - }, - - issuesAccessLevel(value, oldValue) { - if (value === 0) toggleHiddenClassBySelector('.issues-feature', true); - else if (oldValue === 0) toggleHiddenClassBySelector('.issues-feature', false); - }, - - mergeRequestsAccessLevel(value, oldValue) { - if (value === 0) toggleHiddenClassBySelector('.merge-requests-feature', true); - else if (oldValue === 0) toggleHiddenClassBySelector('.merge-requests-feature', false); - }, - - buildsAccessLevel(value, oldValue) { - if (value === 0) toggleHiddenClassBySelector('.builds-feature', true); - else if (oldValue === 0) toggleHiddenClassBySelector('.builds-feature', false); - }, - }, - - methods: { - highlightChanges() { - this.highlightChangesClass = true; - this.$nextTick(() => { - this.highlightChangesClass = false; - }); - }, - - visibilityAllowed(option) { - return this.allowedVisibilityOptions.includes(option); - }, - }, - }; -</script> - -<template> - <div> - <div class="project-visibility-setting"> - <project-setting-row - label="Project visibility" - :help-path="visibilityHelpPath" - > - <div class="project-feature-controls"> - <div class="select-wrapper"> - <select - name="project[visibility_level]" - v-model="visibilityLevel" - class="form-control select-control" - :disabled="!canChangeVisibilityLevel" - > - <option - :value="visibilityOptions.PRIVATE" - :disabled="!visibilityAllowed(visibilityOptions.PRIVATE)" - > - Private - </option> - <option - :value="visibilityOptions.INTERNAL" - :disabled="!visibilityAllowed(visibilityOptions.INTERNAL)" - > - Internal - </option> - <option - :value="visibilityOptions.PUBLIC" - :disabled="!visibilityAllowed(visibilityOptions.PUBLIC)" - > - Public - </option> - </select> - <i - aria-hidden="true" - data-hidden="true" - class="fa fa-chevron-down" - > - </i> - </div> - </div> - <span class="help-block">{{ visibilityLevelDescription }}</span> - <label - v-if="visibilityLevel !== visibilityOptions.PUBLIC" - class="request-access" - > - <input - type="hidden" - name="project[request_access_enabled]" - :value="requestAccessEnabled" - /> - <input - type="checkbox" - v-model="requestAccessEnabled" - /> - Allow users to request access - </label> - </project-setting-row> - </div> - <div - class="project-feature-settings" - :class="{ 'highlight-changes': highlightChangesClass }" - > - <project-setting-row - label="Issues" - help-text="Lightweight issue tracking system for this project" - > - <project-feature-setting - name="project[project_feature_attributes][issues_access_level]" - :options="featureAccessLevelOptions" - v-model="issuesAccessLevel" - /> - </project-setting-row> - <project-setting-row - label="Repository" - help-text="View and edit files in this project" - > - <project-feature-setting - name="project[project_feature_attributes][repository_access_level]" - :options="featureAccessLevelOptions" - v-model="repositoryAccessLevel" - /> - </project-setting-row> - <div class="project-feature-setting-group"> - <project-setting-row - label="Merge requests" - help-text="Submit changes to be merged upstream" - > - <project-feature-setting - name="project[project_feature_attributes][merge_requests_access_level]" - :options="repoFeatureAccessLevelOptions" - v-model="mergeRequestsAccessLevel" - :disabled-input="!repositoryEnabled" - /> - </project-setting-row> - <project-setting-row - label="Pipelines" - help-text="Build, test, and deploy your changes" - > - <project-feature-setting - name="project[project_feature_attributes][builds_access_level]" - :options="repoFeatureAccessLevelOptions" - v-model="buildsAccessLevel" - :disabled-input="!repositoryEnabled" - /> - </project-setting-row> - <project-setting-row - v-if="registryAvailable" - label="Container registry" - :help-path="registryHelpPath" - help-text="Every project can have its own space to store its Docker images" - > - <project-feature-toggle - name="project[container_registry_enabled]" - v-model="containerRegistryEnabled" - :disabled-input="!repositoryEnabled" - /> - </project-setting-row> - <project-setting-row - v-if="lfsAvailable" - label="Git Large File Storage" - :help-path="lfsHelpPath" - help-text="Manages large files such as audio, video, and graphics files" - > - <project-feature-toggle - name="project[lfs_enabled]" - v-model="lfsEnabled" - :disabled-input="!repositoryEnabled" - /> - </project-setting-row> - </div> - <project-setting-row - label="Wiki" - help-text="Pages for project documentation" - > - <project-feature-setting - name="project[project_feature_attributes][wiki_access_level]" - :options="featureAccessLevelOptions" - v-model="wikiAccessLevel" - /> - </project-setting-row> - <project-setting-row - label="Snippets" - help-text="Share code pastes with others out of Git repository" - > - <project-feature-setting - name="project[project_feature_attributes][snippets_access_level]" - :options="featureAccessLevelOptions" - v-model="snippetsAccessLevel" - /> - </project-setting-row> - </div> - </div> -</template> diff --git a/app/assets/javascripts/projects/permissions/constants.js b/app/assets/javascripts/projects/permissions/constants.js deleted file mode 100644 index ce47562f259..00000000000 --- a/app/assets/javascripts/projects/permissions/constants.js +++ /dev/null @@ -1,11 +0,0 @@ -export const visibilityOptions = { - PRIVATE: 0, - INTERNAL: 10, - PUBLIC: 20, -}; - -export const visibilityLevelDescriptions = { - [visibilityOptions.PRIVATE]: 'The project is accessible only by members of the project. Access must be granted explicitly to each user.', - [visibilityOptions.INTERNAL]: 'The project can be accessed by any user who is logged in.', - [visibilityOptions.PUBLIC]: 'The project can be accessed by anyone, regardless of authentication.', -}; diff --git a/app/assets/javascripts/projects/permissions/external.js b/app/assets/javascripts/projects/permissions/external.js deleted file mode 100644 index 460af4a2111..00000000000 --- a/app/assets/javascripts/projects/permissions/external.js +++ /dev/null @@ -1,18 +0,0 @@ -const selectorCache = []; - -// workaround since we don't have a polyfill for classList.toggle 2nd parameter -export function toggleHiddenClass(element, hidden) { - if (hidden) { - element.classList.add('hidden'); - } else { - element.classList.remove('hidden'); - } -} - -// hide external feature-specific settings when a given feature is disabled -export function toggleHiddenClassBySelector(selector, hidden) { - if (!selectorCache[selector]) { - selectorCache[selector] = document.querySelectorAll(selector); - } - selectorCache[selector].forEach(elm => toggleHiddenClass(elm, hidden)); -} diff --git a/app/assets/javascripts/projects/permissions/index.js b/app/assets/javascripts/projects/permissions/index.js deleted file mode 100644 index dbde8dda634..00000000000 --- a/app/assets/javascripts/projects/permissions/index.js +++ /dev/null @@ -1,13 +0,0 @@ -import Vue from 'vue'; -import settingsPanel from './components/settings_panel.vue'; - -export default function initProjectPermissionsSettings() { - const mountPoint = document.querySelector('.js-project-permissions-form'); - const componentPropsEl = document.querySelector('.js-project-permissions-form-data'); - const componentProps = JSON.parse(componentPropsEl.innerHTML); - - return new Vue({ - el: mountPoint, - render: createElement => createElement(settingsPanel, { props: { ...componentProps } }), - }); -} diff --git a/app/assets/javascripts/projects/project_new.js b/app/assets/javascripts/projects/project_new.js deleted file mode 100644 index 4710e70d619..00000000000 --- a/app/assets/javascripts/projects/project_new.js +++ /dev/null @@ -1,108 +0,0 @@ -let hasUserDefinedProjectPath = false; - -const deriveProjectPathFromUrl = ($projectImportUrl) => { - const $currentProjectPath = $projectImportUrl.parents('.toggle-import-form').find('#project_path'); - if (hasUserDefinedProjectPath) { - return; - } - - let importUrl = $projectImportUrl.val().trim(); - if (importUrl.length === 0) { - return; - } - - /* - \/?: remove trailing slash - (\.git\/?)?: remove trailing .git (with optional trailing slash) - (\?.*)?: remove query string - (#.*)?: remove fragment identifier - */ - importUrl = importUrl.replace(/\/?(\.git\/?)?(\?.*)?(#.*)?$/, ''); - - // extract everything after the last slash - const pathMatch = /\/([^/]+)$/.exec(importUrl); - if (pathMatch) { - $currentProjectPath.val(pathMatch[1]); - } -}; - -const bindEvents = () => { - const $newProjectForm = $('#new_project'); - const $projectImportUrl = $('#project_import_url'); - const $projectPath = $('#project_path'); - const $useTemplateBtn = $('.template-button > input'); - const $projectFieldsForm = $('.project-fields-form'); - const $selectedTemplateText = $('.selected-template'); - const $changeTemplateBtn = $('.change-template'); - const $selectedIcon = $('.selected-icon svg'); - const $templateProjectNameInput = $('#template-project-name #project_path'); - - if ($newProjectForm.length !== 1) { - return; - } - - $('.how_to_import_link').on('click', (e) => { - e.preventDefault(); - $(e.currentTarget).next('.modal').show(); - }); - - $('.modal-header .close').on('click', () => { - $('.modal').hide(); - }); - - $('.btn_import_gitlab_project').on('click', () => { - const importHref = $('a.btn_import_gitlab_project').attr('href'); - $('.btn_import_gitlab_project').attr('href', `${importHref}?namespace_id=${$('#project_namespace_id').val()}&path=${$projectPath.val()}`); - }); - - function chooseTemplate() { - $('.template-option').hide(); - $projectFieldsForm.addClass('selected'); - $selectedIcon.removeClass('active'); - const value = $(this).val(); - const templates = { - rails: { - text: 'Ruby on Rails', - icon: '.selected-icon .icon-rails', - }, - express: { - text: 'NodeJS Express', - icon: '.selected-icon .icon-node-express', - }, - spring: { - text: 'Spring', - icon: '.selected-icon .icon-java-spring', - }, - }; - - const selectedTemplate = templates[value]; - $selectedTemplateText.text(selectedTemplate.text); - $(selectedTemplate.icon).addClass('active'); - $templateProjectNameInput.focus(); - } - - $useTemplateBtn.on('change', chooseTemplate); - - $changeTemplateBtn.on('click', () => { - $('.template-option').show(); - $projectFieldsForm.removeClass('selected'); - $useTemplateBtn.prop('checked', false); - }); - - $newProjectForm.on('submit', () => { - $projectPath.val($projectPath.val().trim()); - }); - - $projectPath.on('keyup', () => { - hasUserDefinedProjectPath = $projectPath.val().trim().length > 0; - }); - - $projectImportUrl.keyup(() => deriveProjectPathFromUrl($projectImportUrl)); -}; - -document.addEventListener('DOMContentLoaded', bindEvents); - -export default { - bindEvents, - deriveProjectPathFromUrl, -}; |