11import Morph from 'src/components/widgets/lively-morph.js' ;
22import ohm from "https://unpkg.com/[email protected] /dist/ohm.js" ; 3+ import MicrosoftAcademicEntities from "src/client/literature.js" ;
34
45var g = ohm . grammar (
56 `Academic {
@@ -320,6 +321,7 @@ export default class AcademicSubquery extends Morph {
320321 var edit = this . get ( '#edit' ) ;
321322 edit . innerHTML = "" ;
322323
324+ // TODO: Hier this.editing = !this.editing und dann updateView()
323325 if ( ! this . editing ) {
324326 this . editing = true ;
325327 edit . appendChild ( < i class = "fa fa-hand-paper-o" aria-hidden = "true" > </ i > ) ;
@@ -344,76 +346,79 @@ export default class AcademicSubquery extends Morph {
344346 onMouseOut ( event ) {
345347 this . style . color = "black"
346348 }
349+
350+ async buildConjunctionQuery ( object ) {
351+ var inner = < span id = "inner" > </ span > ;
352+ var conjunction = < span id = "conjunction" contenteditable = "false" style = "font-size: 150%" > { object . conjunction } </ span > ;
353+ var left = await ( < academic-subquery style = "font-size: smaller;" > </ academic-subquery > ) ;
354+ await left . setQueryObject ( object . left ) ;
355+ this . leftSubquery = left ; // for viewToQuery
356+ var right = await ( < academic-subquery style = "font-size: smaller;" > </ academic-subquery > ) ;
357+ await right . setQueryObject ( object . right ) ;
358+ this . rightSubquery = right ; // for viewToQuery
359+ inner . appendChild (
360+ < table >
361+ < tr >
362+ < th > { conjunction } </ th >
363+ < th >
364+ < table >
365+ < tr > { left } </ tr >
366+ < tr > { right } </ tr >
367+ </ table >
368+ </ th >
369+ </ tr >
370+ </ table >
371+ )
372+ return inner ;
373+ }
374+
375+ buildSimpleQuery ( object ) {
376+ var inner =
377+ < span class = "hover" contenteditable = "false" id = "inner" >
378+ < span class = "hovercontent" >
379+ < button
380+ class = "button"
381+ click = { ( ) => {
382+ this . setQuery (
383+ "And(" + this . textContent + ", " + this . textContent + ")" )
384+ } } > AND</ button >
385+ < button
386+ class = "button"
387+ click = { ( ) => {
388+ this . setQuery (
389+ "Or(" + this . textContent + ", " + this . textContent + ")" )
390+ } } > OR</ button >
391+ </ span >
392+ </ span > ;
393+
394+ var query = < span name = "sub" draggable = 'true' > </ span > ;
395+ [ object . attribute , object . comparator , object . value ] . forEach ( value => {
396+ query . appendChild ( < span class = "queryPart" name = "queryPart" > { value } </ span > )
397+ query . addEventListener ( 'mouseover' , ( evt ) => this . onMouseOver ( evt ) ) ;
398+ query . addEventListener ( 'mouseout' , ( evt ) => this . onMouseOut ( evt ) ) ;
399+ query . style . cursor = "grab" // on drag: grabbing
400+ } ) ;
401+ inner . appendChild ( query ) ;
402+ var edit = < span id = "edit" title = "toggle edit mode" click = { ( ) => this . toggleEditing ( ) } > < i class = "fa fa-pencil" aria-hidden = "true" > </ i > </ span > ;
403+ edit . style . cursor = "pointer" ;
404+ inner . appendChild ( edit ) ;
405+ return inner ;
406+ }
347407
348408 async queryToView ( object ) {
349- var span = < span contenteditable = "false" id = "inner" > </ span > ;
350- var subSpan ;
351-
352- switch ( object . type ) {
353- case "conjunction" :
354- // Textselection in css vielleicht entfernen für Drag & Drop (bzw. erstmal Drag einschalten)
355- // events.stoppropagation und preventdefault
356- this . isComplex = true ;
357- subSpan = < span id = "conjunction" contenteditable = "false" style = "font-size: 150%" > { object . conjunction } </ span > ;
358- var left = await ( < academic-subquery style = "font-size: smaller;" > </ academic-subquery > ) ;
359- await left . setQueryObject ( object . left ) ;
360- this . leftSubquery = left ; // for viewToQuery
361- var right = await ( < academic-subquery style = "font-size: smaller;" > </ academic-subquery > ) ;
362- await right . setQueryObject ( object . right ) ;
363- this . rightSubquery = right ; // for viewToQuery
364- span . appendChild (
365- < table >
366- < tr >
367- < th > { subSpan } </ th >
368- < th >
369- < table >
370- < tr > { left } </ tr >
371- < tr > { right } </ tr >
372- </ table >
373- </ th >
374- </ tr >
375- </ table >
376- )
377- break ;
409+ var inner = < span id = "inner" > </ span > ;
378410
411+ if ( object . type == "conjunction" ) {
412+ this . isComplex = true ;
413+ inner = await this . buildConjunctionQuery ( object ) ;
414+ } else {
379415 // "composite" or "simple"
380- default :
381- this . isComplex = false ;
382- // make span hoverable
383- span =
384- < span class = "hover" contenteditable = "false" id = "inner" >
385- < span class = "hovercontent" >
386- < button
387- class = "button"
388- click = { ( ) => {
389- this . setQuery (
390- "And(" + this . textContent + ", " + this . textContent + ")" )
391- } } > AND</ button >
392- < button
393- class = "button"
394- click = { ( ) => {
395- this . setQuery (
396- "Or(" + this . textContent + ", " + this . textContent + ")" )
397- } } > OR</ button >
398- </ span >
399- </ span > ;
400-
401- subSpan = < span name = "sub" draggable = 'true' > </ span > ;
402- [ object . attribute , object . comparator , object . value ] . forEach ( value => {
403- subSpan . appendChild ( < span class = "queryPart" name = "queryPart" > { value } </ span > )
404- subSpan . addEventListener ( 'mouseover' , ( evt ) => this . onMouseOver ( evt ) ) ;
405- subSpan . addEventListener ( 'mouseout' , ( evt ) => this . onMouseOut ( evt ) ) ;
406- subSpan . style . cursor = "grab" // on drag: grabbing
407- } ) ;
408- span . appendChild ( subSpan ) ;
409- var edit = < span id = "edit" title = "toggle edit mode" click = { ( ) => this . toggleEditing ( ) } > < i class = "fa fa-pencil" aria-hidden = "true" > </ i > </ span > ;
410- edit . style . cursor = "pointer" ;
411- span . appendChild ( edit ) ;
412- break ;
416+ this . isComplex = false ;
417+ inner = this . buildSimpleQuery ( object ) ;
413418 }
414- span . setAttribute ( "type" , object . type ) ;
419+ inner . setAttribute ( "type" , object . type ) ;
415420
416- var queryElement = < div class = "dropTarget" > < b > { span } </ b > </ div > ;
421+ var queryElement = < div class = "dropTarget" > < b > { inner } </ b > </ div > ;
417422
418423 return queryElement ;
419424 }
0 commit comments