implement case tags and an internal tags filter

Этот коммит содержится в:
higsch 2020-10-25 21:53:29 +01:00
родитель a3d8810ee0
Коммит ba72a454e2
9 изменённых файлов: 36 добавлений и 11 удалений

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -11,6 +11,7 @@
methodFilter, methodFilter,
sourceFilter, sourceFilter,
sourceCategoryFilter, sourceCategoryFilter,
tagFilter,
textSearchFilter, textSearchFilter,
selectAllFilters} from '../stores/filters'; selectAllFilters} from '../stores/filters';
import { maxScores } from '../inputs/scores'; import { maxScores } from '../inputs/scores';
@ -48,6 +49,7 @@
case 'method': methodFilter.selectOne(item); break; case 'method': methodFilter.selectOne(item); break;
case 'source': sourceFilter.selectOne(item); break; case 'source': sourceFilter.selectOne(item); break;
case 'sourceCategory': sourceCategoryFilter.selectOne(item); break; case 'sourceCategory': sourceCategoryFilter.selectOne(item); break;
case 'tag': tagFilter.selectOne(item); break;
} }
} }
@ -204,6 +206,16 @@
<h3>Description</h3> <h3>Description</h3>
<p>{@html highlight($tooltip.tp.shortDescription)}</p> <p>{@html highlight($tooltip.tp.shortDescription)}</p>
</div> </div>
{#if (!($tooltip.tp.tags.length === 1 && $tooltip.tp.tags[0] === 'unspecified'))}
<div class="tags">
<h3>Tags</h3>
<ul>
{#each $tooltip.tp.tags as tag (tag)}
<li class="card" on:click|self={() => handleLiClick('tag', tag)}>{@html highlight(tag)}</li>
{/each}
</ul>
</div>
{/if}
<div class="platforms"> <div class="platforms">
<h3>Platforms</h3> <h3>Platforms</h3>
<ul> <ul>

Просмотреть файл

@ -5,6 +5,7 @@
methodFilter, methodFilter,
sourceFilter, sourceFilter,
sourceCategoryFilter, sourceCategoryFilter,
tagFilter,
attributionScoreFilter, attributionScoreFilter,
attributionScoreDef, attributionScoreDef,
textSearchFilter, textSearchFilter,
@ -32,6 +33,7 @@
$methodFilter, $methodFilter,
$sourceFilter, $sourceFilter,
$sourceCategoryFilter, $sourceCategoryFilter,
$tagFilter,
$attributionScoreFilter, $attributionScoreFilter,
$textSearchFilter, $textSearchFilter,
$contextData, $contextData,

Просмотреть файл

@ -34,7 +34,8 @@
textSearchFilter, textSearchFilter,
originalTimeDomain, originalTimeDomain,
contextData, contextData,
caseIdFilter } from '../stores/filters'; caseIdFilter,
tagFilter } from '../stores/filters';
import { haveOverlap, withinRange, includesTextSearch, isCaseId, preloadImages } from '../utils/misc'; import { haveOverlap, withinRange, includesTextSearch, isCaseId, preloadImages } from '../utils/misc';
import { selected } from '../stores/eventSelections'; import { selected } from '../stores/eventSelections';
import { drawWrapper } from '../stores/elements'; import { drawWrapper } from '../stores/elements';
@ -88,8 +89,9 @@
methodFilter.init(data, 'methods'); methodFilter.init(data, 'methods');
sourceFilter.init(data, 'sourceFilter'); sourceFilter.init(data, 'sourceFilter');
sourceCategoryFilter.init(data, 'sourceCategory'); sourceCategoryFilter.init(data, 'sourceCategory');
tagFilter.init(data, 'tags');
$attributionScoreFilter = attributionScoreDef; $attributionScoreFilter = attributionScoreDef;
// get context datasets // get context datasets
$contextData = [ $contextData = [
{ {
@ -119,6 +121,7 @@
methodFilter.applyBoolArray(urlFilters.methods); methodFilter.applyBoolArray(urlFilters.methods);
sourceFilter.applyBoolArray(urlFilters.sources); sourceFilter.applyBoolArray(urlFilters.sources);
sourceCategoryFilter.applyBoolArray(urlFilters.sourceCategories); sourceCategoryFilter.applyBoolArray(urlFilters.sourceCategories);
tagFilter.applyBoolArray(urlFilters.tags);
contextData.applyBoolArray(urlFilters.contextData); contextData.applyBoolArray(urlFilters.contextData);
$attributionScoreFilter = urlFilters.attributionScores; $attributionScoreFilter = urlFilters.attributionScores;
$textSearchFilter = urlFilters.textSearch; $textSearchFilter = urlFilters.textSearch;
@ -188,6 +191,7 @@
&& haveOverlap($methodFilter, d.methods) && haveOverlap($methodFilter, d.methods)
&& haveOverlap($sourceFilter, d.sourceFilter) && haveOverlap($sourceFilter, d.sourceFilter)
&& haveOverlap($sourceCategoryFilter, d.sourceCategory) && haveOverlap($sourceCategoryFilter, d.sourceCategory)
&& haveOverlap($tagFilter, d.tags)
&& includesTextSearch($textSearchFilter, d.search) && includesTextSearch($textSearchFilter, d.search)
&& withinRange($attributionScoreFilter, d.attributionScore) && withinRange($attributionScoreFilter, d.attributionScore)
&& isCaseId($caseIdFilter, d.id) && isCaseId($caseIdFilter, d.id)

Просмотреть файл

@ -59,6 +59,8 @@ export const sourceFilter = createInclusiveFilter();
export const sourceCategoryFilter = createInclusiveFilter(); export const sourceCategoryFilter = createInclusiveFilter();
export const tagFilter = createInclusiveFilter();
export const attributionScoreFilter = createRangeFilter(); export const attributionScoreFilter = createRangeFilter();
export const attributionScoreDef = [0, 18]; export const attributionScoreDef = [0, 18];
@ -68,6 +70,7 @@ export const unselectAllFilters = (disinformantNation = true) => {
methodFilter.unselectAll(); methodFilter.unselectAll();
sourceFilter.unselectAll(); sourceFilter.unselectAll();
sourceCategoryFilter.unselectAll(); sourceCategoryFilter.unselectAll();
tagFilter.unselectAll();
attributionScoreFilter.set(attributionScoreDef); attributionScoreFilter.set(attributionScoreDef);
}; };
@ -77,6 +80,7 @@ export const selectAllFilters = (disinformantNation = true) => {
methodFilter.selectAll(); methodFilter.selectAll();
sourceFilter.selectAll(); sourceFilter.selectAll();
sourceCategoryFilter.selectAll(); sourceCategoryFilter.selectAll();
tagFilter.selectAll();
attributionScoreFilter.set(attributionScoreDef); attributionScoreFilter.set(attributionScoreDef);
textSearchFilter.reset(); textSearchFilter.reset();
caseIdFilter.set(undefined); caseIdFilter.set(undefined);

Просмотреть файл

@ -70,7 +70,8 @@ const loadData = async () => {
attribution_methodology: +d.attribution_methodology, attribution_methodology: +d.attribution_methodology,
attribution_open_source: +d.attribution_open_source, attribution_open_source: +d.attribution_open_source,
attribution_acknowledge_limitations: +d.attribution_acknowledge_limitations, attribution_acknowledge_limitations: +d.attribution_acknowledge_limitations,
attribution_corroboration: +d.attribution_corroboration attribution_corroboration: +d.attribution_corroboration,
tags: splitString(d.tags)
}; };
}); });

Просмотреть файл

@ -6,6 +6,7 @@ export const urlFromFilters = (disinformantNations,
methods, methods,
sources, sources,
sourceCategories, sourceCategories,
tags,
attributionScores, attributionScores,
textSearch, textSearch,
contextData, contextData,
@ -13,7 +14,7 @@ export const urlFromFilters = (disinformantNations,
const params = { const params = {
ts: encodeURIComponent(textSearch), ts: encodeURIComponent(textSearch),
as: [attributionScores[0], attributionScores[1]].join(';'), as: [attributionScores[0], attributionScores[1]].join(';'),
f: filtersToHex([disinformantNations, platforms, methods, sources, sourceCategories, contextData]), f: filtersToHex([disinformantNations, platforms, methods, sources, sourceCategories, tags, contextData]),
id: caseId id: caseId
}; };
@ -33,7 +34,7 @@ export const binaryToBool = (binary) => binary.split('').map((d) => d === '0' ?
export const parseUrl = (hash) => { export const parseUrl = (hash) => {
const s = hash.substring(1); const s = hash.substring(1);
const [ disinformantNations, platforms, methods, sources, sourceCategories, contextData, caseId, textSearch, attributionScores] = s.split('-'); const [ disinformantNations, platforms, methods, sources, sourceCategories, tags, contextData, caseId, textSearch, attributionScores] = s.split('-');
return { return {
disinformantNations: binaryToBool(hexToBinary(disinformantNations)), disinformantNations: binaryToBool(hexToBinary(disinformantNations)),
@ -41,6 +42,7 @@ export const parseUrl = (hash) => {
methods: binaryToBool(hexToBinary(methods)), methods: binaryToBool(hexToBinary(methods)),
sources: binaryToBool(hexToBinary(sources)), sources: binaryToBool(hexToBinary(sources)),
sourceCategories: binaryToBool(hexToBinary(sourceCategories)), sourceCategories: binaryToBool(hexToBinary(sourceCategories)),
tags: binaryToBool(hexToBinary(tags)),
contextData: binaryToBool(hexToBinary(contextData)), contextData: binaryToBool(hexToBinary(contextData)),
caseId: caseId === '' ? undefined : +caseId, caseId: caseId === '' ? undefined : +caseId,
textSearch: decodeURIComponent(textSearch), textSearch: decodeURIComponent(textSearch),