From 3751379f1e9a4c215fb6eb898b4ccc67659b9ace Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 10 May 2022 21:51:50 +0700 Subject: initial commit 2 --- .../web/static/src/js/_deprecated/basic_fields.js | 154 + addons/web/static/src/js/_deprecated/data.js | 852 ++++ addons/web/static/src/js/apps.js | 171 + addons/web/static/src/js/boot.js | 335 ++ addons/web/static/src/js/chrome/abstract_action.js | 192 + .../static/src/js/chrome/abstract_web_client.js | 556 +++ addons/web/static/src/js/chrome/action_manager.js | 939 ++++ .../src/js/chrome/action_manager_act_window.js | 732 +++ .../static/src/js/chrome/action_manager_report.js | 203 + addons/web/static/src/js/chrome/action_mixin.js | 235 + addons/web/static/src/js/chrome/apps_menu.js | 102 + .../src/js/chrome/keyboard_navigation_mixin.js | 261 + addons/web/static/src/js/chrome/loading.js | 80 + addons/web/static/src/js/chrome/menu.js | 243 + addons/web/static/src/js/chrome/root_widget.js | 7 + addons/web/static/src/js/chrome/systray_menu.js | 65 + addons/web/static/src/js/chrome/user_menu.js | 132 + addons/web/static/src/js/chrome/web_client.js | 238 + addons/web/static/src/js/common_env.js | 101 + addons/web/static/src/js/component_extension.js | 42 + .../web/static/src/js/components/action_menus.js | 197 + .../static/src/js/components/custom_checkbox.js | 58 + .../static/src/js/components/custom_file_input.js | 88 + addons/web/static/src/js/components/datepicker.js | 263 + .../web/static/src/js/components/dropdown_menu.js | 174 + .../static/src/js/components/dropdown_menu_item.js | 102 + addons/web/static/src/js/components/pager.js | 225 + .../static/src/js/control_panel/comparison_menu.js | 63 + .../static/src/js/control_panel/control_panel.js | 223 + .../control_panel/control_panel_model_extension.js | 1658 +++++++ .../src/js/control_panel/control_panel_x2many.js | 40 + .../src/js/control_panel/custom_favorite_item.js | 152 + .../src/js/control_panel/custom_filter_item.js | 275 ++ .../src/js/control_panel/custom_group_by_item.js | 46 + .../static/src/js/control_panel/favorite_menu.js | 107 + .../web/static/src/js/control_panel/filter_menu.js | 79 + .../static/src/js/control_panel/groupby_menu.js | 98 + .../web/static/src/js/control_panel/search_bar.js | 493 ++ .../static/src/js/control_panel/search_utils.js | 542 ++ addons/web/static/src/js/core/abstract_service.js | 91 + .../static/src/js/core/abstract_storage_service.js | 88 + addons/web/static/src/js/core/ajax.js | 582 +++ addons/web/static/src/js/core/browser_detection.js | 20 + addons/web/static/src/js/core/bus.js | 19 + addons/web/static/src/js/core/class.js | 155 + addons/web/static/src/js/core/collections.js | 44 + addons/web/static/src/js/core/concurrency.js | 323 ++ addons/web/static/src/js/core/context.js | 53 + addons/web/static/src/js/core/custom_hooks.js | 118 + .../static/src/js/core/data_comparison_utils.js | 139 + addons/web/static/src/js/core/dialog.js | 494 ++ addons/web/static/src/js/core/dom.js | 734 +++ addons/web/static/src/js/core/domain.js | 433 ++ addons/web/static/src/js/core/local_storage.js | 54 + addons/web/static/src/js/core/math_utils.js | 73 + addons/web/static/src/js/core/misc.js | 236 + addons/web/static/src/js/core/mixins.js | 418 ++ addons/web/static/src/js/core/mvc.js | 250 + addons/web/static/src/js/core/owl_dialog.js | 275 ++ addons/web/static/src/js/core/patch_mixin.js | 80 + addons/web/static/src/js/core/popover.js | 328 ++ addons/web/static/src/js/core/py_utils.js | 562 +++ addons/web/static/src/js/core/qweb.js | 62 + addons/web/static/src/js/core/ram_storage.js | 82 + addons/web/static/src/js/core/registry.js | 154 + addons/web/static/src/js/core/rpc.js | 128 + addons/web/static/src/js/core/service_mixins.js | 282 ++ addons/web/static/src/js/core/session.js | 414 ++ addons/web/static/src/js/core/session_storage.js | 56 + .../static/src/js/core/smooth_scroll_on_drag.js | 389 ++ addons/web/static/src/js/core/time.js | 352 ++ addons/web/static/src/js/core/translation.js | 132 + addons/web/static/src/js/core/utils.js | 1028 ++++ addons/web/static/src/js/core/widget.js | 447 ++ addons/web/static/src/js/env.js | 16 + addons/web/static/src/js/fields/abstract_field.js | 621 +++ .../web/static/src/js/fields/abstract_field_owl.js | 648 +++ addons/web/static/src/js/fields/basic_fields.js | 3757 ++++++++++++++ .../web/static/src/js/fields/basic_fields_owl.js | 132 + addons/web/static/src/js/fields/field_registry.js | 101 + .../web/static/src/js/fields/field_registry_owl.js | 26 + addons/web/static/src/js/fields/field_utils.js | 762 +++ addons/web/static/src/js/fields/field_wrapper.js | 157 + .../web/static/src/js/fields/relational_fields.js | 3460 +++++++++++++ addons/web/static/src/js/fields/signature.js | 173 + addons/web/static/src/js/fields/special_fields.js | 262 + addons/web/static/src/js/fields/upgrade_fields.js | 199 + addons/web/static/src/js/libs/autocomplete.js | 38 + addons/web/static/src/js/libs/bootstrap.js | 131 + .../web/static/src/js/libs/content-disposition.js | 249 + addons/web/static/src/js/libs/daterangepicker.js | 24 + addons/web/static/src/js/libs/download.js | 153 + addons/web/static/src/js/libs/fullcalendar.js | 252 + addons/web/static/src/js/libs/jquery.js | 235 + addons/web/static/src/js/libs/pdfjs.js | 20 + addons/web/static/src/js/libs/popper.js | 2 + addons/web/static/src/js/libs/underscore.js | 52 + addons/web/static/src/js/libs/zoomodoo.js | 353 ++ addons/web/static/src/js/main.js | 29 + addons/web/static/src/js/model.js | 505 ++ addons/web/static/src/js/owl_compatibility.js | 540 ++ addons/web/static/src/js/promise_extension.js | 22 + addons/web/static/src/js/public/lazyloader.js | 111 + .../static/src/js/public/public_crash_manager.js | 31 + addons/web/static/src/js/public/public_env.js | 11 + .../static/src/js/public/public_notification.js | 9 + addons/web/static/src/js/public/public_root.js | 336 ++ .../static/src/js/public/public_root_instance.js | 33 + addons/web/static/src/js/public/public_widget.js | 356 ++ addons/web/static/src/js/report/client_action.js | 124 + addons/web/static/src/js/report/report.js | 42 + addons/web/static/src/js/report/utils.js | 26 + addons/web/static/src/js/services/ajax_service.js | 41 + addons/web/static/src/js/services/config.js | 122 + addons/web/static/src/js/services/core.js | 49 + addons/web/static/src/js/services/crash_manager.js | 412 ++ .../src/js/services/crash_manager_service.js | 9 + addons/web/static/src/js/services/data_manager.js | 225 + .../src/js/services/local_storage_service.js | 20 + .../static/src/js/services/notification_service.js | 111 + .../web/static/src/js/services/report_service.js | 35 + addons/web/static/src/js/services/session.js | 12 + .../src/js/services/session_storage_service.js | 20 + addons/web/static/src/js/tools/debug_manager.js | 127 + .../static/src/js/tools/debug_manager_backend.js | 807 +++ addons/web/static/src/js/tools/test_menus.js | 321 ++ .../web/static/src/js/tools/test_menus_loader.js | 12 + addons/web/static/src/js/tools/tools.js | 22 + .../web/static/src/js/views/abstract_controller.js | 607 +++ addons/web/static/src/js/views/abstract_model.js | 286 ++ .../web/static/src/js/views/abstract_renderer.js | 217 + .../static/src/js/views/abstract_renderer_owl.js | 72 + addons/web/static/src/js/views/abstract_view.js | 440 ++ addons/web/static/src/js/views/action_model.js | 236 + .../static/src/js/views/basic/basic_controller.js | 883 ++++ .../web/static/src/js/views/basic/basic_model.js | 5190 ++++++++++++++++++++ .../static/src/js/views/basic/basic_renderer.js | 926 ++++ addons/web/static/src/js/views/basic/basic_view.js | 454 ++ .../static/src/js/views/basic/widget_registry.js | 27 + .../src/js/views/calendar/calendar_controller.js | 477 ++ .../static/src/js/views/calendar/calendar_model.js | 777 +++ .../src/js/views/calendar/calendar_popover.js | 220 + .../src/js/views/calendar/calendar_quick_create.js | 114 + .../src/js/views/calendar/calendar_renderer.js | 1006 ++++ .../static/src/js/views/calendar/calendar_view.js | 204 + .../web/static/src/js/views/field_manager_mixin.js | 166 + .../web/static/src/js/views/file_upload_mixin.js | 234 + .../src/js/views/file_upload_progress_bar.js | 76 + .../src/js/views/file_upload_progress_card.js | 52 + .../static/src/js/views/form/form_controller.js | 691 +++ .../web/static/src/js/views/form/form_renderer.js | 1211 +++++ addons/web/static/src/js/views/form/form_view.js | 201 + .../static/src/js/views/graph/graph_controller.js | 356 ++ .../web/static/src/js/views/graph/graph_model.js | 322 ++ .../static/src/js/views/graph/graph_renderer.js | 1099 +++++ addons/web/static/src/js/views/graph/graph_view.js | 162 + .../static/src/js/views/kanban/kanban_column.js | 411 ++ .../js/views/kanban/kanban_column_progressbar.js | 288 ++ .../js/views/kanban/kanban_column_quick_create.js | 246 + .../src/js/views/kanban/kanban_controller.js | 537 ++ .../js/views/kanban/kanban_examples_registry.js | 27 + .../web/static/src/js/views/kanban/kanban_model.js | 445 ++ .../static/src/js/views/kanban/kanban_record.js | 761 +++ .../js/views/kanban/kanban_record_quick_create.js | 315 ++ .../static/src/js/views/kanban/kanban_renderer.js | 684 +++ .../web/static/src/js/views/kanban/kanban_view.js | 119 + .../src/js/views/kanban/quick_create_form_view.js | 123 + .../src/js/views/list/list_confirm_dialog.js | 104 + .../static/src/js/views/list/list_controller.js | 992 ++++ .../src/js/views/list/list_editable_renderer.js | 1851 +++++++ addons/web/static/src/js/views/list/list_model.js | 175 + .../web/static/src/js/views/list/list_renderer.js | 1470 ++++++ addons/web/static/src/js/views/list/list_view.js | 137 + .../static/src/js/views/pivot/pivot_controller.js | 325 ++ .../web/static/src/js/views/pivot/pivot_model.js | 1569 ++++++ .../static/src/js/views/pivot/pivot_renderer.js | 202 + addons/web/static/src/js/views/pivot/pivot_view.js | 158 + addons/web/static/src/js/views/qweb/qweb_view.js | 208 + addons/web/static/src/js/views/renderer_wrapper.js | 15 + addons/web/static/src/js/views/sample_server.js | 692 +++ addons/web/static/src/js/views/search_panel.js | 214 + .../src/js/views/search_panel_model_extension.js | 789 +++ .../js/views/select_create_controllers_registry.js | 60 + addons/web/static/src/js/views/signature_dialog.js | 121 + .../src/js/views/standalone_field_manager_mixin.js | 64 + addons/web/static/src/js/views/view_dialogs.js | 484 ++ addons/web/static/src/js/views/view_registry.js | 44 + addons/web/static/src/js/views/view_utils.js | 92 + .../web/static/src/js/widgets/attach_document.js | 139 + .../web/static/src/js/widgets/change_password.js | 75 + addons/web/static/src/js/widgets/colorpicker.js | 699 +++ addons/web/static/src/js/widgets/data_export.js | 688 +++ addons/web/static/src/js/widgets/date_picker.js | 358 ++ .../web/static/src/js/widgets/domain_selector.js | 987 ++++ .../src/js/widgets/domain_selector_dialog.js | 54 + addons/web/static/src/js/widgets/iframe_widget.js | 65 + .../static/src/js/widgets/model_field_selector.js | 615 +++ .../static/src/js/widgets/name_and_signature.js | 662 +++ addons/web/static/src/js/widgets/notification.js | 176 + addons/web/static/src/js/widgets/pie_chart.js | 102 + addons/web/static/src/js/widgets/rainbow_man.js | 71 + addons/web/static/src/js/widgets/ribbon.js | 48 + addons/web/static/src/js/widgets/signature.js | 97 + .../static/src/js/widgets/switch_company_menu.js | 127 + .../static/src/js/widgets/translation_dialog.js | 183 + 205 files changed, 71535 insertions(+) create mode 100644 addons/web/static/src/js/_deprecated/basic_fields.js create mode 100644 addons/web/static/src/js/_deprecated/data.js create mode 100644 addons/web/static/src/js/apps.js create mode 100644 addons/web/static/src/js/boot.js create mode 100644 addons/web/static/src/js/chrome/abstract_action.js create mode 100644 addons/web/static/src/js/chrome/abstract_web_client.js create mode 100644 addons/web/static/src/js/chrome/action_manager.js create mode 100644 addons/web/static/src/js/chrome/action_manager_act_window.js create mode 100644 addons/web/static/src/js/chrome/action_manager_report.js create mode 100644 addons/web/static/src/js/chrome/action_mixin.js create mode 100644 addons/web/static/src/js/chrome/apps_menu.js create mode 100644 addons/web/static/src/js/chrome/keyboard_navigation_mixin.js create mode 100644 addons/web/static/src/js/chrome/loading.js create mode 100644 addons/web/static/src/js/chrome/menu.js create mode 100644 addons/web/static/src/js/chrome/root_widget.js create mode 100644 addons/web/static/src/js/chrome/systray_menu.js create mode 100644 addons/web/static/src/js/chrome/user_menu.js create mode 100644 addons/web/static/src/js/chrome/web_client.js create mode 100644 addons/web/static/src/js/common_env.js create mode 100644 addons/web/static/src/js/component_extension.js create mode 100644 addons/web/static/src/js/components/action_menus.js create mode 100644 addons/web/static/src/js/components/custom_checkbox.js create mode 100644 addons/web/static/src/js/components/custom_file_input.js create mode 100644 addons/web/static/src/js/components/datepicker.js create mode 100644 addons/web/static/src/js/components/dropdown_menu.js create mode 100644 addons/web/static/src/js/components/dropdown_menu_item.js create mode 100644 addons/web/static/src/js/components/pager.js create mode 100644 addons/web/static/src/js/control_panel/comparison_menu.js create mode 100644 addons/web/static/src/js/control_panel/control_panel.js create mode 100644 addons/web/static/src/js/control_panel/control_panel_model_extension.js create mode 100644 addons/web/static/src/js/control_panel/control_panel_x2many.js create mode 100644 addons/web/static/src/js/control_panel/custom_favorite_item.js create mode 100644 addons/web/static/src/js/control_panel/custom_filter_item.js create mode 100644 addons/web/static/src/js/control_panel/custom_group_by_item.js create mode 100644 addons/web/static/src/js/control_panel/favorite_menu.js create mode 100644 addons/web/static/src/js/control_panel/filter_menu.js create mode 100644 addons/web/static/src/js/control_panel/groupby_menu.js create mode 100644 addons/web/static/src/js/control_panel/search_bar.js create mode 100644 addons/web/static/src/js/control_panel/search_utils.js create mode 100644 addons/web/static/src/js/core/abstract_service.js create mode 100644 addons/web/static/src/js/core/abstract_storage_service.js create mode 100644 addons/web/static/src/js/core/ajax.js create mode 100644 addons/web/static/src/js/core/browser_detection.js create mode 100644 addons/web/static/src/js/core/bus.js create mode 100644 addons/web/static/src/js/core/class.js create mode 100644 addons/web/static/src/js/core/collections.js create mode 100644 addons/web/static/src/js/core/concurrency.js create mode 100644 addons/web/static/src/js/core/context.js create mode 100644 addons/web/static/src/js/core/custom_hooks.js create mode 100644 addons/web/static/src/js/core/data_comparison_utils.js create mode 100644 addons/web/static/src/js/core/dialog.js create mode 100644 addons/web/static/src/js/core/dom.js create mode 100644 addons/web/static/src/js/core/domain.js create mode 100644 addons/web/static/src/js/core/local_storage.js create mode 100644 addons/web/static/src/js/core/math_utils.js create mode 100644 addons/web/static/src/js/core/misc.js create mode 100644 addons/web/static/src/js/core/mixins.js create mode 100644 addons/web/static/src/js/core/mvc.js create mode 100644 addons/web/static/src/js/core/owl_dialog.js create mode 100644 addons/web/static/src/js/core/patch_mixin.js create mode 100644 addons/web/static/src/js/core/popover.js create mode 100644 addons/web/static/src/js/core/py_utils.js create mode 100644 addons/web/static/src/js/core/qweb.js create mode 100644 addons/web/static/src/js/core/ram_storage.js create mode 100644 addons/web/static/src/js/core/registry.js create mode 100644 addons/web/static/src/js/core/rpc.js create mode 100644 addons/web/static/src/js/core/service_mixins.js create mode 100644 addons/web/static/src/js/core/session.js create mode 100644 addons/web/static/src/js/core/session_storage.js create mode 100644 addons/web/static/src/js/core/smooth_scroll_on_drag.js create mode 100644 addons/web/static/src/js/core/time.js create mode 100644 addons/web/static/src/js/core/translation.js create mode 100644 addons/web/static/src/js/core/utils.js create mode 100644 addons/web/static/src/js/core/widget.js create mode 100644 addons/web/static/src/js/env.js create mode 100644 addons/web/static/src/js/fields/abstract_field.js create mode 100644 addons/web/static/src/js/fields/abstract_field_owl.js create mode 100644 addons/web/static/src/js/fields/basic_fields.js create mode 100644 addons/web/static/src/js/fields/basic_fields_owl.js create mode 100644 addons/web/static/src/js/fields/field_registry.js create mode 100644 addons/web/static/src/js/fields/field_registry_owl.js create mode 100644 addons/web/static/src/js/fields/field_utils.js create mode 100644 addons/web/static/src/js/fields/field_wrapper.js create mode 100644 addons/web/static/src/js/fields/relational_fields.js create mode 100644 addons/web/static/src/js/fields/signature.js create mode 100644 addons/web/static/src/js/fields/special_fields.js create mode 100644 addons/web/static/src/js/fields/upgrade_fields.js create mode 100644 addons/web/static/src/js/libs/autocomplete.js create mode 100644 addons/web/static/src/js/libs/bootstrap.js create mode 100644 addons/web/static/src/js/libs/content-disposition.js create mode 100644 addons/web/static/src/js/libs/daterangepicker.js create mode 100644 addons/web/static/src/js/libs/download.js create mode 100644 addons/web/static/src/js/libs/fullcalendar.js create mode 100644 addons/web/static/src/js/libs/jquery.js create mode 100644 addons/web/static/src/js/libs/pdfjs.js create mode 100644 addons/web/static/src/js/libs/popper.js create mode 100644 addons/web/static/src/js/libs/underscore.js create mode 100644 addons/web/static/src/js/libs/zoomodoo.js create mode 100644 addons/web/static/src/js/main.js create mode 100644 addons/web/static/src/js/model.js create mode 100644 addons/web/static/src/js/owl_compatibility.js create mode 100644 addons/web/static/src/js/promise_extension.js create mode 100644 addons/web/static/src/js/public/lazyloader.js create mode 100644 addons/web/static/src/js/public/public_crash_manager.js create mode 100644 addons/web/static/src/js/public/public_env.js create mode 100644 addons/web/static/src/js/public/public_notification.js create mode 100644 addons/web/static/src/js/public/public_root.js create mode 100644 addons/web/static/src/js/public/public_root_instance.js create mode 100644 addons/web/static/src/js/public/public_widget.js create mode 100644 addons/web/static/src/js/report/client_action.js create mode 100644 addons/web/static/src/js/report/report.js create mode 100644 addons/web/static/src/js/report/utils.js create mode 100644 addons/web/static/src/js/services/ajax_service.js create mode 100644 addons/web/static/src/js/services/config.js create mode 100644 addons/web/static/src/js/services/core.js create mode 100644 addons/web/static/src/js/services/crash_manager.js create mode 100644 addons/web/static/src/js/services/crash_manager_service.js create mode 100644 addons/web/static/src/js/services/data_manager.js create mode 100644 addons/web/static/src/js/services/local_storage_service.js create mode 100644 addons/web/static/src/js/services/notification_service.js create mode 100644 addons/web/static/src/js/services/report_service.js create mode 100644 addons/web/static/src/js/services/session.js create mode 100644 addons/web/static/src/js/services/session_storage_service.js create mode 100644 addons/web/static/src/js/tools/debug_manager.js create mode 100644 addons/web/static/src/js/tools/debug_manager_backend.js create mode 100644 addons/web/static/src/js/tools/test_menus.js create mode 100644 addons/web/static/src/js/tools/test_menus_loader.js create mode 100644 addons/web/static/src/js/tools/tools.js create mode 100644 addons/web/static/src/js/views/abstract_controller.js create mode 100644 addons/web/static/src/js/views/abstract_model.js create mode 100644 addons/web/static/src/js/views/abstract_renderer.js create mode 100644 addons/web/static/src/js/views/abstract_renderer_owl.js create mode 100644 addons/web/static/src/js/views/abstract_view.js create mode 100644 addons/web/static/src/js/views/action_model.js create mode 100644 addons/web/static/src/js/views/basic/basic_controller.js create mode 100644 addons/web/static/src/js/views/basic/basic_model.js create mode 100644 addons/web/static/src/js/views/basic/basic_renderer.js create mode 100644 addons/web/static/src/js/views/basic/basic_view.js create mode 100644 addons/web/static/src/js/views/basic/widget_registry.js create mode 100644 addons/web/static/src/js/views/calendar/calendar_controller.js create mode 100644 addons/web/static/src/js/views/calendar/calendar_model.js create mode 100644 addons/web/static/src/js/views/calendar/calendar_popover.js create mode 100644 addons/web/static/src/js/views/calendar/calendar_quick_create.js create mode 100644 addons/web/static/src/js/views/calendar/calendar_renderer.js create mode 100644 addons/web/static/src/js/views/calendar/calendar_view.js create mode 100644 addons/web/static/src/js/views/field_manager_mixin.js create mode 100644 addons/web/static/src/js/views/file_upload_mixin.js create mode 100644 addons/web/static/src/js/views/file_upload_progress_bar.js create mode 100644 addons/web/static/src/js/views/file_upload_progress_card.js create mode 100644 addons/web/static/src/js/views/form/form_controller.js create mode 100644 addons/web/static/src/js/views/form/form_renderer.js create mode 100644 addons/web/static/src/js/views/form/form_view.js create mode 100644 addons/web/static/src/js/views/graph/graph_controller.js create mode 100644 addons/web/static/src/js/views/graph/graph_model.js create mode 100644 addons/web/static/src/js/views/graph/graph_renderer.js create mode 100644 addons/web/static/src/js/views/graph/graph_view.js create mode 100644 addons/web/static/src/js/views/kanban/kanban_column.js create mode 100644 addons/web/static/src/js/views/kanban/kanban_column_progressbar.js create mode 100644 addons/web/static/src/js/views/kanban/kanban_column_quick_create.js create mode 100644 addons/web/static/src/js/views/kanban/kanban_controller.js create mode 100644 addons/web/static/src/js/views/kanban/kanban_examples_registry.js create mode 100644 addons/web/static/src/js/views/kanban/kanban_model.js create mode 100644 addons/web/static/src/js/views/kanban/kanban_record.js create mode 100644 addons/web/static/src/js/views/kanban/kanban_record_quick_create.js create mode 100644 addons/web/static/src/js/views/kanban/kanban_renderer.js create mode 100644 addons/web/static/src/js/views/kanban/kanban_view.js create mode 100644 addons/web/static/src/js/views/kanban/quick_create_form_view.js create mode 100644 addons/web/static/src/js/views/list/list_confirm_dialog.js create mode 100644 addons/web/static/src/js/views/list/list_controller.js create mode 100644 addons/web/static/src/js/views/list/list_editable_renderer.js create mode 100644 addons/web/static/src/js/views/list/list_model.js create mode 100644 addons/web/static/src/js/views/list/list_renderer.js create mode 100644 addons/web/static/src/js/views/list/list_view.js create mode 100644 addons/web/static/src/js/views/pivot/pivot_controller.js create mode 100644 addons/web/static/src/js/views/pivot/pivot_model.js create mode 100644 addons/web/static/src/js/views/pivot/pivot_renderer.js create mode 100644 addons/web/static/src/js/views/pivot/pivot_view.js create mode 100644 addons/web/static/src/js/views/qweb/qweb_view.js create mode 100644 addons/web/static/src/js/views/renderer_wrapper.js create mode 100644 addons/web/static/src/js/views/sample_server.js create mode 100644 addons/web/static/src/js/views/search_panel.js create mode 100644 addons/web/static/src/js/views/search_panel_model_extension.js create mode 100644 addons/web/static/src/js/views/select_create_controllers_registry.js create mode 100644 addons/web/static/src/js/views/signature_dialog.js create mode 100644 addons/web/static/src/js/views/standalone_field_manager_mixin.js create mode 100644 addons/web/static/src/js/views/view_dialogs.js create mode 100644 addons/web/static/src/js/views/view_registry.js create mode 100644 addons/web/static/src/js/views/view_utils.js create mode 100644 addons/web/static/src/js/widgets/attach_document.js create mode 100644 addons/web/static/src/js/widgets/change_password.js create mode 100644 addons/web/static/src/js/widgets/colorpicker.js create mode 100644 addons/web/static/src/js/widgets/data_export.js create mode 100644 addons/web/static/src/js/widgets/date_picker.js create mode 100644 addons/web/static/src/js/widgets/domain_selector.js create mode 100644 addons/web/static/src/js/widgets/domain_selector_dialog.js create mode 100644 addons/web/static/src/js/widgets/iframe_widget.js create mode 100644 addons/web/static/src/js/widgets/model_field_selector.js create mode 100644 addons/web/static/src/js/widgets/name_and_signature.js create mode 100644 addons/web/static/src/js/widgets/notification.js create mode 100644 addons/web/static/src/js/widgets/pie_chart.js create mode 100644 addons/web/static/src/js/widgets/rainbow_man.js create mode 100644 addons/web/static/src/js/widgets/ribbon.js create mode 100644 addons/web/static/src/js/widgets/signature.js create mode 100644 addons/web/static/src/js/widgets/switch_company_menu.js create mode 100644 addons/web/static/src/js/widgets/translation_dialog.js (limited to 'addons/web/static/src/js') diff --git a/addons/web/static/src/js/_deprecated/basic_fields.js b/addons/web/static/src/js/_deprecated/basic_fields.js new file mode 100644 index 00000000..2a70c379 --- /dev/null +++ b/addons/web/static/src/js/_deprecated/basic_fields.js @@ -0,0 +1,154 @@ +//////////////////////////////////////////////////////////////////////////////// +// /!\ DEPRECATED +// +// Legacy Field Widgets are added in this file when they are converted into +// Owl Component. +//////////////////////////////////////////////////////////////////////////////// + +odoo.define('web.basic_fields.deprecated', function (require) { +"use strict"; + +/** + * This module contains most of the basic (meaning: non relational) field + * widgets. Field widgets are supposed to be used in views inheriting from + * BasicView, so, they can work with the records obtained from a BasicModel. + */ + +var AbstractField = require('web.AbstractField'); +var core = require('web.core'); + +var _lt = core._lt; + +var FieldBoolean = AbstractField.extend({ + className: 'o_field_boolean', + description: _lt("Checkbox"), + events: _.extend({}, AbstractField.prototype.events, { + change: '_onChange', + }), + supportedFieldTypes: ['boolean'], + + //-------------------------------------------------------------------------- + // Public + //-------------------------------------------------------------------------- + + /** + * Toggle the checkbox if it is activated due to a click on itself. + * + * @override + */ + activate: function (options) { + var activated = this._super.apply(this, arguments); + // The formatValue of boolean fields renders HTML elements similar to + // the one rendered by the widget itself. Even though the event might + // have been fired on the non-widget version of this field, we can still + // test the presence of its custom class. + if (activated && options && options.event && $(options.event.target).closest('.custom-control.custom-checkbox').length) { + this._setValue(!this.value); // Toggle the checkbox + } + return activated; + }, + + /** + * @override + * @returns {jQuery} the focusable checkbox input + */ + getFocusableElement: function () { + return this.mode === 'readonly' ? $() : this.$input; + }, + /** + * A boolean field is always set since false is a valid value. + * + * @override + */ + isSet: function () { + return true; + }, + /** + * When the checkbox is rerendered, we need to check if it was the actual + * origin of the reset. If it is, we need to activate it back so it looks + * like it was not rerendered but is still the same input. + * + * @override + */ + reset: function (record, event) { + var rendered = this._super.apply(this, arguments); + if (event && event.target.name === this.name) { + this.activate(); + } + return rendered; + }, + /** + * Associates the 'for' attribute of the internal label. + * + * @override + */ + setIDForLabel: function (id) { + this._super.apply(this, arguments); + this.$('.custom-control-label').attr('for', id); + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * The actual checkbox is designed in css to have full control over its + * appearance, as opposed to letting the browser and the os decide how + * a checkbox should look. The actual input is disabled and hidden. In + * readonly mode, the checkbox is disabled. + * + * @override + * @private + */ + _render: function () { + var $checkbox = this._formatValue(this.value); + this.$input = $checkbox.find('input'); + this.$input.prop('disabled', this.mode === 'readonly'); + this.$el.addClass($checkbox.attr('class')); + this.$el.empty().append($checkbox.contents()); + }, + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * Properly update the value when the checkbox is (un)ticked to trigger + * possible onchanges. + * + * @private + */ + _onChange: function () { + this._setValue(this.$input[0].checked); + }, + /** + * Implement keyboard movements. Mostly useful for its environment, such + * as a list view. + * + * @override + * @private + * @param {KeyEvent} ev + */ + _onKeydown: function (ev) { + switch (ev.which) { + case $.ui.keyCode.ENTER: + // prevent subsequent 'click' event (see _onKeydown of AbstractField) + ev.preventDefault(); + this.$input.prop('checked', !this.value); + this._setValue(!this.value); + return; + case $.ui.keyCode.UP: + case $.ui.keyCode.RIGHT: + case $.ui.keyCode.DOWN: + case $.ui.keyCode.LEFT: + ev.preventDefault(); + } + this._super.apply(this, arguments); + }, +}); + +return { + FieldBoolean: FieldBoolean, +}; + +}); diff --git a/addons/web/static/src/js/_deprecated/data.js b/addons/web/static/src/js/_deprecated/data.js new file mode 100644 index 00000000..71ae101d --- /dev/null +++ b/addons/web/static/src/js/_deprecated/data.js @@ -0,0 +1,852 @@ +odoo.define('web.data', function (require) { +"use strict"; + +var Class = require('web.Class'); +var Context = require('web.Context'); +var concurrency = require('web.concurrency'); +var mixins = require('web.mixins'); +var session = require('web.session'); +var translation = require('web.translation'); +var pyUtils = require('web.py_utils'); + +var _t = translation._t; + +/** + * Serializes the sort criterion array of a dataset into a form which can be + * consumed by OpenERP's RPC APIs. + * + * @param {Array} criterion array of fields, from first to last criteria, prefixed with '-' for reverse sorting + * @returns {String} SQL-like sorting string (``ORDER BY``) clause + */ +function serialize_sort(criterion) { + return _.map(criterion, + function (criteria) { + if (criteria[0] === '-') { + return criteria.slice(1) + ' DESC'; + } + return criteria + ' ASC'; + }).join(', '); +} + +/** + * Reverse of the serialize_sort function: convert an array of SQL-like sort + * descriptors into a list of fields prefixed with '-' if necessary. + */ +function deserialize_sort(criterion) { + return _.map(criterion, function (criteria) { + var split = _.without(criteria.split(' '), ''); + return (split[1] && split[1].toLowerCase() === 'desc' ? '-' : '') + split[0]; + }); +} + +var Query = Class.extend({ + init: function (model, fields) { + this._model = model; + this._fields = fields; + this._filter = []; + this._context = {}; + this._lazy = true; + this._limit = false; + this._offset = 0; + this._order_by = []; + }, + clone: function (to_set) { + to_set = to_set || {}; + var q = new Query(this._model, this._fields); + q._context = this._context; + q._filter = this._filter; + q._lazy = this._lazy; + q._limit = this._limit; + q._offset = this._offset; + q._order_by = this._order_by; + + for(var key in to_set) { + if (!to_set.hasOwnProperty(key)) { continue; } + switch(key) { + case 'filter': + q._filter = (q._filter || []).concat(to_set.filter || []); + break; + case 'context': + q._context = new Context( + q._context, to_set.context); + break; + case 'lazy': + case 'limit': + case 'offset': + case 'order_by': + q['_' + key] = to_set[key]; + } + } + return q; + }, + _execute: function (options) { + var self = this; + options = options || {}; + return session.rpc('/web/dataset/search_read', { + model: this._model.name, + fields: this._fields || false, + domain: pyUtils.eval('domains', + [this._model.domain(this._filter)]), + context: pyUtils.eval('contexts', + [this._model.context(this._context)]), + offset: this._offset, + limit: this._limit, + sort: serialize_sort(this._order_by) + }, options).then(function (results) { + self._count = results.length; + return results.records; + }, null); + }, + /** + * Fetches the first record matching the query, or null + * + * @param {Object} [options] additional options for the rpc() method + * @returns {Promise} + */ + first: function (options) { + var self = this; + return this.clone({limit: 1})._execute(options).then(function (records) { + delete self._count; + if (records.length) { return records[0]; } + return null; + }); + }, + /** + * Fetches all records matching the query + * + * @param {Object} [options] additional options for the rpc() method + * @returns {Promise>} + */ + all: function (options) { + return this._execute(options); + }, + /** + * Fetches the number of records matching the query in the database + * + * @returns {Promise} + */ + count: function () { + if (this._count !== undefined) { return Promise.resolve(this._count); } + return this._model.call( + 'search_count', [this._filter], { + context: this._model.context(this._context)}); + }, + /** + * Performs a groups read according to the provided grouping criterion + * + * @param {String|Array} grouping + * @returns {jQuery.Deferred> | null} + */ + group_by: function (grouping) { + var ctx = pyUtils.eval( + 'context', this._model.context(this._context)); + + // undefined passed in explicitly (!) + if (_.isUndefined(grouping)) { + grouping = []; + } + + if (!(grouping instanceof Array)) { + grouping = _.toArray(arguments); + } + if (_.isEmpty(grouping) && !ctx.group_by_no_leaf) { + return null; + } + var raw_fields = _.map(grouping.concat(this._fields || []), function (field) { + return field.split(':')[0]; + }); + + var self = this; + return this._model.call('read_group', { + groupby: grouping, + fields: _.uniq(raw_fields), + domain: this._model.domain(this._filter), + context: ctx, + offset: this._offset, + lazy: this._lazy, + limit: this._limit, + orderby: serialize_sort(this._order_by) || false + }).then(function (results) { + return _(results).map(function (result) { + // FIX: querygroup initialization + result.__context = result.__context || {}; + result.__context.group_by = result.__context.group_by || []; + _.defaults(result.__context, ctx); + var grouping_fields = self._lazy ? [grouping[0]] : grouping; + return new QueryGroup( + self._model.name, grouping_fields, result); + }); + }); + }, + /** + * Creates a new query with the union of the current query's context and + * the new context. + * + * @param context context data to add to the query + * @returns {openerp.web.Query} + */ + context: function (context) { + if (!context) { return this; } + return this.clone({context: context}); + }, + /** + * Creates a new query with the union of the current query's filter and + * the new domain. + * + * @param domain domain data to AND with the current query filter + * @returns {openerp.web.Query} + */ + filter: function (domain) { + if (!domain) { return this; } + return this.clone({filter: domain}); + }, + /** + * Creates a new query with the provided parameter lazy replacing the current + * query's own. + * + * @param {Boolean} lazy indicates if the read_group should return only the + * first level of groupby records, or should return the records grouped by + * all levels at once (so, it makes only 1 db request). + * @returns {openerp.web.Query} + */ + lazy: function (lazy) { + return this.clone({lazy: lazy}); + }, + /** + * Creates a new query with the provided limit replacing the current + * query's own limit + * + * @param {Number} limit maximum number of records the query should retrieve + * @returns {openerp.web.Query} + */ + limit: function (limit) { + return this.clone({limit: limit}); + }, + /** + * Creates a new query with the provided offset replacing the current + * query's own offset + * + * @param {Number} offset number of records the query should skip before starting its retrieval + * @returns {openerp.web.Query} + */ + offset: function (offset) { + return this.clone({offset: offset}); + }, + /** + * Creates a new query with the provided ordering parameters replacing + * those of the current query + * + * @param {String...} fields ordering clauses + * @returns {openerp.web.Query} + */ + order_by: function (fields) { + if (fields === undefined) { return this; } + if (!(fields instanceof Array)) { + fields = _.toArray(arguments); + } + if (_.isEmpty(fields)) { return this; } + return this.clone({order_by: fields}); + } +}); + +var QueryGroup = Class.extend({ + init: function (model, grouping_fields, read_group_group) { + // In cases where group_by_no_leaf and no group_by, the result of + // read_group has aggregate fields but no __context or __domain. + // Create default (empty) values for those so that things don't break + var fixed_group = _.extend( + {__context: {group_by: []}, __domain: []}, + read_group_group); + + var count_key = (grouping_fields[0] && grouping_fields[0].split(':')[0]) + '_count'; + var aggregates = {}; + for (var key in fixed_group) { + if (fixed_group.hasOwnProperty(key)) { + if (!(key.indexOf('__') === 0 + || _.contains(grouping_fields, key) + || (key === count_key))) { + aggregates[key] = fixed_group[key] || 0; + } + } + } + + this.model = new Model( + model, fixed_group.__context, fixed_group.__domain); + + var group_size = fixed_group[count_key] || fixed_group.__count || 0; + var leaf_group = fixed_group.__context.group_by.length === 0; + + var value = (grouping_fields.length === 1) + ? fixed_group[grouping_fields[0]] + : _.map(grouping_fields, function (field) { return fixed_group[field]; }); + var grouped_on = (grouping_fields.length === 1) + ? grouping_fields[0] + : grouping_fields; + this.attributes = { + folded: !!(fixed_group.__fold), + grouped_on: grouped_on, + // if terminal group (or no group) and group_by_no_leaf => use group.__count + length: group_size, + value: value, + // A group is open-able if it's not a leaf in group_by_no_leaf mode + has_children: !(leaf_group && fixed_group.__context.group_by_no_leaf), + + aggregates: aggregates + }; + }, + get: function (key) { + return this.attributes[key]; + }, + subgroups: function () { + return this.model.query().group_by(this.model.context().group_by); + }, + query: function () { + return this.model.query.apply(this.model, arguments); + } +}); + +var DataSet = Class.extend(mixins.PropertiesMixin, { + /** + * Collection of OpenERP records, used to share records and the current selection between views. + * + * @constructs instance.web.DataSet + * + * @param {String} model the OpenERP model this dataset will manage + */ + init: function (parent, model, context) { + mixins.PropertiesMixin.init.call(this); + this.setParent(parent); + this.model = model; + this.context = context || {}; + this.index = null; + this._sort = []; + this._model = new Model(model, context); + this.orderer = new concurrency.DropMisordered(); + }, + previous: function () { + this.index -= 1; + if (!this.ids.length) { + this.index = null; + } else if (this.index < 0) { + this.index = this.ids.length - 1; + } + return this; + }, + next: function () { + this.index += 1; + if (!this.ids.length) { + this.index = null; + } else if (this.index >= this.ids.length) { + this.index = 0; + } + return this; + }, + select_id: function (id) { + var idx = this.get_id_index(id); + if (idx === null) { + return false; + } else { + this.index = idx; + return true; + } + }, + get_id_index: function (id) { + for (var i=0, ii=this.ids.length; i= ids.length - 1) { + this.index = ids.length - 1; + } + }, + unlink: function (ids) { + this.set_ids(_.without.apply(null, [this.ids].concat(ids))); + this.trigger('unlink', ids); + return Promise.resolve({result: true}); + }, +}); + +var DataSetSearch = DataSet.extend({ + /** + * @constructs instance.web.DataSetSearch + * @extends instance.web.DataSet + * + * @param {Object} parent + * @param {String} model + * @param {Object} context + * @param {Array} domain + */ + init: function (parent, model, context, domain) { + this._super(parent, model, context); + this.domain = domain || []; + this._length = null; + this.ids = []; + this._model = new Model(model, context, domain); + }, + /** + * Read a slice of the records represented by this DataSet, based on its + * domain and context. + * + * @params {Object} options + * @param {Array} [options.fields] fields to read and return, by default all fields are returned + * @param {Object} [options.context] context data to add to the request payload, on top of the DataSet's own context + * @param {Array} [options.domain] domain data to add to the request payload, ANDed with the dataset's domain + * @param {Number} [options.offset=0] The index from which selected records should be returned + * @param {Number} [options.limit=null] The maximum number of records to return + * @returns {Promise} + */ + read_slice: function (fields, options) { + options = options || {}; + var self = this; + var q = this._model.query(fields || false) + .filter(options.domain) + .context(options.context) + .offset(options.offset || 0) + .limit(options.limit || false); + q = q.order_by.apply(q, this._sort); + + var prom = this.orderer.add(q.all()); + prom.then(function (records) { + // FIXME: not sure about that one, *could* have discarded count + q.count().then(function (count) { self._length = count; }); + self.ids = _(records).pluck('id'); + }); + return prom; + }, + get_domain: function (other_domain) { + return this._model.domain(other_domain); + }, + alter_ids: function (ids) { + this._super(ids); + if (this.index !== null && this.index >= this.ids.length) { + this.index = this.ids.length > 0 ? this.ids.length - 1 : 0; + } + }, + remove_ids: function (ids) { + var before = this.ids.length; + this._super(ids); + if (this._length) { + this._length -= (before - this.ids.length); + } + }, + add_ids: function (ids, at) { + var before = this.ids.length; + this._super(ids, at); + if(this._length){ + this._length += (this.ids.length - before); + } + }, + unlink: function (ids, callback, error_callback) { + var self = this; + var prom = this._super(ids); + prom.then(function () { + self.remove_ids( ids); + self.trigger("dataset_changed", ids, callback, error_callback); + }); + return prom; + }, + size: function () { + if (this._length !== null) { + return this._length; + } + return this._super(); + } +}); + +var data = { + Query: Query, + DataSet: DataSet, + DataSetStatic: DataSetStatic, + DataSetSearch: DataSetSearch, + /** @type String */ + noDisplayContent: "" + _t("Unnamed") + "", +}; + + +var Model = Class.extend({ + /** + new openerp.web.Model(name[, context[, domain]]) + + @constructs instance.web.Model + @extends instance.web.Class + + @param {String} name name of the OpenERP model this object is bound to + @param {Object} [context] + @param {Array} [domain] + */ + init: function(name, context, domain) { + this.name = name; + this._context = context || {}; + this._domain = domain || []; + }, + /** + * @deprecated does not allow to specify kwargs, directly use call() instead + */ + get_func: function (method_name) { + var self = this; + return function () { + return self.call(method_name, _.toArray(arguments)); + }; + }, + /** + * Fetches a Query instance bound to this model, for searching + * + * @param {Array} [fields] fields to ultimately fetch during the search + * @returns {instance.web.Query} + */ + query: function (fields) { + return new data.Query(this, fields); + }, + /** + * Fetches the model's domain, combined with the provided domain if any + * + * @param {Array} [domain] to combine with the model's internal domain + * @returns {Array} The model's internal domain, or the AND-ed union of the model's internal domain and the provided domain + */ + domain: function (domain) { + if (!domain) { return this._domain; } + return this._domain.concat(domain); + }, + /** + * Fetches the combination of the user's context and the domain context, + * combined with the provided context if any + * + * @param {Object} [context] to combine with the model's internal context + * @returns {web.Context} The union of the user's context and the model's internal context, as well as the provided context if any. In that order. + */ + context: function (context) { + return new Context(session.user_context, this._context, context || {}); + }, + /** + * Call a method (over RPC) on the bound OpenERP model. + * + * @param {String} method name of the method to call + * @param {Array} [args] positipyEvalonal arguments + * @param {Object} [kwargs] keyword arguments + * @param {Object} [options] additional options for the rpc() method + * @returns {Promise<>} call result + */ + call: function (method, args, kwargs, options) { + args = args || []; + kwargs = kwargs || {}; + if (!_.isArray(args)) { + // call(method, kwargs) + kwargs = args; + args = []; + } + pyUtils.ensure_evaluated(args, kwargs); + var call_kw = '/web/dataset/call_kw/' + this.name + '/' + method; + return session.rpc(call_kw, { + model: this.name, + method: method, + args: args, + kwargs: kwargs + }, options); + }, + call_button: function (method, args) { + pyUtils.ensure_evaluated(args, {}); + // context should be the last argument + var context = (args || []).length > 0 ? args.pop() : {}; + return session.rpc('/web/dataset/call_button', { + model: this.name, + method: method, + args: args || [], + kwargs: {context: context}, + }); + }, +}); + + +return data; + +}); diff --git a/addons/web/static/src/js/apps.js b/addons/web/static/src/js/apps.js new file mode 100644 index 00000000..364401d4 --- /dev/null +++ b/addons/web/static/src/js/apps.js @@ -0,0 +1,171 @@ +odoo.define('web.Apps', function (require) { +"use strict"; + +var AbstractAction = require('web.AbstractAction'); +var config = require('web.config'); +var core = require('web.core'); +var framework = require('web.framework'); +var session = require('web.session'); + +var _t = core._t; + +var apps_client = null; + +var Apps = AbstractAction.extend({ + contentTemplate: 'EmptyComponent', + remote_action_tag: 'loempia.embed', + failback_action_id: 'base.open_module_tree', + + init: function(parent, action) { + this._super(parent, action); + var options = action.params || {}; + this.params = options; // NOTE forwarded to embedded client action + }, + + get_client: function() { + // return the client via a promise, resolved or rejected depending if + // the remote host is available or not. + var check_client_available = function(client) { + var i = new Image(); + var def = new Promise(function (resolve, reject) { + i.onerror = function() { + reject(client); + }; + i.onload = function() { + resolve(client); + }; + }); + var ts = new Date().getTime(); + i.src = _.str.sprintf('%s/web/static/src/img/sep-a.gif?%s', client.origin, ts); + return def; + }; + if (apps_client) { + return check_client_available(apps_client); + } else { + return this._rpc({model: 'ir.module.module', method: 'get_apps_server'}) + .then(function(u) { + var link = $(_.str.sprintf('', u))[0]; + var host = _.str.sprintf('%s//%s', link.protocol, link.host); + var dbname = link.pathname; + if (dbname[0] === '/') { + dbname = dbname.substr(1); + } + var client = { + origin: host, + dbname: dbname + }; + apps_client = client; + return check_client_available(client); + }); + } + }, + + destroy: function() { + $(window).off("message." + this.uniq); + if (this.$ifr) { + this.$ifr.remove(); + this.$ifr = null; + } + return this._super(); + }, + + _on_message: function($e) { + var self = this, client = this.client, e = $e.originalEvent; + + if (e.origin !== client.origin) { + return; + } + + var dispatcher = { + 'event': function(m) { self.trigger('message:' + m.event, m); }, + 'action': function(m) { + self.do_action(m.action).then(function(r) { + var w = self.$ifr[0].contentWindow; + w.postMessage({id: m.id, result: r}, client.origin); + }); + }, + 'rpc': function(m) { + return self._rpc({route: m.args[0], params: m.args[1]}).then(function(r) { + var w = self.$ifr[0].contentWindow; + w.postMessage({id: m.id, result: r}, client.origin); + }); + }, + 'Model': function(m) { + return self._rpc({model: m.model, method: m.args[0], args: m.args[1]}) + .then(function(r) { + var w = self.$ifr[0].contentWindow; + w.postMessage({id: m.id, result: r}, client.origin); + }); + }, + }; + // console.log(e.data); + if (!_.isObject(e.data)) { return; } + if (dispatcher[e.data.type]) { + dispatcher[e.data.type](e.data); + } + }, + + start: function() { + var self = this; + return new Promise(function (resolve, reject) { + self.get_client().then(function (client) { + self.client = client; + + var qs = {db: client.dbname}; + if (config.isDebug()) { + qs.debug = odoo.debug; + } + var u = $.param.querystring(client.origin + "/apps/embed/client", qs); + var css = {width: '100%', height: '750px'}; + self.$ifr = $('