*/
import { getJSON, postJSON, post, RequestData } from '../helpers/request';
import throwGlobalError from '../app/utils/throwGlobalError';
+import { Paging, Visibility } from '../app/types';
-export function getComponents(data: RequestData): Promise<any> {
- return getJSON('/api/projects/search', data);
+export interface BaseSearchProjectsParameters {
+ analyzedBefore?: string;
+ onProvisionedOnly?: boolean;
+ organization: string;
+ projects?: string;
+ q?: string;
+ qualifiers?: string;
+ visibility?: Visibility;
+}
+
+export interface SearchProjectsParameters extends BaseSearchProjectsParameters {
+ p?: number;
+ ps?: number;
+}
+
+export interface SearchProjectsResponseComponent {
+ id: string;
+ key: string;
+ lastAnalysisDate?: string;
+ name: string;
+ organization: string;
+ qualifier: string;
+ visibility: Visibility;
+}
+
+export interface SearchProjectsResponse {
+ components: SearchProjectsResponseComponent[];
+ paging: Paging;
}
-export function getProvisioned(data: RequestData): Promise<any> {
- return getJSON('/api/projects/provisioned', data);
+export function getComponents(
+ parameters: SearchProjectsParameters
+): Promise<SearchProjectsResponse> {
+ return getJSON('/api/projects/search', parameters);
}
-export function deleteComponents(projects: string[], organization: string): Promise<void> {
- return post('/api/projects/bulk_delete', { projects: projects.join(), organization });
+export function bulkDeleteProjects(parameters: BaseSearchProjectsParameters): Promise<void> {
+ return post('/api/projects/bulk_delete', parameters);
}
export function deleteProject(project: string): Promise<void> {
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import { getJSON, post, postJSON, RequestData } from '../helpers/request';
+import { BaseSearchProjectsParameters } from './components';
const PAGE_SIZE = 100;
return post('/api/permissions/apply_template', data);
}
-export function bulkApplyTemplate(data: RequestData): Promise<void> {
+export function bulkApplyTemplate(data: BaseSearchProjectsParameters): Promise<void> {
return post('/api/permissions/bulk_apply_template', data);
}
projectVisibility: string;
url?: string;
}
+
+export interface Paging {
+ pageIndex: number;
+ pageSize: number;
+ total: number;
+}
+
+export enum Visibility {
+ Public = 'public',
+ Private = 'private'
+}
import CreateProjectForm from './CreateProjectForm';
import ListFooter from '../../components/controls/ListFooter';
import { PAGE_SIZE, Project } from './utils';
-import { getComponents, getProvisioned } from '../../api/components';
+import { getComponents } from '../../api/components';
import { Organization } from '../../app/types';
import { translate } from '../../helpers/l10n';
this.mounted = false;
}
- getFilters = () => ({
- analyzedBefore: this.state.analyzedBefore,
- organization: this.props.organization.key,
- p: this.state.page !== 1 ? this.state.page : undefined,
- ps: PAGE_SIZE,
- q: this.state.query ? this.state.query : undefined
- });
-
- requestProjects = () =>
- this.state.provisioned ? this.requestProvisioned() : this.requestAllProjects();
-
- requestProvisioned = () => {
- const data = this.getFilters();
- getProvisioned(data).then(r => {
- if (this.mounted) {
- let projects: Project[] = r.projects.map((project: any) => ({
- ...project,
- id: project.uuid,
- qualifier: 'TRK'
- }));
- if (this.state.page > 1) {
- projects = [...this.state.projects, ...projects];
- }
- this.setState({ ready: true, projects, selection: [], total: r.paging.total });
- }
- });
- };
-
- requestAllProjects = () => {
- const data = this.getFilters();
- Object.assign(data, { qualifiers: this.state.qualifiers });
- getComponents(data).then(r => {
+ requestProjects = () => {
+ const parameters = {
+ analyzedBefore: this.state.analyzedBefore,
+ onProvisionedOnly: this.state.provisioned || undefined,
+ organization: this.props.organization.key,
+ p: this.state.page !== 1 ? this.state.page : undefined,
+ ps: PAGE_SIZE,
+ q: this.state.query || undefined,
+ qualifiers: this.state.qualifiers
+ };
+ getComponents(parameters).then(r => {
if (this.mounted) {
let projects: Project[] = r.components;
if (this.state.page > 1) {
import * as Select from 'react-select';
import {
getPermissionTemplates,
- PermissionTemplate,
bulkApplyTemplate,
- applyTemplateToProject
+ PermissionTemplate
} from '../../api/permissions';
import { translate, translateWithParameters } from '../../helpers/l10n';
+import AlertWarnIcon from '../../components/icons-components/AlertWarnIcon';
export interface Props {
+ analyzedBefore?: string;
onClose: () => void;
organization: string;
provisioned: boolean;
);
}
- bulkApplyToAll = (permissionTemplate: string) => {
- const data = {
- organization: this.props.organization,
- q: this.props.query ? this.props.query : undefined,
- qualifier: this.props.qualifier,
- templateId: permissionTemplate
- };
- return bulkApplyTemplate(data);
- };
-
- bulkApplyToSelected = (permissionTemplate: string) => {
- const { selection } = this.props;
- let lastRequest = Promise.resolve();
-
- selection.forEach(projectKey => {
- const data = {
- organization: this.props.organization,
- projectKey,
- templateId: permissionTemplate
- };
- lastRequest = lastRequest.then(() => applyTemplateToProject(data));
- });
-
- return lastRequest;
- };
-
handleCancelClick = (event: React.SyntheticEvent<HTMLAnchorElement>) => {
event.preventDefault();
this.props.onClose();
const { permissionTemplate } = this.state;
if (permissionTemplate) {
this.setState({ submitting: true });
- const request = this.props.selection.length
- ? this.bulkApplyToSelected(permissionTemplate)
- : this.bulkApplyToAll(permissionTemplate);
- request.then(
+ const parameters = this.props.selection.length
+ ? {
+ organization: this.props.organization,
+ projects: this.props.selection.join(),
+ templateId: permissionTemplate
+ }
+ : {
+ analyzedBefore: this.props.analyzedBefore,
+ onProvisionedOnly: this.props.provisioned || undefined,
+ organization: this.props.organization,
+ qualifiers: this.props.qualifier,
+ q: this.props.query || undefined,
+ templateId: permissionTemplate
+ };
+ bulkApplyTemplate(parameters).then(
() => {
if (this.mounted) {
this.setState({ done: true, submitting: false });
this.setState({ permissionTemplate: value });
};
- renderWarning = () => {
- return this.props.selection.length
- ? <div className="alert alert-info">
- {translateWithParameters(
+ renderWarning = () =>
+ <div className="alert alert-warning modal-alert">
+ <AlertWarnIcon className="spacer-right" />
+ {this.props.selection.length
+ ? translateWithParameters(
'permission_templates.bulk_apply_permission_template.apply_to_selected',
this.props.selection.length
- )}
- </div>
- : <div className="alert alert-warning">
- {translateWithParameters(
+ )
+ : translateWithParameters(
'permission_templates.bulk_apply_permission_template.apply_to_all',
this.props.total
)}
- </div>;
- };
+ </div>;
renderSelect = () =>
<div className="modal-field">
import * as React from 'react';
import Modal from 'react-modal';
import * as classNames from 'classnames';
-import { Organization } from '../../app/types';
+import { Organization, Visibility } from '../../app/types';
import UpgradeOrganizationBox from '../../components/common/UpgradeOrganizationBox';
import { translate } from '../../helpers/l10n';
-import { Visibility } from './utils';
export interface Props {
onClose: () => void;
*/
import * as React from 'react';
import Modal from 'react-modal';
-import { deleteComponents } from '../../api/components';
-import { translate } from '../../helpers/l10n';
+import { bulkDeleteProjects } from '../../api/components';
+import { translate, translateWithParameters } from '../../helpers/l10n';
+import AlertWarnIcon from '../../components/icons-components/AlertWarnIcon';
export interface Props {
+ analyzedBefore?: string;
onClose: () => void;
onConfirm: () => void;
organization: string;
+ provisioned: boolean;
qualifier: string;
+ query: string;
selection: string[];
+ total: number;
}
interface State {
handleConfirmClick = () => {
this.setState({ loading: true });
- deleteComponents(this.props.selection, this.props.organization).then(
+ const parameters = this.props.selection.length
+ ? {
+ organization: this.props.organization,
+ projects: this.props.selection.join()
+ }
+ : {
+ analyzedBefore: this.props.analyzedBefore,
+ onProvisionedOnly: this.props.provisioned || undefined,
+ organization: this.props.organization,
+ qualifiers: this.props.qualifier,
+ q: this.props.query || undefined
+ };
+ bulkDeleteProjects(parameters).then(
() => {
if (this.mounted) {
this.props.onConfirm();
);
};
+ renderWarning = () =>
+ <div className="alert alert-warning modal-alert">
+ <AlertWarnIcon className="spacer-right" />
+ {this.props.selection.length
+ ? translateWithParameters(
+ 'projects_management.delete_selected_warning',
+ this.props.selection.length
+ )
+ : translateWithParameters('projects_management.delete_all_warning', this.props.total)}
+ </div>;
+
render() {
const header = translate('qualifiers.delete', this.props.qualifier);
</header>
<div className="modal-body">
+ {this.renderWarning()}
{translate('qualifiers.delete_confirm', this.props.qualifier)}
</div>
*/
import * as React from 'react';
import ChangeVisibilityForm from './ChangeVisibilityForm';
-import { Visibility } from './utils';
-import { Organization } from '../../app/types';
+import { Organization, Visibility } from '../../app/types';
import { translate } from '../../helpers/l10n';
export interface Props {
*/
import * as React from 'react';
import { Link } from 'react-router';
-import { Project, Visibility } from './utils';
+import { Project } from './utils';
+import { Visibility } from '../../app/types';
import PrivateBadge from '../../components/common/PrivateBadge';
import Checkbox from '../../components/controls/Checkbox';
import QualifierIcon from '../../components/shared/QualifierIcon';
inputClassName="input-medium"
name="analyzed-before"
onChange={this.props.onDateChanged}
- placeholder={translate('analyzed_before')}
+ placeholder={translate('last_analysis_before')}
value={this.props.analyzedBefore}
/>
</td>
};
render() {
- const isSomethingSelected = this.props.projects.length > 0 && this.props.selection.length > 0;
return (
<div className="big-spacer-bottom">
<table className="data">
<td className="thin nowrap text-middle">
<button
className="spacer-right js-bulk-apply-permission-template"
+ disabled={this.props.total === 0}
onClick={this.handleBulkApplyTemplateClick}>
{translate('permission_templates.bulk_apply_permission_template')}
</button>
<button
- onClick={this.handleDeleteClick}
className="js-delete button-red"
- disabled={!isSomethingSelected}>
+ disabled={this.props.total === 0}
+ onClick={this.handleDeleteClick}>
{translate('delete')}
</button>
</td>
{this.state.bulkApplyTemplateModal &&
<BulkApplyTemplateModal
+ analyzedBefore={this.props.analyzedBefore}
onClose={this.closeBulkApplyTemplateModal}
organization={this.props.organization.key}
provisioned={this.props.provisioned}
{this.state.deleteModal &&
<DeleteModal
+ analyzedBefore={this.props.analyzedBefore}
onClose={this.closeDeleteModal}
onConfirm={this.handleDeleteConfirm}
organization={this.props.organization.key}
+ provisioned={this.props.provisioned}
qualifier={this.props.qualifiers}
+ query={this.props.query}
selection={this.props.selection}
+ total={this.props.total}
/>}
</div>
);
}
}));
-jest.mock('../../../api/components', () => ({
- getComponents: jest.fn(),
- getProvisioned: jest.fn(() => Promise.resolve({ paging: { total: 0 }, projects: [] }))
-}));
+jest.mock('../../../api/components', () => ({ getComponents: jest.fn() }));
import * as React from 'react';
import { mount } from 'enzyme';
import App, { Props } from '../App';
const getComponents = require('../../../api/components').getComponents as jest.Mock<any>;
-const getProvisioned = require('../../../api/components').getProvisioned as jest.Mock<any>;
const organization = { key: 'org', name: 'org', projectVisibility: 'public' };
getComponents
.mockImplementation(() => Promise.resolve({ paging: { total: 0 }, components: [] }))
.mockClear();
- getProvisioned.mockClear();
});
it('fetches all projects on mount', () => {
it('selects provisioned', () => {
const wrapper = mountRender();
wrapper.find('Search').prop<Function>('onProvisionedChanged')(true);
- expect(getProvisioned).lastCalledWith(defaultSearchParameters);
+ expect(getComponents).lastCalledWith({
+ ...defaultSearchParameters,
+ onProvisionedOnly: true,
+ qualifiers: 'TRK'
+ });
});
it('changes qualifier and resets provisioned', () => {
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
jest.mock('../../../api/permissions', () => ({
- applyTemplateToProject: jest.fn(),
- bulkApplyTemplate: jest.fn(),
- getPermissionTemplates: jest.fn()
+ bulkApplyTemplate: jest.fn(() => Promise.resolve()),
+ getPermissionTemplates: jest.fn(() => Promise.resolve({ permissionTemplates: [] }))
}));
import * as React from 'react';
import BulkApplyTemplateModal, { Props } from '../BulkApplyTemplateModal';
import { click } from '../../../helpers/testUtils';
-const applyTemplateToProject = require('../../../api/permissions')
- .applyTemplateToProject as jest.Mock<any>;
const bulkApplyTemplate = require('../../../api/permissions').bulkApplyTemplate as jest.Mock<any>;
const getPermissionTemplates = require('../../../api/permissions')
.getPermissionTemplates as jest.Mock<any>;
beforeEach(() => {
- applyTemplateToProject.mockImplementation(() => Promise.resolve()).mockClear();
- bulkApplyTemplate.mockImplementation(() => Promise.resolve()).mockClear();
- getPermissionTemplates
- .mockImplementation(() => Promise.resolve({ permissionTemplates: [] }))
- .mockClear();
+ bulkApplyTemplate.mockClear();
+ getPermissionTemplates.mockClear();
});
it('fetches permission templates on mount', () => {
click(wrapper.find('button'));
expect(bulkApplyTemplate).toBeCalledWith({
+ analyzedBefore: '2017-04-08T00:00:00.000Z',
+ onProvisionedOnly: true,
organization: 'org',
q: 'bla',
- qualifier: 'TRK',
+ qualifiers: 'TRK',
templateId: 'foo'
});
expect(wrapper).toMatchSnapshot();
click(wrapper.find('button'));
expect(wrapper).toMatchSnapshot();
await new Promise(setImmediate);
- expect(applyTemplateToProject.mock.calls).toHaveLength(2);
- expect(applyTemplateToProject).toBeCalledWith({
- organization: 'org',
- projectKey: 'proj1',
- templateId: 'foo'
- });
- expect(applyTemplateToProject).toBeCalledWith({
+ expect(bulkApplyTemplate).toBeCalledWith({
organization: 'org',
- projectKey: 'proj2',
+ projects: 'proj1,proj2',
templateId: 'foo'
});
function render(props?: { [P in keyof Props]?: Props[P] }) {
return (
<BulkApplyTemplateModal
+ analyzedBefore="2017-04-08T00:00:00.000Z"
onClose={jest.fn()}
organization="org"
provisioned={true}
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
jest.mock('../../../api/components', () => ({
- deleteComponents: jest.fn(() => Promise.resolve())
+ bulkDeleteProjects: jest.fn(() => Promise.resolve())
}));
import * as React from 'react';
import DeleteModal, { Props } from '../DeleteModal';
import { click } from '../../../helpers/testUtils';
-const deleteComponents = require('../../../api/components').deleteComponents as jest.Mock<any>;
+const bulkDeleteProjects = require('../../../api/components').bulkDeleteProjects as jest.Mock<any>;
-it('deletes projects', async () => {
+beforeEach(() => {
+ bulkDeleteProjects.mockClear();
+});
+
+it('deletes all projects', async () => {
const onConfirm = jest.fn();
const wrapper = shallowRender({ onConfirm });
(wrapper.instance() as DeleteModal).mounted = true;
click(wrapper.find('button'));
expect(wrapper).toMatchSnapshot();
- expect(deleteComponents).toBeCalledWith(['foo', 'bar'], 'org');
+ expect(bulkDeleteProjects).toBeCalledWith({
+ analyzedBefore: '2017-04-08T00:00:00.000Z',
+ onProvisionedOnly: undefined,
+ organization: 'org',
+ q: 'bla',
+ qualifiers: 'TRK'
+ });
+
+ await new Promise(setImmediate);
+ expect(onConfirm).toBeCalled();
+});
+
+it('deletes selected projects', async () => {
+ const onConfirm = jest.fn();
+ const wrapper = shallowRender({ onConfirm, selection: ['proj1', 'proj2'] });
+ (wrapper.instance() as DeleteModal).mounted = true;
+ expect(wrapper).toMatchSnapshot();
+
+ click(wrapper.find('button'));
+ expect(wrapper).toMatchSnapshot();
+ expect(bulkDeleteProjects).toBeCalledWith({ organization: 'org', projects: 'proj1,proj2' });
await new Promise(setImmediate);
expect(onConfirm).toBeCalled();
function shallowRender(props?: { [P in keyof Props]?: Props[P] }) {
return shallow(
<DeleteModal
+ analyzedBefore="2017-04-08T00:00:00.000Z"
onClose={jest.fn()}
onConfirm={jest.fn()}
organization="org"
+ provisioned={false}
qualifier="TRK"
- selection={['foo', 'bar']}
+ query="bla"
+ selection={[]}
+ total={17}
{...props}
/>
);
import * as React from 'react';
import { shallow } from 'enzyme';
import Header, { Props } from '../Header';
-import { Visibility } from '../utils';
+import { Visibility } from '../../../app/types';
import { click } from '../../../helpers/testUtils';
const organization = { key: 'org', name: 'org', projectVisibility: 'public' };
import * as React from 'react';
import { shallow } from 'enzyme';
import ProjectRow from '../ProjectRow';
-import { Visibility } from '../utils';
+import { Visibility } from '../../../app/types';
import { click } from '../../../helpers/testUtils';
const project = {
import * as React from 'react';
import { shallow } from 'enzyme';
import Projects from '../Projects';
-import { Visibility } from '../utils';
import ApplyTemplateView from '../../permissions/project/views/ApplyTemplateView';
+import { Visibility } from '../../../app/types';
const organization = { key: 'org', name: 'org', projectVisibility: 'public' };
const projects = [
ready={true}
selection={[]}
topLevelQualifiers={['TRK']}
- total={0}
+ total={17}
{...props}
/>
);
className="modal-body"
>
<div
- className="alert alert-warning"
+ className="alert alert-warning modal-alert"
>
+ <AlertWarnIcon
+ className="spacer-right"
+ />
permission_templates.bulk_apply_permission_template.apply_to_all.17
</div>
<div
className="modal-body"
>
<div
- className="alert alert-warning"
+ className="alert alert-warning modal-alert"
>
+ <AlertWarnIcon
+ className="spacer-right"
+ />
permission_templates.bulk_apply_permission_template.apply_to_all.17
</div>
<div
className="modal-body"
>
<div
- className="alert alert-info"
+ className="alert alert-warning modal-alert"
>
+ <AlertWarnIcon
+ className="spacer-right"
+ />
permission_templates.bulk_apply_permission_template.apply_to_selected.2
</div>
<div
className="modal-body"
>
<div
- className="alert alert-info"
+ className="alert alert-warning modal-alert"
>
+ <AlertWarnIcon
+ className="spacer-right"
+ />
permission_templates.bulk_apply_permission_template.apply_to_selected.2
</div>
<div
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`deletes projects 1`] = `
+exports[`deletes all projects 1`] = `
<Modal
ariaHideApp={true}
bodyOpenClassName="ReactModal__Body--open"
<div
className="modal-body"
>
+ <div
+ className="alert alert-warning modal-alert"
+ >
+ <AlertWarnIcon
+ className="spacer-right"
+ />
+ projects_management.delete_all_warning.17
+ </div>
qualifiers.delete_confirm.TRK
</div>
<footer
</Modal>
`;
-exports[`deletes projects 2`] = `
+exports[`deletes all projects 2`] = `
<Modal
ariaHideApp={true}
bodyOpenClassName="ReactModal__Body--open"
<div
className="modal-body"
>
+ <div
+ className="alert alert-warning modal-alert"
+ >
+ <AlertWarnIcon
+ className="spacer-right"
+ />
+ projects_management.delete_all_warning.17
+ </div>
+ qualifiers.delete_confirm.TRK
+ </div>
+ <footer
+ className="modal-foot"
+ >
+ <i
+ className="spinner spacer-right"
+ />
+ <button
+ className="button-red"
+ disabled={true}
+ onClick={[Function]}
+ >
+ delete
+ </button>
+ <a
+ className="js-modal-close"
+ href="#"
+ onClick={[Function]}
+ >
+ cancel
+ </a>
+ </footer>
+</Modal>
+`;
+
+exports[`deletes selected projects 1`] = `
+<Modal
+ ariaHideApp={true}
+ bodyOpenClassName="ReactModal__Body--open"
+ className="modal"
+ closeTimeoutMS={0}
+ contentLabel="qualifiers.delete.TRK"
+ isOpen={true}
+ onRequestClose={[Function]}
+ overlayClassName="modal-overlay"
+ parentSelector={[Function]}
+ portalClassName="ReactModalPortal"
+ shouldCloseOnOverlayClick={true}
+>
+ <header
+ className="modal-head"
+ >
+ <h2>
+ qualifiers.delete.TRK
+ </h2>
+ </header>
+ <div
+ className="modal-body"
+ >
+ <div
+ className="alert alert-warning modal-alert"
+ >
+ <AlertWarnIcon
+ className="spacer-right"
+ />
+ projects_management.delete_selected_warning.2
+ </div>
+ qualifiers.delete_confirm.TRK
+ </div>
+ <footer
+ className="modal-foot"
+ >
+ <button
+ className="button-red"
+ disabled={false}
+ onClick={[Function]}
+ >
+ delete
+ </button>
+ <a
+ className="js-modal-close"
+ href="#"
+ onClick={[Function]}
+ >
+ cancel
+ </a>
+ </footer>
+</Modal>
+`;
+
+exports[`deletes selected projects 2`] = `
+<Modal
+ ariaHideApp={true}
+ bodyOpenClassName="ReactModal__Body--open"
+ className="modal"
+ closeTimeoutMS={0}
+ contentLabel="qualifiers.delete.TRK"
+ isOpen={true}
+ onRequestClose={[Function]}
+ overlayClassName="modal-overlay"
+ parentSelector={[Function]}
+ portalClassName="ReactModalPortal"
+ shouldCloseOnOverlayClick={true}
+>
+ <header
+ className="modal-head"
+ >
+ <h2>
+ qualifiers.delete.TRK
+ </h2>
+ </header>
+ <div
+ className="modal-body"
+ >
+ <div
+ className="alert alert-warning modal-alert"
+ >
+ <AlertWarnIcon
+ className="spacer-right"
+ />
+ projects_management.delete_selected_warning.2
+ </div>
qualifiers.delete_confirm.TRK
</div>
<footer
qualifier="TRK"
query=""
selection={Array []}
- total={0}
+ total={17}
/>
`;
onClose={[Function]}
onConfirm={[Function]}
organization="org"
+ provisioned={false}
qualifier="TRK"
+ query=""
selection={
Array [
"foo",
"bar",
]
}
+ total={17}
/>
`;
>
<button
className="spacer-right js-bulk-apply-permission-template"
+ disabled={false}
onClick={[Function]}
>
permission_templates.bulk_apply_permission_template
</button>
<button
className="js-delete button-red"
- disabled={true}
+ disabled={false}
onClick={[Function]}
>
delete
>
<button
className="spacer-right js-bulk-apply-permission-template"
+ disabled={false}
onClick={[Function]}
>
permission_templates.bulk_apply_permission_template
</button>
<button
className="js-delete button-red"
- disabled={true}
+ disabled={false}
onClick={[Function]}
>
delete
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+import { SearchProjectsResponseComponent } from '../../api/components';
+
export const PAGE_SIZE = 50;
export const QUALIFIERS_ORDER = ['TRK', 'VW', 'APP'];
-export interface Project {
- key: string;
- lastAnalysisDate?: string;
- name: string;
- qualifier: string;
- visibility: Visibility;
-}
-
-export enum Visibility {
- Public = 'public',
- Private = 'private'
-}
+export type Project = SearchProjectsResponseComponent;
vertical-align: middle;
}
+.modal-alert {
+ margin: -10px -10px 16px;
+ padding: 10px;
+ border-top: none;
+ border-left: none;
+ border-right: none;
+}
+
// Color
.alert-emphasis-variant(@color, @background-color, @border-color) {
added_since_version=Added since version {0}
all_violations=All violations
all_issues=All issues
-analyzed_before=Analyzed before
and_worse=and worse
are_you_sure=Are you sure?
assigned_to=Assigned to
greater_or_equals=Greater or equals
greater_than=Greater than
help_tips=Help tips
+last_analysis_before=Last analysis before
less_or_equals=Less or equals
less_than=Less than
logging_out=You're logging out, please wait...
project_deletion.delete_resource_confirmation=Are you sure you want to delete "{0}"?
projects_management.delete_resource_confirmation=Are you sure you want to delete "{0}"?
+projects_management.delete_selected_warning=You're about to delete {0} selected items.
+projects_management.delete_all_warning=You're about to delete all {0} items.
#------------------------------------------------------------------------------