Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F93833210
websearch_helpers.html
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sun, Dec 1, 21:11
Size
18 KB
Mime Type
text/html
Expires
Tue, Dec 3, 21:11 (1 d, 23 h)
Engine
blob
Format
Raw Data
Handle
22712203
Attached To
R3600 invenio-infoscience
websearch_helpers.html
View Options
{#
## This file is part of Invenio.
## Copyright (C) 2012 CERN.
##
## Invenio is free software; you can redistribute it and/or
## modify it under the terms of the GNU General Public License as
## published by the Free Software Foundation; either version 2 of the
## License, or (at your option) any later version.
##
## Invenio is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with Invenio; if not, write to the Free Software Foundation, Inc.,
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
#}
{% macro record_brief_links(recID) %}
{%- set rinfo = RecordInfo(recID) -%}
<p>
{%- set similar = "recid:%d" % recID -%}
{%- if config.CFG_WEBSEARCH_USE_ALEPH_SYSNOS -%}
{%- set alephsysnos = rinfo.get_fieldvalues("970__a") -%}
{%- if len(alephsysnos) > 0 -%}
{%- set recID = alephsysnos[0] -%}
{%- set similar = "sysno:%d" % recID -%}
{%- endif -%}
{%- endif -%}
<a
href=
"/record/{{ recID }}"
>
{{ _("Detailed record") }}
</a>
-
<a
href=
"{{ url_for('.search', p=similar, rm='wrd') }}"
>
{{ _("Similar records") }}
</a>
{# Citations link #}
{%- if config.CFG_BIBRANK_SHOW_CITATION_LINKS -%}
{%- set num_citations = rinfo.get_cited_by_count() -%}
{%- if num_citations -%}
-
<a
href=
"{{ url_for('.search', p="
refersto:recid:
%
d
"
%
recID
)
}}"
>
{{ _("Cited by %i records") % num_citations if num_citations > 1 else _("Cited by 1 record") }}
</a>
{%- endif -%}
{%- endif -%}
{# Comments link #}
{%- if config.CFG_WEBCOMMENT_ALLOW_COMMENTS and config.CFG_WEBSEARCH_SHOW_COMMENT_COUNT -%}
{%- set num_comments = rinfo.get_nb_comments() -%}
{%- if num_comments -%}
-
<a
href=
"/record/{{ recID }}/comments"
>
{{ _("%i comments") % num_comments if num_comments > 1 else _("1 comment") }}
</a>
{%- endif -%}
{%- endif -%}
{# Reviews link #}
{%- if config.CFG_WEBCOMMENT_ALLOW_REVIEWS and config.CFG_WEBSEARCH_SHOW_REVIEW_COUNT -%}
{%- set num_reviews = rinfo.get_nb_reviews() -%}
{%- if num_reviews -%}
-
<a
href=
"/record/{{ recID }}/comments"
>
{{ _("%i reviews") % num_reviews if num_reviews > 1 else _("1 review") }}
</a>
{%- endif -%}
{%- endif -%}
</p>
{% endmacro %}
{% macro collection_tree(collections, limit=None) %}
{%- set idxs = [0] -%}
<ul
{{
kwargs
|
xmlattr
}}
>
{% for collection in collections recursive %}
<li>
{# Do not show checkboxes in new UI
{% if idxs|length == 1 %}
<input
type=
"checkbox"
name=
"c"
value=
"{{ collection.name }}"
checked
/>
{% endif %}
#}
<a
href=
"{{ url_for("
.
collection
",
name=
collection.name)
}}"
>
{{ collection.name_ln }}
<span
class=
"badge"
>
{{ collection.nbrecs }}
</span>
</a>
{% if collection.collection_children and idxs|length
< limit
%}
{%
-
do
idxs
.
append
(
loop
.
index
)
-
%}
<
ul
{{
kwargs
|
xmlattr
}}
>
{{ loop(collection.collection_children) }}
</ul>
{%- do idxs.pop() -%}
{% endif %}
</li>
{% endfor %}
</ul>
{% endmacro %}
{% macro portalbox_sidebar(portalboxes, width=2) %}
{% if portalboxes %}
<div
{{
kwargs
|
xmlattr
}}
>
<ul
class=
"thumbnails"
>
{% for cp in portalboxes %}
<li
class=
"span{{ width }}"
>
<div
class=
"thumbnail"
>
<h5>
{{ cp.portalbox.title }}
</h5>
<p>
{{ cp.portalbox.body|safe }}
</p>
</div>
</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% endmacro %}
{% macro search_also(externalcollections) %}
{% if externalcollections %}
<h4>
{{ _("Search also") }}
</h4>
<ul>
{% for ex in externalcollections %}
<li>
{{ ex.name }}
<a
href=
"{{ ex.engine.base_url}}"
>
<img
src=
"{{ url_for("
static
",
filename=
"img/external-icon-light-8x8.gif"
)}}"
alt=
"{{ ex.engine.base_url }}"
/>
</a></li>
{% endfor %}
</ul>
{% endif %}
{% endmacro %}
{% macro _search_hidden_options() %}
{%- for name in ['rg', 'of', 'so', 'sf', 'rm'] -%}
{%- if request.args.get(name) -%}
<input
type=
"hidden"
name=
"{{ name }}"
value=
"{{ request.args.get(name, '') }}"
/>
{%- endif -%}
{%- endfor -%}
{% endmacro %}
{% macro _search_advanced_box(collection) %}
<div
style=
"padding: 0px;"
class=
"dropdown-menu donothide"
>
<div
class=
"row"
>
<div
class=
"span6"
style=
"min-width: 400px;"
>
<div
class=
"modal-header"
>
<button
type=
"button"
style=
"z-index:9999; position: relative;"
class=
"close"
onclick=
"
$
('.dropdown.open').removeClass('open')"
>
×
</button>
<label
class=
"control-label"
>
<strong>
{{ _('Add to search') }}
</strong>
</label>
<div
style=
"padding-top:4px;"
class=
"controls btn-group"
data-toggle=
"buttons-radio"
>
<label
class=
"btn btn-mini active"
>
<input
style=
"display:none;"
type=
"radio"
name=
"op1"
value=
"a"
checked
/>
{{ _('AND') }}
</label>
<label
class=
"btn btn-mini"
>
<input
style=
"display:none;"
type=
"radio"
name=
"op1"
value=
"o"
/>
{{ _('OR') }}
</label>
<label
class=
"btn btn-mini"
>
<input
style=
"display:none;"
type=
"radio"
name=
"op1"
value=
"n"
/>
{{ _('AND NOT') }}
</label>
</div>
</div>
<!-- end modal-header-->
<div
class=
"modal-body"
>
<div
class=
"control-group"
>
<label
style=
"padding-top:1px;"
class=
"control-label"
>
<select
style=
"width:100%;"
name=
"m1"
>
{%- for k,v in config.CFG_WEBSEACH_MATCHING_TYPES.iteritems() -%}
<option
value=
"{{ k }}"
>
{{ _(v.title)|safe }}
</option>
{%- endfor -%}
</select>
</label>
<div
class=
"controls"
>
<input
type=
"text"
name=
"p1"
value=
""
class=
"span3"
/>
</div>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
{{ _('in') }}:
</label>
<div
class=
"controls"
>
<select
class=
"span2"
name=
"f"
>
{% for code, name in collection.search_within.iteritems() %}
<option
value=
"{{ code }}"
>
{{ name }}
</option>
{% endfor %}
</select>
<span
id=
"addtosearch"
class=
"btn"
>
<i
class=
"icon-ok"
></i>
</span>
</div>
</div>
{% for id, soo in collection.search_options|groupby('id_field') %}
<hr/>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
{{ soo[0].field.name_ln }}
</label>
<div
class=
"controls"
>
<select
class=
"span2"
name=
"{{ soo[0].field.code }}"
>
<option
value=
""
>
*** {{ _('select') }} ***
</option>
{% for so in soo %}
<option
value=
"{{ so.fieldvalue.value }}"
>
{{ so.fieldvalue.name }}
</option>
{% endfor %}
</select>
<span
data-target=
"p"
data-source=
"{{ soo[0].field.code }}"
class=
"btn appender"
>
<i
class=
"icon-ok"
></i>
</span>
</div>
</div>
{% endfor %}
</div>
<!-- end modal-body -->
<div
class=
"modal-footer"
>
<button
name=
"action_search"
type=
"submit"
class=
"btn btn-primary"
>
<i
class=
"icon-search icon-white"
></i>
{{ _("Search") }}
</button>
</div>
<!-- end modal-footer -->
</div>
<!-- end span5 -->
</div>
<!-- end row -->
</div>
<!-- end dropdown-menu -->
{% endmacro %}
{% macro search_form(collection) %}
<div
id=
"search-box-main"
class=
"row"
>
<div
class=
"span12"
>
<div
class=
"control-group well"
>
<form
action=
"{{ url_for('.search') }}"
name=
"search"
method=
"get"
class=
"form-horizontal"
style=
"
width: 80%;
margin: 0px;
float: left;
"
>
<label
for=
"p"
class=
"control-label"
>
{{ _("Search %d records for:")|format(collection.nbrecs) }}
</label>
<div
class=
"controls"
>
<div
id=
"searchdropdown"
style=
"float: left;"
class=
"dropdown"
>
<div
class=
"input-append"
>
<input
autocomplete=
"off"
data-provide=
"typeahead"
data-items=
"4"
name=
"p"
class=
"span5"
type=
"text"
placeholder=
"{{ _("
Input
query
")
}}"
value=
"{{ request.args.get('p', '') }}"
autofocus
/>
<!--
No space!
-->
<span
data-toggle=
"dropdown"
data-target=
"#searchdropdown"
class=
"add-on btn"
>
<i
class=
"caret"
></i>
</span>
</div>
{#
# This is a dirty hack for browser without Javascript support.
#}
<script>
var
box
=
{{
_search_advanced_box
(
collection
)
|
tojson
|
safe
}};
document
.
write
(
box
);
</script>
<!-- Hidden configuration fields -->
{% if collection.id != 1 %}
<input
type=
"hidden"
name=
"cc"
value=
"{{ collection.name }}"
/>
{% endif %}
{{ _search_hidden_options() }}
<!-- end of configuration fields -->
<button
name=
"action_search"
type=
"submit"
class=
"btn btn-primary"
>
<i
class=
"icon-search icon-white"
></i>
{{ _("Search") }}
</button>
<span
class=
"help-inline"
>
<a
href=
"/help/search-tips"
>
{{ _("Search Tips") }}
</a>
</span>
</div>
</div>
<!-- end controls -->
</form>
<form
action=
"{{ url_for('.search') }}"
name=
"settings"
method=
"get"
style=
"
margin: 0px;
"
class=
"form-inline"
>
<input
name=
"p"
value=
"{{ request.args.get('p','') }}"
type=
"hidden"
/>
<div
id=
"settingsdropdown"
class=
"pull-right btn-group dropdown"
>
<button
class=
"btn dropdown-toggle"
data-target=
"#settingsdropdown"
data-toggle=
"dropdown"
>
<i
class=
"icon-cog"
></i>
<span
class=
"caret"
></span>
</button>
<ul
class=
"dropdown-menu donothide"
>
<li
style=
"width: 100%; float: left; padding: 3px 15px;"
>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
{{ _('View') }}
</label>
<div
class=
"controls"
>
<select
name=
"rg"
class=
"pull-right span2"
>
{%- for i in [10, 25, 50, 100, 250, 500] -%}
{%- if i
<
= config.CFG_WEBSEARCH_MAX_RECORDS_IN_GROUPS -%}
<option
value=
"{{ i }}"
{{
'
selected
'
if
request
.
args
.
get
('
rg
',
10
)==
i
.
__str__
()
}}
>
{{ i }} {{ _('results') }}
</option>
{%- endif -%}
{%- endfor -%}
</select>
</div>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
{{ _('Action') }}
</label>
<div
class=
"controls"
>
<div
class=
"btn-group"
data-toggle=
"buttons-radio"
onclick=
"return false;"
>
<label
class=
"btn btn-small active"
>
<input
style=
"display:none;"
type=
"radio"
name=
"actiona"
value=
"search"
checked=
"checked"
>
{{ _('Search') }}
</label>
<label
class=
"btn btn-small"
>
<input
style=
"display:none;"
type=
"radio"
name=
"actiona"
value=
"browse"
checked=
""
>
{{ _('Browse') }}
</label>
</div>
</div>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
{{ _('Output format') }}
</label>
<div
class=
"controls"
>
<select
name=
"of"
class=
"pull-right span2"
>
{%- for i in collection.formatoptions -%}
<option
value=
"{{ i.code }}"
{{
'
selected
'
if
request
.
args
.
get
('
of
','
hb
')==
i
.
code
}}
>
{{ i.name }}
</option>
{%- endfor -%}
</select>
</div>
</div>
</li>
<li><a
href=
"#"
>
Another action
</a></li>
<li><a
href=
"#"
>
Something else here
</a></li>
<li
class=
"divider"
></li>
<li
style=
"padding: 0 15px 3px 15px;;"
>
<button
class=
"btn"
>
<i
class=
"icon-ok"
></i>
{{ _('Apply') }}
</button>
</li>
</ul>
</div>
</form>
<div
style=
"clear: both;"
></div>
</div>
<!-- end controll-group well -->
</div>
<!-- end span12 -->
</div>
<!-- end row -->
<script>
$
(
function
()
{
$
(
"form[name=search]"
).
submit
(
function
()
{
$
(
'.donothide'
).
remove
();
return
true
;
// ensure form still submits
});
if
(
!
(
"autofocus"
in
$
(
"form[name=search] input[name=q]"
)))
{
// ensure we get the focus always in search input
$
(
"form[name=search] input[name=q]"
).
focus
();
}
var
op1_fn
=
{
'a'
:
'AND '
,
'o'
:
'OR '
,
'n'
:
'AND NOT '
},
m1_fn
=
{
{
%-
for
k
,
v
in
config
.
CFG_WEBSEACH_MATCHING_TYPES
.
iteritems
()
-%
}
'{{ k }}'
:
function
(
val
,
f
)
{
{{
v
.
tokenize
|
safe
}}
}{{
','
if
not
loop
.
last
}}
{
%-
endfor
-%
}
};
var
addtosearch_callback
=
function
(
e
)
{
var
op1
=
$
(
'[name=op1]:checked'
).
val
(),
m1
=
$
(
'[name=m1]'
).
val
(),
p1
=
$
(
'[name=p1]'
).
val
(),
f
=
$
(
'[name=f]'
).
val
(),
p
=
$
(
'[name=p]'
),
val
=
p
.
val
(),
op
=
(
op1
==
'a'
&&
val
==
""
)
?
''
:
op1_fn
[
op1
];
if
(
val
!==
""
)
{
val
+=
' '
;
}
if
(
p1
===
""
)
{
return
false
;
}
if
(
f
!==
""
)
{
f
+=
':'
;
}
p
.
val
(
val
+
op
+
m1_fn
[
m1
](
p1
,
f
));
$
(
'[name=p1]'
).
val
(
''
);
e
.
stopPropagation
();
return
false
;
};
$
(
'#addtosearch'
).
on
(
'click'
,
addtosearch_callback
);
$
(
'[name=p1]'
).
keypress
(
function
(
event
)
{
if
(
event
.
which
==
13
)
{
event
.
preventDefault
();
addtosearch_callback
(
event
);
}
});
$
(
'#searchdropdown .appender'
).
on
(
'click'
,
function
(
e
)
{
var
op1
=
$
(
'[name=op1]:checked'
).
val
(),
btn
=
$
(
this
),
source
=
$
(
'[name='
+
btn
.
attr
(
'data-source'
)
+
']'
),
target
=
$
(
'[name='
+
btn
.
attr
(
'data-target'
)
+
']'
),
val
=
target
.
val
(),
op
=
(
op1
==
'a'
&&
val
==
""
)
?
''
:
op1_fn
[
op1
];
if
(
val
!==
""
)
{
val
+=
' '
;
}
if
(
source
.
val
()
===
""
)
{
return
false
}
if
(
source
.
val
().
length
>
0
)
{
target
.
val
(
val
+
op
+
source
.
attr
(
'name'
)
+
':"'
+
source
.
val
()
+
'"'
);
source
.
val
(
''
);
}
e
.
stopPropagation
();
return
false
;
});
$
(
'#searchdropdown .btn-primary'
).
on
(
'click'
,
function
(
e
)
{
addtosearch_callback
(
e
);
$
(
'#searchdropdown .appender'
).
trigger
(
'click'
);
});
$
(
'html'
).
on
(
'click.dropdown'
,
'.dropdown .donothide'
,
function
(
e
)
{
if
(
!
$
(
e
.
target
).
hasClass
(
'close'
))
{
e
.
stopPropagation
();
}
});
$
(
'html'
).
on
(
'click.dropdown.donothide.data-api'
,
function
(
e
)
{
$
(
'#searchdropdown'
).
removeClass
(
'open'
);
});
var
source
=
$
.
map
({{
collection
.
search_within
.
keys
()[
1
:
]
|
tojson
|
safe
}},
function
(
val
,
i
)
{
return
val
+
':'
;});
//['author:', 'title:', 'isbn:'];
source
.
push
(
'AND '
);
source
.
push
(
'OR '
);
source
.
push
(
'AND NOT '
);
var
sources
=
{
{
%
for
id
,
soo
in
collection
.
search_options
|
groupby
(
'id_field'
)
%
}
'{{ soo[0].field.code }}'
:
[{
%
for
so
in
soo
%
}
'{{ so.fieldvalue.name }}'
{{
','
if
not
loop
.
last
}}
{
%
endfor
%
}
]{{
','
if
not
loop
.
last
}}
{
%
endfor
%
}
};
{
%
for
id
,
soo
in
collection
.
search_options
|
groupby
(
'id_field'
)
%
}
source
.
push
(
'{{ soo[0].field.code }}'
);
{
%
endfor
%
}
var
orig
=
{
lookup
:
$
.
fn
.
typeahead
.
Constructor
.
prototype
.
lookup
,
render
:
$
.
fn
.
typeahead
.
Constructor
.
prototype
.
render
,
matcher
:
$
.
fn
.
typeahead
.
Constructor
.
prototype
.
matcher
,
select
:
$
.
fn
.
typeahead
.
Constructor
.
prototype
.
select
};
$
.
extend
(
$
.
fn
.
typeahead
.
Constructor
.
prototype
,
{
lookup
:
function
(
event
)
{
var
query
=
this
.
$
element
.
val
(),
m
=
query
.
lastIndexOf
(
':'
),
type
=
query
.
substr
(
0
,
m
),
n
=
type
.
lastIndexOf
(
' '
);
if
(
0
<
n
&&
n
<
m
)
{
type
=
type
.
substr
(
n
+
1
);
}
if
(
m
>
query
.
lastIndexOf
(
' '
)
&&
type
in
sources
)
{
this
.
options
.
type
=
'data'
;
this
.
source
=
this
.
options
.
sources
[
type
];
}
else
{
this
.
options
.
type
=
'search'
;
this
.
source
=
source
;
}
orig
.
lookup
.
call
(
this
);
},
select
:
function
()
{
var
val
=
this
.
$
menu
.
find
(
'.active'
).
attr
(
'data-value'
);
if
(
this
.
options
.
type
==
'data'
)
{
var
m
=
this
.
query
.
lastIndexOf
(
':'
),
newVal
=
this
.
$
element
.
val
().
substr
(
0
,
m
);
if
(
~
m
)
{
newVal
+=
':"'
;
}
this
.
$
element
.
val
(
newVal
+
val
+
'" '
);
this
.
$
element
.
change
();
this
.
options
.
type
=
'search'
;
return
this
.
hide
();
}
if
(
this
.
options
.
type
==
'search'
)
{
var
m
=
this
.
query
.
lastIndexOf
(
' '
),
im
=
(
m
<
0
)
?
0
:
m
+
1
,
p
=
this
.
$
element
.
val
(),
op
=
(
"+-|"
.
indexOf
(
p
[
im
])
>-
1
)
?
p
[
im
]
:
''
,
newVal
=
p
.
substr
(
0
,
m
);
if
(
~
m
)
{
newVal
+=
' '
;
}
this
.
$
element
.
val
(
newVal
+
op
+
val
);
this
.
$
element
.
change
();
return
this
.
hide
();
}
orig
.
select
.
call
(
this
);
return
this
;
},
/*
render: function(items) {
if (this.options.type != 'email') {
orig.render.call(this, items);
return this;
}
var that = this,
text = this.query.replace(/@.*
$
/
,
''
),
val
;
items
=
$
(
items
).
map
(
function
(
i
,
item
)
{
val
=
text
+
'@'
+
item
;
i
=
$
(
that
.
options
.
item
).
attr
(
'data-value'
,
val
);
i
.
find
(
'a'
).
html
(
that
.
highlighter
(
val
));
return
i
[
0
];
});
items
.
first
().
addClass
(
'active'
);
this
.
$
menu
.
html
(
items
);
return
this
;
},
*
/
matcher
:
function
(
item
)
{
if
(
this
.
options
.
type
==
'data'
)
{
var
m
=
this
.
query
.
lastIndexOf
(
':'
),
search
;
search
=
this
.
query
.
substr
(
m
+
1
).
toLowerCase
();
return
search
.
length
&&
~
item
.
toLowerCase
().
indexOf
(
search
);
}
if
(
this
.
options
.
type
==
'search'
)
{
var
m
=
this
.
query
.
lastIndexOf
(
' '
),
search
;
search
=
this
.
query
.
substr
(
m
+
1
).
toLowerCase
();
offset
=
0
;
if
(
search
.
length
&&
"+-|"
.
indexOf
(
search
[
0
])
>
-
1
)
{
offset
=
1
;
}
return
search
.
length
&&
~
item
.
toLowerCase
().
indexOf
(
search
.
substr
(
offset
));
}
return
orig
.
matcher
.
call
(
this
,
item
);
}
});
$
(
'form[name=search] input[name=p]'
).
typeahead
({
source
:
source
,
sources
:
sources
,
type
:
'search'
});
});
</script>
{% endmacro %}
Event Timeline
Log In to Comment