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,
sourceFilter,
sourceCategoryFilter,
tagFilter,
textSearchFilter,
selectAllFilters} from '../stores/filters';
import { maxScores } from '../inputs/scores';
@ -48,6 +49,7 @@
case 'method': methodFilter.selectOne(item); break;
case 'source': sourceFilter.selectOne(item); break;
case 'sourceCategory': sourceCategoryFilter.selectOne(item); break;
case 'tag': tagFilter.selectOne(item); break;
}
}
@ -204,6 +206,16 @@
<h3>Description</h3>
<p>{@html highlight($tooltip.tp.shortDescription)}</p>
</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">
<h3>Platforms</h3>
<ul>

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

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

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

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

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

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

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

@ -70,7 +70,8 @@ const loadData = async () => {
attribution_methodology: +d.attribution_methodology,
attribution_open_source: +d.attribution_open_source,
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,
sources,
sourceCategories,
tags,
attributionScores,
textSearch,
contextData,
@ -13,7 +14,7 @@ export const urlFromFilters = (disinformantNations,
const params = {
ts: encodeURIComponent(textSearch),
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
};
@ -33,7 +34,7 @@ export const binaryToBool = (binary) => binary.split('').map((d) => d === '0' ?
export const parseUrl = (hash) => {
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 {
disinformantNations: binaryToBool(hexToBinary(disinformantNations)),
@ -41,6 +42,7 @@ export const parseUrl = (hash) => {
methods: binaryToBool(hexToBinary(methods)),
sources: binaryToBool(hexToBinary(sources)),
sourceCategories: binaryToBool(hexToBinary(sourceCategories)),
tags: binaryToBool(hexToBinary(tags)),
contextData: binaryToBool(hexToBinary(contextData)),
caseId: caseId === '' ? undefined : +caseId,
textSearch: decodeURIComponent(textSearch),