[MERGE] Merge from openerp-web trunk.

bzr revid: bth@tinyerp.com-20120529053402-4f8navbgt9cfodmo
This commit is contained in:
Bhumi Thakkar (Open ERP) 2012-05-29 11:04:02 +05:30
commit e383dfc338
362 changed files with 6612 additions and 7002 deletions

View File

@ -36,19 +36,6 @@
"static/lib/underscore/underscore.string.js",
"static/lib/backbone/backbone.js",
"static/lib/visualsearch/lib/js/visualsearch.js",
"static/lib/visualsearch/lib/js/utils/backbone_extensions.js",
"static/lib/visualsearch/lib/js/utils/hotkeys.js",
"static/lib/visualsearch/lib/js/utils/inflector.js",
"static/lib/visualsearch/lib/js/utils/jquery_extensions.js",
"static/lib/visualsearch/lib/js/utils/search_parser.js",
"static/lib/visualsearch/lib/js/models/search_facets.js",
"static/lib/visualsearch/lib/js/models/search_query.js",
"static/lib/visualsearch/lib/js/templates/templates.js",
"static/lib/visualsearch/lib/js/views/search_facet.js",
"static/lib/visualsearch/lib/js/views/search_input.js",
"static/lib/visualsearch/lib/js/views/search_box.js",
"static/lib/labjs/LAB.src.js",
"static/lib/py.js/lib/py.js",
"static/src/js/boot.js",
@ -74,9 +61,6 @@
"static/lib/jquery.ui.timepicker/css/jquery-ui-timepicker-addon.css",
"static/lib/jquery.ui.notify/css/ui.notify.css",
"static/lib/jquery.tipsy/tipsy.css",
"static/lib/visualsearch/lib/css/reset.css",
"static/lib/visualsearch/lib/css/workspace.css",
"static/lib/visualsearch/lib/css/icons.css",
# "static/src/css/base_old.css",
"static/src/css/base.css",
"static/src/css/data_export.css",

View File

@ -1287,25 +1287,6 @@ class SearchView(View):
del filter['domain']
return filters
@openerpweb.jsonrequest
def save_filter(self, req, model, name, context_to_save, domain):
Model = req.session.model("ir.filters")
ctx = common.nonliterals.CompoundContext(context_to_save)
ctx.session = req.session
ctx = ctx.evaluate()
domain = common.nonliterals.CompoundDomain(domain)
domain.session = req.session
domain = domain.evaluate()
uid = req.session._uid
context = req.session.eval_context(req.context)
to_return = Model.create_or_replace({"context": ctx,
"domain": domain,
"model_id": model,
"name": name,
"user_id": uid
}, context)
return to_return
@openerpweb.jsonrequest
def add_to_dashboard(self, req, menu_id, action_id, context_to_save, domain, view_mode, name=''):
ctx = common.nonliterals.CompoundContext(context_to_save)

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:14+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
"X-Poedit-Language: Czech\n"
#. openerp-web

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
"Language: es\n"
#. openerp-web

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:14+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-14 15:27+0100\n"
"PO-Revision-Date: 2011-10-07 12:50+0000\n"
"Last-Translator: Niels Huylebroeck <Unknown>\n"
"PO-Revision-Date: 2012-05-15 14:32+0000\n"
"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-16 05:10+0000\n"
"X-Generator: Launchpad (build 15247)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172
@ -27,60 +27,60 @@ msgstr ""
#: addons/web/static/src/js/view_form.js:424
#: addons/web/static/src/js/view_form.js:1239
msgid "Ok"
msgstr "Ok"
msgstr "OK"
#. openerp-web
#: addons/web/static/src/js/chrome.js:180
msgid "Send OpenERP Enterprise Report"
msgstr ""
msgstr "OpenERP-Entrepriserapport versturen"
#. openerp-web
#: addons/web/static/src/js/chrome.js:194
msgid "Dont send"
msgstr ""
msgstr "Niet versturen"
#. openerp-web
#: addons/web/static/src/js/chrome.js:256
#, python-format
msgid "Loading (%d)"
msgstr ""
msgstr "Laden (%d)"
#. openerp-web
#: addons/web/static/src/js/chrome.js:288
msgid "Invalid database name"
msgstr ""
msgstr "Ongeldige databasenaam"
#. openerp-web
#: addons/web/static/src/js/chrome.js:483
msgid "Backed"
msgstr ""
msgstr "Back-up klaar"
#. openerp-web
#: addons/web/static/src/js/chrome.js:484
msgid "Database backed up successfully"
msgstr ""
msgstr "Databaseback-up geslaagd"
#. openerp-web
#: addons/web/static/src/js/chrome.js:527
msgid "Restored"
msgstr ""
msgstr "Teruggezet"
#. openerp-web
#: addons/web/static/src/js/chrome.js:527
msgid "Database restored successfully"
msgstr ""
msgstr "Database met succes teruggezet"
#. openerp-web
#: addons/web/static/src/js/chrome.js:708
#: addons/web/static/src/xml/base.xml:359
msgid "About"
msgstr ""
msgstr "Info"
#. openerp-web
#: addons/web/static/src/js/chrome.js:787
#: addons/web/static/src/xml/base.xml:356
msgid "Preferences"
msgstr ""
msgstr "Voorkeuren"
#. openerp-web
#: addons/web/static/src/js/chrome.js:790
@ -102,7 +102,7 @@ msgstr "Annuleren"
#. openerp-web
#: addons/web/static/src/js/chrome.js:791
msgid "Change password"
msgstr ""
msgstr "Wachtwoord wijzigen"
#. openerp-web
#: addons/web/static/src/js/chrome.js:792
@ -119,24 +119,24 @@ msgstr "Opslaan"
#: addons/web/static/src/xml/base.xml:226
#: addons/web/static/src/xml/base.xml:1729
msgid "Change Password"
msgstr ""
msgstr "Wachtwoord wijzigen"
#. openerp-web
#: addons/web/static/src/js/chrome.js:1096
#: addons/web/static/src/js/chrome.js:1100
msgid "OpenERP - Unsupported/Community Version"
msgstr ""
msgstr "OpenERP - Niet-ondersteunde/Communityversie"
#. openerp-web
#: addons/web/static/src/js/chrome.js:1131
#: addons/web/static/src/js/chrome.js:1135
msgid "Client Error"
msgstr ""
msgstr "Clientfout"
#. openerp-web
#: addons/web/static/src/js/data_export.js:6
msgid "Export Data"
msgstr ""
msgstr "Gegevens exporteren"
#. openerp-web
#: addons/web/static/src/js/data_export.js:19
@ -154,37 +154,37 @@ msgstr "Sluiten"
#. openerp-web
#: addons/web/static/src/js/data_export.js:20
msgid "Export To File"
msgstr ""
msgstr "Naar bestand exporteren"
#. openerp-web
#: addons/web/static/src/js/data_export.js:125
msgid "Please enter save field list name"
msgstr ""
msgstr "Geef eerst de naam van de lijst"
#. openerp-web
#: addons/web/static/src/js/data_export.js:360
msgid "Please select fields to save export list..."
msgstr ""
msgstr "Kies velden voor de lijst"
#. openerp-web
#: addons/web/static/src/js/data_export.js:373
msgid "Please select fields to export..."
msgstr ""
msgstr "Kies te exporteren velden"
#. openerp-web
#: addons/web/static/src/js/data_import.js:34
msgid "Import Data"
msgstr ""
msgstr "Gegevens importeren"
#. openerp-web
#: addons/web/static/src/js/data_import.js:70
msgid "Import File"
msgstr ""
msgstr "Bestand importeren"
#. openerp-web
#: addons/web/static/src/js/data_import.js:105
msgid "External ID"
msgstr ""
msgstr "Externe id"
#. openerp-web
#: addons/web/static/src/js/formats.js:300
@ -192,14 +192,14 @@ msgstr ""
#: addons/web/static/src/js/formats.js:322
#: addons/web/static/src/js/view_page.js:251
msgid "Download"
msgstr ""
msgstr "Downloaden"
#. openerp-web
#: addons/web/static/src/js/formats.js:305
#: addons/web/static/src/js/formats.js:327
#, python-format
msgid "Download \"%s\""
msgstr ""
msgstr "Download \"%s\""
#. openerp-web
#: addons/web/static/src/js/search.js:191
@ -216,70 +216,70 @@ msgstr ""
#: addons/web/static/src/js/search.js:291
#: addons/web/static/src/js/search.js:296
msgid "OK"
msgstr ""
msgstr "OK"
#. openerp-web
#: addons/web/static/src/js/search.js:286
#: addons/web/static/src/xml/base.xml:1292
#: addons/web/static/src/js/search.js:291
msgid "Add to Dashboard"
msgstr ""
msgstr "Aan dashboard toevoegen"
#. openerp-web
#: addons/web/static/src/js/search.js:415
#: addons/web/static/src/js/search.js:420
msgid "Invalid Search"
msgstr ""
msgstr "Ongeldige zoekopdracht"
#. openerp-web
#: addons/web/static/src/js/search.js:415
#: addons/web/static/src/js/search.js:420
msgid "triggered from search view"
msgstr ""
msgstr "geactiveerd door zoekweergave"
#. openerp-web
#: addons/web/static/src/js/search.js:503
#: addons/web/static/src/js/search.js:508
#, python-format
msgid "Incorrect value for field %(fieldname)s: [%(value)s] is %(message)s"
msgstr ""
msgstr "Onjuiste waarde voor veld %(fieldname)s: [%(value)s] is %(message)s"
#. openerp-web
#: addons/web/static/src/js/search.js:839
#: addons/web/static/src/js/search.js:844
msgid "not a valid integer"
msgstr ""
msgstr "geen geldig geheel getal"
#. openerp-web
#: addons/web/static/src/js/search.js:853
#: addons/web/static/src/js/search.js:858
msgid "not a valid number"
msgstr ""
msgstr "geen geldig getal"
#. openerp-web
#: addons/web/static/src/js/search.js:931
#: addons/web/static/src/xml/base.xml:968
#: addons/web/static/src/js/search.js:936
msgid "Yes"
msgstr ""
msgstr "Ja"
#. openerp-web
#: addons/web/static/src/js/search.js:932
#: addons/web/static/src/js/search.js:937
msgid "No"
msgstr ""
msgstr "Nee"
#. openerp-web
#: addons/web/static/src/js/search.js:1290
#: addons/web/static/src/js/search.js:1295
msgid "contains"
msgstr ""
msgstr "bevat"
#. openerp-web
#: addons/web/static/src/js/search.js:1291
#: addons/web/static/src/js/search.js:1296
msgid "doesn't contain"
msgstr ""
msgstr "bevat niet"
#. openerp-web
#: addons/web/static/src/js/search.js:1292
@ -293,7 +293,7 @@ msgstr ""
#: addons/web/static/src/js/search.js:1349
#: addons/web/static/src/js/search.js:1370
msgid "is equal to"
msgstr ""
msgstr "is gelijk aan"
#. openerp-web
#: addons/web/static/src/js/search.js:1293
@ -307,7 +307,7 @@ msgstr ""
#: addons/web/static/src/js/search.js:1350
#: addons/web/static/src/js/search.js:1371
msgid "is not equal to"
msgstr ""
msgstr "is niet gelijk aan"
#. openerp-web
#: addons/web/static/src/js/search.js:1294
@ -321,7 +321,7 @@ msgstr ""
#: addons/web/static/src/js/search.js:1351
#: addons/web/static/src/js/search.js:1372
msgid "greater than"
msgstr ""
msgstr "is groter dan"
#. openerp-web
#: addons/web/static/src/js/search.js:1295
@ -335,7 +335,7 @@ msgstr ""
#: addons/web/static/src/js/search.js:1352
#: addons/web/static/src/js/search.js:1373
msgid "less than"
msgstr ""
msgstr "is kleiner dan"
#. openerp-web
#: addons/web/static/src/js/search.js:1296
@ -349,7 +349,7 @@ msgstr ""
#: addons/web/static/src/js/search.js:1353
#: addons/web/static/src/js/search.js:1374
msgid "greater or equal than"
msgstr ""
msgstr "is groter of gelijk aan"
#. openerp-web
#: addons/web/static/src/js/search.js:1297
@ -363,7 +363,7 @@ msgstr ""
#: addons/web/static/src/js/search.js:1354
#: addons/web/static/src/js/search.js:1375
msgid "less or equal than"
msgstr ""
msgstr "is kleiner dan of gelijk aan"
#. openerp-web
#: addons/web/static/src/js/search.js:1360
@ -371,31 +371,31 @@ msgstr ""
#: addons/web/static/src/js/search.js:1365
#: addons/web/static/src/js/search.js:1388
msgid "is"
msgstr ""
msgstr "is gelijk aan"
#. openerp-web
#: addons/web/static/src/js/search.js:1384
#: addons/web/static/src/js/search.js:1389
msgid "is not"
msgstr ""
msgstr "is niet gelijk aan"
#. openerp-web
#: addons/web/static/src/js/search.js:1396
#: addons/web/static/src/js/search.js:1401
msgid "is true"
msgstr ""
msgstr "is waar"
#. openerp-web
#: addons/web/static/src/js/search.js:1397
#: addons/web/static/src/js/search.js:1402
msgid "is false"
msgstr ""
msgstr "is onwaar"
#. openerp-web
#: addons/web/static/src/js/view_editor.js:20
#, python-format
msgid "Manage Views (%s)"
msgstr ""
msgstr "Weergaven beheren (%s)"
#. openerp-web
#: addons/web/static/src/js/view_editor.js:46
@ -411,7 +411,7 @@ msgstr "Creër"
#: addons/web/static/src/xml/base.xml:483
#: addons/web/static/src/xml/base.xml:755
msgid "Edit"
msgstr ""
msgstr "Bewerken"
#. openerp-web
#: addons/web/static/src/js/view_editor.js:48
@ -423,18 +423,18 @@ msgstr "Verwijderen"
#: addons/web/static/src/js/view_editor.js:71
#, python-format
msgid "Create a view (%s)"
msgstr ""
msgstr "Een weergave maken (%s)"
#. openerp-web
#: addons/web/static/src/js/view_editor.js:168
msgid "Do you really want to remove this view?"
msgstr ""
msgstr "Wilt u deze weergave echt verwijderen?"
#. openerp-web
#: addons/web/static/src/js/view_editor.js:364
#, python-format
msgid "View Editor %d - %s"
msgstr ""
msgstr "Bekijk editor %d - %s"
#. openerp-web
#: addons/web/static/src/js/view_editor.js:367
@ -449,7 +449,7 @@ msgstr ""
#. openerp-web
#: addons/web/static/src/js/view_editor.js:381
msgid "Preview"
msgstr ""
msgstr "Voorbeeld"
#. openerp-web
#: addons/web/static/src/js/view_editor.js:501

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:14+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:05+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172
@ -235,7 +235,7 @@ msgstr "Felaktig sökning"
#: addons/web/static/src/js/search.js:415
#: addons/web/static/src/js/search.js:420
msgid "triggered from search view"
msgstr ""
msgstr "aktiverad från sökvyn"
#. openerp-web
#: addons/web/static/src/js/search.js:503
@ -590,7 +590,7 @@ msgstr "Skapa: "
#: addons/web/static/src/xml/base.xml:1646
#: addons/web/static/src/js/view_form.js:2680
msgid "Add"
msgstr "Tillägg"
msgstr "Lägg till"
#. openerp-web
#: addons/web/static/src/js/view_form.js:2721
@ -653,7 +653,7 @@ msgstr "Träd"
#: addons/web/static/src/js/views.js:565
#: addons/web/static/src/xml/base.xml:480
msgid "Fields View Get"
msgstr ""
msgstr "Fält för visningsvy"
#. openerp-web
#: addons/web/static/src/js/views.js:573
@ -676,7 +676,7 @@ msgstr "Hantera vyer"
#. openerp-web
#: addons/web/static/src/js/views.js:611
msgid "Could not find current view declaration"
msgstr ""
msgstr "Aktuell visningsvydeklaration saknas"
#. openerp-web
#: addons/web/static/src/js/views.js:805
@ -686,7 +686,7 @@ msgstr "Översätt"
#. openerp-web
#: addons/web/static/src/js/views.js:807
msgid "Technical translation"
msgstr ""
msgstr "Teknisk översättning"
#. openerp-web
#: addons/web/static/src/js/views.js:811
@ -1350,6 +1350,10 @@ msgid ""
" You can export all data or only the fields that can be "
"reimported after modification."
msgstr ""
"Den här guiden kommer att exportera alla data som matchar de aktuella "
"sökkriterierna till en CSV-fil.\n"
" Du kan exportera alla data eller endast de fält som kan "
"återimporteras efter modifiering."
#. openerp-web
#: addons/web/static/src/xml/base.xml:1618
@ -1432,6 +1436,9 @@ msgid ""
"Select a .CSV file to import. If you need a sample of file to import,\n"
" you should use the export tool with the \"Import Compatible\" option."
msgstr ""
"Välj en CSV-fil som ska importeras. Om du behöver ett prov av filen för att "
"importera,\n"
" kan du först exportera en, ange då \"Importkompatibel\"-alternativet."
#. openerp-web
#: addons/web/static/src/xml/base.xml:1747
@ -1489,6 +1496,7 @@ msgid ""
"For use if CSV files have titles on multiple lines, skips more than a single "
"line during import"
msgstr ""
"Använd då CSV-filer flera titelrader som skall hoppas över vid import"
#. openerp-web
#: addons/web/static/src/xml/base.xml:1803

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web/static/src/js/chrome.js:172

View File

@ -4,7 +4,7 @@
// TODO: t-set + t-value + children node == scoped variable ?
var QWeb2 = {
expressions_cache: {},
RESERVED_WORDS: 'true,false,NaN,null,undefined,debugger,console,in,instanceof,new,function,return,this,typeof,eval,Math,RegExp,Array,Object,Date'.split(','),
RESERVED_WORDS: 'true,false,NaN,null,undefined,debugger,console,in,instanceof,new,function,return,this,typeof,eval,void,Math,RegExp,Array,Object,Date'.split(','),
ACTIONS_PRECEDENCE: 'foreach,if,call,set,esc,escf,raw,rawf,js,debug,log'.split(','),
WORD_REPLACEMENT: {
'and': '&&',

View File

@ -1,22 +0,0 @@
Copyright (c) 2011 Samuel Clay, @samuelclay, DocumentCloud
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

View File

@ -1,16 +0,0 @@
__ ___ _ _____ _ _
\ \ / (_) | |/ ____| | | (_)
\ \ / / _ ___ _ _ __ _| | (___ ___ __ _ _ __ ___| |__ _ ___
\ \/ / | / __| | | |/ _` | |\___ \ / _ \/ _` | '__/ __| '_ \ | / __|
\ / | \__ \ |_| | (_| | |____) | __/ (_| | | | (__| | | |_| \__ \
\/ |_|___/\__,_|\__,_|_|_____/ \___|\__,_|_| \___|_| |_(_) |___/
_/ |
|__/
VisualSearch.js enhances ordinary search boxes with the ability to autocomplete
faceted search queries. Specify the facets for completion, along with the
completable values for any facet. You can retrieve the search query as a
structured object, so you don't have to parse the query string yourself.
For documentation, pre-packed downloads, demos, and tests, see:
http://documentcloud.github.com/visualsearch

View File

@ -1,37 +0,0 @@
require 'rubygems'
require 'jammit'
require 'fileutils'
desc "Use Jammit to compile the multiple versions of Visual Search"
task :build do
$VS_MIN = false
Jammit.package!({
:config_path => "assets.yml",
:output_folder => "build"
})
$VS_MIN = true
Jammit.package!({
:config_path => "assets.yml",
:output_folder => "build-min"
})
# Move the JSTs back to lib to accomodate the demo page.
FileUtils.mv("build/visualsearch_templates.js", "lib/js/templates/templates.js")
# Fix image url paths.
['build', 'build-min'].each do |build|
File.open("#{build}/visualsearch.css", 'r+') do |file|
css = file.read
css.gsub!(/url\((.*?)images\/embed\/icons/, 'url(../images/embed/icons')
file.rewind
file.write(css)
file.truncate(css.length)
end
end
end
desc "Build the docco documentation"
task :docs do
sh "docco lib/js/*.js lib/js/**/*.js"
end

View File

@ -1,28 +0,0 @@
embed_assets: datauri
javascript_compressor: closure
template_function: _.template
gzip_assets: <% if $VS_MIN %>on<% else %>off<% end %>
compress_assets: <% if $VS_MIN %>on<% else %>off<% end %>
javascripts:
dependencies:
- vendor/jquery-*.js
- vendor/jquery.ui.core.js
- vendor/jquery.ui.widget.js
- vendor/jquery.ui.position.js
- vendor/jquery.ui.*.js
- vendor/underscore-*.js
- vendor/backbone-*.js
visualsearch:
- lib/js/visualsearch.js
- lib/js/views/*.js
- lib/js/utils/*.js
- lib/js/models/*.js
- lib/js/templates/*.jst
<% unless $VS_MIN %>visualsearch_templates:
- lib/js/templates/*.jst
<% end %>
stylesheets:
visualsearch:
- lib/css/*.css

View File

@ -1,310 +0,0 @@
.VS-search .VS-icon {
background-repeat: no-repeat;
background-position: center center;
vertical-align: middle;
width: 16px; height: 16px;
}
.VS-search .VS-icon-cancel {
width: 11px; height: 11px;
background-position: center 0;
background-image: url("data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAWCAYAAAAW5GZjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAb9JREFUeNqUUr1qAkEQ3j0khQp6kihaeGgEEa18gTQR0iRY+BaBSMDGwidIEUKqFL6BopgqBAJ5AMFGjUU0d4WHEvwJarvZ77gRIzGYgb1hZr+Z75vZ40IIzqTNZrPj8Xicn0wmmcViEXS73aaqqq+BQODG6/W+A8MBNk3zfDAY3C6Xy0O2ZS6X6zMSiVwHg8FHLjtq7Xb7RQKj7BeTzVCgJ5PJU2U0GhUk7REuMpkMi8fjFggeMeecrVYrFRId0CgTAgDDMFg4HLbA8IjJgHNgGEr0er0fQIphUmZAwdSUADUB4RFDsz3oSMF6CLzZkQqgGebz+Z75dDqNdTqdp13bgDmdTj2VSp0oWHg0Gr2UNH2Z/9o+yMv7K4/HY/C/XhDUfr//jl7QQVT9fp/V63VWqVRYt9tliUSCZbPZg1wux9Lp9PqFeK1Wu9A0DdXz7YM87i0FrVZLs4Fi1wmFQh/NZjOmVKvVgq7rR/QflMtlixGedjwcDlUpMQ9tbzalkAAB2/R297mNW+sT2wUbUnA//V/nYrH4QOBNABUQuFQq3TNMuc82sDVrz41G42yvPeODAwZQ0QzwiJEnzLcAAwBJ6WXlwoBgZAAAAABJRU5ErkJggg==");
cursor: pointer;
}
.VS-search .VS-icon-cancel:hover {
background-position: center -11px;
}
.VS-search .VS-icon-search {
width: 12px; height: 12px;
background-image: url("data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUZJREFUeNpUUM2qgmAQzS8NiUgLzTIXLZQW1QuI9AY9QPSW9gQ9QiriwpJQEBVrVWT2d7p2L9xZzDdzZs7M+YYqy/J8Ptu2vd/v4zgeDAaqqk4mE47jar9GnU6nzWbjOA5FUa/Xq0Jns9l8Pud5vkpp58cwAOzhcBhFkeu6GNztdg3D+Db5vo9nOp2iiWGYTqdDCMFe4LquI0aVpGmKR9M0lmUbjQY8YiBJklTb4YkoilBzOBzq9TogeMQIJEmqmlAlo9EIyXa7tSyrKAp4xEBkWUb5q2k8Hh+PR8/zwjCEgufz+aESstvtoKnVan2GgY31kBkEAfT1ej1FUZDiNIIgrFYr9H1ug3teLpfH43G/3/FBUJGu1+s8z8FZLpc0mmiabrfbf5fEumazuVgsTNO8Xq+3242qRNT+G0CMz7IMzH6//xZgAA60tj6rqzxpAAAAAElFTkSuQmCC");
}
/*------------------------------ RESET + DEFAULT STYLES ---------------------------------*/
/*
Eric Meyer's final reset.css
Source: http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/
*/
.VS-search div, .VS-search span, .VS-search a, .VS-search img,
.VS-search ul, .VS-search li, .VS-search form, .VS-search label,
.VS-interface ul, .VS-interface li, .VS-interface {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-weight: inherit;
font-style: inherit;
font-size: 100%;
font-family: inherit;
vertical-align: baseline;
}
.VS-search :focus {
outline: 0;
}
.VS-search {
line-height: 1;
color: black;
}
.VS-search ol, .VS-search ul {
list-style: none;
}
/* ===================== */
/* = General and Reset = */
/* ===================== */
.VS-search {
font-family: Arial, sans-serif;
color: #373737;
font-size: 12px;
}
.VS-search input {
display: block;
border: none;
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
outline: none;
margin: 0; padding: 4px;
background: transparent;
font-size: 16px;
line-height: 20px;
width: 100%;
}
.VS-interface, .VS-search .dialog, .VS-search input {
font-family: "Lucida Grande", "Lucida Sans Unicode", Helvetica, Arial, sans-serif !important;
line-height: 1.1em;
}
/* ========== */
/* = Layout = */
/* ========== */
.VS-search .VS-search-box {
cursor: text;
position: relative;
background: transparent;
border: 2px solid #ccc;
border-radius: 16px; -webkit-border-radius: 16px; -moz-border-radius: 16px;
background-color: #fafafa;
-webkit-box-shadow: inset 0px 0px 3px #ccc;
-moz-box-shadow: inset 0px 0px 3px #ccc;
box-shadow: inset 0px 0px 3px #ccc;
min-height: 28px;
height: auto;
}
.VS-search .VS-search-box.VS-focus {
border-color: #acf;
-webkit-box-shadow: inset 0px 0px 3px #acf;
-moz-box-shadow: inset 0px 0px 3px #acf;
box-shadow: inset 0px 0px 3px #acf;
}
.VS-search .VS-search-inner {
position: relative;
margin: 0 20px 0 22px;
overflow: hidden;
}
.VS-search input {
width: 100px;
}
.VS-search input,
.VS-search .VS-input-width-tester {
padding: 6px 0;
float: left;
color: #808080;
font: 13px/17px Helvetica, Arial;
}
.VS-search.VS-focus input {
color: #606060;
}
.VS-search .VS-icon-search {
position: absolute;
left: 9px; top: 8px;
}
.VS-search .VS-icon-cancel {
position: absolute;
right: 9px; top: 8px;
}
/* ================ */
/* = Search Facet = */
/* ================ */
.VS-search .search_facet {
float: left;
margin: 0;
padding: 0 0 0 14px;
position: relative;
border: 1px solid transparent;
height: 20px;
margin: 3px -3px 3px 0;
}
.VS-search .search_facet.is_selected {
margin-left: -3px;
-webkit-border-radius: 16px;
-moz-border-radius: 16px;
border-radius: 16px;
background-color: #d2e6fd;
background-image: -moz-linear-gradient(top, #d2e6fd, #b0d1f9); /* FF3.6 */
background-image: -webkit-gradient(linear, left top, left bottom, from(#d2e6fd), to(#b0d1f9)); /* Saf4+, Chrome */
background-image: linear-gradient(top, #d2e6fd, #b0d1f9);
border: 1px solid #6eadf5;
}
.VS-search .search_facet .category {
float: left;
text-transform: uppercase;
font-weight: bold;
font-size: 10px;
color: #808080;
padding: 8px 0 5px;
line-height: 13px;
cursor: pointer;
padding: 4px 0 0;
}
.VS-search .search_facet.is_selected .category {
margin-left: 3px;
}
.VS-search .search_facet .search_facet_input_container {
float: left;
}
.VS-search .search_facet input {
margin: 0;
padding: 0;
color: #000;
font-size: 13px;
line-height: 16px;
padding: 5px 0 5px 4px;
height: 16px;
width: auto;
z-index: 100;
position: relative;
padding-top: 1px;
padding-bottom: 2px;
padding-right: 3px;
}
.VS-search .search_facet.is_editing input,
.VS-search .search_facet.is_selected input {
color: #000;
}
.VS-search .search_facet .search_facet_remove {
position: absolute;
left: 0;
top: 4px;
}
.VS-search .search_facet.is_selected .search_facet_remove {
opacity: 0.4;
left: 3px;
filter: alpha(opacity=40);
background-position: center -11px;
}
.VS-search .search_facet .search_facet_remove:hover {
opacity: 1;
}
.VS-search .search_facet.is_editing .category,
.VS-search .search_facet.is_selected .category {
color: #000;
}
.VS-search .search_facet.search_facet_maybe_delete .category,
.VS-search .search_facet.search_facet_maybe_delete input {
color: darkred;
}
/* ================ */
/* = Search Input = */
/* ================ */
.VS-search .search_input {
height: 28px;
float: left;
margin-left: -1px;
}
.VS-search .search_input input {
padding: 6px 3px 6px 2px;
line-height: 10px;
height: 22px;
margin-top: -4px;
width: 10px;
z-index: 100;
min-width: 4px;
position: relative;
}
.VS-search .search_input.is_editing input {
color: #202020;
}
/* ================ */
/* = Autocomplete = */
/* ================ */
.VS-interface.ui-autocomplete {
position: absolute;
border: 1px solid #C0C0C0;
border-top: 1px solid #D9D9D9;
background-color: #F6F6F6;
cursor: pointer;
z-index: 10000;
padding: 0;
margin: 0;
width: auto;
min-width: 80px;
max-width: 220px;
max-height: 240px;
overflow-y: auto;
overflow-x: hidden;
font-size: 13px;
top: 5px;
opacity: 0.97;
box-shadow: 3px 4px 5px -2px rgba(0, 0, 0, 0.5); -webkit-box-shadow: 3px 4px 5px -2px rgba(0, 0, 0, 0.5); -moz-box-shadow: 3px 4px 5px -2px rgba(0, 0, 0, 0.5);
}
.VS-interface.ui-autocomplete .ui-autocomplete-category {
text-transform: capitalize;
font-size: 11px;
padding: 4px 4px 4px;
border-top: 1px solid #A2A2A2;
border-bottom: 1px solid #A2A2A2;
background-color: #B7B7B7;
text-shadow: 0 -1px 0 #999;
font-weight: bold;
color: white;
cursor: default;
}
.VS-interface.ui-autocomplete .ui-menu-item {
float: none;
}
.VS-interface.ui-autocomplete .ui-menu-item a {
color: #000;
outline: none;
display: block;
padding: 3px 4px 5px;
border-radius: none;
line-height: 1;
background-color: #F8F8F8;
background-image: -moz-linear-gradient(top, #F8F8F8, #F3F3F3); /* FF3.6 */
background-image: -webkit-gradient(linear, left top, left bottom, from(#F8F8F8), to(#F3F3F3)); /* Saf4+, Chrome */
background-image: linear-gradient(top, #F8F8F8, #F3F3F3);
border-top: 1px solid #FAFAFA;
border-bottom: 1px solid #f0f0f0;
}
.VS-interface.ui-autocomplete .ui-menu-item a:active {
outline: none;
}
.VS-interface.ui-autocomplete .ui-menu-item .ui-state-hover {
background-color: #6483F7;
background-image: -moz-linear-gradient(top, #648bF5, #2465f3); /* FF3.6 */
background-image: -webkit-gradient(linear, left top, left bottom, from(#648bF5), to(#2465f3)); /* Saf4+, Chrome */
background-image: linear-gradient(top, #648bF5, #2465f3);
border-top: 1px solid #5b83ec;
border-bottom: 1px solid #1459e9;
border-left: none;
border-right: none;
color: white;
margin: 0;
}
.VS-interface.ui-autocomplete .ui-corner-all {
border-radius: 0;
}
.VS-interface.ui-autocomplete li {
list-style: none;
width: auto;
}

View File

@ -1,310 +0,0 @@
.VS-search .VS-icon {
background-repeat: no-repeat;
background-position: center center;
vertical-align: middle;
width: 16px; height: 16px;
}
.VS-search .VS-icon-cancel {
width: 11px; height: 11px;
background-position: center 0;
background-image: url(../images/embed/icons/cancel_search.png?1311104738);
cursor: pointer;
}
.VS-search .VS-icon-cancel:hover {
background-position: center -11px;
}
.VS-search .VS-icon-search {
width: 12px; height: 12px;
background-image: url(../images/embed/icons/search_glyph.png?1311104738);
}
/*------------------------------ RESET + DEFAULT STYLES ---------------------------------*/
/*
Eric Meyer's final reset.css
Source: http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/
*/
.VS-search div, .VS-search span, .VS-search a, .VS-search img,
.VS-search ul, .VS-search li, .VS-search form, .VS-search label,
.VS-interface ul, .VS-interface li, .VS-interface {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-weight: inherit;
font-style: inherit;
font-size: 100%;
font-family: inherit;
vertical-align: baseline;
}
.VS-search :focus {
outline: 0;
}
.VS-search {
line-height: 1;
color: black;
}
.VS-search ol, .VS-search ul {
list-style: none;
}
/* ===================== */
/* = General and Reset = */
/* ===================== */
.VS-search {
font-family: Arial, sans-serif;
color: #373737;
font-size: 12px;
}
.VS-search input {
display: block;
border: none;
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
outline: none;
margin: 0; padding: 4px;
background: transparent;
font-size: 16px;
line-height: 20px;
width: 100%;
}
.VS-interface, .VS-search .dialog, .VS-search input {
font-family: "Lucida Grande", "Lucida Sans Unicode", Helvetica, Arial, sans-serif !important;
line-height: 1.1em;
}
/* ========== */
/* = Layout = */
/* ========== */
.VS-search .VS-search-box {
cursor: text;
position: relative;
background: transparent;
border: 2px solid #ccc;
border-radius: 16px; -webkit-border-radius: 16px; -moz-border-radius: 16px;
background-color: #fafafa;
-webkit-box-shadow: inset 0px 0px 3px #ccc;
-moz-box-shadow: inset 0px 0px 3px #ccc;
box-shadow: inset 0px 0px 3px #ccc;
min-height: 28px;
height: auto;
}
.VS-search .VS-search-box.VS-focus {
border-color: #acf;
-webkit-box-shadow: inset 0px 0px 3px #acf;
-moz-box-shadow: inset 0px 0px 3px #acf;
box-shadow: inset 0px 0px 3px #acf;
}
.VS-search .VS-search-inner {
position: relative;
margin: 0 20px 0 22px;
overflow: hidden;
}
.VS-search input {
width: 100px;
}
.VS-search input,
.VS-search .VS-input-width-tester {
padding: 6px 0;
float: left;
color: #808080;
font: 13px/17px Helvetica, Arial;
}
.VS-search.VS-focus input {
color: #606060;
}
.VS-search .VS-icon-search {
position: absolute;
left: 9px; top: 8px;
}
.VS-search .VS-icon-cancel {
position: absolute;
right: 9px; top: 8px;
}
/* ================ */
/* = Search Facet = */
/* ================ */
.VS-search .search_facet {
float: left;
margin: 0;
padding: 0 0 0 14px;
position: relative;
border: 1px solid transparent;
height: 20px;
margin: 3px -3px 3px 0;
}
.VS-search .search_facet.is_selected {
margin-left: -3px;
-webkit-border-radius: 16px;
-moz-border-radius: 16px;
border-radius: 16px;
background-color: #d2e6fd;
background-image: -moz-linear-gradient(top, #d2e6fd, #b0d1f9); /* FF3.6 */
background-image: -webkit-gradient(linear, left top, left bottom, from(#d2e6fd), to(#b0d1f9)); /* Saf4+, Chrome */
background-image: linear-gradient(top, #d2e6fd, #b0d1f9);
border: 1px solid #6eadf5;
}
.VS-search .search_facet .category {
float: left;
text-transform: uppercase;
font-weight: bold;
font-size: 10px;
color: #808080;
padding: 8px 0 5px;
line-height: 13px;
cursor: pointer;
padding: 4px 0 0;
}
.VS-search .search_facet.is_selected .category {
margin-left: 3px;
}
.VS-search .search_facet .search_facet_input_container {
float: left;
}
.VS-search .search_facet input {
margin: 0;
padding: 0;
color: #000;
font-size: 13px;
line-height: 16px;
padding: 5px 0 5px 4px;
height: 16px;
width: auto;
z-index: 100;
position: relative;
padding-top: 1px;
padding-bottom: 2px;
padding-right: 3px;
}
.VS-search .search_facet.is_editing input,
.VS-search .search_facet.is_selected input {
color: #000;
}
.VS-search .search_facet .search_facet_remove {
position: absolute;
left: 0;
top: 4px;
}
.VS-search .search_facet.is_selected .search_facet_remove {
opacity: 0.4;
left: 3px;
filter: alpha(opacity=40);
background-position: center -11px;
}
.VS-search .search_facet .search_facet_remove:hover {
opacity: 1;
}
.VS-search .search_facet.is_editing .category,
.VS-search .search_facet.is_selected .category {
color: #000;
}
.VS-search .search_facet.search_facet_maybe_delete .category,
.VS-search .search_facet.search_facet_maybe_delete input {
color: darkred;
}
/* ================ */
/* = Search Input = */
/* ================ */
.VS-search .search_input {
height: 28px;
float: left;
margin-left: -1px;
}
.VS-search .search_input input {
padding: 6px 3px 6px 2px;
line-height: 10px;
height: 22px;
margin-top: -4px;
width: 10px;
z-index: 100;
min-width: 4px;
position: relative;
}
.VS-search .search_input.is_editing input {
color: #202020;
}
/* ================ */
/* = Autocomplete = */
/* ================ */
.VS-interface.ui-autocomplete {
position: absolute;
border: 1px solid #C0C0C0;
border-top: 1px solid #D9D9D9;
background-color: #F6F6F6;
cursor: pointer;
z-index: 10000;
padding: 0;
margin: 0;
width: auto;
min-width: 80px;
max-width: 220px;
max-height: 240px;
overflow-y: auto;
overflow-x: hidden;
font-size: 13px;
top: 5px;
opacity: 0.97;
box-shadow: 3px 4px 5px -2px rgba(0, 0, 0, 0.5); -webkit-box-shadow: 3px 4px 5px -2px rgba(0, 0, 0, 0.5); -moz-box-shadow: 3px 4px 5px -2px rgba(0, 0, 0, 0.5);
}
.VS-interface.ui-autocomplete .ui-autocomplete-category {
text-transform: capitalize;
font-size: 11px;
padding: 4px 4px 4px;
border-top: 1px solid #A2A2A2;
border-bottom: 1px solid #A2A2A2;
background-color: #B7B7B7;
text-shadow: 0 -1px 0 #999;
font-weight: bold;
color: white;
cursor: default;
}
.VS-interface.ui-autocomplete .ui-menu-item {
float: none;
}
.VS-interface.ui-autocomplete .ui-menu-item a {
color: #000;
outline: none;
display: block;
padding: 3px 4px 5px;
border-radius: none;
line-height: 1;
background-color: #F8F8F8;
background-image: -moz-linear-gradient(top, #F8F8F8, #F3F3F3); /* FF3.6 */
background-image: -webkit-gradient(linear, left top, left bottom, from(#F8F8F8), to(#F3F3F3)); /* Saf4+, Chrome */
background-image: linear-gradient(top, #F8F8F8, #F3F3F3);
border-top: 1px solid #FAFAFA;
border-bottom: 1px solid #f0f0f0;
}
.VS-interface.ui-autocomplete .ui-menu-item a:active {
outline: none;
}
.VS-interface.ui-autocomplete .ui-menu-item .ui-state-hover {
background-color: #6483F7;
background-image: -moz-linear-gradient(top, #648bF5, #2465f3); /* FF3.6 */
background-image: -webkit-gradient(linear, left top, left bottom, from(#648bF5), to(#2465f3)); /* Saf4+, Chrome */
background-image: linear-gradient(top, #648bF5, #2465f3);
border-top: 1px solid #5b83ec;
border-bottom: 1px solid #1459e9;
border-left: none;
border-right: none;
color: white;
margin: 0;
}
.VS-interface.ui-autocomplete .ui-corner-all {
border-radius: 0;
}
.VS-interface.ui-autocomplete li {
list-style: none;
width: auto;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,453 +0,0 @@
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<title>DocumentCloud's VisualSearch.js</title>
<style>
body {
font-size: 16px;
line-height: 24px;
background: #FEF3CA;
color: #022;
height: 100%;
font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
}
div.container {
width: 720px;
margin: 50px 0 50px 50px;
}
p, li {
margin: 16px 0 16px 0;
width: 550px;
}
p.break {
margin-top: 35px;
}
ol {
padding-left: 24px;
}
ol li {
font-weight: bold;
margin-left: 0;
}
a, a:visited {
padding: 0 2px;
text-decoration: none;
background: #f0c095;
color: #252519;
}
a:active, a:hover {
color: #FFF;
background: #C25D00;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 40px;
}
b.header {
font-size: 18px;
}
span.alias {
font-size: 14px;
font-style: italic;
margin-left: 20px;
}
table {
margin: 16px 0; padding: 0;
}
tr, td, th {
margin: 0; padding: 0;
text-align: left;
}
th {
padding: 24px 0 0;
}
tr:first-child th {
padding-top: 0;
}
td {
padding: 6px 15px 6px 0;
}
td.definition {
line-height: 18px;
font-size: 14px;
}
table.downloads td {
padding-left: 18px;
}
.demo-hint {
font-size: 13px;
margin: 0 0 12px 12px;
font-weight: normal;
}
#VS code, #VS pre, #VS tt {
font-family: Monaco, Consolas, "Lucida Console", monospace;
font-size: 12px;
line-height: 18px;
color: #444;
background: none;
}
#VS code {
margin-left: 8px;
padding: 0 0 0 12px;
font-weight: normal;
}
#VS pre {
font-size: 12px;
padding: 2px 0 2px 0;
border-left: 6px solid #829C37;
margin: 12px 0;
}
#search_query {
margin: 18px 0;
opacity: 0;
}
#search_query .raquo {
font-size: 18px;
line-height: 12px;
font-weight: bold;
margin-right: 4px;
}
#search_query2 {
margin: 18px 0;
opacity: 0;
}
#search_query2 .raquo {
font-size: 18px;
line-height: 12px;
font-weight: bold;
margin-right: 4px;
}
</style>
<link rel="stylesheet" href="lib/css/reset.css" type="text/css" media="screen" charset="utf-8">
<link rel="stylesheet" href="lib/css/icons.css" type="text/css" media="screen" charset="utf-8">
<link rel="stylesheet" href="lib/css/workspace.css" type="text/css" media="screen" charset="utf-8">
<script src="vendor/jquery-1.6.1.js" type="text/javascript" charset="utf-8"></script>
<!-- <script src="vendor/backported/jquery-1.4.4.js" type="text/javascript" charset="utf-8"></script> -->
<script src="vendor/jquery.ui.core.js" type="text/javascript" charset="utf-8"></script>
<script src="vendor/jquery.ui.widget.js" type="text/javascript" charset="utf-8"></script>
<script src="vendor/jquery.ui.position.js" type="text/javascript" charset="utf-8"></script>
<script src="vendor/jquery.ui.autocomplete.js" type="text/javascript" charset="utf-8"></script>
<script src="vendor/underscore-1.1.5.js" type="text/javascript" charset="utf-8"></script>
<script src="vendor/backbone-0.5.0.js" type="text/javascript" charset="utf-8"></script>
<script src="lib/js/visualsearch.js" type="text/javascript" charset="utf-8"></script>
<script src="lib/js/views/search_box.js" type="text/javascript" charset="utf-8"></script>
<script src="lib/js/views/search_facet.js" type="text/javascript" charset="utf-8"></script>
<script src="lib/js/views/search_input.js" type="text/javascript" charset="utf-8"></script>
<script src="lib/js/models/search_facets.js" type="text/javascript" charset="utf-8"></script>
<script src="lib/js/models/search_query.js" type="text/javascript" charset="utf-8"></script>
<script src="lib/js/utils/backbone_extensions.js" type="text/javascript" charset="utf-8"></script>
<script src="lib/js/utils/hotkeys.js" type="text/javascript" charset="utf-8"></script>
<script src="lib/js/utils/jquery_extensions.js" type="text/javascript" charset="utf-8"></script>
<script src="lib/js/utils/search_parser.js" type="text/javascript" charset="utf-8"></script>
<script src="lib/js/utils/inflector.js" type="text/javascript" charset="utf-8"></script>
<script src="lib/js/templates/templates.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div class="container" id="VS">
<h1><a href="index.html">VisualSearch.js</a></h1>
<p>
<a href="http://github.com/documentcloud/visualsearch">VisualSearch.js</a>
enhances ordinary search boxes with the ability to autocomplete
faceted search queries. Specify the facets for completion, along with the
completable values for any facet. You can retrieve the search query as a
structured object, so you don't have to parse the query string yourself.
</p>
<p>
<a href="docs/visualsearch.html">The complete annotated source code</a>
is also available.
</p>
<p>
The project is
<a href="http://github.com/documentcloud/visualsearch/">hosted on GitHub</a>.
You can report bugs and discuss features on the
<a href="http://github.com/documentcloud/visualsearch/issues">issues page</a>,
on Freenode in the <tt>#documentcloud</tt> channel,
or send tweets to <a href="http://twitter.com/documentcloud">@documentcloud</a>.
</p>
<p>
<i>VisualSearch.js is an open-source component of <a href="http://documentcloud.org/">DocumentCloud</a>.</i>
</p>
<h2 id="demo">Demo <span class="demo-hint"><i>Try searching for: <b>account</b>, <b>filter</b>, <b>access</b>, <b>title</b>, <b>city</b>, <b>state</b>, or <b>country</b>.</i></span></h2>
<div id="search_box_container"></div>
<div id="search_query">&nbsp;</div>
<script type="text/javascript" charset="utf-8">
$(document).ready(function() {
window.visualSearch = VS.init({
container : $('#search_box_container'),
query : 'country: "South Africa" account: 5-samuel title: "Pentagon Papers"',
// query : '',
unquotable : [
'text',
'account',
'filter',
'access'
],
callbacks : {
search : function(query, searchCollection) {
var $query = $('#search_query');
$query.stop().animate({opacity : 1}, {duration: 300, queue: false});
$query.html('<span class="raquo">&raquo;</span> You searched for: <b>' + searchCollection.serialize() + '</b>');
clearTimeout(window.queryHideDelay);
window.queryHideDelay = setTimeout(function() {
$query.animate({
opacity : 0
}, {
duration: 1000,
queue: false
});
}, 2000);
},
valueMatches : function(category, searchTerm, callback) {
switch (category) {
case 'account':
callback([
{ value: '1-amanda', label: 'Amanda' },
{ value: '2-aron', label: 'Aron' },
{ value: '3-eric', label: 'Eric' },
{ value: '4-jeremy', label: 'Jeremy' },
{ value: '5-samuel', label: 'Samuel' },
{ value: '6-scott', label: 'Scott' }
]);
break;
case 'filter':
callback(['published', 'unpublished', 'draft']);
break;
case 'access':
callback(['public', 'private', 'protected']);
break;
case 'title':
callback([
'Pentagon Papers',
'CoffeeScript Manual',
'Laboratory for Object Oriented Thinking',
'A Repository Grows in Brooklyn'
]);
break;
case 'city':
callback([
'Cleveland',
'New York City',
'Brooklyn',
'Manhattan',
'Queens',
'The Bronx',
'Staten Island',
'San Francisco',
'Los Angeles',
'Seattle',
'London',
'Portland',
'Chicago',
'Boston'
])
break;
case 'state':
callback([
"Alabama", "Alaska", "Arizona", "Arkansas", "California",
"Colorado", "Connecticut", "Delaware", "District of Columbia", "Florida",
"Georgia", "Guam", "Hawaii", "Idaho", "Illinois",
"Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana",
"Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota",
"Mississippi", "Missouri", "Montana", "Nebraska", "Nevada",
"New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina",
"North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania",
"Puerto Rico", "Rhode Island", "South Carolina", "South Dakota", "Tennessee",
"Texas", "Utah", "Vermont", "Virginia", "Virgin Islands",
"Washington", "West Virginia", "Wisconsin", "Wyoming"
]);
break
case 'country':
callback([
"China", "India", "United States", "Indonesia", "Brazil",
"Pakistan", "Bangladesh", "Nigeria", "Russia", "Japan",
"Mexico", "Philippines", "Vietnam", "Ethiopia", "Egypt",
"Germany", "Turkey", "Iran", "Thailand", "D. R. of Congo",
"France", "United Kingdom", "Italy", "Myanmar", "South Africa",
"South Korea", "Colombia", "Ukraine", "Spain", "Tanzania",
"Sudan", "Kenya", "Argentina", "Poland", "Algeria",
"Canada", "Uganda", "Morocco", "Iraq", "Nepal",
"Peru", "Afghanistan", "Venezuela", "Malaysia", "Uzbekistan",
"Saudi Arabia", "Ghana", "Yemen", "North Korea", "Mozambique",
"Taiwan", "Syria", "Ivory Coast", "Australia", "Romania",
"Sri Lanka", "Madagascar", "Cameroon", "Angola", "Chile",
"Netherlands", "Burkina Faso", "Niger", "Kazakhstan", "Malawi",
"Cambodia", "Guatemala", "Ecuador", "Mali", "Zambia",
"Senegal", "Zimbabwe", "Chad", "Cuba", "Greece",
"Portugal", "Belgium", "Czech Republic", "Tunisia", "Guinea",
"Rwanda", "Dominican Republic", "Haiti", "Bolivia", "Hungary",
"Belarus", "Somalia", "Sweden", "Benin", "Azerbaijan",
"Burundi", "Austria", "Honduras", "Switzerland", "Bulgaria",
"Serbia", "Israel", "Tajikistan", "Hong Kong", "Papua New Guinea",
"Togo", "Libya", "Jordan", "Paraguay", "Laos",
"El Salvador", "Sierra Leone", "Nicaragua", "Kyrgyzstan", "Denmark",
"Slovakia", "Finland", "Eritrea", "Turkmenistan"
], {preserveOrder: true});
break;
}
},
facetMatches : function(callback) {
callback([
'account', 'filter', 'access', 'title',
{ label: 'city', category: 'location' },
{ label: 'address', category: 'location' },
{ label: 'country', category: 'location' },
{ label: 'state', category: 'location' },
]);
}
}
});
});
</script>
<div id="search_box_container2"></div>
<div id="search_query2">&nbsp;</div>
<script type="text/javascript" charset="utf-8">
$(document).ready(function() {
var visualSearch = VS.init({
container : $('#search_box_container2'),
query : '',
// query : '',
unquotable : [
'text',
'account',
'filter',
'access'
],
callbacks : {
search : function(query, searchCollection) {
console.log(["query", searchCollection.facets(), query]);
var $query = $('#search_query2');
$query.stop().animate({opacity : 1}, {duration: 300, queue: false});
$query.html('<span class="raquo">&raquo;</span> You searched for: <b>' + searchCollection.serialize() + '</b>');
clearTimeout(window.queryHideDelay2);
window.queryHideDelay2 = setTimeout(function() {
$query.animate({
opacity : 0
}, {
duration: 1000,
queue: false
});
}, 2000);
},
valueMatches : function(category, searchTerm, callback) {
switch (category) {
case 'account':
callback([
{ value: '1-amanda', label: 'Amanda' },
{ value: '2-aron', label: 'Aron' },
{ value: '3-eric', label: 'Eric' },
{ value: '4-jeremy', label: 'Jeremy' },
{ value: '5-samuel', label: 'Samuel' },
{ value: '6-scott', label: 'Scott' }
]);
break;
case 'filter':
callback(['published', 'unpublished', 'draft']);
break;
case 'access':
callback(['public', 'private', 'protected']);
break;
case 'title':
callback([
'Pentagon Papers',
'CoffeeScript Manual',
'Laboratory for Object Oriented Thinking',
'A Repository Grows in Brooklyn'
]);
break;
case 'city':
callback([
'Cleveland',
'New York City',
'Brooklyn',
'Manhattan',
'Queens',
'The Bronx',
'Staten Island',
'San Francisco',
'Los Angeles',
'Seattle',
'London',
'Portland',
'Chicago',
'Boston'
])
break;
case 'state':
callback([
"Alabama", "Alaska", "Arizona", "Arkansas", "California",
"Colorado", "Connecticut", "Delaware", "District of Columbia", "Florida",
"Georgia", "Guam", "Hawaii", "Idaho", "Illinois",
"Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana",
"Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota",
"Mississippi", "Missouri", "Montana", "Nebraska", "Nevada",
"New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina",
"North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania",
"Puerto Rico", "Rhode Island", "South Carolina", "South Dakota", "Tennessee",
"Texas", "Utah", "Vermont", "Virginia", "Virgin Islands",
"Washington", "West Virginia", "Wisconsin", "Wyoming"
]);
break
case 'country':
callback([
"China", "India", "United States", "Indonesia", "Brazil",
"Pakistan", "Bangladesh", "Nigeria", "Russia", "Japan",
"Mexico", "Philippines", "Vietnam", "Ethiopia", "Egypt",
"Germany", "Turkey", "Iran", "Thailand", "D. R. of Congo",
"France", "United Kingdom", "Italy", "Myanmar", "South Africa",
"South Korea", "Colombia", "Ukraine", "Spain", "Tanzania",
"Sudan", "Kenya", "Argentina", "Poland", "Algeria",
"Canada", "Uganda", "Morocco", "Iraq", "Nepal",
"Peru", "Afghanistan", "Venezuela", "Malaysia", "Uzbekistan",
"Saudi Arabia", "Ghana", "Yemen", "North Korea", "Mozambique",
"Taiwan", "Syria", "Ivory Coast", "Australia", "Romania",
"Sri Lanka", "Madagascar", "Cameroon", "Angola", "Chile",
"Netherlands", "Burkina Faso", "Niger", "Kazakhstan", "Malawi",
"Cambodia", "Guatemala", "Ecuador", "Mali", "Zambia",
"Senegal", "Zimbabwe", "Chad", "Cuba", "Greece",
"Portugal", "Belgium", "Czech Republic", "Tunisia", "Guinea",
"Rwanda", "Dominican Republic", "Haiti", "Bolivia", "Hungary",
"Belarus", "Somalia", "Sweden", "Benin", "Azerbaijan",
"Burundi", "Austria", "Honduras", "Switzerland", "Bulgaria",
"Serbia", "Israel", "Tajikistan", "Hong Kong", "Papua New Guinea",
"Togo", "Libya", "Jordan", "Paraguay", "Laos",
"El Salvador", "Sierra Leone", "Nicaragua", "Kyrgyzstan", "Denmark",
"Slovakia", "Finland", "Eritrea", "Turkmenistan"
]);
break;
}
},
facetMatches : function(callback) {
callback([
'account', 'filter', 'access', 'title',
{ label: 'city', category: 'location' },
{ label: 'address', category: 'location' },
{ label: 'country', category: 'location' },
{ label: 'state', category: 'location' },
], {
preserveOrder: true
});
}
}
});
});
</script>
</div>
</body>
</html>

View File

@ -1,537 +0,0 @@
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<title>DocumentCloud's VisualSearch.js</title>
<style>
body {
font-size: 16px;
line-height: 24px;
background: #FEF3CA;
height: 100%;
color: #022;
font-family: Arial;
font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
}
div.container {
width: 720px;
margin: 50px 0 50px 50px;
}
p, li {
margin: 16px 0 16px 0;
width: 550px;
}
p.break {
margin-top: 35px;
}
ol {
padding-left: 24px;
}
ol li {
font-weight: bold;
margin-left: 0;
}
a, a:visited {
padding: 0 2px;
text-decoration: none;
background: #f0c095;
color: #252519;
}
a:active, a:hover {
color: #000;
background: #e0a070;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 40px;
}
b.header {
font-size: 18px;
}
span.alias {
font-size: 14px;
font-style: italic;
margin-left: 20px;
}
table {
margin: 16px 0; padding: 0;
}
tr, td, th {
margin: 0; padding: 0;
text-align: left;
}
th {
padding: 24px 0 0;
}
tr:first-child th {
padding-top: 0;
}
td {
padding: 6px 15px 6px 0;
}
td.definition {
line-height: 18px;
font-size: 14px;
}
table.downloads td {
padding-left: 18px;
}
.demo-hint {
font-size: 13px;
margin: 0 0 12px 12px;
font-weight: normal;
}
#VS code, #VS pre, #VS tt {
font-family: Monaco, Consolas, "Lucida Console", monospace;
font-size: 12px;
line-height: 18px;
color: #444;
background: none;
}
#VS code {
margin-left: 8px;
padding: 0 0 0 12px;
font-weight: normal;
}
#VS pre {
font-size: 12px;
padding: 2px 0 2px 0;
border-left: 6px solid #829C37;
margin: 12px 0;
}
#search_query {
margin: 18px 0 -24px;
opacity: 0;
}
#search_query .raquo {
font-size: 18px;
line-height: 12px;
font-weight: bold;
margin-right: 4px;
}
.attribution {
margin: -12px 0 24px;
font-size: 14px;
}
</style>
<link rel="stylesheet" href="build-min/visualsearch-datauri.css" type="text/css" media="screen" charset="utf-8">
<link rel="stylesheet" href="docs/assets/github.css" type="text/css" media="screen" charset="utf-8">
<script src="build-min/dependencies.js" type="text/javascript" charset="utf-8"></script>
<script src="build-min/visualsearch.js" type="text/javascript" charset="utf-8"></script>
<script src="docs/assets/highlight.js" type="text/javascript" charset="utf-8"></script>
<script src="docs/assets/javascript.js" type="text/javascript" charset="utf-8"></script>
<script src="docs/assets/xml.js" type="text/javascript" charset="utf-8"></script>
<script>
hljs.initHighlightingOnLoad();
</script>
</head>
<body>
<div class="container" id="VS">
<h1>VisualSearch.js</h1>
<p class="attribution">
<i>
Created by <a href="http://github.com/samuelclay">Samuel Clay</a>,
<a href="http://twitter.com/samuelclay">@samuelclay</a>.
</i>
</p>
<p>
<a href="http://github.com/documentcloud/visualsearch">VisualSearch.js</a>
enhances ordinary search boxes with the ability to autocomplete
faceted search queries. Specify the facets for completion, along with the
completable values for any facet. You can retrieve the search query as a
structured object, so you don't have to parse the query string yourself.
</p>
<p>
<a href="https://www.documentcloud.org/public/#search/group%3A%20dcloud%20chair%3A%20%22Christopher%20Dodd%22%20TARP">Here's an example of a search on DocumentCloud.org that uses facets.</a>
</p>
<p>
The project is
<a href="http://github.com/documentcloud/visualsearch/">hosted on GitHub</a>.
You can report bugs and discuss features on the
<a href="http://github.com/documentcloud/visualsearch/issues">issues page</a>,
on Freenode in the <tt>#documentcloud</tt> channel,
or send tweets to <a href="http://twitter.com/documentcloud">@documentcloud</a>.
</p>
<p>
<i>VisualSearch.js is an open-source component of <a href="http://documentcloud.org/">DocumentCloud</a>.
<br />
<a href="docs/visualsearch.html">The complete annotated source code</a>
is also available.</i>
</p>
<h2>Table of Contents</h2>
<a href="#demo">Demo</a> | <a href="#downloads">Downloads</a> | <a href="#usage">Usage</a> | <a href="#changelog">Change Log</a>
<h2 id="demo">Demo <span class="demo-hint"><i>Try searching for: <b>account</b>, <b>filter</b>, <b>access</b>, <b>title</b>, <b>city</b>, <b>state</b>, or <b>country</b>.</i></span></h2>
<div id="search_box_container"></div>
<div id="search_query">&nbsp;</div>
<script type="text/javascript" charset="utf-8">
$(document).ready(function() {
var visualSearch = VS.init({
container : $('#search_box_container'),
query : 'country: "United States" state: "New York" account: 5-samuel title: "Pentagon Papers"',
unquotable : [
'text',
'account',
'filter',
'access'
],
callbacks : {
search : function(query, searchCollection) {
var $query = $('#search_query');
var count = searchCollection.size();
$query.stop().animate({opacity : 1}, {duration: 300, queue: false});
$query.html('<span class="raquo">&raquo;</span> You searched for: ' +
'<b>' + (query || '<i>nothing</i>') + '</b>. ' +
'(' + count + ' facet' + (count==1 ? '' : 's') + ')');
clearTimeout(window.queryHideDelay);
window.queryHideDelay = setTimeout(function() {
$query.animate({
opacity : 0
}, {
duration: 1000,
queue: false
});
}, 2000);
},
facetMatches : function(callback) {
callback([
'account', 'filter', 'access', 'title',
{ label: 'city', category: 'location' },
{ label: 'country', category: 'location' },
{ label: 'state', category: 'location' },
]);
},
valueMatches : function(facet, searchTerm, callback) {
switch (facet) {
case 'account':
callback([
{ value: '1-amanda', label: 'Amanda' },
{ value: '2-aron', label: 'Aron' },
{ value: '3-eric', label: 'Eric' },
{ value: '4-jeremy', label: 'Jeremy' },
{ value: '5-samuel', label: 'Samuel' },
{ value: '6-scott', label: 'Scott' }
]);
break;
case 'filter':
callback(['published', 'unpublished', 'draft']);
break;
case 'access':
callback(['public', 'private', 'protected']);
break;
case 'title':
callback([
'Pentagon Papers',
'CoffeeScript Manual',
'Laboratory for Object Oriented Thinking',
'A Repository Grows in Brooklyn'
]);
break;
case 'city':
callback([
'Cleveland',
'New York City',
'Brooklyn',
'Manhattan',
'Queens',
'The Bronx',
'Staten Island',
'San Francisco',
'Los Angeles',
'Seattle',
'London',
'Portland',
'Chicago',
'Boston'
]);
break;
case 'state':
callback([
"Alabama", "Alaska", "Arizona", "Arkansas", "California",
"Colorado", "Connecticut", "Delaware", "District of Columbia", "Florida",
"Georgia", "Guam", "Hawaii", "Idaho", "Illinois",
"Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana",
"Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota",
"Mississippi", "Missouri", "Montana", "Nebraska", "Nevada",
"New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina",
"North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania",
"Puerto Rico", "Rhode Island", "South Carolina", "South Dakota", "Tennessee",
"Texas", "Utah", "Vermont", "Virginia", "Virgin Islands",
"Washington", "West Virginia", "Wisconsin", "Wyoming"
]);
break;
case 'country':
callback([
"China", "India", "United States", "Indonesia", "Brazil",
"Pakistan", "Bangladesh", "Nigeria", "Russia", "Japan",
"Mexico", "Philippines", "Vietnam", "Ethiopia", "Egypt",
"Germany", "Turkey", "Iran", "Thailand", "D. R. of Congo",
"France", "United Kingdom", "Italy", "Myanmar", "South Africa",
"South Korea", "Colombia", "Ukraine", "Spain", "Tanzania",
"Sudan", "Kenya", "Argentina", "Poland", "Algeria",
"Canada", "Uganda", "Morocco", "Iraq", "Nepal",
"Peru", "Afghanistan", "Venezuela", "Malaysia", "Uzbekistan",
"Saudi Arabia", "Ghana", "Yemen", "North Korea", "Mozambique",
"Taiwan", "Syria", "Ivory Coast", "Australia", "Romania",
"Sri Lanka", "Madagascar", "Cameroon", "Angola", "Chile",
"Netherlands", "Burkina Faso", "Niger", "Kazakhstan", "Malawi",
"Cambodia", "Guatemala", "Ecuador", "Mali", "Zambia",
"Senegal", "Zimbabwe", "Chad", "Cuba", "Greece",
"Portugal", "Belgium", "Czech Republic", "Tunisia", "Guinea",
"Rwanda", "Dominican Republic", "Haiti", "Bolivia", "Hungary",
"Belarus", "Somalia", "Sweden", "Benin", "Azerbaijan",
"Burundi", "Austria", "Honduras", "Switzerland", "Bulgaria",
"Serbia", "Israel", "Tajikistan", "Hong Kong", "Papua New Guinea",
"Togo", "Libya", "Jordan", "Paraguay", "Laos",
"El Salvador", "Sierra Leone", "Nicaragua", "Kyrgyzstan", "Denmark",
"Slovakia", "Finland", "Eritrea", "Turkmenistan"
], {preserveOrder: true});
break;
}
}
}
});
});
</script>
<h2 id="downloads">Downloads <i style="padding-left: 12px; font-size:12px;">(Right-click, and use "Save As")</i></h2>
<table class="downloads">
<tr>
<th colspan="2">0. Everything (<tt>visualsearch.zip</tt>)</th>
</tr>
<tr>
<td><a href="https://github.com/documentcloud/visualsearch/zipball/master">Download everything</a></td>
</tr>
<tr>
<th colspan="2">1. VisualSearch JavaScript (<tt>visualsearch.js</tt>)</th>
</tr>
<tr>
<td><a href="build-min/visualsearch.js">Production Version (0.2.2)</a></td>
<td><i>8kb, Minified and Gzipped</i></td>
</tr>
<tr>
<td><a href="build/visualsearch.js">Development Version (0.2.2)</a></td>
<td><i>45kb, Uncompressed with Comments</i></td>
</tr>
<tr>
<th colspan="2">2. VisualSearch Stylesheets (<tt>visualsearch.css</tt>)</th>
</tr>
<tr>
<td colspan="2"><i>You should include both the datauri and image urls versions. <a href="#css">See how to include both</a></i></td>
</tr>
<tr>
<td><a href="build-min/visualsearch-datauri.css">Production Version - datauri</a></td>
<td><i>4kb, Minified and Gzipped</i></td>
</tr>
<tr>
<td><a href="build-min/visualsearch.css">Production Version - image urls</a></td>
<td><i>4kb, Minified and Gzipped</i></td>
</tr>
<tr>
<td><a href="build/visualsearch.css">Development Version</a></td>
<td><i>8kb, Uncompressed with Comments</i></td>
</tr>
<tr>
<th colspan="2">3. VisualSearch Images</th>
</tr>
<tr>
<td><img src="lib/images/embed/icons/search_glyph.png"> <a href="lib/images/embed/icons/search_glyph.png">Search Glyph</a></td>
<td><i>4kb, embedded in visualsearch-datauri.css</i></td>
</tr>
<tr>
<td><img src="lib/images/embed/icons/cancel_search.png"> <a href="lib/images/embed/icons/cancel_search.png">Cancel Button</a></td>
<td><i>4kb, embedded in visualsearch-datauri.css</i></td>
</tr>
<tr>
<th colspan="2">4. VisualSearch Dependencies (<tt>jQuery 1.4+, jQuery UI, Underscore.js, Backbone.js</tt>)</th>
</tr>
<tr>
<td colspan="2"><i>You should only include the dependencies you don't already have.</i></td>
</tr>
<tr>
<td><a href="build-min/dependencies.js">Production Version - All</a></td>
<td><i>49kb, Minified and Gzipped</i></td>
</tr>
<tr>
<td><a href="build/dependencies.js">Development Version - All</a></td>
<td><i>340kb, Uncompressed with Comments</i></td>
</tr>
<tr>
<td><a href="vendor/jquery-1.6.1.js">jQuery 1.6.1</a></td>
<td><i>238kb, Uncompressed with Comments</i></td>
</tr>
<tr>
<td>jQuery UI 1.8.13: <br /><a href="vendor/jquery.ui.core.js">Core</a> <a href="vendor/jquery.ui.position.js">Position</a> <a href="vendor/jquery.ui.widget.js">Widget</a> <a href="vendor/jquery.ui.autocomplete.js">Autocomplete</a></td>
<td><i>48kb, Uncompressed with Comments</i></td>
</tr>
<tr>
<td><a href="vendor/underscore-1.1.5.js">Underscore 1.1.5</a></td>
<td><i>29kb, Uncompressed with Comments</i></td>
</tr>
<tr>
<td><a href="vendor/backbone-0.5.0.js">Backbone 0.5.0</a></td>
<td><i>41kb, Uncompressed with Comments</i></td>
</tr>
</table>
<h2 id="usage">Usage</h2>
<p>To use VisualSearch.js on your site, follow these instructions on installation, configuration, and customization.</p>
<ol>
<li class="xml" id="css">Insert the JavaScript and CSS into your page:<br />
<pre><code>&lt;script src="visualsearch.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;!--[if (!IE)|(gte IE 8)]&gt;&lt;!--&gt;
&lt;link href="visualsearch-datauri.css" media="screen" rel="stylesheet" type="text/css" /&gt;
&lt;!--&lt;![endif]--&gt;
&lt;!--[if lte IE 7]&gt;&lt;!--&gt;
&lt;link href="visualsearch.css" media="screen" rel="stylesheet" type="text/css" /&gt;
&lt;!--&lt;![endif]--&gt;</code></pre>
</li>
<li>Initialize the Visual Search box:<br />
<pre class="javascript"><code>&lt;div class="visual_search"&gt;&lt;/div&gt;
&lt;script type="text/javascript" charset="utf-8"&gt;
$(document).ready(function() {
var visualSearch = VS.init({
container : $('.visual_search'),
query : '',
callbacks : {
search : function(query, searchCollection) {},
facetMatches : function(callback) {},
valueMatches : function(facet, searchTerm, callback) {}
}
});
});
&lt;/script&gt;</code></pre>
</li>
<li class="javascript">Customize the autocompleted facets and values:
<pre><code>callbacks : {
...
// These are the facets that will be autocompleted in an empty input.
facetMatches : function(callback) {
callback([
'account', 'filter', 'access', 'title',
{ label: 'city', category: 'location' },
{ label: 'address', category: 'location' },
{ label: 'country', category: 'location' },
{ label: 'state', category: 'location' },
]);
}
...
// These are the values that match specific categories, autocompleted
// in a category's input field. searchTerm can be used to filter the
// list on the server-side, prior to providing a list to the widget.
valueMatches : function(facet, searchTerm, callback) {
switch (facet) {
case 'account':
callback([
{ value: '1-amanda', label: 'Amanda' },
{ value: '2-aron', label: 'Aron' },
{ value: '3-eric', label: 'Eric' },
{ value: '4-jeremy', label: 'Jeremy' },
{ value: '5-samuel', label: 'Samuel' },
{ value: '6-scott', label: 'Scott' }
]);
break;
case 'filter':
callback(['published', 'unpublished', 'draft']);
break;
case 'access':
callback(['public', 'private', 'protected']);
break;
case 'title':
callback([
'Pentagon Papers',
'CoffeeScript Manual',
'Laboratory for Object Oriented Thinking',
'A Repository Grows in Brooklyn'
]);
break;
}
}
...
}</code></pre>
</li>
<li class="javascript">Inspect the Visual Search box
<pre><code>// Returns the unstructured search query
visualSearch.searchBox.value()
// "country: "South Africa" account: 5-samuel title: "Pentagon Papers""
// Returns an array of Facet model instances
visualSearch.searchQuery.facets()
// [FacetModel&lt;country:"South Africa">,
// FacetModel&lt;account:5-samuel>,
// FacetModel&lt;title:"Pentagon Papers">]
// Set the search query with raw text
visualSearch.searchBox.value("Country: US State: \"New York\" Key: Value")
</code></pre>
</li>
</ol>
<h2 id="changelog">Change Log</h2>
<p>
<b class="header">0.2.2</b> <i>March 10th, 2012</i><br />
If you do not want to automatically filter the value matches, you can pass an
options hash with <tt>preserveMatches: true</tt> as the second argument to the callback.
<a href="https://github.com/documentcloud/visualsearch/pull/44">See pull request #44</a> for details.
</p>
<p>
<b class="header">0.2.1</b> <i>November 14th, 2011</i><br />
The autocompleted facets and values that are provided by your callbacks <tt>facetMatches</tt>
and <tt>valueMatches</tt> can now preserve the order of items you give them. Simply pass an
options hash with <tt>preserveOrder: true</tt> as the second argument to the callback. See
<a href="demo.html">the demo page</a> for an example.
</p>
<p>
<b class="header">0.2.0</b> <i>August 10th, 2011</i><br />
Multiple instances of VisualSearch on a single page. <tt>VS.init</tt> now returns
a reference to the instance. The <tt>search</tt> callback now contains both the
serialized search query and a reference to the search query collection (as a
<a href="http://documentcloud.github.com/backbone/#Collection">Backbone.Collection</a>),
which can be used to manipulate each facet directly. See
<a href="docs/search_query.html">the source code for search_query.js</a> for available
methods on the collection.
</p>
<p>
<b class="header">0.1.0</b> <i>June 23rd, 2011</i><br />
Initial release of VisualSearch.js.
</p>
<p>
<a href="http://documentcloud.org/" title="A DocumentCloud Project" style="background:none;">
<img src="http://jashkenas.s3.amazonaws.com/images/a_documentcloud_project.png" alt="A DocumentCloud Project" />
</a>
</p>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -880,60 +880,6 @@ label.error {
text-align: left;
padding: 4px 5px;
}
/* Shortcuts*/
.oe-shortcut-toggle {
height: 20px;
margin-top: 3px;
padding: 0;
width: 24px;
cursor: pointer;
display: block;
background: url(/web/static/src/img/add-shortcut.png) no-repeat center center;
float: left;
}
.oe-shortcut-remove{
background: url(/web/static/src/img/remove-shortcut.png) no-repeat center center;
}
.oe-shortcuts {
position: absolute;
margin: 0;
padding: 6px 15px;
top: 37px;
left: 197px;
right: 0;
height: 17px;
line-height: 1.2;
}
.oe-shortcuts ul {
display: block;
overflow: hidden;
list-style: none;
white-space: nowrap;
padding: 0;
margin: 0;
}
.oe-shortcuts li {
cursor: pointer;
display: -moz-inline-stack;
display: inline-block;
display: inline; /*IE7 */
color: #fff;
text-align: center;
border-left: 1px solid #909090;
padding: 0 4px;
font-size: 80%;
font-weight: normal;
vertical-align: top;
}
.oe-shortcuts li:hover {
background-color: #666;
}
.oe-shortcuts li:first-child {
border-left: none;
padding-left: 0;
}
ul.oe-arrow-list {
padding-left: 1.1em;
margin: 0;

Binary file not shown.

View File

@ -0,0 +1,198 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>
This is a custom SVG webfont generated by Font Squirrel.
Copyright : Creative Commons CC BYSA 2012
Designer : Daniel Bruce
Foundry : Daniel Bruce
Foundry URL : wwwdanielbrucese
</metadata>
<defs>
<font id="EntypoRegular" horiz-adv-x="1228" >
<font-face units-per-em="2048" ascent="1536" descent="-512" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode=" " horiz-adv-x="1024" />
<glyph unicode="&#x09;" horiz-adv-x="1024" />
<glyph unicode="&#xa0;" horiz-adv-x="1024" />
<glyph unicode="!" horiz-adv-x="972" d="M103 246q1 10 2 28.5t14.5 35t36.5 34.5q39 31 67.5 44t52 4t33.5 -17t37 -37q43 -43 198.5 114.5t114.5 198.5q-49 49 -55 74q-8 43 49 117q18 23 36 37t35 15t28.5 1t29 -12.5t23.5 -17.5t24.5 -24.5t20.5 -21.5q47 -47 -6 -186t-196.5 -282.5t-283 -196t-186.5 -4.5 l-20 18q-20 20 -24.5 25.5t-18 24t-12.5 28.5z" />
<glyph unicode="&#x22;" horiz-adv-x="798" d="M102 113v798q0 41 31 72t72 31h389q43 0 72.5 -31t29.5 -72v-798q0 -43 -29.5 -73t-72.5 -30h-389q-41 0 -72 30t-31 73zM184 205h430v676h-430v-676zM328 102.5q0 -20.5 21.5 -36t49.5 -15.5q31 0 51.5 14.5t20.5 37t-20.5 37t-51.5 14.5q-29 0 -50 -15.5t-21 -36z" />
<glyph unicode="#" horiz-adv-x="780" d="M109 971q-18 31 14 49q33 16 47 -16l102 -197q82 23 158 -16t102 -119l136 -385q27 -82 -19.5 -162t-140.5 -113q-96 -29 -179 8t-106 119l-110 396q-20 68 6 136t88 107zM244 614.5q8 -28.5 34.5 -43t55.5 -4.5q27 10 41 37t4 53q-8 29 -34 43.5t-54 4.5q-27 -8 -41 -35 t-6 -55.5z" />
<glyph unicode="$" d="M102 639q0 10 11 18l120 82q8 8 27 13q14 6 29 6h182v194q0 20 21 21h45q20 0 20 -21v-880q0 -20 -20 -21h-45q-20 0 -21 21v450h-182q-8 0 -29 4q-20 8 -27 13l-120 84q-11 4 -11 16zM588 860h350q12 0 29 -6q18 -4 26 -12l121 -82q12 -10 12 -19q0 -10 -12 -16 l-121 -84q-6 -4 -26 -12q-20 -4 -29 -4h-309z" />
<glyph unicode="%" horiz-adv-x="1128" d="M104 264v375q0 12 1 14t18 -2q23 -12 202 -106t193 -101q20 -10 47 -10q25 0 45 10q14 6 193.5 100.5t202.5 106.5q20 10 20 -12v-375q0 -16 -17.5 -32.5t-33.5 -16.5h-821q-16 0 -33 16.5t-17 32.5zM106.5 797.5q4.5 11.5 24.5 11.5h866q20 0 24.5 -11.5t-4.5 -24.5 t-22 -19q-373 -201 -385 -207q-20 -10 -45 -10q-27 0 -47 10q-12 6 -385 207q-12 6 -21.5 19t-5 24.5z" />
<glyph unicode="&#x26;" horiz-adv-x="1005" d="M102 113l52 243l297 295l258 260q55 10 129 -63q72 -72 63 -129l-258 -258l-297 -297zM166 258q33 -18 47 -35q23 -23 37 -47l82 19l24 22q-2 45 -51 96q-23 23 -47.5 36t-36.5 16l-14 2l-23 -25z" />
<glyph unicode="'" horiz-adv-x="1165" d="M104 252q-2 98 84 197q37 35 236 234.5t272 270.5q82 82 181 56q45 -12 79.5 -47t47.5 -82q27 -98 -54 -179l-485 -485q-43 -45 -90 -47q-49 -6 -82 27q-31 25 -28 76t46 96l342 340q27 27 49 0q27 -25 0 -52l-340 -340q-45 -45 -20 -69q8 -8 25 -8q20 2 47 26l485 486 q51 53 35 110q-14 61 -78 78q-57 16 -108 -35l-508 -508q-66 -76 -64 -144.5t53 -119.5q49 -51 119 -53t146 63l505 508q25 25 51.5 0.5t0.5 -51.5l-508 -508q-84 -84 -189 -84q-102 0 -176 74q-72 72 -74 170z" />
<glyph unicode="(" horiz-adv-x="1126" d="M102 528l369 332v-198q317 0 483 -312q51 -100 70 -186q-88 156 -214 201t-339 45v-224z" />
<glyph unicode=")" d="M102 530l371 330v-137l-217 -193l217 -200v-144zM358 530l371 330v-198q106 0 186 -51.5t118 -124t61.5 -146.5t27.5 -125l4 -51q-88 158 -172 202t-225 44v-224z" />
<glyph unicode="*" horiz-adv-x="1126" d="M102 164q4 20 13.5 54t51.5 119t98.5 150.5t159.5 120t230 54.5v198l369 -330l-369 -344v224q-213 0 -339 -45t-214 -201z" />
<glyph unicode="+" horiz-adv-x="1167" d="M102 51v109q0 47 209 125q96 35 132 69.5t36 98.5q0 23 -23.5 49t-31.5 76q-2 12 -23.5 24t-25.5 62q0 16 5 26t9 15l6 2q-10 51 -14 90q-4 55 42 115.5t160.5 60.5t162 -60.5t42.5 -115.5l-14 -90q18 -8 19 -43q-2 -29 -9.5 -44.5t-14.5 -17.5t-14 -7t-10 -17 q-8 -49 -31.5 -76t-23.5 -49q0 -63 36 -98.5t130 -69.5q209 -78 209 -125v-109h-481h-482z" />
<glyph unicode="," d="M102 76v180q0 45 88 80q76 31 105 61.5t29 85.5q0 20 -18.5 45t-26.5 68q-2 10 -18.5 21.5t-20.5 54.5q0 14 4 23.5t8 13.5l4 2q-8 45 -10 80q-4 49 32.5 102t129 53t130 -53t33.5 -102l-10 -80q14 -8 14 -39q-2 -27 -7 -40.5t-11 -14.5t-11 -6t-7 -15 q-8 -43 -26.5 -67.5t-18.5 -45.5q0 -55 28.5 -85.5t104.5 -61.5q188 -76 188 -125v-135h-713zM688 616q0 10 3 17.5t5 9.5l4 2q-6 33 -8 60q-2 37 25.5 76.5t97.5 39.5q68 0 96.5 -40t26.5 -76l-8 -60q10 -6 10 -29q-2 -33 -14.5 -41t-14.5 -16q-6 -33 -19 -51.5t-13 -32.5 q0 -41 21.5 -65.5t78.5 -47.5q113 -45 135 -79q4 -8 7 -59.5t5 -100.5v-47h-229v147q0 53 -30.5 80t-157.5 88q43 31 43 84q0 14 -14.5 32.5t-20.5 51.5q-2 8 -14.5 16t-14.5 41z" />
<glyph unicode="-" d="M102 51v205q18 8 48 17.5t34 11.5q96 35 132 69.5t36 98.5q0 23 -23.5 49t-31.5 76q-2 12 -23.5 24t-25.5 62q0 16 5 26t9 15l6 2q-10 51 -14 90q-4 55 43 115.5t164 60.5q115 0 162 -60.5t43 -115.5l-15 -90q20 -8 21 -43q-4 -49 -25.5 -61.5t-23.5 -24.5 q-8 -49 -32 -76t-24 -49q0 -63 36 -98.5t132 -69.5q186 -70 187 -125v-109h-820zM717 461v102h153v154h103v-154h153v-102h-153v-154h-103v154h-153z" />
<glyph unicode="." d="M102 205v614q0 41 30 72t73 31h819q41 0 71.5 -31t30.5 -72v-614q0 -43 -30.5 -73t-71.5 -30h-819q-43 0 -73 30t-30 73zM205 205h819v614h-819v-614zM307 311v92h256v-92h-256zM307 465v92h256v-92h-256zM307 618v93h256v-93h-256zM666 311q0 72 4 72q88 25 88 68 q0 16 -29 57t-29 90q0 113 93 113q51 0 71.5 -28t20.5 -85q0 -49 -28 -90t-28 -57q0 -18 21.5 -36t42.5 -26l22 -6l7 -72h-256z" />
<glyph unicode="/" d="M102 164v563q0 23 14.5 37t37.5 14h295q-33 -25 -62 -50.5t-39 -39.5l-12 -12h-131v-461h665v55l103 86v-192q0 -20 -15.5 -35.5t-35.5 -15.5h-768q-23 0 -37.5 15.5t-14.5 35.5zM373 342q0 8 1 23.5t9 57.5t22.5 81t45 86t72.5 81t110.5 57.5t152.5 23.5v159l340 -256 l-340 -266v182q-170 0 -248.5 -43t-164.5 -186z" />
<glyph unicode="0" horiz-adv-x="716" d="M102 666q0 106 75 181t181.5 75t181 -75t74.5 -181q0 -211 -223 -519l-33 -45q-10 12 -27.5 36t-61.5 91.5t-77.5 133t-61.5 150.5t-28 153zM219 662q0 -57 41 -97.5t98.5 -40.5t97.5 40t40 97.5t-40 98.5t-98 41q-59 0 -99 -40t-40 -99z" />
<glyph unicode="1" d="M102 137v600q0 18 17 29l239 152q18 10 35 0l221 -140l224 140q18 10 34 0l240 -152q14 -10 14 -29v-600q0 -20 -16 -31q-8 -4 -16.5 -4t-16.5 4l-223 140l-221 -140q-18 -10 -35 0l-221 140l-223 -140q-16 -10 -33 0q-19 11 -19 31zM170 199l172 108v518l-172 -108v-518 zM410 307l172 -108v518l-172 108v-518zM649 199l172 108v518l-172 -108v-518zM889 307l172 -108v518l-172 108v-518z" />
<glyph unicode="2" horiz-adv-x="1191" d="M104 506q-2 203 139.5 348t344.5 150q205 2 350 -139.5t149 -346.5q2 -203 -140 -349t-345 -149q-205 -4 -350.5 138.5t-147.5 347.5zM207 506q4 -160 117.5 -272.5t275.5 -110.5t273.5 117.5t109.5 275.5q-2 162 -116.5 273.5t-276.5 109.5t-273.5 -116.5t-109.5 -276.5 zM362 281q4 27 12.5 68.5t42.5 131.5t77 133q45 45 128 78t144 45l61 11q-4 -27 -11 -69t-41 -132t-79 -133q-45 -45 -128 -78t-144 -45zM524 514q0 -31 20.5 -51.5t50.5 -20.5t50 21q53 53 90 192q-137 -37 -190 -90q-21 -20 -21 -51z" />
<glyph unicode="3" horiz-adv-x="1085" d="M102 516q453 254 711 379q23 10 50.5 25.5t38.5 20.5t26.5 9t24 1t16.5 -11t11 -17.5t-1 -23.5t-9 -25.5t-20.5 -40t-25.5 -49.5q-55 -115 -149.5 -293t-160.5 -298l-67 -121l-58 389zM565 553l29 -238l283 525z" />
<glyph unicode="4" horiz-adv-x="1085" d="M102 512q0 182 129 311t311.5 129t311.5 -129t129 -311t-129 -311t-311.5 -129t-311.5 129t-129 311zM184 475q14 -127 104.5 -217t217.5 -102v196h72v-196q127 12 217 102t104 217h-199v72h199q-14 127 -104 218t-217 103v-198h-72v198q-127 -12 -217 -103t-105 -218 h199v-72h-199z" />
<glyph unicode="5" horiz-adv-x="1024" d="M102 512q0 63 45.5 108.5t108.5 45.5q53 0 92 -33l268 162q-2 8 -2 24q0 63 45.5 108.5t108.5 45.5t108.5 -45t45.5 -108.5t-45.5 -108.5t-108.5 -45q-49 0 -94 30l-268 -159q4 -16 4 -24.5t-4 -25.5l268 -161q43 33 94 32q63 0 108.5 -45t45.5 -108.5t-45.5 -108.5 t-108.5 -45t-108.5 45t-45.5 109q0 16 2 24l-268 160q-41 -31 -92 -31q-63 0 -108.5 45.5t-45.5 108.5z" />
<glyph unicode="6" horiz-adv-x="1089" d="M104 651q0 94 72 160q66 57 156 57t153 -57l60 -53l57 53q66 57 156 57t155 -57q72 -66 72 -160t-72 -159l-368 -338l-369 338q-72 65 -72 159z" />
<glyph unicode="7" horiz-adv-x="1105" d="M102 618h328l123 345l121 -345h330l-269 -202l94 -355l-276 213l-279 -213l95 355z" />
<glyph unicode="8" horiz-adv-x="1126" d="M102 227v316q0 45 43 45h162v-410h-160q-45 0 -45 49zM358 178v410h17q57 0 128.5 75.5t90.5 133.5q6 23 8 66.5t12.5 63t38.5 19.5q74 0 74 -141l-10 -160q129 4 188 4q119 0 119 -149v-246q0 -61 -72.5 -119.5t-152.5 -58.5h-215q-51 0 -109 51t-117 51z" />
<glyph unicode="9" d="M102 307v307q0 41 31 72t72 31h194v-318h359h10v-92q0 -43 -29.5 -72.5t-72.5 -29.5h-256l-154 -154v154h-51q-41 0 -72 29.5t-31 72.5zM461 461v409q0 41 30.5 72t71.5 31h461q43 0 72.5 -31t29.5 -72v-307q0 -43 -29.5 -72.5t-72.5 -29.5h-51v-154l-154 154h-358z" />
<glyph unicode=":" horiz-adv-x="1024" d="M102 410v358q0 41 30 71.5t73 30.5h614q41 0 72 -30.5t31 -71.5v-358q0 -43 -31 -73t-72 -30h-205v-153l-204 153h-205q-43 0 -73 30t-30 73z" />
<glyph unicode=";" horiz-adv-x="983" d="M102 174v72q115 0 185 110q55 88 26 150q-16 37 -63 37q-61 0 -104.5 45t-43.5 108.5t43 108.5t105 45q150 0 188 -150q39 -143 -41 -309q-82 -172 -227 -209q-33 -8 -68 -8zM532 174v72q115 0 185 110q55 88 26 150q-16 37 -63 37q-61 0 -104.5 45t-43.5 108.5t43 108.5 t105 45q150 0 188 -150q39 -143 -41 -309q-82 -172 -227 -209q-33 -8 -68 -8z" />
<glyph unicode="&#x3c;" horiz-adv-x="1208" d="M102 393v180q0 23 17.5 42.5t38.5 19.5h891q20 0 38.5 -19.5t18.5 -42.5v-180q0 -20 -18.5 -40.5t-38.5 -20.5h-101l45 -256h-778l45 256h-102q-20 0 -38 20.5t-18 40.5zM146.5 716q3.5 9 11.5 11q23 10 104.5 38t99.5 28h48v153h389v-153h45q18 0 100 -28t105 -38 q8 -2 11 -11t-3 -17.5t-19 -8.5h-870q-12 0 -18.5 8.5t-3 17.5zM317 178h574l-72 334h-430z" />
<glyph unicode="=" horiz-adv-x="1026" d="M105.5 672.5q9.5 109.5 113.5 197.5q18 14 24.5 29.5t6.5 25t6 19.5t25 17q27 10 48 -10.5t54 -20.5q135 2 204.5 -67.5t164.5 -274.5q16 -35 40.5 -53.5t46 -22.5t45 -23.5t36.5 -56.5q23 -63 -77 -164.5t-259 -161.5q-168 -57 -303.5 -44.5t-157.5 75.5 q-20 57 12.5 115.5t18.5 114.5q-58 196 -48.5 305.5zM193 164q4 -12 51 -23.5t137 -5.5t180 39t163 87t101.5 93t24.5 54q-6 20 -48 31.5t-128 1t-190.5 -49.5t-177.5 -88t-96 -85t-17 -54zM274 231q82 72 224 121q8 4 39 15v-2q14 -41 -18 -84t-89 -64q-99 -39 -156 14z " />
<glyph unicode="&#x3e;" horiz-adv-x="1024" d="M102 295q0 78 58 135l153 152q72 72 147 81t130 -47q16 -14 16 -34.5t-16 -36.5q-14 -16 -36 -16.5t-36 16.5q-49 49 -133 -35l-154 -152q-27 -27 -26 -63q0 -35 26 -66q27 -27 66 -26.5t65 26.5l41 43q37 33 72 -2q16 -14 16.5 -35.5t-16.5 -35.5l-41 -41 q-57 -55 -137 -55.5t-137 55.5q-58 57 -58 137zM436 401q-35 37 0 72q14 14 35 14t37 -14q49 -49 123 25l164 161q27 27 26 64q0 35 -26 65q-68 61 -121 9l-51 -52q-37 -33 -72 3q-14 14 -14 34.5t14 36.5l51 51q55 53 130 50.5t134 -60.5q55 -55 56 -137q0 -80 -56 -135 l-164 -162q-76 -76 -153 -76q-64 0 -113 51z" />
<glyph unicode="?" horiz-adv-x="1126" d="M102 815l95 33q92 68 155.5 88t99 4t64.5 -51t63.5 -73t81 -63.5t132.5 -20.5t204 52q14 6 22.5 -1t0.5 -19q-98 -141 -169 -218t-114 -92.5t-73.5 -2t-61.5 38t-65.5 40t-95 -4t-140.5 -87.5l92 -362h-104z" />
<glyph unicode="@" horiz-adv-x="1064" d="M102 377q82 47 82 135q0 78 -82 125q12 43 35 86q76 -18 139 45q55 55 35 139q43 23 84 35q51 -82 137 -82q84 0 136 82q41 -12 84 -35q-20 -84 34 -139q63 -63 140 -45q20 -39 37 -86q-84 -47 -84 -125t84 -125q-16 -47 -37 -86q-76 18 -140 -45q-55 -59 -34 -139 q-43 -23 -84 -35q-51 82 -136 82q-86 0 -137 -82q-41 12 -84 35q20 80 -35 139q-55 55 -139 35q-23 43 -35 86zM344 512q0 -78 55.5 -132t133 -54t132 54t54.5 132t-54.5 132t-132 54t-133 -54t-55.5 -132z" />
<glyph unicode="A" horiz-adv-x="1128" d="M109 183q-5 16 -5 29q0 19 11 30l417 417q-2 18 -2 37q0 30 7 61q10 48 26 64l137 137q13 15 40 16q23 0 56 -11q71 -25 132 -86q63 -63 88 -135q11 -33 11 -55q0 -26 -15 -38l-140 -139q-16 -16 -63 -27q-29 -6 -61 -6q-19 0 -37 2l-418 -418q-11 -11 -28 -10 q-13 0 -29 5q-39 13 -76 50q-39 37 -51 77zM458 487q0 -17 11 -28q13 -13 30 -14q24 0 54 28q20 20 23.5 44t-11 38t-38 10t-44.5 -24q-25 -25 -25 -54zM737 921.5q-2 -1.5 -2 -7.5q0 -7 3 -21q5 -25 25.5 -62.5t51.5 -68.5q29 -29 68 -49.5t63 -25.5q14 -3 21 -3q6 0 8 2 q2 1 1 5q0 7 -3 22q-6 25 -27.5 62.5t-50.5 66.5q-31 31 -69 51t-61 27q-14 4 -21 3q-5 0 -7 -1.5z" />
<glyph unicode="B" horiz-adv-x="1126" d="M102 852q0 16 10.5 26.5t26.5 10.5h176q51 94 248 94q199 0 250 -94h176q14 0 24.5 -11.5t10.5 -25.5q0 -78 -21.5 -140.5t-64.5 -109.5t-76 -73.5t-90 -63.5q-80 -53 -113.5 -89t-33.5 -87v-68q74 -8 121 -31.5t47 -56.5q0 -39 -67 -65.5t-163 -26.5q-94 0 -160.5 26.5 t-66.5 65.5q0 33 47 56.5t121 31.5v68q0 51 -34 86t-116 90q-57 39 -89 63.5t-76 72.5t-65.5 110.5t-21.5 140.5zM176 817q8 -94 55.5 -153.5t128.5 -116.5q-49 106 -55 270h-129zM369 841.5q0 -12.5 18.5 -29.5t65.5 -32.5t110 -15.5q66 0 113 15.5t64.5 32.5t17.5 29.5 t-17.5 30t-64.5 33t-113 15.5q-63 0 -110 -15.5t-65.5 -33t-18.5 -30zM766 547q82 55 129 115.5t55 154.5h-129q-2 -157 -55 -270z" />
<glyph unicode="C" horiz-adv-x="1189" d="M104 368q4 22 21 33l477 338q25 16 55 17l162 2q31 -4 47 -27l29 -41q132 98 132 216q0 37 -13 77q-10 29 18 39q8 3 14 3q18 0 25 -21q16 -48 16 -94q0 -57 -25 -110q-46 -95 -132 -161l18 -27q16 -23 8 -55l-51 -160q-12 -31 -35 -47l-477 -338q-18 -13 -33 -13 q-17 0 -30 17l-217 314q-9 12 -10 27q0 6 1 11zM723 605q-2 -8 -2 -16q0 -24 14 -44q20 -29 53 -35q8 -1 15 -1q24 0 47 15q34 24 34 65q0 8 -1 17l-31 -18q-4 -2 -14 -2q-20 0 -27 16q-14 27 14 43q2 0 25 12q-24 19 -49 19l-45 -17q-27 -20 -33 -54z" />
<glyph unicode="D" d="M102 205v461q0 41 31 71.5t72 30.5h123q33 0 41 29l32 96q8 29 39 29h348q35 0 41 -29l33 -96q6 -29 39 -29h123q43 0 72.5 -30.5t29.5 -71.5v-461q0 -43 -29.5 -73t-72.5 -30h-819q-41 0 -72 30t-31 73zM358 460.5q0 -106.5 75 -181t181.5 -74.5t181 74.5t74.5 181 t-74.5 181.5t-181 75t-181.5 -75t-75 -181.5zM461 460.5q0 63.5 45 108.5t108.5 45t108.5 -45t45 -108.5t-45 -108.5t-108.5 -45t-108.5 45t-45 108.5zM952 628.5q0 -14.5 11.5 -24.5t26 -10t24.5 10t10 25q0 37 -35 37q-14 0 -25.5 -11.5t-11.5 -26z" />
<glyph unicode="E" horiz-adv-x="1046" d="M102 322q100 -58 216 -59q30 0 62 4q151 19 259.5 128t127.5 259q4 31 4 62q0 115 -58 216q55 -31 98 -74q131 -133 131 -317.5t-131 -317.5q-131 -131 -316.5 -131t-316.5 131q-43 44 -76 99z" />
<glyph unicode="F" horiz-adv-x="1210" d="M104 475q10 121 107.5 241t220.5 156q100 28 196 29q188 0 353 -110q74 -49 104 -114q24 -50 24 -87q0 -11 -2 -21q-9 -43 -36 -49q-16 -4 -55 10q-30 11 -63 12q-9 0 -19 -1q-43 -4 -84 -47q-24 -36 -24 -62q0 -8 2 -14q9 -29 35 -67t26 -52q0 -18 -22.5 -45 t-65.5 -57.5t-123 -52t-178 -21.5q-190 0 -298 102q-98 93 -98 225q-1 12 0 25zM578 389q0 -31 22.5 -53.5t55 -22.5t55 22.5t22.5 53.5q0 33 -22.5 55.5t-55 22.5t-55 -22.5t-22.5 -55.5z" />
<glyph unicode="G" horiz-adv-x="1169" d="M104 180q45 102 132.5 197.5t181.5 157t181 108.5t142 68l58 20q-16 0 -43 -1t-106 -14.5t-152.5 -39t-166.5 -86t-163 -144.5q-4 30 -4 59q0 203 180 308q135 79 347 79q80 0 171 -11q174 -20 203 -52q2 -2 2 -4q0 -3 -4 -6q-78 -41 -133.5 -111.5t-81 -135t-67.5 -134 t-95 -106.5q-73 -52 -175 -52q-96 0 -216 46q-68 -76 -115 -179q-7 -15 -23 -14q-11 0 -26 6q-29 13 -29 31q0 5 2 10z" />
<glyph unicode="H" horiz-adv-x="800" d="M111 115q-7 19 -7 38q0 39 27 79q41 60 119 90q45 17 87 16q39 0 75 -14v669h82q0 -37 31.5 -80t69.5 -79.5t70.5 -89t32.5 -105.5t-43 -129q-20 -33 -26 -14q-2 6 0 14q10 18 7 58t-13.5 80t-45 74t-83.5 42v-547q2 -51 -39 -98t-107 -72q-46 -17 -89 -17q-29 0 -57 8 q-68 20 -91 77z" />
<glyph unicode="I" horiz-adv-x="1087" d="M104 774q-1 6 -1 13q0 30 26 49q8 8 57.5 46t55.5 44q18 16 55 16h494q35 0 57 -16q8 -8 57 -46t56 -44q24 -20 23 -49q0 -6 -1 -13l-98 -663q-10 -29 -41 -29h-600q-31 0 -41 29q-95 636 -99 663zM184 768h721l-114 117h-494zM334 674q49 -283 211 -283q160 0 209 283 h-95q-39 -190 -114 -191q-78 0 -117 191h-94z" />
<glyph unicode="J" d="M102 338l82 174l-82 174h103l114 -102h183l-127 409h102l230 -409h266h16q10 0 37 -4.5t47.5 -11.5t36.5 -21.5t16 -34.5q0 -33 -38.5 -50.5t-75.5 -19.5l-39 -2h-266l-230 -409h-102l127 409h-183l-114 -102h-103z" />
<glyph unicode="K" horiz-adv-x="1150" d="M104 512q0 191 134 328q135 139 329 143h6q191 0 329 -134q140 -136 145 -331v-6q0 -191 -135 -329q-136 -140 -330 -142h-12q-187 0 -323 133q-143 140 -143 338zM211 324l106 63q-29 57 -28.5 125t28.5 125l-106 63q-45 -86 -45 -185q0 -107 45 -191zM350 512 q0 -94 65.5 -159.5t159.5 -65.5q92 0 159 65.5t67 159.5t-66.5 159.5t-159.5 65.5q-94 0 -159.5 -65.5t-65.5 -159.5zM385 147q94 -45 187 -45h8q94 0 184 48l-64 104q-61 -29 -125 -29q-66 0 -126 29zM385 874l64 -104q61 29 126 29q63 0 125 -29l64 104q-90 47 -195 48 q-100 -5 -184 -48zM831 387l107 -63q47 88 47 194q-2 98 -47 182l-107 -63q31 -61 31 -125t-31 -125z" />
<glyph unicode="L" horiz-adv-x="1146" d="M102 352q0 96 54.5 175t142.5 114q12 143 118.5 242.5t254.5 99.5q154 0 263 -109.5t109 -263.5q0 -145 -99 -251.5t-243 -118.5q-35 -88 -113.5 -143.5t-176.5 -55.5q-127 0 -218.5 91t-91.5 220zM102 868q0 43 31 75t76 32q43 0 73.5 -32t30.5 -75q0 -45 -30.5 -75.5 t-73.5 -30.5q-45 0 -76 30.5t-31 75.5zM150 868.5q0 -24.5 17 -42t42 -17.5q23 0 40 17.5t17 42t-17.5 41t-39.5 16.5q-25 0 -42 -16.5t-17 -41zM205 352q0 -86 61.5 -146.5t145.5 -60.5q119 0 180 103q-106 23 -184 99.5t-101 182.5q-102 -61 -102 -178zM416 559 q14 -76 70.5 -131t134.5 -72q-2 82 -61.5 141.5t-143.5 61.5zM416 662q125 0 215 -89.5t92 -216.5q90 16 149.5 89t59.5 165q0 106 -77 183t-183 77q-94 0 -166 -59t-90 -149z" />
<glyph unicode="M" d="M102 512q0 14 20.5 45t64.5 73t101.5 80t144.5 63.5t181.5 25.5t181.5 -25.5t144 -63.5t101 -80t64.5 -73t20.5 -45t-20.5 -45t-64.5 -73t-101 -80t-144 -63.5t-181.5 -25.5t-181.5 25.5t-144.5 63.5t-101.5 80t-64.5 73t-20.5 45zM385 512q0 -92 66.5 -156.5 t162.5 -64.5q94 0 161 64.5t67 156.5q0 90 -66.5 155.5t-161 65.5t-162 -65.5t-67.5 -155.5zM500 512q0 45 33.5 78t80.5 33q14 0 10.5 -24t-12 -48.5t1.5 -38.5q6 -8 36 -3t51.5 11t25.5 -8q0 -45 -32.5 -78t-80 -33t-81 33t-33.5 78z" />
<glyph unicode="N" horiz-adv-x="1146" d="M102 512q0 195 138.5 333t333 138t332.5 -138t138 -333t-138 -333t-332.5 -138t-333 138t-138.5 333zM205 512q0 -152 107.5 -260.5t260.5 -108.5q152 0 260.5 108.5t108.5 260.5t-108.5 260.5t-260.5 108.5q-154 0 -261 -108.5t-107 -260.5zM537 498v280h71v-252 l154 -153l-51 -49z" />
<glyph unicode="O" horiz-adv-x="860" d="M102 492v141q0 20 21 20h31q20 0 20 -20v-141q0 -68 60.5 -126.5t195.5 -58.5t195.5 59.5t60.5 125.5v141q0 20 21 20h30q20 0 21 -20v-141q0 -94 -71 -168t-206 -86v-136h133q20 0 21 -20v-62q0 -20 -21 -20h-368q-20 0 -21 20v62q0 20 21 20h133v136q-135 12 -206 86 t-71 168zM276 492v161h308v-161q0 -31 -37 -56.5t-117 -25.5q-82 0 -118 25.5t-36 56.5zM276 725v217q0 31 36 56.5t118 25.5q80 0 117 -25.5t37 -56.5v-217h-308z" />
<glyph unicode="P" horiz-adv-x="1126" d="M102 154v614q0 41 30 71.5t73 30.5h45v-102h164v102h297v-102h163v102h48q41 0 71.5 -30.5t30.5 -71.5v-614q0 -43 -30.5 -73t-71.5 -30h-717q-43 0 -73 30t-30 73zM205 154h717v409h-717v-409zM297 799v174h72v-174h-72zM758 799v174h71v-174h-71z" />
<glyph unicode="Q" horiz-adv-x="618" d="M104 536q0 16 86 122q90 112 184 215q90 99 98 100q5 -4 -76 -191q-79 -182 -79 -192q2 -5 97.5 -44.5t99.5 -56.5q0 -17 -88 -124q-90 -111 -183 -214q-90 -99 -97 -100q-5 2 35 94.5t81 187.5q39 91 39 100q-2 7 -97 47q-100 42 -100 56z" />
<glyph unicode="R" horiz-adv-x="778" d="M102 115v118q0 37 31 79t69 73t68.5 66.5t30.5 60.5q0 27 -30.5 61.5t-68.5 65.5t-69 72t-31 77v121q0 35 88.5 75t199 40t198.5 -40t88 -75v-121q0 -37 -31 -77.5t-68.5 -71.5t-68.5 -65.5t-31 -61.5q0 -25 31 -60.5t68.5 -66.5t68.5 -73t31 -79v-118q0 -35 -88 -75 t-198.5 -40t-199 40t-88.5 75zM164 840l2 -52q0 -35 92 -122q6 -6 22.5 -21.5t23.5 -22.5l20 -20q12 -12 17 -21.5t11 -20.5t9.5 -23.5t3.5 -24.5q0 -14 -5.5 -29.5t-9.5 -24.5t-18.5 -25.5t-20.5 -23t-26.5 -25.5t-26.5 -26q-92 -88 -92 -125v-67q8 4 68.5 23.5t95.5 45 t35 60.5q0 18 12 25.5t25.5 0t13.5 -25.5q0 -35 34.5 -60.5t95 -45t68.5 -23.5v67q0 35 -94 125q-4 4 -29.5 29t-31.5 32t-20.5 25.5t-18.5 34t-4 33.5t4 33.5t18.5 34t20.5 25.5t31.5 32t29.5 29q94 90 94 122l2 52q-106 -53 -227 -54q-123 1 -225 54zM164 889q-1 -3 -2 -5 q0 -5 6 -7q90 -55 221 -56q135 0 225 51q5 3 6 9q0 10 -22 24q-96 55 -205 56q-125 0 -211 -56z" />
<glyph unicode="S" horiz-adv-x="983" d="M102 240q0 47 34 80.5t81 33.5q49 0 83 -33.5t34 -80.5q0 -49 -34 -83t-83 -34q-47 0 -81 34t-34 83zM102 537v120q221 0 378 -156.5t157 -377.5h-121q0 172 -122 293t-292 121zM102 780v121q322 0 550.5 -228.5t228.5 -549.5h-123q0 272 -192 464.5t-464 192.5z" />
<glyph unicode="T" horiz-adv-x="1208" d="M102 711q209 211 503 211t501 -211l-72 -72q-178 180 -430 180t-430 -180zM246 567q150 150 359.5 150t357.5 -150l-72 -73q-119 121 -286 120.5t-288 -120.5zM389 422q90 90 215 90t215 -90l-71 -72q-59 59 -143.5 59.5t-143.5 -59.5zM504 205q0 43 29.5 72.5t70.5 29.5 q43 0 73 -29.5t30 -72.5t-30 -73t-73 -30q-41 0 -70.5 30t-29.5 73z" />
<glyph unicode="U" horiz-adv-x="921" d="M102 178v400q0 23 15.5 42t36.5 19h102v72q0 236 205 235q100 0 152.5 -61.5t52.5 -173.5v-72h92q20 0 40.5 -20.5t20.5 -40.5v-400q0 -20 -14 -39.5t-35 -25.5l-61 -21q-53 -16 -101 -16h-297q-47 0 -100 16l-61 21q-20 6 -34 25.5t-14 39.5zM358 639h205v92 q0 113 -102.5 113t-102.5 -113v-92z" />
<glyph unicode="V" horiz-adv-x="921" d="M102 154v399q0 23 15.5 42t36.5 19h409v144q0 53 -27.5 82.5t-74.5 29.5q-102 0 -103 -112v-41h-102v20q0 113 52 174.5t152.5 61.5t153 -61.5t52.5 -174.5v-123h92q20 0 40.5 -20.5t20.5 -40.5v-399q0 -20 -14 -41t-35 -27l-61 -18q-43 -16 -101 -17h-297q-57 0 -100 17 l-61 18q-20 6 -34 25.5t-14 42.5z" />
<glyph unicode="W" horiz-adv-x="890" d="M104 476q4 30 29 48q23 16 52.5 12t45.5 -26l121 -160l303 488q14 25 44 31q9 2 18 3q20 0 37 -12q25 -14 31 -44q2 -9 3 -17q0 -20 -12 -37l-356 -576q-23 -33 -58 -32h-4q-35 0 -57 28l-182 242q-15 18 -15 42q-1 5 0 10z" />
<glyph unicode="X" horiz-adv-x="686" d="M102 306.5q0 25.5 19 43.5l141 162l-141 162q-18 16 -18.5 41.5t18 44t44 18.5t42.5 -18l137 -156l135 156q18 18 44 18t42 -18q18 -18 18.5 -44t-18.5 -42l-141 -162l141 -162q18 -18 18.5 -43.5t-18.5 -42.5q-16 -18 -41.5 -18t-44.5 18l-135 154l-137 -154 q-16 -18 -42 -18t-44 18q-19 17 -19 42.5z" />
<glyph unicode="Y" horiz-adv-x="1064" d="M102 512q0 178 126 304t304.5 126t304.5 -126t126 -304t-126 -304t-304.5 -126t-304.5 126t-126 304zM272 461h519v104h-519v-104z" />
<glyph unicode="Z" horiz-adv-x="1064" d="M102 512q0 178 126 304t304.5 126t304.5 -126t126 -304t-126 -304t-304.5 -126t-304.5 126t-126 304zM274 459h207v-205h105v205h207v104h-207v207h-105v-207h-207v-104z" />
<glyph unicode="[" horiz-adv-x="1064" d="M102 512q0 178 126 304t304.5 126t304.5 -126t126 -304t-126 -304t-304.5 -126t-304.5 126t-126 304zM287 354l88 -88l157 158l156 -158l88 88l-155 158l155 156l-88 90l-156 -158l-157 158l-88 -90l155 -156z" />
<glyph unicode="\" horiz-adv-x="798" d="M102 512q0 51 31 51h533q31 0 30.5 -51t-30.5 -51h-533q-31 0 -31 51z" />
<glyph unicode="]" horiz-adv-x="798" d="M102 512q0 51 31 51h215v215q0 31 51.5 31t51.5 -31v-215h215q31 0 30.5 -51t-30.5 -51h-215v-215q0 -31 -51.5 -31t-51.5 31v215h-215q-31 0 -31 51z" />
<glyph unicode="^" horiz-adv-x="1146" d="M102 512q0 195 138.5 333t333 138t332.5 -138t138 -333t-138 -333t-332.5 -138t-333 138t-138.5 333zM215 512q0 -131 80 -227l504 503q-98 82 -226 82q-150 0 -254 -104t-104 -254zM319 258zM346 233q100 -80 227 -79q147 0 253 104t106 254q0 129 -82 227zM825 766z " />
<glyph unicode="_" horiz-adv-x="675" d="M102 487q92 80 193.5 129.5t155.5 49.5q78 0 34 -166l-71 -275q-16 -66 6 -65q43 0 123 61l30 -41q-88 -88 -180 -134t-143 -46q-102 0 -55 180l61 260q16 59 0 60q-14 0 -56 -18.5t-71 -39.5zM326 897q0 45 36.5 86t98.5 41q49 0 76.5 -28.5t27.5 -71.5q0 -51 -40 -90 t-97 -39q-49 0 -76.5 27.5t-25.5 74.5z" />
<glyph unicode="`" horiz-adv-x="1150" d="M104 506q-2 195 134.5 335t330.5 142q195 4 335 -133t142.5 -331.5t-134 -334t-330.5 -143.5q-195 -2 -334.5 134t-143.5 331zM410 508l16 -29q47 35 78 35q8 0 0 -35l-39 -153q-29 -109 35 -109q31 0 86 27.5t108 81.5l-18 24q-49 -37 -74 -37q-12 0 -4 39l43 162 q27 98 -20 98q-31 0 -92.5 -28.5t-118.5 -75.5zM532 750q-2 -29 15.5 -44.5t50.5 -15.5q39 0 62.5 22.5t23.5 53.5q0 59 -61 59q-43 0 -67 -23t-24 -52z" />
<glyph unicode="a" horiz-adv-x="798" d="M102 692q6 168 115 236q70 45 170 45q133 0 221 -63.5t88 -186.5q0 -68 -43 -129q-20 -25 -92 -80l-45 -33q-41 -29 -51 -61q-6 -18 -6 -45q0 -14 -17 -15h-131q-16 0 -16 15q4 100 27 127q18 20 51 46.5t57 43.5l25 16q25 20 32 35q29 37 29 70q0 47 -27 82 q-25 37 -94 36q-68 0 -96 -45q-29 -47 -29 -94h-168zM310 233q30 27 69 27h6q47 -2 77 -32q28 -28 28 -70q0 -3 -1 -6q-2 -47 -32 -75q-29 -26 -72 -26h-6q-45 2 -75 31q-28 27 -28 70q0 50 34 81z" />
<glyph unicode="b" horiz-adv-x="1150" d="M104 512q0 191 134 328q135 139 329 143h6q191 0 329 -134q140 -136 145 -331v-6q0 -191 -135 -329q-136 -140 -330 -142h-12q-187 0 -323 133q-143 140 -143 338zM389 616h113v7q0 29 18 55q16 25 53 24q41 0 55.5 -20t14.5 -47q0 -18 -16 -41q-8 -14 -19 -19l-6 -4 l-16.5 -11t-20.5 -15t-21.5 -18.5t-17.5 -18.5q-14 -16 -18 -78v-10h108v4q0 10 5 31q6 16 30 34l29 21q47 39 55 49q27 35 27 82q0 80 -55.5 119t-137.5 39q-61 0 -106 -29q-68 -43 -74 -147v-7zM497 290q0 -25 18 -43q19 -19 50 -22h2q29 0 48.5 18.5t21.5 47.5 q0 68 -70 71h-2q-29 0 -48.5 -19t-19.5 -53z" />
<glyph unicode="c" horiz-adv-x="1189" d="M109 94q-5 9 -5.5 18t5.5 17l454 801q12 18 33 18q23 0 31 -18l454 -801q5 -8 5 -17t-5 -18q-10 -16 -30 -16h-912q-20 0 -30 16zM532 180h125v103h-125v-103zM532 360h125v308h-125v-308z" />
<glyph unicode="d" horiz-adv-x="1167" d="M102 512q0 174 122 297t296 123q170 0 292 -120t126 -290h127l-188 -209l-189 209h146q-4 127 -95.5 216t-218.5 89q-131 0 -222 -92t-91 -223t91 -223t222 -92q102 0 187 61l71 -78q-115 -88 -258 -88q-174 0 -296 123t-122 297z" />
<glyph unicode="e" horiz-adv-x="1167" d="M102 522h125q4 170 126 290t292 120q174 0 297 -123t123 -297t-123 -297t-297 -123q-143 0 -258 88l72 78q84 -61 186 -61q131 0 222 92t91 223t-91 223t-222 92q-127 0 -218 -89t-95 -216h145l-188 -209z" />
<glyph unicode="f" d="M102 205v143h109q55 0 107.5 33t82 67.5t84.5 106.5q63 84 103.5 129t120 90t168.5 45h34v123l215 -184l-215 -185v103h-34q-55 0 -108.5 -33t-83.5 -67.5t-85 -106.5q-49 -63 -76.5 -96t-79 -79t-108.5 -67.5t-125 -21.5h-109zM102 666v143h109q139 0 258 -109 q-57 -72 -63 -82q-8 -12 -25 -32q-80 80 -170 80h-109zM608 313q47 59 74 95q0 2 6 9t8 11q90 -90 181 -90h34v102l215 -184l-215 -184v123h-34q-146 -1 -269 118z" />
<glyph unicode="g" horiz-adv-x="1075" d="M102 635l215 184v-112h553q43 0 73 -30t30 -73v-297q0 -43 -30 -72.5t-73 -29.5h-706v143h665v215h-512v-112z" />
<glyph unicode="h" d="M102 614l195 205l195 -205h-123v-266h227l131 -143h-399q-43 0 -73 29.5t-30 72.5v307h-123zM502 819h399q41 0 72 -29.5t31 -72.5v-307h122l-194 -205l-195 205h123v266h-227z" />
<glyph unicode="i" horiz-adv-x="921" d="M102 307.5q0 20.5 14.5 35.5t37.5 15h614q20 0 35.5 -15t15.5 -35.5t-15.5 -36t-35.5 -15.5h-614q-23 0 -37.5 15.5t-14.5 36zM102 512q0 20 14.5 35.5t37.5 15.5h614q20 0 35.5 -15.5t15.5 -35.5t-15.5 -35.5t-35.5 -15.5h-614q-23 0 -37.5 15.5t-14.5 35.5zM102 716.5 q0 20.5 14.5 36t37.5 15.5h614q20 0 35.5 -15.5t15.5 -36t-15.5 -35.5t-35.5 -15h-614q-23 0 -37.5 15t-14.5 35.5z" />
<glyph unicode="j" d="M102 307.5q0 20.5 15.5 35.5t36.5 15h307q23 0 37 -15t14 -35.5t-14.5 -36t-36.5 -15.5h-307q-20 0 -36 15.5t-16 36zM102 512q0 20 15.5 35.5t36.5 15.5h307q23 0 37 -15.5t14 -35.5t-14.5 -35.5t-36.5 -15.5h-307q-20 0 -36 15.5t-16 35.5zM102 716.5q0 20.5 15.5 36 t36.5 15.5h307q23 0 37 -15.5t14 -36t-14.5 -35.5t-36.5 -15h-307q-20 0 -36 15t-16 35.5zM621 512q0 51 30 51h168v174q0 31 51.5 31t51.5 -31v-174h174q31 0 30.5 -51t-30.5 -51h-174v-174q0 -31 -51.5 -31t-51.5 31v174h-168q-30 0 -30 51z" />
<glyph unicode="k" horiz-adv-x="819" d="M102 287v92q0 82 82 82h92q82 0 82 -82v-92q0 -82 -82 -82h-92q-82 0 -82 82zM102 645v92q0 82 82 82h92q82 0 82 -82v-92q0 -82 -82 -82h-92q-82 0 -82 82zM461 287v92q0 82 82 82h92q82 0 82 -82v-92q0 -82 -82 -82h-92q-82 0 -82 82zM461 645v92q0 82 82 82h92 q82 0 82 -82v-92q0 -82 -82 -82h-92q-82 0 -82 82z" />
<glyph unicode="l" horiz-adv-x="921" d="M102 154v716q0 41 30 72t73 31h512q41 0 71.5 -31t30.5 -72v-716q0 -43 -30.5 -73t-71.5 -30h-512q-43 0 -73 30t-30 73zM205 154h512v716h-512v-716zM317 268v88h287v-88h-287zM317 670v90h287v-90h-287zM319 467v92h287v-92h-287z" />
<glyph unicode="m" horiz-adv-x="921" d="M102 154v716q0 41 31 72t72 31h512q43 0 72.5 -31t29.5 -72v-716q0 -43 -29.5 -73t-72.5 -30h-512q-41 0 -72 30t-31 73zM205 154h512v716h-512v-716z" />
<glyph unicode="n" horiz-adv-x="921" d="M102 307v615q0 20 15.5 35.5t36.5 15.5h409q23 0 37 -15.5t14 -35.5v-154h154q23 0 37 -15.5t14 -35.5v-615q0 -20 -14 -35.5t-37 -15.5h-410q-20 0 -35.5 15.5t-15.5 35.5v154h-153q-20 0 -36 15.5t-16 35.5zM205 358h102v359q0 20 14.5 35.5t36.5 15.5h154v102h-307 v-512zM410 154h307v512h-307v-512z" />
<glyph unicode="o" horiz-adv-x="1024" d="M0 256v512q0 41 30.5 71.5t71.5 30.5h820q43 0 72.5 -30.5t29.5 -71.5v-512q0 -43 -29.5 -72.5t-72.5 -29.5h-820q-41 0 -71.5 29.5t-30.5 72.5zM102 256h820v512h-820v-512z" />
<glyph unicode="p" d="M106 690q-3 8 -2 15q0 9 4 17q7 15 21 19l696 254q10 4 18 4q22 0 31 -28l107 -289h-102l-127 154l-222 -154h-182q-55 0 -93 -39t-38 -94v-164zM309 66v483q0 16 11.5 28.5t27.5 12.5h739q16 0 27.5 -12.5t11.5 -28.5v-483q0 -16 -11 -28.5t-28 -12.5h-739 q-16 0 -27.5 12.5t-11.5 28.5zM418 129h614v164l-74 166l-172 -62l-133 -137l-141 176l-94 -219v-88z" />
<glyph unicode="q" horiz-adv-x="1208" d="M102 195v61h103v102h-103v103h103v102h-103v103h103v102h-103v61q0 16 12.5 28.5t28.5 12.5h922q18 0 29.5 -12t11.5 -29v-61h-102v-102h102v-103h-102v-102h102v-103h-102v-102h102v-61q0 -16 -11.5 -28.5t-29.5 -12.5h-922q-16 0 -28.5 12.5t-12.5 28.5zM492 358 l256 154l-256 154v-308z" />
<glyph unicode="r" horiz-adv-x="921" d="M102 154v716q0 41 31 72t72 31h512q43 0 72.5 -31t29.5 -72v-716q0 -43 -29.5 -73t-72.5 -30h-512q-41 0 -72 30t-31 73zM289 289q10 -33 53 -45q20 -6 40 -6q24 0 48 8q88 27 88 100v266q53 -8 69 -51q9 -24 8 -44q0 -17 -5 -32q-4 -10 2 -10q4 0 12 10q26 35 26 73 q0 11 -2 22q-9 49 -34 80.5t-50.5 67.5t-25.5 54h-61v-376q-19 8 -41 7q-24 0 -49 -10q-45 -16 -68 -49q-15 -21 -15 -42q1 -11 5 -23z" />
<glyph unicode="s" horiz-adv-x="1232" d="M104 614q-2 27 6.5 39.5t41.5 12.5h929q33 0 41 -12.5t6 -39.5l-43 -460q-2 -27 -12 -39.5t-43 -12.5h-827q-33 0 -43 12.5t-13 39.5zM190 737l15 133q4 23 20.5 37.5t36.5 14.5h168q51 0 88 -37l29 -29q37 -37 88 -37h350q20 0 38.5 -12t23.5 -29l10 -41h-867z" />
<glyph unicode="t" horiz-adv-x="1210" d="M103 651q0 7 1 12q2 7 7.5 15t8.5 12t12 13l13 14l31 31v-82h858v82l29 -31q4 -4 14 -13.5t13.5 -13.5t8.5 -12t6 -15.5t1 -19.5t-2 -29q-6 -29 -23.5 -130t-36 -211.5t-20.5 -118.5q-10 -51 -61 -52h-715q-53 0 -62 52q-6 25 -39.5 228.5t-40.5 231.5q-3 28 -3 37z M248 717v51q0 23 13 36t26 15h12h612q6 0 14.5 -1t23 -14t14.5 -36v-51h-715zM350 870q0 23 13.5 36.5t25.5 15.5h12h408q6 0 14 -1t22.5 -14.5t14.5 -36.5h-510zM401 440q0 -51 52 -51h305q23 0 36 12.5t13 24.5l2 14v103h-72v-82h-264v82h-72v-103z" />
<glyph unicode="u" horiz-adv-x="903" d="M104 801q-6 47 93.5 89t255 42t254 -42t92.5 -89l-74 -608q-2 -12 -35 -36t-98.5 -44.5t-139 -20.5t-140 20.5t-99.5 44t-35 36.5zM178 790.5q0 -12.5 33 -30t100.5 -32.5t141 -15t140 15t99.5 32.5t33 30t-33 30t-99.5 32.5t-140 15t-141 -15t-100.5 -32.5t-33 -30z" />
<glyph unicode="v" horiz-adv-x="1230" d="M104 283q-2 9 -2 18q0 36 35 55l164 111h100l-174 -135h181q10 0 12 -6l43 -115h305l43 115q4 6 12 6h181l-175 135h103l162 -111q35 -20 34 -55q0 -9 -2 -18l-28 -158q-4 -20 -22.5 -33.5t-41.5 -13.5h-835q-51 0 -66 47zM340 688l276 260l277 -260h-154v-252h-245v252 h-154z" />
<glyph unicode="w" horiz-adv-x="1024" d="M0 283q-2 9 -2 18q0 36 35 55l164 109h100l-174 -133h180q8 0 12 -6l43 -115h306l43 115q2 6 12 6h180l-174 133h100l164 -109q35 -20 35 -55q0 -9 -2 -18l-29 -158q-4 -20 -23.5 -34.5t-39.5 -14.5h-836q-20 0 -39.5 14t-25.5 35zM236 694h153v252h246v-252h153 l-276 -260z" />
<glyph unicode="x" horiz-adv-x="1128" d="M104 369q-2 13 -2 26q0 38 19 70l160 385q23 45 75 45h107l-21 -207h-139l262 -217l260 217h-137l-20 207h104q53 0 76 -45l162 -385q17 -33 16 -69q0 -13 -2 -27l-35 -191q-4 -20 -22.5 -35.5t-38.5 -15.5h-727q-20 0 -39 15.5t-23 35.5zM190 326l13 -74 q2 -20 19.5 -35.5t39.5 -15.5h604q23 0 40.5 15t19.5 36l14 74q2 20 -10 35.5t-35 15.5h-662q-20 0 -33.5 -14t-9.5 -37z" />
<glyph unicode="y" d="M102 360q0 76 54.5 129.5t130.5 53.5q4 0 11 -1t11 -1q-4 25 -4 39q0 111 80 188.5t193 77.5q92 0 163.5 -53.5t98.5 -137.5q25 4 41 4q102 0 173.5 -69.5t71.5 -170t-71.5 -170t-173.5 -69.5h-594q-76 0 -130.5 53t-54.5 127z" />
<glyph unicode="z" d="M102 360.5q0 75.5 54.5 128t132.5 52.5h22q-4 25 -4 37q0 111 80 188.5t193 77.5q90 0 162.5 -53.5t99.5 -135.5q12 2 41 2q102 0 172.5 -69.5t70.5 -169.5q0 -98 -71.5 -169t-171.5 -71h-197v195h109l-181 235l-178 -235h107v-195h-254q-78 0 -132.5 53.5t-54.5 129z " />
<glyph unicode="{" horiz-adv-x="716" d="M102 248v528q0 29 16.5 39t41.5 -6l438 -270q16 -12 16 -27l-16 -27l-438 -270q-25 -16 -41.5 -6t-16.5 39z" />
<glyph unicode="|" horiz-adv-x="747" d="M102 219v584q0 68 92.5 67.5t92.5 -67.5v-584q0 -66 -92.5 -66t-92.5 66zM461 219v584q0 68 92 67.5t92 -67.5v-584q0 -66 -92 -66t-92 66z" />
<glyph unicode="}" horiz-adv-x="921" d="M102 512q0 150 104.5 254t254.5 104q147 0 252.5 -104t105.5 -254t-105.5 -254t-252.5 -104q-150 0 -254.5 104t-104.5 254z" />
<glyph unicode="~" horiz-adv-x="819" d="M102 270v482q0 68 78 67h461q76 0 76 -67v-482q0 -66 -76 -65h-461q-78 -1 -78 65z" />
<glyph unicode="&#xa9;" horiz-adv-x="1191" d="M104 506q-2 203 139.5 348t344.5 150q205 2 350 -139.5t149 -346.5q2 -203 -140 -349t-345 -149q-205 -4 -350.5 138.5t-147.5 347.5zM207 506q4 -160 117.5 -272.5t275.5 -110.5t273.5 117.5t109.5 275.5q-2 162 -116.5 273.5t-276.5 109.5t-273.5 -116.5t-109.5 -276.5 zM328 512q0 68 39 106q37 39 98 39q88 0 125 -67l-64 -33q-10 23 -24 29q-16 10 -27 10q-63 0 -63 -84q0 -35 16 -61q16 -23 47 -23q41 0 57 41l60 -29q-16 -31 -53 -55q-35 -20 -72 -20q-59 0 -102 38q-37 39 -37 109zM600 512q0 68 39 106q37 39 98 39q88 0 125 -67 l-63 -33q-10 23 -25 29q-16 10 -26 10q-63 0 -64 -84q0 -39 16.5 -61.5t47.5 -22.5q39 0 57 41l59 -29q-20 -35 -53 -55q-37 -20 -72 -20q-59 0 -102 38q-37 39 -37 109z" />
<glyph unicode="&#xaa;" horiz-adv-x="798" d="M102 692q6 168 115 236q70 45 170 45q133 0 221 -63.5t88 -186.5q0 -68 -43 -129q-20 -25 -92 -80l-45 -33q-41 -29 -51 -61q-6 -18 -6 -45q0 -14 -17 -15h-131q-16 0 -16 15q4 100 27 127q18 20 51 46.5t57 43.5l25 16q25 20 32 35q29 37 29 70q0 47 -27 82 q-25 37 -94 36q-68 0 -96 -45q-29 -47 -29 -94h-168zM310 233q30 27 69 27h6q47 -2 77 -32q28 -28 28 -70q0 -3 -1 -6q-2 -47 -32 -75q-29 -26 -72 -26h-6q-45 2 -75 31q-28 27 -28 70q0 50 34 81z" />
<glyph unicode="&#xad;" d="M102 51v205q18 8 48 17.5t34 11.5q96 35 132 69.5t36 98.5q0 23 -23.5 49t-31.5 76q-2 12 -23.5 24t-25.5 62q0 16 5 26t9 15l6 2q-10 51 -14 90q-4 55 43 115.5t164 60.5q115 0 162 -60.5t43 -115.5l-15 -90q20 -8 21 -43q-4 -49 -25.5 -61.5t-23.5 -24.5 q-8 -49 -32 -76t-24 -49q0 -63 36 -98.5t132 -69.5q186 -70 187 -125v-109h-820zM717 461v102h153v154h103v-154h153v-102h-153v-154h-103v154h-153z" />
<glyph unicode="&#xae;" horiz-adv-x="1126" d="M102 256v205h308v-256h-267q-41 0 -41 51zM102 563v205q0 51 41 51h267v-256h-308zM512 205v256h512v-205q0 -20 -15.5 -35.5t-35.5 -15.5h-461zM512 563v256h461q20 0 35.5 -15.5t15.5 -35.5v-205h-512z" />
<glyph unicode="&#xb2;" horiz-adv-x="1191" d="M104 506q-2 203 139.5 348t344.5 150q205 2 350 -139.5t149 -346.5q2 -203 -140 -349t-345 -149q-205 -4 -350.5 138.5t-147.5 347.5zM207 506q4 -160 117.5 -272.5t275.5 -110.5t273.5 117.5t109.5 275.5q-2 162 -116.5 273.5t-276.5 109.5t-273.5 -116.5t-109.5 -276.5 zM362 281q4 27 12.5 68.5t42.5 131.5t77 133q45 45 128 78t144 45l61 11q-4 -27 -11 -69t-41 -132t-79 -133q-45 -45 -128 -78t-144 -45zM524 514q0 -31 20.5 -51.5t50.5 -20.5t50 21q53 53 90 192q-137 -37 -190 -90q-21 -20 -21 -51z" />
<glyph unicode="&#xb3;" horiz-adv-x="1085" d="M102 516q453 254 711 379q23 10 50.5 25.5t38.5 20.5t26.5 9t24 1t16.5 -11t11 -17.5t-1 -23.5t-9 -25.5t-20.5 -40t-25.5 -49.5q-55 -115 -149.5 -293t-160.5 -298l-67 -121l-58 389zM565 553l29 -238l283 525z" />
<glyph unicode="&#xb9;" d="M102 137v600q0 18 17 29l239 152q18 10 35 0l221 -140l224 140q18 10 34 0l240 -152q14 -10 14 -29v-600q0 -20 -16 -31q-8 -4 -16.5 -4t-16.5 4l-223 140l-221 -140q-18 -10 -35 0l-221 140l-223 -140q-16 -10 -33 0q-19 11 -19 31zM170 199l172 108v518l-172 -108v-518 zM410 307l172 -108v518l-172 108v-518zM649 199l172 108v518l-172 -108v-518zM889 307l172 -108v518l-172 108v-518z" />
<glyph unicode="&#xba;" horiz-adv-x="1024" d="M0 256v512q0 41 30.5 71.5t71.5 30.5h820q43 0 72.5 -30.5t29.5 -71.5v-512q0 -43 -29.5 -72.5t-72.5 -29.5h-820q-41 0 -71.5 29.5t-30.5 72.5zM102 256h820v512h-820v-512z" />
<glyph unicode="&#xc0;" horiz-adv-x="1128" d="M237 1612q-2 195 134.5 335t330.5 142q195 4 335 -133t142.5 -331.5t-134 -334t-330.5 -143.5q-195 -2 -334.5 134t-143.5 331zM543 1614l16 -29q47 35 78 35q8 0 0 -35l-39 -153q-29 -109 35 -109q31 0 86 27.5t108 81.5l-18 24q-49 -37 -74 -37q-12 0 -4 39l43 162 q27 98 -20 98q-31 0 -92.5 -28.5t-118.5 -75.5zM665 1856q-2 -29 15.5 -44.5t50.5 -15.5q39 0 62.5 22.5t23.5 53.5q0 59 -61 59q-43 0 -67 -23t-24 -52zM109 183q-5 16 -5 29q0 19 11 30l417 417q-2 18 -2 37q0 30 7 61q10 48 26 64l137 137q13 15 40 16q23 0 56 -11 q71 -25 132 -86q63 -63 88 -135q11 -33 11 -55q0 -26 -15 -38l-140 -139q-16 -16 -63 -27q-29 -6 -61 -6q-19 0 -37 2l-418 -418q-11 -11 -28 -10q-13 0 -29 5q-39 13 -76 50q-39 37 -51 77zM458 487q0 -17 11 -28q13 -13 30 -14q24 0 54 28q20 20 23.5 44t-11 38t-38 10 t-44.5 -24q-25 -25 -25 -54zM737 921.5q-2 -1.5 -2 -7.5q0 -7 3 -21q5 -25 25.5 -62.5t51.5 -68.5q29 -29 68 -49.5t63 -25.5q14 -3 21 -3q6 0 8 2q2 1 1 5q0 7 -3 22q-6 25 -27.5 62.5t-50.5 66.5q-31 31 -69 51t-61 27q-14 4 -21 3q-5 0 -7 -1.5z" />
<glyph unicode="&#xc2;" horiz-adv-x="1128" d="M174 1618q0 195 138.5 333t333 138t332.5 -138t138 -333t-138 -333t-332.5 -138t-333 138t-138.5 333zM287 1618q0 -131 80 -227l504 503q-98 82 -226 82q-150 0 -254 -104t-104 -254zM391 1364zM418 1339q100 -80 227 -79q147 0 253 104t106 254q0 129 -82 227z M897 1872zM109 183q-5 16 -5 29q0 19 11 30l417 417q-2 18 -2 37q0 30 7 61q10 48 26 64l137 137q13 15 40 16q23 0 56 -11q71 -25 132 -86q63 -63 88 -135q11 -33 11 -55q0 -26 -15 -38l-140 -139q-16 -16 -63 -27q-29 -6 -61 -6q-19 0 -37 2l-418 -418q-11 -11 -28 -10 q-13 0 -29 5q-39 13 -76 50q-39 37 -51 77zM458 487q0 -17 11 -28q13 -13 30 -14q24 0 54 28q20 20 23.5 44t-11 38t-38 10t-44.5 -24q-25 -25 -25 -54zM737 921.5q-2 -1.5 -2 -7.5q0 -7 3 -21q5 -25 25.5 -62.5t51.5 -68.5q29 -29 68 -49.5t63 -25.5q14 -3 21 -3q6 0 8 2 q2 1 1 5q0 7 -3 22q-6 25 -27.5 62.5t-50.5 66.5q-31 31 -69 51t-61 27q-14 4 -21 3q-5 0 -7 -1.5z" />
<glyph unicode="&#xc3;" horiz-adv-x="1128" d="M362 1212v482q0 68 78 67h461q76 0 76 -67v-482q0 -66 -76 -65h-461q-78 -1 -78 65zM109 183q-5 16 -5 29q0 19 11 30l417 417q-2 18 -2 37q0 30 7 61q10 48 26 64l137 137q13 15 40 16q23 0 56 -11q71 -25 132 -86q63 -63 88 -135q11 -33 11 -55q0 -26 -15 -38 l-140 -139q-16 -16 -63 -27q-29 -6 -61 -6q-19 0 -37 2l-418 -418q-11 -11 -28 -10q-13 0 -29 5q-39 13 -76 50q-39 37 -51 77zM458 487q0 -17 11 -28q13 -13 30 -14q24 0 54 28q20 20 23.5 44t-11 38t-38 10t-44.5 -24q-25 -25 -25 -54zM737 921.5q-2 -1.5 -2 -7.5 q0 -7 3 -21q5 -25 25.5 -62.5t51.5 -68.5q29 -29 68 -49.5t63 -25.5q14 -3 21 -3q6 0 8 2q2 1 1 5q0 7 -3 22q-6 25 -27.5 62.5t-50.5 66.5q-31 31 -69 51t-61 27q-14 4 -21 3q-5 0 -7 -1.5z" />
<glyph unicode="&#xc4;" horiz-adv-x="1105" d="M102 266v492q0 29 15.5 38t38.5 -5l368 -254q14 -10 15 -25l-15 -25l-368 -254q-23 -14 -38.5 -5t-15.5 38zM553 266v492q0 27 16.5 37t36.5 -4l383 -254q14 -10 15 -25l-15 -25l-383 -254q-20 -14 -36.5 -4t-16.5 37z" />
<glyph unicode="&#xc5;" horiz-adv-x="1105" d="M102 512l15 25l383 254q20 14 36.5 3.5t16.5 -36.5v-492q0 -27 -16.5 -37t-36.5 4l-383 254q-15 11 -15 25zM567 512l15 25l368 254q23 14 38.5 4.5t15.5 -37.5v-492q0 -29 -15.5 -38t-38.5 5l-368 254q-15 11 -15 25z" />
<glyph unicode="&#xc7;" horiz-adv-x="819" d="M102 274v478q0 59 76 59q78 0 78 -59v-478q0 -59 -78 -59q-76 0 -76 59zM281 512l12 23l373 235q23 14 37 5t14 -36v-452q0 -27 -14.5 -36t-36.5 5l-373 233q-12 11 -12 23z" />
<glyph unicode="&#xc8;" horiz-adv-x="1046" d="M202 1612q-2 195 134.5 335t330.5 142q195 4 335 -133t142.5 -331.5t-134 -334t-330.5 -143.5q-195 -2 -334.5 134t-143.5 331zM508 1614l16 -29q47 35 78 35q8 0 0 -35l-39 -153q-29 -109 35 -109q31 0 86 27.5t108 81.5l-18 24q-49 -37 -74 -37q-12 0 -4 39l43 162 q27 98 -20 98q-31 0 -92.5 -28.5t-118.5 -75.5zM630 1856q-2 -29 15.5 -44.5t50.5 -15.5q39 0 62.5 22.5t23.5 53.5q0 59 -61 59q-43 0 -67 -23t-24 -52zM102 322q100 -58 216 -59q30 0 62 4q151 19 259.5 128t127.5 259q4 31 4 62q0 115 -58 216q55 -31 98 -74 q131 -133 131 -317.5t-131 -317.5q-131 -131 -316.5 -131t-316.5 131q-43 44 -76 99z" />
<glyph unicode="&#xc9;" horiz-adv-x="819" d="M102 285v454q0 27 14.5 35t35.5 -6l372 -233q12 -10 13 -23l-13 -23l-372 -233q-20 -14 -35 -6t-15 35zM563 274v476q0 59 76 59q78 0 78 -59v-476q0 -59 -78 -59q-76 0 -76 59z" />
<glyph unicode="&#xca;" horiz-adv-x="1046" d="M139 1618q0 195 138.5 333t333 138t332.5 -138t138 -333t-138 -333t-332.5 -138t-333 138t-138.5 333zM252 1618q0 -131 80 -227l504 503q-98 82 -226 82q-150 0 -254 -104t-104 -254zM356 1364zM383 1339q100 -80 227 -79q147 0 253 104t106 254q0 129 -82 227z M862 1872zM102 322q100 -58 216 -59q30 0 62 4q151 19 259.5 128t127.5 259q4 31 4 62q0 115 -58 216q55 -31 98 -74q131 -133 131 -317.5t-131 -317.5q-131 -131 -316.5 -131t-316.5 131q-43 44 -76 99z" />
<glyph unicode="&#xcc;" horiz-adv-x="1087" d="M34 1612q-2 195 134.5 335t330.5 142q195 4 335 -133t142.5 -331.5t-134 -334t-330.5 -143.5q-195 -2 -334.5 134t-143.5 331zM340 1614l16 -29q47 35 78 35q8 0 0 -35l-39 -153q-29 -109 35 -109q31 0 86 27.5t108 81.5l-18 24q-49 -37 -74 -37q-12 0 -4 39l43 162 q27 98 -20 98q-31 0 -92.5 -28.5t-118.5 -75.5zM462 1856q-2 -29 15.5 -44.5t50.5 -15.5q39 0 62.5 22.5t23.5 53.5q0 59 -61 59q-43 0 -67 -23t-24 -52zM104 774q-1 6 -1 13q0 30 26 49q8 8 57.5 46t55.5 44q18 16 55 16h494q35 0 57 -16q8 -8 57 -46t56 -44q24 -20 23 -49 q0 -6 -1 -13l-98 -663q-10 -29 -41 -29h-600q-31 0 -41 29q-95 636 -99 663zM184 768h721l-114 117h-494zM334 674q49 -283 211 -283q160 0 209 283h-95q-39 -190 -114 -191q-78 0 -117 191h-94z" />
<glyph unicode="&#xce;" horiz-adv-x="1087" d="M-29 1618q0 195 138.5 333t333 138t332.5 -138t138 -333t-138 -333t-332.5 -138t-333 138t-138.5 333zM84 1618q0 -131 80 -227l504 503q-98 82 -226 82q-150 0 -254 -104t-104 -254zM188 1364zM215 1339q100 -80 227 -79q147 0 253 104t106 254q0 129 -82 227zM694 1872 zM104 774q-1 6 -1 13q0 30 26 49q8 8 57.5 46t55.5 44q18 16 55 16h494q35 0 57 -16q8 -8 57 -46t56 -44q24 -20 23 -49q0 -6 -1 -13l-98 -663q-10 -29 -41 -29h-600q-31 0 -41 29q-95 636 -99 663zM184 768h721l-114 117h-494zM334 674q49 -283 211 -283q160 0 209 283h-95 q-39 -190 -114 -191q-78 0 -117 191h-94z" />
<glyph unicode="&#xd1;" horiz-adv-x="1024" d="M102 102l23 287l80 -82l143 148l103 -103l-146 -147l80 -80zM573 672l146 147l-80 80l283 23l-21 -287l-80 82l-145 -148z" />
<glyph unicode="&#xd2;" horiz-adv-x="860" d="M-66 1612q-2 195 134.5 335t330.5 142q195 4 335 -133t142.5 -331.5t-134 -334t-330.5 -143.5q-195 -2 -334.5 134t-143.5 331zM240 1614l16 -29q47 35 78 35q8 0 0 -35l-39 -153q-29 -109 35 -109q31 0 86 27.5t108 81.5l-18 24q-49 -37 -74 -37q-12 0 -4 39l43 162 q27 98 -20 98q-31 0 -92.5 -28.5t-118.5 -75.5zM362 1856q-2 -29 15.5 -44.5t50.5 -15.5q39 0 62.5 22.5t23.5 53.5q0 59 -61 59q-43 0 -67 -23t-24 -52zM102 492v141q0 20 21 20h31q20 0 20 -20v-141q0 -68 60.5 -126.5t195.5 -58.5t195.5 59.5t60.5 125.5v141q0 20 21 20 h30q20 0 21 -20v-141q0 -94 -71 -168t-206 -86v-136h133q20 0 21 -20v-62q0 -20 -21 -20h-368q-20 0 -21 20v62q0 20 21 20h133v136q-135 12 -206 86t-71 168zM276 492v161h308v-161q0 -31 -37 -56.5t-117 -25.5q-82 0 -118 25.5t-36 56.5zM276 725v217q0 31 36 56.5 t118 25.5q80 0 117 -25.5t37 -56.5v-217h-308z" />
<glyph unicode="&#xd4;" horiz-adv-x="860" d="M-129 1618q0 195 138.5 333t333 138t332.5 -138t138 -333t-138 -333t-332.5 -138t-333 138t-138.5 333zM-16 1618q0 -131 80 -227l504 503q-98 82 -226 82q-150 0 -254 -104t-104 -254zM88 1364zM115 1339q100 -80 227 -79q147 0 253 104t106 254q0 129 -82 227z M594 1872zM102 492v141q0 20 21 20h31q20 0 20 -20v-141q0 -68 60.5 -126.5t195.5 -58.5t195.5 59.5t60.5 125.5v141q0 20 21 20h30q20 0 21 -20v-141q0 -94 -71 -168t-206 -86v-136h133q20 0 21 -20v-62q0 -20 -21 -20h-368q-20 0 -21 20v62q0 20 21 20h133v136 q-135 12 -206 86t-71 168zM276 492v161h308v-161q0 -31 -37 -56.5t-117 -25.5q-82 0 -118 25.5t-36 56.5zM276 725v217q0 31 36 56.5t118 25.5q80 0 117 -25.5t37 -56.5v-217h-308z" />
<glyph unicode="&#xd5;" horiz-adv-x="860" d="M59 1212v482q0 68 78 67h461q76 0 76 -67v-482q0 -66 -76 -65h-461q-78 -1 -78 65zM102 492v141q0 20 21 20h31q20 0 20 -20v-141q0 -68 60.5 -126.5t195.5 -58.5t195.5 59.5t60.5 125.5v141q0 20 21 20h30q20 0 21 -20v-141q0 -94 -71 -168t-206 -86v-136h133 q20 0 21 -20v-62q0 -20 -21 -20h-368q-20 0 -21 20v62q0 20 21 20h133v136q-135 12 -206 86t-71 168zM276 492v161h308v-161q0 -31 -37 -56.5t-117 -25.5q-82 0 -118 25.5t-36 56.5zM276 725v217q0 31 36 56.5t118 25.5q80 0 117 -25.5t37 -56.5v-217h-308z" />
<glyph unicode="&#xd6;" horiz-adv-x="1044" d="M102 197l150 151l-82 82l291 23l-23 -293l-82 82l-149 -150zM586 571l22 293l82 -84l150 152l102 -107l-147 -149l82 -82z" />
<glyph unicode="&#xd9;" horiz-adv-x="921" d="M-48 1612q-2 195 134.5 335t330.5 142q195 4 335 -133t142.5 -331.5t-134 -334t-330.5 -143.5q-195 -2 -334.5 134t-143.5 331zM258 1614l16 -29q47 35 78 35q8 0 0 -35l-39 -153q-29 -109 35 -109q31 0 86 27.5t108 81.5l-18 24q-49 -37 -74 -37q-12 0 -4 39l43 162 q27 98 -20 98q-31 0 -92.5 -28.5t-118.5 -75.5zM380 1856q-2 -29 15.5 -44.5t50.5 -15.5q39 0 62.5 22.5t23.5 53.5q0 59 -61 59q-43 0 -67 -23t-24 -52zM102 178v400q0 23 15.5 42t36.5 19h102v72q0 236 205 235q100 0 152.5 -61.5t52.5 -173.5v-72h92q20 0 40.5 -20.5 t20.5 -40.5v-400q0 -20 -14 -39.5t-35 -25.5l-61 -21q-53 -16 -101 -16h-297q-47 0 -100 16l-61 21q-20 6 -34 25.5t-14 39.5zM358 639h205v92q0 113 -102.5 113t-102.5 -113v-92z" />
<glyph unicode="&#xdb;" horiz-adv-x="921" d="M-111 1618q0 195 138.5 333t333 138t332.5 -138t138 -333t-138 -333t-332.5 -138t-333 138t-138.5 333zM2 1618q0 -131 80 -227l504 503q-98 82 -226 82q-150 0 -254 -104t-104 -254zM106 1364zM133 1339q100 -80 227 -79q147 0 253 104t106 254q0 129 -82 227zM612 1872 zM102 178v400q0 23 15.5 42t36.5 19h102v72q0 236 205 235q100 0 152.5 -61.5t52.5 -173.5v-72h92q20 0 40.5 -20.5t20.5 -40.5v-400q0 -20 -14 -39.5t-35 -25.5l-61 -21q-53 -16 -101 -16h-297q-47 0 -100 16l-61 21q-20 6 -34 25.5t-14 39.5zM358 639h205v92 q0 113 -102.5 113t-102.5 -113v-92z" />
<glyph unicode="&#xdc;" horiz-adv-x="1124" d="M103 266.5q-3 12.5 26 30.5l821 463q29 16 50.5 4t21.5 -45v-383q0 -33 -23.5 -57.5t-58.5 -24.5h-799q-35 0 -38 12.5z" />
<glyph unicode="&#xe0;" horiz-adv-x="1110" d="M102 110.5q0 20.5 17 36.5l801 801q35 35 71 0q16 -14 16.5 -35.5t-16.5 -35.5l-801 -801q-14 -14 -34 -15q-23 0 -37 15q-17 14 -17 34.5zM211 340q-41 135 28.5 289.5t135.5 220.5q37 33 108.5 12.5t161.5 -86.5l-53 -53q-39 27 -78 44t-58.5 19t-29.5 -2 q-4 -10 -2 -30.5t19.5 -58.5t43.5 -79zM373 156l284 284q45 -33 90.5 -55.5t69 -25.5t33.5 1q4 10 1 34t-25.5 69t-55.5 90l51 51q76 -94 103.5 -176t-6.5 -119q-25 -25 -76 -57.5t-135 -71.5t-166 -46t-168 22z" />
<glyph unicode="&#xe1;" horiz-adv-x="1136" d="M104.5 303.5q-10.5 104.5 29.5 197.5t80 158.5t69 94.5q43 45 151.5 -4.5t221 -162t161.5 -222t6 -152.5q-29 -29 -94 -69t-159.5 -78.5t-199 -28.5t-180 86t-86 180.5zM332 688q-8 -8 2 -48t50 -104.5t97 -121.5q59 -59 123 -98.5t104 -50.5t48 -1q8 8 -2.5 48 t-50 104.5t-97 122t-122 97.5t-104.5 50t-48 2zM555 824.5q-6 21.5 4 39.5l55 99q10 18 31 23t39 -5t24.5 -30.5t-3.5 -39.5l-56 -98q-16 -27 -45 -27q-14 0 -24 9q-19 8 -25 29.5zM713 717.5q0 21.5 14 36.5l98 98q14 16 35 16t37 -16t16 -36.5t-16 -35.5l-96 -98 q-14 -14 -37 -14t-37 14t-14 35.5zM834.5 573.5q5.5 20.5 23.5 30.5l100 55q43 25 70 -20q23 -45 -20 -70l-99 -55q-12 -6 -24 -6q-33 0 -45 27q-11 18 -5.5 38.5z" />
<glyph unicode="&#xe2;" horiz-adv-x="952" d="M102 512l390 389v-196h358v-386h-358v-196z" />
<glyph unicode="&#xe3;" horiz-adv-x="983" d="M102 498l390 387l389 -387h-197v-361h-385v361h-197z" />
<glyph unicode="&#xe4;" horiz-adv-x="983" d="M102 526h197v359h385v-359h197l-389 -389z" />
<glyph unicode="&#xe5;" horiz-adv-x="952" d="M102 317v388h359v196l389 -389l-389 -389v194h-359z" />
<glyph unicode="&#xe7;" horiz-adv-x="952" d="M102 512l390 338v-197h358v-282h-358v-197z" />
<glyph unicode="&#xe8;" horiz-adv-x="880" d="M102 498l338 387l338 -387h-196v-361h-285v361h-195z" />
<glyph unicode="&#xe9;" horiz-adv-x="880" d="M102 526h195v359h285v-359h196l-338 -389z" />
<glyph unicode="&#xea;" horiz-adv-x="952" d="M102 369v284h359l2 197l387 -338l-389 -338l2 195h-361z" />
<glyph unicode="&#xeb;" horiz-adv-x="1146" d="M102 512q0 195 138.5 333t333 138t332.5 -138t138 -333t-138 -333t-332.5 -138t-333 138t-138.5 333zM205 512q0 -152 107.5 -260.5t260.5 -108.5q152 0 260.5 108.5t108.5 260.5t-108.5 260.5t-260.5 108.5q-154 0 -261 -108.5t-107 -260.5zM365 512l196 207v-115h209 v-184h-209v-115z" />
<glyph unicode="&#xec;" horiz-adv-x="1146" d="M102 512q0 195 138.5 333t333 138t332.5 -138t138 -333t-138 -333t-332.5 -138t-333 138t-138.5 333zM205 512q0 -152 107.5 -260.5t260.5 -108.5q152 0 260.5 108.5t108.5 260.5t-108.5 260.5t-260.5 108.5q-154 0 -261 -108.5t-107 -260.5zM365 524l208 195l207 -195 h-114v-209h-185v209h-116z" />
<glyph unicode="&#xed;" horiz-adv-x="1146" d="M102 512q0 195 138.5 333t333 138t332.5 -138t138 -333t-138 -333t-332.5 -138t-333 138t-138.5 333zM205 512q0 -152 108.5 -260.5t260 -108.5t260 108.5t108.5 260.5q0 154 -108.5 261.5t-260 107.5t-260 -107.5t-108.5 -261.5zM367 500h114v211h185v-211h114 l-207 -195z" />
<glyph unicode="&#xee;" horiz-adv-x="1146" d="M102 512q0 195 138.5 333t333 138t332.5 -138t138 -333t-138 -333t-332.5 -138t-333 138t-138.5 333zM205 512q0 -152 107.5 -260.5t260.5 -108.5q152 0 260.5 108.5t108.5 260.5t-108.5 260.5t-260.5 108.5q-154 0 -261 -108.5t-107 -260.5zM375 420v184h211v115 l194 -207l-194 -207v115h-211z" />
<glyph unicode="&#xef;" horiz-adv-x="1128" d="M104.5 468q-6.5 11 10.5 28l411 411q14 16 37 16.5t39 -16.5l412 -411q16 -16 10 -27.5t-29 -11.5h-86v-316q0 -14 -1 -21t-8 -13.5t-21 -6.5h-209v316h-209v-316h-201q-18 0 -28.5 6.5t-11.5 13.5t-1 21v316h-86q-22 0 -28.5 11z" />
<glyph unicode="&#xf1;" horiz-adv-x="573" d="M102 51v871q0 51 41 51h277q23 0 37 -15.5t14 -35.5v-871l-184 185z" />
<glyph unicode="&#xf2;" horiz-adv-x="1024" d="M102 205v307h103v-307h307v-103h-307q-43 0 -73 30t-30 73zM307 410v409q0 43 30 73t71 30h411q41 0 72 -31t31 -72v-409q0 -43 -31 -73t-72 -30h-409q-43 0 -73 30t-30 73zM410 410h409v409h-409v-409z" />
<glyph unicode="&#xf3;" horiz-adv-x="1126" d="M102 266v656q0 25 23 43q25 14 49 4l389 -156l391 156q25 10 50 -4q20 -16 20 -43v-656q0 -33 -31 -47l-409 -164q-8 -2 -11 -4h-10h-8l-10 4l-410 164q-33 14 -33 47zM184 287l328 -131v573l-328 131v-573zM246 408v69l207 -82v-69zM246 621v69l207 -82v-69zM614 156 l328 131v573l-328 -131v-573zM676 326v69l207 82v-69zM676 539v69l207 82v-69z" />
<glyph unicode="&#xf4;" horiz-adv-x="1013" d="M102 600q0 131 93.5 223t224.5 92t228 -97t97 -228q0 -90 -45 -164l193 -195q35 -35 6 -61l-47 -49q-33 -33 -70 0l-194 194q-76 -43 -160 -43q-131 0 -228.5 98.5t-97.5 229.5zM201 600q0 -90 68.5 -159.5t158.5 -69.5q92 0 156.5 64.5t64.5 154.5t-69.5 159.5 t-159.5 69.5t-154.5 -64.5t-64.5 -154.5z" />
<glyph unicode="&#xf5;" horiz-adv-x="1024" d="M141 1058v482q0 68 78 67h461q76 0 76 -67v-482q0 -66 -76 -65h-461q-78 -1 -78 65zM0 256v512q0 41 30.5 71.5t71.5 30.5h820q43 0 72.5 -30.5t29.5 -71.5v-512q0 -43 -29.5 -72.5t-72.5 -29.5h-820q-41 0 -71.5 29.5t-30.5 72.5zM102 256h820v512h-820v-512z" />
<glyph unicode="&#xf6;" horiz-adv-x="1146" d="M102 512q0 47 33 80t80 33t80 -34t33 -79t-33 -79t-80 -34t-80 33t-33 80zM461 512q0 47 32.5 80t79.5 33q45 0 79 -34t34 -79t-34 -79t-79 -34q-47 0 -79.5 33t-32.5 80zM819 512q0 47 33 80t80 33t79.5 -34t32.5 -79t-32.5 -79t-79.5 -34t-80 33t-33 80z" />
<glyph unicode="&#xf9;" horiz-adv-x="903" d="M-43 1520q-2 195 134.5 335t330.5 142q195 4 335 -133t142.5 -331.5t-134 -334t-330.5 -143.5q-195 -2 -334.5 134t-143.5 331zM263 1522l16 -29q47 35 78 35q8 0 0 -35l-39 -153q-29 -109 35 -109q31 0 86 27.5t108 81.5l-18 24q-49 -37 -74 -37q-12 0 -4 39l43 162 q27 98 -20 98q-31 0 -92.5 -28.5t-118.5 -75.5zM385 1764q-2 -29 15.5 -44.5t50.5 -15.5q39 0 62.5 22.5t23.5 53.5q0 59 -61 59q-43 0 -67 -23t-24 -52zM104 801q-6 47 93.5 89t255 42t254 -42t92.5 -89l-74 -608q-2 -12 -35 -36t-98.5 -44.5t-139 -20.5t-140 20.5 t-99.5 44t-35 36.5zM178 790.5q0 -12.5 33 -30t100.5 -32.5t141 -15t140 15t99.5 32.5t33 30t-33 30t-99.5 32.5t-140 15t-141 -15t-100.5 -32.5t-33 -30z" />
<glyph unicode="&#xfb;" horiz-adv-x="903" d="M-107 1526q0 195 138.5 333t333 138t332.5 -138t138 -333t-138 -333t-332.5 -138t-333 138t-138.5 333zM6 1526q0 -131 80 -227l504 503q-98 82 -226 82q-150 0 -254 -104t-104 -254zM110 1272zM137 1247q100 -80 227 -79q147 0 253 104t106 254q0 129 -82 227zM616 1780 zM104 801q-6 47 93.5 89t255 42t254 -42t92.5 -89l-74 -608q-2 -12 -35 -36t-98.5 -44.5t-139 -20.5t-140 20.5t-99.5 44t-35 36.5zM178 790.5q0 -12.5 33 -30t100.5 -32.5t141 -15t140 15t99.5 32.5t33 30t-33 30t-99.5 32.5t-140 15t-141 -15t-100.5 -32.5t-33 -30z" />
<glyph unicode="&#x152;" horiz-adv-x="1906" d="M962 322q100 -58 216 -59q30 0 62 4q151 19 259.5 128t127.5 259q4 31 4 62q0 115 -58 216q55 -31 98 -74q131 -133 131 -317.5t-131 -317.5q-131 -131 -316.5 -131t-316.5 131q-43 44 -76 99zM102 492v141q0 20 21 20h31q20 0 20 -20v-141q0 -68 60.5 -126.5 t195.5 -58.5t195.5 59.5t60.5 125.5v141q0 20 21 20h30q20 0 21 -20v-141q0 -94 -71 -168t-206 -86v-136h133q20 0 21 -20v-62q0 -20 -21 -20h-368q-20 0 -21 20v62q0 20 21 20h133v136q-135 12 -206 86t-71 168zM276 492v161h308v-161q0 -31 -37 -56.5t-117 -25.5 q-82 0 -118 25.5t-36 56.5zM276 725v217q0 31 36 56.5t118 25.5q80 0 117 -25.5t37 -56.5v-217h-308z" />
<glyph unicode="&#x153;" horiz-adv-x="2191" d="M1126 522h125q4 170 126 290t292 120q174 0 297 -123t123 -297t-123 -297t-297 -123q-143 0 -258 88l72 78q84 -61 186 -61q131 0 222 92t91 223t-91 223t-222 92q-127 0 -218 -89t-95 -216h145l-188 -209zM0 256v512q0 41 30.5 71.5t71.5 30.5h820q43 0 72.5 -30.5 t29.5 -71.5v-512q0 -43 -29.5 -72.5t-72.5 -29.5h-820q-41 0 -71.5 29.5t-30.5 72.5zM102 256h820v512h-820v-512z" />
<glyph unicode="&#x2c6;" horiz-adv-x="1146" d="M102 512q0 195 138.5 333t333 138t332.5 -138t138 -333t-138 -333t-332.5 -138t-333 138t-138.5 333zM215 512q0 -131 80 -227l504 503q-98 82 -226 82q-150 0 -254 -104t-104 -254zM319 258zM346 233q100 -80 227 -79q147 0 253 104t106 254q0 129 -82 227zM825 766z " />
<glyph unicode="&#x2dc;" horiz-adv-x="1024" d="M-371 188v482q0 68 78 67h461q76 0 76 -67v-482q0 -66 -76 -65h-461q-78 -1 -78 65z" />
<glyph unicode="&#x2000;" horiz-adv-x="1044" />
<glyph unicode="&#x2001;" horiz-adv-x="2088" />
<glyph unicode="&#x2002;" horiz-adv-x="1044" />
<glyph unicode="&#x2003;" horiz-adv-x="2088" />
<glyph unicode="&#x2004;" horiz-adv-x="696" />
<glyph unicode="&#x2005;" horiz-adv-x="522" />
<glyph unicode="&#x2006;" horiz-adv-x="348" />
<glyph unicode="&#x2007;" horiz-adv-x="348" />
<glyph unicode="&#x2008;" horiz-adv-x="260" />
<glyph unicode="&#x2009;" horiz-adv-x="417" />
<glyph unicode="&#x200a;" horiz-adv-x="114" />
<glyph unicode="&#x2010;" d="M102 51v205q18 8 48 17.5t34 11.5q96 35 132 69.5t36 98.5q0 23 -23.5 49t-31.5 76q-2 12 -23.5 24t-25.5 62q0 16 5 26t9 15l6 2q-10 51 -14 90q-4 55 43 115.5t164 60.5q115 0 162 -60.5t43 -115.5l-15 -90q20 -8 21 -43q-4 -49 -25.5 -61.5t-23.5 -24.5 q-8 -49 -32 -76t-24 -49q0 -63 36 -98.5t132 -69.5q186 -70 187 -125v-109h-820zM717 461v102h153v154h103v-154h153v-102h-153v-154h-103v154h-153z" />
<glyph unicode="&#x2011;" d="M102 51v205q18 8 48 17.5t34 11.5q96 35 132 69.5t36 98.5q0 23 -23.5 49t-31.5 76q-2 12 -23.5 24t-25.5 62q0 16 5 26t9 15l6 2q-10 51 -14 90q-4 55 43 115.5t164 60.5q115 0 162 -60.5t43 -115.5l-15 -90q20 -8 21 -43q-4 -49 -25.5 -61.5t-23.5 -24.5 q-8 -49 -32 -76t-24 -49q0 -63 36 -98.5t132 -69.5q186 -70 187 -125v-109h-820zM717 461v102h153v154h103v-154h153v-102h-153v-154h-103v154h-153z" />
<glyph unicode="&#x2012;" d="M102 51v205q18 8 48 17.5t34 11.5q96 35 132 69.5t36 98.5q0 23 -23.5 49t-31.5 76q-2 12 -23.5 24t-25.5 62q0 16 5 26t9 15l6 2q-10 51 -14 90q-4 55 43 115.5t164 60.5q115 0 162 -60.5t43 -115.5l-15 -90q20 -8 21 -43q-4 -49 -25.5 -61.5t-23.5 -24.5 q-8 -49 -32 -76t-24 -49q0 -63 36 -98.5t132 -69.5q186 -70 187 -125v-109h-820zM717 461v102h153v154h103v-154h153v-102h-153v-154h-103v154h-153z" />
<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M102 51v922h820v-922h-820z" />
<glyph unicode="&#x2014;" horiz-adv-x="2048" d="M102 51v922h1844v-922h-1844z" />
<glyph unicode="&#x2018;" horiz-adv-x="1150" d="M104 506q-2 195 134.5 335t330.5 142q195 4 335 -133t142.5 -331.5t-134 -334t-330.5 -143.5q-195 -2 -334.5 134t-143.5 331zM410 508l16 -29q47 35 78 35q8 0 0 -35l-39 -153q-29 -109 35 -109q31 0 86 27.5t108 81.5l-18 24q-49 -37 -74 -37q-12 0 -4 39l43 162 q27 98 -20 98q-31 0 -92.5 -28.5t-118.5 -75.5zM532 750q-2 -29 15.5 -44.5t50.5 -15.5q39 0 62.5 22.5t23.5 53.5q0 59 -61 59q-43 0 -67 -23t-24 -52z" />
<glyph unicode="&#x2019;" horiz-adv-x="1165" d="M104 252q-2 98 84 197q37 35 236 234.5t272 270.5q82 82 181 56q45 -12 79.5 -47t47.5 -82q27 -98 -54 -179l-485 -485q-43 -45 -90 -47q-49 -6 -82 27q-31 25 -28 76t46 96l342 340q27 27 49 0q27 -25 0 -52l-340 -340q-45 -45 -20 -69q8 -8 25 -8q20 2 47 26l485 486 q51 53 35 110q-14 61 -78 78q-57 16 -108 -35l-508 -508q-66 -76 -64 -144.5t53 -119.5q49 -51 119 -53t146 63l505 508q25 25 51.5 0.5t0.5 -51.5l-508 -508q-84 -84 -189 -84q-102 0 -176 74q-72 72 -74 170z" />
<glyph unicode="&#x201c;" horiz-adv-x="798" d="M102 113v798q0 41 31 72t72 31h389q43 0 72.5 -31t29.5 -72v-798q0 -43 -29.5 -73t-72.5 -30h-389q-41 0 -72 30t-31 73zM184 205h430v676h-430v-676zM328 102.5q0 -20.5 21.5 -36t49.5 -15.5q31 0 51.5 14.5t20.5 37t-20.5 37t-51.5 14.5q-29 0 -50 -15.5t-21 -36z" />
<glyph unicode="&#x201d;" horiz-adv-x="798" d="M102 113v798q0 41 31 72t72 31h389q43 0 72.5 -31t29.5 -72v-798q0 -43 -29.5 -73t-72.5 -30h-389q-41 0 -72 30t-31 73zM184 205h430v676h-430v-676zM328 102.5q0 -20.5 21.5 -36t49.5 -15.5q31 0 51.5 14.5t20.5 37t-20.5 37t-51.5 14.5q-29 0 -50 -15.5t-21 -36z" />
<glyph unicode="&#x2026;" horiz-adv-x="3686" d="M2560 205v614q0 41 30 72t73 31h819q41 0 71.5 -31t30.5 -72v-614q0 -43 -30.5 -73t-71.5 -30h-819q-43 0 -73 30t-30 73zM2663 205h819v614h-819v-614zM2765 311v92h256v-92h-256zM2765 465v92h256v-92h-256zM2765 618v93h256v-93h-256zM3124 311q0 72 4 72q88 25 88 68 q0 16 -29 57t-29 90q0 113 93 113q51 0 71.5 -28t20.5 -85q0 -49 -28 -90t-28 -57q0 -18 21.5 -36t42.5 -26l22 -6l7 -72h-256zM1331 205v614q0 41 30 72t73 31h819q41 0 71.5 -31t30.5 -72v-614q0 -43 -30.5 -73t-71.5 -30h-819q-43 0 -73 30t-30 73zM1434 205h819v614 h-819v-614zM1536 311v92h256v-92h-256zM1536 465v92h256v-92h-256zM1536 618v93h256v-93h-256zM1895 311q0 72 4 72q88 25 88 68q0 16 -29 57t-29 90q0 113 93 113q51 0 71.5 -28t20.5 -85q0 -49 -28 -90t-28 -57q0 -18 21.5 -36t42.5 -26l22 -6l7 -72h-256zM102 205v614 q0 41 30 72t73 31h819q41 0 71.5 -31t30.5 -72v-614q0 -43 -30.5 -73t-71.5 -30h-819q-43 0 -73 30t-30 73zM205 205h819v614h-819v-614zM307 311v92h256v-92h-256zM307 465v92h256v-92h-256zM307 618v93h256v-93h-256zM666 311q0 72 4 72q88 25 88 68q0 16 -29 57t-29 90 q0 113 93 113q51 0 71.5 -28t20.5 -85q0 -49 -28 -90t-28 -57q0 -18 21.5 -36t42.5 -26l22 -6l7 -72h-256z" />
<glyph unicode="&#x202f;" horiz-adv-x="417" />
<glyph unicode="&#x2039;" horiz-adv-x="1208" d="M102 393v180q0 23 17.5 42.5t38.5 19.5h891q20 0 38.5 -19.5t18.5 -42.5v-180q0 -20 -18.5 -40.5t-38.5 -20.5h-101l45 -256h-778l45 256h-102q-20 0 -38 20.5t-18 40.5zM146.5 716q3.5 9 11.5 11q23 10 104.5 38t99.5 28h48v153h389v-153h45q18 0 100 -28t105 -38 q8 -2 11 -11t-3 -17.5t-19 -8.5h-870q-12 0 -18.5 8.5t-3 17.5zM317 178h574l-72 334h-430z" />
<glyph unicode="&#x203a;" horiz-adv-x="1024" d="M102 295q0 78 58 135l153 152q72 72 147 81t130 -47q16 -14 16 -34.5t-16 -36.5q-14 -16 -36 -16.5t-36 16.5q-49 49 -133 -35l-154 -152q-27 -27 -26 -63q0 -35 26 -66q27 -27 66 -26.5t65 26.5l41 43q37 33 72 -2q16 -14 16.5 -35.5t-16.5 -35.5l-41 -41 q-57 -55 -137 -55.5t-137 55.5q-58 57 -58 137zM436 401q-35 37 0 72q14 14 35 14t37 -14q49 -49 123 25l164 161q27 27 26 64q0 35 -26 65q-68 61 -121 9l-51 -52q-37 -33 -72 3q-14 14 -14 34.5t14 36.5l51 51q55 53 130 50.5t134 -60.5q55 -55 56 -137q0 -80 -56 -135 l-164 -162q-76 -76 -153 -76q-64 0 -113 51z" />
<glyph unicode="&#x205f;" horiz-adv-x="522" />
<glyph unicode="&#x2122;" horiz-adv-x="948" d="M102 500l193 331l123 -69q68 -39 94 -105l213 367l57 -35l-108 -188l63 -39q78 -45 100.5 -121t-18.5 -145q-55 -92 -157 -97q49 -90 -5 -182q-41 -72 -117.5 -90t-154.5 25l-66 38l-108 -190l-59 33l213 366q-68 -10 -138 29zM193 520l65 -39q53 -29 102.5 -15.5t78 63 t14 99.5t-65.5 81l-65 36zM350 244l66 -39q53 -31 102 -17.5t78 62.5t15.5 100t-64.5 80l-66 39q0 -2 -2 -6zM512 520l66 -37q53 -29 102 -15.5t77.5 63t15.5 99.5t-64 79l-66 39l-129 -222q0 -4 -2 -6z" />
<glyph unicode="&#xe000;" horiz-adv-x="895" d="M0 895h895v-895h-895v895z" />
<glyph unicode="&#xfb01;" horiz-adv-x="2150" d="M1331 307.5q0 20.5 14.5 35.5t37.5 15h614q20 0 35.5 -15t15.5 -35.5t-15.5 -36t-35.5 -15.5h-614q-23 0 -37.5 15.5t-14.5 36zM1331 512q0 20 14.5 35.5t37.5 15.5h614q20 0 35.5 -15.5t15.5 -35.5t-15.5 -35.5t-35.5 -15.5h-614q-23 0 -37.5 15.5t-14.5 35.5z M1331 716.5q0 20.5 14.5 36t37.5 15.5h614q20 0 35.5 -15.5t15.5 -36t-15.5 -35.5t-35.5 -15h-614q-23 0 -37.5 15t-14.5 35.5zM102 205v143h109q55 0 107.5 33t82 67.5t84.5 106.5q63 84 103.5 129t120 90t168.5 45h34v123l215 -184l-215 -185v103h-34q-55 0 -108.5 -33 t-83.5 -67.5t-85 -106.5q-49 -63 -76.5 -96t-79 -79t-108.5 -67.5t-125 -21.5h-109zM102 666v143h109q139 0 258 -109q-57 -72 -63 -82q-8 -12 -25 -32q-80 80 -170 80h-109zM608 313q47 59 74 95q0 2 6 9t8 11q90 -90 181 -90h34v102l215 -184l-215 -184v123h-34 q-146 -1 -269 118z" />
<glyph unicode="&#xfb02;" horiz-adv-x="2150" d="M1331 154v716q0 41 30 72t73 31h512q41 0 71.5 -31t30.5 -72v-716q0 -43 -30.5 -73t-71.5 -30h-512q-43 0 -73 30t-30 73zM1434 154h512v716h-512v-716zM1546 268v88h287v-88h-287zM1546 670v90h287v-90h-287zM1548 467v92h287v-92h-287zM102 205v143h109q55 0 107.5 33 t82 67.5t84.5 106.5q63 84 103.5 129t120 90t168.5 45h34v123l215 -184l-215 -185v103h-34q-55 0 -108.5 -33t-83.5 -67.5t-85 -106.5q-49 -63 -76.5 -96t-79 -79t-108.5 -67.5t-125 -21.5h-109zM102 666v143h109q139 0 258 -109q-57 -72 -63 -82q-8 -12 -25 -32 q-80 80 -170 80h-109zM608 313q47 59 74 95q0 2 6 9t8 11q90 -90 181 -90h34v102l215 -184l-215 -184v123h-34q-146 -1 -269 118z" />
<glyph unicode="&#xfb03;" horiz-adv-x="3379" d="M2560 307.5q0 20.5 14.5 35.5t37.5 15h614q20 0 35.5 -15t15.5 -35.5t-15.5 -36t-35.5 -15.5h-614q-23 0 -37.5 15.5t-14.5 36zM2560 512q0 20 14.5 35.5t37.5 15.5h614q20 0 35.5 -15.5t15.5 -35.5t-15.5 -35.5t-35.5 -15.5h-614q-23 0 -37.5 15.5t-14.5 35.5z M2560 716.5q0 20.5 14.5 36t37.5 15.5h614q20 0 35.5 -15.5t15.5 -36t-15.5 -35.5t-35.5 -15h-614q-23 0 -37.5 15t-14.5 35.5zM1331 205v143h109q55 0 107.5 33t82 67.5t84.5 106.5q63 84 103.5 129t120 90t168.5 45h34v123l215 -184l-215 -185v103h-34q-55 0 -108.5 -33 t-83.5 -67.5t-85 -106.5q-49 -63 -76.5 -96t-79 -79t-108.5 -67.5t-125 -21.5h-109zM1331 666v143h109q139 0 258 -109q-57 -72 -63 -82q-8 -12 -25 -32q-80 80 -170 80h-109zM1837 313q47 59 74 95q0 2 6 9t8 11q90 -90 181 -90h34v102l215 -184l-215 -184v123h-34 q-146 -1 -269 118zM102 205v143h109q55 0 107.5 33t82 67.5t84.5 106.5q63 84 103.5 129t120 90t168.5 45h34v123l215 -184l-215 -185v103h-34q-55 0 -108.5 -33t-83.5 -67.5t-85 -106.5q-49 -63 -76.5 -96t-79 -79t-108.5 -67.5t-125 -21.5h-109zM102 666v143h109 q139 0 258 -109q-57 -72 -63 -82q-8 -12 -25 -32q-80 80 -170 80h-109zM608 313q47 59 74 95q0 2 6 9t8 11q90 -90 181 -90h34v102l215 -184l-215 -184v123h-34q-146 -1 -269 118z" />
<glyph unicode="&#xfb04;" horiz-adv-x="3379" d="M2560 154v716q0 41 30 72t73 31h512q41 0 71.5 -31t30.5 -72v-716q0 -43 -30.5 -73t-71.5 -30h-512q-43 0 -73 30t-30 73zM2663 154h512v716h-512v-716zM2775 268v88h287v-88h-287zM2775 670v90h287v-90h-287zM2777 467v92h287v-92h-287zM1331 205v143h109q55 0 107.5 33 t82 67.5t84.5 106.5q63 84 103.5 129t120 90t168.5 45h34v123l215 -184l-215 -185v103h-34q-55 0 -108.5 -33t-83.5 -67.5t-85 -106.5q-49 -63 -76.5 -96t-79 -79t-108.5 -67.5t-125 -21.5h-109zM1331 666v143h109q139 0 258 -109q-57 -72 -63 -82q-8 -12 -25 -32 q-80 80 -170 80h-109zM1837 313q47 59 74 95q0 2 6 9t8 11q90 -90 181 -90h34v102l215 -184l-215 -184v123h-34q-146 -1 -269 118zM102 205v143h109q55 0 107.5 33t82 67.5t84.5 106.5q63 84 103.5 129t120 90t168.5 45h34v123l215 -184l-215 -185v103h-34q-55 0 -108.5 -33 t-83.5 -67.5t-85 -106.5q-49 -63 -76.5 -96t-79 -79t-108.5 -67.5t-125 -21.5h-109zM102 666v143h109q139 0 258 -109q-57 -72 -63 -82q-8 -12 -25 -32q-80 80 -170 80h-109zM608 313q47 59 74 95q0 2 6 9t8 11q90 -90 181 -90h34v102l215 -184l-215 -184v123h-34 q-146 -1 -269 118z" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -43,11 +43,15 @@ instance.web.Notification = instance.web.Widget.extend({
}
});
/**
* The very minimal function everything should call to create a dialog
* in OpenERP Web Client.
*/
instance.web.dialog = function(element) {
var result = element.dialog.apply(element, _.rest(_.toArray(arguments)));
result.dialog("widget").addClass("openerp");
return result;
}
};
instance.web.Dialog = instance.web.Widget.extend({
dialog_title: "",
@ -162,7 +166,7 @@ instance.web.CrashManager = instance.web.CallbackEnabled.extend({
}
},
on_managed_error: function(error) {
instance.web.dialog($('<div>' + QWeb.render('CrashManager.warning', {error: error}) + '</div>'), {
instance.web.dialog($('<div>' + QWeb.render('CrashManager.warning', {error: error}) + '</div>'), {
title: "OpenERP " + _.str.capitalize(error.type),
buttons: [
{text: _t("Ok"), click: function() { $(this).dialog("close"); }}
@ -181,7 +185,7 @@ instance.web.CrashManager = instance.web.CallbackEnabled.extend({
// Call the send method from server to send mail with details
new instance.web.DataSet(self, 'publisher_warranty.contract').call_and_eval('send', [error.data,explanation,remark,issuename]).then(function(result){
if (result === false) {
alert('There was a communication error.')
alert('There was a communication error.');
} else {
$this.dialog('close');
}
@ -269,12 +273,12 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
start: function() {
var self = this;
var fetch_db = this.rpc("/web/database/get_list", {}).pipe(
function(result) {
self.db_list = result.db_list;
function(result) {
self.db_list = result.db_list;
},
function (_, ev) {
function (_, ev) {
ev.preventDefault();
self.db_list = null;
self.db_list = null;
});
var fetch_langs = this.rpc("/web/session/get_lang_list", {}).then(function(result) {
self.lang_list = result.lang_list;
@ -284,11 +288,15 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
do_render: function() {
var self = this;
self.$element.html(QWeb.render("DatabaseManager", { widget : self }));
self.$element.find(".oe_database_manager_menu").tabs();
self.$element.find(".oe_database_manager_menu").tabs({
show: function(event, ui) {
$('*[autofocus]:first', ui.panel).focus();
}
});
self.$element.find("form[name=create_db_form]").validate({ submitHandler: self.do_create });
self.$element.find("form[name=drop_db_form]").validate({ submitHandler: self.do_drop });
self.$element.find("form[name=backup_db_form]").validate({ submitHandler: self.do_backup });
self.$element.find("form[name=restore_db_form]").validate({ submitHandler: self.do_restore });
self.$element.find("form[name=drop_db_form]").validate({ submitHandler: self.do_drop });
self.$element.find("form[name=backup_db_form]").validate({ submitHandler: self.do_backup });
self.$element.find("form[name=restore_db_form]").validate({ submitHandler: self.do_restore });
self.$element.find("form[name=change_pwd_form]").validate({
messages: {
old_pwd: "Please enter your previous password",
@ -300,7 +308,7 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
},
submitHandler: self.do_change_password
});
self.$element.find("#back_to_login").click(self.do_exit);
self.$element.find("#back_to_login").click(self.do_exit);
},
destroy: function () {
this.$element.find('#db-create, #db-drop, #db-backup, #db-restore, #db-change-password, #back-to-login').unbind('click').end().empty();
@ -409,12 +417,12 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
self.display_error({
title: 'Access Denied',
error: 'Incorrect super-administrator password'
})
});
} else {
self.display_error({
title: 'Restore Database',
error: 'Could not restore the database'
})
});
}
},
complete: function() {
@ -442,6 +450,8 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
instance.web.Login = instance.web.Widget.extend({
template: "Login",
remember_credentials: true,
_db_list: null,
init: function(parent) {
this._super(parent);
this.has_local_storage = typeof(localStorage) != 'undefined';
@ -451,7 +461,7 @@ instance.web.Login = instance.web.Widget.extend({
if (this.has_local_storage && this.remember_credentials) {
this.selected_db = localStorage.getItem('last_db_login_success');
this.selected_login = localStorage.getItem('last_login_login_success');
if (jQuery.deparam(jQuery.param.querystring()).debug != undefined) {
if (jQuery.deparam(jQuery.param.querystring()).debug !== undefined) {
this.selected_password = localStorage.getItem('last_password_login_success');
}
}
@ -470,23 +480,33 @@ instance.web.Login = instance.web.Widget.extend({
self.databasemanager.destroy();
self.$element.find('.oe_login_bottom').show();
self.$element.find('.oe_login_pane').show();
self.load_db_list();
})
self.load_db_list(true).then(self.proxy('_db_list_loaded'));
});
});
self.load_db_list();
return self.load_db_list().then(self.proxy('_db_list_loaded'));
},
load_db_list: function () {
var self = this;
self.rpc("/web/database/get_list", {}, function(result) {
self.set_db_list(result.db_list);
}, function(error, event) {
if (error.data.fault_code === 'AccessDenied') {
event.preventDefault();
}
});
load_db_list: function (force) {
var d = $.when(), self = this;
if (_.isNull(this._db_list) || force) {
d = self.rpc("/web/database/get_list", {}, function(result) {
self._db_list = _.clone(result.db_list);
}, function(error, event) {
if (error.data.fault_code === 'AccessDenied') {
event.preventDefault();
}
});
}
return d;
},
set_db_list: function (list) {
this.$element.find("[name=db]").replaceWith(instance.web.qweb.render('Login.dblist', { db_list: list, selected_db: this.selected_db}))
_db_list_loaded: function () {
var list = this._db_list,
dbdiv = this.$element.find('div.oe_login_dbpane');
this.$element.find("[name=db]").replaceWith(instance.web.qweb.render('Login.dblist', { db_list: list, selected_db: this.selected_db}));
if(list && list.length === 1) {
dbdiv.hide();
} else {
dbdiv.show();
}
},
on_submit: function(ev) {
if(ev) {
@ -513,19 +533,12 @@ instance.web.Login = instance.web.Widget.extend({
do_login: function (db, login, password) {
var self = this;
this.$element.removeClass('oe_login_invalid');
this.session.on_session_invalid.add({
callback: function () {
self.$element.addClass("oe_login_invalid");
},
unique: true
});
this.session.session_authenticate(db, login, password).then(function() {
self.$element.removeClass("oe_login_invalid");
return this.session.session_authenticate(db, login, password).pipe(function() {
if (self.has_local_storage) {
if(self.remember_credentials) {
localStorage.setItem('last_db_login_success', db);
localStorage.setItem('last_login_login_success', login);
if (jQuery.deparam(jQuery.param.querystring()).debug != undefined) {
if (jQuery.deparam(jQuery.param.querystring()).debug !== undefined) {
localStorage.setItem('last_password_login_success', password);
}
} else {
@ -534,6 +547,10 @@ instance.web.Login = instance.web.Widget.extend({
localStorage.setItem('last_password_login_success', '');
}
}
self.$(".oe_login_pane").fadeOut("slow");
self.trigger("login");
},function () {
self.$element.addClass("oe_login_invalid");
});
}
});
@ -544,34 +561,33 @@ instance.web.Menu = instance.web.Widget.extend({
this._super.apply(this, arguments);
this.has_been_loaded = $.Deferred();
this.maximum_visible_links = 'auto'; // # of menu to show. 0 = do not crop, 'auto' = algo
this.data = {data:{children:[]}};
},
start: function() {
this._super.apply(this, arguments);
this.$secondary_menus = this.getParent().$element.find('.oe_secondary_menus_container');
this.$secondary_menus.on('click', 'a[data-menu]', this.on_menu_click);
$('html').bind('click', this.do_hide_more);
return this.do_reload();
},
do_reload: function() {
var self = this;
return this.rpc("/web/menu/load", {}, this.on_loaded).then(function () {
if (self.current_menu) {
self.open_menu(self.current_menu);
}
});
return this.rpc("/web/menu/load", {}).then(this.on_loaded);
},
on_loaded: function(data) {
var self = this;
this.data = data;
this.renderElement();
this.limit_entries();
this.$element.on('click', 'a[data-menu]', this.on_menu_click);
this.$secondary_menus.html(QWeb.render("Menu.secondary", { widget : this }));
this.$element.on('click', 'a.oe_menu_more_link', function() {
self.$element.find('.oe_menu_more').toggle();
return false;
});
this.$secondary_menus.html(QWeb.render("Menu.secondary", { widget : this }));
this.$element.on('click', 'a[data-menu]', this.on_menu_click);
this.$secondary_menus.on('click', 'a[data-menu]', this.on_menu_click);
// Hide second level submenus
this.$secondary_menus.find('.oe_menu_toggler').siblings('.oe_secondary_submenu').hide();
if (self.current_menu) {
self.open_menu(self.current_menu);
}
this.has_been_loaded.resolve();
},
limit_entries: function() {
@ -585,6 +601,7 @@ instance.web.Menu = instance.web.Widget.extend({
$index.after($more);
$more.find('.oe_menu_more').append($index.next().nextAll());
}
this.do_hide_more();
},
auto_limit_entries: function() {
// TODO: auto detect overflow and bind window on resize
@ -603,6 +620,7 @@ instance.web.Menu = instance.web.Widget.extend({
open_menu: function (id) {
var $clicked_menu, $sub_menu, $main_menu;
$clicked_menu = this.$element.add(this.$secondary_menus).find('a[data-menu=' + id + ']');
this.trigger('open_menu', id, $clicked_menu);
if (this.$secondary_menus.has($clicked_menu).length) {
$sub_menu = $clicked_menu.parents('.oe_secondary_menu');
@ -620,6 +638,9 @@ instance.web.Menu = instance.web.Widget.extend({
this.$secondary_menus.find('.oe_secondary_menu').hide();
$sub_menu.show();
// Hide/Show the leftbar menu depending of the presence of sub-items
this.$secondary_menus.parent('.oe_leftbar').toggle(!!$sub_menu.children().length);
// Activate current menu item and show parents
this.$secondary_menus.find('.oe_active').removeClass('oe_active');
if ($main_menu !== $clicked_menu) {
@ -631,56 +652,61 @@ instance.web.Menu = instance.web.Widget.extend({
}
}
},
/**
* Call open_menu with the first menu_item matching an action_id
*
* @param {Number} id the action_id to match
*/
open_action: function (id) {
var menu_id, $menu = this.$element.add(this.$secondary_menus).find('a[data-action-id=' + id + ']');
if (menu_id = $menu.data('menu')) {
var $menu = this.$element.add(this.$secondary_menus).find('a[data-action-id=' + id + ']');
var menu_id = $menu.data('menu');
if (menu_id) {
this.open_menu(menu_id);
}
},
on_menu_click: function(ev, id) {
// TODO If first level menu doesnt have action trigger first leaf
this.do_hide_more();
id = id || 0;
var $clicked_menu, manual = false;
/**
* Process a click on a menu item
*
* @param {Number} id the menu_id
*/
menu_click: function(id) {
if (id) {
// We can manually activate a menu with it's id (for hash url mapping)
manual = true;
$clicked_menu = this.$element.find('a[data-menu=' + id + ']');
if (!$clicked_menu.length) {
$clicked_menu = this.$secondary_menus.find('a[data-menu=' + id + ']');
this.do_hide_more();
// find back the menuitem in dom to get the action
var $item = this.$element.find('a[data-menu=' + id + ']');
if (!$item.length) {
$item = this.$secondary_menus.find('a[data-menu=' + id + ']');
}
var action_id = $item.data('action-id');
// If first level menu doesnt have action trigger first leaf
if (!action_id) {
if(this.$element.has($item).length) {
$sub_menu = this.$secondary_menus.find('.oe_secondary_menu[data-menu-parent=' + id + ']');
$items = $sub_menu.find('a[data-action-id]').filter('[data-action-id!=""]');
if($items.length) {
action_id = $items.data('action-id');
id = $items.data('menu');
}
}
}
} else {
$clicked_menu = $(ev.currentTarget);
id = $clicked_menu.data('menu');
}
this.trigger('menuClicked', id, $clicked_menu);
if (id) {
this.open_menu(id);
this.current_menu = id;
this.session.active_id = id;
var action_id = $clicked_menu.data('action-id');
if (action_id) {
this.on_action(action_id);
this.trigger('menu_click', action_id, id, $item);
}
}
if (ev) {
ev.stopPropagation();
}
},
/**
* Jquery event handler for menu click
*
* @param {Event} ev the jquery event
*/
on_menu_click: function(ev) {
this.menu_click($(ev.currentTarget).data('menu'));
ev.stopPropagation();
return false;
},
do_show_secondary: function($sub_menu, $main_menu) {
var self = this;
this.$secondary_menus.show();
if (!arguments.length) {
return;
}
$sub_menu.show();
},
on_action: function(action) {
}
});
instance.web.UserMenu = instance.web.Widget.extend({
@ -701,7 +727,9 @@ instance.web.UserMenu = instance.web.Widget.extend({
});
this.$element.on('click', '.oe_dropdown_options li a[data-menu]', function() {
var f = self['on_menu_' + $(this).data('menu')];
f && f($(this));
if (f) {
f($(this));
}
self.$element.find('.oe_dropdown_options').hide();
return false;
});
@ -712,7 +740,7 @@ instance.web.UserMenu = instance.web.Widget.extend({
title: _t("Change Password"),
width : 'auto'
}).open();
this.dialog.$element.html(QWeb.render("Change_Pwd", self));
this.dialog.$element.html(QWeb.render("UserMenu.password", self));
this.dialog.$element.find("form[name=change_password_form]").validate({
submitHandler: function (form) {
self.rpc("/web/session/change_password",{
@ -746,64 +774,20 @@ instance.web.UserMenu = instance.web.Widget.extend({
return;
var func = new instance.web.Model("res.users").get_func("read");
return func(self.session.uid, ["name", "company_id"]).pipe(function(res) {
// TODO: Show company if multicompany is in use
var topbar_name = _.str.sprintf("%s (%s)", res.name, instance.connection.db, res.company_id[1]);
var topbar_name = res.name;
if(instance.connection.debug)
topbar_name = _.str.sprintf("%s (%s)", topbar_name, instance.connection.db);
if(res.company_id[0] > 1)
topbar_name = _.str.sprintf("%s (%s)", topbar_name, res.company_id[1]);
self.$element.find('.oe_topbar_name').text(topbar_name);
var avatar_src = _.str.sprintf('%s/web/binary/image?session_id=%s&model=res.users&field=avatar&id=%s', self.session.prefix, self.session.session_id, self.session.uid);
$avatar.attr('src', avatar_src);
return self.shortcut_load();
});
};
this.update_promise = this.update_promise.pipe(fct, fct);
},
on_action: function() {
},
shortcut_load :function(){
var self = this,
sc = self.session.shortcuts,
shortcuts_ds = new instance.web.DataSet(this, 'ir.ui.view_sc');
self.$element.find('.oe_dropdown_options a[data-menu=shortcut]').each(function() {
$(this).parent().remove();
});
// TODO: better way to communicate between sections.
// sc.bindings, because jquery does not bind/trigger on arrays...
if (!sc.binding) {
sc.binding = {};
$(sc.binding).bind({
'add': function (e, attrs) {
shortcuts_ds.create(attrs, function (out) {
var shortcut = QWeb.render('UserMenu.shortcut', {
shortcuts : [{
name : attrs.name,
id : out.result,
res_id : attrs.res_id
}]
});
$(shortcut).appendTo(self.$element.find('.oe_dropdown_options'));
attrs.id = out.result;
sc.push(attrs);
});
},
'remove-current': function () {
var menu_id = self.session.active_id;
var $shortcut = self.$element.find('.oe_dropdown_options li a[data-id=' + menu_id + ']');
var shortcut_id = $shortcut.data('shortcut-id');
$shortcut.remove();
shortcuts_ds.unlink([shortcut_id]);
var sc_new = _.reject(sc, function(shortcut){ return shortcut_id === shortcut.id});
sc.splice(0, sc.length);
sc.push.apply(sc, sc_new);
}
});
}
return this.rpc('/web/session/sc_list', {}, function(shortcuts) {
sc.splice(0, sc.length);
sc.push.apply(sc, shortcuts);
$(QWeb.render('UserMenu.shortcut', {'shortcuts': shortcuts}))
.appendTo(self.$element.find('.oe_dropdown_options'));
});
},
on_menu_logout: function() {
},
on_menu_settings: function() {
@ -830,8 +814,8 @@ instance.web.UserMenu = instance.web.Widget.extend({
title: _t("Preferences"),
width: '700px',
buttons: [
{text: _t("Cancel"), click: function(){ $(this).dialog('destroy'); }},
{text: _t("Change password"), click: function(){ self.change_password(); }},
{text: _t("Cancel"), click: function(){ $(this).dialog('destroy'); }},
{text: _t("Save"), click: function(){
var inner_viewmanager = action_manager.inner_viewmanager;
inner_viewmanager.views[inner_viewmanager.active_view].controller.do_save()
@ -850,7 +834,7 @@ instance.web.UserMenu = instance.web.Widget.extend({
on_menu_about: function() {
var self = this;
self.rpc("/web/webclient/version_info", {}).then(function(res) {
var $help = $(QWeb.render("About-Page", {version_info: res}));
var $help = $(QWeb.render("UserMenu.about", {version_info: res}));
$help.find('a.oe_activate_debug_mode').click(function (e) {
e.preventDefault();
window.location = $.param.querystring(
@ -860,16 +844,6 @@ instance.web.UserMenu = instance.web.Widget.extend({
modal: true, width: 960, title: _t("About")});
});
},
on_menu_shortcut: function($link) {
var self = this,
id = $link.data('id');
self.session.active_id = id;
self.rpc('/web/menu/action', {'menu_id': id}, function(ir_menu_data) {
if (ir_menu_data.action.length){
self.on_action(ir_menu_data.action[0][2]);
}
});
}
});
instance.web.WebClient = instance.web.Widget.extend({
@ -883,75 +857,68 @@ instance.web.WebClient = instance.web.Widget.extend({
start: function() {
var self = this;
this.$element.addClass("openerp openerp-web-client-container");
if (jQuery.param != undefined && jQuery.deparam(jQuery.param.querystring()).kitten != undefined) {
this.$element.addClass("kitten-mode-activated");
this.$element.delegate('img.oe-record-edit-link-img', 'hover', function(e) {
if (jQuery.param !== undefined && jQuery.deparam(jQuery.param.querystring()).kitten !== undefined) {
$("body").addClass("kitten-mode-activated");
self.$element.delegate('img.oe-record-edit-link-img', 'hover', function(e) {
self.$element.toggleClass('clark-gable');
});
}
this.session.session_bind().then(function() {
self.destroy_content();
self.show_common();
if (!self.session.session_is_valid()) {
self.show_login();
}
});
this.session.on_session_valid.add(function() {
self.show_application();
self.user_menu.do_update();
self.menu.do_reload();
if(self.action_manager)
self.action_manager.destroy();
self.action_manager = new instance.web.ActionManager(self);
self.action_manager.appendTo(self.$element.find('.oe_application'));
self.bind_hashchange();
var version_label = _t("OpenERP - Unsupported/Community Version");
if (!self.session.openerp_entreprise) {
self.$element.find('.oe_footer_powered').append(_.str.sprintf('<span> - <a href="http://www.openerp.com/support-or-publisher-warranty-contract" target="_blank">%s</a></span>', version_label));
document.title = version_label;
} else {
self.show_application();
}
});
this.$element.on('mouseenter', '.oe_systray > div:not([data-tipsy=true])', function() {
$(this).attr('data-tipsy', 'true').tipsy().trigger('mouseenter');
});
},
show_common: function() {
var self = this;
this.crashmanager = new instance.web.CrashManager();
instance.connection.on_rpc_error.add(this.crashmanager.on_rpc_error);
window.onerror = function (message, file, line) {
self.crashmanager.on_traceback({
type: _t("Client Error"),
message: message,
data: {debug: file + ':' + line}
});
};
self.notification = new instance.web.Notification(this);
self.notification.appendTo(self.$element);
self.loading = new instance.web.Loading(self);
self.loading.appendTo(self.$element);
self.login = new instance.web.Login(self);
self.login.on("login",self,self.show_application);
self.$table = $(QWeb.render("WebClient", {}));
self.action_manager = new instance.web.ActionManager(self);
self.action_manager.appendTo(self.$table.find('.oe_application'));
},
show_login: function() {
var self = this;
this.destroy_content();
this.show_common();
self.login = new instance.web.Login(self);
self.login.appendTo(self.$element);
},
show_application: function() {
var self = this;
this.destroy_content();
this.show_common();
self.$table = $(QWeb.render("WebClient", {}));
self.$element.append(self.$table);
self.login.$element.hide();
self.menu = new instance.web.Menu(self);
self.menu.replace(this.$element.find('.oe_menu_placeholder'));
self.menu.on_action.add(this.proxy('on_menu_action'));
self.menu.on('menu_click', this, this.on_menu_action);
self.user_menu = new instance.web.UserMenu(self);
self.user_menu.replace(this.$element.find('.oe_user_menu_placeholder'));
self.user_menu.on_menu_logout.add(this.proxy('on_logout'));
self.user_menu.on_action.add(this.proxy('on_menu_action'));
},
show_common: function() {
var self = this;
if (!this.crashmanager) {
this.crashmanager = new instance.web.CrashManager();
instance.connection.on_rpc_error.add(this.crashmanager.on_rpc_error);
window.onerror = function (message, file, line) {
self.crashmanager.on_traceback({
type: _t("Client Error"),
message: message,
data: {debug: file + ':' + line}
});
}
self.user_menu.do_update();
self.bind_hashchange();
var version_label = _t("OpenERP - Unsupported/Community Version");
if (!self.session.openerp_entreprise) {
self.$element.find('.oe_footer_powered').append(_.str.sprintf('<span> - <a href="http://www.openerp.com/support-or-publisher-warranty-contract" target="_blank">%s</a></span>', version_label));
document.title = version_label;
}
this.notification = new instance.web.Notification(this);
this.notification.appendTo(this.$element);
this.loading = new instance.web.Loading(this);
this.loading.appendTo(this.$element);
},
destroy_content: function() {
_.each(_.clone(this.getChildren()), function(el) {
@ -994,15 +961,25 @@ instance.web.WebClient = instance.web.Widget.extend({
} else {
self.menu.has_been_loaded.then(function() {
var first_menu_id = self.menu.$element.find("a:first").data("menu");
if(first_menu_id)
self.menu.on_menu_click(null,first_menu_id);
if(first_menu_id) {
self.menu.menu_click(first_menu_id);
}
});
}
},
on_hashchange: function(event) {
var self = this;
var state = event.getState(true);
if (!_.isEqual(this._current_state, state)) {
this.action_manager.do_load_state(state, !!this._current_state);
if(state.action_id === undefined && state.menu_id) {
self.menu.has_been_loaded.then(function() {
self.menu.do_reload().then(function() {
self.menu.menu_click(state.menu_id)
});
});
} else {
this.action_manager.do_load_state(state, !!this._current_state);
}
}
this._current_state = state;
},
@ -1016,10 +993,10 @@ instance.web.WebClient = instance.web.Widget.extend({
},
do_action: function(action) {
var self = this;
// TODO replace by client action menuclick
// TODO replace by client action menuclick
if(action.menu_id) {
this.do_reload().then(function () {
self.menu.on_menu_click(null, action.menu_id);
self.menu.menu_click(action.menu_id);
});
}
},
@ -1035,7 +1012,7 @@ instance.web.EmbeddedClient = instance.web.Widget.extend({
template: 'EmptyComponent',
init: function(parent, action_id, options) {
this._super(parent);
// TODO take the xmlid of a action instead of its id
// TODO take the xmlid of a action instead of its id
this.action_id = action_id;
this.options = options || {};
this.am = new instance.web.ActionManager(this);
@ -1076,7 +1053,7 @@ instance.web.embed = function (origin, dbname, login, key, action, options) {
});
});
}
};
};

View File

@ -331,6 +331,9 @@ instance.web.EventDispatcherMixin = _.extend({}, instance.web.ParentedMixin, {
},
on: function(events, dest, func) {
var self = this;
if (!(func instanceof Function)) {
throw new Error("Event handler must be a function.");
}
events = events.split(/\s+/);
_.each(events, function(eventName) {
self.__edispatcherEvents.on(eventName, func, dest);
@ -709,6 +712,12 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, {
this.$element = elem;
}
},
/**
* Shortcut for $element.find() like backbone
*/
"$": function() {
return this.$element.find.apply(this.$element,arguments);
},
/**
* Informs the action manager to do an action. This supposes that
* the action manager can be found amongst the ancestors of the current widget.
@ -1341,6 +1350,9 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({
},
on_rpc_error: function(error) {
},
get_url: function (file) {
return this.prefix + file;
},
});
}

View File

@ -69,7 +69,6 @@ instance.web.Session = instance.web.JsonRPC.extend( /** @lends instance.web.Sess
self.module_loaded[mod] = true;
});
this.context = {};
this.shortcuts = [];
this.active_id = null;
return this.session_init();
},
@ -122,6 +121,10 @@ instance.web.Session = instance.web.JsonRPC.extend( /** @lends instance.web.Sess
var base_location = document.location.protocol + '//' + document.location.host;
var params = { db: db, login: login, password: password, base_location: base_location };
return this.rpc("/web/session/authenticate", params).pipe(function(result) {
if (!result.uid) {
return $.Deferred().reject();
}
_.extend(self, {
session_id: result.session_id,
db: result.db,
@ -285,9 +288,6 @@ instance.web.Session = instance.web.JsonRPC.extend( /** @lends instance.web.Sess
}
}
},
get_url: function (file) {
return this.prefix + file;
},
/**
* Cooperative file download implementation, for ajaxy APIs.
*
@ -580,6 +580,33 @@ $.async_when = function() {
return old_async_when.apply(this, arguments);
};
/**
* Registry for all the client actions key: tag value: widget
*/
instance.web.client_actions = new instance.web.Registry();
/**
* Client action to reload the whole interface.
* If params has an entry 'menu_id', it opens the given menu entry.
*/
instance.web.client_actions.add("reload", "instance.web.Reload");
instance.web.Reload = instance.web.Widget.extend({
init: function(parent, params) {
this._super(parent);
this.menu_id = (params && params.menu_id) || false;
},
start: function() {
if (this.menu_id) {
// open the given menu id
var url_without_fragment = window.location.toString().split("#", 1)[0];
window.location = url_without_fragment + "#menu_id=" + this.menu_id;
} else {
window.location.reload();
}
}
});
};
// vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax:

View File

@ -1079,44 +1079,44 @@ instance.web.ProxyDataSet = instance.web.DataSetSearch.extend({
this.create_function = null;
this.write_function = null;
this.read_function = null;
this.default_get_function = null;
this.unlink_function = null;
},
read_ids: function () {
read_ids: function (ids, fields, options) {
if (this.read_function) {
return this.read_function.apply(null, arguments);
return this.read_function(ids, fields, options, this._super);
} else {
return this._super.apply(this, arguments);
}
},
default_get: function(fields, options) {
return this._super(fields, options).then(this.on_default_get);
if (this.default_get_function) {
return this.default_get_function(fields, options, this._super);
} else {
return this._super.apply(this, arguments);
}
},
on_default_get: function(result) {},
create: function(data, callback, error_callback) {
this.on_create(data);
if (this.create_function) {
return this.create_function(data, callback, error_callback);
return this.create_function(data, this._super).then(callback, error_callback);
} else {
console.warn("trying to create a record using default proxy dataset behavior");
return $.async_when({"result": undefined}).then(callback);
return this._super.apply(this, arguments);
}
},
on_create: function(data) {},
write: function (id, data, options, callback) {
this.on_write(id, data);
write: function (id, data, options, callback, error_callback) {
if (this.write_function) {
return this.write_function(id, data, options, callback);
return this.write_function(id, data, options, this._super).then(callback, error_callback);
} else {
console.warn("trying to write a record using default proxy dataset behavior");
return $.async_when({"result": true}).then(callback);
return this._super.apply(this, arguments);
}
},
on_write: function(id, data) {},
unlink: function(ids, callback, error_callback) {
this.on_unlink(ids);
console.warn("trying to unlink a record using default proxy dataset behavior");
return $.async_when({"result": true}).then(callback);
if (this.unlink_function) {
return this.unlink_function(ids, this._super).then(callback, error_callback);
} else {
return this._super.apply(this, arguments);
}
},
on_unlink: function(ids) {}
});
instance.web.CompoundContext = instance.web.Class.extend({

View File

@ -111,7 +111,7 @@ instance.web.format_value = function (value, descriptor, value_if_empty) {
return value_if_empty === undefined ? '' : value_if_empty;
}
var l10n = _t.database.parameters;
switch (descriptor.type || (descriptor.field && descriptor.field.type)) {
switch (descriptor.widget || descriptor.type || (descriptor.field && descriptor.field.type)) {
case 'id':
return value.toString();
case 'integer':
@ -171,7 +171,7 @@ instance.web.parse_value = function (value, descriptor, value_if_empty) {
case "":
return value_if_empty === undefined ? false : value_if_empty;
}
switch (descriptor.type || (descriptor.field && descriptor.field.type)) {
switch (descriptor.widget || descriptor.type || (descriptor.field && descriptor.field.type)) {
case 'integer':
var tmp;
do {

File diff suppressed because it is too large Load Diff

View File

@ -98,7 +98,7 @@ instance.web.ViewEditor = instance.web.OldWidget.extend({
var view_widget = [{'name': 'view_name', 'string':'View Name', 'type': 'char', 'required': true, 'value' : this.model + '.custom_' + Math.round(Math.random() * 1000)},
{'name': 'view_type', 'string': 'View Type', 'type': 'selection', 'required': true, 'value': 'Form', 'selection': [['',''],['tree', 'Tree'],['form', 'Form'],['graph', 'Graph'],['calendar', 'Calender']]},
{'name': 'proirity', 'string': 'Priority', 'type': 'float', 'required': true, 'value':'16'}];
this.create_view_dialog.$element.append('<table id="create_view" style="width:400px" class="oe_forms"></table>');
this.create_view_dialog.$element.append('<table id="create_view" style="width:400px" class="oe_form"></table>');
this.create_view_widget = [];
_.each(view_widget, function(widget) {
var type_widget = new (self.property.get_any([widget.type])) (self.create_view_dialog, widget);
@ -877,7 +877,7 @@ instance.web.ViewEditor = instance.web.OldWidget.extend({
'fonts' : {'name':'fonts', 'string': 'fonts', 'type': 'char'},
};
var arch_val = self.get_object_by_id(this.one_object.clicked_tr_id,this.one_object['main_object'], []);
this.edit_node_dialog.$element.append('<table id="rec_table" style="width:400px" class="oe_forms"></table>');
this.edit_node_dialog.$element.append('<table id="rec_table" style="width:400px" class="oe_form"></table>');
this.edit_widget = [];
self.ready = $.when(self.on_groups(properties)).then(function () {
_PROPERTIES_ATTRIBUTES['groups']['selection'] = self.groups;
@ -963,7 +963,7 @@ instance.web.ViewEditor = instance.web.OldWidget.extend({
{text: _t("Cancel"), click: function() { self.add_node_dialog.close(); }}
]
}).open();
this.add_node_dialog.$element.append('<table id="rec_table" style="width:420px" class="oe_forms"><tbody><tr></tbody></table>');
this.add_node_dialog.$element.append('<table id="rec_table" style="width:420px" class="oe_form"><tbody><tr></tbody></table>');
var table_selector = self.add_node_dialog.$element.find('table[id=rec_table] tbody');
_.each(render_list, function(node) {
type_widget = new (self.property.get_any([node.type])) (self.add_node_dialog, node);

View File

@ -106,7 +106,6 @@ instance.web.FormView = instance.web.View.extend(_.extend({}, instance.web.form.
this.rendering_engine.render_to($dest);
}
this.$sidebar = this.options.$sidebar || this.$element.find('.oe_form_sidebar');
this.$buttons = $(QWeb.render("FormView.buttons", {'widget':self}));
if (this.options.$buttons) {
@ -116,8 +115,6 @@ instance.web.FormView = instance.web.View.extend(_.extend({}, instance.web.form.
}
this.$buttons.on('click','.oe_form_button_create',this.on_button_create);
this.$buttons.on('click','.oe_form_button_edit',this.on_button_edit);
this.$buttons.on('click','.oe_form_button_duplicate',this.on_button_duplicate);
this.$buttons.on('click','.oe_form_button_delete',this.on_button_delete);
this.$buttons.on('click','.oe_form_button_save',this.on_button_save);
this.$buttons.on('click','.oe_form_button_cancel',this.on_button_cancel);
@ -132,19 +129,18 @@ instance.web.FormView = instance.web.View.extend(_.extend({}, instance.web.form.
self.on_pager_action(action);
});
this.$sidebar = this.options.$sidebar || this.$element.find('.oe_form_sidebar');
if (!this.sidebar && this.options.$sidebar) {
this.sidebar = new instance.web.Sidebar(this);
this.sidebar.appendTo(this.$sidebar);
if(this.fields_view.toolbar) {
this.sidebar.add_toolbar(this.fields_view.toolbar);
}
this.sidebar.add_items('other', [{
label: _t('Set Default'),
form: this,
callback: function (item) {
item.form.open_defaults_dialog();
}
}]);
this.sidebar.add_items('other', [
{ label: _t('Delete'), callback: self.on_button_delete },
{ label: _t('Duplicate'), callback: self.on_button_duplicate },
{ label: _t('Set Default'), callback: function (item) { self.open_defaults_dialog(); } },
]);
}
this.on("change:mode", this, this.switch_mode);
this.set({mode: this.options.initial_mode});
@ -527,12 +523,14 @@ instance.web.FormView = instance.web.View.extend(_.extend({}, instance.web.form.
if(this.get("mode") == "view") {
self.$buttons.find('.oe_form_buttons_edit').hide();
self.$buttons.find('.oe_form_buttons_view').show();
self.$sidebar.show();
_.each(this.fields,function(field){
field.set({"force_readonly": true});
});
} else {
self.$buttons.find('.oe_form_buttons_edit').show();
self.$buttons.find('.oe_form_buttons_view').hide();
self.$sidebar.hide();
_.each(this.fields,function(field){
field.set({"force_readonly": false});
});
@ -796,41 +794,36 @@ instance.web.FormView = instance.web.View.extend(_.extend({}, instance.web.form.
var self = this;
var fields = _.chain(this.fields)
.map(function (field, name) {
var value_ = field.get_value();
var value = field.get_value();
// ignore fields which are empty, invisible, readonly, o2m
// or m2m
if (!value_
if (!value
|| field.get('invisible')
|| field.get("readonly")
|| field.field.type === 'one2many'
|| field.field.type === 'many2many') {
return false;
}
var displayed;
switch(field.field.type) {
var displayed = value;
switch (field.field.type) {
case 'selection':
displayed = _(field.values).find(function (option) {
return option[0] === value_;
return option[0] === value;
})[1];
break;
case 'many2one':
displayed = value_;
break;
default:
displayed = value_;
}
return {
name: name,
string: field.node_atts.string,
value: value_,
string: field.node.attrs.string || field.field.string,
value: value,
displayed: displayed,
// convert undefined to false
change_default: !!field.field.change_default
}
})
.compact()
.sortBy(function (field) { return field.node_atts.string; })
.sortBy(function (field) { return field.string; })
.value();
var conditions = _.chain(fields)
.filter(function (field) { return field.change_default; })
@ -944,7 +937,7 @@ instance.web.form.FormRenderingEngine = instance.web.form.FormRenderingEngineInt
}
var obj = self.fields_registry.get_any([$elem.attr('widget'), self.fvg.fields[name].type]);
if (!obj) {
throw new Error("Widget type '"+ key + "' is not implemented");
throw new Error("Widget type '"+ $elem.attr('widget') + "' is not implemented");
}
var w = new (obj)(self.view, instance.web.xml_to_json($elem[0]));
var $label = self.labels[$elem.attr("name")];
@ -986,9 +979,6 @@ instance.web.form.FormRenderingEngine = instance.web.form.FormRenderingEngineInt
},
process: function($tag, layout) {
var self = this;
if ($tag.attr('layout') === 'auto') {
$tag.addClass('oe_form_autolayout');
}
layout = $tag.attr('layout') || layout || 'auto';
$tag.removeAttr('layout');
var tagname = $tag[0].nodeName.toLowerCase();
@ -1158,6 +1148,9 @@ instance.web.form.FormRenderingEngine = instance.web.form.FormRenderingEngineInt
if (width.substr(-1) === '%') {
total -= iwidth;
width = iwidth + '%';
} else {
// Absolute width
$td.css('min-width', width + 'px');
}
$td.attr('width', width);
$child.removeAttr('width');
@ -1715,6 +1708,7 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(_.extend({
});
},
renderElement: function() {
var self = this;
this._super();
if (this.field.translate) {
this.$element.addClass('oe_form_field_translatable');
@ -1722,8 +1716,14 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(_.extend({
this.field_manager.open_translate_dialog(this);
}, this));
}
this.$label = this.view.$element.find('label[for=' + this.id_for_label + ']');
if (instance.connection.debug) {
this.do_attach_tooltip(this, this.view.$element.find('label[for=' + this.id_for_label + ']')[0] || this.$element);
this.do_attach_tooltip(this, this.$label[0] || this.$element);
this.$label.off('dblclick').on('dblclick', function() {
console.log("Field '%s' of type '%s' in View: %o", self.name, (self.node.attrs.widget || self.field.type), self.view);
window.w = self;
console.log("window.w =", window.w);
});
}
if (!this.disable_utility_classes) {
this.off("change:required", this, this._set_required);
@ -2302,16 +2302,6 @@ instance.web.form.FieldSelection = instance.web.form.AbstractField.extend(_.exte
});
})();
instance.web.form.dialog = function(content, options) {
options = _.extend({
width: '90%',
height: 'auto',
min_width: '800px'
}, options || {});
var dialog = new instance.web.Dialog(null, options, content).open();
return dialog.$element;
};
/**
* A mixin containing some useful methods to handle completion inputs.
*/
@ -2742,27 +2732,24 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({
if (self.get("effective_readonly")) {
view.options.addable = null;
view.options.deletable = null;
view.options.isClarkGable = false;
}
} else if (view.view_type === "form") {
if (self.get("effective_readonly")) {
view.view_type = 'form';
}
view.options.not_interactible_on_create = true;
} else if (view.view_type === "kanban") {
if (self.get("effective_readonly")) {
view.options.action_buttons = false;
view.options.quick_creatable = false;
}
}
views.push(view);
});
this.views = views;
this.viewmanager = new instance.web.ViewManager(this, this.dataset, views, {
$sidebar: false,
});
this.viewmanager.template = 'One2Many.viewmanager';
this.viewmanager.registry = instance.web.views.extend({
list: 'instance.web.form.One2ManyListView',
form: 'instance.web.form.One2ManyFormView',
kanban: 'instance.web.form.One2ManyKanbanView',
});
this.viewmanager = new instance.web.form.One2ManyViewManager(this, this.dataset, views, {});
this.viewmanager.o2m = self;
var once = $.Deferred().then(function() {
self.init_form_last_update.resolve();
});
@ -2946,6 +2933,51 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({
},
});
instance.web.form.One2ManyViewManager = instance.web.ViewManager.extend({
template: 'One2Many.viewmanager',
init: function(parent, dataset, views, flags) {
this._super(parent, dataset, views, _.extend({}, flags, {$sidebar: false}));
this.registry = this.registry.extend({
list: 'instance.web.form.One2ManyListView',
form: 'instance.web.form.One2ManyFormView',
kanban: 'instance.web.form.One2ManyKanbanView',
});
},
switch_view: function(mode, unused) {
if (mode !== 'form') {
return this._super(mode, unused);
}
var self = this;
var id = self.o2m.dataset.index !== null ? self.o2m.dataset.ids[self.o2m.dataset.index] : null;
var pop = new instance.web.form.FormOpenPopup(self.o2m.view);
pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(), {
title: _t("Open: ") + self.name,
create_function: function(data) {
return self.o2m.dataset.create(data).then(function(r) {
self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r.result]));
self.o2m.dataset.on_change();
});
},
write_function: function(id, data, options) {
return self.o2m.dataset.write(id, data, {}).then(function() {
self.o2m.reload_current_view();
});
},
alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined,
parent_view: self.o2m.view,
child_name: self.o2m.name,
read_function: function() {
return self.o2m.dataset.read_ids.apply(self.o2m.dataset, arguments);
},
form_view_options: {'not_interactible_on_create':true},
readonly: self.o2m.get("effective_readonly")
});
pop.on_select_elements.add_last(function() {
self.o2m.reload_current_view();
});
},
});
instance.web.form.One2ManyDataSet = instance.web.BufferedDataSet.extend({
get_context: function() {
this.context = this.o2m.build_context([this.o2m.name]);
@ -2961,7 +2993,6 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
} else {
var self = this;
var pop = new instance.web.form.SelectCreatePopup(this);
pop.on_default_get.add(self.dataset.on_default_get);
pop.select_element(
self.o2m.field.relation,
{
@ -2994,7 +3025,11 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
var pop = new instance.web.form.FormOpenPopup(self.o2m.view);
pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(), {
title: _t("Open: ") + self.name,
auto_write: false,
write_function: function(id, data) {
return self.o2m.dataset.write(id, data, {}, function(r) {
self.o2m.reload_current_view();
});
},
alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined,
parent_view: self.o2m.view,
child_name: self.o2m.name,
@ -3004,11 +3039,6 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
form_view_options: {'not_interactible_on_create':true},
readonly: self.o2m.get("effective_readonly")
});
pop.on_write.add(function(id, data) {
self.o2m.dataset.write(id, data, {}, function(r) {
self.o2m.reload_current_view();
});
});
},
do_button_action: function (name, id, callback) {
var self = this;
@ -3039,28 +3069,6 @@ var lazy_build_o2m_kanban_view = function() {
if (! instance.web_kanban || instance.web.form.One2ManyKanbanView)
return;
instance.web.form.One2ManyKanbanView = instance.web_kanban.KanbanView.extend({
open_record: function(id) {
var self = this;
var pop = new instance.web.form.FormOpenPopup(self.o2m.view);
pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(), {
title: _t("Open: ") + self.name,
auto_write: false,
alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined,
parent_view: self.o2m.view,
child_name: self.o2m.name,
read_function: function() {
return self.o2m.dataset.read_ids.apply(self.o2m.dataset, arguments);
},
form_view_options: {'not_interactible_on_create':true},
readonly: self.o2m.get("effective_readonly"),
});
pop.on_write.add(function(id, data) {
self.o2m.dataset.write(id, data, {}, function(r) {
self.o2m.reload_current_view();
});
});
},
});
}
@ -3150,7 +3158,7 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(_.
});
}).bind('hideDropdown', function() {
self._drop_shown = false;
}).bind('hideDropdown', function() {
}).bind('showDropdown', function() {
self._drop_shown = true;
});
self.tags = self.$text.textext()[0].tags();
@ -3266,7 +3274,6 @@ instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({
'addable': self.get("effective_readonly") ? null : _t("Add"),
'deletable': self.get("effective_readonly") ? false : true,
'selectable': self.multi_selection,
'isClarkGable': self.get("effective_readonly") ? false : true
});
var embedded = (this.field.views || {}).tree;
if (embedded) {
@ -3340,61 +3347,369 @@ instance.web.form.Many2ManyListView = instance.web.ListView.extend(/** @lends in
}
});
instance.web.form.FieldMany2ManyKanban = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.CompletionFieldMixin, {
disable_utility_classes: true,
init: function(field_manager, node) {
this._super(field_manager, node);
instance.web.form.CompletionFieldMixin.init.call(this);
m2m_kanban_lazy_init();
this.is_loaded = $.Deferred();
this.initial_is_loaded = this.is_loaded;
this.is_setted = $.Deferred();
},
start: function() {
this._super.apply(this, arguments);
var self = this;
this.dataset = new instance.web.form.Many2ManyDataSet(this, this.field.relation);
this.dataset.m2m = this;
this.dataset.on_unlink.add_last(function(ids) {
self.dataset_changed();
});
this.is_setted.then(function() {
self.load_view();
});
this.is_loaded.then(function() {
self.on("change:effective_readonly", self, function() {
self.is_loaded = self.is_loaded.pipe(function() {
self.kanban_view.destroy();
return $.when(self.load_view()).then(function() {
self.reload_content();
});
});
});
})
},
set_value: function(value_) {
value_ = value_ || [];
if (value_.length >= 1 && value_[0] instanceof Array) {
value_ = value_[0][2];
}
this._super(value_);
this.dataset.set_ids(value_);
var self = this;
self.reload_content();
this.is_setted.resolve();
},
load_view: function() {
var self = this;
this.kanban_view = new instance.web.form.Many2ManyKanbanView(this, this.dataset, false, {
'create_text': _t("Add"),
'creatable': self.get("effective_readonly") ? false : true,
'quick_creatable': self.get("effective_readonly") ? false : true,
});
var embedded = (this.field.views || {}).kanban;
if (embedded) {
this.kanban_view.set_embedded_view(embedded);
}
this.kanban_view.m2m = this;
var loaded = $.Deferred();
this.kanban_view.on_loaded.add_last(function() {
self.initial_is_loaded.resolve();
loaded.resolve();
});
this.kanban_view.do_switch_view.add_last(_.bind(this.open_popup, this));
$.async_when().then(function () {
self.kanban_view.appendTo(self.$element);
});
return loaded;
},
reload_content: function() {
var self = this;
this.is_loaded = this.is_loaded.pipe(function() {
return self.kanban_view.do_search(self.build_domain(), self.dataset.get_context(), []);
});
},
dataset_changed: function() {
this.set({'value': [commands.replace_with(this.dataset.ids)]});
},
open_popup: function(type, unused) {
if (type !== "form")
return;
var self = this;
if (this.dataset.index === null) {
var pop = new instance.web.form.SelectCreatePopup(this);
pop.select_element(
this.field.relation,
{
title: _t("Add: ") + this.name
},
new instance.web.CompoundDomain(this.build_domain(), ["!", ["id", "in", this.dataset.ids]]),
this.build_context()
);
pop.on_select_elements.add(function(element_ids) {
_.each(element_ids, function(one_id) {
if(! _.detect(self.dataset.ids, function(x) {return x == one_id;})) {
self.dataset.set_ids([].concat(self.dataset.ids, [one_id]));
self.dataset_changed();
self.reload_content();
}
});
});
} else {
var id = self.dataset.ids[self.dataset.index];
var pop = new instance.web.form.FormOpenPopup(self.view);
pop.show_element(self.field.relation, id, self.build_context(), {
title: _t("Open: ") + self.name,
write_function: function(id, data, options) {
return self.dataset.write(id, data, {}).then(function() {
self.reload_content();
});
},
alternative_form_view: self.field.views ? self.field.views["form"] : undefined,
parent_view: self.view,
child_name: self.name,
readonly: self.get("effective_readonly")
});
}
},
add_id: function(id) {
this.quick_create.add_id(id);
},
}));
function m2m_kanban_lazy_init() {
if (instance.web.form.Many2ManyKanbanView)
return;
instance.web.form.Many2ManyKanbanView = instance.web_kanban.KanbanView.extend({
quick_create_class: 'instance.web.form.Many2ManyQuickCreate',
_is_quick_create_enabled: function() {
return this._super() && ! this.group_by;
},
});
instance.web.form.Many2ManyQuickCreate = instance.web.Widget.extend({
template: 'Many2ManyKanban.quick_create',
/**
* close_btn: If true, the widget will display a "Close" button able to trigger
* a "close" event.
*/
init: function(parent, dataset, context, buttons) {
this._super(parent);
this.m2m = this.getParent().view.m2m;
this.m2m.quick_create = this;
this._dataset = dataset;
this._buttons = buttons || false;
this._context = context || {};
},
start: function () {
var self = this;
self.$text = this.$element.find('input').css("width", "200px");
self.$text.textext({
plugins : 'arrow autocomplete',
autocomplete: {
render: function(suggestion) {
return $('<span class="text-label"/>').
data('index', suggestion['index']).html(suggestion['label']);
}
},
ext: {
autocomplete: {
selectFromDropdown: function() {
$(this).trigger('hideDropdown');
var index = Number(this.selectedSuggestionElement().children().children().data('index'));
var data = self.search_result[index];
if (data.id) {
self.add_id(data.id);
} else {
data.action();
}
},
},
itemManager: {
itemToString: function(item) {
return item.name;
},
},
},
}).bind('getSuggestions', function(e, data) {
var _this = this;
var str = !!data ? data.query || '' : '';
self.m2m.get_search_result(str).then(function(result) {
self.search_result = result;
$(_this).trigger('setSuggestions', {result : _.map(result, function(el, i) {
return _.extend(el, {index:i});
})});
});
});
self.$text.focusout(function() {
self.$text.val("");
});
},
focus: function() {
this.$text.focus();
},
add_id: function(id) {
var self = this;
self.$text.val("");
self.trigger('added', id);
},
});
}
/**
* @class
* @extends instance.web.OldWidget
* Class with everything which is common between FormOpenPopup and SelectCreatePopup.
*/
instance.web.form.SelectCreatePopup = instance.web.OldWidget.extend(/** @lends instance.web.form.SelectCreatePopup# */{
template: "SelectCreatePopup",
instance.web.form.AbstractFormPopup = instance.web.OldWidget.extend({
template: "AbstractFormPopup.render",
/**
* options:
* -readonly: only applicable when not in creation mode, default to false
* - alternative_form_view
* - write_function
* - read_function
* - create_function
* - parent_view
* - child_name
* - form_view_options
*/
init_popup: function(model, row_id, domain, context, options) {
this.row_id = row_id;
this.model = model;
this.domain = domain || [];
this.context = context || {};
this.options = options;
_.defaults(this.options, {
});
},
init_dataset: function() {
var self = this;
this.created_elements = [];
this.dataset = new instance.web.ProxyDataSet(this, this.model, this.context);
this.dataset.read_function = this.options.read_function;
this.dataset.create_function = function(data, sup) {
var fct = self.options.create_function || sup;
return fct.call(this, data).then(function(r) {
self.created_elements.push(r.result);
});
};
this.dataset.write_function = function(id, data, options, sup) {
var fct = self.options.write_function || sup;
return fct.call(this, id, data, options).then(self.on_write_completed);
};
this.dataset.parent_view = this.options.parent_view;
this.dataset.child_name = this.options.child_name;
},
display_popup: function() {
var self = this;
this.renderElement();
new instance.web.Dialog(this, {
width: '90%',
min_width: '800px',
close: function() {
self.check_exit();
},
title: this.options.title || "",
}, this.$element).open();
this.start();
},
on_write_completed: function() {},
setup_form_view: function() {
var self = this;
if (this.row_id) {
this.dataset.ids = [this.row_id];
this.dataset.index = 0;
} else {
this.dataset.index = null;
}
var options = _.clone(self.options.form_view_options) || {};
if (this.row_id !== null) {
options.initial_mode = this.options.readonly ? "view" : "edit";
}
this.view_form = new instance.web.FormView(this, this.dataset, false, options);
if (this.options.alternative_form_view) {
this.view_form.set_embedded_view(this.options.alternative_form_view);
}
this.view_form.appendTo(this.$element.find(".oe-form-view-popup-form-placeholder"));
this.view_form.on_loaded.add_last(function() {
var $buttons = self.view_form.$element.find(".oe_form_buttons");
var multi_select = self.row_id === null && ! self.options.disable_multiple_selection;
$buttons.html(QWeb.render("AbstractFormPopup.buttons", {multi_select: multi_select}));
var $snbutton = $buttons.find(".oe_abstractformpopup-form-save-new");
$snbutton.click(function() {
$.when(self.view_form.do_save()).then(function() {
self.view_form.reload_mutex.exec(function() {
self.view_form.on_button_new();
});
});
});
var $sbutton = $buttons.find(".oe_abstractformpopup-form-save");
$sbutton.click(function() {
$.when(self.view_form.do_save()).then(function() {
self.view_form.reload_mutex.exec(function() {
self.check_exit();
});
});
});
var $cbutton = $buttons.find(".oe_abstractformpopup-form-close");
$cbutton.click(function() {
self.check_exit();
});
if (self.row_id !== null && self.options.readonly) {
$snbutton.hide();
$sbutton.hide();
$cbutton.text(_t("Close"));
}
self.view_form.do_show();
});
},
on_select_elements: function(element_ids) {
},
check_exit: function() {
if (this.created_elements.length > 0) {
this.on_select_elements(this.created_elements);
}
this.destroy();
},
destroy: function () {
this.$element.dialog('close');
this._super();
},
});
/**
* Class to display a popup containing a form view.
*/
instance.web.form.FormOpenPopup = instance.web.form.AbstractFormPopup.extend({
show_element: function(model, row_id, context, options) {
this.init_popup(model, row_id, [], context, options);
_.defaults(this.options, {
});
this.display_popup();
},
start: function() {
this._super();
this.init_dataset();
this.setup_form_view();
},
});
/**
* Class to display a popup to display a list to search a row. It also allows
* to switch to a form view to create a new row.
*/
instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend({
/**
* options:
* - initial_ids
* - initial_view: form or search (default search)
* - disable_multiple_selection
* - alternative_form_view
* - create_function (defaults to a naive saving behavior)
* - parent_view
* - child_name
* - form_view_options
* - list_view_options
* - read_function
*/
select_element: function(model, options, domain, context) {
this.init_popup(model, null, domain, context, options);
var self = this;
this.model = model;
this.domain = domain || [];
this.context = context || {};
this.options = _.defaults(options || {}, {"initial_view": "search", "create_function": function() {
return self.create_row.apply(self, arguments);
}, read_function: null});
this.initial_ids = this.options.initial_ids;
this.created_elements = [];
this.renderElement();
instance.web.form.dialog(this.$element, {
close: function() {
self.check_exit();
},
title: options.title || ""
_.defaults(this.options, {
initial_view: "search",
});
this.start();
this.initial_ids = this.options.initial_ids;
this.display_popup();
},
start: function() {
this._super();
var self = this;
this.dataset = new instance.web.ProxyDataSet(this, this.model,
this.context);
this.dataset.create_function = function() {
return self.options.create_function.apply(null, arguments).then(function(r) {
self.created_elements.push(r.result);
});
};
this.dataset.write_function = function() {
return self.write_row.apply(self, arguments);
};
this.dataset.read_function = this.options.read_function;
this.dataset.parent_view = this.options.parent_view;
this.dataset.child_name = this.options.child_name;
this.dataset.on_default_get.add(this.on_default_get);
this.init_dataset();
if (this.options.initial_view == "search") {
self.rpc('/web/session/eval_domain_and_context', {
domains: [],
@ -3413,10 +3728,6 @@ instance.web.form.SelectCreatePopup = instance.web.OldWidget.extend(/** @lends i
this.new_object();
}
},
stop: function () {
this.$element.dialog('close');
this._super();
},
setup_search_view: function(search_defaults) {
var self = this;
if (this.searchview) {
@ -3474,22 +3785,6 @@ instance.web.form.SelectCreatePopup = instance.web.OldWidget.extend(/** @lends i
self.view_list.do_search(results.domain, results.context, results.group_by);
});
},
create_row: function() {
var self = this;
var wdataset = new instance.web.DataSetSearch(this, this.model, this.context, this.domain);
wdataset.parent_view = this.options.parent_view;
wdataset.child_name = this.options.child_name;
return wdataset.create.apply(wdataset, arguments);
},
write_row: function() {
var self = this;
var wdataset = new instance.web.DataSetSearch(this, this.model, this.context, this.domain);
wdataset.parent_view = this.options.parent_view;
wdataset.child_name = this.options.child_name;
return wdataset.write.apply(wdataset, arguments);
},
on_select_elements: function(element_ids) {
},
on_click_element: function(ids) {
this.selected_ids = ids || [];
if(this.selected_ids.length > 0) {
@ -3499,52 +3794,14 @@ instance.web.form.SelectCreatePopup = instance.web.OldWidget.extend(/** @lends i
}
},
new_object: function() {
var self = this;
if (this.searchview) {
this.searchview.hide();
}
if (this.view_list) {
this.view_list.$element.hide();
}
this.dataset.index = null;
this.view_form = new instance.web.FormView(this, this.dataset, false, self.options.form_view_options);
if (this.options.alternative_form_view) {
this.view_form.set_embedded_view(this.options.alternative_form_view);
}
this.view_form.appendTo(this.$element.find(".oe-select-create-popup-view-form"));
this.view_form.on_loaded.add_last(function() {
var $buttons = self.view_form.$element.find(".oe_form_buttons");
$buttons.html(QWeb.render("SelectCreatePopup.form.buttons", {widget:self}));
var $nbutton = $buttons.find(".oe_selectcreatepopup-form-save-new");
$nbutton.click(function() {
$.when(self.view_form.do_save()).then(function() {
self.view_form.reload_mutex.exec(function() {
self.view_form.on_button_new();
});
});
});
var $nbutton = $buttons.find(".oe_selectcreatepopup-form-save");
$nbutton.click(function() {
$.when(self.view_form.do_save()).then(function() {
self.view_form.reload_mutex.exec(function() {
self.check_exit();
});
});
});
var $cbutton = $buttons.find(".oe_selectcreatepopup-form-close");
$cbutton.click(function() {
self.check_exit();
});
});
this.view_form.do_show();
this.setup_form_view();
},
check_exit: function() {
if (this.created_elements.length > 0) {
this.on_select_elements(this.created_elements);
}
this.destroy();
},
on_default_get: function(res) {}
});
instance.web.form.SelectCreateListView = instance.web.ListView.extend({
@ -3561,101 +3818,6 @@ instance.web.form.SelectCreateListView = instance.web.ListView.extend({
}
});
/**
* @class
* @extends instance.web.OldWidget
*/
instance.web.form.FormOpenPopup = instance.web.OldWidget.extend(/** @lends instance.web.form.FormOpenPopup# */{
template: "FormOpenPopup",
/**
* options:
* - alternative_form_view
* - auto_write (default true)
* - read_function
* - parent_view
* - child_name
* - form_view_options
* - readonly
*/
show_element: function(model, row_id, context, options) {
this.model = model;
this.row_id = row_id;
this.context = context || {};
this.options = _.defaults(options || {}, {"auto_write": true});
this.renderElement();
instance.web.dialog(this.$element, {
title: options.title || '',
modal: true,
width: 960,
height: 600
});
this.start();
},
start: function() {
this._super();
this.dataset = new instance.web.form.FormOpenDataset(this, this.model, this.context);
this.dataset.fop = this;
this.dataset.ids = [this.row_id];
this.dataset.index = 0;
this.dataset.parent_view = this.options.parent_view;
this.dataset.child_name = this.options.child_name;
this.setup_form_view();
},
on_write: function(id, data) {
if (!this.options.auto_write)
return;
var self = this;
var wdataset = new instance.web.DataSetSearch(this, this.model, this.context, this.domain);
wdataset.parent_view = this.options.parent_view;
wdataset.child_name = this.options.child_name;
wdataset.write(id, data, {}, function(r) {
self.on_write_completed();
});
},
on_write_completed: function() {},
setup_form_view: function() {
var self = this;
var FormClass = instance.web.views.get_object('form');
var options = _.clone(self.options.form_view_options) || {};
options.initial_mode = this.options.readonly ? "view" : "edit";
this.view_form = new FormClass(this, this.dataset, false, options);
if (this.options.alternative_form_view) {
this.view_form.set_embedded_view(this.options.alternative_form_view);
}
this.view_form.appendTo(this.$element.find(".oe-form-open-popup-form-view"));
this.view_form.on_loaded.add_last(function() {
var $buttons = self.view_form.$element.find(".oe_form_buttons");
$buttons.html(QWeb.render("FormOpenPopup.form.buttons"));
var $nbutton = $buttons.find(".oe_formopenpopup-form-save");
$nbutton.click(function() {
self.view_form.do_save().then(function() {
self.destroy();
});
});
var $cbutton = $buttons.find(".oe_formopenpopup-form-close");
$cbutton.click(function() {
self.destroy();
});
if (self.options.readonly) {
$nbutton.hide();
$cbutton.text(_t("Close"));
}
self.view_form.do_show();
});
this.dataset.on_write.add(this.on_write);
}
});
instance.web.form.FormOpenDataset = instance.web.ProxyDataSet.extend({
read_ids: function() {
if (this.fop.options.read_function) {
return this.fop.options.read_function.apply(null, arguments);
} else {
return this._super.apply(this, arguments);
}
}
});
instance.web.form.FieldReference = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.ReinitializeFieldMixin, {
template: 'FieldReference',
init: function(field_manager, node) {
@ -3999,7 +4161,8 @@ instance.web.form.widgets = new instance.web.Registry({
'selection' : 'instance.web.form.FieldSelection',
'many2one' : 'instance.web.form.FieldMany2One',
'many2many' : 'instance.web.form.FieldMany2Many',
'many2manytags' : 'instance.web.form.FieldMany2ManyTags',
'many2many_tags' : 'instance.web.form.FieldMany2ManyTags',
'many2many_kanban' : 'instance.web.form.FieldMany2ManyKanban',
'one2many' : 'instance.web.form.FieldOne2Many',
'one2many_list' : 'instance.web.form.FieldOne2Many',
'reference' : 'instance.web.form.FieldReference',

View File

@ -10,7 +10,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
// records can be selected one by one
'selectable': true,
// list rows can be deleted
'deletable': true,
'deletable': false,
// whether the column headers should be displayed
'header': true,
// display addition button, with that label
@ -20,8 +20,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
'sortable': true,
// whether the view rows can be reordered (via vertical drag & drop)
'reorderable': true,
// display an edit icon linking to form view
'isClarkGable': true
'action_buttons': true,
},
/**
* Core class for list-type displays.
@ -70,8 +69,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
this.groups.datagroup = new instance.web.DataGroup(
this, this.model,
dataset.get_domain(),
dataset.get_context(),
{});
dataset.get_context());
this.groups.datagroup.sort = this.dataset._sort;
}
@ -256,16 +254,17 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
e.stopPropagation();
var $this = $(this);
self.dataset.sort($this.data('id'));
if ($this.find('span').length) {
$this.find('span').toggleClass( 'ui-icon-triangle-1-s ui-icon-triangle-1-n');
if($this.hasClass("sortdown") || $this.hasClass("sortup")) {
$this.toggleClass("sortdown").toggleClass("sortup");
} else {
$this.append('<span class="ui-icon ui-icon-triangle-1-n">') .siblings('.oe-sortable').find('span').remove();
$this.toggleClass("sortdown");
}
$this.siblings('.oe-sortable').removeClass("sortup sortdown");
self.reload_content();
});
// Add and delete
// Add button and Import link
if (!this.$buttons) {
this.$buttons = $(QWeb.render("ListView.buttons", {'widget':self}));
if (this.options.$buttons) {
@ -275,11 +274,11 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
}
this.$buttons.find('.oe_list_add')
.click(this.proxy('do_add_record'))
.prop('disabled', grouped && this.options.editable)
.end()
.find('.oe_list_delete')
.click(this.proxy('do_delete_selected'))
.prop('disabled', true);
.prop('disabled', grouped && this.options.editable);
this.$buttons.on('click', '.oe_list_button_import', function() {
self.on_sidebar_import();
return false;
});
}
// Pager
@ -339,6 +338,9 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
if (!this.sidebar && this.options.$sidebar) {
this.sidebar = new instance.web.Sidebar(this);
this.sidebar.appendTo(this.options.$sidebar);
this.sidebar.add_items('other', [
{ label: _t('Delete'), callback: this.do_delete_selected },
]);
this.sidebar.add_toolbar(this.fields_view.toolbar);
}
},
@ -356,11 +358,18 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
this.dataset._length = dataset._length;
}
var page = this.page + 1,
total = Math.floor(dataset.size() / this.limit()) + 1;
var total = dataset.size();
var spager = '-';
if (total) {
var range_start = this.page * this.limit() + 1;
var range_stop = range_start - 1 + this.limit();
if (range_stop > total) {
range_stop = total;
}
spager = _.str.sprintf('%d-%d of %d', range_start, range_stop, total);
}
this.$pager.find('.oe-pager-state').text(isNaN(total)
? '-' : _.str.sprintf('%d / %d', page, total));
this.$pager.find('.oe-pager-state').text(spager);
},
/**
* Sets up the listview's columns: merges view and fields data, move
@ -598,7 +607,6 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
* @param {Array} records selected record values
*/
do_select: function (ids, records) {
this.$buttons.find('.oe_list_delete').attr('disabled', !ids.length);
if (!ids.length) {
this.dataset.index = 0;
if (this.sidebar) {
@ -669,7 +677,12 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
* Handles deletion of all selected lines
*/
do_delete_selected: function () {
this.do_delete(this.groups.get_selection().ids);
var ids = this.groups.get_selection().ids;
if (ids.length) {
this.do_delete(this.groups.get_selection().ids);
} else {
this.do_warn(_t("Warning"), _t("You must select at least one record."));
}
},
/**
* Computes the aggregates for the current list view, either on the
@ -807,15 +820,18 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
}
},
no_result: function () {
this.$element.find('.oe_view_nocontent').remove();
if (this.groups.group_by
|| !this.options.action
|| !this.options.action.help) {
return;
}
this.$element.children('table').replaceWith(
$('<div class="oe_listview_nocontent">')
.append($('<img>', { src: '/web/static/src/img/list_empty_arrow.png' }))
.append($('<div>').html(this.options.action.help)));
this.$element.find('table:first').hide();
this.$element.prepend(
$('<div class="oe_view_nocontent">')
.append($('<img>', { src: '/web/static/src/img/view_empty_arrow.png' }))
.append($('<div>').html(this.options.action.help))
);
}
});
instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web.ListView.List# */{
@ -931,11 +947,7 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web.
if (!self.dataset.select_id(row_id)) {
throw "Could not find id in dataset"
}
var view;
if ($(e.target).is('.oe-record-edit-link-img')) {
view = 'form';
}
self.row_clicked(e, view);
self.row_clicked(e);
}
});
},
@ -1010,9 +1022,6 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web.
if (this.options.selectable) {
cells.push('<th class="oe-record-selector"></td>');
}
if (this.options.isClarkGable) {
cells.push('<th class="oe-record-edit-link"></td>');
}
_(this.columns).each(function(column) {
if (column.invisible === '1') {
return;
@ -1321,9 +1330,6 @@ instance.web.ListView.Groups = instance.web.Class.extend( /** @lends instance.we
if (self.options.selectable) {
$row.append('<td>');
}
if (self.options.isClarkGable) {
$row.append('<td>');
}
_(self.columns).chain()
.filter(function (column) {return !column.invisible;})
.each(function (column) {

View File

@ -70,6 +70,8 @@ openerp.web.list_editable = function (instance) {
*/
do_add_record: function () {
if (this.options.editable) {
this.$element.find('table:first').show();
this.$element.find('.oe_view_nocontent').remove();
this.groups.new_record();
} else {
this._super();
@ -202,7 +204,7 @@ openerp.web.list_editable = function (instance) {
var $new_row = $('<tr>', {
id: _.uniqueId('oe-editable-row-'),
'data-id': record_id,
'class': row ? $(row).attr('class') : '' + ' oe_forms',
'class': (row ? $(row).attr('class') : '') + ' oe_form',
click: function (e) {e.stopPropagation();}
})
.delegate('button.oe-edit-row-save', 'click', function () {
@ -398,8 +400,6 @@ openerp.web.list_editable = function (instance) {
if (this.view.editable_list.options.selectable)
$("<td>").appendTo($element);
if (this.view.editable_list.options.isClarkGable)
$("<td>").appendTo($element);
$xml.children().each(function(i, el) {
var modifiers = JSON.parse($(el).attr("modifiers") || "{}");

View File

@ -237,7 +237,7 @@ instance.web.ViewManager = instance.web.Widget.extend({
var self = this;
this.$element.find('.oe_view_manager_switch a').click(function() {
self.on_mode_switch($(this).data('view-type'));
});
}).tipsy();
var views_ids = {};
_.each(this.views_src, function(view) {
self.views[view.view_type] = $.extend({}, view, {
@ -295,7 +295,7 @@ instance.web.ViewManager = instance.web.Widget.extend({
if (view.embedded_view) {
controller.set_embedded_view(view.embedded_view);
}
controller.do_switch_view.add_last(this.on_mode_switch);
controller.do_switch_view.add_last(_.bind(this.switch_view, this));
controller.do_prev_view.add_last(this.on_prev_view);
var container = this.$element.find(".oe_view_manager_view_" + view_type);
view_promise = controller.appendTo(container);
@ -342,6 +342,14 @@ instance.web.ViewManager = instance.web.Widget.extend({
});
return view_promise;
},
/**
* Method used internally when a view asks to switch view. This method is meant
* to be extended by child classes to change the default behavior, which simply
* consist to switch to the asked view.
*/
switch_view: function(view_type, no_store) {
return this.on_mode_switch(view_type, no_store);
},
/**
* Returns to the view preceding the caller view in this manager's
* navigation history (the navigation history is appended to via
@ -607,6 +615,17 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({
case 'edit':
this.do_edit_resource($option.data('model'), $option.data('id'), { name : $option.text() });
break;
case 'manage_filters':
this.do_action({
res_model: 'ir.filters',
views: [[false, 'list'], [false, 'form']],
type: 'ir.actions.act_window',
context: {
search_default_my_filters: true,
search_default_model_id: this.dataset.model
}
});
break;
default:
if (val) {
console.log("No debug handler for ", val);
@ -636,8 +655,6 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({
var self = this;
return $.when(this._super(view_type, no_store)).then(function () {
self.shortcut_check(self.views[view_type]);
var controller = self.views[self.active_view].controller,
fvg = controller.fields_view,
view_id = (fvg && fvg.view_id) || '--';
@ -649,15 +666,6 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({
self.$element.find('.oe_view_title_text').text(fvg.arch.attrs.string || fvg.name);
}
var $title = self.$element.find('.oe_view_title_text'),
$search_prefix = $title.find('span.oe_searchable_view');
if (controller.searchable !== false && self.flags.search_view !== false) {
if (!$search_prefix.length) {
$title.prepend('<span class="oe_searchable_view">' + _t("Search: ") + '</span>');
}
} else {
$search_prefix.remove();
}
});
},
do_push_state: function(state) {
@ -681,44 +689,6 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({
self.views[self.active_view].controller.do_load_state(state, warm);
});
},
shortcut_check : function(view) {
var self = this;
var grandparent = this.getParent() && this.getParent().getParent();
// display shortcuts if on the first view for the action
var $shortcut_toggle = this.$element.find('.oe-shortcut-toggle');
if (!this.action.name ||
!(view.view_type === this.views_src[0].view_type
&& view.view_id === this.views_src[0].view_id)) {
$shortcut_toggle.hide();
return;
}
$shortcut_toggle.removeClass('oe-shortcut-remove').show();
if (_(this.session.shortcuts).detect(function (shortcut) {
return shortcut.res_id === self.session.active_id; })) {
$shortcut_toggle.addClass("oe-shortcut-remove");
}
this.shortcut_add_remove();
},
shortcut_add_remove: function() {
var self = this;
var $shortcut_toggle = this.$element.find('.oe-shortcut-toggle');
$shortcut_toggle
.unbind("click")
.click(function() {
if ($shortcut_toggle.hasClass("oe-shortcut-remove")) {
$(self.session.shortcuts.binding).trigger('remove-current');
$shortcut_toggle.removeClass("oe-shortcut-remove");
} else {
$(self.session.shortcuts.binding).trigger('add', {
'user_id': self.session.uid,
'res_id': self.session.active_id,
'resource': 'ir.ui.menu',
'name': self.action.name
});
$shortcut_toggle.addClass("oe-shortcut-remove");
}
});
},
display_title: function () {
return this.action.name;
}
@ -730,7 +700,7 @@ instance.web.Sidebar = instance.web.Widget.extend({
var view = this.getParent();
this.sections = [
{ 'name' : 'print', 'label' : _t('Print'), },
{ 'name' : 'files', 'label' : _t('Attachement'), },
{ 'name' : 'files', 'label' : _t('Attachment'), },
{ 'name' : 'other', 'label' : _t('More'), }
];
this.items = {
@ -777,25 +747,6 @@ instance.web.Sidebar = instance.web.Widget.extend({
self.$element.html(QWeb.render('Sidebar', {widget: self}));
this.$element.find('ul').hide();
},
add_section: function() {
var self = this;
},
add_toolbar: function(toolbar) {
var self = this;
_.each(['print','action','relate'], function(type) {
var items = toolbar[type];
if (items) {
for (var i = 0; i < items.length; i++) {
items[i] = {
label: items[i]['name'],
action: items[i],
classname: 'oe_sidebar_' + type
}
}
self.add_items(type=='print' ? 'print' : 'other', items);
}
});
},
/**
* For each item added to the section:
*
@ -828,6 +779,22 @@ instance.web.Sidebar = instance.web.Widget.extend({
this.redraw();
}
},
add_toolbar: function(toolbar) {
var self = this;
_.each(['print','action','relate'], function(type) {
var items = toolbar[type];
if (items) {
for (var i = 0; i < items.length; i++) {
items[i] = {
label: items[i]['name'],
action: items[i],
classname: 'oe_sidebar_' + type
}
}
self.add_items(type=='print' ? 'print' : 'other', items);
}
});
},
on_item_action_clicked: function(item) {
var self = this;
self.getParent().sidebar_context().then(function (context) {
@ -1313,11 +1280,6 @@ instance.web.str_to_xml = function(s) {
return xDoc;
}
/**
* Registry for all the client actions key: tag value: widget
*/
instance.web.client_actions = new instance.web.Registry();
/**
* Registry for all the main views
*/

View File

@ -125,7 +125,7 @@
<li><a href="#db_change_password">Password</a></li>
<li><a id="back_to_login" href="#">Back to Login</a></li>
</ul>
<form id="db_create" name="create_db_form" class="oe_forms" method="POST">
<form id="db_create" name="create_db_form" method="POST">
<table align="center" class="db_option_table">
<tr>
<th colspan="2" class="option_string"> CREATE DATABASE </th>
@ -136,7 +136,7 @@
</tr>
<tr>
<td><label for="db_name">New database name:</label></td>
<td><input type="text" name="db_name" class="required" matches="^[a-zA-Z][a-zA-Z0-9_]+$"/></td>
<td><input type="text" name="db_name" class="required" matches="^[a-zA-Z][a-zA-Z0-9_]+$" autofocus="true"/></td>
</tr>
<tr>
<td><label for="demo_data">Load Demonstration data:</label></td>
@ -165,7 +165,7 @@
</tr>
</table>
</form>
<form id="db_drop" name="drop_db_form" class="oe_forms" method="POST">
<form id="db_drop" name="drop_db_form" method="POST">
<table align="center" class="db_option_table">
<tr>
<th colspan="2" class="option_string"> DROP DATABASE </th>
@ -190,7 +190,7 @@
</tr>
</table>
</form>
<form id="db_backup" name="backup_db_form" class="oe_forms" method="POST" target="backup-target" action="/web/database/backup">
<form id="db_backup" name="backup_db_form" method="POST" target="backup-target" action="/web/database/backup">
<input type="hidden" name="token"/>
<table align="center" class="db_option_table">
<tr>
@ -216,7 +216,7 @@
</tr>
</table>
</form>
<form id="db_restore" name="restore_db_form" class="oe_forms" method="POST">
<form id="db_restore" name="restore_db_form" method="POST">
<table align="center" class="db_option_table">
<tr>
<th colspan="2" class="option_string"> RESTORE DATABASE </th>
@ -238,7 +238,7 @@
</tr>
</table>
</form>
<form id="db_change_password" name="change_pwd_form" class="oe_forms" method="POST">
<form id="db_change_password" name="change_pwd_form" method="POST">
<table align="center" class="db_option_table">
<tr>
<th colspan="2" class="option_string"> CHANGE MASTER PASSWORD </th>
@ -264,32 +264,6 @@
</div>
</t>
<t t-name="WebClient">
<table class="oe_webclient">
<tr>
<td colspan="2" class="oe_topbar">
<div class="oe_menu_placeholder"/>
<div class="oe_user_menu_placeholder"/>
<div class="oe_systray"/>
</td>
</tr>
<tr>
<td class="oe_leftbar" valign="top">
<t t-js="d">
d.url = '/' + (window.location.search || '');
</t>
<a t-att-href="url" class="oe_logo"><img t-att-src='_s + "/web/static/src/img/logo.png"'/></a>
<div class="oe_secondary_menus_container"/>
<div class="oe_footer">
Powered by <a href="http://www.openerp.com"><span>Open</span>ERP</a>
</div>
</td>
<td class="oe_application">
</td>
</tr>
</table>
</t>
<t t-name="Menu">
<ul class="oe_menu" t-if="widget.data">
<li t-foreach="widget.data.data.children" t-as="menu">
@ -333,7 +307,7 @@
t-att-data-action-model="menu.action ? menu.action.split(',')[0] : ''"
t-att-data-action-id="menu.action ? menu.action.split(',')[1] : ''">
<t t-esc="menu.name"/>
<t t-if="menu.needaction_enabled">
<t t-if="menu.needaction_enabled and menu.needaction_counter">
<div class="oe_menu_counter">
<t t-esc="menu.needaction_counter"/>
</div>
@ -349,26 +323,16 @@
<span class="oe_topbar_name"/>
</a>
<ul class="oe_dropdown_options">
<!--<li><a href="#" data-menu="profile">Profile</a></li>-->
<li><a href="#" data-menu="settings">Settings</a></li>
<li><a href="#" data-menu="logout">Log out</a></li>
<li><hr/></li>
<li><a href="#" data-menu="about">About OpenERP</a></li>
<li><hr/></li>
<li><a href="#" data-menu="settings">Preferences</a></li>
<li><a href="#" data-menu="logout">Log out</a></li>
</ul>
</li>
</ul>
</t>
<t t-name="UserMenu.shortcut">
<li t-foreach="shortcuts" t-as="shortcut">
<a href="#" data-menu="shortcut" t-att-data-id="shortcut.res_id" t-att-data-shortcut-id="shortcut.id">
<t t-esc="shortcut.name"/>
</a>
</li>
</t>
<t t-name="About-Page">
<t t-name="UserMenu.about">
<div>
<a class="oe_activate_debug_mode" href="?debug" style="float:right; font-size: 80%;">Activate the developper mode</a>
<a class="oe_activate_debug_mode" href="?debug" style="float:right; font-size: 80%;">Activate the developer mode</a>
<h1 style="margin:0;">OpenERP</h1>
<h3 style="margin:15px 0;padding:0;">Version <t t-esc="version_info.version"/></h3>
<p>
@ -383,8 +347,8 @@
</p>
</div>
</t>
<t t-name="Change_Pwd">
<form name="change_password_form" class="oe_forms" method="POST">
<t t-name="UserMenu.password">
<form name="change_password_form" method="POST">
<table align="center">
<tr>
<td><label for="old_pwd">Old Password:</label></td>
@ -408,27 +372,59 @@
</form>
</t>
<t t-name="WebClient">
<table class="oe_webclient">
<tr>
<td colspan="2" class="oe_topbar">
<div class="oe_menu_placeholder"/>
<div class="oe_user_menu_placeholder"/>
<div class="oe_systray"/>
</td>
</tr>
<tr>
<td class="oe_leftbar" valign="top">
<t t-js="d">
d.url = '/' + (window.location.search || '');
</t>
<a t-att-href="url" class="oe_logo"><img t-att-src='_s + "/web/static/src/img/logo.png"'/></a>
<div class="oe_secondary_menus_container"/>
<div class="oe_footer">
Powered by <a href="http://www.openerp.com"><span>Open</span>ERP</a>
</div>
</td>
<td class="oe_application">
</td>
</tr>
</table>
</t>
<t t-name="ViewManager">
<div class="oe_view_manager">
<table class="oe_view_manager_header2">
<table class="oe_view_manager_header">
<col width="33%"/>
<col width="33%"/>
<col width="34%"/>
<tr>
<tr class="oe_header_row">
<td colspan="2">
<h2 class="oe_view_title" t-if="widget.flags.display_title !== false">
<span class="oe_view_title_text"><t t-esc="widget.display_title()"/></span>
</h2>
<h2 class="oe_view_title" t-if="widget.flags.display_title !== false">
<span class="oe_view_title_text"><t t-esc="widget.display_title()"/></span>
</h2>
</td>
<td>
<div class="oe_view_manager_view_search" t-opentag="true"/>
</td>
<td> <div class="oe_view_manager_view_search" t-opentag="true"/> </td>
</tr>
<tr>
<td> <div class="oe_view_manager_buttons"/> </td>
<td> <div class="oe_view_manager_sidebar"/> </td>
<tr class="oe_header_row">
<td>
<div class="oe_view_manager_buttons"/>
</td>
<td>
<div class="oe_view_manager_sidebar"/>
</td>
<td>
<ul class="oe_view_manager_switch oe_button_group oe_right">
<t t-if="widget.views_src.length != 1" t-foreach="widget.views_src" t-as="view">
<li><a t-attf-class="oe_vm_switch_#{view.view_type} oe_i" t-att-data-view-type="view.view_type" t-att-title="view.label || view.view_type">
<t t-if="widget.views_src.length > 2" t-foreach="widget.views_src" t-as="view">
<li t-if="view.view_type != 'form'" class="oe_e"><a t-attf-class="oe_vm_switch_#{view.view_type}" t-att-data-view-type="view.view_type" t-att-title="view.label || view.view_type">
</a></li>
</t>
</ul>
@ -436,6 +432,8 @@
</td>
</tr>
</table>
<div class="oe_view_manager_body">
<t t-foreach="widget.views_src" t-as="view">
<div t-attf-class="oe_view_manager_view_#{view.view_type}"/>
@ -443,12 +441,9 @@
</div>
</div>
</t>
<t t-name="ViewManagerAction" t-extend="ViewManager">
<t t-jquery="h2.oe_view_title" t-operation="prepend">
<a t-if="widget.flags.display_title !== false" class="oe-shortcut-toggle" title="Add / Remove Shortcut..."
href="javascript: void(0)"> </a>
</t>
<t t-jquery="h2.oe_view_title" t-operation="after">
<t t-jquery="h2.oe_view_title" t-operation="before">
<select t-if="widget.session.debug" class="oe_debug_view"/>
</t>
</t>
@ -458,6 +453,7 @@
<option t-if="view_manager.active_view === 'form'" value="toggle_layout_outline">Toggle Form Layout Outline</option>
<option value="fields">View Fields</option>
<option value="fvg">Fields View Get</option>
<option value="manage_filters">Manage Filters</option>
<t t-if="view_manager.session.uid === 1">
<option value="manage_views">Manage Views</option>
<option value="edit" data-model="ir.ui.view" t-att-data-id="view.fields_view.view_id">Edit <t t-esc="_.str.capitalize(view.fields_view.type)"/>View</option>
@ -608,9 +604,9 @@
</tr>
<table t-name="ListView" class="oe-listview-content">
<t t-set="columns_count" t-value="visible_columns.length + (options.selectable ? 1 : 0) + (options.deletable ? 1 : 0) + (options.isClarkGable ? 1 : 0)"/>
<t t-set="columns_count" t-value="visible_columns.length + (options.selectable ? 1 : 0) + (options.deletable ? 1 : 0)"/>
<thead>
<tr t-if="options.action_buttons !== false or options.pager !== false">
<tr t-if="(!!options.action_buttons and !options.$buttons) or (!!options.pager and !options.$pager)">
<th t-att-colspan="columns_count">
<div class="oe_list_buttons"/>
<div class="oe_list_sidebar"/>
@ -626,7 +622,6 @@
<th t-if="options.selectable" width="1" >
<input type="checkbox" class="all-record-selector"/>
</th>
<th t-if="options.isClarkGable" width="1"></th>
<t t-foreach="columns" t-as="column">
<th t-if="!column.meta and column.invisible !== '1'" t-att-data-id="column.id"
t-att-class="((options.sortable and column.tag !== 'button') ? 'oe-sortable' : null)">
@ -639,7 +634,6 @@
<tfoot>
<tr>
<td t-if="options.selectable"/>
<td t-if="options.isClarkGable"/>
<td t-foreach="aggregate_columns" t-as="column" class="oe-list-footer oe-number"
t-att-data-field="column.id" t-att-title="column.label">
</td>
@ -649,12 +643,10 @@
</table>
<div t-name="ListView.buttons" class="oe_list_buttons">
<t t-if="!widget.no_leaf and widget.options.action_buttons !== false">
<button type="button" class="oe_button oe_list_add" t-if="widget.options.addable">
<button type="button" class="oe_button oe_list_add oe_form_button_hi" t-if="widget.options.addable">
<t t-esc="widget.options.addable"/>
</button>
<button type="button" class="oe_button oe_list_delete" t-if="widget.options.selectable and widget.options.deletable">
Delete
</button>
<span class="oe_fade">or</span> <a href="#" class="oe_bold oe_list_button_import">Import</a>
</t>
</div>
<t t-name="ListView.pager">
@ -684,9 +676,6 @@
<input t-if="options.radio" type="radio" name="radiogroup" t-att-checked="checked"/>
<input t-if="!options.radio" type="checkbox" name="radiogroup" t-att-checked="checked"/>
</th>
<th t-if="options.isClarkGable" class="oe-record-edit-link" width="1">
<img src="/web/static/src/img/pencil.gif" width="12" height="12" class="oe-record-edit-link-img"/>
</th>
<t t-foreach="columns" t-as="column">
<t t-set="align" t-value="column.type === 'integer' or column.type == 'float'"/>
<td t-if="!column.meta and column.invisible !== '1'" t-att-title="column.help"
@ -714,12 +703,9 @@
<span class="oe_form_buttons_view">
<button type="button" class="oe_button oe_form_button_edit">Edit</button>
<button type="button" class="oe_button oe_form_button_create">Create</button>
<button type="button" class="oe_button oe_form_button_duplicate">Duplicate</button>
<button type="button" class="oe_button oe_form_button_delete">Delete</button>
</span>
<span class="oe_form_buttons_edit">
<button type="button" class="oe_button oe_form_button_save">Save</button> or
<a href="#" class="oe_form_button_cancel">Discard</a>
<button type="button" class="oe_button oe_form_button_save">Save</button> <span class="oe_fade">or</span> <a href="#" class="oe_bold oe_form_button_cancel">Discard</a>
</span>
</t>
</div>
@ -730,7 +716,7 @@
</t>
</div>
</t>
<form t-name="FormView.set_default" class="oe_forms oe_frame">
<form t-name="FormView.set_default">
<t t-set="args" t-value="widget.dialog_options.args"/>
<table style="width: 100%">
<tr>
@ -839,7 +825,6 @@
t-att-title="help"
t-attf-class="#{classnames} oe_form_label#{help ? '_help' : ''} oe_align_#{align}">
<t t-esc="string"/>
<span t-if="help">?</span>
</label>
</t>
@ -991,11 +976,12 @@
</div>
</t>
<t t-name="web.datetimepicker">
<t t-set="placeholder" t-value="widget.getParent().node and widget.getParent().node.attrs.placeholder"/>
<div class="oe_datepicker_root oe_form_field_datetime">
<input type="text" class="oe_datepicker_container" disabled="disabled" style="display: none;"/>
<input type="text"
t-att-name="widget.name"
t-att-placeholder="widget.getParent().node.attrs.placeholder"
t-att-placeholder="placeholder"
t-attf-class="oe_datepicker_master field_#{widget.type_of_date} oe_form_field_#{widget.type_of_date}"
/><img class="oe_input_icon oe_datepicker_trigger" t-att-src='_s + "/web/static/src/img/ui/field_calendar.png"'
title="Select date" width="16" height="16" border="0"/>
@ -1034,8 +1020,8 @@
<img t-att-src='_s + "/web/static/src/img/down-arrow.png"' /></span>
</td>
<td width="16">
<button class="oe_button oe_field_button oe-m2o-cm-button">
<img t-att-src='_s + "/web/static/src/img/icons/gtk-go-forward.png"'/>
<button class="oe_button oe_field_button oe-m2o-cm-button" title="Open Resource">
<img t-att-src='_s + "/web/static/src/img/icons/terp-folder-yellow.png"'/>
</button>
</td>
</tr>
@ -1064,7 +1050,7 @@
</t>
</t>
<t t-name="FieldReference">
<table class="oe_form_field_reference oe_frame oe_forms" border="0" cellpadding="0" cellspacing="0">
<table class="oe_form_field_reference oe_form" border="0" cellpadding="0" cellspacing="0">
<tr>
<td t-attf-class="oe_form_frame_cell oe_form_selection oe_form_view_reference_selection">
</td>
@ -1311,7 +1297,31 @@
</t>
<div t-name="SearchView" class="oe_searchview">
<div class="oe_searchview_facets"/>
<div class="oe_searchview_clear"/>
<div class="oe_searchview_unfold_drawer"/>
<div class="oe_searchview_drawer"/>
</div>
<div t-name="SearchView.InputView"
class="oe_searchview_input"
contenteditable="true"/>
<!-- tabindex: makes div focusable -->
<div t-name="SearchView.FacetView"
class="oe_searchview_facet"
tabindex="0"
><span class="oe_facet_remove"></span
><span class="oe_facet_category oe_i" t-if="widget.model.has('icon')">
<t t-esc="widget.model.get('icon')"/>
</span
><span class="oe_facet_category" t-if="!widget.model.has('icon')">
<t t-esc="widget.model.get('category')"/>
</span ><span class="oe_facet_values"
/></div>
<span t-name="SearchView.FacetView.Value" class="oe_facet_value">
<t t-esc="widget.model.get('label')"/>
</span>
<t t-name="SearchView.managed-filters">
<option class="oe-filters-title" value="">Filters</option>
<optgroup label="-- Filters --">
@ -1338,7 +1348,7 @@
</div>
</t>
<t t-name="SearchView.add_to_dashboard">
<div class="oe_forms">
<div class="oe_form">
<p><b>Select Dashboard to add this filter to:</b></p>
<select style="width: 100%; margin-right: 1em;">
<option t-foreach="dashboards" t-as="menu" t-att-value="menu.id" t-att-selected="(menu.id == selected_menu_id) || undefined"><t t-esc="menu.name"/></option>
@ -1368,8 +1378,9 @@
<t t-esc="attrs.string"/>
</button>
<ul t-name="SearchView.filters">
<li t-foreach="widget.filters" t-as="filter">
<t t-esc="filter.attrs.string or filter.attrs.name or 'Ω'"/>
<li t-foreach="widget.filters" t-as="filter"
t-att-title="filter.attrs.string ? filter.attrs.help : undefined">
<t t-esc="filter.attrs.string or filter.attrs.help or filter.attrs.name or 'Ω'"/>
</li>
</ul>
<t t-name="SearchView.filters.facet">
@ -1464,8 +1475,22 @@
</t>
</t>
</t>
<div t-name="SearchView.Filters" class="oe_searchview_filters">
</div>
<div t-name="SearchView.CustomFilters" class="oe_searchview_custom">
<ul class="oe_searchview_custom_list"/>
<h4 class="oe_searchview_custom_title">
<label for="oe_searchview_custom_input">Save search</label></h4>
<form>
<input id="oe_searchview_custom_input"/>
<button>Save</button><br/>
<label for="oe_searchview_custom_public">Share with all users:</label>
<input id="oe_searchview_custom_public" type="checkbox"/>
</form>
</div>
<div t-name="SearchView.advanced" class="oe_searchview_advanced">
<h4>Advanced Search...</h4>
<h4>Advanced Search</h4>
<form>
<ul>
@ -1487,32 +1512,29 @@
</select>
<select class="searchview_extended_prop_op"/>
<span class="searchview_extended_prop_value"/>
<a class="searchview_extended_delete_prop"
href="javascript:void(0)"><span> </span></a>
<button type="button" class="searchview_extended_delete_prop">Delete</button>
</li>
</t>
<t t-name="SearchView.extended_search.proposition.char">
<input t-att-id="widget.element_id" class="field_char"/>
<input class="field_char"/>
</t>
<t t-name="SearchView.extended_search.proposition.empty">
<span t-att-id="widget.element_id"></span>
<span/>
</t>
<t t-name="SearchView.extended_search.proposition.integer">
<input type="number" t-att-id="widget.element_id" class="field_integer" step="1"/>
<input type="number" class="field_integer" step="1"/>
</t>
<t t-name="SearchView.extended_search.proposition.float">
<input type="number" t-att-id="widget.element_id" class="field_float" step="0.01"/>
</t>
<t t-name="SearchView.extended_search.proposition.boolean">
<input type="number" class="field_float" step="0.01"/>
</t>
<t t-name="SearchView.extended_search.proposition.selection">
<select t-att-id="widget.element_id">
<select>
<t t-foreach="widget.field.selection" t-as="element">
<option t-att-value="element[0]"><t t-esc="element[1]"/></option>
</t>
</select>
</t>
<t t-name="SelectCreatePopup">
<t t-name="AbstractFormPopup.render">
<div>
<table style="width:100%">
<tr style="width:100%">
@ -1526,31 +1548,22 @@
</td>
</tr>
</table>
<div class="oe-select-create-popup-view-form" style="width:100%"></div>
<div class="oe-form-view-popup-form-placeholder oe-select-create-popup-view-form" style="width:100%"></div>
</div>
</t>
<t t-name="SelectCreatePopup.search.buttons">
<button type="button" class="oe_button oe_selectcreatepopup-search-select" disabled="disabled">Select</button>
<button type="button" class="oe_button oe_selectcreatepopup-search-close">Cancel</button>
</t>
<t t-name="SelectCreatePopup.form.buttons">
<t t-if="widget.options.disable_multiple_selection">
<button type="button" class="oe_button oe_selectcreatepopup-form-save">Save</button>
<t t-name="AbstractFormPopup.buttons">
<t t-if="! multi_select">
<button type="button" class="oe_button oe_abstractformpopup-form-save">Save</button>
</t>
<t t-if="! widget.options.disable_multiple_selection">
<button type="button" class="oe_button oe_selectcreatepopup-form-save-new">Save &amp; New</button>
<button type="button" class="oe_button oe_selectcreatepopup-form-save">Save &amp; Close</button>
<t t-if="multi_select">
<button type="button" class="oe_button oe_abstractformpopup-form-save-new">Save &amp; New</button>
<button type="button" class="oe_button oe_abstractformpopup-form-save">Save &amp; Close</button>
</t>
<button type="button" class="oe_button oe_selectcreatepopup-form-close">Cancel</button>
</t>
<t t-name="FormOpenPopup">
<div>
<div class="oe-form-open-popup-form-view" style="width:100%"></div>
</div>
</t>
<t t-name="FormOpenPopup.form.buttons">
<button type="button" class="oe_button oe_formopenpopup-form-save">Save</button>
<button type="button" class="oe_button oe_formopenpopup-form-close">Cancel</button>
<button type="button" class="oe_button oe_abstractformpopup-form-close">Cancel</button>
</t>
<t t-extend="ListView.row">
<!-- adds back padding to row being rendered after edition, if necessary
@ -1803,5 +1816,8 @@
<pre><t t-esc="error.preview"/></pre>
</t>
</t>
<div t-name="Many2ManyKanban.quick_create" class="oe_kanban_quick_create">
<input t-att-placeholder="_t('Type name to search')"/>
</div>
</templates>

View File

@ -66,7 +66,7 @@ $(document).ready(function () {
ok(!fail2);
});
asyncTest('Resolve all correctly ordered, sync', 1, function () {
asyncTest('Resolve all correctly ordered, async', 1, function () {
var dm = new openerp.web.DropMisordered();
var d1 = $.Deferred(), d2 = $.Deferred(),
@ -80,7 +80,7 @@ $(document).ready(function () {
ok(true);
});
});
asyncTest("Don't resolve mis-ordered, sync", 4, function () {
asyncTest("Don't resolve mis-ordered, async", 4, function () {
var dm = new openerp.web.DropMisordered(),
done1 = false, done2 = false,
fail1 = false, fail2 = false;
@ -104,7 +104,7 @@ $(document).ready(function () {
ok(!fail2);
}, 400);
});
asyncTest('Fail mis-ordered flag, sync', 4, function () {
asyncTest('Fail mis-ordered flag, async', 4, function () {
var dm = new openerp.web.DropMisordered(true),
done1 = false, done2 = false,
fail1 = false, fail2 = false;

File diff suppressed because it is too large Load Diff

View File

@ -10,9 +10,10 @@
<script src="/web/static/lib/underscore/underscore.js" type="text/javascript"></script>
<script src="/web/static/lib/underscore/underscore.string.js" type="text/javascript"></script>
<script src="/web/static/lib/backbone/backbone.js" type="text/javascript"></script>
<!-- jquery -->
<script src="/web/static/lib/jquery/jquery-1.6.4.js"></script>
<script src="/web/static/lib/jquery/jquery-1.7.2b1.js"></script>
<script src="/web/static/lib/jquery.ui/js/jquery-ui-1.8.17.custom.min.js"></script>
<script src="/web/static/lib/jquery.ba-bbq/jquery.ba-bbq.js"></script>
@ -53,4 +54,5 @@
<script type="text/javascript" src="/web/static/test/formats.js"></script>
<script type="text/javascript" src="/web/static/test/rpc.js"></script>
<script type="text/javascript" src="/web/static/test/evals.js"></script>
<script type="text/javascript" src="/web/static/test/search.js"></script>
</html>

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -0,0 +1,41 @@
# Bulgarian translation for openerp-web
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openerp-web package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-06 17:33+0100\n"
"PO-Revision-Date: 2012-05-16 09:33+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Bulgarian <bg@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-17 04:49+0000\n"
"X-Generator: Launchpad (build 15259)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11
msgid "Calendar"
msgstr "Календар"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:466
#: addons/web_calendar/static/src/js/calendar.js:467
msgid "Responsible"
msgstr "Отговорник"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:504
#: addons/web_calendar/static/src/js/calendar.js:505
msgid "Navigator"
msgstr "Навигатор"
#. openerp-web
#: addons/web_calendar/static/src/xml/web_calendar.xml:5
#: addons/web_calendar/static/src/xml/web_calendar.xml:6
msgid "&nbsp;"
msgstr ""

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
"X-Poedit-Language: Czech\n"
#. openerp-web

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
"Language: es\n"
#. openerp-web

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-08 05:15+0000\n"
"X-Generator: Launchpad (build 15204)\n"
"X-Launchpad-Export-Date: 2012-05-15 05:06+0000\n"
"X-Generator: Launchpad (build 15238)\n"
#. openerp-web
#: addons/web_calendar/static/src/js/calendar.js:11

Some files were not shown because too many files have changed in this diff Show More