@@ -176,6 +176,7 @@ interface ICodeSnippetDisplayState {
176
176
matchIndices : number [ ] [ ] ;
177
177
searchValue : string ;
178
178
filterTags : string [ ] ;
179
+ searchOptions : string [ ] ;
179
180
}
180
181
181
182
/**
@@ -194,12 +195,14 @@ export class CodeSnippetDisplay extends React.Component<
194
195
matchIndices : [ ] ,
195
196
searchValue : '' ,
196
197
filterTags : [ ] ,
198
+ searchOptions : [ ] ,
197
199
} ;
198
200
this . _drag = null ;
199
201
this . _dragData = null ;
200
202
this . handleDragMove = this . handleDragMove . bind ( this ) ;
201
203
this . _evtMouseUp = this . _evtMouseUp . bind ( this ) ;
202
204
this . handleRenameSnippet = this . handleRenameSnippet . bind ( this ) ;
205
+ this . setSearchOptions = this . setSearchOptions . bind ( this ) ;
203
206
}
204
207
205
208
// Handle code snippet insert into a notebook or document
@@ -1284,6 +1287,7 @@ export class CodeSnippetDisplay extends React.Component<
1284
1287
matchIndices : [ ] ,
1285
1288
searchValue : '' ,
1286
1289
filterTags : [ ] ,
1290
+ searchOptions : [ ] ,
1287
1291
} ;
1288
1292
}
1289
1293
@@ -1293,13 +1297,17 @@ export class CodeSnippetDisplay extends React.Component<
1293
1297
matchIndices : prevState . matchIndices ,
1294
1298
searchValue : prevState . searchValue ,
1295
1299
filterTags : prevState . filterTags ,
1300
+ searchOptions : prevState . searchOptions ,
1296
1301
} ;
1297
1302
}
1298
1303
return null ;
1299
1304
}
1300
1305
1301
- filterSnippets = ( searchValue : string , filterTags : string [ ] ) : void => {
1302
- // filter with search
1306
+ filterSnippets = (
1307
+ searchValue : string ,
1308
+ filterTags : string [ ] ,
1309
+ selectedLangTags : string [ ]
1310
+ ) : void => {
1303
1311
let matchIndices : number [ ] [ ] = [ ] ;
1304
1312
const matchResults : StringExt . IMatchResult [ ] = [ ] ;
1305
1313
let filteredSnippets = this . props . codeSnippets ;
@@ -1308,9 +1316,14 @@ export class CodeSnippetDisplay extends React.Component<
1308
1316
snippet : ICodeSnippet ;
1309
1317
} [ ] = [ ] ;
1310
1318
if ( searchValue !== '' ) {
1319
+ // language, title, code
1311
1320
filteredSnippets . forEach ( ( snippet ) => {
1312
1321
const matchResult = StringExt . matchSumOfSquares (
1313
- ( snippet . language + snippet . name ) . toLowerCase ( ) ,
1322
+ (
1323
+ snippet . language +
1324
+ snippet . name +
1325
+ snippet . code . join ( '\n' )
1326
+ ) . toLowerCase ( ) ,
1314
1327
searchValue . replace ( ' ' , '' ) . toLowerCase ( )
1315
1328
) ;
1316
1329
@@ -1336,14 +1349,35 @@ export class CodeSnippetDisplay extends React.Component<
1336
1349
matchResults . forEach ( ( res ) => matchIndices . push ( res . indices ) ) ;
1337
1350
}
1338
1351
1339
- // filter with tags
1340
1352
if ( filterTags . length !== 0 ) {
1341
1353
const newMatchIndices = matchIndices . slice ( ) ;
1342
1354
filteredSnippets = filteredSnippets . filter ( ( codeSnippet , id ) => {
1343
1355
return filterTags . some ( ( tag ) => {
1344
1356
if ( codeSnippet . tags ) {
1345
- if ( codeSnippet . tags . includes ( tag ) ) {
1346
- return true ;
1357
+ if ( selectedLangTags . length !== 0 ) {
1358
+ // lang tags selected
1359
+ console . log ( selectedLangTags ) ;
1360
+ if (
1361
+ codeSnippet . tags . includes ( tag ) &&
1362
+ selectedLangTags . includes ( codeSnippet . language )
1363
+ ) {
1364
+ return true ;
1365
+ } else if (
1366
+ filterTags . length === selectedLangTags . length &&
1367
+ filterTags . every ( ( value ) => selectedLangTags . includes ( value ) )
1368
+ ) {
1369
+ //if only language tags are selected
1370
+ console . log ( 'hi' ) ;
1371
+ if ( selectedLangTags . includes ( codeSnippet . language ) ) {
1372
+ return true ;
1373
+ }
1374
+ }
1375
+ } else {
1376
+ // no lang tags selected
1377
+ console . log ( 'reached' ) ;
1378
+ if ( codeSnippet . tags . includes ( tag ) ) {
1379
+ return true ;
1380
+ }
1347
1381
}
1348
1382
}
1349
1383
// if the snippet does not have the tag, remove its mathed index
@@ -1369,8 +1403,9 @@ export class CodeSnippetDisplay extends React.Component<
1369
1403
) ;
1370
1404
} ;
1371
1405
1372
- getActiveTags ( ) : string [ ] {
1406
+ getActiveTags ( ) : string [ ] [ ] {
1373
1407
const tags : string [ ] = [ ] ;
1408
+ const languages : string [ ] = [ ] ;
1374
1409
for ( const codeSnippet of this . props . codeSnippets ) {
1375
1410
if ( codeSnippet . tags ) {
1376
1411
for ( const tag of codeSnippet . tags ) {
@@ -1379,10 +1414,37 @@ export class CodeSnippetDisplay extends React.Component<
1379
1414
}
1380
1415
}
1381
1416
}
1417
+ if ( ! languages . includes ( codeSnippet . language ) ) {
1418
+ languages . push ( codeSnippet . language ) ;
1419
+ }
1382
1420
}
1383
- return tags ;
1421
+ return [ tags , languages ] ;
1384
1422
}
1385
1423
1424
+ getActiveTagsDictionary = ( ) : Map < string , string [ ] > => {
1425
+ const tagsAndLangs : Map < string , string [ ] > = new Map < string , string [ ] > ( ) ;
1426
+ for ( const codeSnippet of this . props . codeSnippets ) {
1427
+ if ( codeSnippet . tags ) {
1428
+ // check if tag is in dict, if it is add lang to value (if not already present)
1429
+ // if tag not in dict add tag as key and lang as first val
1430
+ for ( const tag of codeSnippet . tags ) {
1431
+ if ( tag !== codeSnippet . language ) {
1432
+ if ( tagsAndLangs . has ( tag ) ) {
1433
+ const langs = tagsAndLangs . get ( tag ) ;
1434
+ if ( ! langs . includes ( codeSnippet . language ) ) {
1435
+ langs . push ( codeSnippet . language ) ;
1436
+ }
1437
+ tagsAndLangs . set ( tag , langs ) ;
1438
+ } else {
1439
+ tagsAndLangs . set ( tag , [ codeSnippet . language ] ) ;
1440
+ }
1441
+ }
1442
+ }
1443
+ }
1444
+ }
1445
+ return tagsAndLangs ;
1446
+ } ;
1447
+
1386
1448
private deleteCommand ( codeSnippet : ICodeSnippet ) : void {
1387
1449
showDialog ( {
1388
1450
title : 'Delete snippet?' ,
@@ -1487,15 +1549,17 @@ export class CodeSnippetDisplay extends React.Component<
1487
1549
editSnip . className = CODE_SNIPPET_MORE_OTPIONS_EDIT ;
1488
1550
editSnip . textContent = 'Edit snippet' ;
1489
1551
editSnip . onclick = ( ) : void => {
1490
- const allTags = this . getActiveTags ( ) ;
1552
+ const allSnippetTags = this . getActiveTags ( ) [ 0 ] ; // snippet tags only
1553
+ const allLangTags = this . getActiveTags ( ) [ 1 ] ;
1491
1554
this . props . openCodeSnippetEditor ( {
1492
1555
name : codeSnippet . name ,
1493
1556
description : codeSnippet . description ,
1494
1557
language : codeSnippet . language ,
1495
1558
code : codeSnippet . code ,
1496
1559
id : codeSnippet . id ,
1497
- selectedTags : codeSnippet . tags ,
1498
- allTags : allTags ,
1560
+ selectedTags : codeSnippet . tags , // snippet tags
1561
+ allSnippetTags : allSnippetTags ,
1562
+ allLangTags : allLangTags ,
1499
1563
fromScratch : false ,
1500
1564
} ) ;
1501
1565
this . removeOptionsNode ( ) ;
@@ -1525,6 +1589,12 @@ export class CodeSnippetDisplay extends React.Component<
1525
1589
return body ;
1526
1590
}
1527
1591
1592
+ setSearchOptions ( selectedOptions : string [ ] ) : void {
1593
+ this . setState ( {
1594
+ searchOptions : selectedOptions ,
1595
+ } ) ;
1596
+ }
1597
+
1528
1598
render ( ) : React . ReactElement {
1529
1599
return (
1530
1600
< div >
@@ -1540,7 +1610,8 @@ export class CodeSnippetDisplay extends React.Component<
1540
1610
code : [ ] ,
1541
1611
id : this . state . codeSnippets . length ,
1542
1612
selectedTags : [ ] ,
1543
- allTags : this . getActiveTags ( ) ,
1613
+ allSnippetTags : this . getActiveTags ( ) [ 0 ] ,
1614
+ allLangTags : this . getActiveTags ( ) [ 1 ] ,
1544
1615
fromScratch : true ,
1545
1616
} ) ;
1546
1617
} }
@@ -1549,7 +1620,9 @@ export class CodeSnippetDisplay extends React.Component<
1549
1620
</ button >
1550
1621
</ header >
1551
1622
< FilterTools
1552
- tags = { this . getActiveTags ( ) }
1623
+ tagDictionary = { this . getActiveTagsDictionary ( ) }
1624
+ languageTags = { this . getActiveTags ( ) [ 1 ] }
1625
+ snippetTags = { this . getActiveTags ( ) [ 0 ] }
1553
1626
onFilter = { this . filterSnippets }
1554
1627
/>
1555
1628
< div className = { CODE_SNIPPETS_CONTAINER } >
0 commit comments