Ignore:
Timestamp:
01/16/15 19:24:55 (9 years ago)
Author:
emanuel.dima@uni-tuebingen.de
Message:
  1. alpha12: better language filtering using detection, collections view improvements
File:
1 edited

Legend:

Unmodified
Added
Removed
  • SRUAggregator/trunk/src/main/resources/assets/js/search.js

    r5919 r5931  
    1212var HitNumber = window.MyAggregator.HitNumber;
    1313var CorpusView = window.MyAggregator.CorpusView;
     14var Popover = window.MyReact.Popover;
    1415var InfoPopover = window.MyReact.InfoPopover;
    1516var Panel = window.MyReact.Panel;
     
    165166        },
    166167
    167         mixins: [React.addons.LinkedStateMixin],
    168168        timeout: 0,
    169169        nohits: {
     
    178178                        languageMap: {},
    179179                        language: this.anyLanguage,
     180                        languageFilter: 'byMeta',
    180181                        searchLayerId: "text",
    181182                        numberOfResults: 10,
     
    260261        },
    261262
    262         setLanguage: function(languageObj) {
    263                 this.state.corpora.setVisibility(this.state.searchLayerId, languageObj[0]);
    264                 this.setState({language: languageObj});
     263        setLanguageAndFilter: function(languageObj, languageFilter) {
     264                this.state.corpora.setVisibility(this.state.searchLayerId,
     265                        languageFilter === 'byGuess' ? multipleLanguageCode : languageObj[0]);
     266                this.setState({language: languageObj, languageFilter: languageFilter});
    265267                this.state.corpora.update();
    266268        },
     
    282284
    283285        stop: function(e) {
     286                e.preventDefault();
     287                e.stopPropagation();
     288        },
     289
     290        filterResults: function() {
     291                var langCode = this.state.language[0];
     292                return this.state.hits.results.map(function(corpusHit) {
     293                        return {
     294                                corpus: corpusHit.corpus,
     295                                startRecord: corpusHit.startRecord,
     296                                endRecord: corpusHit.endRecord,
     297                                exception: corpusHit.exception,
     298                                searchString: corpusHit.searchString,
     299                                kwics: corpusHit.kwics.filter(function(kwic){
     300                                        return kwic.language === langCode || langCode === multipleLanguageCode || langCode === null;
     301                                }),
     302                        };
     303                });
     304        },
     305
     306        toggleLanguageSelection: function(e) {
     307                $(this.refs.languageModal.getDOMNode()).modal();
    284308                e.preventDefault();
    285309                e.stopPropagation();
     
    323347                                                                React.createElement("div", {className: "input-group-btn"},
    324348                                                                        React.createElement("button", {className: "form-control btn btn-default",
    325                                                                                         'aria-expanded': "false", 'data-toggle': "dropdown"},
     349                                                                                        onClick: this.toggleLanguageSelection},
    326350                                                                                this.state.language[1], " ", React.createElement("span", {className: "caret"})
    327351                                                                        ),
    328                                                                         React.createElement("ul", {ref: "languageDropdownMenu", className: "dropdown-menu"},
    329                                                                                 React.createElement("li", {key: this.anyLanguage[0]}, " ", React.createElement("a", {tabIndex: "-1", href: "#",
    330                                                                                                 onClick: this.setLanguage.bind(this, this.anyLanguage)},
    331                                                                                         this.anyLanguage[1])
    332                                                                                 ),
    333                                                                                         _.pairs(this.state.languageMap).sort(function(l1, l2){
    334                                                                                                 return l1[1].localeCompare(l2[1]);
    335                                                                                         }).map(function(l) {
    336                                                                                                 var desc = l[1] + " [" + l[0] + "]";
    337                                                                                                 return React.createElement("li", {key: l[0]}, " ", React.createElement("a", {tabIndex: "-1", href: "#",
    338                                                                                                         onClick: this.setLanguage.bind(this, l)}, desc));
    339                                                                                         }.bind(this))
    340                                                                                
    341                                                                         )
     352                                                                        React.createElement("span", null)
    342353                                                                ),
    343354
     
    360371                                                        React.createElement("div", {className: "input-group"},
    361372                                                                React.createElement("span", {className: "input-group-addon nobkg"}, "in"),
    362                                                                         React.createElement("button", {type: "button", className: "btn btn-default", onClick: this.toggleCorpusSelection},
    363                                                                                 this.state.corpora.getSelectedMessage(), " ", React.createElement("span", {className: "caret"})
    364                                                                         )
     373                                                                React.createElement("button", {type: "button", className: "btn btn-default", onClick: this.toggleCorpusSelection},
     374                                                                        this.state.corpora.getSelectedMessage(), " ", React.createElement("span", {className: "caret"})
     375                                                                )
    365376                                                        ),                                                     
    366377
     
    383394                    ),
    384395
     396                    React.createElement(Modal, {ref: "languageModal", title: "Select Language"},
     397                                        React.createElement(LanguageSelector, {anyLanguage: this.anyLanguage,
     398                                                                          languageMap: this.state.languageMap,
     399                                                                          selectedLanguage: this.state.language,
     400                                                                          languageFilter: this.state.languageFilter,
     401                                                                          languageChangeHandler: this.setLanguageAndFilter})
     402                    ),
     403
    385404                                React.createElement("div", {className: "top-gap"},
    386                                         React.createElement(Results, {requests: this.state.hits.requests, results: this.state.hits.results})
     405                                        React.createElement(Results, {requests: this.state.hits.requests,
     406                                                 results: this.filterResults(),
     407                                                 searchedLanguage: this.state.language})
    387408                                )
    388409                        )
     
    396417
    397418
     419/////////////////////////////////
     420
     421var LanguageSelector = React.createClass({displayName: 'LanguageSelector',
     422        propTypes: {
     423                anyLanguage: PT.array.isRequired,
     424                languageMap: PT.object.isRequired,
     425                selectedLanguage: PT.array.isRequired,
     426                languageFilter: PT.string.isRequired,
     427                languageChangeHandler: PT.func.isRequired,
     428        },
     429        mixins: [React.addons.LinkedStateMixin],
     430
     431        selectLang: function(language) {
     432                this.props.languageChangeHandler(language, this.props.languageFilter);
     433        },
     434
     435        setFilter: function(filter) {
     436                this.props.languageChangeHandler(this.props.selectedLanguage, filter);
     437        },
     438
     439        renderLanguageObject: function(lang) {
     440                var desc = lang[1] + " [" + lang[0] + "]";
     441                var style = {
     442                        whiteSpace: "nowrap",
     443                        fontWeight: lang[0] === this.props.selectedLanguage[0] ? "bold":"normal",
     444                };
     445                return  React.createElement("div", {key: lang[0]},
     446                                        React.createElement("a", {tabIndex: "-1", href: "#", style: style, onClick: this.selectLang.bind(this, lang)}, desc)
     447                                );
     448        },
     449
     450        renderRadio: function(option) {
     451                return  this.props.languageFilter === option ?
     452                                React.createElement("input", {type: "radio", name: "filterOpts", value: option, checked: true, onChange: this.setFilter.bind(this, option)})
     453                                : React.createElement("input", {type: "radio", name: "filterOpts", value: option, onChange: this.setFilter.bind(this, option)});
     454        },
     455
     456        render: function() {
     457                var languages = _.pairs(this.props.languageMap)
     458                                 .sort(function(l1, l2){return l1[1].localeCompare(l2[1]); });
     459                languages.unshift(this.props.anyLanguage);
     460                languages = languages.map(this.renderLanguageObject);
     461                var third = Math.round(languages.length/3);
     462                var l1 = languages.slice(0, third);
     463                var l2 = languages.slice(third, 2*third);
     464                var l3 = languages.slice(2*third, languages.length);
     465
     466                return  React.createElement("div", null,
     467                                        React.createElement("div", {className: "row"},
     468                                                React.createElement("div", {className: "col-sm-4"}, l1),
     469                                                React.createElement("div", {className: "col-sm-4"}, l2),
     470                                                React.createElement("div", {className: "col-sm-4"}, l3),
     471                                                React.createElement("div", {className: "col-sm-12", style: {marginTop:10, marginBottom:10, borderBottom:"1px solid #eee"}})
     472                                        ),
     473                                        React.createElement("form", {className: "form", role: "form"},
     474                                                React.createElement("div", {className: "input-group"},
     475                                                        React.createElement("div", null,
     476                                                        React.createElement("label", {style: {color:'black'}},
     477                                                                 this.renderRadio('byMeta'), " ",
     478                                                                "Use the collections", "'", " specified language to filter results"
     479                                                        )
     480                                                        ),
     481                                                        React.createElement("div", null,
     482                                                        React.createElement("label", {style: {color:'black'}},
     483                                                                 this.renderRadio('byGuess'), " ",
     484                                                                "Filter results by using a language detector"
     485                                                        )
     486                                                        ),
     487                                                        React.createElement("div", null,
     488                                                        React.createElement("label", {style: {color:'black'}},
     489                                                                 this.renderRadio('byMetaAndGuess'), " ",
     490                                                                "First use the collections", "'", " specified language then also use a language detector"
     491                                                        )
     492                                                        )
     493                                                )
     494                                        )
     495                                );
     496        }
     497});
    398498/////////////////////////////////
    399499
     
    442542                requests: PT.array.isRequired,
    443543                results: PT.array.isRequired,
     544                searchedLanguage: PT.array.isRequired,
    444545        },
    445546
    446547        getInitialState: function () {
    447                 return { displayKwic: false };
     548                return {
     549                        displayKwic: false,
     550                };
    448551        },
    449552
     
    453556
    454557        renderRowLanguage: function(hit) {
    455                 return React.createElement("span", {style: {fontFace:"Courier",color:"black"}}, hit.language);
     558                return React.createElement("span", {style: {fontFace:"Courier",color:"black"}}, hit.language, " ") ;
    456559        },
    457560
     
    467570
    468571        renderRowsAsKwic: function(hit,i) {
    469                 var sleft={textAlign:"left", verticalAlign:"middle", width:"50%"};
    470                 var scenter={textAlign:"center", verticalAlign:"middle", maxWidth:"50%"};
    471                 var sright={textAlign:"right", verticalAlign:"middle", maxWidth:"50%"};
     572                var sleft={textAlign:"left", verticalAlign:"top", width:"50%"};
     573                var scenter={textAlign:"center", verticalAlign:"top", maxWidth:"50%"};
     574                var sright={textAlign:"right", verticalAlign:"top", maxWidth:"50%"};
    472575                return  React.createElement("tr", {key: i, className: "hitrow"},
    473576                                        React.createElement("td", null, this.renderRowLanguage(hit)),
     
    565668
    566669        renderKwicCheckbox: function() {
    567                 return  React.createElement("div", {key: "-option-KWIC-", className: "row"},
    568                                         React.createElement("div", {className: "float-right", style: {marginRight:17}},
    569                                                 React.createElement("div", {className: "btn-group", style: {display:"inline-block"}},
    570                                                         React.createElement("label", {forHtml: "inputKwic", className: "btn-default"},
    571                                                                  this.state.displayKwic ?
    572                                                                         React.createElement("input", {id: "inputKwic", type: "checkbox", value: "kwic", checked: true, onChange: this.toggleKwic}) :
    573                                                                         React.createElement("input", {id: "inputKwic", type: "checkbox", value: "kwic", onChange: this.toggleKwic}),
    574                                                                
    575                                                                 " " + ' ' +
    576                                                                 "Display as Key Word In Context"
    577                                                         )
     670                return  React.createElement("div", {className: "float-right", style: {marginRight:17}},
     671                                        React.createElement("div", {className: "btn-group", style: {display:"inline-block"}},
     672                                                React.createElement("label", {forHtml: "inputKwic", className: "btn-default"},
     673                                                         this.state.displayKwic ?
     674                                                                React.createElement("input", {id: "inputKwic", type: "checkbox", value: "kwic", checked: true, onChange: this.toggleKwic}) :
     675                                                                React.createElement("input", {id: "inputKwic", type: "checkbox", value: "kwic", onChange: this.toggleKwic}),
     676                                                       
     677                                                        " " + ' ' +
     678                                                        "Display as Key Word In Context"
    578679                                                )
    579680                                        )
     
    592693                                                React.createElement("div", {key: "-found-message-", style: margintop}, this.renderFoundMessage(hits), " "),
    593694                                                React.createElement("div", {key: "-progress-", style: margintop}, this.renderProgressBar()),
    594                                                 hits > 0 ? this.renderKwicCheckbox() : false,
     695                                                hits > 0 ?
     696                                                        React.createElement("div", {key: "-option-KWIC-", className: "row"},
     697                                                                this.renderKwicCheckbox()
     698                                                        )
     699                                                        : false,
    595700                                                this.props.results.map(this.renderResultPanels)
    596701                                        )
Note: See TracChangeset for help on using the changeset viewer.