blob: 000f9acb6b6e235c73f74a4f56c6e2fe275cff1a [file] [log] [blame]
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:html';
class Filter {
final List<String> configurations;
final List<String> configurationGroups;
final bool showLatestFailures;
final bool showUnapprovedOnly;
final String singleTest; // null by default.
Filter(this.configurations, this.configurationGroups, this.showLatestFailures,
this.showUnapprovedOnly, this.singleTest);
static final defaultFilter = Filter(
[], [], defaultShowLatestFailures, defaultShowUnapprovedOnly, null);
bool get hasFilter =>
singleTest != null ||
configurations.isNotEmpty ||
configurationGroups.isNotEmpty;
Filter copy(
{List<String> configurations,
List<String> configurationGroups,
bool showLatestFailures,
bool showUnapprovedOnly,
String singleTest}) =>
Filter(
configurations ?? this.configurations,
configurationGroups ?? this.configurationGroups,
showLatestFailures ?? this.showLatestFailures,
showUnapprovedOnly ?? this.showUnapprovedOnly,
singleTest ?? this.singleTest); // Cannot reset singleTest to null.
Filter clearTest() => Filter(configurations, configurationGroups,
showLatestFailures, showUnapprovedOnly, null);
String fragment() => [
if (showLatestFailures != defaultShowLatestFailures)
'showLatestFailures=$showLatestFailures',
if (showUnapprovedOnly != defaultShowUnapprovedOnly)
'showUnapprovedOnly=$showUnapprovedOnly',
if (configurations.isNotEmpty)
'configurations=${configurations.join(',')}',
if (configurationGroups.isNotEmpty)
'configurationGroups=${configurationGroups.join(',')}',
if (singleTest != null) 'test=$singleTest'
].join('&');
void updateUrl() {
window.location.hash = fragment();
}
factory Filter.fromUrl() {
final fragment = Uri.parse(window.location.href).fragment;
var result = defaultFilter;
if (fragment.isEmpty) return result;
for (final setting in fragment.split('&')) {
final key = setting.split('=').first;
final value = setting.split('=').last;
if (key == 'showLatestFailures') {
result = result.copy(showLatestFailures: value == 'true');
} else if (key == 'showUnapprovedOnly') {
result = result.copy(showUnapprovedOnly: value == 'true');
} else if (key == 'configurations') {
final configurations = value.split(',');
result = result.copy(configurations: configurations);
} else if (key == 'configurationGroups') {
final configurationGroups = value.split(',');
result = result.copy(configurationGroups: configurationGroups);
} else if (key == 'test') {
result = result.copy(singleTest: value);
}
}
return result;
}
static const defaultShowLatestFailures = true;
static const defaultShowUnapprovedOnly = false;
static const allConfigurationGroups = <String>[
'analyzer',
'app_jitk',
'cfe',
'dart2js',
'dartdevc',
'dartdevk',
'dartk',
'dartkb',
'dartkp',
'fasta',
'unittest',
'vm'
];
}
class FilterService {
FilterService();
Filter filter = Filter.fromUrl();
void changeFilter(Filter newFilter) {
newFilter.updateUrl();
if (newFilter.singleTest != filter.singleTest) {
window.location.reload();
}
filter = newFilter;
}
void addConfiguration(String configuration) {
if (configuration.endsWith('-')) {
changeFilter(filter.copy(
configurationGroups: [configuration, ...filter.configurationGroups]));
} else {
changeFilter(filter
.copy(configurations: [configuration, ...filter.configurations]));
}
}
void removeConfiguration(String configuration) {
changeFilter(filter.copy(
configurationGroups: List.from(filter.configurationGroups)
..remove(configuration),
configurations: List.from(filter.configurations)
..remove(configuration)));
}
void setTestFilter(String test) {
changeFilter(filter.copy(singleTest: test));
}
void clearTestFilter() {
changeFilter(filter.clearTest());
}
}