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