implement case tags and an internal tags filter
Этот коммит содержится в:
родитель
a3d8810ee0
Коммит
ba72a454e2
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
@ -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),
|
||||
|
||||
Загрузка…
x
Ссылка в новой задаче
Block a user