summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/projects
diff options
context:
space:
mode:
authorPhil Hughes <me@iamphill.com>2018-01-11 12:38:30 +0000
committerPhil Hughes <me@iamphill.com>2018-01-16 16:45:33 +0000
commitb69d7ac3c9de7b0ba3e60ede70f1de630a53dfe6 (patch)
treed6169abee8bc535276d3118665b9d15ab649dc43 /app/assets/javascripts/projects
parentf084525fe4cceee1c6c3d86d5bd3150fa6334e42 (diff)
downloadgitlab-ce-b69d7ac3c9de7b0ba3e60ede70f1de630a53dfe6.tar.gz
Added dispatcher imports for some project routes
Diffstat (limited to 'app/assets/javascripts/projects')
-rw-r--r--app/assets/javascripts/projects/permissions/components/project_feature_setting.vue111
-rw-r--r--app/assets/javascripts/projects/permissions/components/project_setting_row.vue51
-rw-r--r--app/assets/javascripts/projects/permissions/components/settings_panel.vue328
-rw-r--r--app/assets/javascripts/projects/permissions/constants.js11
-rw-r--r--app/assets/javascripts/projects/permissions/external.js18
-rw-r--r--app/assets/javascripts/projects/permissions/index.js13
-rw-r--r--app/assets/javascripts/projects/project_new.js108
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,
-};