diff --git a/.isort.cfg b/.isort.cfg index 7683badfa..98b216f74 100644 --- a/.isort.cfg +++ b/.isort.cfg @@ -9,4 +9,4 @@ line_length=88 known_odoo=odoo known_odoo_addons=odoo.addons sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER -default_section=THIRDPARTY +known_third_party=setuptools diff --git a/setup/web_timeline/odoo/addons/web_timeline b/setup/web_timeline/odoo/addons/web_timeline new file mode 120000 index 000000000..580d87bcd --- /dev/null +++ b/setup/web_timeline/odoo/addons/web_timeline @@ -0,0 +1 @@ +../../../../web_timeline \ No newline at end of file diff --git a/setup/web_timeline/setup.py b/setup/web_timeline/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/web_timeline/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/web_notify/tests/test_res_users.py b/web_notify/tests/test_res_users.py index d04422457..ba11546ee 100644 --- a/web_notify/tests/test_res_users.py +++ b/web_notify/tests/test_res_users.py @@ -2,8 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). import json - -import mock +from unittest import mock from odoo import exceptions from odoo.tests import common diff --git a/web_timeline/README.rst b/web_timeline/README.rst new file mode 100644 index 000000000..4def0e165 --- /dev/null +++ b/web_timeline/README.rst @@ -0,0 +1,213 @@ +============ +Web timeline +============ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/13.0/web_timeline + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-13-0/web-13-0-web_timeline + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/162/13.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Define a new view displaying events in an interactive visualization chart. + +The widget is based on the external library +https://visjs.github.io/vis-timeline/examples/timeline + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +You need to define a view with the tag as base element. These are +the possible attributes for the tag: + ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Attribute | Required? | Description | ++====================+===========+===========================================================================================================================================================================================================================================================================+ +| date_start | **Yes** | Defines the name of the field of type date that contains the start of the event. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| date_stop | No | Defines the name of the field of type date that contains the end of the event. The date_stop can be equal to the attribute date_start to display events has 'point' on the Timeline (instantaneous event). | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| date_delay | No | Defines the name of the field of type float/integer that contain the duration in hours of the event, default = 1. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| default_group_by | **Yes** | Defines the name of the field that will be taken as default group by when accessing the view or when no other group by is selected. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| zoomKey | No | Specifies whether the Timeline is only zoomed when an additional key is down. Available values are '' (does not apply), 'altKey', 'ctrlKey', or 'metaKey'. Set this option if you want to be able to use the scroll to navigate vertically on views with a lot of events. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| mode | No | Specifies the initial visible window. Available values are: 'day' to display the current day, 'week', 'month' and 'fit'. Default value is 'fit' to adjust the visible window such that it fits all items. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| margin | No | Specifies the margins around the items. It should respect the JSON format. For example '{"item":{"horizontal":-10}}'. Available values are: '{"axis":}' (The minimal margin in pixels between items and the time axis) | +| | | '{"item":}' (The minimal margin in pixels between items in both horizontal and vertical direction), '{"item":{"horizontal":}}' (The minimal horizontal margin in pixels between items), | +| | | '{"item":{"vertical":}}' (The minimal vertical margin in pixels between items), '{"item":{"horizontal":,"vertical":}}' (Combination between horizontal and vertical margins in pixels between items). | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| event_open_popup | No | When set to true, it allows to edit the events in a popup. If not (default value), the record is edited changing to form view. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| stack | No | When set to false, items will not be stacked on top of each other such that they do overlap. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| colors | No | Allows to set certain specific colors if the expressed condition (JS syntax) is met. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| dependency_arrow | No | Set this attribute to a x2many field to draw arrows between the records referenced in the x2many field. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Optionally you can declare a custom template, which will be used to render the +timeline items. You have to name the template 'timeline-item'. +These are the variables available in template rendering: + +* ``record``: to access the fields values selected in the timeline definition. +* ``field_utils``: used to format and parse values (see available functions in ``web.field_utils``). + +You also need to declare the view in an action window of the involved model. + +Example: + +.. code-block:: xml + + + + + project.task + timeline + + + + +
+
+ Assigned to: + +
+ + + + + + + kanban,tree,form,calendar,gantt,timeline,graph + + + +Usage +===== + +For accessing the timeline view, you have to click on the button with the clock +icon in the view switcher. The first time you access to it, the timeline window +is zoomed to fit all the current elements, the same as when you perform a +search, filter or group by operation. + +You can use the mouse scroll to zoom in or out in the timeline, and click on +any free area and drag for panning the view in that direction. + +The records of your model will be shown as rectangles whose widths are the +duration of the event according our definition. You can select them clicking +on this rectangle. You can also use Ctrl or Shift keys for adding discrete +or range selections. Selected records are hightlighted with a different color +(but the difference will be more noticeable depending on the background color). +Once selected, you can drag and move the selected records across the timeline. + +When a record is selected, a red cross button appears on the upper left corner +that allows to remove that record. This doesn't work for multiple records +although they were selected. + +Records are grouped in different blocks depending on the group by criteria +selected (if none is specified, then the default group by is applied). +Dragging a record from one block to another change the corresponding field to +the value that represents the block. You can also click on the group name to +edit the involved record directly. + +Double-click on the record to edit it. Double-click in open area to create a +new record with the group and start date linked to the area you clicked in. +By holding the Ctrl key and dragging left to right, you can create a new record +with the dragged start and end date. + +Known issues / Roadmap +====================== + +* Implement a more efficient way of refreshing timeline after a record update; +* Make `attrs` attribute work; +* Make action attributes work (create, edit, delete) like in form and tree views. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* ACSONE SA/NV +* Tecnativa +* Monk Software +* Onestein +* Trobz + +Contributors +~~~~~~~~~~~~ + +* Laurent Mignon +* Adrien Peiffer +* Pedro M. Baeza +* Leonardo Donelli +* Adrien Didenot +* Dennis Sluijk +* Thong Nguyen Van +* Alexandre Díaz + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-tarteo| image:: https://github.com/tarteo.png?size=40px + :target: https://github.com/tarteo + :alt: tarteo + +Current `maintainer `__: + +|maintainer-tarteo| + +This module is part of the `OCA/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_timeline/__init__.py b/web_timeline/__init__.py new file mode 100644 index 000000000..61586ad14 --- /dev/null +++ b/web_timeline/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/web_timeline/__manifest__.py b/web_timeline/__manifest__.py new file mode 100644 index 000000000..1661a6ba6 --- /dev/null +++ b/web_timeline/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "Web timeline", + "summary": "Interactive visualization chart to show events in time", + "version": "13.0.1.0.0", + "development_status": "Production/Stable", + "author": "ACSONE SA/NV, " + "Tecnativa, " + "Monk Software, " + "Onestein, " + "Trobz, " + "Odoo Community Association (OCA)", + "category": "web", + "license": "AGPL-3", + "website": "https://github.com/OCA/web", + "depends": ["web"], + "qweb": ["static/src/xml/web_timeline.xml"], + "data": ["views/web_timeline.xml"], + "maintainers": ["tarteo"], + "application": False, + "installable": True, +} diff --git a/web_timeline/i18n/es.po b/web_timeline/i18n/es.po new file mode 100644 index 000000000..48d148790 --- /dev/null +++ b/web_timeline/i18n/es.po @@ -0,0 +1,159 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_timeline +# +# Translators: +# Pedro M. Baeza , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-03 03:50+0000\n" +"PO-Revision-Date: 2018-01-03 03:50+0000\n" +"Last-Translator: Pedro M. Baeza , 2017\n" +"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Activity" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_controller.js:243 +#, fuzzy, python-format +msgid "Are you sure you want to delete this record?" +msgstr "¿Está seguro que desea eliminar este registro?" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Calendar" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:8 +#, python-format +msgid "Day" +msgstr "Día" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Diagram" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Form" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Gantt" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Graph" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Kanban" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:10 +#, python-format +msgid "Month" +msgstr "Mes" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Pivot" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "QWeb" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Search" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_renderer.js:467 +#, python-format +msgid "Template \"timeline-item\" not present in timeline view definition." +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_view.js:32 +#: selection:ir.ui.view,type:0 +#, python-format +msgid "Timeline" +msgstr "Línea de tiempo" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_renderer.js:63 +#, python-format +msgid "Timeline view has not defined 'date_start' attribute." +msgstr "" +"La vista de línea de tiempo no tiene definido el atributo 'date_start'." + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:5 +#, python-format +msgid "Today" +msgstr "Hoy" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Tree" +msgstr "" + +#. module: web_timeline +#: model:ir.model,name:web_timeline.model_ir_ui_view +msgid "View" +msgstr "" + +#. module: web_timeline +#: model:ir.model.fields,field_description:web_timeline.field_ir_ui_view__type +msgid "View Type" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_controller.js:246 +#, python-format +msgid "Warning" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:9 +#, python-format +msgid "Week" +msgstr "Semana" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:11 +#, python-format +msgid "Year" +msgstr "Año" + +#~ msgid "ir.ui.view" +#~ msgstr "ir.ui.view" diff --git a/web_timeline/i18n/fr.po b/web_timeline/i18n/fr.po new file mode 100644 index 000000000..4a7134a32 --- /dev/null +++ b/web_timeline/i18n/fr.po @@ -0,0 +1,162 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_timeline +# +# Translators: +# leemannd , 2017 +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-03 03:50+0000\n" +"PO-Revision-Date: 2019-08-06 12:44+0000\n" +"Last-Translator: Nicolas JEUDY \n" +"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.7.1\n" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Activity" +msgstr "Activité" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_controller.js:243 +#, python-format +msgid "Are you sure you want to delete this record?" +msgstr "Êtes vous sûr de vouloir supprimer cet enregistrement ?" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Calendar" +msgstr "Calendrier" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:8 +#, python-format +msgid "Day" +msgstr "Jour" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Diagram" +msgstr "Diagramme" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Form" +msgstr "Formulaire" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Gantt" +msgstr "Gantt" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Graph" +msgstr "Graphique" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Kanban" +msgstr "Kanban" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:10 +#, python-format +msgid "Month" +msgstr "Mois" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Pivot" +msgstr "Pivot" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "QWeb" +msgstr "QWeb" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Search" +msgstr "Recherche" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_renderer.js:467 +#, python-format +msgid "Template \"timeline-item\" not present in timeline view definition." +msgstr "" +"Le modèle \"timeline-item\" n'est pas présent dans la définition de la vue " +"timeline." + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_view.js:32 +#: selection:ir.ui.view,type:0 +#, python-format +msgid "Timeline" +msgstr "Chronologie" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_renderer.js:63 +#, python-format +msgid "Timeline view has not defined 'date_start' attribute." +msgstr "La vue chronologique n'a pas défini l'attribut 'date_start'." + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:5 +#, python-format +msgid "Today" +msgstr "Aujourd'hui" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Tree" +msgstr "Arborescence" + +#. module: web_timeline +#: model:ir.model,name:web_timeline.model_ir_ui_view +msgid "View" +msgstr "Vue" + +#. module: web_timeline +#: model:ir.model.fields,field_description:web_timeline.field_ir_ui_view__type +msgid "View Type" +msgstr "Type de vue" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_controller.js:246 +#, python-format +msgid "Warning" +msgstr "Alerte" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:9 +#, python-format +msgid "Week" +msgstr "Semaine" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:11 +#, python-format +msgid "Year" +msgstr "Année" + +#~ msgid "ir.ui.view" +#~ msgstr "ir.ui.view" diff --git a/web_timeline/i18n/hr.po b/web_timeline/i18n/hr.po new file mode 100644 index 000000000..067515309 --- /dev/null +++ b/web_timeline/i18n/hr.po @@ -0,0 +1,161 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_timeline +# +# Translators: +# Bole , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-03 03:50+0000\n" +"PO-Revision-Date: 2019-11-14 10:34+0000\n" +"Last-Translator: Bole \n" +"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=" +"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 3.8\n" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Activity" +msgstr "Aktivnost" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_controller.js:243 +#, python-format +msgid "Are you sure you want to delete this record?" +msgstr "Jeste li sigurni da želite brisati ovaj zapis?" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Calendar" +msgstr "Kalendar" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:8 +#, python-format +msgid "Day" +msgstr "Dan" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Diagram" +msgstr "Diagram" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Form" +msgstr "Forma" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Gantt" +msgstr "Gant" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Graph" +msgstr "Graf" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Kanban" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:10 +#, python-format +msgid "Month" +msgstr "Mjesec" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Pivot" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "QWeb" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Search" +msgstr "Pretraga" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_renderer.js:467 +#, python-format +msgid "Template \"timeline-item\" not present in timeline view definition." +msgstr "" +"Predložak za \"stavku_vremenske_crte\" nije pronađen u definiciji pogleda." + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_view.js:32 +#: selection:ir.ui.view,type:0 +#, python-format +msgid "Timeline" +msgstr "Vremenska crta" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_renderer.js:63 +#, python-format +msgid "Timeline view has not defined 'date_start' attribute." +msgstr "Pogled vremenske crte nema definiran atribut 'date_start'." + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:5 +#, python-format +msgid "Today" +msgstr "Danas" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Tree" +msgstr "Lista" + +#. module: web_timeline +#: model:ir.model,name:web_timeline.model_ir_ui_view +msgid "View" +msgstr "Pogled" + +#. module: web_timeline +#: model:ir.model.fields,field_description:web_timeline.field_ir_ui_view__type +msgid "View Type" +msgstr "Vrsta pogleda" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_controller.js:246 +#, python-format +msgid "Warning" +msgstr "Upozorenje" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:9 +#, python-format +msgid "Week" +msgstr "Tjedan" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:11 +#, python-format +msgid "Year" +msgstr "Godina" + +#~ msgid "ir.ui.view" +#~ msgstr "ir.ui.view" diff --git a/web_timeline/i18n/nl_NL.po b/web_timeline/i18n/nl_NL.po new file mode 100644 index 000000000..f2d5af06d --- /dev/null +++ b/web_timeline/i18n/nl_NL.po @@ -0,0 +1,159 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_timeline +# +# Translators: +# Peter Hageman , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-03 03:50+0000\n" +"PO-Revision-Date: 2018-01-03 03:50+0000\n" +"Last-Translator: Peter Hageman , 2017\n" +"Language-Team: Dutch (Netherlands) (https://www.transifex.com/oca/" +"teams/23907/nl_NL/)\n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Activity" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_controller.js:243 +#, fuzzy, python-format +msgid "Are you sure you want to delete this record?" +msgstr "Weet je zeker dat je dit record wil verwijderen?" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Calendar" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:8 +#, python-format +msgid "Day" +msgstr "Dag" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Diagram" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Form" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Gantt" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Graph" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Kanban" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:10 +#, python-format +msgid "Month" +msgstr "Maand" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Pivot" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "QWeb" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Search" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_renderer.js:467 +#, python-format +msgid "Template \"timeline-item\" not present in timeline view definition." +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_view.js:32 +#: selection:ir.ui.view,type:0 +#, python-format +msgid "Timeline" +msgstr "Tijdlijn" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_renderer.js:63 +#, python-format +msgid "Timeline view has not defined 'date_start' attribute." +msgstr "Tijdlijn heeft geen 'date_start' eigenschap." + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:5 +#, python-format +msgid "Today" +msgstr "Vandaag" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Tree" +msgstr "" + +#. module: web_timeline +#: model:ir.model,name:web_timeline.model_ir_ui_view +msgid "View" +msgstr "" + +#. module: web_timeline +#: model:ir.model.fields,field_description:web_timeline.field_ir_ui_view__type +msgid "View Type" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_controller.js:246 +#, python-format +msgid "Warning" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:9 +#, python-format +msgid "Week" +msgstr "Week" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:11 +#, python-format +msgid "Year" +msgstr "Jaar" + +#~ msgid "ir.ui.view" +#~ msgstr "ir.ui.view" diff --git a/web_timeline/i18n/pt.po b/web_timeline/i18n/pt.po new file mode 100644 index 000000000..d3f8802b4 --- /dev/null +++ b/web_timeline/i18n/pt.po @@ -0,0 +1,155 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_timeline +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-08-12 11:44+0000\n" +"Last-Translator: Pedro Castro Silva \n" +"Language-Team: none\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.7.1\n" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Activity" +msgstr "Atividade" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_controller.js:243 +#, python-format +msgid "Are you sure you want to delete this record?" +msgstr "Está seguro de que quer eliminar este registo?" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Calendar" +msgstr "Calendário" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:8 +#, python-format +msgid "Day" +msgstr "Dia" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Diagram" +msgstr "Diagrama" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Form" +msgstr "Formulário" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Gantt" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Graph" +msgstr "Gráfico" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Kanban" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:10 +#, python-format +msgid "Month" +msgstr "Mês" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Pivot" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "QWeb" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Search" +msgstr "Pesquisar" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_renderer.js:467 +#, python-format +msgid "Template \"timeline-item\" not present in timeline view definition." +msgstr "" +"O modelo \"timeline-item\" não está presente na definição da vista da linha " +"temporal." + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_view.js:32 +#: selection:ir.ui.view,type:0 +#, python-format +msgid "Timeline" +msgstr "Linha Temporal" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_renderer.js:63 +#, python-format +msgid "Timeline view has not defined 'date_start' attribute." +msgstr "A vista da linha temporal não tem o atributo 'date_start' definido." + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:5 +#, python-format +msgid "Today" +msgstr "Hoje" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Tree" +msgstr "Árvore" + +#. module: web_timeline +#: model:ir.model,name:web_timeline.model_ir_ui_view +msgid "View" +msgstr "Vista" + +#. module: web_timeline +#: model:ir.model.fields,field_description:web_timeline.field_ir_ui_view__type +msgid "View Type" +msgstr "Tipo de Vista" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_controller.js:246 +#, python-format +msgid "Warning" +msgstr "Aviso" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:9 +#, python-format +msgid "Week" +msgstr "Semana" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:11 +#, python-format +msgid "Year" +msgstr "Ano" diff --git a/web_timeline/i18n/web_timeline.pot b/web_timeline/i18n/web_timeline.pot new file mode 100644 index 000000000..f750ffa1a --- /dev/null +++ b/web_timeline/i18n/web_timeline.pot @@ -0,0 +1,151 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_timeline +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Activity" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_controller.js:243 +#, python-format +msgid "Are you sure you want to delete this record?" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Calendar" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:8 +#, python-format +msgid "Day" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Diagram" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Form" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Gantt" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Graph" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Kanban" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:10 +#, python-format +msgid "Month" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Pivot" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "QWeb" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Search" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_renderer.js:467 +#, python-format +msgid "Template \"timeline-item\" not present in timeline view definition." +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_view.js:32 +#: selection:ir.ui.view,type:0 +#, python-format +msgid "Timeline" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_renderer.js:63 +#, python-format +msgid "Timeline view has not defined 'date_start' attribute." +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:5 +#, python-format +msgid "Today" +msgstr "" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Tree" +msgstr "" + +#. module: web_timeline +#: model:ir.model,name:web_timeline.model_ir_ui_view +msgid "View" +msgstr "" + +#. module: web_timeline +#: model:ir.model.fields,field_description:web_timeline.field_ir_ui_view__type +msgid "View Type" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_controller.js:246 +#, python-format +msgid "Warning" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:9 +#, python-format +msgid "Week" +msgstr "" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:11 +#, python-format +msgid "Year" +msgstr "" + diff --git a/web_timeline/i18n/zh_CN.po b/web_timeline/i18n/zh_CN.po new file mode 100644 index 000000000..22b463706 --- /dev/null +++ b/web_timeline/i18n/zh_CN.po @@ -0,0 +1,153 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_timeline +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-09-01 12:52+0000\n" +"Last-Translator: 黎伟杰 <674416404@qq.com>\n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 3.8\n" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Activity" +msgstr "活动" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_controller.js:243 +#, python-format +msgid "Are you sure you want to delete this record?" +msgstr "您确定要删除此记录吗?" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Calendar" +msgstr "日历" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:8 +#, python-format +msgid "Day" +msgstr "天" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Diagram" +msgstr "图表" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Form" +msgstr "表单" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Gantt" +msgstr "甘特图" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Graph" +msgstr "图形" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Kanban" +msgstr "看板" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:10 +#, python-format +msgid "Month" +msgstr "月" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Pivot" +msgstr "透视表" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "QWeb" +msgstr "QWeb" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Search" +msgstr "搜索" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_renderer.js:467 +#, python-format +msgid "Template \"timeline-item\" not present in timeline view definition." +msgstr "时间线视图定义中不存在模板“timeline-item”。" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_view.js:32 +#: selection:ir.ui.view,type:0 +#, python-format +msgid "Timeline" +msgstr "时间线" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_renderer.js:63 +#, python-format +msgid "Timeline view has not defined 'date_start' attribute." +msgstr "时间线视图尚未定义\"date_start\"属性。" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:5 +#, python-format +msgid "Today" +msgstr "今天" + +#. module: web_timeline +#: selection:ir.ui.view,type:0 +msgid "Tree" +msgstr "树形" + +#. module: web_timeline +#: model:ir.model,name:web_timeline.model_ir_ui_view +msgid "View" +msgstr "视图" + +#. module: web_timeline +#: model:ir.model.fields,field_description:web_timeline.field_ir_ui_view__type +msgid "View Type" +msgstr "查看类型" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/js/timeline_controller.js:246 +#, python-format +msgid "Warning" +msgstr "警告" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:9 +#, python-format +msgid "Week" +msgstr "周" + +#. module: web_timeline +#. openerp-web +#: code:addons/web_timeline/static/src/xml/web_timeline.xml:11 +#, python-format +msgid "Year" +msgstr "年" diff --git a/web_timeline/models/__init__.py b/web_timeline/models/__init__.py new file mode 100644 index 000000000..75544cd0a --- /dev/null +++ b/web_timeline/models/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import ir_ui_view diff --git a/web_timeline/models/ir_ui_view.py b/web_timeline/models/ir_ui_view.py new file mode 100644 index 000000000..43432bbb0 --- /dev/null +++ b/web_timeline/models/ir_ui_view.py @@ -0,0 +1,12 @@ +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + +TIMELINE_VIEW = ("timeline", "Timeline") + + +class IrUIView(models.Model): + _inherit = "ir.ui.view" + + type = fields.Selection(selection_add=[TIMELINE_VIEW]) diff --git a/web_timeline/readme/CONFIGURE.rst b/web_timeline/readme/CONFIGURE.rst new file mode 100644 index 000000000..4ae188970 --- /dev/null +++ b/web_timeline/readme/CONFIGURE.rst @@ -0,0 +1,74 @@ +You need to define a view with the tag as base element. These are +the possible attributes for the tag: + ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Attribute | Required? | Description | ++====================+===========+===========================================================================================================================================================================================================================================================================+ +| date_start | **Yes** | Defines the name of the field of type date that contains the start of the event. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| date_stop | No | Defines the name of the field of type date that contains the end of the event. The date_stop can be equal to the attribute date_start to display events has 'point' on the Timeline (instantaneous event). | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| date_delay | No | Defines the name of the field of type float/integer that contain the duration in hours of the event, default = 1. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| default_group_by | **Yes** | Defines the name of the field that will be taken as default group by when accessing the view or when no other group by is selected. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| zoomKey | No | Specifies whether the Timeline is only zoomed when an additional key is down. Available values are '' (does not apply), 'altKey', 'ctrlKey', or 'metaKey'. Set this option if you want to be able to use the scroll to navigate vertically on views with a lot of events. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| mode | No | Specifies the initial visible window. Available values are: 'day' to display the current day, 'week', 'month' and 'fit'. Default value is 'fit' to adjust the visible window such that it fits all items. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| margin | No | Specifies the margins around the items. It should respect the JSON format. For example '{"item":{"horizontal":-10}}'. Available values are: '{"axis":}' (The minimal margin in pixels between items and the time axis) | +| | | '{"item":}' (The minimal margin in pixels between items in both horizontal and vertical direction), '{"item":{"horizontal":}}' (The minimal horizontal margin in pixels between items), | +| | | '{"item":{"vertical":}}' (The minimal vertical margin in pixels between items), '{"item":{"horizontal":,"vertical":}}' (Combination between horizontal and vertical margins in pixels between items). | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| event_open_popup | No | When set to true, it allows to edit the events in a popup. If not (default value), the record is edited changing to form view. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| stack | No | When set to false, items will not be stacked on top of each other such that they do overlap. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| colors | No | Allows to set certain specific colors if the expressed condition (JS syntax) is met. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| dependency_arrow | No | Set this attribute to a x2many field to draw arrows between the records referenced in the x2many field. | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Optionally you can declare a custom template, which will be used to render the +timeline items. You have to name the template 'timeline-item'. +These are the variables available in template rendering: + +* ``record``: to access the fields values selected in the timeline definition. +* ``field_utils``: used to format and parse values (see available functions in ``web.field_utils``). + +You also need to declare the view in an action window of the involved model. + +Example: + +.. code-block:: xml + + + + + project.task + timeline + + + + +
+
+ Assigned to: + +
+ + + + + + + kanban,tree,form,calendar,gantt,timeline,graph + + diff --git a/web_timeline/readme/CONTRIBUTORS.rst b/web_timeline/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..1fefb2055 --- /dev/null +++ b/web_timeline/readme/CONTRIBUTORS.rst @@ -0,0 +1,8 @@ +* Laurent Mignon +* Adrien Peiffer +* Pedro M. Baeza +* Leonardo Donelli +* Adrien Didenot +* Dennis Sluijk +* Thong Nguyen Van +* Alexandre Díaz diff --git a/web_timeline/readme/DESCRIPTION.rst b/web_timeline/readme/DESCRIPTION.rst new file mode 100644 index 000000000..9ca178d8a --- /dev/null +++ b/web_timeline/readme/DESCRIPTION.rst @@ -0,0 +1,4 @@ +Define a new view displaying events in an interactive visualization chart. + +The widget is based on the external library +https://visjs.github.io/vis-timeline/examples/timeline diff --git a/web_timeline/readme/ROADMAP.rst b/web_timeline/readme/ROADMAP.rst new file mode 100644 index 000000000..350beff62 --- /dev/null +++ b/web_timeline/readme/ROADMAP.rst @@ -0,0 +1,3 @@ +* Implement a more efficient way of refreshing timeline after a record update; +* Make `attrs` attribute work; +* Make action attributes work (create, edit, delete) like in form and tree views. diff --git a/web_timeline/readme/USAGE.rst b/web_timeline/readme/USAGE.rst new file mode 100644 index 000000000..63ede3d29 --- /dev/null +++ b/web_timeline/readme/USAGE.rst @@ -0,0 +1,29 @@ +For accessing the timeline view, you have to click on the button with the clock +icon in the view switcher. The first time you access to it, the timeline window +is zoomed to fit all the current elements, the same as when you perform a +search, filter or group by operation. + +You can use the mouse scroll to zoom in or out in the timeline, and click on +any free area and drag for panning the view in that direction. + +The records of your model will be shown as rectangles whose widths are the +duration of the event according our definition. You can select them clicking +on this rectangle. You can also use Ctrl or Shift keys for adding discrete +or range selections. Selected records are hightlighted with a different color +(but the difference will be more noticeable depending on the background color). +Once selected, you can drag and move the selected records across the timeline. + +When a record is selected, a red cross button appears on the upper left corner +that allows to remove that record. This doesn't work for multiple records +although they were selected. + +Records are grouped in different blocks depending on the group by criteria +selected (if none is specified, then the default group by is applied). +Dragging a record from one block to another change the corresponding field to +the value that represents the block. You can also click on the group name to +edit the involved record directly. + +Double-click on the record to edit it. Double-click in open area to create a +new record with the group and start date linked to the area you clicked in. +By holding the Ctrl key and dragging left to right, you can create a new record +with the dragged start and end date. diff --git a/web_timeline/static/description/icon.png b/web_timeline/static/description/icon.png new file mode 100644 index 000000000..d01494920 Binary files /dev/null and b/web_timeline/static/description/icon.png differ diff --git a/web_timeline/static/description/index.html b/web_timeline/static/description/index.html new file mode 100644 index 000000000..347e98c46 --- /dev/null +++ b/web_timeline/static/description/index.html @@ -0,0 +1,579 @@ + + + + + + +Web timeline + + + +
+

Web timeline

+ + +

Production/Stable License: AGPL-3 OCA/web Translate me on Weblate Try me on Runbot

+

Define a new view displaying events in an interactive visualization chart.

+

The widget is based on the external library +https://visjs.github.io/vis-timeline/examples/timeline

+

Table of contents

+ +
+

Configuration

+

You need to define a view with the tag <timeline> as base element. These are +the possible attributes for the tag:

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeRequired?Description
date_startYesDefines the name of the field of type date that contains the start of the event.
date_stopNoDefines the name of the field of type date that contains the end of the event. The date_stop can be equal to the attribute date_start to display events has ‘point’ on the Timeline (instantaneous event).
date_delayNoDefines the name of the field of type float/integer that contain the duration in hours of the event, default = 1.
default_group_byYesDefines the name of the field that will be taken as default group by when accessing the view or when no other group by is selected.
zoomKeyNoSpecifies whether the Timeline is only zoomed when an additional key is down. Available values are ‘’ (does not apply), ‘altKey’, ‘ctrlKey’, or ‘metaKey’. Set this option if you want to be able to use the scroll to navigate vertically on views with a lot of events.
modeNoSpecifies the initial visible window. Available values are: ‘day’ to display the current day, ‘week’, ‘month’ and ‘fit’. Default value is ‘fit’ to adjust the visible window such that it fits all items.
marginNoSpecifies the margins around the items. It should respect the JSON format. For example ‘{“item”:{“horizontal”:-10}}’. Available values are: ‘{“axis”:<number>}’ (The minimal margin in pixels between items and the time axis) +‘{“item”:<number>}’ (The minimal margin in pixels between items in both horizontal and vertical direction), ‘{“item”:{“horizontal”:<number>}}’ (The minimal horizontal margin in pixels between items), +‘{“item”:{“vertical”:<number>}}’ (The minimal vertical margin in pixels between items), ‘{“item”:{“horizontal”:<number>,”vertical”:<number>}}’ (Combination between horizontal and vertical margins in pixels between items).
event_open_popupNoWhen set to true, it allows to edit the events in a popup. If not (default value), the record is edited changing to form view.
stackNoWhen set to false, items will not be stacked on top of each other such that they do overlap.
colorsNoAllows to set certain specific colors if the expressed condition (JS syntax) is met.
dependency_arrowNoSet this attribute to a x2many field to draw arrows between the records referenced in the x2many field.
+

Optionally you can declare a custom template, which will be used to render the +timeline items. You have to name the template ‘timeline-item’. +These are the variables available in template rendering:

+
    +
  • record: to access the fields values selected in the timeline definition.
  • +
  • field_utils: used to format and parse values (see available functions in web.field_utils).
  • +
+

You also need to declare the view in an action window of the involved model.

+

Example:

+
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+    <record id="view_task_timeline" model="ir.ui.view">
+        <field name="model">project.task</field>
+        <field name="type">timeline</field>
+        <field name="arch" type="xml">
+            <timeline date_start="date_assign"
+                      date_stop="date_end"
+                      string="Tasks"
+                      default_group_by="user_id"
+                      event_open_popup="true"
+                      zoomKey="ctrlKey"
+                      colors="#ec7063:user_id == false;#2ecb71:kanban_state=='done';"
+                      dependency_arrow="task_dependency_ids">
+                <field name="user_id"/>
+                <templates>
+                    <div t-name="timeline-item">
+                        <div t-esc="record.display_name"/>
+                        Assigned to:
+                        <span t-esc="record.user_id[1]"/>
+                    </div>
+                </templates>
+            </timeline>
+        </field>
+    </record>
+
+    <record id="project.action_view_task" model="ir.actions.act_window">
+        <field name="view_mode">kanban,tree,form,calendar,gantt,timeline,graph</field>
+    </record>
+</odoo>
+
+
+
+

Usage

+

For accessing the timeline view, you have to click on the button with the clock +icon in the view switcher. The first time you access to it, the timeline window +is zoomed to fit all the current elements, the same as when you perform a +search, filter or group by operation.

+

You can use the mouse scroll to zoom in or out in the timeline, and click on +any free area and drag for panning the view in that direction.

+

The records of your model will be shown as rectangles whose widths are the +duration of the event according our definition. You can select them clicking +on this rectangle. You can also use Ctrl or Shift keys for adding discrete +or range selections. Selected records are hightlighted with a different color +(but the difference will be more noticeable depending on the background color). +Once selected, you can drag and move the selected records across the timeline.

+

When a record is selected, a red cross button appears on the upper left corner +that allows to remove that record. This doesn’t work for multiple records +although they were selected.

+

Records are grouped in different blocks depending on the group by criteria +selected (if none is specified, then the default group by is applied). +Dragging a record from one block to another change the corresponding field to +the value that represents the block. You can also click on the group name to +edit the involved record directly.

+

Double-click on the record to edit it. Double-click in open area to create a +new record with the group and start date linked to the area you clicked in. +By holding the Ctrl key and dragging left to right, you can create a new record +with the dragged start and end date.

+
+
+

Known issues / Roadmap

+
    +
  • Implement a more efficient way of refreshing timeline after a record update;
  • +
  • Make attrs attribute work;
  • +
  • Make action attributes work (create, edit, delete) like in form and tree views.
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • ACSONE SA/NV
  • +
  • Tecnativa
  • +
  • Monk Software
  • +
  • Onestein
  • +
  • Trobz
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

tarteo

+

This module is part of the OCA/web project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/web_timeline/static/lib/vis-timeline/vis-timeline-graph2d.css b/web_timeline/static/lib/vis-timeline/vis-timeline-graph2d.css new file mode 100644 index 000000000..2d2643429 --- /dev/null +++ b/web_timeline/static/lib/vis-timeline/vis-timeline-graph2d.css @@ -0,0 +1,1215 @@ +/* override some bootstrap styles screwing up the timelines css */ + +.vis [class*="span"] { + min-height: 0; + width: auto; +} + +.vis-timeline { + /* + -webkit-transition: height .4s ease-in-out; + transition: height .4s ease-in-out; + */ +} + +.vis-panel { + /* + -webkit-transition: height .4s ease-in-out, top .4s ease-in-out; + transition: height .4s ease-in-out, top .4s ease-in-out; + */ +} + +.vis-axis { + /* + -webkit-transition: top .4s ease-in-out; + transition: top .4s ease-in-out; + */ +} + +/* TODO: get animation working nicely + +.vis-item { + -webkit-transition: top .4s ease-in-out; + transition: top .4s ease-in-out; +} + +.vis-item.line { + -webkit-transition: height .4s ease-in-out, top .4s ease-in-out; + transition: height .4s ease-in-out, top .4s ease-in-out; +} +/**/ +.vis-current-time { + background-color: #FF7F6E; + width: 2px; + z-index: 1; + pointer-events: none; +} + +.vis-rolling-mode-btn { + height: 40px; + width: 40px; + position: absolute; + top: 7px; + right: 20px; + border-radius: 50%; + font-size: 28px; + cursor: pointer; + opacity: 0.8; + color: white; + font-weight: bold; + text-align: center; + background: #3876c2; +} +.vis-rolling-mode-btn:before { + content: "\26F6"; +} + +.vis-rolling-mode-btn:hover { + opacity: 1; +} + +.vis-timeline { + position: relative; + border: 1px solid #bfbfbf; + overflow: hidden; + padding: 0; + margin: 0; + box-sizing: border-box; +} + +.vis-loading-screen { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; +} +.vis-panel { + position: absolute; + + padding: 0; + margin: 0; + + box-sizing: border-box; +} + +.vis-panel.vis-center, +.vis-panel.vis-left, +.vis-panel.vis-right, +.vis-panel.vis-top, +.vis-panel.vis-bottom { + border: 1px #bfbfbf; +} + +.vis-panel.vis-center, +.vis-panel.vis-left, +.vis-panel.vis-right { + border-top-style: solid; + border-bottom-style: solid; + overflow: hidden; +} + +.vis-left.vis-panel.vis-vertical-scroll, .vis-right.vis-panel.vis-vertical-scroll { + height: 100%; + overflow-x: hidden; + overflow-y: scroll; +} + +.vis-left.vis-panel.vis-vertical-scroll { + direction: rtl; +} + +.vis-left.vis-panel.vis-vertical-scroll .vis-content { + direction: ltr; +} + +.vis-right.vis-panel.vis-vertical-scroll { + direction: ltr; +} + +.vis-right.vis-panel.vis-vertical-scroll .vis-content { + direction: rtl; +} + +.vis-panel.vis-center, +.vis-panel.vis-top, +.vis-panel.vis-bottom { + border-left-style: solid; + border-right-style: solid; +} + +.vis-background { + overflow: hidden; +} + +.vis-panel > .vis-content { + position: relative; +} + +.vis-panel .vis-shadow { + position: absolute; + width: 100%; + height: 1px; + box-shadow: 0 0 10px rgba(0,0,0,0.8); + /* TODO: find a nice way to ensure vis-shadows are drawn on top of items + z-index: 1; + */ +} + +.vis-panel .vis-shadow.vis-top { + top: -1px; + left: 0; +} + +.vis-panel .vis-shadow.vis-bottom { + bottom: -1px; + left: 0; +} +.vis-graph-group0 { + fill:#4f81bd; + fill-opacity:0; + stroke-width:2px; + stroke: #4f81bd; +} + +.vis-graph-group1 { + fill:#f79646; + fill-opacity:0; + stroke-width:2px; + stroke: #f79646; +} + +.vis-graph-group2 { + fill: #8c51cf; + fill-opacity:0; + stroke-width:2px; + stroke: #8c51cf; +} + +.vis-graph-group3 { + fill: #75c841; + fill-opacity:0; + stroke-width:2px; + stroke: #75c841; +} + +.vis-graph-group4 { + fill: #ff0100; + fill-opacity:0; + stroke-width:2px; + stroke: #ff0100; +} + +.vis-graph-group5 { + fill: #37d8e6; + fill-opacity:0; + stroke-width:2px; + stroke: #37d8e6; +} + +.vis-graph-group6 { + fill: #042662; + fill-opacity:0; + stroke-width:2px; + stroke: #042662; +} + +.vis-graph-group7 { + fill:#00ff26; + fill-opacity:0; + stroke-width:2px; + stroke: #00ff26; +} + +.vis-graph-group8 { + fill:#ff00ff; + fill-opacity:0; + stroke-width:2px; + stroke: #ff00ff; +} + +.vis-graph-group9 { + fill: #8f3938; + fill-opacity:0; + stroke-width:2px; + stroke: #8f3938; +} + +.vis-timeline .vis-fill { + fill-opacity:0.1; + stroke: none; +} + + +.vis-timeline .vis-bar { + fill-opacity:0.5; + stroke-width:1px; +} + +.vis-timeline .vis-point { + stroke-width:2px; + fill-opacity:1.0; +} + + +.vis-timeline .vis-legend-background { + stroke-width:1px; + fill-opacity:0.9; + fill: #ffffff; + stroke: #c2c2c2; +} + + +.vis-timeline .vis-outline { + stroke-width:1px; + fill-opacity:1; + fill: #ffffff; + stroke: #e5e5e5; +} + +.vis-timeline .vis-icon-fill { + fill-opacity:0.3; + stroke: none; +} + +.vis-custom-time { + background-color: #6E94FF; + width: 2px; + cursor: move; + z-index: 1; +} + +.vis-custom-time > .vis-custom-time-marker { + background-color: inherit; + color: white; + font-size: 12px; + white-space: nowrap; + padding: 3px 5px; + top: 0px; + cursor: initial; + z-index: inherit; +} + +.vis-panel.vis-background.vis-horizontal .vis-grid.vis-horizontal { + position: absolute; + width: 100%; + height: 0; + border-bottom: 1px solid; +} + +.vis-panel.vis-background.vis-horizontal .vis-grid.vis-minor { + border-color: #e5e5e5; +} + +.vis-panel.vis-background.vis-horizontal .vis-grid.vis-major { + border-color: #bfbfbf; +} + + +.vis-data-axis .vis-y-axis.vis-major { + width: 100%; + position: absolute; + color: #4d4d4d; + white-space: nowrap; +} + +.vis-data-axis .vis-y-axis.vis-major.vis-measure { + padding: 0; + margin: 0; + border: 0; + visibility: hidden; + width: auto; +} + + +.vis-data-axis .vis-y-axis.vis-minor { + position: absolute; + width: 100%; + color: #bebebe; + white-space: nowrap; +} + +.vis-data-axis .vis-y-axis.vis-minor.vis-measure { + padding: 0; + margin: 0; + border: 0; + visibility: hidden; + width: auto; +} + +.vis-data-axis .vis-y-axis.vis-title { + position: absolute; + color: #4d4d4d; + white-space: nowrap; + bottom: 20px; + text-align: center; +} + +.vis-data-axis .vis-y-axis.vis-title.vis-measure { + padding: 0; + margin: 0; + visibility: hidden; + width: auto; +} + +.vis-data-axis .vis-y-axis.vis-title.vis-left { + bottom: 0; + -webkit-transform-origin: left top; + -moz-transform-origin: left top; + -ms-transform-origin: left top; + -o-transform-origin: left top; + transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + transform: rotate(-90deg); +} + +.vis-data-axis .vis-y-axis.vis-title.vis-right { + bottom: 0; + -webkit-transform-origin: right bottom; + -moz-transform-origin: right bottom; + -ms-transform-origin: right bottom; + -o-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} + +.vis-legend { + background-color: rgba(247, 252, 255, 0.65); + padding: 5px; + border: 1px solid #b3b3b3; + box-shadow: 2px 2px 10px rgba(154, 154, 154, 0.55); +} + +.vis-legend-text { + /*font-size: 10px;*/ + white-space: nowrap; + display: inline-block +} + +.vis-itemset { + position: relative; + padding: 0; + margin: 0; + + box-sizing: border-box; +} + +.vis-itemset .vis-background, +.vis-itemset .vis-foreground { + position: absolute; + width: 100%; + height: 100%; + overflow: visible; +} + +.vis-axis { + position: absolute; + width: 100%; + height: 0; + left: 0; + z-index: 1; +} + +.vis-foreground .vis-group { + position: relative; + box-sizing: border-box; + border-bottom: 1px solid #bfbfbf; +} + +.vis-foreground .vis-group:last-child { + border-bottom: none; +} + +.vis-nesting-group { + cursor: pointer; +} + +.vis-label.vis-nested-group.vis-group-level-unknown-but-gte1 { + background: #f5f5f5; +} +.vis-label.vis-nested-group.vis-group-level-0 { + background-color: #ffffff; +} +.vis-ltr .vis-label.vis-nested-group.vis-group-level-0 .vis-inner { + padding-left: 0; +} +.vis-rtl .vis-label.vis-nested-group.vis-group-level-0 .vis-inner { + padding-right: 0; +} +.vis-label.vis-nested-group.vis-group-level-1 { + background-color: rgba(0, 0, 0, 0.05); +} +.vis-ltr .vis-label.vis-nested-group.vis-group-level-1 .vis-inner { + padding-left: 15px; +} +.vis-rtl .vis-label.vis-nested-group.vis-group-level-1 .vis-inner { + padding-right: 15px; +} +.vis-label.vis-nested-group.vis-group-level-2 { + background-color: rgba(0, 0, 0, 0.1); +} +.vis-ltr .vis-label.vis-nested-group.vis-group-level-2 .vis-inner { + padding-left: 30px; +} +.vis-rtl .vis-label.vis-nested-group.vis-group-level-2 .vis-inner { + padding-right: 30px; +} +.vis-label.vis-nested-group.vis-group-level-3 { + background-color: rgba(0, 0, 0, 0.15); +} +.vis-ltr .vis-label.vis-nested-group.vis-group-level-3 .vis-inner { + padding-left: 45px; +} +.vis-rtl .vis-label.vis-nested-group.vis-group-level-3 .vis-inner { + padding-right: 45px; +} +.vis-label.vis-nested-group.vis-group-level-4 { + background-color: rgba(0, 0, 0, 0.2); +} +.vis-ltr .vis-label.vis-nested-group.vis-group-level-4 .vis-inner { + padding-left: 60px; +} +.vis-rtl .vis-label.vis-nested-group.vis-group-level-4 .vis-inner { + padding-right: 60px; +} +.vis-label.vis-nested-group.vis-group-level-5 { + background-color: rgba(0, 0, 0, 0.25); +} +.vis-ltr .vis-label.vis-nested-group.vis-group-level-5 .vis-inner { + padding-left: 75px; +} +.vis-rtl .vis-label.vis-nested-group.vis-group-level-5 .vis-inner { + padding-right: 75px; +} +.vis-label.vis-nested-group.vis-group-level-6 { + background-color: rgba(0, 0, 0, 0.3); +} +.vis-ltr .vis-label.vis-nested-group.vis-group-level-6 .vis-inner { + padding-left: 90px; +} +.vis-rtl .vis-label.vis-nested-group.vis-group-level-6 .vis-inner { + padding-right: 90px; +} +.vis-label.vis-nested-group.vis-group-level-7 { + background-color: rgba(0, 0, 0, 0.35); +} +.vis-ltr .vis-label.vis-nested-group.vis-group-level-7 .vis-inner { + padding-left: 105px; +} +.vis-rtl .vis-label.vis-nested-group.vis-group-level-7 .vis-inner { + padding-right: 105px; +} +.vis-label.vis-nested-group.vis-group-level-8 { + background-color: rgba(0, 0, 0, 0.4); +} +.vis-ltr .vis-label.vis-nested-group.vis-group-level-8 .vis-inner { + padding-left: 120px; +} +.vis-rtl .vis-label.vis-nested-group.vis-group-level-8 .vis-inner { + padding-right: 120px; +} +.vis-label.vis-nested-group.vis-group-level-9 { + background-color: rgba(0, 0, 0, 0.45); +} +.vis-ltr .vis-label.vis-nested-group.vis-group-level-9 .vis-inner { + padding-left: 135px; +} +.vis-rtl .vis-label.vis-nested-group.vis-group-level-9 .vis-inner { + padding-right: 135px; +} +/* default takes over beginning with level-10 (thats why we add .vis-nested-group + to the selectors above, to have higher specifity than these rules for the defaults) */ +.vis-label.vis-nested-group { + background-color: rgba(0, 0, 0, 0.5); +} +.vis-ltr .vis-label.vis-nested-group .vis-inner { + padding-left: 150px; +} +.vis-rtl .vis-label.vis-nested-group .vis-inner { + padding-right: 150px; +} + +.vis-group-level-unknown-but-gte1 { + border: 1px solid red; +} + +/* expanded/collapsed indicators */ +.vis-label.vis-nesting-group:before, +.vis-label.vis-nesting-group:before { + display: inline-block; + width: 15px; +} +.vis-label.vis-nesting-group.expanded:before { + content: "\25BC"; +} +.vis-label.vis-nesting-group.collapsed:before { + content: "\25B6"; +} +.vis-rtl .vis-label.vis-nesting-group.collapsed:before { + content: "\25C0"; +} +/* compensate missing expanded/collapsed indicator, but only at levels > 0 */ +.vis-ltr .vis-label:not(.vis-nesting-group):not(.vis-group-level-0) { + padding-left: 15px; +} +.vis-rtl .vis-label:not(.vis-nesting-group):not(.vis-group-level-0) { + padding-right: 15px; +} + +.vis-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 10; +} + +.vis-labelset { + position: relative; + + overflow: hidden; + + box-sizing: border-box; +} + +.vis-labelset .vis-label { + position: relative; + left: 0; + top: 0; + width: 100%; + color: #4d4d4d; + + box-sizing: border-box; +} + +.vis-labelset .vis-label { + border-bottom: 1px solid #bfbfbf; +} + +.vis-labelset .vis-label.draggable { + cursor: pointer; +} + +.vis-group-is-dragging { + background: rgba(0, 0, 0, .1); +} + +.vis-labelset .vis-label:last-child { + border-bottom: none; +} + +.vis-labelset .vis-label .vis-inner { + display: inline-block; + padding: 5px; +} + +.vis-labelset .vis-label .vis-inner.vis-hidden { + padding: 0; +} + +.vis-time-axis { + position: relative; + overflow: hidden; +} + +.vis-time-axis.vis-foreground { + top: 0; + left: 0; + width: 100%; +} + +.vis-time-axis.vis-background { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.vis-time-axis .vis-text { + position: absolute; + color: #4d4d4d; + padding: 3px; + overflow: hidden; + box-sizing: border-box; + + white-space: nowrap; +} + +.vis-time-axis .vis-text.vis-measure { + position: absolute; + padding-left: 0; + padding-right: 0; + margin-left: 0; + margin-right: 0; + visibility: hidden; +} + +.vis-time-axis .vis-grid.vis-vertical { + position: absolute; + border-left: 1px solid; +} + +.vis-time-axis .vis-grid.vis-vertical-rtl { + position: absolute; + border-right: 1px solid; +} + +.vis-time-axis .vis-grid.vis-minor { + border-color: #e5e5e5; +} + +.vis-time-axis .vis-grid.vis-major { + border-color: #bfbfbf; +} + + +.vis-item { + position: absolute; + color: #1A1A1A; + border-color: #97B0F8; + border-width: 1px; + background-color: #D5DDF6; + display: inline-block; + z-index: 1; + /*overflow: hidden;*/ +} + +.vis-item.vis-selected { + border-color: #FFC200; + background-color: #FFF785; + + /* z-index must be higher than the z-index of custom time bar and current time bar */ + z-index: 2; +} + +.vis-editable.vis-selected { + cursor: move; +} + +.vis-item.vis-point.vis-selected { + background-color: #FFF785; +} + +.vis-item.vis-box { + text-align: center; + border-style: solid; + border-radius: 2px; +} + +.vis-item.vis-point { + background: none; +} + +.vis-item.vis-dot { + position: absolute; + padding: 0; + border-width: 4px; + border-style: solid; + border-radius: 4px; +} + +.vis-item.vis-range { + border-style: solid; + border-radius: 2px; + box-sizing: border-box; +} + +.vis-item.vis-background { + border: none; + background-color: rgba(213, 221, 246, 0.4); + box-sizing: border-box; + padding: 0; + margin: 0; +} + +.vis-item .vis-item-overflow { + position: relative; + width: 100%; + height: 100%; + padding: 0; + margin: 0; + overflow: hidden; +} + +.vis-item-visible-frame { + white-space: nowrap; +} + +.vis-item.vis-range .vis-item-content { + position: relative; + display: inline-block; +} + +.vis-item.vis-background .vis-item-content { + position: absolute; + display: inline-block; +} + +.vis-item.vis-line { + padding: 0; + position: absolute; + width: 0; + border-left-width: 1px; + border-left-style: solid; +} + +.vis-item .vis-item-content { + white-space: nowrap; + box-sizing: border-box; + padding: 5px; +} + +.vis-item .vis-onUpdateTime-tooltip { + position: absolute; + background: #4f81bd; + color: white; + width: 200px; + text-align: center; + white-space: nowrap; + padding: 5px; + border-radius: 1px; + transition: 0.4s; + -o-transition: 0.4s; + -moz-transition: 0.4s; + -webkit-transition: 0.4s; +} + +.vis-item .vis-delete, .vis-item .vis-delete-rtl { + position: absolute; + top: 0px; + width: 24px; + height: 24px; + box-sizing: border-box; + padding: 0px 5px; + cursor: pointer; + + -webkit-transition: background 0.2s linear; + -moz-transition: background 0.2s linear; + -ms-transition: background 0.2s linear; + -o-transition: background 0.2s linear; + transition: background 0.2s linear; +} + +.vis-item .vis-delete { + right: -24px; +} + +.vis-item .vis-delete-rtl { + left: -24px; +} + +.vis-item .vis-delete:after, .vis-item .vis-delete-rtl:after { + content: "\00D7"; /* MULTIPLICATION SIGN */ + color: red; + font-family: arial, sans-serif; + font-size: 22px; + font-weight: bold; + + -webkit-transition: color 0.2s linear; + -moz-transition: color 0.2s linear; + -ms-transition: color 0.2s linear; + -o-transition: color 0.2s linear; + transition: color 0.2s linear; +} + +.vis-item .vis-delete:hover, .vis-item .vis-delete-rtl:hover { + background: red; +} + +.vis-item .vis-delete:hover:after, .vis-item .vis-delete-rtl:hover:after { + color: white; +} + +.vis-item .vis-drag-center { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0px; + cursor: move; +} + +.vis-item.vis-range .vis-drag-left { + position: absolute; + width: 24px; + max-width: 20%; + min-width: 2px; + height: 100%; + top: 0; + left: -4px; + + cursor: w-resize; +} + +.vis-item.vis-range .vis-drag-right { + position: absolute; + width: 24px; + max-width: 20%; + min-width: 2px; + height: 100%; + top: 0; + right: -4px; + + cursor: e-resize; +} + +.vis-range.vis-item.vis-readonly .vis-drag-left, +.vis-range.vis-item.vis-readonly .vis-drag-right { + cursor: auto; +} + +.vis-item.vis-cluster { + vertical-align: center; + text-align: center; + border-style: solid; + border-radius: 2px; +} + +.vis-item.vis-cluster-line { + padding: 0; + position: absolute; + width: 0; + border-left-width: 1px; + border-left-style: solid; +} + +.vis-item.vis-cluster-dot { + position: absolute; + padding: 0; + border-width: 4px; + border-style: solid; + border-radius: 4px; +} +div.vis-configuration { + position:relative; + display:block; + float:left; + font-size:12px; +} + +div.vis-configuration-wrapper { + display:block; + width:700px; +} + +div.vis-configuration-wrapper::after { + clear: both; + content: ""; + display: block; +} + +div.vis-configuration.vis-config-option-container{ + display:block; + width:495px; + background-color: #ffffff; + border:2px solid #f7f8fa; + border-radius:4px; + margin-top:20px; + left:10px; + padding-left:5px; +} + +div.vis-configuration.vis-config-button{ + display:block; + width:495px; + height:25px; + vertical-align: middle; + line-height:25px; + background-color: #f7f8fa; + border:2px solid #ceced0; + border-radius:4px; + margin-top:20px; + left:10px; + padding-left:5px; + cursor: pointer; + margin-bottom:30px; +} + +div.vis-configuration.vis-config-button.hover{ + background-color: #4588e6; + border:2px solid #214373; + color:#ffffff; +} + +div.vis-configuration.vis-config-item{ + display:block; + float:left; + width:495px; + height:25px; + vertical-align: middle; + line-height:25px; +} + + +div.vis-configuration.vis-config-item.vis-config-s2{ + left:10px; + background-color: #f7f8fa; + padding-left:5px; + border-radius:3px; +} +div.vis-configuration.vis-config-item.vis-config-s3{ + left:20px; + background-color: #e4e9f0; + padding-left:5px; + border-radius:3px; +} +div.vis-configuration.vis-config-item.vis-config-s4{ + left:30px; + background-color: #cfd8e6; + padding-left:5px; + border-radius:3px; +} + +div.vis-configuration.vis-config-header{ + font-size:18px; + font-weight: bold; +} + +div.vis-configuration.vis-config-label{ + width:120px; + height:25px; + line-height: 25px; +} + +div.vis-configuration.vis-config-label.vis-config-s3{ + width:110px; +} +div.vis-configuration.vis-config-label.vis-config-s4{ + width:100px; +} + +div.vis-configuration.vis-config-colorBlock{ + top:1px; + width:30px; + height:19px; + border:1px solid #444444; + border-radius:2px; + padding:0px; + margin:0px; + cursor:pointer; +} + +input.vis-configuration.vis-config-checkbox { + left:-5px; +} + + +input.vis-configuration.vis-config-rangeinput{ + position:relative; + top:-5px; + width:60px; + /*height:13px;*/ + padding:1px; + margin:0; + pointer-events:none; +} + +input.vis-configuration.vis-config-range{ + /*removes default webkit styles*/ + -webkit-appearance: none; + + /*fix for FF unable to apply focus style bug */ + border: 0px solid white; + background-color:rgba(0,0,0,0); + + /*required for proper track sizing in FF*/ + width: 300px; + height:20px; +} +input.vis-configuration.vis-config-range::-webkit-slider-runnable-track { + width: 300px; + height: 5px; + background: #dedede; /* Old browsers */ + background: -moz-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#dedede), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* IE10+ */ + background: linear-gradient(to bottom, #dedede 0%,#c8c8c8 99%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#dedede', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */ + + border: 1px solid #999999; + box-shadow: #aaaaaa 0px 0px 3px 0px; + border-radius: 3px; +} +input.vis-configuration.vis-config-range::-webkit-slider-thumb { + -webkit-appearance: none; + border: 1px solid #14334b; + height: 17px; + width: 17px; + border-radius: 50%; + background: #3876c2; /* Old browsers */ + background: -moz-linear-gradient(top, #3876c2 0%, #385380 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#3876c2), color-stop(100%,#385380)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #3876c2 0%,#385380 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #3876c2 0%,#385380 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #3876c2 0%,#385380 100%); /* IE10+ */ + background: linear-gradient(to bottom, #3876c2 0%,#385380 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3876c2', endColorstr='#385380',GradientType=0 ); /* IE6-9 */ + box-shadow: #111927 0px 0px 1px 0px; + margin-top: -7px; +} +input.vis-configuration.vis-config-range:focus { + outline: none; +} +input.vis-configuration.vis-config-range:focus::-webkit-slider-runnable-track { + background: #9d9d9d; /* Old browsers */ + background: -moz-linear-gradient(top, #9d9d9d 0%, #c8c8c8 99%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#9d9d9d), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #9d9d9d 0%,#c8c8c8 99%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #9d9d9d 0%,#c8c8c8 99%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #9d9d9d 0%,#c8c8c8 99%); /* IE10+ */ + background: linear-gradient(to bottom, #9d9d9d 0%,#c8c8c8 99%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9d9d9d', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */ +} + +input.vis-configuration.vis-config-range::-moz-range-track { + width: 300px; + height: 10px; + background: #dedede; /* Old browsers */ + background: -moz-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#dedede), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* IE10+ */ + background: linear-gradient(to bottom, #dedede 0%,#c8c8c8 99%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#dedede', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */ + + border: 1px solid #999999; + box-shadow: #aaaaaa 0px 0px 3px 0px; + border-radius: 3px; +} +input.vis-configuration.vis-config-range::-moz-range-thumb { + border: none; + height: 16px; + width: 16px; + + border-radius: 50%; + background: #385380; +} + +/*hide the outline behind the border*/ +input.vis-configuration.vis-config-range:-moz-focusring{ + outline: 1px solid white; + outline-offset: -1px; +} + +input.vis-configuration.vis-config-range::-ms-track { + width: 300px; + height: 5px; + + /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */ + background: transparent; + + /*leave room for the larger thumb to overflow with a transparent border */ + border-color: transparent; + border-width: 6px 0; + + /*remove default tick marks*/ + color: transparent; +} +input.vis-configuration.vis-config-range::-ms-fill-lower { + background: #777; + border-radius: 10px; +} +input.vis-configuration.vis-config-range::-ms-fill-upper { + background: #ddd; + border-radius: 10px; +} +input.vis-configuration.vis-config-range::-ms-thumb { + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: #385380; +} +input.vis-configuration.vis-config-range:focus::-ms-fill-lower { + background: #888; +} +input.vis-configuration.vis-config-range:focus::-ms-fill-upper { + background: #ccc; +} + +.vis-configuration-popup { + position: absolute; + background: rgba(57, 76, 89, 0.85); + border: 2px solid #f2faff; + line-height:30px; + height:30px; + width:150px; + text-align:center; + color: #ffffff; + font-size:14px; + border-radius:4px; + -webkit-transition: opacity 0.3s ease-in-out; + -moz-transition: opacity 0.3s ease-in-out; + transition: opacity 0.3s ease-in-out; +} +.vis-configuration-popup:after, .vis-configuration-popup:before { + left: 100%; + top: 50%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; +} + +.vis-configuration-popup:after { + border-color: rgba(136, 183, 213, 0); + border-left-color: rgba(57, 76, 89, 0.85); + border-width: 8px; + margin-top: -8px; +} +.vis-configuration-popup:before { + border-color: rgba(194, 225, 245, 0); + border-left-color: #f2faff; + border-width: 12px; + margin-top: -12px; +} +.vis .overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + + /* Must be displayed above for example selected Timeline items */ + z-index: 10; +} + +.vis-active { + box-shadow: 0 0 10px #86d5f8; +} + +div.vis-tooltip { + position: absolute; + visibility: hidden; + padding: 5px; + white-space: nowrap; + + font-family: verdana; + font-size:14px; + color:#000000; + background-color: #f5f4ed; + + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + border: 1px solid #808074; + + box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2); + pointer-events: none; + + z-index: 5; +} diff --git a/web_timeline/static/lib/vis-timeline/vis-timeline-graph2d.min.js b/web_timeline/static/lib/vis-timeline/vis-timeline-graph2d.min.js new file mode 100644 index 000000000..f80788c00 --- /dev/null +++ b/web_timeline/static/lib/vis-timeline/vis-timeline-graph2d.min.js @@ -0,0 +1,60 @@ +/** + * vis-timeline and vis-graph2d + * https://visjs.github.io/vis-timeline/ + * + * Create a fully customizable, interactive timeline with items and ranges. + * + * @version 7.3.4 + * @date 2020-03-18T17:05:04.052Z + * + * @copyright (c) 2011-2017 Almende B.V, http://almende.com + * @copyright (c) 2017-2019 visjs contributors, https://github.com/visjs + * + * @license + * vis.js is dual licensed under both + * + * 1. The Apache 2.0 License + * http://www.apache.org/licenses/LICENSE-2.0 + * + * and + * + * 2. The MIT License + * http://opensource.org/licenses/MIT + * + * vis.js may be distributed under either license. + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).vis=t.vis||{})}(this,(function(t){"use strict";var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function i(){throw new Error("Dynamic requires are not currently supported by rollup-plugin-commonjs")}function n(t,e){return t(e={exports:{}},e.exports),e.exports}function o(t){return t&&t.default||t}var r=n((function(t,e){t.exports=function(){var e,n;function o(){return e.apply(null,arguments)}function r(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function s(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function a(t){return void 0===t}function l(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function h(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function u(t,e){var i,n=[];for(i=0;i>>0,n=0;n0)for(i=0;i=0?i?"+":"":"-")+Math.pow(10,Math.max(0,o)).toString().substr(1)+n}var H=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,z=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,G={},W={};function V(t,e,i,n){var o=n;"string"==typeof n&&(o=function(){return this[n]()}),t&&(W[t]=o),e&&(W[e[0]]=function(){return F(o.apply(this,arguments),e[1],e[2])}),i&&(W[i]=function(){return this.localeData().ordinal(o.apply(this,arguments),t)})}function B(t,e){return t.isValid()?(e=U(e,t.localeData()),G[e]=G[e]||function(t){var e,i,n,o=t.match(H);for(e=0,i=o.length;e=0&&z.test(t);)t=t.replace(z,n),z.lastIndex=0,i-=1;return t}var X=/\d/,q=/\d\d/,Z=/\d{3}/,K=/\d{4}/,$=/[+-]?\d{6}/,J=/\d\d?/,Q=/\d\d\d\d?/,tt=/\d\d\d\d\d\d?/,et=/\d{1,3}/,it=/\d{1,4}/,nt=/[+-]?\d{1,6}/,ot=/\d+/,rt=/[+-]?\d+/,st=/Z|[+-]\d\d:?\d\d/gi,at=/Z|[+-]\d\d(?::?\d\d)?/gi,lt=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,ht={};function ut(t,e,i){ht[t]=E(e)?e:function(t,n){return t&&i?i:e}}function dt(t,e){return d(ht,t)?ht[t](e._strict,e._locale):new RegExp(ct(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,(function(t,e,i,n,o){return e||i||n||o}))))}function ct(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var pt={};function mt(t,e){var i,n=e;for("string"==typeof t&&(t=[t]),l(e)&&(n=function(t,i){i[e]=x(t)}),i=0;i68?1900:2e3)};var bt,_t=wt("FullYear",!0);function wt(t,e){return function(i){return null!=i?(xt(this,t,i),o.updateOffset(this,e),this):kt(this,t)}}function kt(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function xt(t,e,i){t.isValid()&&!isNaN(i)&&("FullYear"===e&&yt(t.year())&&1===t.month()&&29===t.date()?t._d["set"+(t._isUTC?"UTC":"")+e](i,t.month(),Dt(i,t.month())):t._d["set"+(t._isUTC?"UTC":"")+e](i))}function Dt(t,e){if(isNaN(t)||isNaN(e))return NaN;var i,n=(e%(i=12)+i)%i;return t+=(e-n)/12,1===n?yt(t)?29:28:31-n%7%2}bt=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e=0?(a=new Date(t+400,e,i,n,o,r,s),isFinite(a.getFullYear())&&a.setFullYear(t)):a=new Date(t,e,i,n,o,r,s),a}function Nt(t){var e;if(t<100&&t>=0){var i=Array.prototype.slice.call(arguments);i[0]=t+400,e=new Date(Date.UTC.apply(null,i)),isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t)}else e=new Date(Date.UTC.apply(null,arguments));return e}function Yt(t,e,i){var n=7+e-i;return-(7+Nt(t,0,n).getUTCDay()-e)%7+n-1}function Rt(t,e,i,n,o){var r,s,a=1+7*(e-1)+(7+i-n)%7+Yt(t,n,o);return a<=0?s=gt(r=t-1)+a:a>gt(t)?(r=t+1,s=a-gt(t)):(r=t,s=a),{year:r,dayOfYear:s}}function jt(t,e,i){var n,o,r=Yt(t.year(),e,i),s=Math.floor((t.dayOfYear()-r-1)/7)+1;return s<1?n=s+Ft(o=t.year()-1,e,i):s>Ft(t.year(),e,i)?(n=s-Ft(t.year(),e,i),o=t.year()+1):(o=t.year(),n=s),{week:n,year:o}}function Ft(t,e,i){var n=Yt(t,e,i),o=Yt(t+1,e,i);return(gt(t)-n+o)/7}function Ht(t,e){return t.slice(e,7).concat(t.slice(0,e))}V("w",["ww",2],"wo","week"),V("W",["WW",2],"Wo","isoWeek"),A("week","w"),A("isoWeek","W"),j("week",5),j("isoWeek",5),ut("w",J),ut("ww",J,q),ut("W",J),ut("WW",J,q),ft(["w","ww","W","WW"],(function(t,e,i,n){e[n.substr(0,1)]=x(t)})),V("d",0,"do","day"),V("dd",0,0,(function(t){return this.localeData().weekdaysMin(this,t)})),V("ddd",0,0,(function(t){return this.localeData().weekdaysShort(this,t)})),V("dddd",0,0,(function(t){return this.localeData().weekdays(this,t)})),V("e",0,0,"weekday"),V("E",0,0,"isoWeekday"),A("day","d"),A("weekday","e"),A("isoWeekday","E"),j("day",11),j("weekday",11),j("isoWeekday",11),ut("d",J),ut("e",J),ut("E",J),ut("dd",(function(t,e){return e.weekdaysMinRegex(t)})),ut("ddd",(function(t,e){return e.weekdaysShortRegex(t)})),ut("dddd",(function(t,e){return e.weekdaysRegex(t)})),ft(["dd","ddd","dddd"],(function(t,e,i,n){var o=i._locale.weekdaysParse(t,n,i._strict);null!=o?e.d=o:m(i).invalidWeekday=t})),ft(["d","e","E"],(function(t,e,i,n){e[n]=x(t)}));var zt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Gt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Wt="Su_Mo_Tu_We_Th_Fr_Sa".split("_");function Vt(t,e,i){var n,o,r,s=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],n=0;n<7;++n)r=p([2e3,1]).day(n),this._minWeekdaysParse[n]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[n]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[n]=this.weekdays(r,"").toLocaleLowerCase();return i?"dddd"===e?-1!==(o=bt.call(this._weekdaysParse,s))?o:null:"ddd"===e?-1!==(o=bt.call(this._shortWeekdaysParse,s))?o:null:-1!==(o=bt.call(this._minWeekdaysParse,s))?o:null:"dddd"===e?-1!==(o=bt.call(this._weekdaysParse,s))||-1!==(o=bt.call(this._shortWeekdaysParse,s))||-1!==(o=bt.call(this._minWeekdaysParse,s))?o:null:"ddd"===e?-1!==(o=bt.call(this._shortWeekdaysParse,s))||-1!==(o=bt.call(this._weekdaysParse,s))||-1!==(o=bt.call(this._minWeekdaysParse,s))?o:null:-1!==(o=bt.call(this._minWeekdaysParse,s))||-1!==(o=bt.call(this._weekdaysParse,s))||-1!==(o=bt.call(this._shortWeekdaysParse,s))?o:null}var Bt=lt,Ut=lt,Xt=lt;function qt(){function t(t,e){return e.length-t.length}var e,i,n,o,r,s=[],a=[],l=[],h=[];for(e=0;e<7;e++)i=p([2e3,1]).day(e),n=this.weekdaysMin(i,""),o=this.weekdaysShort(i,""),r=this.weekdays(i,""),s.push(n),a.push(o),l.push(r),h.push(n),h.push(o),h.push(r);for(s.sort(t),a.sort(t),l.sort(t),h.sort(t),e=0;e<7;e++)a[e]=ct(a[e]),l[e]=ct(l[e]),h[e]=ct(h[e]);this._weekdaysRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+s.join("|")+")","i")}function Zt(){return this.hours()%12||12}function Kt(t,e){V(t,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)}))}function $t(t,e){return e._meridiemParse}V("H",["HH",2],0,"hour"),V("h",["hh",2],0,Zt),V("k",["kk",2],0,(function(){return this.hours()||24})),V("hmm",0,0,(function(){return""+Zt.apply(this)+F(this.minutes(),2)})),V("hmmss",0,0,(function(){return""+Zt.apply(this)+F(this.minutes(),2)+F(this.seconds(),2)})),V("Hmm",0,0,(function(){return""+this.hours()+F(this.minutes(),2)})),V("Hmmss",0,0,(function(){return""+this.hours()+F(this.minutes(),2)+F(this.seconds(),2)})),Kt("a",!0),Kt("A",!1),A("hour","h"),j("hour",13),ut("a",$t),ut("A",$t),ut("H",J),ut("h",J),ut("k",J),ut("HH",J,q),ut("hh",J,q),ut("kk",J,q),ut("hmm",Q),ut("hmmss",tt),ut("Hmm",Q),ut("Hmmss",tt),mt(["H","HH"],3),mt(["k","kk"],(function(t,e,i){var n=x(t);e[3]=24===n?0:n})),mt(["a","A"],(function(t,e,i){i._isPm=i._locale.isPM(t),i._meridiem=t})),mt(["h","hh"],(function(t,e,i){e[3]=x(t),m(i).bigHour=!0})),mt("hmm",(function(t,e,i){var n=t.length-2;e[3]=x(t.substr(0,n)),e[4]=x(t.substr(n)),m(i).bigHour=!0})),mt("hmmss",(function(t,e,i){var n=t.length-4,o=t.length-2;e[3]=x(t.substr(0,n)),e[4]=x(t.substr(n,2)),e[5]=x(t.substr(o)),m(i).bigHour=!0})),mt("Hmm",(function(t,e,i){var n=t.length-2;e[3]=x(t.substr(0,n)),e[4]=x(t.substr(n))})),mt("Hmmss",(function(t,e,i){var n=t.length-4,o=t.length-2;e[3]=x(t.substr(0,n)),e[4]=x(t.substr(n,2)),e[5]=x(t.substr(o))}));var Jt,Qt=wt("Hours",!0),te={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Mt,monthsShort:Tt,week:{dow:0,doy:6},weekdays:zt,weekdaysMin:Wt,weekdaysShort:Gt,meridiemParse:/[ap]\.?m?\.?/i},ee={},ie={};function ne(t){return t?t.toLowerCase().replace("_","-"):t}function oe(e){var n=null;if(!ee[e]&&t&&t.exports)try{n=Jt._abbr,i(),re(n)}catch(t){}return ee[e]}function re(t,e){var i;return t&&((i=a(e)?ae(t):se(t,e))?Jt=i:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),Jt._abbr}function se(t,e){if(null!==e){var i,n=te;if(e.abbr=t,null!=ee[t])O("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=ee[t]._config;else if(null!=e.parentLocale)if(null!=ee[e.parentLocale])n=ee[e.parentLocale]._config;else{if(null==(i=oe(e.parentLocale)))return ie[e.parentLocale]||(ie[e.parentLocale]=[]),ie[e.parentLocale].push({name:t,config:e}),null;n=i._config}return ee[t]=new L(P(n,e)),ie[t]&&ie[t].forEach((function(t){se(t.name,t.config)})),re(t),ee[t]}return delete ee[t],null}function ae(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return Jt;if(!r(t)){if(e=oe(t))return e;t=[t]}return function(t){for(var e,i,n,o,r=0;r0;){if(n=oe(o.slice(0,e).join("-")))return n;if(i&&i.length>=e&&D(o,i,!0)>=e-1)break;e--}r++}return Jt}(t)}function le(t){var e,i=t._a;return i&&-2===m(t).overflow&&(e=i[1]<0||i[1]>11?1:i[2]<1||i[2]>Dt(i[0],i[1])?2:i[3]<0||i[3]>24||24===i[3]&&(0!==i[4]||0!==i[5]||0!==i[6])?3:i[4]<0||i[4]>59?4:i[5]<0||i[5]>59?5:i[6]<0||i[6]>999?6:-1,m(t)._overflowDayOfYear&&(e<0||e>2)&&(e=2),m(t)._overflowWeeks&&-1===e&&(e=7),m(t)._overflowWeekday&&-1===e&&(e=8),m(t).overflow=e),t}function he(t,e,i){return null!=t?t:null!=e?e:i}function ue(t){var e,i,n,r,s,a=[];if(!t._d){for(n=function(t){var e=new Date(o.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}(t),t._w&&null==t._a[2]&&null==t._a[1]&&function(t){var e,i,n,o,r,s,a,l;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)r=1,s=4,i=he(e.GG,t._a[0],jt(Se(),1,4).year),n=he(e.W,1),((o=he(e.E,1))<1||o>7)&&(l=!0);else{r=t._locale._week.dow,s=t._locale._week.doy;var h=jt(Se(),r,s);i=he(e.gg,t._a[0],h.year),n=he(e.w,h.week),null!=e.d?((o=e.d)<0||o>6)&&(l=!0):null!=e.e?(o=e.e+r,(e.e<0||e.e>6)&&(l=!0)):o=r}n<1||n>Ft(i,r,s)?m(t)._overflowWeeks=!0:null!=l?m(t)._overflowWeekday=!0:(a=Rt(i,n,o,r,s),t._a[0]=a.year,t._dayOfYear=a.dayOfYear)}(t),null!=t._dayOfYear&&(s=he(t._a[0],n[0]),(t._dayOfYear>gt(s)||0===t._dayOfYear)&&(m(t)._overflowDayOfYear=!0),i=Nt(s,0,t._dayOfYear),t._a[1]=i.getUTCMonth(),t._a[2]=i.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=a[e]=n[e];for(;e<7;e++)t._a[e]=a[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[3]&&0===t._a[4]&&0===t._a[5]&&0===t._a[6]&&(t._nextDay=!0,t._a[3]=0),t._d=(t._useUTC?Nt:At).apply(null,a),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[3]=24),t._w&&void 0!==t._w.d&&t._w.d!==r&&(m(t).weekdayMismatch=!0)}}var de=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ce=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,pe=/Z|[+-]\d\d(?::?\d\d)?/,me=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],fe=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],ve=/^\/?Date\((\-?\d+)/i;function ge(t){var e,i,n,o,r,s,a=t._i,l=de.exec(a)||ce.exec(a);if(l){for(m(t).iso=!0,e=0,i=me.length;e0&&m(t).unusedInput.push(s),a=a.slice(a.indexOf(i)+i.length),h+=i.length),W[r]?(i?m(t).empty=!1:m(t).unusedTokens.push(r),vt(r,i,t)):t._strict&&!i&&m(t).unusedTokens.push(r);m(t).charsLeftOver=l-h,a.length>0&&m(t).unusedInput.push(a),t._a[3]<=12&&!0===m(t).bigHour&&t._a[3]>0&&(m(t).bigHour=void 0),m(t).parsedDateParts=t._a.slice(0),m(t).meridiem=t._meridiem,t._a[3]=function(t,e,i){var n;return null==i?e:null!=t.meridiemHour?t.meridiemHour(e,i):null!=t.isPM?((n=t.isPM(i))&&e<12&&(e+=12),n||12!==e||(e=0),e):e}(t._locale,t._a[3],t._meridiem),ue(t),le(t)}else we(t);else ge(t)}function xe(t){var e=t._i,i=t._f;return t._locale=t._locale||ae(t._l),null===e||void 0===i&&""===e?v({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),w(e)?new _(le(e)):(h(e)?t._d=e:r(i)?function(t){var e,i,n,o,r;if(0===t._f.length)return m(t).invalidFormat=!0,void(t._d=new Date(NaN));for(o=0;othis?this:t:v()}));function Ce(t,e){var i,n;if(1===e.length&&r(e[0])&&(e=e[0]),!e.length)return Se();for(i=e[0],n=1;n=0?new Date(t+400,e,i)-126227808e5:new Date(t,e,i).valueOf()}function ti(t,e,i){return t<100&&t>=0?Date.UTC(t+400,e,i)-126227808e5:Date.UTC(t,e,i)}function ei(t,e){V(0,[t,t.length],0,e)}function ii(t,e,i,n,o){var r;return null==t?jt(this,n,o).year:(e>(r=Ft(t,n,o))&&(e=r),ni.call(this,t,e,i,n,o))}function ni(t,e,i,n,o){var r=Rt(t,e,i,n,o),s=Nt(r.year,0,r.dayOfYear);return this.year(s.getUTCFullYear()),this.month(s.getUTCMonth()),this.date(s.getUTCDate()),this}V(0,["gg",2],0,(function(){return this.weekYear()%100})),V(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),ei("gggg","weekYear"),ei("ggggg","weekYear"),ei("GGGG","isoWeekYear"),ei("GGGGG","isoWeekYear"),A("weekYear","gg"),A("isoWeekYear","GG"),j("weekYear",1),j("isoWeekYear",1),ut("G",rt),ut("g",rt),ut("GG",J,q),ut("gg",J,q),ut("GGGG",it,K),ut("gggg",it,K),ut("GGGGG",nt,$),ut("ggggg",nt,$),ft(["gggg","ggggg","GGGG","GGGGG"],(function(t,e,i,n){e[n.substr(0,2)]=x(t)})),ft(["gg","GG"],(function(t,e,i,n){e[n]=o.parseTwoDigitYear(t)})),V("Q",0,"Qo","quarter"),A("quarter","Q"),j("quarter",7),ut("Q",X),mt("Q",(function(t,e){e[1]=3*(x(t)-1)})),V("D",["DD",2],"Do","date"),A("date","D"),j("date",9),ut("D",J),ut("DD",J,q),ut("Do",(function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient})),mt(["D","DD"],2),mt("Do",(function(t,e){e[2]=x(t.match(J)[0])}));var oi=wt("Date",!0);V("DDD",["DDDD",3],"DDDo","dayOfYear"),A("dayOfYear","DDD"),j("dayOfYear",4),ut("DDD",et),ut("DDDD",Z),mt(["DDD","DDDD"],(function(t,e,i){i._dayOfYear=x(t)})),V("m",["mm",2],0,"minute"),A("minute","m"),j("minute",14),ut("m",J),ut("mm",J,q),mt(["m","mm"],4);var ri=wt("Minutes",!1);V("s",["ss",2],0,"second"),A("second","s"),j("second",15),ut("s",J),ut("ss",J,q),mt(["s","ss"],5);var si,ai=wt("Seconds",!1);for(V("S",0,0,(function(){return~~(this.millisecond()/100)})),V(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),V(0,["SSS",3],0,"millisecond"),V(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),V(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),V(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),V(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),V(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),V(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),A("millisecond","ms"),j("millisecond",16),ut("S",et,X),ut("SS",et,q),ut("SSS",et,Z),si="SSSS";si.length<=9;si+="S")ut(si,ot);function li(t,e){e[6]=x(1e3*("0."+t))}for(si="S";si.length<=9;si+="S")mt(si,li);var hi=wt("Milliseconds",!1);V("z",0,0,"zoneAbbr"),V("zz",0,0,"zoneName");var ui=_.prototype;function di(t){return t}ui.add=Ue,ui.calendar=function(t,e){var i=t||Se(),n=Ye(i,this).startOf("day"),r=o.calendarFormat(this,n)||"sameElse",s=e&&(E(e[r])?e[r].call(this,i):e[r]);return this.format(s||this.localeData().calendar(r,this,Se(i)))},ui.clone=function(){return new _(this)},ui.diff=function(t,e,i){var n,o,r;if(!this.isValid())return NaN;if(!(n=Ye(t,this)).isValid())return NaN;switch(o=6e4*(n.utcOffset()-this.utcOffset()),e=N(e)){case"year":r=qe(this,n)/12;break;case"month":r=qe(this,n);break;case"quarter":r=qe(this,n)/3;break;case"second":r=(this-n)/1e3;break;case"minute":r=(this-n)/6e4;break;case"hour":r=(this-n)/36e5;break;case"day":r=(this-n-o)/864e5;break;case"week":r=(this-n-o)/6048e5;break;default:r=this-n}return i?r:k(r)},ui.endOf=function(t){var e;if(void 0===(t=N(t))||"millisecond"===t||!this.isValid())return this;var i=this._isUTC?ti:Qe;switch(t){case"year":e=i(this.year()+1,0,1)-1;break;case"quarter":e=i(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":e=i(this.year(),this.month()+1,1)-1;break;case"week":e=i(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":e=i(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":e=i(this.year(),this.month(),this.date()+1)-1;break;case"hour":e=this._d.valueOf(),e+=36e5-Je(e+(this._isUTC?0:6e4*this.utcOffset()),36e5)-1;break;case"minute":e=this._d.valueOf(),e+=6e4-Je(e,6e4)-1;break;case"second":e=this._d.valueOf(),e+=1e3-Je(e,1e3)-1}return this._d.setTime(e),o.updateOffset(this,!0),this},ui.format=function(t){t||(t=this.isUtc()?o.defaultFormatUtc:o.defaultFormat);var e=B(this,t);return this.localeData().postformat(e)},ui.from=function(t,e){return this.isValid()&&(w(t)&&t.isValid()||Se(t).isValid())?ze({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},ui.fromNow=function(t){return this.from(Se(),t)},ui.to=function(t,e){return this.isValid()&&(w(t)&&t.isValid()||Se(t).isValid())?ze({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},ui.toNow=function(t){return this.to(Se(),t)},ui.get=function(t){return E(this[t=N(t)])?this[t]():this},ui.invalidAt=function(){return m(this).overflow},ui.isAfter=function(t,e){var i=w(t)?t:Se(t);return!(!this.isValid()||!i.isValid())&&("millisecond"===(e=N(e)||"millisecond")?this.valueOf()>i.valueOf():i.valueOf()9999?B(i,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):E(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",B(i,"Z")):B(i,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},ui.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var i="["+t+'("]',n=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",o=e+'[")]';return this.format(i+n+"-MM-DD[T]HH:mm:ss.SSS"+o)},ui.toJSON=function(){return this.isValid()?this.toISOString():null},ui.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},ui.unix=function(){return Math.floor(this.valueOf()/1e3)},ui.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},ui.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},ui.year=_t,ui.isLeapYear=function(){return yt(this.year())},ui.weekYear=function(t){return ii.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},ui.isoWeekYear=function(t){return ii.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},ui.quarter=ui.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},ui.month=Et,ui.daysInMonth=function(){return Dt(this.year(),this.month())},ui.week=ui.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},ui.isoWeek=ui.isoWeeks=function(t){var e=jt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},ui.weeksInYear=function(){var t=this.localeData()._week;return Ft(this.year(),t.dow,t.doy)},ui.isoWeeksInYear=function(){return Ft(this.year(),1,4)},ui.date=oi,ui.day=ui.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=function(t,e){return"string"!=typeof t?t:isNaN(t)?"number"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}(t,this.localeData()),this.add(t-e,"d")):e},ui.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},ui.isoWeekday=function(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=function(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7},ui.dayOfYear=function(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},ui.hour=ui.hours=Qt,ui.minute=ui.minutes=ri,ui.second=ui.seconds=ai,ui.millisecond=ui.milliseconds=hi,ui.utcOffset=function(t,e,i){var n,r=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=Ne(at,t)))return this}else Math.abs(t)<16&&!i&&(t*=60);return!this._isUTC&&e&&(n=Re(this)),this._offset=t,this._isUTC=!0,null!=n&&this.add(n,"m"),r!==t&&(!e||this._changeInProgress?Be(this,ze(t-r,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,o.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?r:Re(this)},ui.utc=function(t){return this.utcOffset(0,t)},ui.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Re(this),"m")),this},ui.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=Ne(st,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this},ui.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Se(t).utcOffset():0,(this.utcOffset()-t)%60==0)},ui.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},ui.isLocal=function(){return!!this.isValid()&&!this._isUTC},ui.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},ui.isUtc=je,ui.isUTC=je,ui.zoneAbbr=function(){return this._isUTC?"UTC":""},ui.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},ui.dates=M("dates accessor is deprecated. Use date instead.",oi),ui.months=M("months accessor is deprecated. Use month instead",Et),ui.years=M("years accessor is deprecated. Use year instead",_t),ui.zone=M("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",(function(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()})),ui.isDSTShifted=M("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",(function(){if(!a(this._isDSTShifted))return this._isDSTShifted;var t={};if(y(t,this),(t=xe(t))._a){var e=t._isUTC?p(t._a):Se(t._a);this._isDSTShifted=this.isValid()&&D(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}));var ci=L.prototype;function pi(t,e,i,n){var o=ae(),r=p().set(n,e);return o[i](r,t)}function mi(t,e,i){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return pi(t,e,i,"month");var n,o=[];for(n=0;n<12;n++)o[n]=pi(t,n,i,"month");return o}function fi(t,e,i,n){"boolean"==typeof t?(l(e)&&(i=e,e=void 0),e=e||""):(i=e=t,t=!1,l(e)&&(i=e,e=void 0),e=e||"");var o,r=ae(),s=t?r._week.dow:0;if(null!=i)return pi(e,(i+s)%7,n,"day");var a=[];for(o=0;o<7;o++)a[o]=pi(e,(o+s)%7,n,"day");return a}ci.calendar=function(t,e,i){var n=this._calendar[t]||this._calendar.sameElse;return E(n)?n.call(e,i):n},ci.longDateFormat=function(t){var e=this._longDateFormat[t],i=this._longDateFormat[t.toUpperCase()];return e||!i?e:(this._longDateFormat[t]=i.replace(/MMMM|MM|DD|dddd/g,(function(t){return t.slice(1)})),this._longDateFormat[t])},ci.invalidDate=function(){return this._invalidDate},ci.ordinal=function(t){return this._ordinal.replace("%d",t)},ci.preparse=di,ci.postformat=di,ci.relativeTime=function(t,e,i,n){var o=this._relativeTime[i];return E(o)?o(t,e,i,n):o.replace(/%d/i,t)},ci.pastFuture=function(t,e){var i=this._relativeTime[t>0?"future":"past"];return E(i)?i(e):i.replace(/%s/i,e)},ci.set=function(t){var e,i;for(i in t)E(e=t[i])?this[i]=e:this["_"+i]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},ci.months=function(t,e){return t?r(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||St).test(e)?"format":"standalone"][t.month()]:r(this._months)?this._months:this._months.standalone},ci.monthsShort=function(t,e){return t?r(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[St.test(e)?"format":"standalone"][t.month()]:r(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},ci.monthsParse=function(t,e,i){var n,o,r;if(this._monthsParseExact)return Ct.call(this,t,e,i);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),n=0;n<12;n++){if(o=p([2e3,n]),i&&!this._longMonthsParse[n]&&(this._longMonthsParse[n]=new RegExp("^"+this.months(o,"").replace(".","")+"$","i"),this._shortMonthsParse[n]=new RegExp("^"+this.monthsShort(o,"").replace(".","")+"$","i")),i||this._monthsParse[n]||(r="^"+this.months(o,"")+"|^"+this.monthsShort(o,""),this._monthsParse[n]=new RegExp(r.replace(".",""),"i")),i&&"MMMM"===e&&this._longMonthsParse[n].test(t))return n;if(i&&"MMM"===e&&this._shortMonthsParse[n].test(t))return n;if(!i&&this._monthsParse[n].test(t))return n}},ci.monthsRegex=function(t){return this._monthsParseExact?(d(this,"_monthsRegex")||It.call(this),t?this._monthsStrictRegex:this._monthsRegex):(d(this,"_monthsRegex")||(this._monthsRegex=Lt),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},ci.monthsShortRegex=function(t){return this._monthsParseExact?(d(this,"_monthsRegex")||It.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(d(this,"_monthsShortRegex")||(this._monthsShortRegex=Pt),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},ci.week=function(t){return jt(t,this._week.dow,this._week.doy).week},ci.firstDayOfYear=function(){return this._week.doy},ci.firstDayOfWeek=function(){return this._week.dow},ci.weekdays=function(t,e){var i=r(this._weekdays)?this._weekdays:this._weekdays[t&&!0!==t&&this._weekdays.isFormat.test(e)?"format":"standalone"];return!0===t?Ht(i,this._week.dow):t?i[t.day()]:i},ci.weekdaysMin=function(t){return!0===t?Ht(this._weekdaysMin,this._week.dow):t?this._weekdaysMin[t.day()]:this._weekdaysMin},ci.weekdaysShort=function(t){return!0===t?Ht(this._weekdaysShort,this._week.dow):t?this._weekdaysShort[t.day()]:this._weekdaysShort},ci.weekdaysParse=function(t,e,i){var n,o,r;if(this._weekdaysParseExact)return Vt.call(this,t,e,i);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),n=0;n<7;n++){if(o=p([2e3,1]).day(n),i&&!this._fullWeekdaysParse[n]&&(this._fullWeekdaysParse[n]=new RegExp("^"+this.weekdays(o,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[n]=new RegExp("^"+this.weekdaysShort(o,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[n]=new RegExp("^"+this.weekdaysMin(o,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[n]||(r="^"+this.weekdays(o,"")+"|^"+this.weekdaysShort(o,"")+"|^"+this.weekdaysMin(o,""),this._weekdaysParse[n]=new RegExp(r.replace(".",""),"i")),i&&"dddd"===e&&this._fullWeekdaysParse[n].test(t))return n;if(i&&"ddd"===e&&this._shortWeekdaysParse[n].test(t))return n;if(i&&"dd"===e&&this._minWeekdaysParse[n].test(t))return n;if(!i&&this._weekdaysParse[n].test(t))return n}},ci.weekdaysRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||qt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=Bt),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},ci.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||qt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Ut),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},ci.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||qt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Xt),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},ci.isPM=function(t){return"p"===(t+"").toLowerCase().charAt(0)},ci.meridiem=function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},re("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===x(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),o.lang=M("moment.lang is deprecated. Use moment.locale instead.",re),o.langData=M("moment.langData is deprecated. Use moment.localeData instead.",ae);var vi=Math.abs;function gi(t,e,i,n){var o=ze(e,i);return t._milliseconds+=n*o._milliseconds,t._days+=n*o._days,t._months+=n*o._months,t._bubble()}function yi(t){return t<0?Math.floor(t):Math.ceil(t)}function bi(t){return 4800*t/146097}function _i(t){return 146097*t/4800}function wi(t){return function(){return this.as(t)}}var ki=wi("ms"),xi=wi("s"),Di=wi("m"),Si=wi("h"),Mi=wi("d"),Ti=wi("w"),Ci=wi("M"),Oi=wi("Q"),Ei=wi("y");function Pi(t){return function(){return this.isValid()?this._data[t]:NaN}}var Li=Pi("milliseconds"),Ii=Pi("seconds"),Ai=Pi("minutes"),Ni=Pi("hours"),Yi=Pi("days"),Ri=Pi("months"),ji=Pi("years"),Fi=Math.round,Hi={ss:44,s:45,m:45,h:22,d:26,M:11};function zi(t,e,i,n,o){return o.relativeTime(e||1,!!i,t,n)}function Gi(t,e,i){var n=ze(t).abs(),o=Fi(n.as("s")),r=Fi(n.as("m")),s=Fi(n.as("h")),a=Fi(n.as("d")),l=Fi(n.as("M")),h=Fi(n.as("y")),u=o<=Hi.ss&&["s",o]||o0,u[4]=i,zi.apply(null,u)}var Wi=Math.abs;function Vi(t){return(t>0)-(t<0)||+t}function Bi(){if(!this.isValid())return this.localeData().invalidDate();var t,e,i=Wi(this._milliseconds)/1e3,n=Wi(this._days),o=Wi(this._months);t=k(i/60),e=k(t/60),i%=60,t%=60;var r=k(o/12),s=o%=12,a=n,l=e,h=t,u=i?i.toFixed(3).replace(/\.?0+$/,""):"",d=this.asSeconds();if(!d)return"P0D";var c=d<0?"-":"",p=Vi(this._months)!==Vi(d)?"-":"",m=Vi(this._days)!==Vi(d)?"-":"",f=Vi(this._milliseconds)!==Vi(d)?"-":"";return c+"P"+(r?p+r+"Y":"")+(s?p+s+"M":"")+(a?m+a+"D":"")+(l||h||u?"T":"")+(l?f+l+"H":"")+(h?f+h+"M":"")+(u?f+u+"S":"")}var Ui=Ee.prototype;return Ui.isValid=function(){return this._isValid},Ui.abs=function(){var t=this._data;return this._milliseconds=vi(this._milliseconds),this._days=vi(this._days),this._months=vi(this._months),t.milliseconds=vi(t.milliseconds),t.seconds=vi(t.seconds),t.minutes=vi(t.minutes),t.hours=vi(t.hours),t.months=vi(t.months),t.years=vi(t.years),this},Ui.add=function(t,e){return gi(this,t,e,1)},Ui.subtract=function(t,e){return gi(this,t,e,-1)},Ui.as=function(t){if(!this.isValid())return NaN;var e,i,n=this._milliseconds;if("month"===(t=N(t))||"quarter"===t||"year"===t)switch(e=this._days+n/864e5,i=this._months+bi(e),t){case"month":return i;case"quarter":return i/3;case"year":return i/12}else switch(e=this._days+Math.round(_i(this._months)),t){case"week":return e/7+n/6048e5;case"day":return e+n/864e5;case"hour":return 24*e+n/36e5;case"minute":return 1440*e+n/6e4;case"second":return 86400*e+n/1e3;case"millisecond":return Math.floor(864e5*e)+n;default:throw new Error("Unknown unit "+t)}},Ui.asMilliseconds=ki,Ui.asSeconds=xi,Ui.asMinutes=Di,Ui.asHours=Si,Ui.asDays=Mi,Ui.asWeeks=Ti,Ui.asMonths=Ci,Ui.asQuarters=Oi,Ui.asYears=Ei,Ui.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*x(this._months/12):NaN},Ui._bubble=function(){var t,e,i,n,o,r=this._milliseconds,s=this._days,a=this._months,l=this._data;return r>=0&&s>=0&&a>=0||r<=0&&s<=0&&a<=0||(r+=864e5*yi(_i(a)+s),s=0,a=0),l.milliseconds=r%1e3,t=k(r/1e3),l.seconds=t%60,e=k(t/60),l.minutes=e%60,i=k(e/60),l.hours=i%24,s+=k(i/24),o=k(bi(s)),a+=o,s-=yi(_i(o)),n=k(a/12),a%=12,l.days=s,l.months=a,l.years=n,this},Ui.clone=function(){return ze(this)},Ui.get=function(t){return t=N(t),this.isValid()?this[t+"s"]():NaN},Ui.milliseconds=Li,Ui.seconds=Ii,Ui.minutes=Ai,Ui.hours=Ni,Ui.days=Yi,Ui.weeks=function(){return k(this.days()/7)},Ui.months=Ri,Ui.years=ji,Ui.humanize=function(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),i=Gi(this,!t,e);return t&&(i=e.pastFuture(+this,i)),e.postformat(i)},Ui.toISOString=Bi,Ui.toString=Bi,Ui.toJSON=Bi,Ui.locale=Ze,Ui.localeData=$e,Ui.toIsoString=M("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Bi),Ui.lang=Ke,V("X",0,0,"unix"),V("x",0,0,"valueOf"),ut("x",rt),ut("X",/[+-]?\d+(\.\d{1,3})?/),mt("X",(function(t,e,i){i._d=new Date(1e3*parseFloat(t,10))})),mt("x",(function(t,e,i){i._d=new Date(x(t))})),o.version="2.24.0",e=Se,o.fn=ui,o.min=function(){var t=[].slice.call(arguments,0);return Ce("isBefore",t)},o.max=function(){var t=[].slice.call(arguments,0);return Ce("isAfter",t)},o.now=function(){return Date.now?Date.now():+new Date},o.utc=p,o.unix=function(t){return Se(1e3*t)},o.months=function(t,e){return mi(t,e,"months")},o.isDate=h,o.locale=re,o.invalid=v,o.duration=ze,o.isMoment=w,o.weekdays=function(t,e,i){return fi(t,e,i,"weekdays")},o.parseZone=function(){return Se.apply(null,arguments).parseZone()},o.localeData=ae,o.isDuration=Pe,o.monthsShort=function(t,e){return mi(t,e,"monthsShort")},o.weekdaysMin=function(t,e,i){return fi(t,e,i,"weekdaysMin")},o.defineLocale=se,o.updateLocale=function(t,e){if(null!=e){var i,n,o=te;null!=(n=oe(t))&&(o=n._config),(i=new L(e=P(o,e))).parentLocale=ee[t],ee[t]=i,re(t)}else null!=ee[t]&&(null!=ee[t].parentLocale?ee[t]=ee[t].parentLocale:null!=ee[t]&&delete ee[t]);return ee[t]},o.locales=function(){return T(ee)},o.weekdaysShort=function(t,e,i){return fi(t,e,i,"weekdaysShort")},o.normalizeUnits=N,o.relativeTimeRounding=function(t){return void 0===t?Fi:"function"==typeof t&&(Fi=t,!0)},o.relativeTimeThreshold=function(t,e){return void 0!==Hi[t]&&(void 0===e?Hi[t]:(Hi[t]=e,"s"===t&&(Hi.ss=e-1),!0))},o.calendarFormat=function(t,e){var i=t.diff(e,"days",!0);return i<-6?"sameElse":i<-1?"lastWeek":i<0?"lastDay":i<1?"sameDay":i<2?"nextDay":i<7?"nextWeek":"sameElse"},o.prototype=ui,o.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},o}()})),s=(n((function(t,e){(function(t){function e(t,e,i,n){var o={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?o[i][0]:o[i][1]}t.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})(r)})),n((function(t,e){(function(t){var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),i="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),n=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],o=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;t.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,n){return t?/-MMM-/.test(n)?i[t.month()]:e[t.month()]:e},monthsRegex:o,monthsShortRegex:o,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})})(r)})),n((function(t,e){(function(t){t.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(t,e){switch(e){case"D":return t+(1===t?"er":"");default:case"M":case"Q":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}},week:{dow:1,doy:4}})})(r)})),n((function(t,e){(function(t){t.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(t){return(/^[0-9].+$/.test(t)?"tra":"in")+" "+t},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})})(r)})),n((function(t,e){(function(t){t.defineLocale("ja",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日(ddd) HH:mm"},meridiemParse:/午前|午後/i,isPM:function(t){return"午後"===t},meridiem:function(t,e,i){return t<12?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:function(t){return t.week()=20?"ste":"de")},week:{dow:1,doy:4}})})(r)})),n((function(t,e){(function(t){var e="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),i="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");function n(t){return t%10<5&&t%10>1&&~~(t/10)%10!=1}function o(t,e,i){var o=t+" ";switch(i){case"ss":return o+(n(t)?"sekundy":"sekund");case"m":return e?"minuta":"minutę";case"mm":return o+(n(t)?"minuty":"minut");case"h":return e?"godzina":"godzinę";case"hh":return o+(n(t)?"godziny":"godzin");case"MM":return o+(n(t)?"miesiące":"miesięcy");case"yy":return o+(n(t)?"lata":"lat")}}t.defineLocale("pl",{months:function(t,n){return t?""===n?"("+i[t.month()]+"|"+e[t.month()]+")":/D MMMM/.test(n)?i[t.month()]:e[t.month()]:e},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_śr_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedzielę o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W środę o] LT";case 6:return"[W sobotę o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:o,m:o,mm:o,h:o,hh:o,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:o,y:"rok",yy:o},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})(r)})),n((function(t,e){(function(t){function e(t,e,i){var n,o;return"m"===i?e?"минута":"минуту":t+" "+(n=+t,o={ss:e?"секунда_секунды_секунд":"секунду_секунды_секунд",mm:e?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"}[i].split("_"),n%10==1&&n%100!=11?o[0]:n%10>=2&&n%10<=4&&(n%100<10||n%100>=20)?o[1]:o[2])}var i=[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[йя]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i];t.defineLocale("ru",{months:{format:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_"),standalone:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_")},monthsShort:{format:"янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.".split("_"),standalone:"янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.".split("_")},weekdays:{standalone:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),format:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_"),isFormat:/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/},weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:i,longMonthsParse:i,shortMonthsParse:i,monthsRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,monthsShortRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,monthsStrictRegex:/^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,monthsShortStrictRegex:/^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., H:mm",LLLL:"dddd, D MMMM YYYY г., H:mm"},calendar:{sameDay:"[Сегодня, в] LT",nextDay:"[Завтра, в] LT",lastDay:"[Вчера, в] LT",nextWeek:function(t){if(t.week()===this.week())return 2===this.day()?"[Во] dddd, [в] LT":"[В] dddd, [в] LT";switch(this.day()){case 0:return"[В следующее] dddd, [в] LT";case 1:case 2:case 4:return"[В следующий] dddd, [в] LT";case 3:case 5:case 6:return"[В следующую] dddd, [в] LT"}},lastWeek:function(t){if(t.week()===this.week())return 2===this.day()?"[Во] dddd, [в] LT":"[В] dddd, [в] LT";switch(this.day()){case 0:return"[В прошлое] dddd, [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd, [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd, [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",ss:e,m:e,mm:e,h:"час",hh:e,d:"день",dd:e,M:"месяц",MM:e,y:"год",yy:e},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(t){return/^(дня|вечера)$/.test(t)},meridiem:function(t,e,i){return t<4?"ночи":t<12?"утра":t<17?"дня":"вечера"},dayOfMonthOrdinalParse:/\d{1,2}-(й|го|я)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":return t+"-й";case"D":return t+"-го";case"w":case"W":return t+"-я";default:return t}},week:{dow:1,doy:4}})})(r)})),n((function(t,e){(function(t){function e(t,e,i){var n,o;return"m"===i?e?"хвилина":"хвилину":"h"===i?e?"година":"годину":t+" "+(n=+t,o={ss:e?"секунда_секунди_секунд":"секунду_секунди_секунд",mm:e?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:e?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"}[i].split("_"),n%10==1&&n%100!=11?o[0]:n%10>=2&&n%10<=4&&(n%100<10||n%100>=20)?o[1]:o[2])}function i(t){return function(){return t+"о"+(11===this.hours()?"б":"")+"] LT"}}t.defineLocale("uk",{months:{format:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_"),standalone:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_")},monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:function(t,e){var i={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")};return!0===t?i.nominative.slice(1,7).concat(i.nominative.slice(0,1)):t?i[/(\[[ВвУу]\]) ?dddd/.test(e)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(e)?"genitive":"nominative"][t.day()]:i.nominative},weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., HH:mm",LLLL:"dddd, D MMMM YYYY р., HH:mm"},calendar:{sameDay:i("[Сьогодні "),nextDay:i("[Завтра "),lastDay:i("[Вчора "),nextWeek:i("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return i("[Минулої] dddd [").call(this);case 1:case 2:case 4:return i("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",ss:e,m:e,mm:e,h:"годину",hh:e,d:"день",dd:e,M:"місяць",MM:e,y:"рік",yy:e},meridiemParse:/ночі|ранку|дня|вечора/,isPM:function(t){return/^(дня|вечора)$/.test(t)},meridiem:function(t,e,i){return t<4?"ночі":t<12?"ранку":t<17?"дня":"вечора"},dayOfMonthOrdinalParse:/\d{1,2}-(й|го)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t+"-й";case"D":return t+"-го";default:return t}},week:{dow:1,doy:7}})})(r)})),function(t){return t&&t.Math==Math&&t}),a=s("object"==typeof globalThis&&globalThis)||s("object"==typeof window&&window)||s("object"==typeof self&&self)||s("object"==typeof e&&e)||Function("return this")(),l=function(t){try{return!!t()}catch(t){return!0}},h=!l((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),u={}.propertyIsEnumerable,d=Object.getOwnPropertyDescriptor,c={f:d&&!u.call({1:2},1)?function(t){var e=d(this,t);return!!e&&e.enumerable}:u},p=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},m={}.toString,f=function(t){return m.call(t).slice(8,-1)},v="".split,g=l((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==f(t)?v.call(t,""):Object(t)}:Object,y=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t},b=function(t){return g(y(t))},_=function(t){return"object"==typeof t?null!==t:"function"==typeof t},w=function(t,e){if(!_(t))return t;var i,n;if(e&&"function"==typeof(i=t.toString)&&!_(n=i.call(t)))return n;if("function"==typeof(i=t.valueOf)&&!_(n=i.call(t)))return n;if(!e&&"function"==typeof(i=t.toString)&&!_(n=i.call(t)))return n;throw TypeError("Can't convert object to primitive value")},k={}.hasOwnProperty,x=function(t,e){return k.call(t,e)},D=a.document,S=_(D)&&_(D.createElement),M=function(t){return S?D.createElement(t):{}},T=!h&&!l((function(){return 7!=Object.defineProperty(M("div"),"a",{get:function(){return 7}}).a})),C=Object.getOwnPropertyDescriptor,O={f:h?C:function(t,e){if(t=b(t),e=w(e,!0),T)try{return C(t,e)}catch(t){}if(x(t,e))return p(!c.f.call(t,e),t[e])}},E=/#|\.prototype\./,P=function(t,e){var i=I[L(t)];return i==N||i!=A&&("function"==typeof e?l(e):!!e)},L=P.normalize=function(t){return String(t).replace(E,".").toLowerCase()},I=P.data={},A=P.NATIVE="N",N=P.POLYFILL="P",Y=P,R={},j=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t},F=function(t,e,i){if(j(t),void 0===e)return t;switch(i){case 0:return function(){return t.call(e)};case 1:return function(i){return t.call(e,i)};case 2:return function(i,n){return t.call(e,i,n)};case 3:return function(i,n,o){return t.call(e,i,n,o)}}return function(){return t.apply(e,arguments)}},H=function(t){if(!_(t))throw TypeError(String(t)+" is not an object");return t},z=Object.defineProperty,G={f:h?z:function(t,e,i){if(H(t),e=w(e,!0),H(i),T)try{return z(t,e,i)}catch(t){}if("get"in i||"set"in i)throw TypeError("Accessors not supported");return"value"in i&&(t[e]=i.value),t}},W=h?function(t,e,i){return G.f(t,e,p(1,i))}:function(t,e,i){return t[e]=i,t},V=O.f,B=function(t){var e=function(e,i,n){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,i)}return new t(e,i,n)}return t.apply(this,arguments)};return e.prototype=t.prototype,e},U=function(t,e){var i,n,o,r,s,l,h,u,d=t.target,c=t.global,p=t.stat,m=t.proto,f=c?a:p?a[d]:(a[d]||{}).prototype,v=c?R:R[d]||(R[d]={}),g=v.prototype;for(o in e)i=!Y(c?o:d+(p?".":"#")+o,t.forced)&&f&&x(f,o),s=v[o],i&&(l=t.noTargetGet?(u=V(f,o))&&u.value:f[o]),r=i&&l?l:e[o],i&&typeof s==typeof r||(h=t.bind&&i?F(r,a):t.wrap&&i?B(r):m&&"function"==typeof r?F(Function.call,r):r,(t.sham||r&&r.sham||s&&s.sham)&&W(h,"sham",!0),v[o]=h,m&&(x(R,n=d+"Prototype")||W(R,n,{}),R[n][o]=r,t.real&&g&&!g[o]&&W(g,o,r)))};U({target:"Object",stat:!0,forced:!h,sham:!h},{defineProperty:G.f});var X=n((function(t){var e=R.Object,i=t.exports=function(t,i,n){return e.defineProperty(t,i,n)};e.defineProperty.sham&&(i.sham=!0)})),q=X,Z=Math.ceil,K=Math.floor,$=function(t){return isNaN(t=+t)?0:(t>0?K:Z)(t)},J=Math.min,Q=function(t){return t>0?J($(t),9007199254740991):0},tt=Math.max,et=Math.min,it=function(t,e){var i=$(t);return i<0?tt(i+e,0):et(i,e)},nt=function(t){return function(e,i,n){var o,r=b(e),s=Q(r.length),a=it(n,s);if(t&&i!=i){for(;s>a;)if((o=r[a++])!=o)return!0}else for(;s>a;a++)if((t||a in r)&&r[a]===i)return t||a||0;return!t&&-1}},ot={includes:nt(!0),indexOf:nt(!1)},rt={},st=ot.indexOf,at=function(t,e){var i,n=b(t),o=0,r=[];for(i in n)!x(rt,i)&&x(n,i)&&r.push(i);for(;e.length>o;)x(n,i=e[o++])&&(~st(r,i)||r.push(i));return r},lt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],ht=Object.keys||function(t){return at(t,lt)},ut=h?Object.defineProperties:function(t,e){H(t);for(var i,n=ht(e),o=n.length,r=0;o>r;)G.f(t,i=n[r++],e[i]);return t};U({target:"Object",stat:!0,forced:!h,sham:!h},{defineProperties:ut});var dt=n((function(t){var e=R.Object,i=t.exports=function(t,i){return e.defineProperties(t,i)};e.defineProperties.sham&&(i.sham=!0)})),ct=function(t){return"function"==typeof t?t:void 0},pt=function(t,e){return arguments.length<2?ct(R[t])||ct(a[t]):R[t]&&R[t][e]||a[t]&&a[t][e]},mt=lt.concat("length","prototype"),ft={f:Object.getOwnPropertyNames||function(t){return at(t,mt)}},vt={f:Object.getOwnPropertySymbols},gt=pt("Reflect","ownKeys")||function(t){var e=ft.f(H(t)),i=vt.f;return i?e.concat(i(t)):e},yt=function(t,e,i){var n=w(e);n in t?G.f(t,n,p(0,i)):t[n]=i};U({target:"Object",stat:!0,sham:!h},{getOwnPropertyDescriptors:function(t){for(var e,i,n=b(t),o=O.f,r=gt(n),s={},a=0;r.length>a;)void 0!==(i=o(n,e=r[a++]))&&yt(s,e,i);return s}});var bt=R.Object.getOwnPropertyDescriptors,_t=O.f,wt=l((function(){_t(1)}));U({target:"Object",stat:!0,forced:!h||wt,sham:!h},{getOwnPropertyDescriptor:function(t,e){return _t(b(t),e)}});var kt,xt=n((function(t){var e=R.Object,i=t.exports=function(t,i){return e.getOwnPropertyDescriptor(t,i)};e.getOwnPropertyDescriptor.sham&&(i.sham=!0)})),Dt=!!Object.getOwnPropertySymbols&&!l((function(){return!String(Symbol())})),St=Dt&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Mt=Array.isArray||function(t){return"Array"==f(t)},Tt=function(t){return Object(y(t))},Ct=pt("document","documentElement"),Ot=a["__core-js_shared__"]||function(t,e){try{W(a,t,e)}catch(i){a[t]=e}return e}("__core-js_shared__",{}),Et=n((function(t){(t.exports=function(t,e){return Ot[t]||(Ot[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.6.4",mode:"pure",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),Pt=0,Lt=Math.random(),It=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++Pt+Lt).toString(36)},At=Et("keys"),Nt=function(t){return At[t]||(At[t]=It(t))},Yt=Nt("IE_PROTO"),Rt=function(){},jt=function(t){return"