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,6 +89,7 @@ | |||||||
|     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 | ||||||
| @ -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
	 higsch
						higsch