зеркало из https://github.com/mozilla/treeherder.git
Bug 1507406 - ESLint: Enforce more strict import style (#4279)
Imports must now be grouped like so (with newlines between each): ``` // "external" modules import _ from 'lodash'; import chalk from 'chalk'; // modules from a "parent" directory import foo from '../foo'; import qux from '../../foo/qux'; // "sibling" modules from the same or a sibling's directory import bar from './bar'; import baz from './bar/baz'; ``` The `import/order` rule has auto-fix support, so any errors can be resolved using `yarn lint --fix`. See: https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/order.md
This commit is contained in:
Родитель
4e3bcfa1a8
Коммит
4db0cfa973
|
@ -47,5 +47,13 @@ module.exports = {
|
||||||
'react/jsx-one-expression-per-line': 'off',
|
'react/jsx-one-expression-per-line': 'off',
|
||||||
'react/jsx-wrap-multilines': 'off',
|
'react/jsx-wrap-multilines': 'off',
|
||||||
'react/no-access-state-in-setstate': 'off',
|
'react/no-access-state-in-setstate': 'off',
|
||||||
|
// Override AirBnB's config for this rule to make it more strict.
|
||||||
|
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/order.md
|
||||||
|
'import/order': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
'newlines-between': 'always',
|
||||||
|
},
|
||||||
|
],
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -35,3 +35,8 @@ UI
|
||||||
--
|
--
|
||||||
|
|
||||||
We use the [Airbnb](https://github.com/airbnb/javascript) style guide for Javascript and validate it with ESlint (see Validating Javascript in the [Installation section](installation.html#validating-javascript)). For CSS, we use [reactstrap](https://reactstrap.github.io/) and Bootstrap's utility classes as much as possible before adding custom CSS to a style sheet. Any custom style that can be made reusable should be named generically and stored in the ``ui/css/treeherder-global.css`` file.
|
We use the [Airbnb](https://github.com/airbnb/javascript) style guide for Javascript and validate it with ESlint (see Validating Javascript in the [Installation section](installation.html#validating-javascript)). For CSS, we use [reactstrap](https://reactstrap.github.io/) and Bootstrap's utility classes as much as possible before adding custom CSS to a style sheet. Any custom style that can be made reusable should be named generically and stored in the ``ui/css/treeherder-global.css`` file.
|
||||||
|
|
||||||
|
Imports in JS/JSX must be ordered like so (with newlines between each group):
|
||||||
|
1. external modules (eg `'react'`)
|
||||||
|
2. modules from a parent directory (eg `'../foo'`)
|
||||||
|
3. "sibling" modules from the same or a sibling's directory (eg `'./bar'` or './bar/baz')
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { OIDCCredentialAgent, Queue } from 'taskcluster-client-web';
|
import { OIDCCredentialAgent, Queue } from 'taskcluster-client-web';
|
||||||
|
|
||||||
import { tcRootUrl, getUserSessionUrl } from './url';
|
import { tcRootUrl, getUserSessionUrl } from './url';
|
||||||
|
|
||||||
const taskcluster = (() => {
|
const taskcluster = (() => {
|
||||||
|
|
|
@ -4,8 +4,9 @@ import { Link } from 'react-router-dom';
|
||||||
import Icon from 'react-fontawesome';
|
import Icon from 'react-fontawesome';
|
||||||
import ReactTable from 'react-table';
|
import ReactTable from 'react-table';
|
||||||
|
|
||||||
import { calculateMetrics, prettyDate, tableRowStyling } from './helpers';
|
|
||||||
import { bugDetailsEndpoint, getJobsUrl } from '../helpers/url';
|
import { bugDetailsEndpoint, getJobsUrl } from '../helpers/url';
|
||||||
|
|
||||||
|
import { calculateMetrics, prettyDate, tableRowStyling } from './helpers';
|
||||||
import BugLogColumn from './BugLogColumn';
|
import BugLogColumn from './BugLogColumn';
|
||||||
import Layout from './Layout';
|
import Layout from './Layout';
|
||||||
import withView from './View';
|
import withView from './View';
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { Tooltip } from 'reactstrap';
|
import { Tooltip } from 'reactstrap';
|
||||||
|
|
||||||
import { getLogViewerUrl } from '../helpers/url';
|
import { getLogViewerUrl } from '../helpers/url';
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,9 +3,9 @@ import 'react-day-picker/lib/style.css';
|
||||||
import DayPickerInput from 'react-day-picker/DayPickerInput';
|
import DayPickerInput from 'react-day-picker/DayPickerInput';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import { parseDate, formatDate } from 'react-day-picker/moment';
|
import { parseDate, formatDate } from 'react-day-picker/moment';
|
||||||
import { Button } from 'reactstrap';
|
import { Button } from 'reactstrap';
|
||||||
|
|
||||||
import { ISODate } from './helpers';
|
import { ISODate } from './helpers';
|
||||||
|
|
||||||
export default class DateRangePicker extends React.Component {
|
export default class DateRangePicker extends React.Component {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { Alert } from 'reactstrap';
|
import { Alert } from 'reactstrap';
|
||||||
|
|
||||||
import { processErrorMessage } from './helpers';
|
import { processErrorMessage } from './helpers';
|
||||||
|
|
||||||
const ErrorMessages = ({ failureMessage, failureStatus, errorMessages }) => {
|
const ErrorMessages = ({ failureMessage, failureStatus, errorMessages }) => {
|
||||||
|
|
|
@ -3,11 +3,12 @@ import { Container } from 'reactstrap';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import Icon from 'react-fontawesome';
|
import Icon from 'react-fontawesome';
|
||||||
|
|
||||||
|
import ErrorBoundary from '../shared/ErrorBoundary';
|
||||||
|
|
||||||
import Navigation from './Navigation';
|
import Navigation from './Navigation';
|
||||||
import GraphsContainer from './GraphsContainer';
|
import GraphsContainer from './GraphsContainer';
|
||||||
import ErrorMessages from './ErrorMessages';
|
import ErrorMessages from './ErrorMessages';
|
||||||
import { prettyErrorMessages, errorMessageClass } from './constants';
|
import { prettyErrorMessages, errorMessageClass } from './constants';
|
||||||
import ErrorBoundary from '../shared/ErrorBoundary';
|
|
||||||
|
|
||||||
const Layout = (props) => {
|
const Layout = (props) => {
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,10 @@ import PropTypes from 'prop-types';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import ReactTable from 'react-table';
|
import ReactTable from 'react-table';
|
||||||
|
|
||||||
|
import { bugsEndpoint } from '../helpers/url';
|
||||||
|
|
||||||
import BugColumn from './BugColumn';
|
import BugColumn from './BugColumn';
|
||||||
import { calculateMetrics, prettyDate, ISODate, tableRowStyling } from './helpers';
|
import { calculateMetrics, prettyDate, ISODate, tableRowStyling } from './helpers';
|
||||||
import { bugsEndpoint } from '../helpers/url';
|
|
||||||
import withView from './View';
|
import withView from './View';
|
||||||
import Layout from './Layout';
|
import Layout from './Layout';
|
||||||
import DateRangePicker from './DateRangePicker';
|
import DateRangePicker from './DateRangePicker';
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import { updateQueryParams, validateQueryParams, mergeData, formatBugs } from './helpers';
|
|
||||||
import { graphsEndpoint, parseQueryParams, createQueryParams, createApiUrl,
|
import { graphsEndpoint, parseQueryParams, createQueryParams, createApiUrl,
|
||||||
bugzillaBugsApi } from '../helpers/url';
|
bugzillaBugsApi } from '../helpers/url';
|
||||||
import { getData } from '../helpers/http';
|
import { getData } from '../helpers/http';
|
||||||
|
|
||||||
|
import { updateQueryParams, validateQueryParams, mergeData, formatBugs } from './helpers';
|
||||||
|
|
||||||
const withView = defaultState => WrappedComponent =>
|
const withView = defaultState => WrappedComponent =>
|
||||||
class View extends React.Component {
|
class View extends React.Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
|
|
||||||
import { prettyErrorMessages } from './constants';
|
import { prettyErrorMessages } from './constants';
|
||||||
|
|
||||||
// be sure to wrap date arg in a moment()
|
// be sure to wrap date arg in a moment()
|
||||||
|
|
|
@ -3,24 +3,25 @@ import { hot } from 'react-hot-loader';
|
||||||
import SplitPane from 'react-split-pane';
|
import SplitPane from 'react-split-pane';
|
||||||
|
|
||||||
import { thFavicons } from '../helpers/constants';
|
import { thFavicons } from '../helpers/constants';
|
||||||
import { Pushes } from './context/Pushes';
|
|
||||||
import { SelectedJob } from './context/SelectedJob';
|
|
||||||
import { PinnedJobs } from './context/PinnedJobs';
|
|
||||||
import { Notifications } from '../shared/context/Notifications';
|
import { Notifications } from '../shared/context/Notifications';
|
||||||
|
import NotificationList from '../shared/NotificationList';
|
||||||
|
import ShortcutTable from '../shared/ShortcutTable';
|
||||||
import { matchesDefaults } from '../helpers/filter';
|
import { matchesDefaults } from '../helpers/filter';
|
||||||
import { getAllUrlParams, getRepo } from '../helpers/location';
|
import { getAllUrlParams, getRepo } from '../helpers/location';
|
||||||
import { deployedRevisionUrl } from '../helpers/url';
|
import { deployedRevisionUrl } from '../helpers/url';
|
||||||
import ClassificationTypeModel from '../models/classificationType';
|
import ClassificationTypeModel from '../models/classificationType';
|
||||||
import FilterModel from '../models/filter';
|
import FilterModel from '../models/filter';
|
||||||
import RepositoryModel from '../models/repository';
|
import RepositoryModel from '../models/repository';
|
||||||
|
|
||||||
|
import { Pushes } from './context/Pushes';
|
||||||
|
import { SelectedJob } from './context/SelectedJob';
|
||||||
|
import { PinnedJobs } from './context/PinnedJobs';
|
||||||
import PrimaryNavBar from './headerbars/PrimaryNavBar';
|
import PrimaryNavBar from './headerbars/PrimaryNavBar';
|
||||||
import ActiveFilters from './headerbars/ActiveFilters';
|
import ActiveFilters from './headerbars/ActiveFilters';
|
||||||
import UpdateAvailable from './headerbars/UpdateAvailable';
|
import UpdateAvailable from './headerbars/UpdateAvailable';
|
||||||
import DetailsPanel from './details/DetailsPanel';
|
import DetailsPanel from './details/DetailsPanel';
|
||||||
import PushList from './pushes/PushList';
|
import PushList from './pushes/PushList';
|
||||||
import KeyboardShortcuts from './KeyboardShortcuts';
|
import KeyboardShortcuts from './KeyboardShortcuts';
|
||||||
import NotificationList from '../shared/NotificationList';
|
|
||||||
import ShortcutTable from '../shared/ShortcutTable';
|
|
||||||
|
|
||||||
const DEFAULT_DETAILS_PCT = 40;
|
const DEFAULT_DETAILS_PCT = 40;
|
||||||
const REVISION_POLL_INTERVAL = 1000 * 60 * 5;
|
const REVISION_POLL_INTERVAL = 1000 * 60 * 5;
|
||||||
|
|
|
@ -11,9 +11,10 @@ import {
|
||||||
|
|
||||||
import { formatTaskclusterError } from '../helpers/errorMessage';
|
import { formatTaskclusterError } from '../helpers/errorMessage';
|
||||||
import TaskclusterModel from '../models/taskcluster';
|
import TaskclusterModel from '../models/taskcluster';
|
||||||
import { withPushes } from './context/Pushes';
|
|
||||||
import { withNotifications } from '../shared/context/Notifications';
|
import { withNotifications } from '../shared/context/Notifications';
|
||||||
|
|
||||||
|
import { withPushes } from './context/Pushes';
|
||||||
|
|
||||||
class CustomJobActions extends React.PureComponent {
|
class CustomJobActions extends React.PureComponent {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
|
|
|
@ -3,9 +3,10 @@ import PropTypes from 'prop-types';
|
||||||
import { HotKeys } from 'react-hotkeys';
|
import { HotKeys } from 'react-hotkeys';
|
||||||
|
|
||||||
import { thEvents } from '../helpers/constants';
|
import { thEvents } from '../helpers/constants';
|
||||||
|
import { withNotifications } from '../shared/context/Notifications';
|
||||||
|
|
||||||
import { withPinnedJobs } from './context/PinnedJobs';
|
import { withPinnedJobs } from './context/PinnedJobs';
|
||||||
import { withSelectedJob } from './context/SelectedJob';
|
import { withSelectedJob } from './context/SelectedJob';
|
||||||
import { withNotifications } from '../shared/context/Notifications';
|
|
||||||
|
|
||||||
const keyMap = {
|
const keyMap = {
|
||||||
addRelatedBug: 'b',
|
addRelatedBug: 'b',
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import { withNotifications } from '../../shared/context/Notifications';
|
import { withNotifications } from '../../shared/context/Notifications';
|
||||||
|
|
||||||
const COUNT_ERROR = 'Max pinboard size of 500 reached.';
|
const COUNT_ERROR = 'Max pinboard size of 500 reached.';
|
||||||
|
|
|
@ -15,9 +15,10 @@ import { getUrlParam, setUrlParam } from '../../helpers/location';
|
||||||
import { getJobsUrl } from '../../helpers/url';
|
import { getJobsUrl } from '../../helpers/url';
|
||||||
import JobModel from '../../models/job';
|
import JobModel from '../../models/job';
|
||||||
import PushModel from '../../models/push';
|
import PushModel from '../../models/push';
|
||||||
|
import { withNotifications } from '../../shared/context/Notifications';
|
||||||
|
|
||||||
import { withPinnedJobs } from './PinnedJobs';
|
import { withPinnedJobs } from './PinnedJobs';
|
||||||
import { withPushes } from './Pushes';
|
import { withPushes } from './Pushes';
|
||||||
import { withNotifications } from '../../shared/context/Notifications';
|
|
||||||
|
|
||||||
const SelectedJobContext = React.createContext({});
|
const SelectedJobContext = React.createContext({});
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ import chunk from 'lodash/chunk';
|
||||||
import { thEvents, thBugSuggestionLimit } from '../../helpers/constants';
|
import { thEvents, thBugSuggestionLimit } from '../../helpers/constants';
|
||||||
import { withPinnedJobs } from '../context/PinnedJobs';
|
import { withPinnedJobs } from '../context/PinnedJobs';
|
||||||
import { withSelectedJob } from '../context/SelectedJob';
|
import { withSelectedJob } from '../context/SelectedJob';
|
||||||
|
import { withPushes } from '../context/Pushes';
|
||||||
import { getLogViewerUrl, getReftestUrl } from '../../helpers/url';
|
import { getLogViewerUrl, getReftestUrl } from '../../helpers/url';
|
||||||
import BugJobMapModel from '../../models/bugJobMap';
|
import BugJobMapModel from '../../models/bugJobMap';
|
||||||
import BugSuggestionsModel from '../../models/bugSuggestions';
|
import BugSuggestionsModel from '../../models/bugSuggestions';
|
||||||
|
@ -14,10 +15,10 @@ import JobDetailModel from '../../models/jobDetail';
|
||||||
import JobLogUrlModel from '../../models/jobLogUrl';
|
import JobLogUrlModel from '../../models/jobLogUrl';
|
||||||
import TextLogStepModel from '../../models/textLogStep';
|
import TextLogStepModel from '../../models/textLogStep';
|
||||||
import PerfSeriesModel from '../../models/perfSeries';
|
import PerfSeriesModel from '../../models/perfSeries';
|
||||||
|
|
||||||
import PinBoard from './PinBoard';
|
import PinBoard from './PinBoard';
|
||||||
import SummaryPanel from './summary/SummaryPanel';
|
import SummaryPanel from './summary/SummaryPanel';
|
||||||
import TabsPanel from './tabs/TabsPanel';
|
import TabsPanel from './tabs/TabsPanel';
|
||||||
import { withPushes } from '../context/Pushes';
|
|
||||||
|
|
||||||
export const pinboardHeight = 100;
|
export const pinboardHeight = 100;
|
||||||
|
|
||||||
|
|
|
@ -9,12 +9,13 @@ import { getInspectTaskUrl, getReftestUrl } from '../../../helpers/url';
|
||||||
import JobModel from '../../../models/job';
|
import JobModel from '../../../models/job';
|
||||||
import TaskclusterModel from '../../../models/taskcluster';
|
import TaskclusterModel from '../../../models/taskcluster';
|
||||||
import CustomJobActions from '../../CustomJobActions';
|
import CustomJobActions from '../../CustomJobActions';
|
||||||
import LogUrls from './LogUrls';
|
|
||||||
import { withSelectedJob } from '../../context/SelectedJob';
|
import { withSelectedJob } from '../../context/SelectedJob';
|
||||||
import { withPinnedJobs } from '../../context/PinnedJobs';
|
import { withPinnedJobs } from '../../context/PinnedJobs';
|
||||||
import { withPushes } from '../../context/Pushes';
|
import { withPushes } from '../../context/Pushes';
|
||||||
import { withNotifications } from '../../../shared/context/Notifications';
|
import { withNotifications } from '../../../shared/context/Notifications';
|
||||||
|
|
||||||
|
import LogUrls from './LogUrls';
|
||||||
|
|
||||||
class ActionBar extends React.PureComponent {
|
class ActionBar extends React.PureComponent {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
|
|
|
@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import { withSelectedJob } from '../../context/SelectedJob';
|
import { withSelectedJob } from '../../context/SelectedJob';
|
||||||
import JobInfo from '../../../shared/JobInfo';
|
import JobInfo from '../../../shared/JobInfo';
|
||||||
|
|
||||||
import ActionBar from './ActionBar';
|
import ActionBar from './ActionBar';
|
||||||
import ClassificationsPanel from './ClassificationsPanel';
|
import ClassificationsPanel from './ClassificationsPanel';
|
||||||
import StatusPanel from './StatusPanel';
|
import StatusPanel from './StatusPanel';
|
||||||
|
|
|
@ -5,15 +5,15 @@ import { Tab, Tabs, TabList, TabPanel } from 'react-tabs';
|
||||||
import { thEvents } from '../../../helpers/constants';
|
import { thEvents } from '../../../helpers/constants';
|
||||||
import { getAllUrlParams } from '../../../helpers/location';
|
import { getAllUrlParams } from '../../../helpers/location';
|
||||||
import { getStatus } from '../../../helpers/job';
|
import { getStatus } from '../../../helpers/job';
|
||||||
|
|
||||||
import JobDetails from '../../../shared/JobDetails';
|
import JobDetails from '../../../shared/JobDetails';
|
||||||
|
import { withPinnedJobs } from '../../context/PinnedJobs';
|
||||||
|
import { withSelectedJob } from '../../context/SelectedJob';
|
||||||
|
|
||||||
import FailureSummaryTab from './failureSummary/FailureSummaryTab';
|
import FailureSummaryTab from './failureSummary/FailureSummaryTab';
|
||||||
import PerformanceTab from './PerformanceTab';
|
import PerformanceTab from './PerformanceTab';
|
||||||
import AutoclassifyTab from './autoclassify/AutoclassifyTab';
|
import AutoclassifyTab from './autoclassify/AutoclassifyTab';
|
||||||
import AnnotationsTab from './AnnotationsTab';
|
import AnnotationsTab from './AnnotationsTab';
|
||||||
import SimilarJobsTab from './SimilarJobsTab';
|
import SimilarJobsTab from './SimilarJobsTab';
|
||||||
import { withPinnedJobs } from '../../context/PinnedJobs';
|
|
||||||
import { withSelectedJob } from '../../context/SelectedJob';
|
|
||||||
|
|
||||||
class TabsPanel extends React.Component {
|
class TabsPanel extends React.Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
|
|
@ -5,13 +5,13 @@ import React from 'react';
|
||||||
import { thEvents } from '../../../../helpers/constants';
|
import { thEvents } from '../../../../helpers/constants';
|
||||||
import { getProjectJobUrl } from '../../../../helpers/url';
|
import { getProjectJobUrl } from '../../../../helpers/url';
|
||||||
import TextLogErrorsModel from '../../../../models/textLogErrors';
|
import TextLogErrorsModel from '../../../../models/textLogErrors';
|
||||||
|
import { withSelectedJob } from '../../../context/SelectedJob';
|
||||||
|
import { withPinnedJobs } from '../../../context/PinnedJobs';
|
||||||
|
import { withNotifications } from '../../../../shared/context/Notifications';
|
||||||
|
|
||||||
import AutoclassifyToolbar from './AutoclassifyToolbar';
|
import AutoclassifyToolbar from './AutoclassifyToolbar';
|
||||||
import ErrorLine from './ErrorLine';
|
import ErrorLine from './ErrorLine';
|
||||||
import ErrorLineData from './ErrorLineModel';
|
import ErrorLineData from './ErrorLineModel';
|
||||||
import { withSelectedJob } from '../../../context/SelectedJob';
|
|
||||||
import { withPinnedJobs } from '../../../context/PinnedJobs';
|
|
||||||
import { withNotifications } from '../../../../shared/context/Notifications';
|
|
||||||
|
|
||||||
class AutoclassifyTab extends React.Component {
|
class AutoclassifyTab extends React.Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
|
|
@ -5,11 +5,11 @@ import { FormGroup } from 'reactstrap';
|
||||||
import { thEvents } from '../../../../helpers/constants';
|
import { thEvents } from '../../../../helpers/constants';
|
||||||
import { stringOverlap, highlightLogLine } from '../../../../helpers/autoclassify';
|
import { stringOverlap, highlightLogLine } from '../../../../helpers/autoclassify';
|
||||||
import { getBugUrl, getLogViewerUrl } from '../../../../helpers/url';
|
import { getBugUrl, getLogViewerUrl } from '../../../../helpers/url';
|
||||||
|
import { withSelectedJob } from '../../../context/SelectedJob';
|
||||||
|
|
||||||
import LineOption from './LineOption';
|
import LineOption from './LineOption';
|
||||||
import LineOptionModel from './LineOptionModel';
|
import LineOptionModel from './LineOptionModel';
|
||||||
import StaticLineOption from './StaticLineOption';
|
import StaticLineOption from './StaticLineOption';
|
||||||
import { withSelectedJob } from '../../../context/SelectedJob';
|
|
||||||
|
|
||||||
const GOOD_MATCH_SCORE = 0.75;
|
const GOOD_MATCH_SCORE = 0.75;
|
||||||
const BAD_MATCH_SCORE = 0.25;
|
const BAD_MATCH_SCORE = 0.25;
|
||||||
|
|
|
@ -4,13 +4,13 @@ import PropTypes from 'prop-types';
|
||||||
import { thEvents } from '../../../../helpers/constants';
|
import { thEvents } from '../../../../helpers/constants';
|
||||||
import { isReftest } from '../../../../helpers/job';
|
import { isReftest } from '../../../../helpers/job';
|
||||||
import { getBugUrl } from '../../../../helpers/url';
|
import { getBugUrl } from '../../../../helpers/url';
|
||||||
|
import { withSelectedJob } from '../../../context/SelectedJob';
|
||||||
|
import { withPinnedJobs } from '../../../context/PinnedJobs';
|
||||||
|
import BugFiler from '../../BugFiler';
|
||||||
|
|
||||||
import ErrorsList from './ErrorsList';
|
import ErrorsList from './ErrorsList';
|
||||||
import ListItem from './ListItem';
|
import ListItem from './ListItem';
|
||||||
import SuggestionsListItem from './SuggestionsListItem';
|
import SuggestionsListItem from './SuggestionsListItem';
|
||||||
import BugFiler from '../../BugFiler';
|
|
||||||
import { withSelectedJob } from '../../../context/SelectedJob';
|
|
||||||
import { withPinnedJobs } from '../../../context/PinnedJobs';
|
|
||||||
|
|
||||||
class FailureSummaryTab extends React.Component {
|
class FailureSummaryTab extends React.Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
|
|
@ -2,6 +2,7 @@ import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import { thBugSuggestionLimit } from '../../../../helpers/constants';
|
import { thBugSuggestionLimit } from '../../../../helpers/constants';
|
||||||
|
|
||||||
import BugListItem from './BugListItem';
|
import BugListItem from './BugListItem';
|
||||||
|
|
||||||
export default class SuggestionsListItem extends React.Component {
|
export default class SuggestionsListItem extends React.Component {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import PropTypes from 'prop-types';
|
||||||
import Logo from '../../img/treeherder-logo.png';
|
import Logo from '../../img/treeherder-logo.png';
|
||||||
import Login from '../../shared/auth/Login';
|
import Login from '../../shared/auth/Login';
|
||||||
import LogoMenu from '../../shared/LogoMenu';
|
import LogoMenu from '../../shared/LogoMenu';
|
||||||
|
|
||||||
import NotificationsMenu from './NotificationsMenu';
|
import NotificationsMenu from './NotificationsMenu';
|
||||||
import InfraMenu from './InfraMenu';
|
import InfraMenu from './InfraMenu';
|
||||||
import ReposMenu from './ReposMenu';
|
import ReposMenu from './ReposMenu';
|
||||||
|
|
|
@ -10,9 +10,10 @@ import {
|
||||||
} from '../../helpers/location';
|
} from '../../helpers/location';
|
||||||
import RepositoryModel from '../../models/repository';
|
import RepositoryModel from '../../models/repository';
|
||||||
import ErrorBoundary from '../../shared/ErrorBoundary';
|
import ErrorBoundary from '../../shared/ErrorBoundary';
|
||||||
import WatchedRepo from './WatchedRepo';
|
|
||||||
import { withPushes } from '../context/Pushes';
|
import { withPushes } from '../context/Pushes';
|
||||||
|
|
||||||
|
import WatchedRepo from './WatchedRepo';
|
||||||
|
|
||||||
const MAX_WATCHED_REPOS = 3;
|
const MAX_WATCHED_REPOS = 3;
|
||||||
const WATCHED_REPOS_STORAGE_KEY = 'thWatchedRepos';
|
const WATCHED_REPOS_STORAGE_KEY = 'thWatchedRepos';
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import { getBtnClass, findJobInstance } from '../../helpers/job';
|
import { getBtnClass, findJobInstance } from '../../helpers/job';
|
||||||
import { getUrlParam } from '../../helpers/location';
|
import { getUrlParam } from '../../helpers/location';
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import { withSelectedJob } from '../context/SelectedJob';
|
||||||
import { thFailureResults } from '../../helpers/constants';
|
import { thFailureResults } from '../../helpers/constants';
|
||||||
import { getBtnClass, getStatus } from '../../helpers/job';
|
import { getBtnClass, getStatus } from '../../helpers/job';
|
||||||
import { getUrlParam } from '../../helpers/location';
|
import { getUrlParam } from '../../helpers/location';
|
||||||
|
|
||||||
import JobButton from './JobButton';
|
import JobButton from './JobButton';
|
||||||
import JobCount from './JobCount';
|
import JobCount from './JobCount';
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
|
import { getStatus } from '../../helpers/job';
|
||||||
|
|
||||||
import JobButton from './JobButton';
|
import JobButton from './JobButton';
|
||||||
import JobGroup from './JobGroup';
|
import JobGroup from './JobGroup';
|
||||||
import { getStatus } from '../../helpers/job';
|
|
||||||
|
|
||||||
export default class JobsAndGroups extends React.Component {
|
export default class JobsAndGroups extends React.Component {
|
||||||
render() {
|
render() {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
import JobsAndGroups from './JobsAndGroups';
|
import JobsAndGroups from './JobsAndGroups';
|
||||||
|
|
||||||
function PlatformName(props) {
|
function PlatformName(props) {
|
||||||
|
|
|
@ -2,9 +2,6 @@ import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import sortBy from 'lodash/sortBy';
|
import sortBy from 'lodash/sortBy';
|
||||||
|
|
||||||
import PushJobs from './PushJobs';
|
|
||||||
import PushHeader from './PushHeader';
|
|
||||||
import { RevisionList } from './RevisionList';
|
|
||||||
import { thEvents, thOptionOrder, thPlatformMap } from '../../helpers/constants';
|
import { thEvents, thOptionOrder, thPlatformMap } from '../../helpers/constants';
|
||||||
import { withPushes } from '../context/Pushes';
|
import { withPushes } from '../context/Pushes';
|
||||||
import { escapeId, getGroupMapKey } from '../../helpers/aggregateId';
|
import { escapeId, getGroupMapKey } from '../../helpers/aggregateId';
|
||||||
|
@ -15,6 +12,10 @@ import { withNotifications } from '../../shared/context/Notifications';
|
||||||
import { getRevisionTitle } from '../../helpers/revision';
|
import { getRevisionTitle } from '../../helpers/revision';
|
||||||
import { getPercentComplete } from '../../helpers/display';
|
import { getPercentComplete } from '../../helpers/display';
|
||||||
|
|
||||||
|
import PushHeader from './PushHeader';
|
||||||
|
import PushJobs from './PushJobs';
|
||||||
|
import { RevisionList } from './RevisionList';
|
||||||
|
|
||||||
const watchCycleStates = ['none', 'push', 'job', 'none'];
|
const watchCycleStates = ['none', 'push', 'job', 'none'];
|
||||||
const platformArray = Object.values(thPlatformMap);
|
const platformArray = Object.values(thPlatformMap);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import { getUrlParam } from '../../helpers/location';
|
import { getUrlParam } from '../../helpers/location';
|
||||||
import { formatTaskclusterError } from '../../helpers/errorMessage';
|
import { formatTaskclusterError } from '../../helpers/errorMessage';
|
||||||
import CustomJobActions from '../CustomJobActions';
|
import CustomJobActions from '../CustomJobActions';
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import PushActionMenu from './PushActionMenu';
|
|
||||||
import { getPercentComplete, toDateStr } from '../../helpers/display';
|
import { getPercentComplete, toDateStr } from '../../helpers/display';
|
||||||
import { formatTaskclusterError } from '../../helpers/errorMessage';
|
import { formatTaskclusterError } from '../../helpers/errorMessage';
|
||||||
import { getJobsUrl } from '../../helpers/url';
|
import { getJobsUrl } from '../../helpers/url';
|
||||||
|
@ -11,6 +11,8 @@ import { withSelectedJob } from '../context/SelectedJob';
|
||||||
import { withPushes } from '../context/Pushes';
|
import { withPushes } from '../context/Pushes';
|
||||||
import { withNotifications } from '../../shared/context/Notifications';
|
import { withNotifications } from '../../shared/context/Notifications';
|
||||||
|
|
||||||
|
import PushActionMenu from './PushActionMenu';
|
||||||
|
|
||||||
// url params we don't want added from the current querystring to the revision
|
// url params we don't want added from the current querystring to the revision
|
||||||
// and author links.
|
// and author links.
|
||||||
const SKIPPED_LINK_PARAMS = [
|
const SKIPPED_LINK_PARAMS = [
|
||||||
|
|
|
@ -9,9 +9,10 @@ import { findInstance, findSelectedInstance } from '../../helpers/job';
|
||||||
import { getUrlParam } from '../../helpers/location';
|
import { getUrlParam } from '../../helpers/location';
|
||||||
import { getLogViewerUrl } from '../../helpers/url';
|
import { getLogViewerUrl } from '../../helpers/url';
|
||||||
import JobModel from '../../models/job';
|
import JobModel from '../../models/job';
|
||||||
import Platform from './Platform';
|
|
||||||
import { withPushes } from '../context/Pushes';
|
import { withPushes } from '../context/Pushes';
|
||||||
|
|
||||||
|
import Platform from './Platform';
|
||||||
|
|
||||||
class PushJobs extends React.Component {
|
class PushJobs extends React.Component {
|
||||||
static getDerivedStateFromProps(nextProps) {
|
static getDerivedStateFromProps(nextProps) {
|
||||||
const { filterModel, push, platforms, runnableVisible } = nextProps;
|
const { filterModel, push, platforms, runnableVisible } = nextProps;
|
||||||
|
|
|
@ -2,9 +2,10 @@ import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import ErrorBoundary from '../../shared/ErrorBoundary';
|
import ErrorBoundary from '../../shared/ErrorBoundary';
|
||||||
|
import { withPushes } from '../context/Pushes';
|
||||||
|
|
||||||
import Push from './Push';
|
import Push from './Push';
|
||||||
import PushLoadErrors from './PushLoadErrors';
|
import PushLoadErrors from './PushLoadErrors';
|
||||||
import { withPushes } from '../context/Pushes';
|
|
||||||
|
|
||||||
class PushList extends React.Component {
|
class PushList extends React.Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
|
|
@ -2,9 +2,10 @@
|
||||||
/* eslint-disable func-names, prefer-arrow-callback */
|
/* eslint-disable func-names, prefer-arrow-callback */
|
||||||
import numeral from 'numeral';
|
import numeral from 'numeral';
|
||||||
|
|
||||||
import treeherder from './treeherder';
|
|
||||||
import { getJobsUrl } from '../helpers/url';
|
import { getJobsUrl } from '../helpers/url';
|
||||||
|
|
||||||
|
import treeherder from './treeherder';
|
||||||
|
|
||||||
treeherder.filter('getRevisionUrl', function () {
|
treeherder.filter('getRevisionUrl', function () {
|
||||||
return function (revision, projectName) {
|
return function (revision, projectName) {
|
||||||
if (revision) {
|
if (revision) {
|
||||||
|
|
|
@ -7,6 +7,7 @@ import LocalStorageModule from 'angular-local-storage';
|
||||||
import { react2angular } from 'react2angular/index.es2015';
|
import { react2angular } from 'react2angular/index.es2015';
|
||||||
|
|
||||||
import Login from '../shared/auth/Login';
|
import Login from '../shared/auth/Login';
|
||||||
|
|
||||||
import treeherderModule from './treeherder';
|
import treeherderModule from './treeherder';
|
||||||
|
|
||||||
const perf = angular.module('perf', [
|
const perf = angular.module('perf', [
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
// Remove the eslint-disable when rewriting this file during the React conversion.
|
// Remove the eslint-disable when rewriting this file during the React conversion.
|
||||||
/* eslint-disable func-names, prefer-arrow-callback */
|
/* eslint-disable func-names, prefer-arrow-callback */
|
||||||
import perf from './perf';
|
|
||||||
import alertsCtrlTemplate from '../partials/perf/alertsctrl.html';
|
import alertsCtrlTemplate from '../partials/perf/alertsctrl.html';
|
||||||
import graphsCtrlTemplate from '../partials/perf/graphsctrl.html';
|
import graphsCtrlTemplate from '../partials/perf/graphsctrl.html';
|
||||||
import compareCtrlTemplate from '../partials/perf/comparectrl.html';
|
import compareCtrlTemplate from '../partials/perf/comparectrl.html';
|
||||||
|
@ -10,6 +9,8 @@ import compareSubtestDistributionTemplate from '../partials/perf/comparesubtestd
|
||||||
import helpMenuTemplate from '../partials/perf/helpMenu.html';
|
import helpMenuTemplate from '../partials/perf/helpMenu.html';
|
||||||
import tooltipGraphsTemplate from '../partials/perf/tooltipgraphs.html';
|
import tooltipGraphsTemplate from '../partials/perf/tooltipgraphs.html';
|
||||||
|
|
||||||
|
import perf from './perf';
|
||||||
|
|
||||||
// configure the router here, after we have defined all the controllers etc
|
// configure the router here, after we have defined all the controllers etc
|
||||||
perf.config(['$compileProvider', '$locationProvider', '$httpProvider', '$stateProvider', '$urlRouterProvider',
|
perf.config(['$compileProvider', '$locationProvider', '$httpProvider', '$stateProvider', '$urlRouterProvider',
|
||||||
function ($compileProvider, $locationProvider, $httpProvider, $stateProvider, $urlRouterProvider) {
|
function ($compileProvider, $locationProvider, $httpProvider, $stateProvider, $urlRouterProvider) {
|
||||||
|
|
|
@ -12,6 +12,7 @@ import PushModel from '../models/push';
|
||||||
import TextLogStepModel from '../models/textLogStep';
|
import TextLogStepModel from '../models/textLogStep';
|
||||||
import JobDetails from '../shared/JobDetails';
|
import JobDetails from '../shared/JobDetails';
|
||||||
import JobInfo from '../shared/JobInfo';
|
import JobInfo from '../shared/JobInfo';
|
||||||
|
|
||||||
import Navigation from './Navigation';
|
import Navigation from './Navigation';
|
||||||
import ErrorLines from './ErrorLines';
|
import ErrorLines from './ErrorLines';
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { thPlatformMap } from '../helpers/constants';
|
import { thPlatformMap } from '../helpers/constants';
|
||||||
import { createQueryParams, getProjectUrl } from '../helpers/url';
|
import { createQueryParams, getProjectUrl } from '../helpers/url';
|
||||||
import { formatTaskclusterError } from '../helpers/errorMessage';
|
import { formatTaskclusterError } from '../helpers/errorMessage';
|
||||||
|
|
||||||
import TaskclusterModel from './taskcluster';
|
import TaskclusterModel from './taskcluster';
|
||||||
|
|
||||||
const uri = getProjectUrl('/jobs/');
|
const uri = getProjectUrl('/jobs/');
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import queryString from 'query-string';
|
import queryString from 'query-string';
|
||||||
|
|
||||||
import { getApiUrl, getProjectUrl } from '../helpers/url';
|
import { getApiUrl, getProjectUrl } from '../helpers/url';
|
||||||
|
|
||||||
import OptionCollectionModel from './optionCollection';
|
import OptionCollectionModel from './optionCollection';
|
||||||
|
|
||||||
export const getTestName = function getTestName(signatureProps) {
|
export const getTestName = function getTestName(signatureProps) {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { thMaxPushFetchSize } from '../helpers/constants';
|
||||||
import { getUrlParam } from '../helpers/location';
|
import { getUrlParam } from '../helpers/location';
|
||||||
import taskcluster from '../helpers/taskcluster';
|
import taskcluster from '../helpers/taskcluster';
|
||||||
import { createQueryParams, getProjectUrl } from '../helpers/url';
|
import { createQueryParams, getProjectUrl } from '../helpers/url';
|
||||||
|
|
||||||
import JobModel from './job';
|
import JobModel from './job';
|
||||||
import TaskclusterModel from './taskcluster';
|
import TaskclusterModel from './taskcluster';
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { getProjectUrl } from '../helpers/url';
|
import { getProjectUrl } from '../helpers/url';
|
||||||
|
|
||||||
import JobModel from './job';
|
import JobModel from './job';
|
||||||
|
|
||||||
const uri = getProjectUrl('/runnable_jobs/');
|
const uri = getProjectUrl('/runnable_jobs/');
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
import chunk from 'lodash/chunk';
|
import chunk from 'lodash/chunk';
|
||||||
|
|
||||||
import { tValueCareMin, tValueConfidence } from './constants';
|
|
||||||
import { getApiUrl, createQueryParams } from '../helpers/url';
|
import { getApiUrl, createQueryParams } from '../helpers/url';
|
||||||
import { getData } from '../helpers/http';
|
import { getData } from '../helpers/http';
|
||||||
import PerfSeriesModel from '../models/perfSeries';
|
import PerfSeriesModel from '../models/perfSeries';
|
||||||
import { phTimeRanges } from '../helpers/constants';
|
import { phTimeRanges } from '../helpers/constants';
|
||||||
|
|
||||||
|
import { tValueCareMin, tValueConfidence } from './constants';
|
||||||
|
|
||||||
export const calcPercentOf = function calcPercentOf(a, b) {
|
export const calcPercentOf = function calcPercentOf(a, b) {
|
||||||
return b ? 100 * a / b : 0;
|
return b ? 100 * a / b : 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,13 +2,14 @@ import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import isEqual from 'lodash/isEqual';
|
import isEqual from 'lodash/isEqual';
|
||||||
|
|
||||||
import AuthService from './AuthService';
|
|
||||||
import { loggedOutUser } from '../../helpers/auth';
|
import { loggedOutUser } from '../../helpers/auth';
|
||||||
import taskcluster from '../../helpers/taskcluster';
|
import taskcluster from '../../helpers/taskcluster';
|
||||||
import { getApiUrl, loginCallbackUrl } from '../../helpers/url';
|
import { getApiUrl, loginCallbackUrl } from '../../helpers/url';
|
||||||
import UserModel from '../../models/user';
|
import UserModel from '../../models/user';
|
||||||
import { withNotifications } from '../context/Notifications';
|
import { withNotifications } from '../context/Notifications';
|
||||||
|
|
||||||
|
import AuthService from './AuthService';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This component handles logging in to Taskcluster Authentication
|
* This component handles logging in to Taskcluster Authentication
|
||||||
*
|
*
|
||||||
|
|
|
@ -6,10 +6,12 @@ import {
|
||||||
} from 'redux';
|
} from 'redux';
|
||||||
import createHistory from 'history/createBrowserHistory';
|
import createHistory from 'history/createBrowserHistory';
|
||||||
import createDebounce from 'redux-debounce';
|
import createDebounce from 'redux-debounce';
|
||||||
import * as groupsStore from './modules/groups';
|
|
||||||
import { thPlatformMap } from '../../helpers/constants';
|
import { thPlatformMap } from '../../helpers/constants';
|
||||||
import { getServiceUrl, getProjectUrl } from '../../helpers/url';
|
import { getServiceUrl, getProjectUrl } from '../../helpers/url';
|
||||||
|
|
||||||
|
import * as groupsStore from './modules/groups';
|
||||||
|
|
||||||
function getGroupText(group) {
|
function getGroupText(group) {
|
||||||
const symbol = group.symbol.startsWith('tc-') ?
|
const symbol = group.symbol.startsWith('tc-') ?
|
||||||
group.symbol.substring(3) : group.symbol;
|
group.symbol.substring(3) : group.symbol;
|
||||||
|
|
|
@ -4,10 +4,11 @@ import { Form, FormGroup, Input, Label, Row, Col, Table, Container } from 'react
|
||||||
import Icon from 'react-fontawesome';
|
import Icon from 'react-fontawesome';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
|
|
||||||
|
import { store, actions } from '../redux/store';
|
||||||
|
|
||||||
import { Test, BugCount } from './Test';
|
import { Test, BugCount } from './Test';
|
||||||
import StatusProgress from './StatusProgress';
|
import StatusProgress from './StatusProgress';
|
||||||
import StatusNavbar from './StatusNavbar';
|
import StatusNavbar from './StatusNavbar';
|
||||||
import { store, actions } from '../redux/store';
|
|
||||||
|
|
||||||
const mapStateToProps = ({ groups }) => groups;
|
const mapStateToProps = ({ groups }) => groups;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Nav, Navbar, Collapse } from 'reactstrap';
|
import { Nav, Navbar, Collapse } from 'reactstrap';
|
||||||
|
|
||||||
import logoUrl from '../../img/treeherder-logo.png';
|
import logoUrl from '../../img/treeherder-logo.png';
|
||||||
|
|
||||||
export default class Navigation extends React.Component {
|
export default class Navigation extends React.Component {
|
||||||
|
|
|
@ -7,9 +7,9 @@ import { Badge } from 'reactstrap';
|
||||||
|
|
||||||
import { store, actions } from '../redux/store';
|
import { store, actions } from '../redux/store';
|
||||||
import { thPlatformMap } from '../../helpers/constants';
|
import { thPlatformMap } from '../../helpers/constants';
|
||||||
import LogViewer from './LogViewer';
|
|
||||||
import { getBugUrl } from '../../helpers/url';
|
import { getBugUrl } from '../../helpers/url';
|
||||||
|
|
||||||
|
import LogViewer from './LogViewer';
|
||||||
|
|
||||||
const mapStateToProps = ({ groups }) => ({
|
const mapStateToProps = ({ groups }) => ({
|
||||||
expanded: groups.expanded,
|
expanded: groups.expanded,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче