diff --git a/app_dynamic_list/__init__.py b/app_dynamic_list/__init__.py deleted file mode 100644 index faaaf799..00000000 --- a/app_dynamic_list/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- - - diff --git a/app_dynamic_list/__openerp__.py b/app_dynamic_list/__openerp__.py deleted file mode 100644 index 3f1dd57b..00000000 --- a/app_dynamic_list/__openerp__.py +++ /dev/null @@ -1,34 +0,0 @@ - -{ - 'name': 'App Customize Columns of List (Tree) View Dynamic', - 'version': '10.0.1.6', - 'author': 'Sunpop.cn', - 'category': 'Productivity', - 'website': 'http://www.odooapp.cn', - 'sequence': 2, - 'summary': 'App Customize columns of List (Tree) View. Dynamic list.', - 'description': """ - -App Customize Columns of List (Tree) View -============ -App Customize Columns of List (Tree) View module is made to show/hide the columns on the list/tree view of Odoo. After installing the module, a "Set Columns" button will be show to the list view. -You can customize every odoo list/tree view easily. - -This module is ready for Community and Enterprise Edition. - - """, - 'images': ['static/description/sales_coms.jpg' - ], - 'depends': ['web'], - 'data': [ - 'views/listview_button.xml', - ], - 'demo': [], - 'test': [ - ], - 'installable': True, - 'application': True, - 'auto_install': False, - 'qweb': ['static/src/xml/listview_button_view.xml'], -} - diff --git a/app_dynamic_list/i18n/zh_CN.po b/app_dynamic_list/i18n/zh_CN.po deleted file mode 100644 index c07d57f0..00000000 --- a/app_dynamic_list/i18n/zh_CN.po +++ /dev/null @@ -1,24 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * apps_material_backend_theme -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0c\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-07 08:57+0000\n" -"PO-Revision-Date: 2016-09-07 08:57+0000\n" -"Last-Translator: Ivan Deng <300883@qq.com>, 2017\n" -"Language-Team: Chinese (China) (https://www.transifex.com/odoo/teams/41243/zh_CN/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: app_dynamic_list -#. openerp-web -#: code:addons/apps_material_backend_theme/static/src/xml/listview_button_view.xml:121 -#, python-format -msgid "Set Columns" -msgstr "显示列" diff --git a/app_dynamic_list/images/dynamiclist_homepage.jpg b/app_dynamic_list/images/dynamiclist_homepage.jpg deleted file mode 100644 index 5563db16..00000000 Binary files a/app_dynamic_list/images/dynamiclist_homepage.jpg and /dev/null differ diff --git a/app_dynamic_list/static/description/icon.png b/app_dynamic_list/static/description/icon.png deleted file mode 100644 index 2a04f219..00000000 Binary files a/app_dynamic_list/static/description/icon.png and /dev/null differ diff --git a/app_dynamic_list/static/description/index.html b/app_dynamic_list/static/description/index.html deleted file mode 100644 index f75d97bc..00000000 --- a/app_dynamic_list/static/description/index.html +++ /dev/null @@ -1,62 +0,0 @@ -
-
-
-

Customize hide/show the columns on the list (tree) view dynamically

-
-

This moduld allows user to customize columns dynamically in list (tree) view of any object of any - installed module.

- -
-

"Set Columns" button contains all field(s) in dropdown with checkbox which will exist in - list view of current object. So if user wants to show/hide any field, then he/she has to just do - check/uncheck that respective checkbox besides field name in dropdown list and then just click on - "Apply" button.

-
-
-
- - -
- -
-
    -
  • Sales leads in Enterprise Edition

  • -
-
-
- -
-
- -
-
    -
  • Sales leads in Community Edition

  • -
-
- -
- -
-
-
- -
-
-
-
-

Technical Help & Support

-
-
-
-

- For any type of technical help & support requests, Feel free to contact us

- - guohuadeng@hotmail.com -
-
-
-
diff --git a/app_dynamic_list/static/description/sales_com.png b/app_dynamic_list/static/description/sales_com.png deleted file mode 100644 index 48b199f5..00000000 Binary files a/app_dynamic_list/static/description/sales_com.png and /dev/null differ diff --git a/app_dynamic_list/static/description/sales_ent.png b/app_dynamic_list/static/description/sales_ent.png deleted file mode 100644 index 55986b90..00000000 Binary files a/app_dynamic_list/static/description/sales_ent.png and /dev/null differ diff --git a/app_dynamic_list/static/src/css/my.css b/app_dynamic_list/static/src/css/my.css deleted file mode 100644 index e69de29b..00000000 diff --git a/app_dynamic_list/static/src/js/dynamic_list.js b/app_dynamic_list/static/src/js/dynamic_list.js deleted file mode 100644 index dd4f8470..00000000 --- a/app_dynamic_list/static/src/js/dynamic_list.js +++ /dev/null @@ -1,97 +0,0 @@ -odoo.define('app_dynamic_list.shcolumns', function (require) { -"use strict"; - -var core = require('web.core'); -var ListView = require('web.ListView'); -var QWeb = core.qweb; - -ListView.include({ - reload: function () { - this.setup_columns(this.fields_view.fields, this.grouped); - this.$el.html(QWeb.render(this._template, this)); - return this.reload_content(); - }, - - render_buttons: function($node) { - var self = this; - this._super($node); - this.$buttons.find('.oe_select_columns').click(this.proxy('my_setup_columns')); - this.$buttons.find('.oe_dropdown_btn').click(this.proxy('hide_show_columns')); - this.$buttons.find('.dropdown-menu').click(this.proxy('stop_event')); - }, - - my_setup_columns: function (fields, grouped) { - $("#showcb").toggle(); - var getcb = document.getElementById('showcb'); - this.visible_columns = _.filter(this.columns, function (column) { - var firstcheck = document.getElementById(column.id); - if(firstcheck == null) - { - var li= document.createElement("li"); - var description = document.createTextNode(column.string); - var checkbox = document.createElement("input"); - checkbox.id = column.id; - checkbox.type = "checkbox"; - checkbox.name = "cb"; - - if(column.invisible !== '1') - { - checkbox.checked = true; - } - li.appendChild(checkbox); - li.appendChild(description); - getcb.appendChild(li); - } - else - { - if(column.invisible !== '1') - { - firstcheck.checked = true; - } - else - { - firstcheck.checked = false; - } - } - }); - }, - stop_event : function(e) - { - e.stopPropagation(); - }, - - hide_show_columns : function() - { - $("#showcb").hide(); - this.setup_columns(this.fields_view.fields, this.grouped); - this.$el.html(QWeb.render(this._template, this)); - return this.reload_content(); - }, - - setup_columns: function (fields, grouped) { - this._super(fields, grouped); - this.visible_columns = _.filter(this.columns, function (column) { - var cbid = document.getElementById(column.id); - if(cbid !== null) - { - var cbid = cbid.checked; - if(cbid !== false) - { - column.invisible = '2'; - } - else - { - column.invisible = '1'; - } - } - return column.invisible !== '1'; - }); - this.aggregate_columns = _(this.visible_columns).invoke('to_aggregate'); - }, -}); - -$(document).click(function(){ - $("#showcb").hide(); -}); - -}); diff --git a/app_dynamic_list/static/src/xml/listview_button_view.xml b/app_dynamic_list/static/src/xml/listview_button_view.xml deleted file mode 100644 index a5c0e58f..00000000 --- a/app_dynamic_list/static/src/xml/listview_button_view.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -
- - - -
-
-
-
diff --git a/app_dynamic_list/views/listview_button.xml b/app_dynamic_list/views/listview_button.xml deleted file mode 100644 index fdad6af3..00000000 --- a/app_dynamic_list/views/listview_button.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - diff --git a/app_product_sequence/__init__.py b/app_product_sequence/__init__.py deleted file mode 100644 index 32e57aa9..00000000 --- a/app_product_sequence/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -''' -Created on 2017-10-28 -@author: 广州尚鹏,http://www.sunpop.cn -@email: 300883@qq.com -@resource of Sunpop -Odoo10离线中文用户手册下载 -http://www.sunpop.cn/odoo10_user_manual_document_offline/ -Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -http://www.sunpop.cn/odoo10_developer_document_offline/ - -@description: -''' - -import models -import controllers -from .hooks import pre_init_hook - diff --git a/app_product_sequence/__openerp__.py b/app_product_sequence/__openerp__.py deleted file mode 100644 index 2094e5d5..00000000 --- a/app_product_sequence/__openerp__.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-05 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: -{ - 'name': 'App Product Internal Type,Auto Sequence, Auto Code(Variants Supported)', - 'summary': 'Auto Internal Reference.', - "version": '10.0.2.2', - 'category': 'Sales', - 'author': 'Sunpop.cn', - 'website': 'http://www.sunpop.cn', - 'license': 'AGPL-3', - 'sequence': 2, - 'installable': True, - 'auto_install': False, - 'application': True, - 'images': ['static/description/set2.jpg'], - 'currency': 'EUR', - 'price': 98, - 'description': u""" - App Product Auto Sequence, Auto Code(Variants Supported) - - This module allows to associate a sequence to the product reference.
- The reference (default code) is unique (SQL constraint) and required.
- Support Product with or without Variants. - 1.Auto Sequence or code for every product.自动产品编码。 - 2.Auto Sequence or for every product variants, like product20171130-001.自动多规格产品编码,形式为 主产品编码-001。 - 3.Product code must be Unique.产品编码强制要求唯一。 - 4.Define different product type, each product type use own rule of sequence.可自定义产品类型,不同产品类型使用不同编码规则。 - 5.Quick access in sale , inventory, system menu.可以在销售、库存、系统菜单中快速定义。 - 6.Multi language support.
多语种支持。 - 7.Setup default Auto Sequence for each product category - """, - 'pre_init_hook': 'pre_init_hook', - 'depends': [ - 'product', - 'stock', - 'sale', - 'purchase', - 'mrp', - ], - 'data': [ - # 视图 - "security/ir.model.access.csv", - # "security/security.xml", - 'views/product_template_view.xml', - 'views/product_product_view.xml', - 'views/product_category_view.xml', - 'views/product_internal_type_view.xml', - 'data/product_sequence.xml', - ], - 'demo': [ - ], -} diff --git a/app_product_sequence/controllers/__init__.py b/app_product_sequence/controllers/__init__.py deleted file mode 100644 index 8ee9bae1..00000000 --- a/app_product_sequence/controllers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -import main diff --git a/app_product_sequence/controllers/main.py b/app_product_sequence/controllers/main.py deleted file mode 100644 index 40a96afc..00000000 --- a/app_product_sequence/controllers/main.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/app_product_sequence/controllers/product_sequence.xml b/app_product_sequence/controllers/product_sequence.xml deleted file mode 100644 index 7955665e..00000000 --- a/app_product_sequence/controllers/product_sequence.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - Sequence for All Products - product.product - P%(y)s%(month)s - 5 - - True - - - - Sequence for Manufactured Product - product.product - D%(y)s%(month)s - 5 - - True - - - - Sequence for Components Product - product.product - C%(y)s%(month)s - 5 - - True - - - - Sequence for Sourced Product - product.product - S%(y)s%(month)s - 5 - - True - - - - - Manufactured Product - Set prefix as "D" in link sequence - - - - Sourced Product - Set prefix as "S" in link sequence - - - - Components Product - Set prefix as "C" in link sequence - - - - - - internal_type - product.template - default - - - - - - diff --git a/app_product_sequence/data/product_sequence.xml b/app_product_sequence/data/product_sequence.xml deleted file mode 100644 index 906a9335..00000000 --- a/app_product_sequence/data/product_sequence.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - Sequence for All Products - product.product - PR%(y)s%(month)s - 5 - - True - - - - Sequence for Manufactured Product - product.product - CP%(y)s%(month)s - 5 - - True - - - - Sequence for Manufactured Components - product.product - BJ%(y)s%(month)s - 5 - - True - - - - Sequence for Sourced Material - product.product - BC%(y)s%(month)s - 5 - - True - - - - Sequence for Sourced Product - product.product - WL%(y)s%(month)s - 5 - - True - - - - - - - Manufactured Product - cp - product - 1 - 0 - - Set prefix as "CP" in link sequence - - - - - Manufactured Components - bj - product - 0 - 0 - - Set prefix as "BJ" in link sequence - - - - - Components Product - bc - product - 0 - 1 - - Set prefix as "BC" in link sequence - - - - - Sourced Product - wl - product - 1 - 1 - - Set prefix as "WL" in link sequence - - - - - - - internal_type - product.template - default - - - - - - diff --git a/app_product_sequence/data/product_sequence_dp.xml b/app_product_sequence/data/product_sequence_dp.xml deleted file mode 100644 index af3e9cc1..00000000 --- a/app_product_sequence/data/product_sequence_dp.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - Sequence for All Products - product.product - P%(y)s%(month)s - 5 - - True - - - - Sequence for Manufactured Product - product.product - D%(y)s%(month)s - 5 - - True - - - - Sequence for Components Product - product.product - C%(y)s%(month)s - 5 - - True - - - - Sequence for Sourced Product - product.product - S%(y)s%(month)s - 5 - - True - - - - - Manufactured Product - d - product - 1 - 0 - - Set prefix as "D" in link sequence - - - - Sourced Product - s - product - 1 - 1 - - Set prefix as "S" in link sequence - - - - Components Product - c - product - 0 - 1 - - Set prefix as "C" in link sequence - - - - - - internal_type - product.template - default - - - - - - diff --git a/app_product_sequence/data/product_sequence_felive.xml b/app_product_sequence/data/product_sequence_felive.xml deleted file mode 100644 index 058eb1ce..00000000 --- a/app_product_sequence/data/product_sequence_felive.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - Sequence for All Products - product.product - P%(y)s%(month)s - 5 - - True - - - - Sequence for Manufactured Product - product.product - CP%(y)s%(month)s - 5 - - True - - - - Sequence for Manufactured Components - product.product - BJ%(y)s%(month)s - 5 - - True - - - - Sequence for Sourced Material - product.product - BC%(y)s%(month)s - 5 - - True - - - - Sequence for Sourced Product - product.product - CL%(y)s%(month)s - 5 - - True - - - - - - - 成品 - cp - product - 1 - 0 - - 制造的成品。如:床,桌子 - - - - - 板件 - bj - product - 0 - 0 - - 制造的半成品。如:床的左侧板,柜子的顶板 - - - - - 原材料(板材) - bc - product - 0 - 1 - - 制造所需的原材料,不可直接销售。如:中纤板(厚14mm) - - - - - 外购成品 - cl - product - 1 - 1 - - 采购后可直接销售,也可当原材料的成品。如:门把手 - - - - - - - internal_type - product.template - default - - - - - - diff --git a/app_product_sequence/data/product_sequence_origin.xml b/app_product_sequence/data/product_sequence_origin.xml deleted file mode 100644 index 5a990647..00000000 --- a/app_product_sequence/data/product_sequence_origin.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - Sequence for All Products - product.product - P%(y)s%(month)s - 5 - - True - - - - Sequence for Manufactured Product - product.product - CP%(y)s%(month)s - 5 - - True - - - - Sequence for Manufactured Components - product.product - BJ%(y)s%(month)s - 5 - - True - - - - Sequence for Sourced Material - product.product - BC%(y)s%(month)s - 5 - - True - - - - Sequence for Sourced Product - product.product - CL%(y)s%(month)s - 5 - - True - - - - - - Manufactured Product - cp - Set prefix as "CP" in link sequence - - - - - Manufactured Components - bj - Set prefix as "BJ" in link sequence - - - - - Sourced Material - bc - Set prefix as "BC" in link sequence - - - - - Sourced Product - cl - Set prefix as "cl" in link sequence - - - - - - internal_type - product.template - default - - - - - - diff --git a/app_product_sequence/hooks.py b/app_product_sequence/hooks.py deleted file mode 100644 index 4a0ea85d..00000000 --- a/app_product_sequence/hooks.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-05 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: - -def pre_init_hook(cr): - """ - Updates existing codes matching the default 'New' or - empty. Primarily this ensures installation does not - fail for demo data. - :param cr: database cursor - :return: void - """ - cr.execute("UPDATE product_product " - "SET default_code = '!!PR!!' || id " - "WHERE default_code IS NULL OR default_code = 'New';") - - cr.execute("UPDATE product_template " - "Set default_code = " - "(select default_code from product_product " - "where product_product.product_tmpl_id = product_template.id limit 1)" - "WHERE default_code IS NULL OR default_code = 'New';") diff --git a/app_product_sequence/i18n/zh_CN.po b/app_product_sequence/i18n/zh_CN.po deleted file mode 100644 index 396e4a44..00000000 --- a/app_product_sequence/i18n/zh_CN.po +++ /dev/null @@ -1,221 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * app_product_sequence -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0-20171107\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-12-18 19:02+0000\n" -"PO-Revision-Date: 2017-12-18 19:02+0000\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: app_product_sequence -#: model:ir.model.fields,help:app_product_sequence.field_product_internal_type_type -msgid "A stockable product is a product for which you manage stock. The \"Inventory\" app has to be installed.\n" -"A consumable product, on the other hand, is a product for which stock is not managed.\n" -"A service is a non-material product you provide.\n" -"A digital content is a non-material product you sell online. The files attached to the products are the one that are sold on the e-commerce such as e-books, music, pictures,... The \"Digital Product\" module has to be installed." -msgstr "A stockable product is a product for which you manage stock. The \"Inventory\" app has to be installed.\n" -"A consumable product, on the other hand, is a product for which stock is not managed.\n" -"A service is a non-material product you provide.\n" -"A digital content is a non-material product you sell online. The files attached to the products are the one that are sold on the e-commerce such as e-books, music, pictures,... The \"Digital Product\" module has to be installed." - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_purchase_ok -msgid "Can be Purchased" -msgstr "可用于采购" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_rental -msgid "Can be Rent" -msgstr "可用于出租" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_sale_ok -msgid "Can be Sold" -msgstr "可用于销售" - -#. module: app_product_sequence -#: code:addons/app_product_sequence/models/product_internal_type.py:34 -#: selection:product.internal.type,type:0 -#, python-format -msgid "Consumable" -msgstr "可消耗" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_create_uid -msgid "Created by" -msgstr "创建人" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_create_date -msgid "Created on" -msgstr "创建时间" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_category_internal_type -msgid "Default Internal Type" -msgstr "默认产品内部类型" - -#. module: app_product_sequence -#: model:ir.ui.view,arch_db:app_product_sequence.product_internal_type_form_view -msgid "Auto Set Product's Value To:" -msgstr "自动设置产品默认参数为:" - -#. module: app_product_sequence -#: model:ir.model.fields,help:app_product_sequence.field_product_internal_type_route_ids -msgid "Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, MTO/MTS,..." -msgstr "取决于安装的模块,它允许在产品定义路线:购买,制造,MTO/MTS,等等..." - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_description -msgid "Description" -msgstr "说明" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_display_name -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_name -#: model:ir.ui.view,arch_db:app_product_sequence.product_internal_type_form_view -msgid "Display Name" -msgstr "显示名称" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_id -msgid "ID" -msgstr "ID" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_product_default_code_index -msgid "Internal Reference Index" -msgstr "Varient序号" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_product_default_code_stored -#: model:ir.model.fields,field_description:app_product_sequence.field_product_template_default_code_stored -msgid "Internal Reference Stored" -msgstr "主产品编码" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_product_internal_type -#: model:ir.model.fields,field_description:app_product_sequence.field_product_template_internal_type -msgid "Internal Type" -msgstr "内部类型(编码)" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type___last_update -msgid "Last Modified on" -msgstr "最后修改日" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_write_uid -msgid "Last Updated by" -msgstr "最后更新人" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_write_date -msgid "Last Updated on" -msgstr "最后更新时间" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_link_sequence -msgid "Link Sequence" -msgstr "使用的序列" - -#. module: app_product_sequence -#: code:addons/app_product_sequence/models/product_template.py:41 -#, python-format -msgid "Please save product first before adding varients!" -msgstr "增加产品变体前,请先保存当前产品!" - -#. module: app_product_sequence -#: model:ir.model.fields,help:app_product_sequence.field_product_internal_type_sequence_prefix -msgid "Prefix value of the record for the sequence" -msgstr "序列记录的前缀" - -#. module: app_product_sequence -#: model:ir.model,name:app_product_sequence.model_product_product -msgid "Product" -msgstr "产品" - -#. module: app_product_sequence -#: model:ir.model,name:app_product_sequence.model_product_category -msgid "Product Category" -msgstr "产品类别" - -#. module: app_product_sequence -#: model:ir.actions.act_window,name:app_product_sequence.internal_type_action -#: model:ir.ui.menu,name:app_product_sequence.menu_internal_type_action_sale -#: model:ir.ui.menu,name:app_product_sequence.menu_internal_type_action_stock -#: model:ir.ui.menu,name:app_product_sequence.menu_internal_type_action_sys -#: model:ir.ui.view,arch_db:app_product_sequence.product_internal_type_form_view -#: model:ir.ui.view,arch_db:app_product_sequence.product_internal_type_tree_view -msgid "Product Internal Type" -msgstr "内部类型(编码)" - -#. module: app_product_sequence -#: model:ir.model,name:app_product_sequence.model_product_template -msgid "Product Template" -msgstr "产品模板" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_type -msgid "Product Type" -msgstr "产品类型" - -#. module: app_product_sequence -#: code:addons/app_product_sequence/models/product_product.py:83 -#, python-format -msgid "Product varient can only create in Product view!" -msgstr "请在产品管理页面增加产品的多属性!" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_route_ids -msgid "Routes" -msgstr "路线" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_sequence_prefix -msgid "Sequence Prefix" -msgstr "编号前缀" - -#. module: app_product_sequence -#: code:addons/app_product_sequence/models/product_internal_type.py:35 -#: selection:product.internal.type,type:0 -#, python-format -msgid "Service" -msgstr "服务" - -#. module: app_product_sequence -#: model:ir.model.fields,help:app_product_sequence.field_product_internal_type_sale_ok -msgid "Specify if the product can be selected in a sales order line." -msgstr "如果产品能在销售单明细在被选择,则指定。" - -#. module: app_product_sequence -#: code:addons/app_product_sequence/models/product_internal_type.py:36 -#: selection:product.internal.type,type:0 -#, python-format -msgid "Stockable Product" -msgstr "可库存产品" - -#. module: app_product_sequence -#: sql_constraint:product.internal.type:0 -#: sql_constraint:product.product:0 -msgid "The reference must be unique" -msgstr "产品内部编码不可重复!" - -#. module: app_product_sequence -#: model:ir.model.fields,field_description:app_product_sequence.field_product_internal_type_ref -msgid "Unique Code" -msgstr "唯一编码" - -#. module: app_product_sequence -#: model:ir.model,name:app_product_sequence.model_product_internal_type -msgid "product.internal.type" -msgstr "product.internal.type" - diff --git a/app_product_sequence/models/__init__.py b/app_product_sequence/models/__init__.py deleted file mode 100644 index e312570a..00000000 --- a/app_product_sequence/models/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# -*- coding: utf-8 -*- -import product_template -import product_product -import product_category -import product_internal_type \ No newline at end of file diff --git a/app_product_sequence/models/product_category.py b/app_product_sequence/models/product_category.py deleted file mode 100644 index 841b8f20..00000000 --- a/app_product_sequence/models/product_category.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-28 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: - -from openerp import api, fields, models, exceptions, _ - - -class ProductCategory(models.Model): - _name = "product.category" - _inherit = ['product.category'] - - internal_type = fields.Many2one( - 'product.internal.type', 'Default Internal Type', - auto_join=True, required=False) diff --git a/app_product_sequence/models/product_internal_type.py b/app_product_sequence/models/product_internal_type.py deleted file mode 100644 index 9eaf84de..00000000 --- a/app_product_sequence/models/product_internal_type.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-05 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: - -from openerp import api, fields, models, _ - - -class ProductInternalType(models.Model): - _name = "product.internal.type" - - name = fields.Char('Display Name', default='Normal', translate=True) - description = fields.Char('Description') - ref = fields.Char('Unique Code', required=True) - - link_sequence = fields.Many2one( - 'ir.sequence', 'Link Sequence', - auto_join=True, required=True, domain="[('code', '=', 'product.product')]") - sequence_prefix = fields.Char(u'Sequence Prefix', related='link_sequence.prefix', readonly=True, store=False) - # 各种默认值,填则自动录入,不填则不管 - type = fields.Selection([ - ('consu', _('Consumable')), - ('service', _('Service')), - ('product', _('Stockable Product'))], string='Product Type', - help='A stockable product is a product for which you manage stock. The "Inventory" app has to be installed.\n' - 'A consumable product, on the other hand, is a product for which stock is not managed.\n' - 'A service is a non-material product you provide.\n' - 'A digital content is a non-material product you sell online. The files attached to the products are the one that are sold on ' - 'the e-commerce such as e-books, music, pictures,... The "Digital Product" module has to be installed.') - - rental = fields.Boolean('Can be Rent') - sale_ok = fields.Boolean( - 'Can be Sold', default=True, - help="Specify if the product can be selected in a sales order line.") - purchase_ok = fields.Boolean('Can be Purchased', default=True) - - # 使用目录的默认路线来处理,暂时不用内部类型路线 - route_ids = fields.Many2many('stock.location.route', string='Routes', - domain=[('product_selectable', '=', True)], - help="Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, MTO/MTS,...") - - # company_id = fields.Many2one( - # 'res.company', 'Company', - # default=lambda self: self.env.user.company_id.id, index=1) - - _sql_constraints = [ - ('uniq_ref', - 'unique(ref)', - 'The reference must be unique'), - ] \ No newline at end of file diff --git a/app_product_sequence/models/product_product.py b/app_product_sequence/models/product_product.py deleted file mode 100644 index 99b49892..00000000 --- a/app_product_sequence/models/product_product.py +++ /dev/null @@ -1,84 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-05 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: -from openerp import models, fields, api, exceptions, _ - - -class ProductProduct(models.Model): - _inherit = 'product.product' - - default_code = fields.Char('Internal Reference', index=True, readonly=True, default=lambda self: _('New'), copy=False) - default_code_index = fields.Integer('Internal Reference Index', readonly=True) - - _sql_constraints = [ - ('uniq_default_code', - 'unique(default_code)', - 'The reference must be unique'), - ] - - @api.model - def create(self, vals): - # todo: but 先建空白产品后,编辑给2个以上变体,序号会少个 -1 - # code_index: 当没有变体现时,值为0,有变体时,为该变体序号 - if 'default_code' not in vals or vals['default_code'] == 'New': - code_index = 0 - if 'product_tmpl_id' in vals: - template = self.env['product.template'].search([('id', '=', vals['product_tmpl_id'])], limit=1) - mylen = len(template.product_variant_ids) - # created from product_template - if 'product_tmpl_id' in vals: - template = self.env['product.template'].search([('id', '=', vals['product_tmpl_id'])], limit=1) - attr = vals['attribute_value_ids'][0][2] - if not(attr): - # 没有属性值,则是单规格产品。attribute_value_ids格式为[6,0,[]]。多规格时,attribute_value_ids格式为[6,0,[x]] - code_index = 0 - vals['default_code_index'] = code_index - vals['default_code'] = template.default_code_stored - elif mylen == 0: - # 有属性值了,自己是第一个规格 - code_index = 1 - vals['default_code_index'] = code_index - vals['default_code'] = template.default_code_stored + '-%03d'%(code_index) - elif mylen == 1: - # 已存在1个,当存在的1个有属性时,要改已存在的product值 - code_index = template.product_variant_ids[:1].default_code_index - if template.product_variant_ids[:1].attribute_value_ids: - if code_index == 0: - code_index = 1 - template.product_variant_ids[:1].default_code_index = code_index - template.product_variant_ids[:1].default_code = template.default_code_stored + '-%03d'%(code_index) - # 接着改当前操作的product值 - code_index = code_index + 1 - vals['default_code_index'] = code_index - vals['default_code'] = template.default_code_stored + '-%03d'%(code_index) - else: - # 找到最大的序号 - variant_max = max(template.product_variant_ids,key=lambda x: x['default_code_index']) - code_index = variant_max['default_code_index'] + 1 - vals['default_code_index'] = code_index - vals['default_code'] = template.default_code_stored + '-%03d'%(code_index) - else: - # create from product_product - sequence = self.env['product.internal.type'].search([('id', '=', vals['internal_type'])], limit=1) - if sequence: - vals['default_code'] = sequence.link_sequence.next_by_id() - return super(ProductProduct, self).create(vals) - - @api.multi - def copy(self, default=None): - if len(self.product_tmpl_id.product_variant_ids)>1 : - raise exceptions.ValidationError(_('Product varient can only create in Product view!')) - return super(ProductProduct, self).copy(default=None) diff --git a/app_product_sequence/models/product_template.py b/app_product_sequence/models/product_template.py deleted file mode 100644 index d0d01cca..00000000 --- a/app_product_sequence/models/product_template.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-05 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: - -from openerp import api, fields, models, exceptions, _ - - -class ProductTemplate(models.Model): - _name = "product.template" - _inherit = ['product.template'] - - # auto_join只要搜索product.template,自动会join。如果经常用到 internal_type 效率会高。 - internal_type = fields.Many2one( - 'product.internal.type', 'Internal Type', - auto_join=True, required=True) - - default_code = fields.Char( - 'Internal Reference', compute='_compute_default_code', - inverse='_set_default_code', store=True, readonly=True, - default='New', copy=False) - # 因为default_code有odoo的处理方式,影响面大,故会将其另存到 default_code_stored - default_code_stored = fields.Char('Internal Reference Stored',default='New') - - @api.model - def create(self, vals): - if 'attribute_line_ids' in vals: - if len(vals['attribute_line_ids'])>0: - raise exceptions.ValidationError(_('Please save product first before adding varients!')) - if 'default_code' not in vals or vals['default_code'] == 'New': - sequence = self.env['product.internal.type'].search([('id', '=', vals['internal_type'])], limit=1) - vals['default_code'] = sequence.link_sequence.next_by_id() - vals['default_code_stored'] = vals['default_code'] - return super(ProductTemplate, self).create(vals) - - @api.depends('product_variant_ids', 'product_variant_ids.default_code') - def _compute_default_code(self): - unique_variants = self.filtered(lambda template: len(template.product_variant_ids) == 1) - for template in unique_variants: - template.default_code = template.product_variant_ids.default_code - for template in (self): - if len(template.product_variant_ids)>1: - template.default_code = '' - - @api.one - def _set_default_code(self): - if len(self.product_variant_ids) == 1: - self.product_variant_ids.default_code = self.default_code_stored - - # 当内部类型变化时,改变产品模板的各默认值 - @api.onchange('internal_type') - def _onchange_internal_type(self): - if self.internal_type: - self.type = self.internal_type.type - self.rental = self.internal_type.rental - self.sale_ok = self.internal_type.sale_ok - self.purchase_ok = self.internal_type.purchase_ok - self.route_ids = self.internal_type.route_ids - - # 分类变动时,如果分类绑定了内部类型则联动 - @api.onchange('categ_id') - def _onchange_cate_id(self): - if self.categ_id and self.categ_id.internal_type: - self.internal_type = self.categ_id.internal_type \ No newline at end of file diff --git a/app_product_sequence/security/ir.model.access.csv b/app_product_sequence/security/ir.model.access.csv deleted file mode 100644 index 02697c29..00000000 --- a/app_product_sequence/security/ir.model.access.csv +++ /dev/null @@ -1,3 +0,0 @@ -id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_sale_order_type_manager,access_sale_order_type_manager,model_product_internal_type,sales_team.group_sale_manager,1,1,1,1 -access_sale_order_type_salesman,access_sale_order_type_salesman,model_product_internal_type,sales_team.group_sale_salesman,1,0,0,0 diff --git a/app_product_sequence/security/security.xml b/app_product_sequence/security/security.xml deleted file mode 100644 index 6d51531b..00000000 --- a/app_product_sequence/security/security.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - Product Internal Type multi-company - - ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] - - - - - - diff --git a/app_product_sequence/static/description/icon.png b/app_product_sequence/static/description/icon.png deleted file mode 100644 index 2a04f219..00000000 Binary files a/app_product_sequence/static/description/icon.png and /dev/null differ diff --git a/app_product_sequence/static/description/index.html b/app_product_sequence/static/description/index.html deleted file mode 100644 index 4ac12cc4..00000000 --- a/app_product_sequence/static/description/index.html +++ /dev/null @@ -1,162 +0,0 @@ -
-
-

App Product Auto Sequence, Auto Code(Variants Supported)

-
-

- This module allows to associate a sequence to the product reference.
- The reference (default code) is unique (SQL constraint) and required.
- Support Product with or without Variants. -

-
    -
  • - Auto Sequence or code for every product. -
  • -
  • - Auto Sequence or for every product variants, like product20171130-001. -
  • -
  • - Product code must be Unique. -
  • -
  • - Define different product type, each product type use own rule of sequence. -
  • -
  • - Quick access in sale , inventory, system menu. -
  • -
  • - Multi language support. -
  • -
-
- -
-
- -
-

Sample Rule: if we create on oct 2017

-
    -
  • - Manufactured Products: M20171100001 -
  • -
  • - Components Products: C20171100001 -
  • -
  • - Sourced Products: S20171100001 -
  • -
-

- Sepcial for variants. add [-00?]
-

    -
  • - Products with color[red]: M20171100001-001 -
  • -
  • - Products with color[blue]: M20171100001-002 -
  • -
  • - Products with color[white]: M20171100001-003 -
  • -
-

-

Installation:

-

- Prior to installing this module, if you have any existing products you should ensure they already have a - unique reference (or no reference) set.
- Products with a default_code of '/' or empty will automatically be assigned a code of "!!DP!!" followed - by the system id for that product.
- Otherwise the setting of the unique constraint will fail and the module will fail to install.
- - Notice:
- Odoo product variants is very special.
- When u create a product(not product template) with attribute, It would delete the first product, which - have no attribute. - So it's very normal that the first product variants begin wit ???-002.
- And we make a rule that the product variants can only create after you create normal product template. -

-

How to use: Very simple

-

- After installed the app. You can Go to anyone of the menu:
-

    -
  • - Sales->Configuration->Products->Product Internal Type -
  • -
  • - Inventory->Configuration->Products->Product Internal Type -
  • -
  • - Settings->Sequences & Identifiers->Product Internal Type -
  • -
-

-

- You would see the default Product Intertype we create. - -

- -
-

-

- And create the product and code by yourself. -

- -
-

-

- Notice: The "Sequence Code" Field of sequence must be "product.product" -

- -
-

- Go to Prior to installing this module, if you have any existing products you should ensure they already have - a - unique reference (or no reference) set.
- Products with a default_code of '/' or empty will automatically be assigned a code of "!!DP!!" followed - by the system id for that product.
- Otherwise the setting of the unique constraint will fail and the module will fail to install.
- - Notice:
- Odoo product variants is very special.
- When u create a product(not product template) with attribute, It would delete the first product, which - have no attribute. - So it's very normal that the first product variants begin wit ???-002.
- And we make a rule that the product variants can only create after you create normal product template. -

-
-
-
- -
-
- -
-
-
-

Technical Help & Support

-
-
-
-

- For any type of technical help & support requests, Feel free to contact us

- - guohuadeng@hotmail.com -

- Via QQ: 300883

- - 300883@qq.com -
-
-

- Visit our website for more support.

- - http://www.sunpop.cn -
-
-
-
\ No newline at end of file diff --git a/app_product_sequence/static/description/set1.jpg b/app_product_sequence/static/description/set1.jpg deleted file mode 100644 index 77910e22..00000000 Binary files a/app_product_sequence/static/description/set1.jpg and /dev/null differ diff --git a/app_product_sequence/static/description/set2.jpg b/app_product_sequence/static/description/set2.jpg deleted file mode 100644 index f05874e3..00000000 Binary files a/app_product_sequence/static/description/set2.jpg and /dev/null differ diff --git a/app_product_sequence/static/description/set3.jpg b/app_product_sequence/static/description/set3.jpg deleted file mode 100644 index 78c9e415..00000000 Binary files a/app_product_sequence/static/description/set3.jpg and /dev/null differ diff --git a/app_product_sequence/static/description/set4.jpg b/app_product_sequence/static/description/set4.jpg deleted file mode 100644 index f2d148cf..00000000 Binary files a/app_product_sequence/static/description/set4.jpg and /dev/null differ diff --git a/app_product_sequence/static/description/set5.jpg b/app_product_sequence/static/description/set5.jpg deleted file mode 100644 index 2d422293..00000000 Binary files a/app_product_sequence/static/description/set5.jpg and /dev/null differ diff --git a/app_product_sequence/tests/__init__.py b/app_product_sequence/tests/__init__.py deleted file mode 100644 index 269a938e..00000000 --- a/app_product_sequence/tests/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -''' -Created on 2017-10-28 -@author: 广州尚鹏,http://www.sunpop.cn -@email: 300883@qq.com -@resource of Sunpop -Odoo10离线中文用户手册下载 -http://www.sunpop.cn/odoo10_user_manual_document_offline/ -Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -http://www.sunpop.cn/odoo10_developer_document_offline/ - -@description: -''' - -from . import test_product_sequence diff --git a/app_product_sequence/tests/test_product_sequence.py b/app_product_sequence/tests/test_product_sequence.py deleted file mode 100644 index f275be4f..00000000 --- a/app_product_sequence/tests/test_product_sequence.py +++ /dev/null @@ -1,59 +0,0 @@ -# -*- coding: utf-8 -*- -''' -Created on 2017-10-28 -@author: 广州尚鹏,http://www.sunpop.cn -@email: 300883@qq.com -@resource of Sunpop -Odoo10离线中文用户手册下载 -http://www.sunpop.cn/odoo10_user_manual_document_offline/ -Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -http://www.sunpop.cn/odoo10_developer_document_offline/ - -@description: -''' - -from odoo.tests.common import TransactionCase -from ..hooks import pre_init_hook - - -class TestProductSequence(TransactionCase): - """Tests for creating product with and without Product Sequence""" - - def setUp(self): - super(TestProductSequence, self).setUp() - self.product_product = self.env['product.product'] - - def test_product_create_with_default_code(self): - product = self.product_product.create(dict( - name="Apple", - default_code='PROD01' - )) - self.assertEqual(product.default_code, 'PROD01') - - def test_product_create_without_default_code(self): - product_1 = self.product_product.create(dict( - name="Orange", - default_code='/')) - self.assertRegexpMatches(str(product_1.default_code), r'PR/*') - - def test_product_copy(self): - product_2 = self.product_product.create(dict( - name="Apple", - default_code='PROD02' - )) - copy_product_2 = product_2.copy() - self.assertEqual(copy_product_2.default_code, 'PROD02-copy') - - def test_pre_init_hook(self): - product_3 = self.product_product.create(dict( - name="Apple", - default_code='PROD03' - )) - self.cr.execute( - "update product_product set default_code='/' where id=%s" - % (product_3.id,)) - product_3.invalidate_cache() - self.assertEqual(product_3.default_code, '/') - pre_init_hook(self.cr) - product_3.invalidate_cache() - self.assertEqual(product_3.default_code, '!!mig!!%s' % (product_3.id,)) diff --git a/app_product_sequence/views/product_category_view.xml b/app_product_sequence/views/product_category_view.xml deleted file mode 100644 index 7e1b5c79..00000000 --- a/app_product_sequence/views/product_category_view.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - product.category.list.internal_type - product.category - - - - - - - - - - product.category.form._internal_type - product.category - - - - - - - - - diff --git a/app_product_sequence/views/product_internal_type_view.xml b/app_product_sequence/views/product_internal_type_view.xml deleted file mode 100644 index 02d54ec3..00000000 --- a/app_product_sequence/views/product_internal_type_view.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - product.internal.type.tree - product.internal.type - - - - - - - - - - - - - - - - - product.internal.type.form - product.internal.type - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- - - Product Internal Type - ir.actions.act_window - product.internal.type - tree,form - - - - - - - -
-
diff --git a/app_product_sequence/views/product_product_view.xml b/app_product_sequence/views/product_product_view.xml deleted file mode 100644 index 834bb3ef..00000000 --- a/app_product_sequence/views/product_product_view.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - product.product.tree - product.product - - - - - - - - - diff --git a/app_product_sequence/views/product_template_view.xml b/app_product_sequence/views/product_template_view.xml deleted file mode 100644 index a790db68..00000000 --- a/app_product_sequence/views/product_template_view.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - product.template.product.tree - product.template - - - - - - - - - - product.template.common.form - product.template - - - -
-
-
-
-
-
-
diff --git a/app_product_sequence/产品自动唯一编码模块支持多规格.txt b/app_product_sequence/产品自动唯一编码模块支持多规格.txt deleted file mode 100644 index a62820ce..00000000 --- a/app_product_sequence/产品自动唯一编码模块支持多规格.txt +++ /dev/null @@ -1,22 +0,0 @@ -App Product Auto Sequence, Auto Code(Variants Supported) - -1.ԶƷ롣 -2.ԶƷ룬ʽΪ Ʒ-001 -3.ƷǿҪΨһ -4.ԶƷͣͬƷʹòͬ -5.ۡ桢ϵͳ˵пٶ塣 -6.֧֡ - -This module allows to associate a sequence to the product reference.
-The reference (default code) is unique (SQL constraint) and required.
-Support Product with or without Variants. -1.Auto Sequence or code for every product.ԶƷ롣 -2.Auto Sequence or for every product variants, like product20171130-001.ԶƷ룬ʽΪ Ʒ-001 -3.Product code must be Unique.ƷǿҪΨһ -4.Define different product type, each product type use own rule of sequence.ԶƷͣͬƷʹòͬ -5.Quick access in sale , inventory, system menu.ۡ桢ϵͳ˵пٶ塣 -6.Multi language support.
֧֡ - - -ҳ棬 -http://www.sunpop.cn/product/app-product-auto-sequence-auto-codevariants-supported/ diff --git a/app_product_type_sequence/__init__.py b/app_product_type_sequence/__init__.py deleted file mode 100644 index 32e57aa9..00000000 --- a/app_product_type_sequence/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -''' -Created on 2017-10-28 -@author: 广州尚鹏,http://www.sunpop.cn -@email: 300883@qq.com -@resource of Sunpop -Odoo10离线中文用户手册下载 -http://www.sunpop.cn/odoo10_user_manual_document_offline/ -Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -http://www.sunpop.cn/odoo10_developer_document_offline/ - -@description: -''' - -import models -import controllers -from .hooks import pre_init_hook - diff --git a/app_product_type_sequence/__openerp__.py b/app_product_type_sequence/__openerp__.py deleted file mode 100644 index 738e996f..00000000 --- a/app_product_type_sequence/__openerp__.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-05 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: -{ - 'name': 'App Product Internal Type,Auto Sequence, Auto Code(Variants Supported), Auto Attributes', - 'summary': 'Auto Internal Reference.', - "version": '10.0.2.2', - 'category': 'Sales', - 'author': 'Sunpop.cn', - 'website': 'http://www.sunpop.cn', - 'license': 'AGPL-3', - 'sequence': 2, - 'installable': True, - 'auto_install': True, - 'application': True, - 'images': ['static/description/set2.jpg'], - 'currency': 'EUR', - 'price': 98, - 'description': u""" - App Product Auto Sequence, Auto Code(Variants Supported), Auto Attributes - - This module allows to associate a sequence to the product reference.
- The reference (default code) is unique (SQL constraint) and required.
- Support Product with or without Variants. - 1.Auto Sequence or code for every product.自动产品编码。 - 2.Auto Sequence or for every product variants, like product20171130-001.自动多规格产品编码,形式为 主产品编码-001。 - 3.Product code must be Unique.产品编码强制要求唯一。 - 4.Define different product type, each product type use own rule of sequence.可自定义产品类型,不同产品类型使用不同编码规则。 - 5.Quick access in sale , inventory, system menu.可以在销售、库存、系统菜单中快速定义。 - 6.Multi language support.
多语种支持。 - 7.Setup default Auto Sequence for each product category,自动设置每个产品目录使用的产品编码规则 - 8.Auto setup product attribute lik Sale/Purchase, Stockable/Consumable/Service, Stock Routes. 自动设置产品的销售/采购,可库存产品/服务/消耗品,购买/制造/按订单生成等库存路线 - """, - 'pre_init_hook': 'pre_init_hook', - 'depends': [ - 'product', - 'stock', - 'sale', - 'purchase', - 'mrp', - ], - 'data': [ - # 视图 - "security/ir.model.access.csv", - "security/security.xml", - 'views/product_template_view.xml', - 'views/product_product_view.xml', - 'views/product_category_view.xml', - 'views/product_internal_type_view.xml', - 'data/product_sequence.xml', - ], - 'demo': [ - ], -} diff --git a/app_product_type_sequence/controllers/__init__.py b/app_product_type_sequence/controllers/__init__.py deleted file mode 100644 index 8ee9bae1..00000000 --- a/app_product_type_sequence/controllers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -import main diff --git a/app_product_type_sequence/controllers/main.py b/app_product_type_sequence/controllers/main.py deleted file mode 100644 index 40a96afc..00000000 --- a/app_product_type_sequence/controllers/main.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/app_product_type_sequence/data/product_sequence.xml b/app_product_type_sequence/data/product_sequence.xml deleted file mode 100644 index e30981cf..00000000 --- a/app_product_type_sequence/data/product_sequence.xml +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - Sequence for All Products - product.product - PR%(y)s%(month)s - 5 - - True - - - - Sequence for Manufactured Product - product.product - CP%(y)s%(month)s - 5 - - True - - - - Sequence for Manufactured Components - product.product - BJ%(y)s%(month)s - 5 - - True - - - - Sequence for Sourced Material - product.product - BC%(y)s%(month)s - 5 - - True - - - - Sequence for Sourced Product - product.product - WL%(y)s%(month)s - 5 - - True - - - - - - - Manufactured Product - cp - 1 - product - 1 - 0 - - Set prefix as "CP" in link sequence - - - - - Manufactured Components - bj - 2 - product - 0 - 0 - - Set prefix as "BJ" in link sequence - - - - - Components Product - bc - 3 - product - 0 - 1 - - Set prefix as "BC" in link sequence - - - - - Sourced Product - wl - 4 - product - 1 - 1 - - Set prefix as "WL" in link sequence - - - - - Service - fw - 5 - service - 1 - 1 - Set prefix as "PR" in link sequence - - - - - Consumer - xh - 6 - consu - 1 - 1 - Set prefix as "PR" in link sequence - - - - - - - internal_type - product.template - default - - - - - - diff --git a/app_product_type_sequence/data/product_sequence_dp.xml b/app_product_type_sequence/data/product_sequence_dp.xml deleted file mode 100644 index 4b8b3ff3..00000000 --- a/app_product_type_sequence/data/product_sequence_dp.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - Sequence for All Products - product.product - P%(y)s%(month)s - 5 - - True - - - - Sequence for Manufactured Product - product.product - D%(y)s%(month)s - 5 - - True - - - - Sequence for Components Product - product.product - C%(y)s%(month)s - 5 - - True - - - - Sequence for Sourced Product - product.product - S%(y)s%(month)s - 5 - - True - - - - Service - product.product - V%(y)s%(month)s - 5 - - True - - - - - - Manufactured Product - d - product - 1 - 0 - - Set prefix as "D" in link sequence - - - - Components Product - c - product - 0 - 1 - - Set prefix as "C" in link sequence - - - - Sourced Product - s - product - 1 - 1 - - Set prefix as "S" in link sequence - - - - Service - v - service - 1 - 1 - - Set prefix as "V" in link sequence - - - - - - internal_type - product.template - default - - - - - - diff --git a/app_product_type_sequence/data/product_sequence_felive.xml b/app_product_type_sequence/data/product_sequence_felive.xml deleted file mode 100644 index 5278299c..00000000 --- a/app_product_type_sequence/data/product_sequence_felive.xml +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - Sequence for All Products - product.product - PR%(y)s%(month)s - 5 - - True - - - - Sequence for Manufactured Product - product.product - CP%(y)s%(month)s - 5 - - True - - - - Sequence for Manufactured Components - product.product - BJ%(y)s%(month)s - 5 - - True - - - - Sequence for Sourced Material - product.product - BC%(y)s%(month)s - 5 - - True - - - - Sequence for Sourced Product - product.product - WL%(y)s%(month)s - 5 - - True - - - - - - 图纸成品 - cp - 1 - product - 1 - 0 - - Set prefix as "CP" in link sequence - - - - - 图纸板件 - bj - 2 - product - 0 - 0 - - Set prefix as "BJ" in link sequence - - - - - 大板 - bc - 3 - product - 0 - 1 - - Set prefix as "BC" in link sequence - - - - - 基础物料 - cl - 4 - product - 1 - 1 - - Set prefix as "CL" in link sequence - - - - - 服务与费用 - fw - 5 - service - 1 - 1 - Set prefix as "PR" in link sequence - - - - - 消耗品 - xh - 6 - consu - 0 - 0 - Set prefix as "PR" in link sequence - - - - - - - - - - - - - - - diff --git a/app_product_type_sequence/data/product_sequence_origin.xml b/app_product_type_sequence/data/product_sequence_origin.xml deleted file mode 100644 index c0c7f9f6..00000000 --- a/app_product_type_sequence/data/product_sequence_origin.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - Sequence for All Products - product.product - P%(y)s%(month)s - 5 - - True - - - - Sequence for Manufactured Product - product.product - CP%(y)s%(month)s - 5 - - True - - - - Sequence for Manufactured Components - product.product - BJ%(y)s%(month)s - 5 - - True - - - - Sequence for Sourced Material - product.product - BC%(y)s%(month)s - 5 - - True - - - - Sequence for Sourced Product - product.product - CL%(y)s%(month)s - 5 - - True - - - - - - - Manufactured Product - cp - product - 1 - 0 - - Set prefix as "CP" in link sequence - - - - - Manufactured Components - bj - product - 0 - 0 - - Set prefix as "BJ" in link sequence - - - - - Components Product - bc - product - 0 - 1 - - Set prefix as "BC" in link sequence - - - - - Sourced Product - cl - product - 1 - 1 - - Set prefix as "CL" in link sequence - - - - - - - internal_type - product.template - default - - - - - - diff --git a/app_product_type_sequence/hooks.py b/app_product_type_sequence/hooks.py deleted file mode 100644 index 4a0ea85d..00000000 --- a/app_product_type_sequence/hooks.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-05 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: - -def pre_init_hook(cr): - """ - Updates existing codes matching the default 'New' or - empty. Primarily this ensures installation does not - fail for demo data. - :param cr: database cursor - :return: void - """ - cr.execute("UPDATE product_product " - "SET default_code = '!!PR!!' || id " - "WHERE default_code IS NULL OR default_code = 'New';") - - cr.execute("UPDATE product_template " - "Set default_code = " - "(select default_code from product_product " - "where product_product.product_tmpl_id = product_template.id limit 1)" - "WHERE default_code IS NULL OR default_code = 'New';") diff --git a/app_product_type_sequence/i18n/zh_CN.po b/app_product_type_sequence/i18n/zh_CN.po deleted file mode 100644 index 6e5c7abf..00000000 --- a/app_product_type_sequence/i18n/zh_CN.po +++ /dev/null @@ -1,249 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * app_product_type_sequence -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0+e-20171107\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-12-19 13:34+0000\n" -"PO-Revision-Date: 2017-12-19 13:34+0000\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: app_product_type_sequence -#: model:ir.model.fields,help:app_product_type_sequence.field_product_internal_type_type -msgid "A stockable product is a product for which you manage stock. The \"Inventory\" app has to be installed.\n" -"A consumable product, on the other hand, is a product for which stock is not managed.\n" -"A service is a non-material product you provide.\n" -"A digital content is a non-material product you sell online. The files attached to the products are the one that are sold on the e-commerce such as e-books, music, pictures,... The \"Digital Product\" module has to be installed." -msgstr "A stockable product is a product for which you manage stock. The \"Inventory\" app has to be installed.\n" -"A consumable product, on the other hand, is a product for which stock is not managed.\n" -"A service is a non-material product you provide.\n" -"A digital content is a non-material product you sell online. The files attached to the products are the one that are sold on the e-commerce such as e-books, music, pictures,... The \"Digital Product\" module has to be installed." - -#. module: app_product_type_sequence -#: model:ir.ui.view,arch_db:app_product_type_sequence.product_internal_type_form_view -msgid "Auto Set Product's Value To:" -msgstr "自动设置产品默认参数为:" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_purchase_ok -msgid "Can be Purchased" -msgstr "可用于采购" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_rental -msgid "Can be Rent" -msgstr "可用于出租" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_sale_ok -msgid "Can be Sold" -msgstr "可用于销售" - -#. module: app_product_type_sequence -#: model:product.internal.type,name:app_product_type_sequence.internal_type_sourced_material -msgid "Components Product" -msgstr "原材料" - -#. module: app_product_type_sequence -#: code:addons/app_product_type_sequence/models/product_internal_type.py:34 -#: selection:product.internal.type,type:0 -#, python-format -msgid "Consumable" -msgstr "可消耗" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_create_uid -msgid "Created by" -msgstr "创建人" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_create_date -msgid "Created on" -msgstr "创建时间" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_category_internal_type -msgid "Default Internal Type" -msgstr "默认产品内部类型" - -#. module: app_product_type_sequence -#: model:ir.model.fields,help:app_product_type_sequence.field_product_internal_type_route_ids -msgid "Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, MTO/MTS,..." -msgstr "取决于安装的模块,它允许在产品定义路线:购买,制造,MTO/MTS,等等..." - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_description -msgid "Description" -msgstr "说明" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_display_name -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_name -#: model:ir.ui.view,arch_db:app_product_type_sequence.product_internal_type_form_view -msgid "Display Name" -msgstr "显示名称" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_id -msgid "ID" -msgstr "ID" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_product_default_code_index -msgid "Internal Reference Index" -msgstr "Varient序号" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_product_default_code_stored -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_template_default_code_stored -msgid "Internal Reference Stored" -msgstr "主产品编码" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_product_internal_type -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_template_internal_type -msgid "Internal Type" -msgstr "内部类型" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type___last_update -msgid "Last Modified on" -msgstr "最后修改日" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_write_uid -msgid "Last Updated by" -msgstr "最后更新人" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_write_date -msgid "Last Updated on" -msgstr "最后更新时间" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_link_sequence -msgid "Link Sequence" -msgstr "使用的序列" - -#. module: app_product_type_sequence -#: model:product.internal.type,name:app_product_type_sequence.internal_type_mrp_product -msgid "Manufactured Product" -msgstr "制造成品" - -#. module: app_product_type_sequence -#: code:addons/app_product_type_sequence/models/product_product.py:23 -#: code:addons/app_product_type_sequence/models/product_template.py:33 -#, python-format -msgid "New" -msgstr "新建" - -#. module: app_product_type_sequence -#: code:addons/app_product_type_sequence/models/product_template.py:41 -#, python-format -msgid "Please save product first before adding varients!" -msgstr "增加产品变体前,请先保存当前产品!" - -#. module: app_product_type_sequence -#: model:ir.model.fields,help:app_product_type_sequence.field_product_internal_type_sequence_prefix -msgid "Prefix value of the record for the sequence" -msgstr "序列记录的前缀" - -#. module: app_product_type_sequence -#: model:ir.model,name:app_product_type_sequence.model_product_product -msgid "Product" -msgstr "产品" - -#. module: app_product_type_sequence -#: model:ir.model,name:app_product_type_sequence.model_product_category -msgid "Product Category" -msgstr "产品类别" - -#. module: app_product_type_sequence -#: model:ir.actions.act_window,name:app_product_type_sequence.internal_type_action -#: model:ir.ui.menu,name:app_product_type_sequence.menu_internal_type_action_purchase -#: model:ir.ui.menu,name:app_product_type_sequence.menu_internal_type_action_sale -#: model:ir.ui.menu,name:app_product_type_sequence.menu_internal_type_action_stock -#: model:ir.ui.menu,name:app_product_type_sequence.menu_internal_type_action_sys -#: model:ir.ui.view,arch_db:app_product_type_sequence.product_internal_type_form_view -#: model:ir.ui.view,arch_db:app_product_type_sequence.product_internal_type_tree_view -msgid "Product Internal Type" -msgstr "产品编码类型" - -#. module: app_product_type_sequence -#: model:ir.model,name:app_product_type_sequence.model_product_template -msgid "Product Template" -msgstr "产品模板" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_type -msgid "Product Type" -msgstr "产品类型" - -#. module: app_product_type_sequence -#: code:addons/app_product_type_sequence/models/product_product.py:83 -#, python-format -msgid "Product varient can only create in Product view!" -msgstr "请在产品管理页面增加产品的多属性!" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_route_ids -msgid "Routes" -msgstr "路线" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_sequence_prefix -msgid "Sequence Prefix" -msgstr "编号前缀" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_sequence -msgid "Sequence" -msgstr "显示顺序" - -#. module: app_product_type_sequence -#: code:addons/app_product_type_sequence/models/product_internal_type.py:35 -#: selection:product.internal.type,type:0 -#, python-format -msgid "Service" -msgstr "服务" - -#. module: app_product_type_sequence -#: model:product.internal.type,name:app_product_type_sequence.internal_type_sourced_product -msgid "Sourced Product" -msgstr "外购成品" - -#. module: app_product_type_sequence -#: model:ir.model.fields,help:app_product_type_sequence.field_product_internal_type_sale_ok -msgid "Specify if the product can be selected in a sales order line." -msgstr "如果产品能在销售单明细在被选择,则指定。" - -#. module: app_product_type_sequence -#: code:addons/app_product_type_sequence/models/product_internal_type.py:36 -#: selection:product.internal.type,type:0 -#, python-format -msgid "Stockable Product" -msgstr "可库存产品" - -#. module: app_product_type_sequence -#: sql_constraint:product.internal.type:0 -#: sql_constraint:product.product:0 -msgid "The reference must be unique" -msgstr "产品内部编码不可重复!" - -#. module: app_product_type_sequence -#: model:ir.model.fields,field_description:app_product_type_sequence.field_product_internal_type_ref -msgid "Unique Code" -msgstr "唯一编码" - -#. module: app_product_type_sequence -#: model:ir.model,name:app_product_type_sequence.model_product_internal_type -msgid "product.internal.type" -msgstr "product.internal.type" - diff --git a/app_product_type_sequence/models/__init__.py b/app_product_type_sequence/models/__init__.py deleted file mode 100644 index e312570a..00000000 --- a/app_product_type_sequence/models/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# -*- coding: utf-8 -*- -import product_template -import product_product -import product_category -import product_internal_type \ No newline at end of file diff --git a/app_product_type_sequence/models/product_category.py b/app_product_type_sequence/models/product_category.py deleted file mode 100644 index 841b8f20..00000000 --- a/app_product_type_sequence/models/product_category.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-28 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: - -from openerp import api, fields, models, exceptions, _ - - -class ProductCategory(models.Model): - _name = "product.category" - _inherit = ['product.category'] - - internal_type = fields.Many2one( - 'product.internal.type', 'Default Internal Type', - auto_join=True, required=False) diff --git a/app_product_type_sequence/models/product_internal_type.py b/app_product_type_sequence/models/product_internal_type.py deleted file mode 100644 index 5b8690f8..00000000 --- a/app_product_type_sequence/models/product_internal_type.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-05 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: - -from openerp import api, fields, models, _ - - -class ProductInternalType(models.Model): - _name = "product.internal.type" - _order = 'sequence, name' - - sequence = fields.Integer('Sequence', default=9) - name = fields.Char('Display Name', default='Normal', translate=True) - description = fields.Char('Description') - ref = fields.Char('Unique Code', required=True) - - link_sequence = fields.Many2one( - 'ir.sequence', 'Link Sequence', - auto_join=True, required=True, domain="[('code', '=', 'product.product')]") - sequence_prefix = fields.Char(u'Sequence Prefix', related='link_sequence.prefix', readonly=True, store=False) - # 各种默认值,填则自动录入,不填则不管 - type = fields.Selection([ - ('consu', _('Consumable')), - ('service', _('Service')), - ('product', _('Stockable Product'))], string='Product Type', - help='A stockable product is a product for which you manage stock. The "Inventory" app has to be installed.\n' - 'A consumable product, on the other hand, is a product for which stock is not managed.\n' - 'A service is a non-material product you provide.\n' - 'A digital content is a non-material product you sell online. The files attached to the products are the one that are sold on ' - 'the e-commerce such as e-books, music, pictures,... The "Digital Product" module has to be installed.') - - rental = fields.Boolean('Can be Rent') - sale_ok = fields.Boolean( - 'Can be Sold', default=True, - help="Specify if the product can be selected in a sales order line.") - purchase_ok = fields.Boolean('Can be Purchased', default=True) - - # 使用目录的默认路线来处理,暂时不用内部类型路线 - route_ids = fields.Many2many('stock.location.route', string='Routes', - domain=[('product_selectable', '=', True)], - help="Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, MTO/MTS,...") - - company_id = fields.Many2one( - 'res.company', 'Company', - default=lambda self: self.env.user.company_id.id, index=1) - - _sql_constraints = [ - ('uniq_ref', - 'unique(ref)', - 'The reference must be unique'), - ] \ No newline at end of file diff --git a/app_product_type_sequence/models/product_product.py b/app_product_type_sequence/models/product_product.py deleted file mode 100644 index 28ded679..00000000 --- a/app_product_type_sequence/models/product_product.py +++ /dev/null @@ -1,140 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-01-09 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: -from openerp import models, fields, api, exceptions, _ - - -class ProductProduct(models.Model): - _inherit = 'product.product' - - default_code = fields.Char('Internal Reference', index=True, default=lambda self: _('New'), copy=False) - default_code_index = fields.Integer('Internal Reference Index', readonly=True) - - # todo: 检查数据,要保证数据唯一性 - _sql_constraints = [ - ('uniq_default_code', - 'unique(default_code)', - 'The reference must be unique'), - ] - - @api.model - def default_get(self, fields): - context = self._context or {} - res = super(ProductProduct, self).default_get(fields) - # 内部编码类型默认值的录入 - if context.get("default_internal_type"): - self._onchange_internal_type() - elif context.get("default_internal_type_ref"): - types = self.env['product.internal.type'].search_read([('ref', '=', context.get("default_internal_type_ref"))], limit=1) - if types: - res.update({'internal_type':types[0]['id']}) - self._onchange_internal_type() - return res - - @api.model - def create(self, vals): - # todo: but 先建空白产品后,编辑2个以上变体,序号会少个 -1 - # code_index: 当没有变体现时,值为0,有变体时,为该变体序号 - code_index = 0 - if 'default_code' not in vals or vals['default_code'] == _('New'): - if 'product_tmpl_id' in vals: - # 按产品模板创建产品,有多种情况 - template = self.env['product.template'].search([('id', '=', vals['product_tmpl_id'])], limit=1) - if template.default_code and template.default_code != '': - code_stored = template.default_code - else: - code_stored = template.default_code_stored - if not code_stored: - code_stored = '' - mylen = len(template.product_variant_ids) - try: - attr = vals['attribute_value_ids'][0][2] - except: - attr = 0 - - # if self.env.context.get('create_from_tmpl') and not(attr): 此条件已限制,不让在template中先直接创建变体,要求先保存 - if self.env.context.get('create_from_tmpl') and not(attr): - # 从产品模板创建的第一个sku产品,不带属性 - # 没有属性值,则是单规格产品。attribute_value_ids格式为[6,0,[]]。多规格时,attribute_value_ids格式为[6,0,[x]] - code_index = 0 - vals['default_code_index'] = code_index - vals['default_code'] = code_stored - elif mylen == 0: - # 有属性值了,自己是第一个规格 - code_index = 1 - vals['default_code_index'] = code_index - vals['default_code'] = code_stored + '#%03d'%(code_index) - elif mylen == 1: - # 已存在1个,当存在的1个有属性时,要改已存在的product值 - code_index = template.product_variant_ids[:1].default_code_index - if template.product_variant_ids[:1].attribute_value_ids: - if code_index == 0: - code_index = 1 - template.product_variant_ids[:1].default_code_index = code_index - template.product_variant_ids[:1].default_code = code_stored + '#%03d'%(code_index) - # 接着改当前操作的product值 - code_index = code_index + 1 - vals['default_code_index'] = code_index - vals['default_code'] = code_stored + '#%03d'%(code_index) - elif mylen > 1: - # 找到最大的序号 - variant_max = max(template.product_variant_ids,key=lambda x: x['default_code_index']) - code_index = variant_max['default_code_index'] + 1 - vals['default_code_index'] = code_index - vals['default_code'] = code_stored + '#%03d'%(code_index) - else: - # 当按模板 - # 此条件常规不出现,但特殊项目会有 - variant_max = max(template.product_variant_ids,key=lambda x: x['default_code_index']) - code_index = variant_max['default_code_index'] + 1 - vals['default_code_index'] = code_index - vals['default_code'] = code_stored + '#%03d'%(code_index) - else: - # create from product_product - # 默认使用制造成品的编码 - sequence = self.env.ref('app_product_type_sequence.internal_type_mrp_product', raise_if_not_found=False) - if 'internal_type' in vals: - sequence = self.env['product.internal.type'].search([('id', '=', vals['internal_type'])], limit=1) - vals['default_code'] = sequence.link_sequence.next_by_id() - else: - # 如果有自己输入 ref,则不需要自运输生成 - # sequence = self.env['product.internal.type'].search([('id', '=', vals['internal_type'])], limit=1) - # if sequence: - # vals['default_code'] = sequence.link_sequence.next_by_id() - pass - return super(ProductProduct, self).create(vals) - - @api.multi - def copy(self, default=None): - if len(self.product_tmpl_id.product_variant_ids)>1 : - raise exceptions.ValidationError(_('Product varient can only create in Product view!')) - return super(ProductProduct, self).copy(default=None) - - # 当内部类型变化时,改变产品的各默认值 - @api.onchange('internal_type') - def _onchange_internal_type(self): - if self.internal_type: - self.type = self.internal_type.type - self.rental = self.internal_type.rental - self.sale_ok = self.internal_type.sale_ok - self.purchase_ok = self.internal_type.purchase_ok - self.route_ids = self.internal_type.route_ids - - # 分类变动时,如果分类绑定了内部类型则联动 - @api.onchange('categ_id') - def _onchange_cate_id(self): - if self.categ_id and self.categ_id.internal_type: - self.internal_type = self.categ_id.internal_type \ No newline at end of file diff --git a/app_product_type_sequence/models/product_template.py b/app_product_type_sequence/models/product_template.py deleted file mode 100644 index bd51b4a0..00000000 --- a/app_product_type_sequence/models/product_template.py +++ /dev/null @@ -1,101 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-05 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: - -from openerp import api, fields, models, exceptions, _ - - -class ProductTemplate(models.Model): - _name = "product.template" - _inherit = ['product.template'] - - # auto_join只要搜索product.template,自动会join。如果经常用到 internal_type 效率会高。 - internal_type = fields.Many2one( - 'product.internal.type', 'Internal Type', - auto_join=True, required=True) - - default_code = fields.Char( - 'Internal Reference', - compute='_compute_default_code', - inverse='_set_default_code', - store=True, default=lambda self: _('New'), copy=False) - # 因为default_code有odoo的处理方式,影响面大,故会将其另存到 default_code_stored - default_code_stored = fields.Char('Internal Reference Stored', - default=lambda self: _('New')) - - @api.model - def default_get(self, fields): - context = self._context or {} - res = super(ProductTemplate, self).default_get(fields) - # 内部编码类型默认值的录入 - if context.get("default_internal_type"): - self._onchange_internal_type() - elif context.get("default_internal_type_ref"): - types = self.env['product.internal.type'].search_read([('ref', '=', context.get("default_internal_type_ref"))], limit=1) - if types: - res.update({'internal_type':types[0]['id']}) - self._onchange_internal_type() - return res - - @api.model - def create(self, vals): - if 'attribute_line_ids' in vals: - if len(vals['attribute_line_ids'])>0: - raise exceptions.ValidationError(_('Please save product first before adding varients!')) - - if 'default_code' not in vals or vals['default_code'] == _('New'): - sequence = self.env['product.internal.type'].search([('id', '=', vals['internal_type'])], limit=1) - if not sequence: - sequence = self.env.ref('app_product_type_sequence.internal_type_mrp_product', raise_if_not_found=False) - vals['default_code'] = sequence.link_sequence.next_by_id() - else: - pass - - if vals['default_code']: - vals['default_code_stored'] = vals['default_code'] - - return super(ProductTemplate, self).create(vals) - - @api.depends('product_variant_ids', 'product_variant_ids.default_code') - def _compute_default_code(self): - unique_variants = self.filtered(lambda template: len(template.product_variant_ids) == 1) - # 设置default_code - for template in unique_variants: - template.default_code = template.product_variant_ids.default_code - for template in (self - unique_variants): - if len(template.product_variant_ids)>1: - template.default_code = '' - - @api.one - def _set_default_code(self): - if len(self.product_variant_ids) == 1: - self.product_variant_ids.default_code = self.default_code_stored - - # 当内部类型变化时,改变产品模板的各默认值 - @api.onchange('internal_type') - def _onchange_internal_type(self): - if self.internal_type: - self.type = self.internal_type.type - self.rental = self.internal_type.rental - self.sale_ok = self.internal_type.sale_ok - self.purchase_ok = self.internal_type.purchase_ok - self.route_ids = self.internal_type.route_ids - - # 分类变动时,如果分类绑定了内部类型则联动 - @api.onchange('categ_id') - def _onchange_cate_id(self): - if self.categ_id and self.categ_id.internal_type: - self.internal_type = self.categ_id.internal_type \ No newline at end of file diff --git a/app_product_type_sequence/security/ir.model.access.csv b/app_product_type_sequence/security/ir.model.access.csv deleted file mode 100644 index 02697c29..00000000 --- a/app_product_type_sequence/security/ir.model.access.csv +++ /dev/null @@ -1,3 +0,0 @@ -id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_sale_order_type_manager,access_sale_order_type_manager,model_product_internal_type,sales_team.group_sale_manager,1,1,1,1 -access_sale_order_type_salesman,access_sale_order_type_salesman,model_product_internal_type,sales_team.group_sale_salesman,1,0,0,0 diff --git a/app_product_type_sequence/security/security.xml b/app_product_type_sequence/security/security.xml deleted file mode 100644 index c3ab0e2f..00000000 --- a/app_product_type_sequence/security/security.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - Product Internal Type multi-company - - ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] - - - - - - diff --git a/app_product_type_sequence/static/description/icon.png b/app_product_type_sequence/static/description/icon.png deleted file mode 100644 index 2a04f219..00000000 Binary files a/app_product_type_sequence/static/description/icon.png and /dev/null differ diff --git a/app_product_type_sequence/static/description/index.html b/app_product_type_sequence/static/description/index.html deleted file mode 100644 index ecb4de17..00000000 --- a/app_product_type_sequence/static/description/index.html +++ /dev/null @@ -1,171 +0,0 @@ -
-
-

App Product Auto Sequence, Auto Code(Variants Supported), Auto Attributes

-
-

- This module allows to associate a sequence to the product reference.
- The reference (default code) is unique (SQL constraint) and required.
- Support Product with or without Variants. -

-
    -
  • - Auto Sequence or code for every product. -
  • -
  • - Auto Sequence or for every product variants, like product20171130-001. -
  • -
  • - Product code must be Unique. -
  • -
  • - Define different product type, each product type use own rule of sequence. -
  • -
  • - Quick access in sale , inventory, system menu. -
  • -
  • - Multi language support. -
  • -
  • - Setup default Auto Sequence for each product category. -
  • -
  • - Auto setup product attribute lik Sale/Purchase, Stockable/Consumable/Service, Stock Routes. -
  • -
-
- -
-
- -
-
- -
-

Sample Rule: if we create on oct 2017

-
    -
  • - Manufactured Products: M20171100001 -
  • -
  • - Components Products: C20171100001 -
  • -
  • - Sourced Products: S20171100001 -
  • -
-

- Sepcial for variants. add [-00?]
-

    -
  • - Products with color[red]: M20171100001#001 -
  • -
  • - Products with color[blue]: M20171100001#002 -
  • -
  • - Products with color[white]: M20171100001#003 -
  • -
-

-

Installation:

-

- Prior to installing this module, if you have any existing products you should ensure they already have a - unique reference (or no reference) set.
- Products with a default_code of '/' or empty will automatically be assigned a code of "!!DP!!" followed - by the system id for that product.
- Otherwise the setting of the unique constraint will fail and the module will fail to install.
- - Notice:
- Odoo product variants is very special.
- When u create a product(not product template) with attribute, It would delete the first product, which - have no attribute. - So it's very normal that the first product variants begin wit ???-002.
- And we make a rule that the product variants can only create after you create normal product template. -

-

How to use: Very simple

-

- After installed the app. You can Go to anyone of the menu:
-

    -
  • - Sales->Configuration->Products->Product Internal Type -
  • -
  • - Inventory->Configuration->Products->Product Internal Type -
  • -
  • - Settings->Sequences & Identifiers->Product Internal Type -
  • -
-

-

- You would see the default Product Intertype we create. - -

- -
-

-

- And create the product and code by yourself. -

- -
-

-

- Notice: The "Sequence Code" Field of sequence must be "product.product" -

- -
-

- Go to Prior to installing this module, if you have any existing products you should ensure they already have - a - unique reference (or no reference) set.
- Products with a default_code of '/' or empty will automatically be assigned a code of "!!DP!!" followed - by the system id for that product.
- Otherwise the setting of the unique constraint will fail and the module will fail to install.
- - Notice:
- Odoo product variants is very special.
- When u create a product(not product template) with attribute, It would delete the first product, which - have no attribute. - So it's very normal that the first product variants begin wit ???-002.
- And we make a rule that the product variants can only create after you create normal product template. -

-
-
-
- -
-
- -
-
-
-

Technical Help & Support

-
-
-
-

- For any type of technical help & support requests, Feel free to contact us

- - guohuadeng@hotmail.com -

- Via QQ: 300883

- - 300883@qq.com -
-
-

- Visit our website for more support.

- - http://www.sunpop.cn -
-
-
-
\ No newline at end of file diff --git a/app_product_type_sequence/static/description/set0.jpg b/app_product_type_sequence/static/description/set0.jpg deleted file mode 100644 index 7cf34652..00000000 Binary files a/app_product_type_sequence/static/description/set0.jpg and /dev/null differ diff --git a/app_product_type_sequence/static/description/set1.jpg b/app_product_type_sequence/static/description/set1.jpg deleted file mode 100644 index 77910e22..00000000 Binary files a/app_product_type_sequence/static/description/set1.jpg and /dev/null differ diff --git a/app_product_type_sequence/static/description/set2.jpg b/app_product_type_sequence/static/description/set2.jpg deleted file mode 100644 index f05874e3..00000000 Binary files a/app_product_type_sequence/static/description/set2.jpg and /dev/null differ diff --git a/app_product_type_sequence/static/description/set3.jpg b/app_product_type_sequence/static/description/set3.jpg deleted file mode 100644 index 78c9e415..00000000 Binary files a/app_product_type_sequence/static/description/set3.jpg and /dev/null differ diff --git a/app_product_type_sequence/static/description/set4.jpg b/app_product_type_sequence/static/description/set4.jpg deleted file mode 100644 index f2d148cf..00000000 Binary files a/app_product_type_sequence/static/description/set4.jpg and /dev/null differ diff --git a/app_product_type_sequence/static/description/set5.jpg b/app_product_type_sequence/static/description/set5.jpg deleted file mode 100644 index 2d422293..00000000 Binary files a/app_product_type_sequence/static/description/set5.jpg and /dev/null differ diff --git a/app_product_type_sequence/tests/__init__.py b/app_product_type_sequence/tests/__init__.py deleted file mode 100644 index 269a938e..00000000 --- a/app_product_type_sequence/tests/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -''' -Created on 2017-10-28 -@author: 广州尚鹏,http://www.sunpop.cn -@email: 300883@qq.com -@resource of Sunpop -Odoo10离线中文用户手册下载 -http://www.sunpop.cn/odoo10_user_manual_document_offline/ -Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -http://www.sunpop.cn/odoo10_developer_document_offline/ - -@description: -''' - -from . import test_product_sequence diff --git a/app_product_type_sequence/tests/test_product_sequence.py b/app_product_type_sequence/tests/test_product_sequence.py deleted file mode 100644 index f275be4f..00000000 --- a/app_product_type_sequence/tests/test_product_sequence.py +++ /dev/null @@ -1,59 +0,0 @@ -# -*- coding: utf-8 -*- -''' -Created on 2017-10-28 -@author: 广州尚鹏,http://www.sunpop.cn -@email: 300883@qq.com -@resource of Sunpop -Odoo10离线中文用户手册下载 -http://www.sunpop.cn/odoo10_user_manual_document_offline/ -Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -http://www.sunpop.cn/odoo10_developer_document_offline/ - -@description: -''' - -from odoo.tests.common import TransactionCase -from ..hooks import pre_init_hook - - -class TestProductSequence(TransactionCase): - """Tests for creating product with and without Product Sequence""" - - def setUp(self): - super(TestProductSequence, self).setUp() - self.product_product = self.env['product.product'] - - def test_product_create_with_default_code(self): - product = self.product_product.create(dict( - name="Apple", - default_code='PROD01' - )) - self.assertEqual(product.default_code, 'PROD01') - - def test_product_create_without_default_code(self): - product_1 = self.product_product.create(dict( - name="Orange", - default_code='/')) - self.assertRegexpMatches(str(product_1.default_code), r'PR/*') - - def test_product_copy(self): - product_2 = self.product_product.create(dict( - name="Apple", - default_code='PROD02' - )) - copy_product_2 = product_2.copy() - self.assertEqual(copy_product_2.default_code, 'PROD02-copy') - - def test_pre_init_hook(self): - product_3 = self.product_product.create(dict( - name="Apple", - default_code='PROD03' - )) - self.cr.execute( - "update product_product set default_code='/' where id=%s" - % (product_3.id,)) - product_3.invalidate_cache() - self.assertEqual(product_3.default_code, '/') - pre_init_hook(self.cr) - product_3.invalidate_cache() - self.assertEqual(product_3.default_code, '!!mig!!%s' % (product_3.id,)) diff --git a/app_product_type_sequence/views/product_category_view.xml b/app_product_type_sequence/views/product_category_view.xml deleted file mode 100644 index 7e1b5c79..00000000 --- a/app_product_type_sequence/views/product_category_view.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - product.category.list.internal_type - product.category - - - - - - - - - - product.category.form._internal_type - product.category - - - - - - - - - diff --git a/app_product_type_sequence/views/product_internal_type_view.xml b/app_product_type_sequence/views/product_internal_type_view.xml deleted file mode 100644 index 0af8523d..00000000 --- a/app_product_type_sequence/views/product_internal_type_view.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - product.internal.type.tree - product.internal.type - - - - - - - - - - - - - - - - - - product.internal.type.form - product.internal.type - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- - - Product Internal Type - ir.actions.act_window - product.internal.type - tree,form - - - - - - - - -
-
diff --git a/app_product_type_sequence/views/product_product_view.xml b/app_product_type_sequence/views/product_product_view.xml deleted file mode 100644 index 834bb3ef..00000000 --- a/app_product_type_sequence/views/product_product_view.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - product.product.tree - product.product - - - - - - - - - diff --git a/app_product_type_sequence/views/product_template_view.xml b/app_product_type_sequence/views/product_template_view.xml deleted file mode 100644 index a26a5e81..00000000 --- a/app_product_type_sequence/views/product_template_view.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - product.template.product.tree - product.template - - - - - - - - - - product.template.common.form - product.template - - - -
-

-

-
-
-
-
- - - Products - ir.actions.act_window - product.template - tree,kanban,form - form - - {"search_default_filter_to_sell":1} - -

- Click to define a new product. -

-

- You must define a product for everything you sell, whether it's a physical product, a consumable or a service you offer to customers. -

-

- The product form contains information to simplify the sale process: price, notes in the quotation, accounting data, procurement methods, - etc. -

-
-
-
-
diff --git a/app_product_type_sequence/产品自动生成唯一编码自动输入关键属性-支持多规格.txt b/app_product_type_sequence/产品自动生成唯一编码自动输入关键属性-支持多规格.txt deleted file mode 100644 index 4e5f1474..00000000 --- a/app_product_type_sequence/产品自动生成唯一编码自动输入关键属性-支持多规格.txt +++ /dev/null @@ -1,18 +0,0 @@ -App Product Auto Sequence, Auto Code(Variants Supported) - - - App Product Auto Sequence, Auto Code(Variants Supported), Auto Attributes - - This module allows to associate a sequence to the product reference.
- The reference (default code) is unique (SQL constraint) and required.
- Support Product with or without Variants. - 1.Auto Sequence or code for every product.自动产品编码。 - 2.Auto Sequence or for every product variants, like product20171130-001.自动多规格产品编码,形式为 主产品编码-001。 - 3.Product code must be Unique.产品编码强制要求唯一。 - 4.Define different product type, each product type use own rule of sequence.可自定义产品类型,不同产品类型使用不同编码规则。 - 5.Quick access in sale , inventory, system menu.可以在销售、库存、系统菜单中快速定义。 - 6.Multi language support.
多语种支持。 - 7.Setup default Auto Sequence for each product category,自动设置每个产品目录使用的产品编码规则 - 8.Auto setup product attribute lik Sale/Purchase, Stockable/Consumable/Service, Stock Routes. 自动设置产品的销售/采购,可库存产品/服务/消耗品,购买/制造/按订单生成等库存路线 - -http://www.sunpop.cn/product/app-product-auto-sequence-auto-codevariants-supported/ diff --git a/app_purchase_batch_procurement/__init__.py b/app_purchase_batch_procurement/__init__.py deleted file mode 100644 index 2b1bf9fa..00000000 --- a/app_purchase_batch_procurement/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- - -from hooks import pre_init_hook -from . import models -from . import res -from . import wizard diff --git a/app_purchase_batch_procurement/__openerp__.py b/app_purchase_batch_procurement/__openerp__.py deleted file mode 100644 index 656634da..00000000 --- a/app_purchase_batch_procurement/__openerp__.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-05 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 75695762@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: - - -{ - 'name': "App Purchase Batch Procurement, Procurement product set supplier", - 'version': '10.0.2.14', - 'summary': """App Purchase Batch Procurement, Procurement product set supplier""", - 'description': """ - 1. Product batch reorder, create procurement - 产品批量补货 - 2. Procurement batch setup supplier, quick purchase - 补货单快速设置供应商,直接生成采购询价单。 - 3. Product filter virtual view (available/exhausted/negative) - 产品在途库存过滤 - 4. Multi language support, done for Chinese and English - 多语言版本,默认支持中英双语 - """, - 'author': 'Sunpop.cn', - 'website': 'http://www.sunpop.cn', - 'license': 'LGPL-3', - 'category': 'Purchase', - 'sequence': 0, - 'pre_init_hook': 'pre_init_hook', - 'images': ['static/description/banner.png'], - 'depends': ['base', 'stock', 'purchase'], - 'data': [ - 'views/asset_views.xml', - 'views/procurement_order_views.xml', - 'views/product_template_views.xml', - 'views/menus.xml', - 'wizard/product_set_supplier_views.xml', - 'wizard/procurement_batch_generator_view.xml', - ], - 'demo': [ - ], - 'test': [ - ], - 'css': [ - ], - 'qweb': [ - 'static/src/xml/tree_view_btn.xml' - ], - 'js': [ - ], - 'images': [ - ], - "price": 68.00, - "currency": "EUR", - 'installable': True, - 'auto_install': False, - 'application': True, -} diff --git a/app_purchase_batch_procurement/hooks.py b/app_purchase_batch_procurement/hooks.py deleted file mode 100644 index 96ee6708..00000000 --- a/app_purchase_batch_procurement/hooks.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-22 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: - -def pre_init_hook(cr): - """ - 数据初始化,只在安装时执行,更新时不执行 - """ - try: - pass - except Exception, e: - raise Warning(e) diff --git a/app_purchase_batch_procurement/i18n/zh_CN.po b/app_purchase_batch_procurement/i18n/zh_CN.po deleted file mode 100644 index 9551a7c1..00000000 --- a/app_purchase_batch_procurement/i18n/zh_CN.po +++ /dev/null @@ -1,305 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * app_purchase_batch_procurement -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0+e-20171107\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-14 10:00+0000\n" -"PO-Revision-Date: 2018-02-14 10:00+0000\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: app_purchase_batch_procurement -#: code:addons/app_purchase_batch_procurement/wizard/procurement_batch_generator.py:73 -#, python-format -msgid "All requested quantities are null." -msgstr "没有要补货的产品,请检查." - -#. module: app_purchase_batch_procurement -#: model:ir.ui.view,arch_db:app_purchase_batch_procurement.procurement_batch_generator_wiz_form -#: model:ir.ui.view,arch_db:app_purchase_batch_procurement.product_set_supplier_wiz_form -msgid "Cancel" -msgstr "取消" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_company_id -msgid "Company" -msgstr "公司" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_create_uid -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_create_uid -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_create_uid -msgid "Created by" -msgstr "创建人" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_create_date -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_create_date -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_create_date -msgid "Created on" -msgstr "创建时间" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_currency_id -msgid "Currency" -msgstr "币种" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_delay -msgid "Delivery Lead Time" -msgstr "交货周期" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_display_name -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_display_name -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_display_name -msgid "Display Name" -msgstr "显示名称" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_date_end -msgid "End Date" -msgstr "结束日期" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,help:app_purchase_batch_procurement.field_product_set_supplier_wiz_date_end -msgid "End date for this vendor price" -msgstr "此供应商价格的结束日期" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_virtual_available -msgid "Forecast Quantity" -msgstr "预测数量" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_id -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_id -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_id -msgid "ID" -msgstr "ID" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_outgoing_qty -msgid "Incoming Quantity" -msgstr "将入库" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator___last_update -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line___last_update -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz___last_update -msgid "Last Modified on" -msgstr "最后修改日" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_write_uid -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_write_uid -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_write_uid -msgid "Last Updated by" -msgstr "最后更新人" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_write_date -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_write_date -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_write_date -msgid "Last Updated on" -msgstr "最后更新时间" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,help:app_purchase_batch_procurement.field_product_set_supplier_wiz_delay -msgid "Lead time in days between the confirmation of the purchase order and the receipt of the products in your warehouse. Used by the scheduler for automatic computation of the purchase order planning." -msgstr "提前时间是订单确认到仓库收到货物天数,使用于采购单自动计算规划调度" - -#. module: app_purchase_batch_procurement -#: model:ir.model,name:app_purchase_batch_procurement.model_procurement_batch_generator_line -msgid "Lines of the wizard to request procurements" -msgstr "即将生成补货单的产品" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_min_qty -msgid "Minimal Quantity" -msgstr "最少数量" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_incoming_qty -msgid "Outgoing Quantity" -msgstr "将出库" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_parent_id -msgid "Parent" -msgstr "上级" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_date_planned -msgid "Planned Date" -msgstr "计划的日期" - -#. module: app_purchase_batch_procurement -#: code:addons/app_purchase_batch_procurement/wizard/product_set_supplier_wiz.py:59 -#, python-format -msgid "Please select valid procurement orders. Only the 'status=Exception' and 'Buy in Inventory Routes' product can be set!" -msgstr "请选择有效的补货单。 只有 状态=异常 且 路线包含 '购买' 的 '可购买' 产品才可设置!" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_route_ids -msgid "Preferred Routes" -msgstr "首选路线" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_price -msgid "Price" -msgstr "价格" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_ids -msgid "Procurement Request Lines" -msgstr "补货明细" - -#. module: app_purchase_batch_procurement -#: model:ir.ui.view,arch_db:app_purchase_batch_procurement.product_set_supplier_wiz_form -msgid "Procurement list to setup supplier for the product" -msgstr "待设置产品供应商的补货单" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_p_ids -msgid "Procurement to set" -msgstr "待处理的补货单" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_product_id -msgid "Product" -msgstr "产品" - -#. module: app_purchase_batch_procurement -#: model:ir.actions.act_window,name:app_purchase_batch_procurement.purchase_procurement_action -#: model:ir.ui.menu,name:app_purchase_batch_procurement.felive_menu_purchase_procurement_action -msgid "Purchase Procurement Orders" -msgstr "待处理的采购补货" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_qty_available -msgid "Quantity On Hand" -msgstr "在手数量" - -#. module: app_purchase_batch_procurement -#. openerp-web -#: code:addons/app_purchase_batch_procurement/static/src/xml/tree_view_btn.xml:8 -#: model:ir.actions.act_window,name:app_purchase_batch_procurement.procurement_batch_generator_tree_action -#: model:ir.actions.act_window,name:app_purchase_batch_procurement.procurement_batch_generator_tree_action2 -#: model:ir.ui.view,arch_db:app_purchase_batch_procurement.procurement_batch_generator_wiz_form -#, python-format -msgid "Request Procurements" -msgstr "补货请求" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_procurement_qty -msgid "Requested Quantity" -msgstr "补货数量" - -#. module: app_purchase_batch_procurement -#. openerp-web -#: code:addons/app_purchase_batch_procurement/static/src/xml/tree_view_btn.xml:5 -#: model:ir.actions.act_window,name:app_purchase_batch_procurement.action_product_set_supplier -#: model:ir.actions.act_window,name:app_purchase_batch_procurement.product_set_supplier_action -#: model:ir.ui.view,arch_db:app_purchase_batch_procurement.product_set_supplier_wiz_form -#, python-format -msgid "Set Supplier" -msgstr "设置供应商并创建采购询价单" - -#. module: app_purchase_batch_procurement -#: model:ir.ui.view,arch_db:app_purchase_batch_procurement.product_set_supplier_wiz_form -msgid "Set supplier and run Scheduler" -msgstr "设定供应商并执行补货计算" - -#. module: app_purchase_batch_procurement -#: model:ir.model,name:app_purchase_batch_procurement.model_product_set_supplier_wiz -msgid "Set supplier for product" -msgstr "指定相关产品模板的供应商" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_view_po -msgid "Show relate RFQ after set supplier" -msgstr "完成后编辑相关采购询价单" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_date_start -msgid "Start Date" -msgstr "开始日期" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,help:app_purchase_batch_procurement.field_product_set_supplier_wiz_date_start -msgid "Start date for this vendor price" -msgstr "此供应商价格的开始日期" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_partner_id -msgid "Supplier" -msgstr "供应商" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,help:app_purchase_batch_procurement.field_product_set_supplier_wiz_min_qty -msgid "The minimal quantity to purchase from this vendor, expressed in the vendor Product Unit of Measure if not any, in the default unit of measure of the product otherwise." -msgstr "从供应商采购的最小数量的计量单位在产品的供应商信息中有维护,如果没有维护,那么计量单位就是产品中默认设置的" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,help:app_purchase_batch_procurement.field_product_set_supplier_wiz_price -msgid "The price to purchase a product" -msgstr "该价格购买产品" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_uom_id -msgid "Unit of Measure" -msgstr "计量单位" - -#. module: app_purchase_batch_procurement -#: model:ir.ui.view,arch_db:app_purchase_batch_procurement.procurement_batch_generator_wiz_form -msgid "Validate" -msgstr "确定" - -#. module: app_purchase_batch_procurement -#: model:ir.ui.view,arch_db:app_purchase_batch_procurement.product_set_supplier_wiz_form -msgid "Validity From" -msgstr "有效期" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_product_set_supplier_wiz_name -msgid "Vendor" -msgstr "供应商" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,help:app_purchase_batch_procurement.field_product_set_supplier_wiz_name -msgid "Vendor of this product" -msgstr "这个产品的供应商" - -#. module: app_purchase_batch_procurement -#: model:ir.ui.view,arch_db:app_purchase_batch_procurement.felive_product_template_search_form_view_stock -msgid "Virtual Available Products" -msgstr "在途库存>0" - -#. module: app_purchase_batch_procurement -#: model:ir.ui.view,arch_db:app_purchase_batch_procurement.felive_product_template_search_form_view_stock -msgid "Virtual Exhausted Stock" -msgstr "在途库存=0" - -#. module: app_purchase_batch_procurement -#: model:ir.ui.view,arch_db:app_purchase_batch_procurement.felive_product_template_search_form_view_stock -msgid "Virtual Negative Stock" -msgstr "在途库存<0" - -#. module: app_purchase_batch_procurement -#: model:ir.model.fields,field_description:app_purchase_batch_procurement.field_procurement_batch_generator_line_warehouse_id -msgid "Warehouse" -msgstr "仓库" - -#. module: app_purchase_batch_procurement -#: model:ir.model,name:app_purchase_batch_procurement.model_procurement_batch_generator -msgid "Wizard to create procurements from product tree" -msgstr "补货向导" - diff --git a/app_purchase_batch_procurement/ir/__init__.py b/app_purchase_batch_procurement/ir/__init__.py deleted file mode 100644 index 40a96afc..00000000 --- a/app_purchase_batch_procurement/ir/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/app_purchase_batch_procurement/models/__init__.py b/app_purchase_batch_procurement/models/__init__.py deleted file mode 100644 index 40a96afc..00000000 --- a/app_purchase_batch_procurement/models/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/app_purchase_batch_procurement/report/__init__.py b/app_purchase_batch_procurement/report/__init__.py deleted file mode 100644 index 633f8661..00000000 --- a/app_purchase_batch_procurement/report/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# -*- coding: utf-8 -*- - diff --git a/app_purchase_batch_procurement/res/__init__.py b/app_purchase_batch_procurement/res/__init__.py deleted file mode 100644 index 40a96afc..00000000 --- a/app_purchase_batch_procurement/res/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/app_purchase_batch_procurement/static/description/banner.png b/app_purchase_batch_procurement/static/description/banner.png deleted file mode 100644 index 26504068..00000000 Binary files a/app_purchase_batch_procurement/static/description/banner.png and /dev/null differ diff --git a/app_purchase_batch_procurement/static/description/cnreadme.png b/app_purchase_batch_procurement/static/description/cnreadme.png deleted file mode 100644 index 4ce57a5f..00000000 Binary files a/app_purchase_batch_procurement/static/description/cnreadme.png and /dev/null differ diff --git a/app_purchase_batch_procurement/static/description/demo11.png b/app_purchase_batch_procurement/static/description/demo11.png deleted file mode 100644 index 26504068..00000000 Binary files a/app_purchase_batch_procurement/static/description/demo11.png and /dev/null differ diff --git a/app_purchase_batch_procurement/static/description/demo12.png b/app_purchase_batch_procurement/static/description/demo12.png deleted file mode 100644 index c8262d67..00000000 Binary files a/app_purchase_batch_procurement/static/description/demo12.png and /dev/null differ diff --git a/app_purchase_batch_procurement/static/description/demo21.png b/app_purchase_batch_procurement/static/description/demo21.png deleted file mode 100644 index 2210b457..00000000 Binary files a/app_purchase_batch_procurement/static/description/demo21.png and /dev/null differ diff --git a/app_purchase_batch_procurement/static/description/demo31.png b/app_purchase_batch_procurement/static/description/demo31.png deleted file mode 100644 index 5514661b..00000000 Binary files a/app_purchase_batch_procurement/static/description/demo31.png and /dev/null differ diff --git a/app_purchase_batch_procurement/static/description/demo41.png b/app_purchase_batch_procurement/static/description/demo41.png deleted file mode 100644 index d22039a7..00000000 Binary files a/app_purchase_batch_procurement/static/description/demo41.png and /dev/null differ diff --git a/app_purchase_batch_procurement/static/description/demo51.png b/app_purchase_batch_procurement/static/description/demo51.png deleted file mode 100644 index a911f70b..00000000 Binary files a/app_purchase_batch_procurement/static/description/demo51.png and /dev/null differ diff --git a/app_purchase_batch_procurement/static/description/demo61.png b/app_purchase_batch_procurement/static/description/demo61.png deleted file mode 100644 index 7f5c5249..00000000 Binary files a/app_purchase_batch_procurement/static/description/demo61.png and /dev/null differ diff --git a/app_purchase_batch_procurement/static/description/demo71.png b/app_purchase_batch_procurement/static/description/demo71.png deleted file mode 100644 index e380dd29..00000000 Binary files a/app_purchase_batch_procurement/static/description/demo71.png and /dev/null differ diff --git a/app_purchase_batch_procurement/static/description/demo81.png b/app_purchase_batch_procurement/static/description/demo81.png deleted file mode 100644 index 15c226d7..00000000 Binary files a/app_purchase_batch_procurement/static/description/demo81.png and /dev/null differ diff --git a/app_purchase_batch_procurement/static/description/icon.png b/app_purchase_batch_procurement/static/description/icon.png deleted file mode 100644 index 2a04f219..00000000 Binary files a/app_purchase_batch_procurement/static/description/icon.png and /dev/null differ diff --git a/app_purchase_batch_procurement/static/description/index.html b/app_purchase_batch_procurement/static/description/index.html deleted file mode 100644 index 9c8a3e25..00000000 --- a/app_purchase_batch_procurement/static/description/index.html +++ /dev/null @@ -1,101 +0,0 @@ -
-
-
-

App Purchase Batch Procurement, Procurement product set supplier

-
-

This moduld is to easy purchase

-

Lastest update: v10.0.2.14, 2018-02-14

-
    -
  • 1. Product batch reorder, create procurement
  • -
  • 2. Procurement batch setup supplier, quick purchase
  • -
  • 3. Product filter virtual view (available/exhausted/negative), and auto set procurement quantity
  • -
-
- -
- -
-
-
-
- - -
-
-

1. Procurement batch setup supplier, quick purchase

-
-
- -
- -
-

So you can get the procurement

- -
-
-
- -
-
-

2. Procurement batch setup supplier, quick purchase

-
-
- -
- -
-

So you can get the purchase of all product

- -
-
-
-
- -
-
-

3. Product filter virtual view (available/exhausted/negative), and auto set procurement quantity

-
-
- -
-

The procurement quantity would be auto set

- -
-
-
- -
-
-
-

Technical Help & Support

-
-
-
-

- For any type of technical help & support requests, Feel free to contact us

- - guohuadeng@hotmail.com -

- Via QQ: 300883

- - 300883@qq.com -
-
-

- Visit our website for more support.

- - http://www.sunpop.cn -
-
-
-
- diff --git a/app_purchase_batch_procurement/static/src/js/btn_set_supplier.js b/app_purchase_batch_procurement/static/src/js/btn_set_supplier.js deleted file mode 100644 index 23bb5291..00000000 --- a/app_purchase_batch_procurement/static/src/js/btn_set_supplier.js +++ /dev/null @@ -1,66 +0,0 @@ -odoo.define('app_purchase_batch_procurement.btn_set_supplier', function (require) { - "use strict"; - - var core = require('web.core'); - var ListView = require('web.ListView'); - var web_client = require('web.web_client') - var QWeb = core.qweb; - - ListView.include({ - - render_buttons: function ($node) { - if ($node) { - var self = this; - this._super($node); - this.$buttons.find('.o_list_btn_set_supplier').click(this.proxy('set_supplier_action')); - this.$buttons.find('.o_list_btn_batch_procurement').click(this.proxy('batch_procurement_action')); - } - }, - set_supplier_action: function () { - //纯js取 - // var active_ids = $.map($('.o_list_view .o_list_record_selector :checkbox:checked'), function (el) { - // return $(el).closest('tr').data('id'); - // }); - //odoo内置方法取值 - var active_ids = this.groups.get_selection().ids - this.do_action({ - type: "ir.actions.act_window", - name: " Set Supplier", - res_model: "product.set.supplier.wiz", - views: [[false, 'form']], - view_type: 'form', - view_mode: 'form', - multi: 1, - key2: "client_action_multi", - src_model: "procurement.order", - active_model: "procurement.order", - target: 'new', - context: {'active_ids': active_ids} - }); - return {'type': 'ir.actions.client'} - }, - batch_procurement_action: function () { - // var active_ids = self.$.map($('.o_list_view .o_list_record_selector :checkbox:checked'), function (el) { - // return $(el).closest('tr').data('id'); - // }); - var active_ids = this.groups.get_selection().ids - // var active_ids = self.getSelection().ids; - this.do_action({ - type: "ir.actions.act_window", - name: "Request Procurements", - res_model: "procurement.batch.generator", - views: [[false, 'form']], - view_type: 'form', - view_mode: 'form', - multi: 1, - key2: "client_action_multi", - src_model: "product.product", - active_model: "product.product", - target: 'new', - context: {'active_ids': active_ids} - }); - return {'type': 'ir.actions.client'} - } - }); - -}); \ No newline at end of file diff --git a/app_purchase_batch_procurement/static/src/xml/tree_view_btn.xml b/app_purchase_batch_procurement/static/src/xml/tree_view_btn.xml deleted file mode 100644 index 0849eb6e..00000000 --- a/app_purchase_batch_procurement/static/src/xml/tree_view_btn.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app_purchase_batch_procurement/views/asset_views.xml b/app_purchase_batch_procurement/views/asset_views.xml deleted file mode 100644 index dd5311b4..00000000 --- a/app_purchase_batch_procurement/views/asset_views.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app_purchase_batch_procurement/views/menus.xml b/app_purchase_batch_procurement/views/menus.xml deleted file mode 100644 index 6c216e82..00000000 --- a/app_purchase_batch_procurement/views/menus.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/app_purchase_batch_procurement/views/procurement_order_views.xml b/app_purchase_batch_procurement/views/procurement_order_views.xml deleted file mode 100644 index 7bc8ae80..00000000 --- a/app_purchase_batch_procurement/views/procurement_order_views.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - Purchase Procurement Orders - ir.actions.act_window - procurement.order - form - tree,form - [('rule_id.action', '=', 'buy')] - {'search_default_exceptions': 1} - - - diff --git a/app_purchase_batch_procurement/views/product_template_views.xml b/app_purchase_batch_procurement/views/product_template_views.xml deleted file mode 100644 index a063e353..00000000 --- a/app_purchase_batch_procurement/views/product_template_views.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - felive.product.template.search.stock.form - product.template - - - - - - - - - - - - diff --git a/app_purchase_batch_procurement/wizard/__init__.py b/app_purchase_batch_procurement/wizard/__init__.py deleted file mode 100644 index 714bb2a5..00000000 --- a/app_purchase_batch_procurement/wizard/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding: utf-8 -*- - -from . import product_set_supplier_wiz -from . import procurement_batch_generator diff --git a/app_purchase_batch_procurement/wizard/procurement_batch_generator.py b/app_purchase_batch_procurement/wizard/procurement_batch_generator.py deleted file mode 100644 index efcc8307..00000000 --- a/app_purchase_batch_procurement/wizard/procurement_batch_generator.py +++ /dev/null @@ -1,129 +0,0 @@ -# -*- encoding: utf-8 -*- - - -from odoo import models, fields, api, _ -import odoo.addons.decimal_precision as dp -from odoo.exceptions import Warning -from datetime import datetime, timedelta -from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT - - -class ProcurementBatchGenerator(models.TransientModel): - _name = 'procurement.batch.generator' - _description = 'Wizard to create procurements from product tree' - - route_ids = fields.Many2many('stock.location.route', string='Preferred Routes') - line_ids = fields.One2many( - 'procurement.batch.generator.line', 'parent_id', - string='Procurement Request Lines') - - @api.model - def default_get(self, fields): - res = super(ProcurementBatchGenerator, self).default_get(fields) - assert isinstance(self.env.context['active_ids'], list),\ - "context['active_ids'] must be a list" - line_ids = [] - warehouses = self.env['stock.warehouse'].search( - [('company_id', '=', self.env.user.company_id.id)]) - warehouse_id = warehouses and warehouses[0].id or False - # product.template是被继承的,所以用同样方法即可 - for product in self.env['product.product'].browse( - self.env.context['active_ids']): - # todo: 库存的数量在此使用会导致运算量较大,停用。 如需要再加。未来可以考虑数据全部从前端送过来,不需再查数据库 - # partner_id = product.seller_ids and product.seller_ids[0].id or False - if product.virtual_available < 0: - procurement_qty = product.virtual_available * -1 - else: - procurement_qty = 1 - line_ids.append([0, 0, { - 'name': product.name, - 'product_id': product.id, - # 'partner_id': partner_id, - # 'qty_available': product.qty_available, - 'virtual_available': product.virtual_available, - # 'outgoing_qty': product.outgoing_qty, - # 'incoming_qty': product.incoming_qty, - 'uom_id': product.uom_id.id, - # 按预测库存数补货,or 1 - 'procurement_qty': procurement_qty, - 'warehouse_id': warehouse_id, - 'date_planned': datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT), - }]) - try: - res.update({ - 'line_ids': line_ids, - }) - except: - pass - return res - - @api.multi - def validate(self): - self.ensure_one() - wiz = self[0] - assert wiz.line_ids, 'wizard must have some lines' - procs = self.env['procurement.order'] - for line in wiz.line_ids: - if not line.procurement_qty: - continue - procurement = self.env['procurement.order'].create( - line._prepare_procurement_order()) - procs += procurement - if not procs.ids: - raise Warning(_('All requested quantities are null.')) - # todo: 看是否需要记录工作流 - # self.pool['procurement.order'].signal_workflow( - # self._cr, self._uid, new_po_ids, 'button_confirm') - # todo: 看是用 self.pool还是直接run,当前用直接run - # self.pool['procurement.order'].run( - # self._cr, self._uid, new_po_ids, context=self.env.context) - procs.run() - action = self.env.ref('procurement.procurement_action').read()[0] - action['domain'] = [('id', 'in', procs.ids)] - return action - -class ProcurementBatchGeneratorLine(models.TransientModel): - _name = 'procurement.batch.generator.line' - _description = 'Lines of the wizard to request procurements' - - parent_id = fields.Many2one( - 'procurement.batch.generator', string='Parent') - product_id = fields.Many2one( - 'product.product', string='Product', readonly=True) - partner_id = fields.Many2one( - 'res.partner', string='Supplier', required=False) - qty_available = fields.Float( - string='Quantity On Hand', - digits=dp.get_precision('Product Unit of Measure'), readonly=True) - virtual_available = fields.Float( - string='Forecast Quantity', - digits=dp.get_precision('Product Unit of Measure'), readonly=True) - outgoing_qty = fields.Float( - string='Incoming Quantity', - digits=dp.get_precision('Product Unit of Measure'), readonly=True) - incoming_qty = fields.Float( - string='Outgoing Quantity', - digits=dp.get_precision('Product Unit of Measure'), readonly=True) - procurement_qty = fields.Float( - string='Requested Quantity', - digits=dp.get_precision('Product Unit of Measure'), default=1) - uom_id = fields.Many2one( - 'product.uom', string='Unit of Measure', readonly=True) - warehouse_id = fields.Many2one( - 'stock.warehouse', string='Warehouse') - date_planned = fields.Datetime(string='Planned Date') - - @api.multi - def _prepare_procurement_order(self): - self.ensure_one() - vals = { - 'name': 'INT: %s' % (self.env.user.login), - 'date_planned': self.date_planned, - 'product_id': self.product_id.id, - 'product_qty': self.procurement_qty, - 'product_uom': self.uom_id.id, - 'location_id': self.warehouse_id.lot_stock_id.id, - 'company_id': self.warehouse_id.company_id.id, - 'route_ids': [(6, 0, self.parent_id.route_ids.ids)], - } - return vals diff --git a/app_purchase_batch_procurement/wizard/procurement_batch_generator_view.xml b/app_purchase_batch_procurement/wizard/procurement_batch_generator_view.xml deleted file mode 100644 index 2a6fc4df..00000000 --- a/app_purchase_batch_procurement/wizard/procurement_batch_generator_view.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - procurement.batch.generator.form - procurement.batch.generator - -
- - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
diff --git a/app_purchase_batch_procurement/wizard/product_set_supplier_views.xml b/app_purchase_batch_procurement/wizard/product_set_supplier_views.xml deleted file mode 100644 index e7bbe2af..00000000 --- a/app_purchase_batch_procurement/wizard/product_set_supplier_views.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - product.set.supplier.wiz.form - product.set.supplier.wiz - -
- - - - - - - - - - - - - - - - - -
-
- -
-
- - - Set Supplier - product.set.supplier.wiz - form - form - - new - - - -
-
diff --git a/app_purchase_batch_procurement/wizard/product_set_supplier_wiz.py b/app_purchase_batch_procurement/wizard/product_set_supplier_wiz.py deleted file mode 100644 index 36bcf0a8..00000000 --- a/app_purchase_batch_procurement/wizard/product_set_supplier_wiz.py +++ /dev/null @@ -1,100 +0,0 @@ -# -*- coding: utf-8 -*- - -from odoo import api, fields, models, _ -from datetime import datetime, timedelta -from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT -import odoo.addons.decimal_precision as dp -from odoo.exceptions import UserError -import time - -class ProductSetSupplierWiz(models.TransientModel): - _name = 'product.set.supplier.wiz' - _description = 'Set supplier for product' - - name = fields.Many2one( - 'res.partner', 'Vendor', - domain=[('supplier', '=', True)], ondelete='cascade', required=True, - help="Vendor of this product") - min_qty = fields.Float( - 'Minimal Quantity', default=0.0, required=True, - help="The minimal quantity to purchase from this vendor, expressed in the vendor Product Unit of Measure if not any, in the default unit of measure of the product otherwise.") - price = fields.Float( - 'Price', default=0.0, digits=dp.get_precision('Product Price'), - required=True, help="The price to purchase a product") - company_id = fields.Many2one( - 'res.company', 'Company', - default=lambda self: self.env.user.company_id.id, index=1) - currency_id = fields.Many2one( - 'res.currency', 'Currency', - default=lambda self: self.env.user.company_id.currency_id.id, - required=True) - date_start = fields.Date('Start Date', help="Start date for this vendor price") - date_end = fields.Date('End Date', help="End date for this vendor price") - delay = fields.Integer( - 'Delivery Lead Time', default=1, required=True, - help="Lead time in days between the confirmation of the purchase order and the receipt of the products in your warehouse. Used by the scheduler for automatic computation of the purchase order planning.") - - # 通过过滤得到要设置的补货单 - p_ids = fields.Many2many('procurement.order', string='Procurement to set', readonly=True) - # 设置完后是否直接显示po - view_po = fields.Boolean('Show relate RFQ after set supplier', default=True) - - # 默认值 - @api.model - def default_get(self, fields): - res = super(ProductSetSupplierWiz, self).default_get(fields) - res['create_uid'] = self.env.user.id - if not res.get('min_qty'): - res['min_qty'] = 1 - if not res.get('date_start'): - res['date_start'] = datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT) - if not res.get('date_end'): - res['date_end'] = (datetime.now() + timedelta(days=1)).strftime(DEFAULT_SERVER_DATETIME_FORMAT) - - procs_ids = self.env.context.get('active_ids') - procs = self.env['procurement.order'].browse(procs_ids).filtered(lambda x: x.rule_id.action == 'buy' and x.state == 'exception') - p_ids = procs.ids - res['p_ids'] = p_ids - if len(p_ids) < 1: - raise UserError(_("Please select valid procurement orders. Only the 'status=Exception' and 'Buy in Inventory Routes' product can be set!")) - # 请选择有效的补货单。只有需要采购的异常补货单才可进行设置! - return res - - # 为选定的产品设定供应商,只处理系统没处理的 - @api.multi - def set_supplier(self): - self.ensure_one() - procs_ids = self.env.context.get('active_ids') - procs = self.env['procurement.order'].browse(procs_ids).filtered(lambda x: x.rule_id.action == 'buy' and x.state == 'exception') - t_ids = procs.mapped('product_id.product_tmpl_id').ids - # 去重复 - t_ids = list(set(t_ids)) - for t in t_ids: - self.env['product.supplierinfo'].create({ - 'name': self.name.id, - 'product_tmpl_id': t, - 'min_qty': self.min_qty, - 'date_start': self.date_start, - 'date_end': self.date_end, - 'delay': self.delay, - }) - time.sleep(1) - procs.run() - if self.view_po: - time.sleep(2) - p_names = procs.mapped('purchase_id.name') - p_names = list(set(p_names)) - domain = [["name", "in", p_names]] - context = { - 'search_default_name': p_names[0], - } - action = self.env.ref('purchase.purchase_rfq').read()[0] - if len(p_names) == 1: - action.update({ - 'context': context, - }) - elif len(p_names) > 1: - action.update({ - 'domain': domain, - }) - return action diff --git a/app_search_range/__init__.py b/app_search_range/__init__.py deleted file mode 100644 index 7c68785e..00000000 --- a/app_search_range/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- \ No newline at end of file diff --git a/app_search_range/__openerp__.py b/app_search_range/__openerp__.py deleted file mode 100644 index d50bb331..00000000 --- a/app_search_range/__openerp__.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-05 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: -{ - 'name': 'App Search By Date (Datetime) or Number Range', - 'version': '10.0.1.0', - 'author': 'Sunpop.cn', - 'category': 'web', - 'website': 'http://www.sunpop.cn', - 'license': 'AGPL-3', - 'sequence': 2, - 'summary': 'Search by date or number range in List view and Pivot view', - 'description': """ - -Search by date or number range in List view and Pivot view --------------------------------------------------- - - """, - 'depends': ['web','app_odoo_customize'], - 'data': [ - 'views/template_view.xml', - # data - 'data/ir_config_parameter.xml', - ], - 'qweb': [ - 'static/src/xml/*.xml', - ], - "price": 68.00, - "currency": "EUR", - - 'images': ['static/description/list_pivot.png'], - - 'installable': True, - 'auto_install': False, - 'application': True, -} diff --git a/app_search_range/data/ir_config_parameter.xml b/app_search_range/data/ir_config_parameter.xml deleted file mode 100644 index 4369230f..00000000 --- a/app_search_range/data/ir_config_parameter.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - app_show_search_date - True - - - app_show_search_number - True - - - \ No newline at end of file diff --git a/app_search_range/i18n/zh_CN.po b/app_search_range/i18n/zh_CN.po deleted file mode 100644 index 86bdb878..00000000 --- a/app_search_range/i18n/zh_CN.po +++ /dev/null @@ -1,46 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * app_odoo_customize -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0c\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-08-07 08:57+0000\n" -"PO-Revision-Date: 2017-08-07 08:57+0000\n" -"Last-Translator: Ivan Deng <300883@qq.com>, 2017\n" -"Language-Team: http://www.sunpop.cn \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: app_search_range -#. openerp-web -#: code:addons/app_search_range/static/src/xml/pivot_view.xml:18 -#, python-format -msgid "Start date" -msgstr "开始日期" - -#. module: app_search_range -#. openerp-web -#: code:addons/app_search_range/static/src/xml/pivot_view.xml:22 -#, python-format -msgid "End date" -msgstr "结束日期" - -#. module: app_search_range -#. openerp-web -#: code:addons/app_search_range/static/src/xml/pivot_view.xml:45 -#, python-format -msgid "From" -msgstr "从" - - -#. module: app_search_range -#. openerp-web -#: code:addons/app_search_range/static/src/xml/pivot_view.xml:49 -#, python-format -msgid "To" -msgstr "至" diff --git a/app_search_range/static/description/date_range.jpg b/app_search_range/static/description/date_range.jpg deleted file mode 100644 index 8b702b90..00000000 Binary files a/app_search_range/static/description/date_range.jpg and /dev/null differ diff --git a/app_search_range/static/description/date_range.png b/app_search_range/static/description/date_range.png deleted file mode 100644 index 317099b9..00000000 Binary files a/app_search_range/static/description/date_range.png and /dev/null differ diff --git a/app_search_range/static/description/icon.png b/app_search_range/static/description/icon.png deleted file mode 100644 index 4c57f611..00000000 Binary files a/app_search_range/static/description/icon.png and /dev/null differ diff --git a/app_search_range/static/description/index.html b/app_search_range/static/description/index.html deleted file mode 100644 index 197a65aa..00000000 --- a/app_search_range/static/description/index.html +++ /dev/null @@ -1,91 +0,0 @@ -
-
-
-

App Search By Date or Number Range

-
-

This moduld allows user to Search by date or number range in List view and Pivot view.

-
-
    -
  • 1.List all the date/datetime field to select range
  • -
  • 2.List all the integer/float/Monetary field to select range
  • -
  • 3.Auto get user timezone, global Timezone supported.
  • -
  • 4.Easy admin to enable/disable the search.
  • -
-
-
-
-
-
-
-

Date range

-
- -
-
-
- -
-
-

Value range

-
- -
-
-
- -
-
-

Pivot View

-
- -
-
-
- -
-
-

How to setup

-

Go to Menu: Settings->Technical->Parameters->System Parameters

-

You can find "app_show_search_date" and "app_show_search_number"

-

Go to Menu: Settings->Technical->Parameters->System Parameters.

-

Set the Value to "False" if you do not want to show the search. And set "True" to show.

-
- -
-
-
- -
-
-
-

Technical Help & Support

-
-
-
-

- For any type of technical help & support requests, Feel free to contact us

- - guohuadeng@hotmail.com -

- Via QQ: 300883

- - 300883@qq.com -
-
-

- Visit our website for more support.

- - http://www.sunpop.cn -
-
-
-
- -
-
\ No newline at end of file diff --git a/app_search_range/static/description/list_pivot.jpg b/app_search_range/static/description/list_pivot.jpg deleted file mode 100644 index 6b9ff4e8..00000000 Binary files a/app_search_range/static/description/list_pivot.jpg and /dev/null differ diff --git a/app_search_range/static/description/list_pivot.png b/app_search_range/static/description/list_pivot.png deleted file mode 100644 index 59bf05cd..00000000 Binary files a/app_search_range/static/description/list_pivot.png and /dev/null differ diff --git a/app_search_range/static/description/setup.jpg b/app_search_range/static/description/setup.jpg deleted file mode 100644 index dcfaaf54..00000000 Binary files a/app_search_range/static/description/setup.jpg and /dev/null differ diff --git a/app_search_range/static/description/setup.png b/app_search_range/static/description/setup.png deleted file mode 100644 index 0c79efd6..00000000 Binary files a/app_search_range/static/description/setup.png and /dev/null differ diff --git a/app_search_range/static/description/setup1.jpg b/app_search_range/static/description/setup1.jpg deleted file mode 100644 index 7841f91a..00000000 Binary files a/app_search_range/static/description/setup1.jpg and /dev/null differ diff --git a/app_search_range/static/description/setup1.png b/app_search_range/static/description/setup1.png deleted file mode 100644 index eea3338d..00000000 Binary files a/app_search_range/static/description/setup1.png and /dev/null differ diff --git a/app_search_range/static/description/value_range.jpg b/app_search_range/static/description/value_range.jpg deleted file mode 100644 index 424b1369..00000000 Binary files a/app_search_range/static/description/value_range.jpg and /dev/null differ diff --git a/app_search_range/static/description/value_range.png b/app_search_range/static/description/value_range.png deleted file mode 100644 index e1b33e3b..00000000 Binary files a/app_search_range/static/description/value_range.png and /dev/null differ diff --git a/app_search_range/static/src/css/app_search_range.css b/app_search_range/static/src/css/app_search_range.css deleted file mode 100644 index 673b57ff..00000000 --- a/app_search_range/static/src/css/app_search_range.css +++ /dev/null @@ -1,11 +0,0 @@ -.tree_search_item { - cursor: pointer; -} - -.tree_search_item .selected a:before { - font-family: FontAwesome; - position: absolute; - left: 6px; - top: 3px; - content: ""; -} \ No newline at end of file diff --git a/app_search_range/static/src/js/pivot.js b/app_search_range/static/src/js/pivot.js deleted file mode 100644 index e758a449..00000000 --- a/app_search_range/static/src/js/pivot.js +++ /dev/null @@ -1,257 +0,0 @@ -odoo.define('app_search_range_range.pivot', function (require) { -"use strict"; - -var time = require('web.time'); -var core = require('web.core'); -var data = require('web.data'); -var session = require('web.session'); -var utils = require('web.utils'); -var Model = require('web.Model'); -var PivotView = require('web.PivotView'); -var datepicker = require('web.datepicker'); - -var _t = core._t; -var _lt = core._lt; -var QWeb = core.qweb; - -PivotView.include({ - - init: function() { - this._super.apply(this, arguments); - this.ts_fields = []; - }, - - tgl_on_button_click: function (event) { - var self = this; - var $target = $(event.target), - field, key, first_item; - - field = $target.parent().data('field'); - key = $target.parent().data('key'); - - if (field == -1) { - first_item = $target.parent().parent().children('.tgl_first_item.selected'); - if (!first_item.length) { - $target.parent().parent().children('li').removeClass('selected') - } - } else { - first_item = $target.parent().parent().children('.tgl_first_item').removeClass('selected'); - } - - $target.parent().toggleClass('selected'); - this.tgl_search() - event.stopPropagation(); - - }, - - - render_buttons: function($node) { - var self = this; - var ts_context = this.context.tree_search; - - this._super.apply(this, arguments); - - var l10n = _t.database.parameters; - var datepickers_options = { - pickTime: false, - startDate: moment({ y: 1900 }), - endDate: moment().add(200, "y"), - calendarWeeks: true, - icons : { - time: 'fa fa-clock-o', - date: 'fa fa-calendar', - up: 'fa fa-chevron-up', - down: 'fa fa-chevron-down' - }, - language : moment.locale(), - format : time.strftime_to_moment_format(l10n.date_format), - } - - // Dropdown list - - $(QWeb.render("TGL.TreeSearch.Placeholder", {})).appendTo($node); - - _.each(ts_context, function(item){ - var field = _.find(self.fields, function(value, key, list){ - return value.type == 'many2one' && value.relation && key === item.name; - }); - - if (field) { - self.ts_fields.push(item.name); - - new Model(field.relation).query(['id', 'display_name']).filter(new data.CompoundDomain(item.domain, field.domain)).context(new data.CompoundContext()).order_by('app_sequence').all().then(function (result) { - var $multi_search = $(QWeb.render("TGL.TreeSearch.Item", {'widget': { - 'string': item.string, - 'key': item.name, - 'class_name': 'app_multi_item_' + item.name, - 'fields': result, - }})) - - $multi_search.find('li').click(self.tgl_on_button_click.bind(self)); - - setTimeout(function(){ - $multi_search.appendTo($('.treesearch_placeholder')); - }, 2000); - }); - } - }); - // self.$buttons.find('.app-search').remove(); - - var date_fields = []; - // 增加参数控制app_show_search_date - new Model('ir.config_parameter').call('search_read', [[['key', '=', 'app_show_search_date']], ['value']]).then(function (show) { - if (show.length >= 1 && (show[0]['value'] == "True")) { - _.each(self.fields, function (value, key, list) { - if (value.store && value.type === "datetime" || value.type === "date") { - date_fields.push([key, value.string]); - } - }); - - if (date_fields.length > 0) { - self.$search_button = $(QWeb.render('odooApp.buttons', {'date_fields': date_fields})) - self.$search_button.find('.app_start_date').datetimepicker(datepickers_options); - self.$search_button.find('.app_end_date').datetimepicker(datepickers_options); - self.$search_button.find('.app_start_date').on('change', function () { - self.tgl_search(); - }); - self.$search_button.find('.app_end_date').on('change', function () { - self.tgl_search(); - }); - self.$search_button.find('.app_select_field').on('change', function () { - self.tgl_search(); - }); - setTimeout(function () { - self.$search_button.insertBefore($('.treesearch_placeholder')); - }, 500); - } - } - }); - - var number_fields = []; - - // 增加参数控制app_show_search_number - new Model('ir.config_parameter').call('search_read', [[['key', '=', 'app_show_search_number']], ['value']]).then(function (show) { - if (show.length >= 1 && (show[0]['value'] == "True")) { - number_fields = []; - _.each(self.fields, function (value, key, list) { - if (value.string && value.string.length > 1 && value.store && (value.type === "integer" || value.type === "float" || value.type === "monetary")) { - number_fields.push([key, value.string]); - } - }); - - if (number_fields.length > 0) { - self.$search_range = $(QWeb.render('odooApp.SearchRange', {'number_fields': number_fields})) - self.$search_range.find('.app_select_range_field').on('change', function () { - self.tgl_search(); - }); - self.$search_range.find('.app_start_range').on('change', function () { - self.tgl_search(); - }); - self.$search_range.find('.app_end_range').on('change', function () { - self.tgl_search(); - }); - setTimeout(function () { - self.$search_range.insertBefore($('.treesearch_placeholder')); - }, 500); - } - } - }); - }, - - do_search: function(domain, context, group_by) { - var self = this; - this.last_domain = domain; - this.last_context = context; - this.last_group_by = group_by; - this.old_search = _.bind(this._super, this); - return self.tgl_search(); - }, - - tgl_search: function() { - var self = this; - var domain = [], value, value_tmp; - - _.each(self.ts_fields, function(field){ - value = $('.app_item_' + field).val(); - - var select_fields = $('.app_multi_item_' + field).children('.selected'), - select_value = []; - if (select_fields.length > 0) { - _.each(select_fields, function(item){ - value_tmp = $(item).data('field'); - if (value_tmp > 0) { - select_value.push($(item).data('field')); - } - }); - if (select_value.length) { - domain.push([field, 'in', select_value]); - } - - } - }); - -// 注意,date和datetime型的处理是不同的,已处理完 - if (self.$search_button) { - var start_date = self.$search_button.find('.app_start_date').val(), - end_date = self.$search_button.find('.app_end_date').val(), - field = self.$search_button.find('.app_select_field').val(), - field_type = 'datetime'; - var tz = session.user_context.tz, - start_utc, - end_utc; - - _.each(self.columns, function (value, key, list) { - if (value.name == field) { - field_type = value.type; - return false; - } - }); - - moment.locale(tz); - var l10n = _t.database.parameters; - if (start_date) { - if (field_type == 'date') { - //日期类型,无须utc处理 - start_date = moment(moment(start_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD'); - domain.push([field, '>=', start_date]); - } else { - //日期时间,处理utc - start_date = moment(moment(start_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD 00:00:00'); - start_utc = moment(start_date) - domain.push([field, '>=', start_utc]); - } - } - if (end_date) { - if (field_type == 'date') { - end_date = moment(moment(end_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD'); - domain.push([field, '<=', end_date]); - } else { - end_date = moment(moment(end_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD 00:00:00'); - end_utc = moment(end_date) - domain.push([field, '<=', end_utc]); - } - } - } - - if (self.$search_range) { - var start_range = self.$search_range.find('.app_start_range').val(), - end_range = self.$search_range.find('.app_end_range').val(), - range_field = self.$search_range.find('.app_select_range_field').val(); - - if (start_range) { - domain.push([range_field, '>=', parseInt(start_range)]); - } - if (end_range) { - domain.push([range_field, '<=', parseInt(end_range)]); - } - } - // console.log(domain); - var compound_domain = new data.CompoundDomain(self.last_domain, domain); - self.dataset.domain = compound_domain.eval(); - return self.old_search(compound_domain, self.last_context, self.last_group_by); - }, - - -}); - -}); \ No newline at end of file diff --git a/app_search_range/static/src/js/tree.js b/app_search_range/static/src/js/tree.js deleted file mode 100644 index 9d0ca0c3..00000000 --- a/app_search_range/static/src/js/tree.js +++ /dev/null @@ -1,271 +0,0 @@ -odoo.define('app_search_range_range.tree', function (require) { -"use strict"; - -var time = require('web.time'); -var core = require('web.core'); -var data = require('web.data'); -var session = require('web.session'); -var utils = require('web.utils'); -var Model = require('web.Model'); -var ListView = require('web.ListView'); -var datepicker = require('web.datepicker'); -var ViewManager = require('web.ViewManager') -var _t = core._t; -var _lt = core._lt; -var QWeb = core.qweb; - -ListView.include({ - - init: function(parent, dataset, view_id, options) { - this._super.apply(this, arguments); - this.ts_context = dataset.context.tree_search; - this.fields_range = dataset.context.fields_range; - this.ts_fields = []; - }, - - on_button_click: function (event) { - var self = this; - var $target = $(event.target), - field, key, first_item; - - field = $target.parent().data('field'); - key = $target.parent().data('key'); - - if (field == -1) { - first_item = $target.parent().parent().children('.tgl_first_item.selected'); - if (!first_item.length) { - $target.parent().parent().children('li').removeClass('selected') - } - } else { - first_item = $target.parent().parent().children('.tgl_first_item').removeClass('selected'); - } - - $target.parent().toggleClass('selected'); - this.tgl_search() - event.stopPropagation(); - - }, - - render_buttons: function($node) { - var self = this; - this._super.apply(this, arguments); - - var l10n = _t.database.parameters; - var datepickers_options = { - pickTime: false, - startDate: moment({ y: 1900 }), - endDate: moment().add(200, "y"), - calendarWeeks: true, - icons : { - time: 'fa fa-clock-o', - date: 'fa fa-calendar', - up: 'fa fa-chevron-up', - down: 'fa fa-chevron-down' - }, - language : moment.locale(), - format : time.strftime_to_moment_format(l10n.date_format), - } - - self.$buttons.find('.app-search').remove(); - - var date_fields = []; - // 增加参数控制app_show_search_date - new Model('ir.config_parameter').call('search_read', [[['key', '=', 'app_show_search_date']], ['value']]).then(function (show) { - if (show.length >= 1 && (show[0]['value'] == "True")) { - _.each(self.columns, function (value, key, list) { - if (value.store && value.type === "datetime" || value.type === "date") { - date_fields.push([value.name, value.string, value.type]); - } - }); - if (date_fields.length > 0) { - self.$search_button = $(QWeb.render('odooApp.buttons', {'date_fields': date_fields})) - self.$search_button.find('.app_start_date').datetimepicker(datepickers_options); - self.$search_button.find('.app_end_date').datetimepicker(datepickers_options); - // self.$search_button.find('.app_search_date_rate').click(function() { - // self.tgl_search(); - // }); - self.$search_button.find('.app_start_date').on('change', function () { - self.tgl_search(); - }); - self.$search_button.find('.app_end_date').on('change', function () { - self.tgl_search(); - }); - self.$search_button.find('.app_select_field').on('change', function () { - self.tgl_search(); - }); - self.$search_button.appendTo(self.$buttons); - } - } - }); - - - var number_fields = []; - - // 增加参数控制app_show_search_number - new Model('ir.config_parameter').call('search_read', [[['key', '=', 'app_show_search_number']], ['value']]).then(function (show) { - if (show.length >= 1 && (show[0]['value'] == "True")) { - _.each(self.columns, function (value, key, list) { - if (value.string && value.string.length > 1 && value.store && (value.type === "integer" || value.type === "float" || value.type === "monetary")) { - number_fields.push([value.name, value.string]); - } - }); - - if (number_fields.length == 0) { - if (self.fields_range) { - number_fields = self.fields_range; - } - } - if (number_fields.length > 0) { - self.$search_range = $(QWeb.render('odooApp.SearchRange', {'number_fields': number_fields})) - // self.$search_range.find('.app_search_date_range').click(function() { - // self.tgl_search(); - // }); - self.$search_range.find('.app_select_range_field').on('change', function () { - self.tgl_search(); - }); - self.$search_range.find('.app_start_range').on('change', function () { - self.tgl_search(); - }); - self.$search_range.find('.app_end_range').on('change', function () { - self.tgl_search(); - }); - self.$search_range.appendTo(self.$buttons); - } - } - }); - - // Dropdown list - _.each(this.ts_context, function(item){ - var field = _.find(self.columns, function(column){ - return column.type == 'many2one' && column.relation && column.name === item.name; - }); - if (field) { - self.ts_fields.push(item.name); - new Model(field.relation).query(['id', 'display_name']).filter(new data.CompoundDomain(item.domain, field.domain)).context(new data.CompoundContext()).all().then(function (result) { - // var single_search = $(QWeb.render('odooApp.selection', { - // 'string': item.string, - // 'class_name': 'app_item_' + item.name, - // 'fields': result, - // })); - if (!$('.after_control_panel').length) { - // $(QWeb.render('odooApp.after_control_panel', {})).appendTo($('.o_control_panel')); - // $(QWeb.render('odooApp.after_control_panel', {})).appendTo($('.o_cp_left')); - - // $(QWeb.render('odooApp.after_control_panel', {})).appendTo(self.$buttons); - - var multi_search = $(QWeb.render("TGL.TreeSearch.Item", {'widget': { - 'string': item.string, - 'key': item.name, - 'class_name': 'app_multi_item_' + item.name, - 'fields': result, - }})) - - multi_search.find('li').click(self.on_button_click.bind(self)); - multi_search.appendTo(self.$buttons); - } - // single_search.appendTo($('.after_control_panel')); - // $('.app_item_' + item.name).on('change', function() { - // self.tgl_search(); - // }) - }); - } - }); - - - }, - - do_search: function(domain, context, group_by) { - var self = this; - this.last_domain = domain; - this.last_context = context; - this.last_group_by = group_by; - this.old_search = _.bind(this._super, this); - return self.tgl_search(); - }, - - tgl_search: function() { - var self = this; - var domain = [], value, value_tmp; - - _.each(self.ts_fields, function(field){ - value = $('.app_item_' + field).val(); - - var select_fields = $('.app_multi_item_' + field).children('.selected'), - select_value = []; - if (select_fields.length > 0) { - _.each(select_fields, function(item){ - value_tmp = $(item).data('field'); - if (value_tmp > 0) { - select_value.push($(item).data('field')); - } - }); - if (select_value.length) { - domain.push([field, 'in', select_value]); - } - - } - }); -// 注意,date和datetime型的处理是不同的,已处理完 - if (self.$search_button) { - var start_date = self.$search_button.find('.app_start_date').val(), - end_date = self.$search_button.find('.app_end_date').val(), - field = self.$search_button.find('.app_select_field').val(), - field_type = 'datetime'; - var tz = session.user_context.tz, - start_utc, - end_utc; - - _.each(self.columns, function (value, key, list) { - if (value.name == field) { - field_type = value.type; - return false; - } - }); - - moment.locale(tz); - var l10n = _t.database.parameters; - if (start_date) { - if (field_type === 'date') { - //日期类型,无须utc处理 - start_date = moment(moment(start_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD'); - domain.push([field, '>=', start_date]); - } else { - //日期时间,处理utc - start_date = moment(moment(start_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD 00:00:00'); - start_utc = moment(start_date) - domain.push([field, '>=', start_utc]); - } - } - if (end_date) { - if (field_type === 'date') { - end_date = moment(moment(end_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD'); - domain.push([field, '<=', end_date]); - } else { - end_date = moment(moment(end_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD 00:00:00'); - end_utc = moment(end_date) - domain.push([field, '<=', end_utc]); - } - } - } - - if (self.$search_range) { - var start_range = self.$search_range.find('.app_start_range').val(), - end_range = self.$search_range.find('.app_end_range').val(), - range_field = self.$search_range.find('.app_select_range_field').val(); - - if (start_range) { - domain.push([range_field, '>=', parseInt(start_range)]); - } - if (end_range) { - domain.push([range_field, '<=', parseInt(end_range)]); - } - } - // console.log(domain); - var compound_domain = new data.CompoundDomain(self.last_domain, domain); - self.dataset.domain = compound_domain.eval(); - return self.old_search(compound_domain, self.last_context, self.last_group_by); - }, - -}); - -}); \ No newline at end of file diff --git a/app_search_range/static/src/xml/pivot_view.xml b/app_search_range/static/src/xml/pivot_view.xml deleted file mode 100644 index 4ba3d0c3..00000000 --- a/app_search_range/static/src/xml/pivot_view.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - -

-
- - - -
- - - -
-
- -
- - - -
-
-
-
- - -
- - - -
- -
    -
  • All
  • -
  • - -
  • -
-
- -
- - - \ No newline at end of file diff --git a/app_search_range/views/template_view.xml b/app_search_range/views/template_view.xml deleted file mode 100644 index b6cc479d..00000000 --- a/app_search_range/views/template_view.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app_ui_enhance/__init__.py b/app_ui_enhance/__init__.py deleted file mode 100644 index 0f7cb6b2..00000000 --- a/app_ui_enhance/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# -*- coding: utf-8 -*- -import models \ No newline at end of file diff --git a/app_ui_enhance/__openerp__.py b/app_ui_enhance/__openerp__.py deleted file mode 100644 index 9e3f5537..00000000 --- a/app_ui_enhance/__openerp__.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-05 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: -{ - 'name': 'App Web UI Enhance(Search by date or number range,List background color,Barcode Setting.)', - 'version': '10.0.1.0', - 'category': 'web', - 'author': 'Sunpop.cn', - 'website': 'http://www.sunpop.cn', - 'license': 'AGPL-3', - 'sequence': 2, - 'summary': """ - UI Enhance for Odoo. - 1.Search by date or number range in List view and Pivot view. - 2.Instructions for Activating List background color property. - 3.Reset the barcode format. - 4.Draggable Dialog - """, - 'description': """ - -1.Search by date or number range in List view and Pivot view --------------------------------------------------- -2.Instructions for Activating List background color property - -Just add tree attribute like style and colors with condition you want. - -bg_colors="grey:state=='cancel';green:state=='draft';blue:state in ('done');red:state in ('waiting')" - - -eg. - - - demo.tree - demo.model - - - - - - - --------------------------------------------------- - - """, - 'depends': ['web', 'report', 'app_odoo_customize'], - 'data': [ - 'views/app_ui_config_settings_view.xml', - 'views/template_view.xml', - # data - 'data/ir_config_parameter.xml', - ], - 'qweb': [ - 'static/src/xml/*.xml', - ], - "price": 68.00, - "currency": "EUR", - - 'images': ['static/description/list_pivot.png'], - - 'installable': True, - 'auto_install': False, - 'application': True, -} diff --git a/app_ui_enhance/data/ir_config_parameter.xml b/app_ui_enhance/data/ir_config_parameter.xml deleted file mode 100644 index cb432dd2..00000000 --- a/app_ui_enhance/data/ir_config_parameter.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - app_ui_show_search_date - True - - - app_ui_show_search_number - False - - - app_ui_force_barcode - Code128 - - - - app_ui_allow_barcode - QR,Standard39 - - - \ No newline at end of file diff --git a/app_ui_enhance/i18n/zh_CN.po b/app_ui_enhance/i18n/zh_CN.po deleted file mode 100644 index 5d5c82a4..00000000 --- a/app_ui_enhance/i18n/zh_CN.po +++ /dev/null @@ -1,270 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * app_ui_enhance -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0+e-20171107\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-01-28 19:12+0000\n" -"PO-Revision-Date: 2018-01-28 19:12+0000\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: app_ui_enhance -#. openerp-web -#: code:addons/app_ui_enhance/static/src/xml/pivot_view.xml:71 -#: code:addons/app_ui_enhance/static/src/xml/pivot_view.xml:92 -#, python-format -msgid "All" -msgstr "全部" - -#. module: app_ui_enhance -#: model:ir.model.fields,field_description:app_ui_enhance.field_app_ui_config_settings_app_ui_allow_barcode -msgid "Allow Barcode, Seperated by \",\"" -msgstr "允许的条码,用\",\"分隔" - -#. module: app_ui_enhance -#: model:ir.model,name:app_ui_enhance.model_app_ui_config_settings -msgid "App Web UI enhance settings" -msgstr "界面优化设置" - -#. module: app_ui_enhance -#: model:ir.ui.view,arch_db:app_ui_enhance.view_app_ui_config_settings -msgid "Apply" -msgstr "应用" - -#. module: app_ui_enhance -#: model:ir.ui.view,arch_db:app_ui_enhance.view_app_ui_config_settings -msgid "Cancel" -msgstr "取消" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "Codabar" -msgstr "Codabar" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "Code11" -msgstr "Code11" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "Code128" -msgstr "Code128" - -#. module: app_ui_enhance -#: model:ir.model.fields,field_description:app_ui_enhance.field_app_ui_config_settings_create_uid -msgid "Created by" -msgstr "创建人" - -#. module: app_ui_enhance -#: model:ir.model.fields,field_description:app_ui_enhance.field_app_ui_config_settings_create_date -msgid "Created on" -msgstr "创建时间" - -#. module: app_ui_enhance -#: model:ir.model.fields,help:app_ui_enhance.field_app_ui_config_settings_app_ui_allow_barcode -msgid "Default Allow QR and Standard39." -msgstr "建议默认输入 QR,Standard39" - -#. module: app_ui_enhance -#: model:ir.model.fields,field_description:app_ui_enhance.field_app_ui_config_settings_display_name -msgid "Display Name" -msgstr "显示名称" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "EAN13" -msgstr "EAN13" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "EAN8" -msgstr "EAN8" - -#. module: app_ui_enhance -#. openerp-web -#: code:addons/app_ui_enhance/static/src/xml/pivot_view.xml:22 -#, python-format -msgid "End date" -msgstr "结束日期" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "Extended39" -msgstr "Extended39" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "Extended93" -msgstr "Extended93" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "FIM" -msgstr "FIM" - -#. module: app_ui_enhance -#: model:ir.model.fields,field_description:app_ui_enhance.field_app_ui_config_settings_app_ui_force_barcode -msgid "Force all Odoo Barcode to:" -msgstr "强制设置所有Odoo条码格式:" - -#. module: app_ui_enhance -#. openerp-web -#: code:addons/app_ui_enhance/static/src/xml/pivot_view.xml:43 -#, python-format -msgid "From" -msgstr "从" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "I2of5" -msgstr "I2of5" - -#. module: app_ui_enhance -#: model:ir.model.fields,field_description:app_ui_enhance.field_app_ui_config_settings_id -msgid "ID" -msgstr "ID" - -#. module: app_ui_enhance -#: model:ir.ui.view,arch_db:app_ui_enhance.view_app_ui_config_settings -msgid "Item to Show" -msgstr "显示/隐藏菜单项" - -#. module: app_ui_enhance -#: model:ir.model.fields,field_description:app_ui_enhance.field_app_ui_config_settings___last_update -msgid "Last Modified on" -msgstr "最后修改日" - -#. module: app_ui_enhance -#: model:ir.model.fields,field_description:app_ui_enhance.field_app_ui_config_settings_write_uid -msgid "Last Updated by" -msgstr "最后更新人" - -#. module: app_ui_enhance -#: model:ir.model.fields,field_description:app_ui_enhance.field_app_ui_config_settings_write_date -msgid "Last Updated on" -msgstr "最后更新时间" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "MSI" -msgstr "MSI" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "Odoo Default" -msgstr "Odoo 默认" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "POSTNET" -msgstr "POSTNET" - -#. module: app_ui_enhance -#. openerp-web -#: code:addons/app_ui_enhance/static/src/xml/pivot_view.xml:18 -#: code:addons/app_ui_enhance/static/src/xml/pivot_view.xml:22 -#: code:addons/app_ui_enhance/static/src/xml/pivot_view.xml:43 -#: code:addons/app_ui_enhance/static/src/xml/pivot_view.xml:47 -#, python-format -msgid "Press Enter to search" -msgstr "直接按回车即可搜索" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "QR" -msgstr "QR" - -#. module: app_ui_enhance -#: model:ir.model,name:app_ui_enhance.model_report -msgid "Report" -msgstr "报表" - -#. module: app_ui_enhance -#: model:ir.ui.view,arch_db:app_ui_enhance.view_app_ui_config_settings -msgid "Report Setting" -msgstr "报表输出设置" - -#. module: app_ui_enhance -#: model:ir.ui.view,arch_db:app_ui_enhance.view_app_ui_config_settings -msgid "Search Enhance" -msgstr "搜索增加" - -#. module: app_ui_enhance -#: model:ir.model.fields,help:app_ui_enhance.field_app_ui_config_settings_app_ui_show_search_date -#: model:ir.model.fields,help:app_ui_enhance.field_app_ui_config_settings_app_ui_show_search_number -msgid "Set 'True' to show, Set 'False' to hide" -msgstr "设为 'True' 则显示,设为 'False' 则隐藏" - -#. module: app_ui_enhance -#: model:ir.model.fields,help:app_ui_enhance.field_app_ui_config_settings_app_ui_force_barcode -msgid "Set Odoo Default to use the barcode odoo define in report(EAN13)." -msgstr "设置为'Odoo默认'即使用代码中设置的条码编码(EAN13)" - -#. module: app_ui_enhance -#: model:ir.model.fields,field_description:app_ui_enhance.field_app_ui_config_settings_app_ui_show_search_date -msgid "Show date range search in tree/pivot view" -msgstr "显示日期搜索,在tree/pivot视图生效" - -#. module: app_ui_enhance -#: model:ir.model.fields,field_description:app_ui_enhance.field_app_ui_config_settings_app_ui_show_search_number -msgid "Show number range search tree/pivot view" -msgstr "显示数值搜索,在tree/pivot视图生效" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "Standard39" -msgstr "Standard39" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "Standard93" -msgstr "Standard93" - -#. module: app_ui_enhance -#. openerp-web -#: code:addons/app_ui_enhance/static/src/xml/pivot_view.xml:18 -#, python-format -msgid "Start date" -msgstr "开始日期" - -#. module: app_ui_enhance -#. openerp-web -#: code:addons/app_ui_enhance/static/src/xml/pivot_view.xml:47 -#, python-format -msgid "To" -msgstr "至" - -#. module: app_ui_enhance -#: model:ir.actions.act_window,name:app_ui_enhance.action_app_ui_config -#: model:ir.ui.menu,name:app_ui_enhance.menu_app_ui_config -msgid "UI Enhance" -msgstr "界面增强" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "UPCA" -msgstr "UPCA" - -#. module: app_ui_enhance -#: selection:app.ui.config.settings,app_ui_force_barcode:0 -msgid "USPS_4State" -msgstr "USPS_4State" - -#. module: app_ui_enhance -#: model:ir.ui.view,arch_db:app_ui_enhance.view_app_ui_config_settings -msgid "odoo UI Enhance" -msgstr "odoo 界面增强" - -#. module: app_ui_enhance -#: model:ir.ui.view,arch_db:app_ui_enhance.view_app_ui_config_settings -msgid "odooApp UI Settings" -msgstr "界面增强设置" - diff --git a/app_ui_enhance/models/__init__.py b/app_ui_enhance/models/__init__.py deleted file mode 100644 index 748f84fd..00000000 --- a/app_ui_enhance/models/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- -import app_ui_config_settings -import report diff --git a/app_ui_enhance/models/app_ui_config_settings.py b/app_ui_enhance/models/app_ui_config_settings.py deleted file mode 100644 index 3a4bede4..00000000 --- a/app_ui_enhance/models/app_ui_config_settings.py +++ /dev/null @@ -1,91 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-16 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: - -import logging - -from openerp import api, fields, models, _ - -_logger = logging.getLogger(__name__) - - -class AppUiConfigSettings(models.TransientModel): - _inherit = 'res.config.settings' - _name = 'app.ui.config.settings' - - _description = u"App Web UI enhance settings" - app_ui_show_search_date = fields.Boolean('Show date range search in tree/pivot view', help=u"Set 'True' to show, Set 'False' to hide") - app_ui_show_search_number = fields.Boolean('Show number range search tree/pivot view', help=u"Set 'True' to show, Set 'False' to hide") - - """Contoller able to render barcode images thanks to reportlab. - Samples: - - - - :param type: Accepted types: 'Codabar', 'Code11', 'Code128', 'EAN13', 'EAN8', 'Extended39', - 'Extended93', 'FIM', 'I2of5', 'MSI', 'POSTNET', 'QR', 'Standard39', 'Standard93', - 'UPCA', 'USPS_4State' - :param humanreadable: Accepted values: 0 (default) or 1. 1 will insert the readable value - at the bottom of the output image - """ - - app_ui_force_barcode = fields.Selection([ - ('Default', 'Odoo Default'), - ('Code128', 'Code128'), - ('Standard39', 'Standard39'), - ('EAN13', 'EAN13'), - ('QR', 'QR'), - ('Codabar', 'Codabar'), - ('Code11', 'Code11'), - ('Extended39', 'Extended39'), - ('EAN8', 'EAN8'), - ('Extended93', 'Extended93'), - ('FIM', 'FIM'), - ('I2of5', 'I2of5'), - ('MSI', 'MSI'), - ('POSTNET', 'POSTNET'), - ('Standard93', 'Standard93'), - ('UPCA', 'UPCA'), - ('USPS_4State', 'USPS_4State'), - ], string='Force all Odoo Barcode to:', help=u"Set Odoo Default to use the barcode odoo define in report(EAN13).") - - app_ui_allow_barcode = fields.Char('Allow Barcode, Seperated by ","', help=u"Default Allow QR and Standard39.") - - @api.model - def get_default_all(self, fields): - ir_config = self.env['ir.config_parameter'] - app_ui_show_search_date = True if ir_config.get_param('app_ui_show_search_date') == "True" else False - app_ui_show_search_number = True if ir_config.get_param('app_ui_show_search_number') == "True" else False - app_ui_force_barcode = ir_config.get_param('app_ui_force_barcode') - app_ui_allow_barcode = ir_config.get_param('app_ui_allow_barcode') - - return dict( - app_ui_show_search_date=app_ui_show_search_date, - app_ui_show_search_number=app_ui_show_search_number, - app_ui_force_barcode=app_ui_force_barcode, - app_ui_allow_barcode=app_ui_allow_barcode - ) - - @api.multi - def set_default_all(self): - self.ensure_one() - ir_config = self.env['ir.config_parameter'] - ir_config.set_param("app_ui_show_search_date", self.app_ui_show_search_date or "False") - ir_config.set_param("app_ui_show_search_number", self.app_ui_show_search_number or "False") - ir_config.set_param("app_ui_force_barcode", self.app_ui_force_barcode or "Default") - ir_config.set_param("app_ui_allow_barcode", self.app_ui_allow_barcode or "") - return True diff --git a/app_ui_enhance/models/report.py b/app_ui_enhance/models/report.py deleted file mode 100644 index d7082d88..00000000 --- a/app_ui_enhance/models/report.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- - -from odoo import api, models, fields, _ -from odoo.addons import decimal_precision as dp -from odoo.exceptions import UserError, ValidationError - -class Report(models.Model): - _inherit = 'report' - - """Contoller able to render barcode images thanks to reportlab. - Samples: - - - - :param type: Accepted types: 'Codabar', 'Code11', 'Code128', 'EAN13', 'EAN8', 'Extended39', - 'Extended93', 'FIM', 'I2of5', 'MSI', 'POSTNET', 'QR', 'Standard39', 'Standard93', - 'UPCA', 'USPS_4State' - :param humanreadable: Accepted values: 0 (default) or 1. 1 will insert the readable value - at the bottom of the output image - """ - - def barcode(self, barcode_type, value, width=600, height=100, humanreadable=0): - ir_config = self.env['ir.config_parameter'] - app_ui_force_barcode = ir_config.get_param('app_ui_force_barcode', default='Default') - app_ui_allow_barcode = ir_config.get_param('app_ui_allow_barcode', default='') - allow = app_ui_allow_barcode.strip(',').split(',') - allowtype = tuple(allow) - if not app_ui_force_barcode or app_ui_force_barcode == 'Default': - return super(Report, self).barcode(barcode_type, value, width, height, humanreadable) - # 在允许的例外列表内 - elif barcode_type in allowtype: - return super(Report, self).barcode(barcode_type, value, width, height, humanreadable) - else: - return super(Report, self).barcode(app_ui_force_barcode, value, width, height, humanreadable) diff --git a/app_ui_enhance/static/description/date_range.jpg b/app_ui_enhance/static/description/date_range.jpg deleted file mode 100644 index 8b702b90..00000000 Binary files a/app_ui_enhance/static/description/date_range.jpg and /dev/null differ diff --git a/app_ui_enhance/static/description/date_range.png b/app_ui_enhance/static/description/date_range.png deleted file mode 100644 index 317099b9..00000000 Binary files a/app_ui_enhance/static/description/date_range.png and /dev/null differ diff --git a/app_ui_enhance/static/description/icon.png b/app_ui_enhance/static/description/icon.png deleted file mode 100644 index 4c57f611..00000000 Binary files a/app_ui_enhance/static/description/icon.png and /dev/null differ diff --git a/app_ui_enhance/static/description/index.html b/app_ui_enhance/static/description/index.html deleted file mode 100644 index b5f35b0a..00000000 --- a/app_ui_enhance/static/description/index.html +++ /dev/null @@ -1,137 +0,0 @@ -
-
-
-

App Search By Date or Number Range

-
-

Please install app_odoo_customize First.

-

This moduld allows user to Search by date or number range in List view and Pivot view.

-
-
    -
  • 1.List all the date/datetime field to select range
  • -
  • 2.List all the integer/float/Monetary field to select range
  • -
  • 3.Auto get user timezone, global Timezone supported.
  • -
  • 4.Easy admin to enable/disable the search.
  • -
-
-
    -
  • 5.Instructions for Activating List background color property.
  • -
  • 6.Reset the barcode format.
  • -
-
-
-
-
-
-
-

Date range

-
- -
-
-
- -
-
-

Value range

-
- -
-
-
- -
-
-

Pivot View

-
- -
-
-
- -
-
-

How to setup

- -

There are 2 way to setup

-

1.Go to Menu: Settings->odooApp->UI Enhance

-

Setup what you need

-
- -
-

2. Go to Menu: Settings->Technical->Parameters->System Parameters

-

You can find "app_ui_show_search_date" and "app_ui_show_search_number"

-

Go to Menu: Settings->Technical->Parameters->System Parameters.

-

Set the Value to "False" if you do not want to show the search. And set "True" to show.

-
- -
-
-
-
-
-
-

Web list View Background Color

-
-

This module changes the line color of records based on condition like state of a record and helps distinguish between different sets of - records based on condition.

- - -

Set Backgroud color to filed in list view based on condition same as colors and style attributes of tree view.

-
-

# Instructions for Activating List background color property

-

- Just add tree attribute like style and colors with condition you want. -

-
bg_colors="grey:state=='cancel';green:state=='draft';blue:state in ('done');red:state in ('waiting')"
-

eg.

-
-    <record id="view_demo_tree" model="ir.ui.view">
-        <field name="name">demo.tree</field>
-        <field name="model">demo.model</field>
-        <field name="arch" type="xml">
-            <tree bg_colors="grey:state=='cancel';green:state=='draft';blue:state in ('done');red:state in ('waiting')" name="demo_tree">
-                <field name="name" string="Appointment" />
-                <field name="state" />
-            </tree>
-        </field>
-    </record>
-                
-
-
-
-
- -
-
-
-

Technical Help & Support

-
-
-
-

- For any type of technical help & support requests, Feel free to contact us

- - guohuadeng@hotmail.com -

- Via QQ: 300883

- - 300883@qq.com -
-
-

- Visit our website for more support.

- - http://www.sunpop.cn -
-
-
-
- -
-
\ No newline at end of file diff --git a/app_ui_enhance/static/description/list_pivot.jpg b/app_ui_enhance/static/description/list_pivot.jpg deleted file mode 100644 index 6b9ff4e8..00000000 Binary files a/app_ui_enhance/static/description/list_pivot.jpg and /dev/null differ diff --git a/app_ui_enhance/static/description/list_pivot.png b/app_ui_enhance/static/description/list_pivot.png deleted file mode 100644 index 59bf05cd..00000000 Binary files a/app_ui_enhance/static/description/list_pivot.png and /dev/null differ diff --git a/app_ui_enhance/static/description/odoo_web_tree_bg_color.png b/app_ui_enhance/static/description/odoo_web_tree_bg_color.png deleted file mode 100644 index 6101c90a..00000000 Binary files a/app_ui_enhance/static/description/odoo_web_tree_bg_color.png and /dev/null differ diff --git a/app_ui_enhance/static/description/setup.png b/app_ui_enhance/static/description/setup.png deleted file mode 100644 index 0c79efd6..00000000 Binary files a/app_ui_enhance/static/description/setup.png and /dev/null differ diff --git a/app_ui_enhance/static/description/setup1.jpg b/app_ui_enhance/static/description/setup1.jpg deleted file mode 100644 index c2f5c09f..00000000 Binary files a/app_ui_enhance/static/description/setup1.jpg and /dev/null differ diff --git a/app_ui_enhance/static/description/setup1.png b/app_ui_enhance/static/description/setup1.png deleted file mode 100644 index e44465d4..00000000 Binary files a/app_ui_enhance/static/description/setup1.png and /dev/null differ diff --git a/app_ui_enhance/static/description/setup2.jpg b/app_ui_enhance/static/description/setup2.jpg deleted file mode 100644 index dcfaaf54..00000000 Binary files a/app_ui_enhance/static/description/setup2.jpg and /dev/null differ diff --git a/app_ui_enhance/static/description/value_range.jpg b/app_ui_enhance/static/description/value_range.jpg deleted file mode 100644 index 424b1369..00000000 Binary files a/app_ui_enhance/static/description/value_range.jpg and /dev/null differ diff --git a/app_ui_enhance/static/description/value_range.png b/app_ui_enhance/static/description/value_range.png deleted file mode 100644 index e1b33e3b..00000000 Binary files a/app_ui_enhance/static/description/value_range.png and /dev/null differ diff --git a/app_ui_enhance/static/description/web_bg_color_change.png b/app_ui_enhance/static/description/web_bg_color_change.png deleted file mode 100644 index cecd5f37..00000000 Binary files a/app_ui_enhance/static/description/web_bg_color_change.png and /dev/null differ diff --git a/app_ui_enhance/static/src/css/app_report_enhance.css b/app_ui_enhance/static/src/css/app_report_enhance.css deleted file mode 100644 index 8d69b38c..00000000 --- a/app_ui_enhance/static/src/css/app_report_enhance.css +++ /dev/null @@ -1,10 +0,0 @@ -/* report更紧凑,无边框 */ -.table-tight td { - padding: 2px !important; - border-top: 0px !important; -} -.table-tight > thead > tr > th, .table-tight > tbody > tr > th, .table-tight > tfoot > tr > th, -.table-tight > thead > tr > td, .table-tight > tbody > tr > td, .table-tight > tfoot > tr > td{ - padding: 2px !important; - border-top: 0px !important; -} \ No newline at end of file diff --git a/app_ui_enhance/static/src/css/app_ui_enhance.css b/app_ui_enhance/static/src/css/app_ui_enhance.css deleted file mode 100644 index 929a62b0..00000000 --- a/app_ui_enhance/static/src/css/app_ui_enhance.css +++ /dev/null @@ -1,71 +0,0 @@ -.tree_search_item { - cursor: pointer; -} - -.tree_search_item .selected a:before { - font-family: FontAwesome; - position: absolute; - left: 6px; - top: 3px; - content: ""; -} - -/* -list标头不换行 -*/ -.table-responsive { - white-space: nowrap !important; -} - -/* -sheet全宽 -*/ -.o_form_view .o_form_sheet_bg .o_form_sheet { - max-width: 98% !important; -} - -/* -强制表格滚动,企业版/社区版中生效 -*/ - -.force_scroll .table-responsive { - white-space: nowrap !important; - overflow: hidden !important; - overflow-x: auto !important; -} - -.force_scroll ::-webkit-scrollbar { - height: 16px !important; -} - -/* 滚动条的滑轨背景颜色 */ -.force_scroll ::-webkit-scrollbar-track { - background-color: lightgrey !important; - -webkit-border-radius: 2em !important; - -moz-border-radius: 2em !important; - border-radius: 2em !important; -} - -/* 滑块颜色 */ -.force_scroll ::-webkit-scrollbar-thumb { - background-color: #666666 !important; - -webkit-border-radius: 2em !important; - -moz-border-radius: 2em !important; - border-radius: 2em !important; -} - -/* 横向滚动条和纵向滚动条相交处尖角的颜色 */ -.force_scroll ::-webkit-scrollbar-corner { - background-color: black; -} - -/* report更紧凑,无边框 */ -.table-tight td { - padding: 2px !important; - border-top: 0px !important; -} -.table-tight > thead > tr > th, .table-tight > tbody > tr > th, .table-tight > tfoot > tr > th, -.table-tight > thead > tr > td, .table-tight > tbody > tr > td, .table-tight > tfoot > tr > td{ - padding: 2px !important; - border-top: 0px !important; -} \ No newline at end of file diff --git a/app_ui_enhance/static/src/css/app_web_enhance.css b/app_ui_enhance/static/src/css/app_web_enhance.css deleted file mode 100644 index 05039982..00000000 --- a/app_ui_enhance/static/src/css/app_web_enhance.css +++ /dev/null @@ -1,60 +0,0 @@ -.tree_search_item { - cursor: pointer; -} - -.tree_search_item .selected a:before { - font-family: FontAwesome; - position: absolute; - left: 6px; - top: 3px; - content: ""; -} - -/* -list标头不换行 -*/ -.table-responsive { - white-space: nowrap !important; -} - -/* -sheet全宽 -*/ -.o_form_view .o_form_sheet_bg .o_form_sheet { - max-width: 98% !important; -} - -/* -强制表格滚动,企业版/社区版中生效 -*/ - -.force_scroll .table-responsive { - white-space: nowrap !important; - overflow: hidden !important; - overflow-x: auto !important; -} - -.force_scroll ::-webkit-scrollbar { - height: 16px !important; -} - -/* 滚动条的滑轨背景颜色 */ -.force_scroll ::-webkit-scrollbar-track { - background-color: lightgrey !important; - -webkit-border-radius: 2em !important; - -moz-border-radius: 2em !important; - border-radius: 2em !important; -} - -/* 滑块颜色 */ -.force_scroll ::-webkit-scrollbar-thumb { - background-color: #666666 !important; - -webkit-border-radius: 2em !important; - -moz-border-radius: 2em !important; - border-radius: 2em !important; -} - -/* 横向滚动条和纵向滚动条相交处尖角的颜色 */ -.force_scroll ::-webkit-scrollbar-corner { - background-color: black; -} \ No newline at end of file diff --git a/app_ui_enhance/static/src/css/web_list_bg_color.css b/app_ui_enhance/static/src/css/web_list_bg_color.css deleted file mode 100644 index 2afb2614..00000000 --- a/app_ui_enhance/static/src/css/web_list_bg_color.css +++ /dev/null @@ -1,7 +0,0 @@ - -.oe_list_field_bg_color div{ - display: inline-block; - height: 100%; - position: relative; - width: 100%; -} diff --git a/app_ui_enhance/static/src/js/pivot.js b/app_ui_enhance/static/src/js/pivot.js deleted file mode 100644 index f98ce534..00000000 --- a/app_ui_enhance/static/src/js/pivot.js +++ /dev/null @@ -1,261 +0,0 @@ -odoo.define('app_ui_enhance.pivot', function (require) { -"use strict"; - -var time = require('web.time'); -var core = require('web.core'); -var data = require('web.data'); -var session = require('web.session'); -var utils = require('web.utils'); -var Model = require('web.Model'); -var PivotView = require('web.PivotView'); -var datepicker = require('web.datepicker'); - -var _t = core._t; -var _lt = core._lt; -var QWeb = core.qweb; - -PivotView.include({ - - init: function() { - this._super.apply(this, arguments); - this.ts_fields = []; - }, - - tgl_on_button_click: function (event) { - var self = this; - var $target = $(event.target), - field, key, first_item; - - field = $target.parent().data('field'); - key = $target.parent().data('key'); - - if (field == -1) { - first_item = $target.parent().parent().children('.tgl_first_item.selected'); - if (!first_item.length) { - $target.parent().parent().children('li').removeClass('selected') - } - } else { - first_item = $target.parent().parent().children('.tgl_first_item').removeClass('selected'); - } - - $target.parent().toggleClass('selected'); - this.tgl_search() - event.stopPropagation(); - - }, - - - render_buttons: function($node) { - var self = this; - var ts_context = this.context.tree_search; - - this._super.apply(this, arguments); - - var l10n = _t.database.parameters; - var datepickers_options = { - pickTime: false, - startDate: moment({ y: 1900 }), - endDate: moment().add(200, "y"), - calendarWeeks: true, - icons : { - time: 'fa fa-clock-o', - date: 'fa fa-calendar', - up: 'fa fa-chevron-up', - down: 'fa fa-chevron-down' - }, - language : moment.locale(), - format : time.strftime_to_moment_format(l10n.date_format), - } - - $(QWeb.render("odooApp.TreeSearch.Placeholder", {})).appendTo($node); - - var date_fields = []; - // 增加参数控制app_ui_show_search_date - new Model('ir.config_parameter').call('search_read', [[['key', '=', 'app_ui_show_search_date']], ['value']]).then(function (show) { - if (show.length >= 1 && (show[0]['value'] == "True")) { - _.each(self.fields, function (value, key, list) { - if (value.store && value.type === "datetime" || value.type === "date") { - date_fields.push([key, value.string]); - } - }); - - if (date_fields.length > 0) { - self.$search_date = $(QWeb.render('odooApp.SearchDate', {'date_fields': date_fields})) - self.$search_date.find('.app_start_date').datetimepicker(datepickers_options); - self.$search_date.find('.app_end_date').datetimepicker(datepickers_options); - - self.$search_date.find('.app_start_date').on('keypress', function (e) { - self.do_keypress(e); - }); - self.$search_date.find('.app_end_date').on('keypress', function (e) { - self.do_keypress(e); - }); - self.$search_date.appendTo($('.o_cp_buttons')); - self.set_search_btn(1); - } - } - }); - - var number_fields = []; - - // 增加参数控制app_ui_show_search_number - new Model('ir.config_parameter').call('search_read', [[['key', '=', 'app_ui_show_search_number']], ['value']]).then(function (show) { - if (show.length >= 1 && (show[0]['value'] == "True")) { - number_fields = []; - _.each(self.fields, function (value, key, list) { - if (value.string && value.string.length > 1 && value.store && (value.type === "integer" || value.type === "float" || value.type === "monetary")) { - number_fields.push([key, value.string]); - } - }); - - if (number_fields.length > 0) { - self.$search_number = $(QWeb.render('odooApp.SearchNumber', {'number_fields': number_fields})) - - self.$search_number.find('.app_start_number').on('keypress', function (e) { - self.do_keypress(e); - }); - self.$search_number.find('.app_end_number').on('keypress', function (e) { - self.do_keypress(e); - }); - self.$search_number.appendTo($('.o_cp_buttons')); - self.set_search_btn(1); - } - } - }); - - //显示搜索键,因为pivot特殊,故要单独处理 - }, - - set_search_btn: function (show) { - var self = this; - if (self.$search_btn) { - self.$search_btn.remove(); - } - if (show) { - self.$search_btn = $(QWeb.render("odooApp.odooapp-btn", {})).appendTo($('.o_cp_buttons')); - self.$search_btn.children('.odooapp-search-btn').on('click', function () { - self.tgl_search(); - }); - self.$search_btn.children('.odooapp-clear-btn').on('click', function () { - self.do_clear(); - }); - } - }, - - do_search: function(domain, context, group_by) { - var self = this; - this.last_domain = domain; - this.last_context = context; - this.last_group_by = group_by; - this.old_search = _.bind(this._super, this); - return self.tgl_search(); - }, - - do_keypress: function(e) { - var self = this; - var keynum = window.event ? e.keyCode : e.which; - if (keynum==13) - return self.tgl_search(); - }, - - do_clear: function() { - var self = this; - if (self.$search_date) { - self.$search_date.find('.app_start_date').val(''); - self.$search_date.find('.app_end_date').val(''); - } - if (self.$search_number) { - self.$search_number.find('.app_start_number').val(''); - self.$search_number.find('.app_end_number').val(''); - } - return self.tgl_search(); - }, - - tgl_search: function() { - var self = this; - var domain = [], value, value_tmp; - - _.each(self.ts_fields, function(field){ - value = $('.app_item_' + field).val(); - - var select_fields = $('.app_multi_item_' + field).children('.selected'), - select_value = []; - if (select_fields.length > 0) { - _.each(select_fields, function(item){ - value_tmp = $(item).data('field'); - if (value_tmp > 0) { - select_value.push($(item).data('field')); - } - }); - if (select_value.length) { - domain.push([field, 'in', select_value]); - } - - } - }); - -// 注意,date和datetime型的处理是不同的,已处理完 - if (self.$search_date) { - var start_date = self.$search_date.find('.app_start_date').val(), - end_date = self.$search_date.find('.app_end_date').val(), - field = self.$search_date.find('.app_select_field').val(), - field_type = 'datetime'; - var tz = session.user_context.tz, - start_utc, - end_utc; - - _.each(self.columns, function (value, key, list) { - if (value.name == field) { - field_type = value.type; - return false; - } - }); - - moment.locale(tz); - var l10n = _t.database.parameters; - if (start_date) { - if (field_type == 'date') { - //日期类型,无须utc处理 - start_date = moment(moment(start_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD'); - domain.push([field, '>=', start_date]); - } else { - //日期时间,处理utc - start_date = moment(moment(start_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD 00:00:00'); - start_utc = moment(start_date) - domain.push([field, '>=', start_utc]); - } - } - if (end_date) { - if (field_type == 'date') { - end_date = moment(moment(end_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD'); - domain.push([field, '<=', end_date]); - } else { - end_date = moment(moment(end_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD 00:00:00'); - end_utc = moment(end_date) - domain.push([field, '<=', end_utc]); - } - } - } - - if (self.$search_number) { - var start_range = self.$search_number.find('.app_start_number').val(), - end_range = self.$search_number.find('.app_end_number').val(), - range_field = self.$search_number.find('.app_select_range_field').val(); - - if (start_range) { - domain.push([range_field, '>=', parseInt(start_range)]); - } - if (end_range) { - domain.push([range_field, '<=', parseInt(end_range)]); - } - } - // console.log(domain); - var compound_domain = new data.CompoundDomain(self.last_domain, domain); - self.dataset.domain = compound_domain.eval(); - return self.old_search(compound_domain, self.last_context, self.last_group_by); - }, - - -}); - -}); \ No newline at end of file diff --git a/app_ui_enhance/static/src/js/tree.js b/app_ui_enhance/static/src/js/tree.js deleted file mode 100644 index ce587996..00000000 --- a/app_ui_enhance/static/src/js/tree.js +++ /dev/null @@ -1,260 +0,0 @@ -odoo.define('app_ui_enhance.tree', function (require) { -"use strict"; - -var time = require('web.time'); -var core = require('web.core'); -var data = require('web.data'); -var session = require('web.session'); -var utils = require('web.utils'); -var Model = require('web.Model'); -var ListView = require('web.ListView'); -var datepicker = require('web.datepicker'); -var ViewManager = require('web.ViewManager') -var _t = core._t; -var _lt = core._lt; -var QWeb = core.qweb; - -ListView.include({ - - init: function(parent, dataset, view_id, options) { - this._super.apply(this, arguments); - this.ts_context = dataset.context.tree_search; - this.fields_range = dataset.context.fields_range; - this.ts_fields = []; - }, - - on_button_click: function (event) { - var self = this; - var $target = $(event.target), - field, key, first_item; - - field = $target.parent().data('field'); - key = $target.parent().data('key'); - - if (field == -1) { - first_item = $target.parent().parent().children('.tgl_first_item.selected'); - if (!first_item.length) { - $target.parent().parent().children('li').removeClass('selected') - } - } else { - first_item = $target.parent().parent().children('.tgl_first_item').removeClass('selected'); - } - - $target.parent().toggleClass('selected'); - this.tgl_search() - event.stopPropagation(); - - }, - - render_buttons: function($node) { - var self = this; - this._super.apply(this, arguments); - - var l10n = _t.database.parameters; - var datepickers_options = { - pickTime: false, - startDate: moment({ y: 1900 }), - endDate: moment().add(200, "y"), - calendarWeeks: true, - icons : { - time: 'fa fa-clock-o', - date: 'fa fa-calendar', - up: 'fa fa-chevron-up', - down: 'fa fa-chevron-down' - }, - language : moment.locale(), - format : time.strftime_to_moment_format(l10n.date_format), - } - - self.$buttons.find('.app-search').remove(); - - var date_fields = []; - // 增加参数控制app_ui_show_search_date - new Model('ir.config_parameter').call('search_read', [[['key', '=', 'app_ui_show_search_date']], ['value']]).then(function (show) { - if (show.length >= 1 && (show[0]['value'] == "True")) { - _.each(self.columns, function (value, key, list) { - if (value.store && value.type === "datetime" || value.type === "date") { - date_fields.push([value.name, value.string, value.type]); - } - }); - if (date_fields.length > 0) { - self.$search_date = $(QWeb.render('odooApp.SearchDate', {'date_fields': date_fields})) - self.$search_date.find('.app_start_date').datetimepicker(datepickers_options); - self.$search_date.find('.app_end_date').datetimepicker(datepickers_options); - - self.$search_date.find('.app_start_date').on('keypress', function (e) { - self.do_keypress(e); - }); - self.$search_date.find('.app_end_date').on('keypress', function (e) { - self.do_keypress(e); - }); - self.$search_date.appendTo(self.$buttons); - self.set_search_btn(1); - } - } - }); - - - var number_fields = []; - - // 增加参数控制app_ui_show_search_number - new Model('ir.config_parameter').call('search_read', [[['key', '=', 'app_ui_show_search_number']], ['value']]).then(function (show) { - if (show.length >= 1 && (show[0]['value'] == "True")) { - _.each(self.columns, function (value, key, list) { - if (value.string && value.string.length > 1 && value.store && (value.type === "integer" || value.type === "float" || value.type === "monetary")) { - number_fields.push([value.name, value.string]); - } - }); - - if (number_fields.length == 0) { - if (self.fields_range) { - number_fields = self.fields_range; - } - } - if (number_fields.length > 0) { - self.$search_number = $(QWeb.render('odooApp.SearchNumber', {'number_fields': number_fields})) - - self.$search_number.find('.app_start_number').on('keypress', function (e) { - self.do_keypress(e); - }); - self.$search_number.find('.app_end_number').on('keypress', function (e) { - self.do_keypress(e); - }); - self.$search_number.appendTo(self.$buttons); - self.set_search_btn(1); - } - } - }); - }, - - set_search_btn: function (show) { - var self = this; - if (self.$search_btn) { - self.$search_btn.remove(); - } - if (show) { - self.$search_btn = $(QWeb.render("odooApp.odooapp-btn", {})).appendTo(self.$buttons); - self.$search_btn.children('.odooapp-search-btn').on('click', function () { - self.tgl_search(); - }); - self.$search_btn.children('.odooapp-clear-btn').on('click', function () { - self.do_clear(); - }); - } - }, - - do_search: function(domain, context, group_by) { - var self = this; - this.last_domain = domain; - this.last_context = context; - this.last_group_by = group_by; - this.old_search = _.bind(this._super, this); - return self.tgl_search(); - }, - - do_keypress: function(e) { - var self = this; - var keynum = window.event ? e.keyCode : e.which; - if (keynum==13) - return self.tgl_search(); - }, - - do_clear: function() { - var self = this; - if (self.$search_date) { - self.$search_date.find('.app_start_date').val(''); - self.$search_date.find('.app_end_date').val(''); - } - if (self.$search_number) { - self.$search_number.find('.app_start_number').val(''); - self.$search_number.find('.app_end_number').val(''); - } - return self.tgl_search(); - }, - - tgl_search: function() { - var self = this; - var domain = [], value, value_tmp; - - _.each(self.ts_fields, function(field){ - value = $('.app_item_' + field).val(); - - var select_fields = $('.app_multi_item_' + field).children('.selected'), - select_value = []; - if (select_fields.length > 0) { - _.each(select_fields, function(item){ - value_tmp = $(item).data('field'); - if (value_tmp > 0) { - select_value.push($(item).data('field')); - } - }); - if (select_value.length) { - domain.push([field, 'in', select_value]); - } - - } - }); -// 注意,date和datetime型的处理是不同的,已处理完 - if (self.$search_date) { - var start_date = self.$search_date.find('.app_start_date').val(), - end_date = self.$search_date.find('.app_end_date').val(), - field = self.$search_date.find('.app_select_field').val(), - field_type = 'datetime'; - var tz = session.user_context.tz, - start_utc, - end_utc; - - _.each(self.columns, function (value, key, list) { - if (value.name == field) { - field_type = value.type; - return false; - } - }); - - moment.locale(tz); - var l10n = _t.database.parameters; - if (start_date) { - if (field_type === 'date') { - //日期类型,无须utc处理 - start_date = moment(moment(start_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD'); - domain.push([field, '>=', start_date]); - } else { - //日期时间,处理utc - start_date = moment(moment(start_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD 00:00:00'); - start_utc = moment(start_date) - domain.push([field, '>=', start_utc]); - } - } - if (end_date) { - if (field_type === 'date') { - end_date = moment(moment(end_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD'); - domain.push([field, '<=', end_date]); - } else { - end_date = moment(moment(end_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD 00:00:00'); - end_utc = moment(end_date) - domain.push([field, '<=', end_utc]); - } - } - } - - if (self.$search_number) { - var start_range = self.$search_number.find('.app_start_number').val(), - end_range = self.$search_number.find('.app_end_number').val(), - range_field = self.$search_number.find('.app_select_range_field').val(); - - if (start_range) { - domain.push([range_field, '>=', parseInt(start_range)]); - } - if (end_range) { - domain.push([range_field, '<=', parseInt(end_range)]); - } - } - // console.log(domain); - var compound_domain = new data.CompoundDomain(self.last_domain, domain); - self.dataset.domain = compound_domain.eval(); - return self.old_search(compound_domain, self.last_context, self.last_group_by); - }, - -}); - -}); \ No newline at end of file diff --git a/app_ui_enhance/static/src/js/web_draggable_dialog.js b/app_ui_enhance/static/src/js/web_draggable_dialog.js deleted file mode 100644 index ae191708..00000000 --- a/app_ui_enhance/static/src/js/web_draggable_dialog.js +++ /dev/null @@ -1,17 +0,0 @@ -odoo.define('app_ui_enhance.web_draggable_dialog', function (require) { -'use strict'; - - var Dialog = require('web.Dialog'); - - Dialog.include({ - open: function () { - this._super.apply(this, arguments); - this._opened.done(function(){ - $(".modal.in").draggable({ - handle: ".modal-header" - }); - }); - return this; - }, - }); -}); diff --git a/app_ui_enhance/static/src/js/web_list_bg_color.js b/app_ui_enhance/static/src/js/web_list_bg_color.js deleted file mode 100644 index 0778f211..00000000 --- a/app_ui_enhance/static/src/js/web_list_bg_color.js +++ /dev/null @@ -1,57 +0,0 @@ -odoo.define('app_ui_enhance.list_bg_color', function (require) { -"use strict"; - -var core = require('web.core'); -var common = require('web.form_common'); -var Model = require('web.Model'); -var time = require('web.time'); -var ListView = require('web.ListView'); -var session = require('web.session'); -var compatibility = require('web.compatibility'); - - ListView.include({ - willStart: function() { - if (this.fields_view.arch.attrs.bg_colors) { - this.bg_colors = _(this.fields_view.arch.attrs.bg_colors.split(';')).chain() - .compact() - .map(function(color_pair) { - var pair = color_pair.split(':'), - color = pair[0], - expr = pair[1]; - return [color, py.parse(py.tokenize(expr)), expr]; - }).value(); - - if (!this.colors) { this.colors = [] } - } - return this._super(); - }, - - style_for: function (record) { - var len, style= ''; - - var context = _.extend({}, record.attributes, { - uid: session.uid, - current_date: moment().format('YYYY-MM-DD') - // TODO: time, datetime, relativedelta - }); - - var i; - var pair; - var expression; - style = this._super(record); - - if (!this.bg_colors) { return style; } - for(i=0, len=this.bg_colors.length; i - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- - - -
-
-
-
- - - - - - -
- -
    -
  • All
  • -
  • - -
  • -
-
- -
- - -
\ No newline at end of file diff --git a/app_ui_enhance/views/app_ui_config_settings_view.xml b/app_ui_enhance/views/app_ui_config_settings_view.xml deleted file mode 100644 index 7e9241ab..00000000 --- a/app_ui_enhance/views/app_ui_config_settings_view.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - App Odoo Customize Settings - app.ui.config.settings - -
-
-
- - - - - - - - - -
-
- - - UI Enhance - ir.actions.act_window - app.ui.config.settings - form - inline - - - -
-
diff --git a/app_ui_enhance/views/template_view.xml b/app_ui_enhance/views/template_view.xml deleted file mode 100644 index ff147b7d..00000000 --- a/app_ui_enhance/views/template_view.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app_widget_extra/__init__.py b/app_widget_extra/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/app_widget_extra/__openerp__.py b/app_widget_extra/__openerp__.py deleted file mode 100644 index 1b41543c..00000000 --- a/app_widget_extra/__openerp__.py +++ /dev/null @@ -1,119 +0,0 @@ -# -*- coding: utf-8 -*- - -# Created on 2017-11-05 -# author: 广州尚鹏,http://www.sunpop.cn -# email: 300883@qq.com -# resource of Sunpop -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -# Odoo在线中文用户手册(长期更新) -# http://www.sunpop.cn/documentation/user/10.0/zh_CN/index.html - -# Odoo10离线中文用户手册下载 -# http://www.sunpop.cn/odoo10_user_manual_document_offline/ -# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) -# http://www.sunpop.cn/odoo10_developer_document_offline/ -# description: - -# base on 'author': "Gilvan Leal", -# website': "https://gilvanleal.github.io/odoowidgets/", -{ - 'name': "App widget extra(Inputmask Widget)", - 'author': "Sunpop.cn", - 'website': 'http://www.sunpop.cn', - 'currency': 'EUR', - 'price': 38, - - 'summary': """ - A Widget to make masks on form fields""", - - 'description': """ -================ -Inputmask Widget -================ - -Based on jquery.inputmask 3.x `Docs in GitHub -`_. - -| An Inputmask Widget helps the user with the input by ensuring a predefined format. -| This can be useful for dates, numerics, phone numbers, ... - -Instructions: -------------- - -- Just add attribute *widget="mask"* and *data-inputmask[-]=""* to **** on form, tree and kanban - - Some examples:: - - - - - - - Or:: - - - - - - - **Note:** Use *contenteditable="true"* for apply mask in others HTML tags: span, div, etc. **Improve** - - -- Just add attribute *widget="mask_regex"* and *data-inputmask[-regex]=""* to **** - - With the regex extension you can use any regular expression as a mask. Currently this does only input restriction. There is no further masking visualization. - - Example email validation:: - - - -- Masking definition: - - :9: Numeric value - :a: Alphabetical value - :\*: Alphanumeric value - :A: Alphabetical uppercasing - :&: Alfanumeric uppercasing - (Use **&** for escape **&** in XML file) - :#: Hexadecimal - -- Attributes: - - :mask: The mask to use. - :repeat: Mask repeat function. Repeat the mask definition x-times. - :greedy: Toggle to allocate as much possible or the opposite. Non-greedy repeat function. - :placeholder: Change the mask placeholder. Default: "_" - :autounmask: Automatically unmask the value when retrieved. Default: false. - :removemaskonsubmit: Remove the mask before submitting the form.Default: false - :clearmaskonlostfocus: Remove the empty mask on blur or when not empty removes the optional trailing part Default: true - :insertmode: Toggle to insert or overwrite input. Default: true. - :clearincomplete: Clear the incomplete input on blur. - :alias: The alias to use. - -- Aliases: - - Some aliases found in the extensions are: email, currency, decimal, integer, date, datetime, dd/mm/yyyy, url, ip, etc. - - Docs: - - * `Date and Datetime `_ - * `Numeric `_ - * `Regex `_ - * `Phone `_ - * `Other `_""", - - - # Categories can be used to filter modules in modules listing - # Check https://github.com/odoo/odoo/blob/master/openerp/addons/base/module/module_data.xml - # for the full list - 'category': 'Extra Tools', - 'version': '1.0', - - # any module necessary for this one to work correctly - 'depends': ['web'], - - # always loaded - "data": ['views/inputmask_templates.xml'], - "qweb": ['static/src/xml/*.xml'], - 'images': ['static/description/main_screenshot.png'] -} diff --git a/app_widget_extra/static/description/icon.png b/app_widget_extra/static/description/icon.png deleted file mode 100644 index 4c57f611..00000000 Binary files a/app_widget_extra/static/description/icon.png and /dev/null differ diff --git a/app_widget_extra/static/description/main_screenshot.png b/app_widget_extra/static/description/main_screenshot.png deleted file mode 100644 index ea045220..00000000 Binary files a/app_widget_extra/static/description/main_screenshot.png and /dev/null differ diff --git a/app_widget_extra/static/lib/jquery.inputmask/jquery.inputmask.bundle.js b/app_widget_extra/static/lib/jquery.inputmask/jquery.inputmask.bundle.js deleted file mode 100644 index 7e02a74c..00000000 --- a/app_widget_extra/static/lib/jquery.inputmask/jquery.inputmask.bundle.js +++ /dev/null @@ -1,2710 +0,0 @@ -/*! -* jquery.inputmask.bundle.js -* https://github.com/RobinHerbots/jquery.inputmask -* Copyright (c) 2010 - 2017 Robin Herbots -* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) -* Version: 3.3.5-34 -*/ -!function($) { - function Inputmask(alias, options, internal) { - return this instanceof Inputmask ? (this.el = void 0, this.events = {}, this.maskset = void 0, - this.refreshValue = !1, void (internal !== !0 && ($.isPlainObject(alias) ? options = alias : (options = options || {}, - options.alias = alias), this.opts = $.extend(!0, {}, this.defaults, options), this.noMasksCache = options && void 0 !== options.definitions, - this.userOptions = options || {}, this.isRTL = this.opts.numericInput, resolveAlias(this.opts.alias, options, this.opts)))) : new Inputmask(alias, options, internal); - } - function resolveAlias(aliasStr, options, opts) { - var aliasDefinition = Inputmask.prototype.aliases[aliasStr]; - return aliasDefinition ? (aliasDefinition.alias && resolveAlias(aliasDefinition.alias, void 0, opts), - $.extend(!0, opts, aliasDefinition), $.extend(!0, opts, options), !0) : (null === opts.mask && (opts.mask = aliasStr), - !1); - } - function generateMaskSet(opts, nocache) { - function generateMask(mask, metadata, opts) { - if (null !== mask && "" !== mask) { - if (1 === mask.length && opts.greedy === !1 && 0 !== opts.repeat && (opts.placeholder = ""), - opts.repeat > 0 || "*" === opts.repeat || "+" === opts.repeat) { - var repeatStart = "*" === opts.repeat ? 0 : "+" === opts.repeat ? 1 : opts.repeat; - mask = opts.groupmarker.start + mask + opts.groupmarker.end + opts.quantifiermarker.start + repeatStart + "," + opts.repeat + opts.quantifiermarker.end; - } - var masksetDefinition; - return void 0 === Inputmask.prototype.masksCache[mask] || nocache === !0 ? (masksetDefinition = { - mask: mask, - maskToken: Inputmask.prototype.analyseMask(mask, opts), - validPositions: {}, - _buffer: void 0, - buffer: void 0, - tests: {}, - metadata: metadata, - maskLength: void 0 - }, nocache !== !0 && (Inputmask.prototype.masksCache[opts.numericInput ? mask.split("").reverse().join("") : mask] = masksetDefinition, - masksetDefinition = $.extend(!0, {}, Inputmask.prototype.masksCache[opts.numericInput ? mask.split("").reverse().join("") : mask]))) : masksetDefinition = $.extend(!0, {}, Inputmask.prototype.masksCache[opts.numericInput ? mask.split("").reverse().join("") : mask]), - masksetDefinition; - } - } - var ms; - if ($.isFunction(opts.mask) && (opts.mask = opts.mask(opts)), $.isArray(opts.mask)) { - if (opts.mask.length > 1) { - opts.keepStatic = null === opts.keepStatic || opts.keepStatic; - var altMask = opts.groupmarker.start; - return $.each(opts.numericInput ? opts.mask.reverse() : opts.mask, function(ndx, msk) { - altMask.length > 1 && (altMask += opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start), - altMask += void 0 === msk.mask || $.isFunction(msk.mask) ? msk : msk.mask; - }), altMask += opts.groupmarker.end, generateMask(altMask, opts.mask, opts); - } - opts.mask = opts.mask.pop(); - } - return opts.mask && (ms = void 0 === opts.mask.mask || $.isFunction(opts.mask.mask) ? generateMask(opts.mask, opts.mask, opts) : generateMask(opts.mask.mask, opts.mask, opts)), - ms; - } - function maskScope(actionObj, maskset, opts) { - function getMaskTemplate(baseOnInput, minimalPos, includeMode) { - minimalPos = minimalPos || 0; - var ndxIntlzr, test, testPos, maskTemplate = [], pos = 0, lvp = getLastValidPosition(); - maxLength = void 0 !== el ? el.maxLength : void 0, maxLength === -1 && (maxLength = void 0); - do baseOnInput === !0 && getMaskSet().validPositions[pos] ? (testPos = getMaskSet().validPositions[pos], - test = testPos.match, ndxIntlzr = testPos.locator.slice(), maskTemplate.push(includeMode === !0 ? testPos.input : includeMode === !1 ? test.nativeDef : getPlaceholder(pos, test))) : (testPos = getTestTemplate(pos, ndxIntlzr, pos - 1), - test = testPos.match, ndxIntlzr = testPos.locator.slice(), (opts.jitMasking === !1 || pos < lvp || "number" == typeof opts.jitMasking && isFinite(opts.jitMasking) && opts.jitMasking > pos) && maskTemplate.push(includeMode === !1 ? test.nativeDef : getPlaceholder(pos, test))), - pos++; while ((void 0 === maxLength || pos < maxLength) && (null !== test.fn || "" !== test.def) || minimalPos > pos); - return "" === maskTemplate[maskTemplate.length - 1] && maskTemplate.pop(), getMaskSet().maskLength = pos + 1, - maskTemplate; - } - function getMaskSet() { - return maskset; - } - function resetMaskSet(soft) { - var maskset = getMaskSet(); - maskset.buffer = void 0, soft !== !0 && (maskset._buffer = void 0, maskset.validPositions = {}, - maskset.p = 0); - } - function getLastValidPosition(closestTo, strict, validPositions) { - var before = -1, after = -1, valids = validPositions || getMaskSet().validPositions; - void 0 === closestTo && (closestTo = -1); - for (var posNdx in valids) { - var psNdx = parseInt(posNdx); - valids[psNdx] && (strict || valids[psNdx].generatedInput !== !0) && (psNdx <= closestTo && (before = psNdx), - psNdx >= closestTo && (after = psNdx)); - } - return before !== -1 && closestTo - before > 1 || after < closestTo ? before : after; - } - function stripValidPositions(start, end, nocheck, strict) { - function IsEnclosedStatic(pos) { - var posMatch = getMaskSet().validPositions[pos]; - if (void 0 !== posMatch && null === posMatch.match.fn) { - var prevMatch = getMaskSet().validPositions[pos - 1], nextMatch = getMaskSet().validPositions[pos + 1]; - return void 0 !== prevMatch && void 0 !== nextMatch; - } - return !1; - } - var i, startPos = start, positionsClone = $.extend(!0, {}, getMaskSet().validPositions), needsValidation = !1; - for (getMaskSet().p = start, i = end - 1; i >= startPos; i--) void 0 !== getMaskSet().validPositions[i] && (nocheck !== !0 && (!getMaskSet().validPositions[i].match.optionality && IsEnclosedStatic(i) || opts.canClearPosition(getMaskSet(), i, getLastValidPosition(), strict, opts) === !1) || delete getMaskSet().validPositions[i]); - for (resetMaskSet(!0), i = startPos + 1; i <= getLastValidPosition(); ) { - for (;void 0 !== getMaskSet().validPositions[startPos]; ) startPos++; - if (i < startPos && (i = startPos + 1), void 0 === getMaskSet().validPositions[i] && isMask(i)) i++; else { - var t = getTestTemplate(i); - needsValidation === !1 && positionsClone[startPos] && positionsClone[startPos].match.def === t.match.def ? (getMaskSet().validPositions[startPos] = $.extend(!0, {}, positionsClone[startPos]), - getMaskSet().validPositions[startPos].input = t.input, delete getMaskSet().validPositions[i], - i++) : positionCanMatchDefinition(startPos, t.match.def) ? isValid(startPos, t.input || getPlaceholder(i), !0) !== !1 && (delete getMaskSet().validPositions[i], - i++, needsValidation = !0) : isMask(i) || (i++, startPos--), startPos++; - } - } - resetMaskSet(!0); - } - function determineTestTemplate(tests, guessNextBest) { - for (var testPos, testPositions = tests, lvp = getLastValidPosition(), lvTest = getMaskSet().validPositions[lvp] || getTests(0)[0], lvTestAltArr = void 0 !== lvTest.alternation ? lvTest.locator[lvTest.alternation].toString().split(",") : [], ndx = 0; ndx < testPositions.length && (testPos = testPositions[ndx], - !(testPos.match && (opts.greedy && testPos.match.optionalQuantifier !== !0 || (testPos.match.optionality === !1 || testPos.match.newBlockMarker === !1) && testPos.match.optionalQuantifier !== !0) && (void 0 === lvTest.alternation || lvTest.alternation !== testPos.alternation || void 0 !== testPos.locator[lvTest.alternation] && checkAlternationMatch(testPos.locator[lvTest.alternation].toString().split(","), lvTestAltArr))) || guessNextBest === !0 && (null !== testPos.match.fn || /[0-9a-bA-Z]/.test(testPos.match.def))); ndx++) ; - return testPos; - } - function getTestTemplate(pos, ndxIntlzr, tstPs) { - return getMaskSet().validPositions[pos] || determineTestTemplate(getTests(pos, ndxIntlzr ? ndxIntlzr.slice() : ndxIntlzr, tstPs)); - } - function getTest(pos) { - return getMaskSet().validPositions[pos] ? getMaskSet().validPositions[pos] : getTests(pos)[0]; - } - function positionCanMatchDefinition(pos, def) { - for (var valid = !1, tests = getTests(pos), tndx = 0; tndx < tests.length; tndx++) if (tests[tndx].match && tests[tndx].match.def === def) { - valid = !0; - break; - } - return valid; - } - function getTests(pos, ndxIntlzr, tstPs) { - function resolveTestFromToken(maskToken, ndxInitializer, loopNdx, quantifierRecurse) { - function handleMatch(match, loopNdx, quantifierRecurse) { - function isFirstMatch(latestMatch, tokenGroup) { - var firstMatch = 0 === $.inArray(latestMatch, tokenGroup.matches); - return firstMatch || $.each(tokenGroup.matches, function(ndx, match) { - if (match.isQuantifier === !0 && (firstMatch = isFirstMatch(latestMatch, tokenGroup.matches[ndx - 1]))) return !1; - }), firstMatch; - } - function resolveNdxInitializer(pos, alternateNdx, targetAlternation) { - var bestMatch, indexPos; - return (getMaskSet().tests[pos] || getMaskSet().validPositions[pos]) && $.each(getMaskSet().tests[pos] || [ getMaskSet().validPositions[pos] ], function(ndx, lmnt) { - var alternation = void 0 !== targetAlternation ? targetAlternation : lmnt.alternation, ndxPos = void 0 !== lmnt.locator[alternation] ? lmnt.locator[alternation].toString().indexOf(alternateNdx) : -1; - (void 0 === indexPos || ndxPos < indexPos) && ndxPos !== -1 && (bestMatch = lmnt, - indexPos = ndxPos); - }), bestMatch ? bestMatch.locator.slice((void 0 !== targetAlternation ? targetAlternation : bestMatch.alternation) + 1) : void 0 !== targetAlternation ? resolveNdxInitializer(pos, alternateNdx) : void 0; - } - function staticCanMatchDefinition(source, target) { - return null === source.match.fn && null !== target.match.fn && target.match.fn.test(source.match.def, getMaskSet(), pos, !1, opts, !1); - } - if (testPos > 1e4) throw "Inputmask: There is probably an error in your mask definition or in the code. Create an issue on github with an example of the mask you are using. " + getMaskSet().mask; - if (testPos === pos && void 0 === match.matches) return matches.push({ - match: match, - locator: loopNdx.reverse(), - cd: cacheDependency - }), !0; - if (void 0 !== match.matches) { - if (match.isGroup && quantifierRecurse !== match) { - if (match = handleMatch(maskToken.matches[$.inArray(match, maskToken.matches) + 1], loopNdx)) return !0; - } else if (match.isOptional) { - var optionalToken = match; - if (match = resolveTestFromToken(match, ndxInitializer, loopNdx, quantifierRecurse)) { - if (latestMatch = matches[matches.length - 1].match, !isFirstMatch(latestMatch, optionalToken)) return !0; - insertStop = !0, testPos = pos; - } - } else if (match.isAlternator) { - var maltMatches, alternateToken = match, malternateMatches = [], currentMatches = matches.slice(), loopNdxCnt = loopNdx.length, altIndex = ndxInitializer.length > 0 ? ndxInitializer.shift() : -1; - if (altIndex === -1 || "string" == typeof altIndex) { - var amndx, currentPos = testPos, ndxInitializerClone = ndxInitializer.slice(), altIndexArr = []; - if ("string" == typeof altIndex) altIndexArr = altIndex.split(","); else for (amndx = 0; amndx < alternateToken.matches.length; amndx++) altIndexArr.push(amndx); - for (var ndx = 0; ndx < altIndexArr.length; ndx++) { - if (amndx = parseInt(altIndexArr[ndx]), matches = [], ndxInitializer = resolveNdxInitializer(testPos, amndx, loopNdxCnt) || ndxInitializerClone.slice(), - match = handleMatch(alternateToken.matches[amndx] || maskToken.matches[amndx], [ amndx ].concat(loopNdx), quantifierRecurse) || match, - match !== !0 && void 0 !== match && altIndexArr[altIndexArr.length - 1] < alternateToken.matches.length) { - var ntndx = $.inArray(match, maskToken.matches) + 1; - maskToken.matches.length > ntndx && (match = handleMatch(maskToken.matches[ntndx], [ ntndx ].concat(loopNdx.slice(1, loopNdx.length)), quantifierRecurse), - match && (altIndexArr.push(ntndx.toString()), $.each(matches, function(ndx, lmnt) { - lmnt.alternation = loopNdx.length - 1; - }))); - } - maltMatches = matches.slice(), testPos = currentPos, matches = []; - for (var ndx1 = 0; ndx1 < maltMatches.length; ndx1++) { - var altMatch = maltMatches[ndx1], hasMatch = !1; - altMatch.alternation = altMatch.alternation || loopNdxCnt; - for (var ndx2 = 0; ndx2 < malternateMatches.length; ndx2++) { - var altMatch2 = malternateMatches[ndx2]; - if (("string" != typeof altIndex || $.inArray(altMatch.locator[altMatch.alternation].toString(), altIndexArr) !== -1) && (altMatch.match.def === altMatch2.match.def || staticCanMatchDefinition(altMatch, altMatch2))) { - hasMatch = altMatch.match.nativeDef === altMatch2.match.nativeDef, altMatch.alternation == altMatch2.alternation && altMatch2.locator[altMatch2.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) === -1 && (altMatch2.locator[altMatch2.alternation] = altMatch2.locator[altMatch2.alternation] + "," + altMatch.locator[altMatch.alternation], - altMatch2.alternation = altMatch.alternation, null == altMatch.match.fn && (altMatch2.na = altMatch2.na || altMatch.locator[altMatch.alternation].toString(), - altMatch2.na.indexOf(altMatch.locator[altMatch.alternation]) === -1 && (altMatch2.na = altMatch2.na + "," + altMatch.locator[altMatch.alternation]))); - break; - } - } - hasMatch || malternateMatches.push(altMatch); - } - } - "string" == typeof altIndex && (malternateMatches = $.map(malternateMatches, function(lmnt, ndx) { - if (isFinite(ndx)) { - var mamatch, alternation = lmnt.alternation, altLocArr = lmnt.locator[alternation].toString().split(","); - lmnt.locator[alternation] = void 0, lmnt.alternation = void 0; - for (var alndx = 0; alndx < altLocArr.length; alndx++) mamatch = $.inArray(altLocArr[alndx], altIndexArr) !== -1, - mamatch && (void 0 !== lmnt.locator[alternation] ? (lmnt.locator[alternation] += ",", - lmnt.locator[alternation] += altLocArr[alndx]) : lmnt.locator[alternation] = parseInt(altLocArr[alndx]), - lmnt.alternation = alternation); - if (void 0 !== lmnt.locator[alternation]) return lmnt; - } - })), matches = currentMatches.concat(malternateMatches), testPos = pos, insertStop = matches.length > 0, - ndxInitializer = ndxInitializerClone.slice(); - } else match = handleMatch(alternateToken.matches[altIndex] || maskToken.matches[altIndex], [ altIndex ].concat(loopNdx), quantifierRecurse); - if (match) return !0; - } else if (match.isQuantifier && quantifierRecurse !== maskToken.matches[$.inArray(match, maskToken.matches) - 1]) for (var qt = match, qndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; qndx < (isNaN(qt.quantifier.max) ? qndx + 1 : qt.quantifier.max) && testPos <= pos; qndx++) { - var tokenGroup = maskToken.matches[$.inArray(qt, maskToken.matches) - 1]; - if (match = handleMatch(tokenGroup, [ qndx ].concat(loopNdx), tokenGroup)) { - if (latestMatch = matches[matches.length - 1].match, latestMatch.optionalQuantifier = qndx > qt.quantifier.min - 1, - isFirstMatch(latestMatch, tokenGroup)) { - if (qndx > qt.quantifier.min - 1) { - insertStop = !0, testPos = pos; - break; - } - return !0; - } - return !0; - } - } else if (match = resolveTestFromToken(match, ndxInitializer, loopNdx, quantifierRecurse)) return !0; - } else testPos++; - } - for (var tndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; tndx < maskToken.matches.length; tndx++) if (maskToken.matches[tndx].isQuantifier !== !0) { - var match = handleMatch(maskToken.matches[tndx], [ tndx ].concat(loopNdx), quantifierRecurse); - if (match && testPos === pos) return match; - if (testPos > pos) break; - } - } - function mergeLocators(tests) { - var locator = []; - return $.isArray(tests) || (tests = [ tests ]), tests.length > 0 && (void 0 === tests[0].alternation ? (locator = determineTestTemplate(tests.slice()).locator.slice(), - 0 === locator.length && (locator = tests[0].locator.slice())) : $.each(tests, function(ndx, tst) { - if ("" !== tst.def) if (0 === locator.length) locator = tst.locator.slice(); else for (var i = 0; i < locator.length; i++) tst.locator[i] && locator[i].toString().indexOf(tst.locator[i]) === -1 && (locator[i] += "," + tst.locator[i]); - })), locator; - } - function filterTests(tests) { - return opts.keepStatic && pos > 0 && tests.length > 1 + ("" === tests[tests.length - 1].match.def ? 1 : 0) && tests[0].match.optionality !== !0 && tests[0].match.optionalQuantifier !== !0 && null === tests[0].match.fn && !/[0-9a-bA-Z]/.test(tests[0].match.def) ? [ determineTestTemplate(tests) ] : tests; - } - var latestMatch, maskTokens = getMaskSet().maskToken, testPos = ndxIntlzr ? tstPs : 0, ndxInitializer = ndxIntlzr ? ndxIntlzr.slice() : [ 0 ], matches = [], insertStop = !1, cacheDependency = ndxIntlzr ? ndxIntlzr.join("") : ""; - if (pos > -1) { - if (void 0 === ndxIntlzr) { - for (var test, previousPos = pos - 1; void 0 === (test = getMaskSet().validPositions[previousPos] || getMaskSet().tests[previousPos]) && previousPos > -1; ) previousPos--; - void 0 !== test && previousPos > -1 && (ndxInitializer = mergeLocators(test), cacheDependency = ndxInitializer.join(""), - testPos = previousPos); - } - if (getMaskSet().tests[pos] && getMaskSet().tests[pos][0].cd === cacheDependency) return filterTests(getMaskSet().tests[pos]); - for (var mtndx = ndxInitializer.shift(); mtndx < maskTokens.length; mtndx++) { - var match = resolveTestFromToken(maskTokens[mtndx], ndxInitializer, [ mtndx ]); - if (match && testPos === pos || testPos > pos) break; - } - } - return (0 === matches.length || insertStop) && matches.push({ - match: { - fn: null, - cardinality: 0, - optionality: !0, - casing: null, - def: "", - placeholder: "" - }, - locator: [], - cd: cacheDependency - }), void 0 !== ndxIntlzr && getMaskSet().tests[pos] ? filterTests($.extend(!0, [], matches)) : (getMaskSet().tests[pos] = $.extend(!0, [], matches), - filterTests(getMaskSet().tests[pos])); - } - function getBufferTemplate() { - return void 0 === getMaskSet()._buffer && (getMaskSet()._buffer = getMaskTemplate(!1, 1), - void 0 === getMaskSet().buffer && getMaskSet()._buffer.slice()), getMaskSet()._buffer; - } - function getBuffer(noCache) { - return void 0 !== getMaskSet().buffer && noCache !== !0 || (getMaskSet().buffer = getMaskTemplate(!0, getLastValidPosition(), !0)), - getMaskSet().buffer; - } - function refreshFromBuffer(start, end, buffer) { - var i; - if (start === !0) resetMaskSet(), start = 0, end = buffer.length; else for (i = start; i < end; i++) delete getMaskSet().validPositions[i]; - for (i = start; i < end; i++) resetMaskSet(!0), buffer[i] !== opts.skipOptionalPartCharacter && isValid(i, buffer[i], !0, !0); - } - function casing(elem, test, pos) { - switch (opts.casing || test.casing) { - case "upper": - elem = elem.toUpperCase(); - break; - - case "lower": - elem = elem.toLowerCase(); - break; - - case "title": - var posBefore = getMaskSet().validPositions[pos - 1]; - elem = 0 === pos || posBefore && posBefore.input === String.fromCharCode(Inputmask.keyCode.SPACE) ? elem.toUpperCase() : elem.toLowerCase(); - } - return elem; - } - function checkAlternationMatch(altArr1, altArr2, na) { - for (var naNdx, altArrC = opts.greedy ? altArr2 : altArr2.slice(0, 1), isMatch = !1, naArr = void 0 !== na ? na.split(",") : [], i = 0; i < naArr.length; i++) (naNdx = altArr1.indexOf(naArr[i])) !== -1 && altArr1.splice(naNdx, 1); - for (var alndx = 0; alndx < altArr1.length; alndx++) if ($.inArray(altArr1[alndx], altArrC) !== -1) { - isMatch = !0; - break; - } - return isMatch; - } - function isValid(pos, c, strict, fromSetValid, fromAlternate) { - function isSelection(posObj) { - var selection = isRTL ? posObj.begin - posObj.end > 1 || posObj.begin - posObj.end === 1 && opts.insertMode : posObj.end - posObj.begin > 1 || posObj.end - posObj.begin === 1 && opts.insertMode; - return selection && 0 === posObj.begin && posObj.end === getMaskSet().maskLength ? "full" : selection; - } - function _isValid(position, c, strict) { - var rslt = !1; - return $.each(getTests(position), function(ndx, tst) { - for (var test = tst.match, loopend = c ? 1 : 0, chrs = "", i = test.cardinality; i > loopend; i--) chrs += getBufferElement(position - (i - 1)); - if (c && (chrs += c), getBuffer(!0), rslt = null != test.fn ? test.fn.test(chrs, getMaskSet(), position, strict, opts, isSelection(pos)) : (c === test.def || c === opts.skipOptionalPartCharacter) && "" !== test.def && { - c: getPlaceholder(position, test, !0) || test.def, - pos: position - }, rslt !== !1) { - var elem = void 0 !== rslt.c ? rslt.c : c; - elem = elem === opts.skipOptionalPartCharacter && null === test.fn ? getPlaceholder(position, test, !0) || test.def : elem; - var validatedPos = position, possibleModifiedBuffer = getBuffer(); - if (void 0 !== rslt.remove && ($.isArray(rslt.remove) || (rslt.remove = [ rslt.remove ]), - $.each(rslt.remove.sort(function(a, b) { - return b - a; - }), function(ndx, lmnt) { - stripValidPositions(lmnt, lmnt + 1, !0); - })), void 0 !== rslt.insert && ($.isArray(rslt.insert) || (rslt.insert = [ rslt.insert ]), - $.each(rslt.insert.sort(function(a, b) { - return a - b; - }), function(ndx, lmnt) { - isValid(lmnt.pos, lmnt.c, !0, fromSetValid); - })), rslt.refreshFromBuffer) { - var refresh = rslt.refreshFromBuffer; - if (strict = !0, refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, possibleModifiedBuffer), - void 0 === rslt.pos && void 0 === rslt.c) return rslt.pos = getLastValidPosition(), - !1; - if (validatedPos = void 0 !== rslt.pos ? rslt.pos : position, validatedPos !== position) return rslt = $.extend(rslt, isValid(validatedPos, elem, !0, fromSetValid)), - !1; - } else if (rslt !== !0 && void 0 !== rslt.pos && rslt.pos !== position && (validatedPos = rslt.pos, - refreshFromBuffer(position, validatedPos, getBuffer().slice()), validatedPos !== position)) return rslt = $.extend(rslt, isValid(validatedPos, elem, !0)), - !1; - return (rslt === !0 || void 0 !== rslt.pos || void 0 !== rslt.c) && (ndx > 0 && resetMaskSet(!0), - setValidPosition(validatedPos, $.extend({}, tst, { - input: casing(elem, test, validatedPos) - }), fromSetValid, isSelection(pos)) || (rslt = !1), !1); - } - }), rslt; - } - function alternate(pos, c, strict) { - var lastAlt, alternation, altPos, prevAltPos, i, validPos, altNdxs, decisionPos, validPsClone = $.extend(!0, {}, getMaskSet().validPositions), isValidRslt = !1, lAltPos = getLastValidPosition(); - for (prevAltPos = getMaskSet().validPositions[lAltPos]; lAltPos >= 0; lAltPos--) if (altPos = getMaskSet().validPositions[lAltPos], - altPos && void 0 !== altPos.alternation) { - if (lastAlt = lAltPos, alternation = getMaskSet().validPositions[lastAlt].alternation, - prevAltPos.locator[altPos.alternation] !== altPos.locator[altPos.alternation]) break; - prevAltPos = altPos; - } - if (void 0 !== alternation) { - decisionPos = parseInt(lastAlt); - var decisionTaker = void 0 !== prevAltPos.locator[prevAltPos.alternation || alternation] ? prevAltPos.locator[prevAltPos.alternation || alternation] : altNdxs[0]; - decisionTaker.length > 0 && (decisionTaker = decisionTaker.split(",")[0]); - var possibilityPos = getMaskSet().validPositions[decisionPos], prevPos = getMaskSet().validPositions[decisionPos - 1]; - $.each(getTests(decisionPos, prevPos ? prevPos.locator : void 0, decisionPos - 1), function(ndx, test) { - altNdxs = test.locator[alternation] ? test.locator[alternation].toString().split(",") : []; - for (var mndx = 0; mndx < altNdxs.length; mndx++) { - var validInputs = [], staticInputsBeforePos = 0, staticInputsBeforePosAlternate = 0, verifyValidInput = !1; - if (decisionTaker < altNdxs[mndx] && (void 0 === test.na || $.inArray(altNdxs[mndx], test.na.split(",")) === -1)) { - getMaskSet().validPositions[decisionPos] = $.extend(!0, {}, test); - var possibilities = getMaskSet().validPositions[decisionPos].locator; - for (getMaskSet().validPositions[decisionPos].locator[alternation] = parseInt(altNdxs[mndx]), - null == test.match.fn ? (possibilityPos.input !== test.match.def && (verifyValidInput = !0, - possibilityPos.generatedInput !== !0 && validInputs.push(possibilityPos.input)), - staticInputsBeforePosAlternate++, getMaskSet().validPositions[decisionPos].generatedInput = !/[0-9a-bA-Z]/.test(test.match.def), - getMaskSet().validPositions[decisionPos].input = test.match.def) : getMaskSet().validPositions[decisionPos].input = possibilityPos.input, - i = decisionPos + 1; i < getLastValidPosition(void 0, !0) + 1; i++) validPos = getMaskSet().validPositions[i], - validPos && validPos.generatedInput !== !0 && /[0-9a-bA-Z]/.test(validPos.input) ? validInputs.push(validPos.input) : i < pos && staticInputsBeforePos++, - delete getMaskSet().validPositions[i]; - for (verifyValidInput && validInputs[0] === test.match.def && validInputs.shift(), - resetMaskSet(!0), isValidRslt = !0; validInputs.length > 0; ) { - var input = validInputs.shift(); - if (input !== opts.skipOptionalPartCharacter && !(isValidRslt = isValid(getLastValidPosition(void 0, !0) + 1, input, !1, fromSetValid, !0))) break; - } - if (isValidRslt) { - getMaskSet().validPositions[decisionPos].locator = possibilities; - var targetLvp = getLastValidPosition(pos) + 1; - for (i = decisionPos + 1; i < getLastValidPosition() + 1; i++) validPos = getMaskSet().validPositions[i], - (void 0 === validPos || null == validPos.match.fn) && i < pos + (staticInputsBeforePosAlternate - staticInputsBeforePos) && staticInputsBeforePosAlternate++; - pos += staticInputsBeforePosAlternate - staticInputsBeforePos, isValidRslt = isValid(pos > targetLvp ? targetLvp : pos, c, strict, fromSetValid, !0); - } - if (isValidRslt) return !1; - resetMaskSet(), getMaskSet().validPositions = $.extend(!0, {}, validPsClone); - } - } - }); - } - return isValidRslt; - } - function trackbackAlternations(originalPos, newPos) { - var vp = getMaskSet().validPositions[newPos]; - if (vp) for (var targetLocator = vp.locator, tll = targetLocator.length, ps = originalPos; ps < newPos; ps++) if (void 0 === getMaskSet().validPositions[ps] && !isMask(ps, !0)) { - var tests = getTests(ps).slice(), bestMatch = determineTestTemplate(tests, !0), equality = -1; - "" === tests[tests.length - 1].match.def && tests.pop(), $.each(tests, function(ndx, tst) { - for (var i = 0; i < tll; i++) { - if (void 0 === tst.locator[i] || !checkAlternationMatch(tst.locator[i].toString().split(","), targetLocator[i].toString().split(","), tst.na)) { - var targetAI = targetLocator[i], bestMatchAI = bestMatch.locator[i], tstAI = tst.locator[i]; - targetAI - bestMatchAI > Math.abs(targetAI - tstAI) && (bestMatch = tst); - break; - } - equality < i && (equality = i, bestMatch = tst); - } - }), bestMatch = $.extend({}, bestMatch, { - input: getPlaceholder(ps, bestMatch.match, !0) || bestMatch.match.def - }), bestMatch.generatedInput = !0, setValidPosition(ps, bestMatch, !0), getMaskSet().validPositions[newPos] = void 0, - _isValid(newPos, vp.input, !0); - } - } - function setValidPosition(pos, validTest, fromSetValid, isSelection) { - if (isSelection || opts.insertMode && void 0 !== getMaskSet().validPositions[pos] && void 0 === fromSetValid) { - var i, positionsClone = $.extend(!0, {}, getMaskSet().validPositions), lvp = getLastValidPosition(void 0, !0); - for (i = pos; i <= lvp; i++) delete getMaskSet().validPositions[i]; - getMaskSet().validPositions[pos] = $.extend(!0, {}, validTest); - var j, valid = !0, vps = getMaskSet().validPositions, needsValidation = !1, initialLength = getMaskSet().maskLength; - for (i = j = pos; i <= lvp; i++) { - var t = positionsClone[i]; - if (void 0 !== t) for (var posMatch = j; posMatch < getMaskSet().maskLength && (null === t.match.fn && vps[i] && (vps[i].match.optionalQuantifier === !0 || vps[i].match.optionality === !0) || null != t.match.fn); ) { - if (posMatch++, needsValidation === !1 && positionsClone[posMatch] && positionsClone[posMatch].match.def === t.match.def) getMaskSet().validPositions[posMatch] = $.extend(!0, {}, positionsClone[posMatch]), - getMaskSet().validPositions[posMatch].input = t.input, fillMissingNonMask(posMatch), - j = posMatch, valid = !0; else if (positionCanMatchDefinition(posMatch, t.match.def)) { - var result = isValid(posMatch, t.input, !0, !0); - valid = result !== !1, j = result.caret || result.insert ? getLastValidPosition() : posMatch, - needsValidation = !0; - } else if (valid = t.generatedInput === !0, !valid && posMatch >= getMaskSet().maskLength - 1) break; - if (getMaskSet().maskLength < initialLength && (getMaskSet().maskLength = initialLength), - valid) break; - } - if (!valid) break; - } - if (!valid) return getMaskSet().validPositions = $.extend(!0, {}, positionsClone), - resetMaskSet(!0), !1; - } else getMaskSet().validPositions[pos] = $.extend(!0, {}, validTest); - return resetMaskSet(!0), !0; - } - function fillMissingNonMask(maskPos) { - for (var pndx = maskPos - 1; pndx > -1 && !getMaskSet().validPositions[pndx]; pndx--) ; - var testTemplate, testsFromPos; - for (pndx++; pndx < maskPos; pndx++) void 0 === getMaskSet().validPositions[pndx] && (opts.jitMasking === !1 || opts.jitMasking > pndx) && (testsFromPos = getTests(pndx, getTestTemplate(pndx - 1).locator, pndx - 1).slice(), - "" === testsFromPos[testsFromPos.length - 1].match.def && testsFromPos.pop(), testTemplate = determineTestTemplate(testsFromPos), - testTemplate && (testTemplate.match.def === opts.radixPointDefinitionSymbol || !isMask(pndx, !0) || $.inArray(opts.radixPoint, getBuffer()) < pndx && testTemplate.match.fn && testTemplate.match.fn.test(getPlaceholder(pndx), getMaskSet(), pndx, !1, opts)) && (result = _isValid(pndx, getPlaceholder(pndx, testTemplate.match, !0) || (null == testTemplate.match.fn ? testTemplate.match.def : "" !== getPlaceholder(pndx) ? getPlaceholder(pndx) : getBuffer()[pndx]), !0), - result !== !1 && (getMaskSet().validPositions[result.pos || pndx].generatedInput = !0))); - } - strict = strict === !0; - var maskPos = pos; - void 0 !== pos.begin && (maskPos = isRTL && !isSelection(pos) ? pos.end : pos.begin); - var result = !1, positionsClone = $.extend(!0, {}, getMaskSet().validPositions); - if (fillMissingNonMask(maskPos), isSelection(pos) && (handleRemove(void 0, Inputmask.keyCode.DELETE, pos), - maskPos = getMaskSet().p), maskPos < getMaskSet().maskLength && (result = _isValid(maskPos, c, strict), - (!strict || fromSetValid === !0) && result === !1)) { - var currentPosValid = getMaskSet().validPositions[maskPos]; - if (!currentPosValid || null !== currentPosValid.match.fn || currentPosValid.match.def !== c && c !== opts.skipOptionalPartCharacter) { - if ((opts.insertMode || void 0 === getMaskSet().validPositions[seekNext(maskPos)]) && !isMask(maskPos, !0)) for (var nPos = maskPos + 1, snPos = seekNext(maskPos); nPos <= snPos; nPos++) if (result = _isValid(nPos, c, strict), - result !== !1) { - trackbackAlternations(maskPos, void 0 !== result.pos ? result.pos : nPos), maskPos = nPos; - break; - } - } else result = { - caret: seekNext(maskPos) - }; - } - return result === !1 && opts.keepStatic && !strict && fromAlternate !== !0 && (result = alternate(maskPos, c, strict)), - result === !0 && (result = { - pos: maskPos - }), $.isFunction(opts.postValidation) && result !== !1 && !strict && fromSetValid !== !0 && (result = !!opts.postValidation(getBuffer(!0), result, opts) && result), - void 0 === result.pos && (result.pos = maskPos), result === !1 && (resetMaskSet(!0), - getMaskSet().validPositions = $.extend(!0, {}, positionsClone)), result; - } - function isMask(pos, strict) { - var test; - if (strict ? (test = getTestTemplate(pos).match, "" === test.def && (test = getTest(pos).match)) : test = getTest(pos).match, - null != test.fn) return test.fn; - if (strict !== !0 && pos > -1) { - var tests = getTests(pos); - return tests.length > 1 + ("" === tests[tests.length - 1].match.def ? 1 : 0); - } - return !1; - } - function seekNext(pos, newBlock) { - var maskL = getMaskSet().maskLength; - if (pos >= maskL) return maskL; - for (var position = pos; ++position < maskL && (newBlock === !0 && (getTest(position).match.newBlockMarker !== !0 || !isMask(position)) || newBlock !== !0 && !isMask(position)); ) ; - return position; - } - function seekPrevious(pos, newBlock) { - var tests, position = pos; - if (position <= 0) return 0; - for (;--position > 0 && (newBlock === !0 && getTest(position).match.newBlockMarker !== !0 || newBlock !== !0 && !isMask(position) && (tests = getTests(position), - tests.length < 2 || 2 === tests.length && "" === tests[1].match.def)); ) ; - return position; - } - function getBufferElement(position) { - return void 0 === getMaskSet().validPositions[position] ? getPlaceholder(position) : getMaskSet().validPositions[position].input; - } - function writeBuffer(input, buffer, caretPos, event, triggerInputEvent) { - if (event && $.isFunction(opts.onBeforeWrite)) { - var result = opts.onBeforeWrite(event, buffer, caretPos, opts); - if (result) { - if (result.refreshFromBuffer) { - var refresh = result.refreshFromBuffer; - refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, result.buffer || buffer), - buffer = getBuffer(!0); - } - void 0 !== caretPos && (caretPos = void 0 !== result.caret ? result.caret : caretPos); - } - } - input.inputmask._valueSet(buffer.join("")), void 0 === caretPos || void 0 !== event && "blur" === event.type ? renderColorMask(input, buffer, caretPos) : caret(input, caretPos), - triggerInputEvent === !0 && (skipInputEvent = !0, $(input).trigger("input")); - } - function getPlaceholder(pos, test, returnPL) { - if (test = test || getTest(pos).match, void 0 !== test.placeholder || returnPL === !0) return $.isFunction(test.placeholder) ? test.placeholder(opts) : test.placeholder; - if (null === test.fn) { - if (pos > -1 && void 0 === getMaskSet().validPositions[pos]) { - var prevTest, tests = getTests(pos), staticAlternations = []; - if (tests.length > 1 + ("" === tests[tests.length - 1].match.def ? 1 : 0)) for (var i = 0; i < tests.length; i++) if (tests[i].match.optionality !== !0 && tests[i].match.optionalQuantifier !== !0 && (null === tests[i].match.fn || void 0 === prevTest || tests[i].match.fn.test(prevTest.match.def, getMaskSet(), pos, !0, opts) !== !1) && (staticAlternations.push(tests[i]), - null === tests[i].match.fn && (prevTest = tests[i]), staticAlternations.length > 1 && /[0-9a-bA-Z]/.test(staticAlternations[0].match.def))) return opts.placeholder.charAt(pos % opts.placeholder.length); - } - return test.def; - } - return opts.placeholder.charAt(pos % opts.placeholder.length); - } - function checkVal(input, writeOut, strict, nptvl, initiatingEvent, stickyCaret) { - function isTemplateMatch() { - var isMatch = !1, charCodeNdx = getBufferTemplate().slice(initialNdx, seekNext(initialNdx)).join("").indexOf(charCodes); - if (charCodeNdx !== -1 && !isMask(initialNdx)) { - isMatch = !0; - for (var bufferTemplateArr = getBufferTemplate().slice(initialNdx, initialNdx + charCodeNdx), i = 0; i < bufferTemplateArr.length; i++) if (" " !== bufferTemplateArr[i]) { - isMatch = !1; - break; - } - } - return isMatch; - } - var inputValue = nptvl.slice(), charCodes = "", initialNdx = 0, result = void 0; - if (resetMaskSet(), getMaskSet().p = seekNext(-1), !strict) if (opts.autoUnmask !== !0) { - var staticInput = getBufferTemplate().slice(0, seekNext(-1)).join(""), matches = inputValue.join("").match(new RegExp("^" + Inputmask.escapeRegex(staticInput), "g")); - matches && matches.length > 0 && (inputValue.splice(0, matches.length * staticInput.length), - initialNdx = seekNext(initialNdx)); - } else initialNdx = seekNext(initialNdx); - if ($.each(inputValue, function(ndx, charCode) { - if (void 0 !== charCode) { - var keypress = new $.Event("keypress"); - keypress.which = charCode.charCodeAt(0), charCodes += charCode; - var lvp = getLastValidPosition(void 0, !0), lvTest = getMaskSet().validPositions[lvp], nextTest = getTestTemplate(lvp + 1, lvTest ? lvTest.locator.slice() : void 0, lvp); - if (!isTemplateMatch() || strict || opts.autoUnmask) { - var pos = strict ? ndx : null == nextTest.match.fn && nextTest.match.optionality && lvp + 1 < getMaskSet().p ? lvp + 1 : getMaskSet().p; - result = EventHandlers.keypressEvent.call(input, keypress, !0, !1, strict, pos), - initialNdx = pos + 1, charCodes = ""; - } else result = EventHandlers.keypressEvent.call(input, keypress, !0, !1, !0, lvp + 1); - if (!strict && $.isFunction(opts.onBeforeWrite) && (result = opts.onBeforeWrite(keypress, getBuffer(), result.forwardPosition, opts), - result && result.refreshFromBuffer)) { - var refresh = result.refreshFromBuffer; - refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, result.buffer), - resetMaskSet(!0), result.caret && (getMaskSet().p = result.caret); - } - } - }), writeOut) { - var caretPos = void 0, lvp = getLastValidPosition(); - document.activeElement === input && (initiatingEvent || result) && (caretPos = caret(input).begin, - initiatingEvent && result === !1 && (caretPos = seekNext(getLastValidPosition(caretPos))), - result && stickyCaret !== !0 && (caretPos < lvp + 1 || lvp === -1) && (caretPos = opts.numericInput && void 0 === result.caret ? seekPrevious(result.forwardPosition) : result.forwardPosition)), - writeBuffer(input, getBuffer(), caretPos, initiatingEvent || new $.Event("checkval")); - } - } - function unmaskedvalue(input) { - if (input) { - if (void 0 === input.inputmask) return input.value; - input.inputmask && input.inputmask.refreshValue && EventHandlers.setValueEvent.call(input); - } - var umValue = [], vps = getMaskSet().validPositions; - for (var pndx in vps) vps[pndx].match && null != vps[pndx].match.fn && umValue.push(vps[pndx].input); - var unmaskedValue = 0 === umValue.length ? "" : (isRTL ? umValue.reverse() : umValue).join(""); - if ($.isFunction(opts.onUnMask)) { - var bufferValue = (isRTL ? getBuffer().slice().reverse() : getBuffer()).join(""); - unmaskedValue = opts.onUnMask(bufferValue, unmaskedValue, opts) || unmaskedValue; - } - return unmaskedValue; - } - function caret(input, begin, end, notranslate) { - function translatePosition(pos) { - if (notranslate !== !0 && isRTL && "number" == typeof pos && (!opts.greedy || "" !== opts.placeholder)) { - var bffrLght = getBuffer().join("").length; - pos = bffrLght - pos; - } - return pos; - } - var range; - if ("number" != typeof begin) return input.setSelectionRange ? (begin = input.selectionStart, - end = input.selectionEnd) : window.getSelection ? (range = window.getSelection().getRangeAt(0), - range.commonAncestorContainer.parentNode !== input && range.commonAncestorContainer !== input || (begin = range.startOffset, - end = range.endOffset)) : document.selection && document.selection.createRange && (range = document.selection.createRange(), - begin = 0 - range.duplicate().moveStart("character", -input.inputmask._valueGet().length), - end = begin + range.text.length), { - begin: translatePosition(begin), - end: translatePosition(end) - }; - begin = translatePosition(begin), end = translatePosition(end), end = "number" == typeof end ? end : begin; - var scrollCalc = parseInt(((input.ownerDocument.defaultView || window).getComputedStyle ? (input.ownerDocument.defaultView || window).getComputedStyle(input, null) : input.currentStyle).fontSize) * end; - if (input.scrollLeft = scrollCalc > input.scrollWidth ? scrollCalc : 0, mobile || opts.insertMode !== !1 || begin !== end || end++, - input.setSelectionRange) input.selectionStart = begin, input.selectionEnd = end; else if (window.getSelection) { - if (range = document.createRange(), void 0 === input.firstChild || null === input.firstChild) { - var textNode = document.createTextNode(""); - input.appendChild(textNode); - } - range.setStart(input.firstChild, begin < input.inputmask._valueGet().length ? begin : input.inputmask._valueGet().length), - range.setEnd(input.firstChild, end < input.inputmask._valueGet().length ? end : input.inputmask._valueGet().length), - range.collapse(!0); - var sel = window.getSelection(); - sel.removeAllRanges(), sel.addRange(range); - } else input.createTextRange && (range = input.createTextRange(), range.collapse(!0), - range.moveEnd("character", end), range.moveStart("character", begin), range.select()); - renderColorMask(input, void 0, { - begin: begin, - end: end - }); - } - function determineLastRequiredPosition(returnDefinition) { - var pos, testPos, buffer = getBuffer(), bl = buffer.length, lvp = getLastValidPosition(), positions = {}, lvTest = getMaskSet().validPositions[lvp], ndxIntlzr = void 0 !== lvTest ? lvTest.locator.slice() : void 0; - for (pos = lvp + 1; pos < buffer.length; pos++) testPos = getTestTemplate(pos, ndxIntlzr, pos - 1), - ndxIntlzr = testPos.locator.slice(), positions[pos] = $.extend(!0, {}, testPos); - var lvTestAlt = lvTest && void 0 !== lvTest.alternation ? lvTest.locator[lvTest.alternation] : void 0; - for (pos = bl - 1; pos > lvp && (testPos = positions[pos], (testPos.match.optionality || testPos.match.optionalQuantifier || lvTestAlt && (lvTestAlt !== positions[pos].locator[lvTest.alternation] && null != testPos.match.fn || null === testPos.match.fn && testPos.locator[lvTest.alternation] && checkAlternationMatch(testPos.locator[lvTest.alternation].toString().split(","), lvTestAlt.toString().split(",")) && "" !== getTests(pos)[0].def)) && buffer[pos] === getPlaceholder(pos, testPos.match)); pos--) bl--; - return returnDefinition ? { - l: bl, - def: positions[bl] ? positions[bl].match : void 0 - } : bl; - } - function clearOptionalTail(buffer) { - for (var validPos, rl = determineLastRequiredPosition(), bl = buffer.length; rl < bl && !isMask(rl + 1) && (validPos = getTest(rl + 1)) && validPos.match.optionality !== !0 && validPos.match.optionalQuantifier !== !0; ) rl++; - for (;(validPos = getTest(rl - 1)) && validPos.match.optionality && validPos.input === opts.skipOptionalPartCharacter; ) rl--; - return buffer.splice(rl), buffer; - } - function isComplete(buffer) { - if ($.isFunction(opts.isComplete)) return opts.isComplete(buffer, opts); - if ("*" !== opts.repeat) { - var complete = !1, lrp = determineLastRequiredPosition(!0), aml = seekPrevious(lrp.l); - if (void 0 === lrp.def || lrp.def.newBlockMarker || lrp.def.optionality || lrp.def.optionalQuantifier) { - complete = !0; - for (var i = 0; i <= aml; i++) { - var test = getTestTemplate(i).match; - if (null !== test.fn && void 0 === getMaskSet().validPositions[i] && test.optionality !== !0 && test.optionalQuantifier !== !0 || null === test.fn && buffer[i] !== getPlaceholder(i, test)) { - complete = !1; - break; - } - } - } - return complete; - } - } - function handleRemove(input, k, pos, strict) { - function generalize() { - if (opts.keepStatic) { - for (var validInputs = [], lastAlt = getLastValidPosition(-1, !0), positionsClone = $.extend(!0, {}, getMaskSet().validPositions), prevAltPos = getMaskSet().validPositions[lastAlt]; lastAlt >= 0; lastAlt--) { - var altPos = getMaskSet().validPositions[lastAlt]; - if (altPos) { - if (altPos.generatedInput !== !0 && /[0-9a-bA-Z]/.test(altPos.input) && validInputs.push(altPos.input), - delete getMaskSet().validPositions[lastAlt], void 0 !== altPos.alternation && altPos.locator[altPos.alternation] !== prevAltPos.locator[altPos.alternation]) break; - prevAltPos = altPos; - } - } - if (lastAlt > -1) for (getMaskSet().p = seekNext(getLastValidPosition(-1, !0)); validInputs.length > 0; ) { - var keypress = new $.Event("keypress"); - keypress.which = validInputs.pop().charCodeAt(0), EventHandlers.keypressEvent.call(input, keypress, !0, !1, !1, getMaskSet().p); - } else getMaskSet().validPositions = $.extend(!0, {}, positionsClone); - } - } - if ((opts.numericInput || isRTL) && (k === Inputmask.keyCode.BACKSPACE ? k = Inputmask.keyCode.DELETE : k === Inputmask.keyCode.DELETE && (k = Inputmask.keyCode.BACKSPACE), - isRTL)) { - var pend = pos.end; - pos.end = pos.begin, pos.begin = pend; - } - k === Inputmask.keyCode.BACKSPACE && (pos.end - pos.begin < 1 || opts.insertMode === !1) ? (pos.begin = seekPrevious(pos.begin), - void 0 === getMaskSet().validPositions[pos.begin] || getMaskSet().validPositions[pos.begin].input !== opts.groupSeparator && getMaskSet().validPositions[pos.begin].input !== opts.radixPoint || pos.begin--) : k === Inputmask.keyCode.DELETE && pos.begin === pos.end && (pos.end = isMask(pos.end, !0) ? pos.end + 1 : seekNext(pos.end) + 1, - void 0 === getMaskSet().validPositions[pos.begin] || getMaskSet().validPositions[pos.begin].input !== opts.groupSeparator && getMaskSet().validPositions[pos.begin].input !== opts.radixPoint || pos.end++), - stripValidPositions(pos.begin, pos.end, !1, strict), strict !== !0 && generalize(); - var lvp = getLastValidPosition(pos.begin, !0); - lvp < pos.begin ? getMaskSet().p = seekNext(lvp) : strict !== !0 && (getMaskSet().p = pos.begin); - } - function initializeColorMask(input) { - function findCaretPos(clientx) { - var caretPos, e = document.createElement("span"); - for (var style in computedStyle) isNaN(style) && style.indexOf("font") !== -1 && (e.style[style] = computedStyle[style]); - e.style.textTransform = computedStyle.textTransform, e.style.letterSpacing = computedStyle.letterSpacing, - e.style.position = "absolute", e.style.height = "auto", e.style.width = "auto", - e.style.visibility = "hidden", e.style.whiteSpace = "nowrap", document.body.appendChild(e); - var itl, inputText = input.inputmask._valueGet(), previousWidth = 0; - for (caretPos = 0, itl = inputText.length; caretPos <= itl; caretPos++) { - if (e.innerHTML += inputText.charAt(caretPos) || "_", e.offsetWidth >= clientx) { - var offset1 = clientx - previousWidth, offset2 = e.offsetWidth - clientx; - e.innerHTML = inputText.charAt(caretPos), offset1 -= e.offsetWidth / 3, caretPos = offset1 < offset2 ? caretPos - 1 : caretPos; - break; - } - previousWidth = e.offsetWidth; - } - return document.body.removeChild(e), caretPos; - } - function position() { - colorMask.style.position = "absolute", colorMask.style.top = offset.top + "px", - colorMask.style.left = offset.left + "px", colorMask.style.width = parseInt(input.offsetWidth) - parseInt(computedStyle.paddingLeft) - parseInt(computedStyle.paddingRight) - parseInt(computedStyle.borderLeftWidth) - parseInt(computedStyle.borderRightWidth) + "px", - colorMask.style.height = parseInt(input.offsetHeight) - parseInt(computedStyle.paddingTop) - parseInt(computedStyle.paddingBottom) - parseInt(computedStyle.borderTopWidth) - parseInt(computedStyle.borderBottomWidth) + "px", - colorMask.style.lineHeight = colorMask.style.height, colorMask.style.zIndex = isNaN(computedStyle.zIndex) ? -1 : computedStyle.zIndex - 1, - colorMask.style.webkitAppearance = "textfield", colorMask.style.mozAppearance = "textfield", - colorMask.style.Appearance = "textfield"; - } - var offset = $(input).position(), computedStyle = (input.ownerDocument.defaultView || window).getComputedStyle(input, null); - input.parentNode; - colorMask = document.createElement("div"), document.body.appendChild(colorMask); - for (var style in computedStyle) isNaN(style) && "cssText" !== style && style.indexOf("webkit") == -1 && (colorMask.style[style] = computedStyle[style]); - input.style.backgroundColor = "transparent", input.style.color = "transparent", - input.style.webkitAppearance = "caret", input.style.mozAppearance = "caret", input.style.Appearance = "caret", - position(), $(window).on("resize", function(e) { - offset = $(input).position(), computedStyle = (input.ownerDocument.defaultView || window).getComputedStyle(input, null), - position(); - }), $(input).on("click", function(e) { - return caret(input, findCaretPos(e.clientX)), EventHandlers.clickEvent.call(this, [ e ]); - }), $(input).on("keydown", function(e) { - e.shiftKey || opts.insertMode === !1 || setTimeout(function() { - renderColorMask(input); - }, 0); - }); - } - function renderColorMask(input, buffer, caretPos) { - function handleStatic() { - isStatic || null !== test.fn && void 0 !== testPos.input ? isStatic && null !== test.fn && void 0 !== testPos.input && (isStatic = !1, - maskTemplate += "") : (isStatic = !0, maskTemplate += ""); - } - if (void 0 !== colorMask) { - buffer = buffer || getBuffer(), void 0 === caretPos ? caretPos = caret(input) : void 0 === caretPos.begin && (caretPos = { - begin: caretPos, - end: caretPos - }); - var maskTemplate = "", isStatic = !1; - if ("" != buffer) { - var ndxIntlzr, test, testPos, pos = 0, lvp = getLastValidPosition(); - do pos === caretPos.begin && document.activeElement === input && (maskTemplate += ""), - getMaskSet().validPositions[pos] ? (testPos = getMaskSet().validPositions[pos], - test = testPos.match, ndxIntlzr = testPos.locator.slice(), handleStatic(), maskTemplate += testPos.input) : (testPos = getTestTemplate(pos, ndxIntlzr, pos - 1), - test = testPos.match, ndxIntlzr = testPos.locator.slice(), (opts.jitMasking === !1 || pos < lvp || "number" == typeof opts.jitMasking && isFinite(opts.jitMasking) && opts.jitMasking > pos) && (handleStatic(), - maskTemplate += getPlaceholder(pos, test))), pos++; while ((void 0 === maxLength || pos < maxLength) && (null !== test.fn || "" !== test.def) || lvp > pos); - } - colorMask.innerHTML = maskTemplate; - } - } - function mask(elem) { - function isElementTypeSupported(input, opts) { - function patchValueProperty(npt) { - function patchValhook(type) { - if ($.valHooks && (void 0 === $.valHooks[type] || $.valHooks[type].inputmaskpatch !== !0)) { - var valhookGet = $.valHooks[type] && $.valHooks[type].get ? $.valHooks[type].get : function(elem) { - return elem.value; - }, valhookSet = $.valHooks[type] && $.valHooks[type].set ? $.valHooks[type].set : function(elem, value) { - return elem.value = value, elem; - }; - $.valHooks[type] = { - get: function(elem) { - if (elem.inputmask) { - if (elem.inputmask.opts.autoUnmask) return elem.inputmask.unmaskedvalue(); - var result = valhookGet(elem); - return getLastValidPosition(void 0, void 0, elem.inputmask.maskset.validPositions) !== -1 || opts.nullable !== !0 ? result : ""; - } - return valhookGet(elem); - }, - set: function(elem, value) { - var result, $elem = $(elem); - return result = valhookSet(elem, value), elem.inputmask && $elem.trigger("setvalue"), - result; - }, - inputmaskpatch: !0 - }; - } - } - function getter() { - return this.inputmask ? this.inputmask.opts.autoUnmask ? this.inputmask.unmaskedvalue() : getLastValidPosition() !== -1 || opts.nullable !== !0 ? document.activeElement === this && opts.clearMaskOnLostFocus ? (isRTL ? clearOptionalTail(getBuffer().slice()).reverse() : clearOptionalTail(getBuffer().slice())).join("") : valueGet.call(this) : "" : valueGet.call(this); - } - function setter(value) { - valueSet.call(this, value), this.inputmask && $(this).trigger("setvalue"); - } - function installNativeValueSetFallback(npt) { - EventRuler.on(npt, "mouseenter", function(event) { - var $input = $(this), input = this, value = input.inputmask._valueGet(); - value !== getBuffer().join("") && $input.trigger("setvalue"); - }); - } - var valueGet, valueSet; - if (!npt.inputmask.__valueGet) { - if (opts.noValuePatching !== !0) { - if (Object.getOwnPropertyDescriptor) { - "function" != typeof Object.getPrototypeOf && (Object.getPrototypeOf = "object" == typeof "test".__proto__ ? function(object) { - return object.__proto__; - } : function(object) { - return object.constructor.prototype; - }); - var valueProperty = Object.getPrototypeOf ? Object.getOwnPropertyDescriptor(Object.getPrototypeOf(npt), "value") : void 0; - valueProperty && valueProperty.get && valueProperty.set ? (valueGet = valueProperty.get, - valueSet = valueProperty.set, Object.defineProperty(npt, "value", { - get: getter, - set: setter, - configurable: !0 - })) : "INPUT" !== npt.tagName && (valueGet = function() { - return this.textContent; - }, valueSet = function(value) { - this.textContent = value; - }, Object.defineProperty(npt, "value", { - get: getter, - set: setter, - configurable: !0 - })); - } else document.__lookupGetter__ && npt.__lookupGetter__("value") && (valueGet = npt.__lookupGetter__("value"), - valueSet = npt.__lookupSetter__("value"), npt.__defineGetter__("value", getter), - npt.__defineSetter__("value", setter)); - npt.inputmask.__valueGet = valueGet, npt.inputmask.__valueSet = valueSet; - } - npt.inputmask._valueGet = function(overruleRTL) { - return isRTL && overruleRTL !== !0 ? valueGet.call(this.el).split("").reverse().join("") : valueGet.call(this.el); - }, npt.inputmask._valueSet = function(value, overruleRTL) { - valueSet.call(this.el, null === value || void 0 === value ? "" : overruleRTL !== !0 && isRTL ? value.split("").reverse().join("") : value); - }, void 0 === valueGet && (valueGet = function() { - return this.value; - }, valueSet = function(value) { - this.value = value; - }, patchValhook(npt.type), installNativeValueSetFallback(npt)); - } - } - var elementType = input.getAttribute("type"), isSupported = "INPUT" === input.tagName && $.inArray(elementType, opts.supportsInputType) !== -1 || input.isContentEditable || "TEXTAREA" === input.tagName; - if (!isSupported) if ("INPUT" === input.tagName) { - var el = document.createElement("input"); - el.setAttribute("type", elementType), isSupported = "text" === el.type, el = null; - } else isSupported = "partial"; - return isSupported !== !1 && patchValueProperty(input), isSupported; - } - EventRuler.off(el); - var isSupported = isElementTypeSupported(elem, opts); - if (isSupported !== !1 && (el = elem, $el = $(el), ("rtl" === el.dir || opts.rightAlign) && (el.style.textAlign = "right"), - ("rtl" === el.dir || opts.numericInput) && (el.dir = "ltr", el.removeAttribute("dir"), - el.inputmask.isRTL = !0, isRTL = !0), opts.colorMask === !0 && initializeColorMask(el), - android && (el.hasOwnProperty("inputmode") && (el.inputmode = opts.inputmode, el.setAttribute("inputmode", opts.inputmode)), - "rtfm" === opts.androidHack && (opts.colorMask !== !0 && initializeColorMask(el), - el.type = "password")), isSupported === !0 && (EventRuler.on(el, "submit", EventHandlers.submitEvent), - EventRuler.on(el, "reset", EventHandlers.resetEvent), EventRuler.on(el, "mouseenter", EventHandlers.mouseenterEvent), - EventRuler.on(el, "blur", EventHandlers.blurEvent), EventRuler.on(el, "focus", EventHandlers.focusEvent), - EventRuler.on(el, "mouseleave", EventHandlers.mouseleaveEvent), opts.colorMask !== !0 && EventRuler.on(el, "click", EventHandlers.clickEvent), - EventRuler.on(el, "dblclick", EventHandlers.dblclickEvent), EventRuler.on(el, "paste", EventHandlers.pasteEvent), - EventRuler.on(el, "dragdrop", EventHandlers.pasteEvent), EventRuler.on(el, "drop", EventHandlers.pasteEvent), - EventRuler.on(el, "cut", EventHandlers.cutEvent), EventRuler.on(el, "complete", opts.oncomplete), - EventRuler.on(el, "incomplete", opts.onincomplete), EventRuler.on(el, "cleared", opts.oncleared), - android && opts.inputEventOnly === !0 || (EventRuler.on(el, "keydown", EventHandlers.keydownEvent), - EventRuler.on(el, "keypress", EventHandlers.keypressEvent)), EventRuler.on(el, "compositionstart", $.noop), - EventRuler.on(el, "compositionupdate", $.noop), EventRuler.on(el, "compositionend", $.noop), - EventRuler.on(el, "keyup", $.noop), EventRuler.on(el, "input", EventHandlers.inputFallBackEvent), - EventRuler.on(el, "beforeinput", $.noop)), EventRuler.on(el, "setvalue", EventHandlers.setValueEvent), - getBufferTemplate(), "" !== el.inputmask._valueGet() || opts.clearMaskOnLostFocus === !1 || document.activeElement === el)) { - var initialValue = $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(el.inputmask._valueGet(), opts) || el.inputmask._valueGet() : el.inputmask._valueGet(); - checkVal(el, !0, !1, initialValue.split("")); - var buffer = getBuffer().slice(); - undoValue = buffer.join(""), isComplete(buffer) === !1 && opts.clearIncomplete && resetMaskSet(), - opts.clearMaskOnLostFocus && document.activeElement !== el && (getLastValidPosition() === -1 ? buffer = [] : clearOptionalTail(buffer)), - writeBuffer(el, buffer), document.activeElement === el && caret(el, seekNext(getLastValidPosition())); - } - } - maskset = maskset || this.maskset, opts = opts || this.opts; - var undoValue, $el, maxLength, colorMask, valueBuffer, el = this.el, isRTL = this.isRTL, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, mouseEnter = !1, EventRuler = { - on: function(input, eventName, eventHandler) { - var ev = function(e) { - if (void 0 === this.inputmask && "FORM" !== this.nodeName) { - var imOpts = $.data(this, "_inputmask_opts"); - imOpts ? new Inputmask(imOpts).mask(this) : EventRuler.off(this); - } else { - if ("setvalue" === e.type || "FORM" === this.nodeName || !(this.disabled || this.readOnly && !("keydown" === e.type && e.ctrlKey && 67 === e.keyCode || opts.tabThrough === !1 && e.keyCode === Inputmask.keyCode.TAB))) { - switch (e.type) { - case "input": - if (skipInputEvent === !0) return skipInputEvent = !1, e.preventDefault(); - break; - - case "keydown": - skipKeyPressEvent = !1, skipInputEvent = !1; - break; - - case "keypress": - if (skipKeyPressEvent === !0) return e.preventDefault(); - skipKeyPressEvent = !0; - break; - - case "click": - if (iemobile || iphone) { - var that = this, args = arguments; - return setTimeout(function() { - eventHandler.apply(that, args); - }, 0), !1; - } - } - var returnVal = eventHandler.apply(this, arguments); - return returnVal === !1 && (e.preventDefault(), e.stopPropagation()), returnVal; - } - e.preventDefault(); - } - }; - input.inputmask.events[eventName] = input.inputmask.events[eventName] || [], input.inputmask.events[eventName].push(ev), - $.inArray(eventName, [ "submit", "reset" ]) !== -1 ? null != input.form && $(input.form).on(eventName, ev) : $(input).on(eventName, ev); - }, - off: function(input, event) { - if (input.inputmask && input.inputmask.events) { - var events; - event ? (events = [], events[event] = input.inputmask.events[event]) : events = input.inputmask.events, - $.each(events, function(eventName, evArr) { - for (;evArr.length > 0; ) { - var ev = evArr.pop(); - $.inArray(eventName, [ "submit", "reset" ]) !== -1 ? null != input.form && $(input.form).off(eventName, ev) : $(input).off(eventName, ev); - } - delete input.inputmask.events[eventName]; - }); - } - } - }, EventHandlers = { - keydownEvent: function(e) { - function isInputEventSupported(eventName) { - var el = document.createElement("input"), evName = "on" + eventName, isSupported = evName in el; - return isSupported || (el.setAttribute(evName, "return;"), isSupported = "function" == typeof el[evName]), - el = null, isSupported; - } - var input = this, $input = $(input), k = e.keyCode, pos = caret(input); - if (k === Inputmask.keyCode.BACKSPACE || k === Inputmask.keyCode.DELETE || iphone && k === Inputmask.keyCode.BACKSPACE_SAFARI || e.ctrlKey && k === Inputmask.keyCode.X && !isInputEventSupported("cut")) e.preventDefault(), - handleRemove(input, k, pos), writeBuffer(input, getBuffer(!0), getMaskSet().p, e, input.inputmask._valueGet() !== getBuffer().join("")), - input.inputmask._valueGet() === getBufferTemplate().join("") ? $input.trigger("cleared") : isComplete(getBuffer()) === !0 && $input.trigger("complete"); else if (k === Inputmask.keyCode.END || k === Inputmask.keyCode.PAGE_DOWN) { - e.preventDefault(); - var caretPos = seekNext(getLastValidPosition()); - opts.insertMode || caretPos !== getMaskSet().maskLength || e.shiftKey || caretPos--, - caret(input, e.shiftKey ? pos.begin : caretPos, caretPos, !0); - } else k === Inputmask.keyCode.HOME && !e.shiftKey || k === Inputmask.keyCode.PAGE_UP ? (e.preventDefault(), - caret(input, 0, e.shiftKey ? pos.begin : 0, !0)) : (opts.undoOnEscape && k === Inputmask.keyCode.ESCAPE || 90 === k && e.ctrlKey) && e.altKey !== !0 ? (checkVal(input, !0, !1, undoValue.split("")), - $input.trigger("click")) : k !== Inputmask.keyCode.INSERT || e.shiftKey || e.ctrlKey ? opts.tabThrough === !0 && k === Inputmask.keyCode.TAB ? (e.shiftKey === !0 ? (null === getTest(pos.begin).match.fn && (pos.begin = seekNext(pos.begin)), - pos.end = seekPrevious(pos.begin, !0), pos.begin = seekPrevious(pos.end, !0)) : (pos.begin = seekNext(pos.begin, !0), - pos.end = seekNext(pos.begin, !0), pos.end < getMaskSet().maskLength && pos.end--), - pos.begin < getMaskSet().maskLength && (e.preventDefault(), caret(input, pos.begin, pos.end))) : e.shiftKey || opts.insertMode === !1 && (k === Inputmask.keyCode.RIGHT ? setTimeout(function() { - var caretPos = caret(input); - caret(input, caretPos.begin); - }, 0) : k === Inputmask.keyCode.LEFT && setTimeout(function() { - var caretPos = caret(input); - caret(input, isRTL ? caretPos.begin + 1 : caretPos.begin - 1); - }, 0)) : (opts.insertMode = !opts.insertMode, caret(input, opts.insertMode || pos.begin !== getMaskSet().maskLength ? pos.begin : pos.begin - 1)); - opts.onKeyDown.call(this, e, getBuffer(), caret(input).begin, opts), ignorable = $.inArray(k, opts.ignorables) !== -1; - }, - keypressEvent: function(e, checkval, writeOut, strict, ndx) { - var input = this, $input = $(input), k = e.which || e.charCode || e.keyCode; - if (!(checkval === !0 || e.ctrlKey && e.altKey) && (e.ctrlKey || e.metaKey || ignorable)) return k === Inputmask.keyCode.ENTER && undoValue !== getBuffer().join("") && (undoValue = getBuffer().join(""), - setTimeout(function() { - $input.trigger("change"); - }, 0)), !0; - if (k) { - 46 === k && e.shiftKey === !1 && "" !== opts.radixPoint && (k = opts.radixPoint.charCodeAt(0)); - var forwardPosition, pos = checkval ? { - begin: ndx, - end: ndx - } : caret(input), c = String.fromCharCode(k); - getMaskSet().writeOutBuffer = !0; - var valResult = isValid(pos, c, strict); - if (valResult !== !1 && (resetMaskSet(!0), forwardPosition = void 0 !== valResult.caret ? valResult.caret : checkval ? valResult.pos + 1 : seekNext(valResult.pos), - getMaskSet().p = forwardPosition), writeOut !== !1) { - var self = this; - if (setTimeout(function() { - opts.onKeyValidation.call(self, k, valResult, opts); - }, 0), getMaskSet().writeOutBuffer && valResult !== !1) { - var buffer = getBuffer(); - writeBuffer(input, buffer, opts.numericInput && void 0 === valResult.caret ? seekPrevious(forwardPosition) : forwardPosition, e, checkval !== !0), - checkval !== !0 && setTimeout(function() { - isComplete(buffer) === !0 && $input.trigger("complete"); - }, 0); - } - } - if (e.preventDefault(), checkval) return valResult.forwardPosition = forwardPosition, - valResult; - } - }, - pasteEvent: function(e) { - var tempValue, input = this, ev = e.originalEvent || e, $input = $(input), inputValue = input.inputmask._valueGet(!0), caretPos = caret(input); - isRTL && (tempValue = caretPos.end, caretPos.end = caretPos.begin, caretPos.begin = tempValue); - var valueBeforeCaret = inputValue.substr(0, caretPos.begin), valueAfterCaret = inputValue.substr(caretPos.end, inputValue.length); - if (valueBeforeCaret === (isRTL ? getBufferTemplate().reverse() : getBufferTemplate()).slice(0, caretPos.begin).join("") && (valueBeforeCaret = ""), - valueAfterCaret === (isRTL ? getBufferTemplate().reverse() : getBufferTemplate()).slice(caretPos.end).join("") && (valueAfterCaret = ""), - isRTL && (tempValue = valueBeforeCaret, valueBeforeCaret = valueAfterCaret, valueAfterCaret = tempValue), - window.clipboardData && window.clipboardData.getData) inputValue = valueBeforeCaret + window.clipboardData.getData("Text") + valueAfterCaret; else { - if (!ev.clipboardData || !ev.clipboardData.getData) return !0; - inputValue = valueBeforeCaret + ev.clipboardData.getData("text/plain") + valueAfterCaret; - } - var pasteValue = inputValue; - if ($.isFunction(opts.onBeforePaste)) { - if (pasteValue = opts.onBeforePaste(inputValue, opts), pasteValue === !1) return e.preventDefault(); - pasteValue || (pasteValue = inputValue); - } - return checkVal(input, !1, !1, isRTL ? pasteValue.split("").reverse() : pasteValue.toString().split("")), - writeBuffer(input, getBuffer(), seekNext(getLastValidPosition()), e, undoValue !== getBuffer().join("")), - isComplete(getBuffer()) === !0 && $input.trigger("complete"), e.preventDefault(); - }, - inputFallBackEvent: function(e) { - var input = this, inputValue = input.inputmask._valueGet(); - if (getBuffer().join("") !== inputValue) { - var caretPos = caret(input); - if (inputValue = inputValue.replace(new RegExp("(" + Inputmask.escapeRegex(getBufferTemplate().join("")) + ")*"), ""), - iemobile) { - var inputChar = inputValue.replace(getBuffer().join(""), ""); - if (1 === inputChar.length) { - var keypress = new $.Event("keypress"); - return keypress.which = inputChar.charCodeAt(0), EventHandlers.keypressEvent.call(input, keypress, !0, !0, !1, getMaskSet().validPositions[caretPos.begin - 1] ? caretPos.begin : caretPos.begin - 1), - !1; - } - } - if (caretPos.begin > inputValue.length && (caret(input, inputValue.length), caretPos = caret(input)), - getBuffer().length - inputValue.length !== 1 || inputValue.charAt(caretPos.begin) === getBuffer()[caretPos.begin] || inputValue.charAt(caretPos.begin + 1) === getBuffer()[caretPos.begin] || isMask(caretPos.begin)) { - for (var lvp = getLastValidPosition() + 1, bufferTemplate = getBufferTemplate().join(""); null === inputValue.match(Inputmask.escapeRegex(bufferTemplate) + "$"); ) bufferTemplate = bufferTemplate.slice(1); - inputValue = inputValue.replace(bufferTemplate, ""), inputValue = inputValue.split(""), - checkVal(input, !0, !1, inputValue, e, caretPos.begin < lvp), isComplete(getBuffer()) === !0 && $(input).trigger("complete"); - } else e.keyCode = Inputmask.keyCode.BACKSPACE, EventHandlers.keydownEvent.call(input, e); - e.preventDefault(); - } - }, - setValueEvent: function(e) { - this.inputmask.refreshValue = !1; - var input = this, value = input.inputmask._valueGet(); - checkVal(input, !0, !1, ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(value, opts) || value : value).split("")), - undoValue = getBuffer().join(""), (opts.clearMaskOnLostFocus || opts.clearIncomplete) && input.inputmask._valueGet() === getBufferTemplate().join("") && input.inputmask._valueSet(""); - }, - focusEvent: function(e) { - var input = this, nptValue = input.inputmask._valueGet(); - opts.showMaskOnFocus && (!opts.showMaskOnHover || opts.showMaskOnHover && "" === nptValue) && (input.inputmask._valueGet() !== getBuffer().join("") ? writeBuffer(input, getBuffer(), seekNext(getLastValidPosition())) : mouseEnter === !1 && caret(input, seekNext(getLastValidPosition()))), - opts.positionCaretOnTab === !0 && EventHandlers.clickEvent.apply(input, [ e, !0 ]), - undoValue = getBuffer().join(""); - }, - mouseleaveEvent: function(e) { - var input = this; - if (mouseEnter = !1, opts.clearMaskOnLostFocus && document.activeElement !== input) { - var buffer = getBuffer().slice(), nptValue = input.inputmask._valueGet(); - nptValue !== input.getAttribute("placeholder") && "" !== nptValue && (getLastValidPosition() === -1 && nptValue === getBufferTemplate().join("") ? buffer = [] : clearOptionalTail(buffer), - writeBuffer(input, buffer)); - } - }, - clickEvent: function(e, tabbed) { - function doRadixFocus(clickPos) { - if ("" !== opts.radixPoint) { - var vps = getMaskSet().validPositions; - if (void 0 === vps[clickPos] || vps[clickPos].input === getPlaceholder(clickPos)) { - if (clickPos < seekNext(-1)) return !0; - var radixPos = $.inArray(opts.radixPoint, getBuffer()); - if (radixPos !== -1) { - for (var vp in vps) if (radixPos < vp && vps[vp].input !== getPlaceholder(vp)) return !1; - return !0; - } - } - } - return !1; - } - var input = this; - setTimeout(function() { - if (document.activeElement === input) { - var selectedCaret = caret(input); - if (tabbed && (selectedCaret.begin = selectedCaret.end), selectedCaret.begin === selectedCaret.end) switch (opts.positionCaretOnClick) { - case "none": - break; - - case "radixFocus": - if (doRadixFocus(selectedCaret.begin)) { - var radixPos = $.inArray(opts.radixPoint, getBuffer().join("")); - caret(input, opts.numericInput ? seekNext(radixPos) : radixPos); - break; - } - - default: - var clickPosition = selectedCaret.begin, lvclickPosition = getLastValidPosition(clickPosition, !0), lastPosition = seekNext(lvclickPosition); - if (clickPosition < lastPosition) caret(input, isMask(clickPosition) || isMask(clickPosition - 1) ? clickPosition : seekNext(clickPosition)); else { - var placeholder = getPlaceholder(lastPosition); - ("" !== placeholder && getBuffer()[lastPosition] !== placeholder && getTest(lastPosition).match.optionalQuantifier !== !0 || !isMask(lastPosition) && getTest(lastPosition).match.def === placeholder) && (lastPosition = seekNext(lastPosition)), - caret(input, lastPosition); - } - } - } - }, 0); - }, - dblclickEvent: function(e) { - var input = this; - setTimeout(function() { - caret(input, 0, seekNext(getLastValidPosition())); - }, 0); - }, - cutEvent: function(e) { - var input = this, $input = $(input), pos = caret(input), ev = e.originalEvent || e, clipboardData = window.clipboardData || ev.clipboardData, clipData = isRTL ? getBuffer().slice(pos.end, pos.begin) : getBuffer().slice(pos.begin, pos.end); - clipboardData.setData("text", isRTL ? clipData.reverse().join("") : clipData.join("")), - document.execCommand && document.execCommand("copy"), handleRemove(input, Inputmask.keyCode.DELETE, pos), - writeBuffer(input, getBuffer(), getMaskSet().p, e, undoValue !== getBuffer().join("")), - input.inputmask._valueGet() === getBufferTemplate().join("") && $input.trigger("cleared"); - }, - blurEvent: function(e) { - var $input = $(this), input = this; - if (input.inputmask) { - var nptValue = input.inputmask._valueGet(), buffer = getBuffer().slice(); - undoValue !== buffer.join("") && setTimeout(function() { - $input.trigger("change"), undoValue = buffer.join(""); - }, 0), "" !== nptValue && (opts.clearMaskOnLostFocus && (getLastValidPosition() === -1 && nptValue === getBufferTemplate().join("") ? buffer = [] : clearOptionalTail(buffer)), - isComplete(buffer) === !1 && (setTimeout(function() { - $input.trigger("incomplete"); - }, 0), opts.clearIncomplete && (resetMaskSet(), buffer = opts.clearMaskOnLostFocus ? [] : getBufferTemplate().slice())), - writeBuffer(input, buffer, void 0, e)); - } - }, - mouseenterEvent: function(e) { - var input = this; - mouseEnter = !0, document.activeElement !== input && opts.showMaskOnHover && input.inputmask._valueGet() !== getBuffer().join("") && writeBuffer(input, getBuffer()); - }, - submitEvent: function(e) { - undoValue !== getBuffer().join("") && $el.trigger("change"), opts.clearMaskOnLostFocus && getLastValidPosition() === -1 && el.inputmask._valueGet && el.inputmask._valueGet() === getBufferTemplate().join("") && el.inputmask._valueSet(""), - opts.removeMaskOnSubmit && (el.inputmask._valueSet(el.inputmask.unmaskedvalue(), !0), - setTimeout(function() { - writeBuffer(el, getBuffer()); - }, 0)); - }, - resetEvent: function(e) { - el.inputmask.refreshValue = !0, setTimeout(function() { - $el.trigger("setvalue"); - }, 0); - } - }; - if (void 0 !== actionObj) switch (actionObj.action) { - case "isComplete": - return el = actionObj.el, isComplete(getBuffer()); - - case "unmaskedvalue": - return void 0 !== el && void 0 === actionObj.value || (valueBuffer = actionObj.value, - valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(valueBuffer, opts) || valueBuffer : valueBuffer).split(""), - checkVal(void 0, !1, !1, isRTL ? valueBuffer.reverse() : valueBuffer), $.isFunction(opts.onBeforeWrite) && opts.onBeforeWrite(void 0, getBuffer(), 0, opts)), - unmaskedvalue(el); - - case "mask": - mask(el); - break; - - case "format": - return valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(actionObj.value, opts) || actionObj.value : actionObj.value).split(""), - checkVal(void 0, !1, !1, isRTL ? valueBuffer.reverse() : valueBuffer), $.isFunction(opts.onBeforeWrite) && opts.onBeforeWrite(void 0, getBuffer(), 0, opts), - actionObj.metadata ? { - value: isRTL ? getBuffer().slice().reverse().join("") : getBuffer().join(""), - metadata: maskScope.call(this, { - action: "getmetadata" - }, maskset, opts) - } : isRTL ? getBuffer().slice().reverse().join("") : getBuffer().join(""); - - case "isValid": - actionObj.value ? (valueBuffer = actionObj.value.split(""), checkVal(void 0, !1, !0, isRTL ? valueBuffer.reverse() : valueBuffer)) : actionObj.value = getBuffer().join(""); - for (var buffer = getBuffer(), rl = determineLastRequiredPosition(), lmib = buffer.length - 1; lmib > rl && !isMask(lmib); lmib--) ; - return buffer.splice(rl, lmib + 1 - rl), isComplete(buffer) && actionObj.value === getBuffer().join(""); - - case "getemptymask": - return getBufferTemplate().join(""); - - case "remove": - if (el) { - $el = $(el), el.inputmask._valueSet(unmaskedvalue(el)), EventRuler.off(el); - var valueProperty; - Object.getOwnPropertyDescriptor && Object.getPrototypeOf ? (valueProperty = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(el), "value"), - valueProperty && el.inputmask.__valueGet && Object.defineProperty(el, "value", { - get: el.inputmask.__valueGet, - set: el.inputmask.__valueSet, - configurable: !0 - })) : document.__lookupGetter__ && el.__lookupGetter__("value") && el.inputmask.__valueGet && (el.__defineGetter__("value", el.inputmask.__valueGet), - el.__defineSetter__("value", el.inputmask.__valueSet)), el.inputmask = void 0; - } - return el; - - case "getmetadata": - if ($.isArray(maskset.metadata)) { - var maskTarget = getMaskTemplate(!0, 0, !1).join(""); - return $.each(maskset.metadata, function(ndx, mtdt) { - if (mtdt.mask === maskTarget) return maskTarget = mtdt, !1; - }), maskTarget; - } - return maskset.metadata; - } - } - var ua = navigator.userAgent, mobile = /mobile/i.test(ua), iemobile = /iemobile/i.test(ua), iphone = /iphone/i.test(ua) && !iemobile, android = /android/i.test(ua) && !iemobile; - return Inputmask.prototype = { - dataAttribute: "data-inputmask", - defaults: { - placeholder: "_", - optionalmarker: { - start: "[", - end: "]" - }, - quantifiermarker: { - start: "{", - end: "}" - }, - groupmarker: { - start: "(", - end: ")" - }, - alternatormarker: "|", - escapeChar: "\\", - mask: null, - oncomplete: $.noop, - onincomplete: $.noop, - oncleared: $.noop, - repeat: 0, - greedy: !0, - autoUnmask: !1, - removeMaskOnSubmit: !1, - clearMaskOnLostFocus: !0, - insertMode: !0, - clearIncomplete: !1, - alias: null, - onKeyDown: $.noop, - onBeforeMask: null, - onBeforePaste: function(pastedValue, opts) { - return $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(pastedValue, opts) : pastedValue; - }, - onBeforeWrite: null, - onUnMask: null, - showMaskOnFocus: !0, - showMaskOnHover: !0, - onKeyValidation: $.noop, - skipOptionalPartCharacter: " ", - numericInput: !1, - rightAlign: !1, - undoOnEscape: !0, - radixPoint: "", - radixPointDefinitionSymbol: void 0, - groupSeparator: "", - keepStatic: null, - positionCaretOnTab: !0, - tabThrough: !1, - supportsInputType: [ "text", "tel", "password" ], - ignorables: [ 8, 9, 13, 19, 27, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 93, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 0, 229 ], - isComplete: null, - canClearPosition: $.noop, - postValidation: null, - staticDefinitionSymbol: void 0, - jitMasking: !1, - nullable: !0, - inputEventOnly: !1, - noValuePatching: !1, - positionCaretOnClick: "lvp", - casing: null, - inputmode: "verbatim", - colorMask: !1, - androidHack: !1 - }, - definitions: { - "9": { - validator: "[0-9]", - cardinality: 1, - definitionSymbol: "*" - }, - a: { - validator: "[A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]", - cardinality: 1, - definitionSymbol: "*" - }, - "*": { - validator: "[0-9A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]", - cardinality: 1 - } - }, - aliases: {}, - masksCache: {}, - mask: function(elems) { - function importAttributeOptions(npt, opts, userOptions, dataAttribute) { - function importOption(option, optionData) { - optionData = void 0 !== optionData ? optionData : npt.getAttribute(dataAttribute + "-" + option), - null !== optionData && ("string" == typeof optionData && (0 === option.indexOf("on") ? optionData = window[optionData] : "false" === optionData ? optionData = !1 : "true" === optionData && (optionData = !0)), - userOptions[option] = optionData); - } - var option, dataoptions, optionData, p, attrOptions = npt.getAttribute(dataAttribute); - if (attrOptions && "" !== attrOptions && (attrOptions = attrOptions.replace(new RegExp("'", "g"), '"'), - dataoptions = JSON.parse("{" + attrOptions + "}")), dataoptions) { - optionData = void 0; - for (p in dataoptions) if ("alias" === p.toLowerCase()) { - optionData = dataoptions[p]; - break; - } - } - importOption("alias", optionData), userOptions.alias && resolveAlias(userOptions.alias, userOptions, opts); - for (option in opts) { - if (dataoptions) { - optionData = void 0; - for (p in dataoptions) if (p.toLowerCase() === option.toLowerCase()) { - optionData = dataoptions[p]; - break; - } - } - importOption(option, optionData); - } - return $.extend(!0, opts, userOptions), opts; - } - var that = this; - return "string" == typeof elems && (elems = document.getElementById(elems) || document.querySelectorAll(elems)), - elems = elems.nodeName ? [ elems ] : elems, $.each(elems, function(ndx, el) { - var scopedOpts = $.extend(!0, {}, that.opts); - importAttributeOptions(el, scopedOpts, $.extend(!0, {}, that.userOptions), that.dataAttribute); - var maskset = generateMaskSet(scopedOpts, that.noMasksCache); - void 0 !== maskset && (void 0 !== el.inputmask && el.inputmask.remove(), el.inputmask = new Inputmask((void 0), (void 0), (!0)), - el.inputmask.opts = scopedOpts, el.inputmask.noMasksCache = that.noMasksCache, el.inputmask.userOptions = $.extend(!0, {}, that.userOptions), - el.inputmask.isRTL = that.isRTL, el.inputmask.el = el, el.inputmask.maskset = maskset, - $.data(el, "_inputmask_opts", scopedOpts), maskScope.call(el.inputmask, { - action: "mask" - })); - }), elems && elems[0] ? elems[0].inputmask || this : this; - }, - option: function(options, noremask) { - return "string" == typeof options ? this.opts[options] : "object" == typeof options ? ($.extend(this.userOptions, options), - this.el && noremask !== !0 && this.mask(this.el), this) : void 0; - }, - unmaskedvalue: function(value) { - return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache), - maskScope.call(this, { - action: "unmaskedvalue", - value: value - }); - }, - remove: function() { - return maskScope.call(this, { - action: "remove" - }); - }, - getemptymask: function() { - return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache), - maskScope.call(this, { - action: "getemptymask" - }); - }, - hasMaskedValue: function() { - return !this.opts.autoUnmask; - }, - isComplete: function() { - return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache), - maskScope.call(this, { - action: "isComplete" - }); - }, - getmetadata: function() { - return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache), - maskScope.call(this, { - action: "getmetadata" - }); - }, - isValid: function(value) { - return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache), - maskScope.call(this, { - action: "isValid", - value: value - }); - }, - format: function(value, metadata) { - return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache), - maskScope.call(this, { - action: "format", - value: value, - metadata: metadata - }); - }, - analyseMask: function(mask, opts) { - function MaskToken(isGroup, isOptional, isQuantifier, isAlternator) { - this.matches = [], this.openGroup = isGroup || !1, this.isGroup = isGroup || !1, - this.isOptional = isOptional || !1, this.isQuantifier = isQuantifier || !1, this.isAlternator = isAlternator || !1, - this.quantifier = { - min: 1, - max: 1 - }; - } - function insertTestDefinition(mtoken, element, position) { - var maskdef = (opts.definitions ? opts.definitions[element] : void 0) || Inputmask.prototype.definitions[element]; - position = void 0 !== position ? position : mtoken.matches.length; - var prevMatch = mtoken.matches[position - 1]; - if (maskdef && !escaped) { - for (var prevalidators = maskdef.prevalidator, prevalidatorsL = prevalidators ? prevalidators.length : 0, i = 1; i < maskdef.cardinality; i++) { - var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator.validator, cardinality = prevalidator.cardinality; - mtoken.matches.splice(position++, 0, { - fn: validator ? "string" == typeof validator ? new RegExp(validator) : new function() { - this.test = validator; - }() : new RegExp("."), - cardinality: cardinality ? cardinality : 1, - optionality: mtoken.isOptional, - newBlockMarker: void 0 === prevMatch || prevMatch.def !== (maskdef.definitionSymbol || element), - casing: maskdef.casing, - def: maskdef.definitionSymbol || element, - placeholder: maskdef.placeholder, - nativeDef: element - }), prevMatch = mtoken.matches[position - 1]; - } - mtoken.matches.splice(position++, 0, { - fn: maskdef.validator ? "string" == typeof maskdef.validator ? new RegExp(maskdef.validator) : new function() { - this.test = maskdef.validator; - }() : new RegExp("."), - cardinality: maskdef.cardinality, - optionality: mtoken.isOptional, - newBlockMarker: void 0 === prevMatch || prevMatch.def !== (maskdef.definitionSymbol || element), - casing: maskdef.casing, - def: maskdef.definitionSymbol || element, - placeholder: maskdef.placeholder, - nativeDef: element - }); - } else mtoken.matches.splice(position++, 0, { - fn: null, - cardinality: 0, - optionality: mtoken.isOptional, - newBlockMarker: void 0 === prevMatch || prevMatch.def !== element, - casing: null, - def: opts.staticDefinitionSymbol || element, - placeholder: void 0 !== opts.staticDefinitionSymbol ? element : void 0, - nativeDef: element - }), escaped = !1; - } - function verifyGroupMarker(maskToken) { - maskToken && maskToken.matches && $.each(maskToken.matches, function(ndx, token) { - var nextToken = maskToken.matches[ndx + 1]; - (void 0 === nextToken || void 0 === nextToken.matches || nextToken.isQuantifier === !1) && token && token.isGroup && (token.isGroup = !1, - insertTestDefinition(token, opts.groupmarker.start, 0), token.openGroup !== !0 && insertTestDefinition(token, opts.groupmarker.end)), - verifyGroupMarker(token); - }); - } - function defaultCase() { - if (openenings.length > 0) { - if (currentOpeningToken = openenings[openenings.length - 1], insertTestDefinition(currentOpeningToken, m), - currentOpeningToken.isAlternator) { - alternator = openenings.pop(); - for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1; - openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], - currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator); - } - } else insertTestDefinition(currentToken, m); - } - function reverseTokens(maskToken) { - function reverseStatic(st) { - return st === opts.optionalmarker.start ? st = opts.optionalmarker.end : st === opts.optionalmarker.end ? st = opts.optionalmarker.start : st === opts.groupmarker.start ? st = opts.groupmarker.end : st === opts.groupmarker.end && (st = opts.groupmarker.start), - st; - } - maskToken.matches = maskToken.matches.reverse(); - for (var match in maskToken.matches) if (maskToken.matches.hasOwnProperty(match)) { - var intMatch = parseInt(match); - if (maskToken.matches[match].isQuantifier && maskToken.matches[intMatch + 1] && maskToken.matches[intMatch + 1].isGroup) { - var qt = maskToken.matches[match]; - maskToken.matches.splice(match, 1), maskToken.matches.splice(intMatch + 1, 0, qt); - } - void 0 !== maskToken.matches[match].matches ? maskToken.matches[match] = reverseTokens(maskToken.matches[match]) : maskToken.matches[match] = reverseStatic(maskToken.matches[match]); - } - return maskToken; - } - for (var match, m, openingToken, currentOpeningToken, alternator, lastMatch, groupToken, tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g, escaped = !1, currentToken = new MaskToken(), openenings = [], maskTokens = []; match = tokenizer.exec(mask); ) if (m = match[0], - escaped) defaultCase(); else switch (m.charAt(0)) { - case opts.escapeChar: - escaped = !0; - break; - - case opts.optionalmarker.end: - case opts.groupmarker.end: - if (openingToken = openenings.pop(), openingToken.openGroup = !1, void 0 !== openingToken) if (openenings.length > 0) { - if (currentOpeningToken = openenings[openenings.length - 1], currentOpeningToken.matches.push(openingToken), - currentOpeningToken.isAlternator) { - alternator = openenings.pop(); - for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1; - openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], - currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator); - } - } else currentToken.matches.push(openingToken); else defaultCase(); - break; - - case opts.optionalmarker.start: - openenings.push(new MaskToken((!1), (!0))); - break; - - case opts.groupmarker.start: - openenings.push(new MaskToken((!0))); - break; - - case opts.quantifiermarker.start: - var quantifier = new MaskToken((!1), (!1), (!0)); - m = m.replace(/[{}]/g, ""); - var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]); - if ("*" !== mq1 && "+" !== mq1 || (mq0 = "*" === mq1 ? 0 : 1), quantifier.quantifier = { - min: mq0, - max: mq1 - }, openenings.length > 0) { - var matches = openenings[openenings.length - 1].matches; - match = matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), groupToken.matches.push(match), - match = groupToken), matches.push(match), matches.push(quantifier); - } else match = currentToken.matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), - groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), - currentToken.matches.push(quantifier); - break; - - case opts.alternatormarker: - openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], - lastMatch = currentOpeningToken.matches.pop()) : lastMatch = currentToken.matches.pop(), - lastMatch.isAlternator ? openenings.push(lastMatch) : (alternator = new MaskToken((!1), (!1), (!1), (!0)), - alternator.matches.push(lastMatch), openenings.push(alternator)); - break; - - default: - defaultCase(); - } - for (;openenings.length > 0; ) openingToken = openenings.pop(), currentToken.matches.push(openingToken); - return currentToken.matches.length > 0 && (verifyGroupMarker(currentToken), maskTokens.push(currentToken)), - opts.numericInput && reverseTokens(maskTokens[0]), maskTokens; - } - }, Inputmask.extendDefaults = function(options) { - $.extend(!0, Inputmask.prototype.defaults, options); - }, Inputmask.extendDefinitions = function(definition) { - $.extend(!0, Inputmask.prototype.definitions, definition); - }, Inputmask.extendAliases = function(alias) { - $.extend(!0, Inputmask.prototype.aliases, alias); - }, Inputmask.format = function(value, options, metadata) { - return Inputmask(options).format(value, metadata); - }, Inputmask.unmask = function(value, options) { - return Inputmask(options).unmaskedvalue(value); - }, Inputmask.isValid = function(value, options) { - return Inputmask(options).isValid(value); - }, Inputmask.remove = function(elems) { - $.each(elems, function(ndx, el) { - el.inputmask && el.inputmask.remove(); - }); - }, Inputmask.escapeRegex = function(str) { - var specials = [ "/", ".", "*", "+", "?", "|", "(", ")", "[", "]", "{", "}", "\\", "$", "^" ]; - return str.replace(new RegExp("(\\" + specials.join("|\\") + ")", "gim"), "\\$1"); - }, Inputmask.keyCode = { - ALT: 18, - BACKSPACE: 8, - BACKSPACE_SAFARI: 127, - CAPS_LOCK: 20, - COMMA: 188, - COMMAND: 91, - COMMAND_LEFT: 91, - COMMAND_RIGHT: 93, - CONTROL: 17, - DELETE: 46, - DOWN: 40, - END: 35, - ENTER: 13, - ESCAPE: 27, - HOME: 36, - INSERT: 45, - LEFT: 37, - MENU: 93, - NUMPAD_ADD: 107, - NUMPAD_DECIMAL: 110, - NUMPAD_DIVIDE: 111, - NUMPAD_ENTER: 108, - NUMPAD_MULTIPLY: 106, - NUMPAD_SUBTRACT: 109, - PAGE_DOWN: 34, - PAGE_UP: 33, - PERIOD: 190, - RIGHT: 39, - SHIFT: 16, - SPACE: 32, - TAB: 9, - UP: 38, - WINDOWS: 91, - X: 88 - }, window.Inputmask = Inputmask, Inputmask; -}(jQuery), function($, Inputmask) { - return void 0 === $.fn.inputmask && ($.fn.inputmask = function(fn, options) { - var nptmask, input = this[0]; - if (void 0 === options && (options = {}), "string" == typeof fn) switch (fn) { - case "unmaskedvalue": - return input && input.inputmask ? input.inputmask.unmaskedvalue() : $(input).val(); - - case "remove": - return this.each(function() { - this.inputmask && this.inputmask.remove(); - }); - - case "getemptymask": - return input && input.inputmask ? input.inputmask.getemptymask() : ""; - - case "hasMaskedValue": - return !(!input || !input.inputmask) && input.inputmask.hasMaskedValue(); - - case "isComplete": - return !input || !input.inputmask || input.inputmask.isComplete(); - - case "getmetadata": - return input && input.inputmask ? input.inputmask.getmetadata() : void 0; - - case "setvalue": - $(input).val(options), input && void 0 === input.inputmask && $(input).triggerHandler("setvalue"); - break; - - case "option": - if ("string" != typeof options) return this.each(function() { - if (void 0 !== this.inputmask) return this.inputmask.option(options); - }); - if (input && void 0 !== input.inputmask) return input.inputmask.option(options); - break; - - default: - return options.alias = fn, nptmask = new Inputmask(options), this.each(function() { - nptmask.mask(this); - }); - } else { - if ("object" == typeof fn) return nptmask = new Inputmask(fn), void 0 === fn.mask && void 0 === fn.alias ? this.each(function() { - return void 0 !== this.inputmask ? this.inputmask.option(fn) : void nptmask.mask(this); - }) : this.each(function() { - nptmask.mask(this); - }); - if (void 0 === fn) return this.each(function() { - nptmask = new Inputmask(options), nptmask.mask(this); - }); - } - }), $.fn.inputmask; -}(jQuery, Inputmask), function($, Inputmask) { - function isLeapYear(year) { - return isNaN(year) || 29 === new Date(year, 2, 0).getDate(); - } - return Inputmask.extendAliases({ - "dd/mm/yyyy": { - mask: "1/2/y", - placeholder: "dd/mm/yyyy", - regex: { - val1pre: new RegExp("[0-3]"), - val1: new RegExp("0[1-9]|[12][0-9]|3[01]"), - val2pre: function(separator) { - var escapedSeparator = Inputmask.escapeRegex.call(this, separator); - return new RegExp("((0[1-9]|[12][0-9]|3[01])" + escapedSeparator + "[01])"); - }, - val2: function(separator) { - var escapedSeparator = Inputmask.escapeRegex.call(this, separator); - return new RegExp("((0[1-9]|[12][0-9])" + escapedSeparator + "(0[1-9]|1[012]))|(30" + escapedSeparator + "(0[13-9]|1[012]))|(31" + escapedSeparator + "(0[13578]|1[02]))"); - } - }, - leapday: "29/02/", - separator: "/", - yearrange: { - minyear: 1900, - maxyear: 2099 - }, - isInYearRange: function(chrs, minyear, maxyear) { - if (isNaN(chrs)) return !1; - var enteredyear = parseInt(chrs.concat(minyear.toString().slice(chrs.length))), enteredyear2 = parseInt(chrs.concat(maxyear.toString().slice(chrs.length))); - return !isNaN(enteredyear) && (minyear <= enteredyear && enteredyear <= maxyear) || !isNaN(enteredyear2) && (minyear <= enteredyear2 && enteredyear2 <= maxyear); - }, - determinebaseyear: function(minyear, maxyear, hint) { - var currentyear = new Date().getFullYear(); - if (minyear > currentyear) return minyear; - if (maxyear < currentyear) { - for (var maxYearPrefix = maxyear.toString().slice(0, 2), maxYearPostfix = maxyear.toString().slice(2, 4); maxyear < maxYearPrefix + hint; ) maxYearPrefix--; - var maxxYear = maxYearPrefix + maxYearPostfix; - return minyear > maxxYear ? minyear : maxxYear; - } - if (minyear <= currentyear && currentyear <= maxyear) { - for (var currentYearPrefix = currentyear.toString().slice(0, 2); maxyear < currentYearPrefix + hint; ) currentYearPrefix--; - var currentYearAndHint = currentYearPrefix + hint; - return currentYearAndHint < minyear ? minyear : currentYearAndHint; - } - return currentyear; - }, - onKeyDown: function(e, buffer, caretPos, opts) { - var $input = $(this); - if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { - var today = new Date(); - $input.val(today.getDate().toString() + (today.getMonth() + 1).toString() + today.getFullYear().toString()), - $input.trigger("setvalue"); - } - }, - getFrontValue: function(mask, buffer, opts) { - for (var start = 0, length = 0, i = 0; i < mask.length && "2" !== mask.charAt(i); i++) { - var definition = opts.definitions[mask.charAt(i)]; - definition ? (start += length, length = definition.cardinality) : length++; - } - return buffer.join("").substr(start, length); - }, - postValidation: function(buffer, currentResult, opts) { - var dayMonthValue, year, bufferStr = buffer.join(""); - return 0 === opts.mask.indexOf("y") ? (year = bufferStr.substr(0, 4), dayMonthValue = bufferStr.substr(4, 11)) : (year = bufferStr.substr(6, 11), - dayMonthValue = bufferStr.substr(0, 6)), currentResult && (dayMonthValue !== opts.leapday || isLeapYear(year)); - }, - definitions: { - "1": { - validator: function(chrs, maskset, pos, strict, opts) { - var isValid = opts.regex.val1.test(chrs); - return strict || isValid || chrs.charAt(1) !== opts.separator && "-./".indexOf(chrs.charAt(1)) === -1 || !(isValid = opts.regex.val1.test("0" + chrs.charAt(0))) ? isValid : (maskset.buffer[pos - 1] = "0", - { - refreshFromBuffer: { - start: pos - 1, - end: pos - }, - pos: pos, - c: chrs.charAt(0) - }); - }, - cardinality: 2, - prevalidator: [ { - validator: function(chrs, maskset, pos, strict, opts) { - var pchrs = chrs; - isNaN(maskset.buffer[pos + 1]) || (pchrs += maskset.buffer[pos + 1]); - var isValid = 1 === pchrs.length ? opts.regex.val1pre.test(pchrs) : opts.regex.val1.test(pchrs); - if (!strict && !isValid) { - if (isValid = opts.regex.val1.test(chrs + "0")) return maskset.buffer[pos] = chrs, - maskset.buffer[++pos] = "0", { - pos: pos, - c: "0" - }; - if (isValid = opts.regex.val1.test("0" + chrs)) return maskset.buffer[pos] = "0", - pos++, { - pos: pos - }; - } - return isValid; - }, - cardinality: 1 - } ] - }, - "2": { - validator: function(chrs, maskset, pos, strict, opts) { - var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts); - frontValue.indexOf(opts.placeholder[0]) !== -1 && (frontValue = "01" + opts.separator); - var isValid = opts.regex.val2(opts.separator).test(frontValue + chrs); - return strict || isValid || chrs.charAt(1) !== opts.separator && "-./".indexOf(chrs.charAt(1)) === -1 || !(isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs.charAt(0))) ? isValid : (maskset.buffer[pos - 1] = "0", - { - refreshFromBuffer: { - start: pos - 1, - end: pos - }, - pos: pos, - c: chrs.charAt(0) - }); - }, - cardinality: 2, - prevalidator: [ { - validator: function(chrs, maskset, pos, strict, opts) { - isNaN(maskset.buffer[pos + 1]) || (chrs += maskset.buffer[pos + 1]); - var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts); - frontValue.indexOf(opts.placeholder[0]) !== -1 && (frontValue = "01" + opts.separator); - var isValid = 1 === chrs.length ? opts.regex.val2pre(opts.separator).test(frontValue + chrs) : opts.regex.val2(opts.separator).test(frontValue + chrs); - return strict || isValid || !(isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", - pos++, { - pos: pos - }); - }, - cardinality: 1 - } ] - }, - y: { - validator: function(chrs, maskset, pos, strict, opts) { - return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); - }, - cardinality: 4, - prevalidator: [ { - validator: function(chrs, maskset, pos, strict, opts) { - var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); - if (!strict && !isValid) { - var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 1); - if (isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(0), - { - pos: pos - }; - if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 2), - isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(0), - maskset.buffer[pos++] = yearPrefix.charAt(1), { - pos: pos - }; - } - return isValid; - }, - cardinality: 1 - }, { - validator: function(chrs, maskset, pos, strict, opts) { - var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); - if (!strict && !isValid) { - var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2); - if (isValid = opts.isInYearRange(chrs[0] + yearPrefix[1] + chrs[1], opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(1), - { - pos: pos - }; - if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2), - isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos - 1] = yearPrefix.charAt(0), - maskset.buffer[pos++] = yearPrefix.charAt(1), maskset.buffer[pos++] = chrs.charAt(0), - { - refreshFromBuffer: { - start: pos - 3, - end: pos - }, - pos: pos - }; - } - return isValid; - }, - cardinality: 2 - }, { - validator: function(chrs, maskset, pos, strict, opts) { - return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); - }, - cardinality: 3 - } ] - } - }, - insertMode: !1, - autoUnmask: !1 - }, - "mm/dd/yyyy": { - placeholder: "mm/dd/yyyy", - alias: "dd/mm/yyyy", - regex: { - val2pre: function(separator) { - var escapedSeparator = Inputmask.escapeRegex.call(this, separator); - return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])"); - }, - val2: function(separator) { - var escapedSeparator = Inputmask.escapeRegex.call(this, separator); - return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)"); - }, - val1pre: new RegExp("[01]"), - val1: new RegExp("0[1-9]|1[012]") - }, - leapday: "02/29/", - onKeyDown: function(e, buffer, caretPos, opts) { - var $input = $(this); - if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { - var today = new Date(); - $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()), - $input.trigger("setvalue"); - } - } - }, - "yyyy/mm/dd": { - mask: "y/1/2", - placeholder: "yyyy/mm/dd", - alias: "mm/dd/yyyy", - leapday: "/02/29", - onKeyDown: function(e, buffer, caretPos, opts) { - var $input = $(this); - if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { - var today = new Date(); - $input.val(today.getFullYear().toString() + (today.getMonth() + 1).toString() + today.getDate().toString()), - $input.trigger("setvalue"); - } - } - }, - "dd.mm.yyyy": { - mask: "1.2.y", - placeholder: "dd.mm.yyyy", - leapday: "29.02.", - separator: ".", - alias: "dd/mm/yyyy" - }, - "dd-mm-yyyy": { - mask: "1-2-y", - placeholder: "dd-mm-yyyy", - leapday: "29-02-", - separator: "-", - alias: "dd/mm/yyyy" - }, - "mm.dd.yyyy": { - mask: "1.2.y", - placeholder: "mm.dd.yyyy", - leapday: "02.29.", - separator: ".", - alias: "mm/dd/yyyy" - }, - "mm-dd-yyyy": { - mask: "1-2-y", - placeholder: "mm-dd-yyyy", - leapday: "02-29-", - separator: "-", - alias: "mm/dd/yyyy" - }, - "yyyy.mm.dd": { - mask: "y.1.2", - placeholder: "yyyy.mm.dd", - leapday: ".02.29", - separator: ".", - alias: "yyyy/mm/dd" - }, - "yyyy-mm-dd": { - mask: "y-1-2", - placeholder: "yyyy-mm-dd", - leapday: "-02-29", - separator: "-", - alias: "yyyy/mm/dd" - }, - datetime: { - mask: "1/2/y h:s", - placeholder: "dd/mm/yyyy hh:mm", - alias: "dd/mm/yyyy", - regex: { - hrspre: new RegExp("[012]"), - hrs24: new RegExp("2[0-4]|1[3-9]"), - hrs: new RegExp("[01][0-9]|2[0-4]"), - ampm: new RegExp("^[a|p|A|P][m|M]"), - mspre: new RegExp("[0-5]"), - ms: new RegExp("[0-5][0-9]") - }, - timeseparator: ":", - hourFormat: "24", - definitions: { - h: { - validator: function(chrs, maskset, pos, strict, opts) { - if ("24" === opts.hourFormat && 24 === parseInt(chrs, 10)) return maskset.buffer[pos - 1] = "0", - maskset.buffer[pos] = "0", { - refreshFromBuffer: { - start: pos - 1, - end: pos - }, - c: "0" - }; - var isValid = opts.regex.hrs.test(chrs); - if (!strict && !isValid && (chrs.charAt(1) === opts.timeseparator || "-.:".indexOf(chrs.charAt(1)) !== -1) && (isValid = opts.regex.hrs.test("0" + chrs.charAt(0)))) return maskset.buffer[pos - 1] = "0", - maskset.buffer[pos] = chrs.charAt(0), pos++, { - refreshFromBuffer: { - start: pos - 2, - end: pos - }, - pos: pos, - c: opts.timeseparator - }; - if (isValid && "24" !== opts.hourFormat && opts.regex.hrs24.test(chrs)) { - var tmp = parseInt(chrs, 10); - return 24 === tmp ? (maskset.buffer[pos + 5] = "a", maskset.buffer[pos + 6] = "m") : (maskset.buffer[pos + 5] = "p", - maskset.buffer[pos + 6] = "m"), tmp -= 12, tmp < 10 ? (maskset.buffer[pos] = tmp.toString(), - maskset.buffer[pos - 1] = "0") : (maskset.buffer[pos] = tmp.toString().charAt(1), - maskset.buffer[pos - 1] = tmp.toString().charAt(0)), { - refreshFromBuffer: { - start: pos - 1, - end: pos + 6 - }, - c: maskset.buffer[pos] - }; - } - return isValid; - }, - cardinality: 2, - prevalidator: [ { - validator: function(chrs, maskset, pos, strict, opts) { - var isValid = opts.regex.hrspre.test(chrs); - return strict || isValid || !(isValid = opts.regex.hrs.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", - pos++, { - pos: pos - }); - }, - cardinality: 1 - } ] - }, - s: { - validator: "[0-5][0-9]", - cardinality: 2, - prevalidator: [ { - validator: function(chrs, maskset, pos, strict, opts) { - var isValid = opts.regex.mspre.test(chrs); - return strict || isValid || !(isValid = opts.regex.ms.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", - pos++, { - pos: pos - }); - }, - cardinality: 1 - } ] - }, - t: { - validator: function(chrs, maskset, pos, strict, opts) { - return opts.regex.ampm.test(chrs + "m"); - }, - casing: "lower", - cardinality: 1 - } - }, - insertMode: !1, - autoUnmask: !1 - }, - datetime12: { - mask: "1/2/y h:s t\\m", - placeholder: "dd/mm/yyyy hh:mm xm", - alias: "datetime", - hourFormat: "12" - }, - "mm/dd/yyyy hh:mm xm": { - mask: "1/2/y h:s t\\m", - placeholder: "mm/dd/yyyy hh:mm xm", - alias: "datetime12", - regex: { - val2pre: function(separator) { - var escapedSeparator = Inputmask.escapeRegex.call(this, separator); - return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])"); - }, - val2: function(separator) { - var escapedSeparator = Inputmask.escapeRegex.call(this, separator); - return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)"); - }, - val1pre: new RegExp("[01]"), - val1: new RegExp("0[1-9]|1[012]") - }, - leapday: "02/29/", - onKeyDown: function(e, buffer, caretPos, opts) { - var $input = $(this); - if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { - var today = new Date(); - $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()), - $input.trigger("setvalue"); - } - } - }, - "hh:mm t": { - mask: "h:s t\\m", - placeholder: "hh:mm xm", - alias: "datetime", - hourFormat: "12" - }, - "h:s t": { - mask: "h:s t\\m", - placeholder: "hh:mm xm", - alias: "datetime", - hourFormat: "12" - }, - "hh:mm:ss": { - mask: "h:s:s", - placeholder: "hh:mm:ss", - alias: "datetime", - autoUnmask: !1 - }, - "hh:mm": { - mask: "h:s", - placeholder: "hh:mm", - alias: "datetime", - autoUnmask: !1 - }, - date: { - alias: "dd/mm/yyyy" - }, - "mm/yyyy": { - mask: "1/y", - placeholder: "mm/yyyy", - leapday: "donotuse", - separator: "/", - alias: "mm/dd/yyyy" - }, - shamsi: { - regex: { - val2pre: function(separator) { - var escapedSeparator = Inputmask.escapeRegex.call(this, separator); - return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "[0-3])"); - }, - val2: function(separator) { - var escapedSeparator = Inputmask.escapeRegex.call(this, separator); - return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[1-9]|1[012])" + escapedSeparator + "30)|((0[1-6])" + escapedSeparator + "31)"); - }, - val1pre: new RegExp("[01]"), - val1: new RegExp("0[1-9]|1[012]") - }, - yearrange: { - minyear: 1300, - maxyear: 1499 - }, - mask: "y/1/2", - leapday: "/12/30", - placeholder: "yyyy/mm/dd", - alias: "mm/dd/yyyy", - clearIncomplete: !0 - }, - "yyyy-mm-dd hh:mm:ss": { - mask: "y-1-2 h:s:s", - placeholder: "yyyy-mm-dd hh:mm:ss", - alias: "datetime", - separator: "-", - leapday: "-02-29", - regex: { - val2pre: function(separator) { - var escapedSeparator = Inputmask.escapeRegex.call(this, separator); - return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])"); - }, - val2: function(separator) { - var escapedSeparator = Inputmask.escapeRegex.call(this, separator); - return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)"); - }, - val1pre: new RegExp("[01]"), - val1: new RegExp("0[1-9]|1[012]") - }, - onKeyDown: function(e, buffer, caretPos, opts) {} - } - }), Inputmask; -}(jQuery, Inputmask), function($, Inputmask) { - return Inputmask.extendDefinitions({ - A: { - validator: "[A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]", - cardinality: 1, - casing: "upper" - }, - "&": { - validator: "[0-9A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]", - cardinality: 1, - casing: "upper" - }, - "#": { - validator: "[0-9A-Fa-f]", - cardinality: 1, - casing: "upper" - } - }), Inputmask.extendAliases({ - url: { - definitions: { - i: { - validator: ".", - cardinality: 1 - } - }, - mask: "(\\http://)|(\\http\\s://)|(ftp://)|(ftp\\s://)i{+}", - insertMode: !1, - autoUnmask: !1, - inputmode: "url" - }, - ip: { - mask: "i[i[i]].i[i[i]].i[i[i]].i[i[i]]", - definitions: { - i: { - validator: function(chrs, maskset, pos, strict, opts) { - return pos - 1 > -1 && "." !== maskset.buffer[pos - 1] ? (chrs = maskset.buffer[pos - 1] + chrs, - chrs = pos - 2 > -1 && "." !== maskset.buffer[pos - 2] ? maskset.buffer[pos - 2] + chrs : "0" + chrs) : chrs = "00" + chrs, - new RegExp("25[0-5]|2[0-4][0-9]|[01][0-9][0-9]").test(chrs); - }, - cardinality: 1 - } - }, - onUnMask: function(maskedValue, unmaskedValue, opts) { - return maskedValue; - }, - inputmode: "numeric" - }, - email: { - mask: "*{1,64}[.*{1,64}][.*{1,64}][.*{1,63}]@-{1,63}.-{1,63}[.-{1,63}][.-{1,63}]", - greedy: !1, - onBeforePaste: function(pastedValue, opts) { - return pastedValue = pastedValue.toLowerCase(), pastedValue.replace("mailto:", ""); - }, - definitions: { - "*": { - validator: "[0-9A-Za-z!#$%&'*+/=?^_`{|}~-]", - cardinality: 1, - casing: "lower" - }, - "-": { - validator: "[0-9A-Za-z-]", - cardinality: 1, - casing: "lower" - } - }, - onUnMask: function(maskedValue, unmaskedValue, opts) { - return maskedValue; - }, - inputmode: "email" - }, - mac: { - mask: "##:##:##:##:##:##" - }, - vin: { - mask: "V{13}9{4}", - definitions: { - V: { - validator: "[A-HJ-NPR-Za-hj-npr-z\\d]", - cardinality: 1, - casing: "upper" - } - }, - clearIncomplete: !0, - autoUnmask: !0 - } - }), Inputmask; -}(jQuery, Inputmask), function($, Inputmask) { - return Inputmask.extendAliases({ - numeric: { - mask: function(opts) { - function autoEscape(txt) { - for (var escapedTxt = "", i = 0; i < txt.length; i++) escapedTxt += opts.definitions[txt.charAt(i)] || opts.optionalmarker.start === txt.charAt(i) || opts.optionalmarker.end === txt.charAt(i) || opts.quantifiermarker.start === txt.charAt(i) || opts.quantifiermarker.end === txt.charAt(i) || opts.groupmarker.start === txt.charAt(i) || opts.groupmarker.end === txt.charAt(i) || opts.alternatormarker === txt.charAt(i) ? "\\" + txt.charAt(i) : txt.charAt(i); - return escapedTxt; - } - if (0 !== opts.repeat && isNaN(opts.integerDigits) && (opts.integerDigits = opts.repeat), - opts.repeat = 0, opts.groupSeparator === opts.radixPoint && ("." === opts.radixPoint ? opts.groupSeparator = "," : "," === opts.radixPoint ? opts.groupSeparator = "." : opts.groupSeparator = ""), - " " === opts.groupSeparator && (opts.skipOptionalPartCharacter = void 0), opts.autoGroup = opts.autoGroup && "" !== opts.groupSeparator, - opts.autoGroup && ("string" == typeof opts.groupSize && isFinite(opts.groupSize) && (opts.groupSize = parseInt(opts.groupSize)), - isFinite(opts.integerDigits))) { - var seps = Math.floor(opts.integerDigits / opts.groupSize), mod = opts.integerDigits % opts.groupSize; - opts.integerDigits = parseInt(opts.integerDigits) + (0 === mod ? seps - 1 : seps), - opts.integerDigits < 1 && (opts.integerDigits = "*"); - } - opts.placeholder.length > 1 && (opts.placeholder = opts.placeholder.charAt(0)), - "radixFocus" === opts.positionCaretOnClick && "" === opts.placeholder && opts.integerOptional === !1 && (opts.positionCaretOnClick = "lvp"), - opts.definitions[";"] = opts.definitions["~"], opts.definitions[";"].definitionSymbol = "~", - opts.numericInput === !0 && (opts.positionCaretOnClick = "radixFocus" === opts.positionCaretOnClick ? "lvp" : opts.positionCaretOnClick, - opts.digitsOptional = !1, isNaN(opts.digits) && (opts.digits = 2), opts.decimalProtect = !1); - var mask = "[+]"; - if (mask += autoEscape(opts.prefix), mask += opts.integerOptional === !0 ? "~{1," + opts.integerDigits + "}" : "~{" + opts.integerDigits + "}", - void 0 !== opts.digits) { - opts.radixPointDefinitionSymbol = opts.decimalProtect ? ":" : opts.radixPoint; - var dq = opts.digits.toString().split(","); - isFinite(dq[0] && dq[1] && isFinite(dq[1])) ? mask += opts.radixPointDefinitionSymbol + ";{" + opts.digits + "}" : (isNaN(opts.digits) || parseInt(opts.digits) > 0) && (mask += opts.digitsOptional ? "[" + opts.radixPointDefinitionSymbol + ";{1," + opts.digits + "}]" : opts.radixPointDefinitionSymbol + ";{" + opts.digits + "}"); - } - return mask += autoEscape(opts.suffix), mask += "[-]", opts.greedy = !1, null !== opts.min && (opts.min = opts.min.toString().replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), - "," === opts.radixPoint && (opts.min = opts.min.replace(opts.radixPoint, "."))), - null !== opts.max && (opts.max = opts.max.toString().replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), - "," === opts.radixPoint && (opts.max = opts.max.replace(opts.radixPoint, "."))), - mask; - }, - placeholder: "", - greedy: !1, - digits: "*", - digitsOptional: !0, - radixPoint: ".", - positionCaretOnClick: "radixFocus", - groupSize: 3, - groupSeparator: "", - autoGroup: !1, - allowPlus: !0, - allowMinus: !0, - negationSymbol: { - front: "-", - back: "" - }, - integerDigits: "+", - integerOptional: !0, - prefix: "", - suffix: "", - rightAlign: !0, - decimalProtect: !0, - min: null, - max: null, - step: 1, - insertMode: !0, - autoUnmask: !1, - unmaskAsNumber: !1, - inputmode: "numeric", - postFormat: function(buffer, pos, opts) { - opts.numericInput === !0 && (buffer = buffer.reverse(), isFinite(pos) && (pos = buffer.join("").length - pos - 1)); - var i, l; - pos = pos >= buffer.length ? buffer.length - 1 : pos < 0 ? 0 : pos; - var charAtPos = buffer[pos], cbuf = buffer.slice(); - charAtPos === opts.groupSeparator && pos > opts.prefix.length && pos < buffer.length - opts.suffix.length && (cbuf.splice(pos--, 1), - charAtPos = cbuf[pos]); - var isNegative = cbuf.join("").match(new RegExp("^" + Inputmask.escapeRegex(opts.negationSymbol.front))); - isNegative = null !== isNegative && 1 === isNegative.length, pos > (isNegative ? opts.negationSymbol.front.length : 0) + opts.prefix.length && pos < cbuf.length - opts.suffix.length && (cbuf[pos] = "!"); - var bufVal = cbuf.join(""), bufValOrigin = cbuf.join(); - if (isNegative && (bufVal = bufVal.replace(new RegExp("^" + Inputmask.escapeRegex(opts.negationSymbol.front)), ""), - bufVal = bufVal.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), "")), - bufVal = bufVal.replace(new RegExp(Inputmask.escapeRegex(opts.suffix) + "$"), ""), - bufVal = bufVal.replace(new RegExp("^" + Inputmask.escapeRegex(opts.prefix)), ""), - bufVal.length > 0 && opts.autoGroup || bufVal.indexOf(opts.groupSeparator) !== -1) { - var escapedGroupSeparator = Inputmask.escapeRegex(opts.groupSeparator); - bufVal = bufVal.replace(new RegExp(escapedGroupSeparator, "g"), ""); - var radixSplit = bufVal.split(charAtPos === opts.radixPoint ? "!" : opts.radixPoint); - if (bufVal = "" === opts.radixPoint ? bufVal : radixSplit[0], charAtPos !== opts.negationSymbol.front && (bufVal = bufVal.replace("!", "?")), - bufVal.length > opts.groupSize) for (var reg = new RegExp("([-+]?[\\d?]+)([\\d?]{" + opts.groupSize + "})"); reg.test(bufVal) && "" !== opts.groupSeparator; ) bufVal = bufVal.replace(reg, "$1" + opts.groupSeparator + "$2"), - bufVal = bufVal.replace(opts.groupSeparator + opts.groupSeparator, opts.groupSeparator); - bufVal = bufVal.replace("?", "!"), "" !== opts.radixPoint && radixSplit.length > 1 && (bufVal += (charAtPos === opts.radixPoint ? "!" : opts.radixPoint) + radixSplit[1]); - } - bufVal = opts.prefix + bufVal + opts.suffix, isNegative && (bufVal = opts.negationSymbol.front + bufVal + opts.negationSymbol.back); - var needsRefresh = bufValOrigin !== bufVal.split("").join(), newPos = $.inArray("!", bufVal); - if (newPos === -1 && (newPos = pos), needsRefresh) { - for (buffer.length = bufVal.length, i = 0, l = bufVal.length; i < l; i++) buffer[i] = bufVal.charAt(i); - buffer[newPos] = charAtPos; - } - return newPos = opts.numericInput && isFinite(pos) ? buffer.join("").length - newPos - 1 : newPos, - opts.numericInput && (buffer = buffer.reverse(), $.inArray(opts.radixPoint, buffer) < newPos && buffer.join("").length - opts.suffix.length !== newPos && (newPos -= 1)), - { - pos: newPos, - refreshFromBuffer: needsRefresh, - buffer: buffer, - isNegative: isNegative - }; - }, - onBeforeWrite: function(e, buffer, caretPos, opts) { - var rslt; - if (e && ("blur" === e.type || "checkval" === e.type || "keydown" === e.type)) { - var maskedValue = opts.numericInput ? buffer.slice().reverse().join("") : buffer.join(""), processValue = maskedValue.replace(opts.prefix, ""); - processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), - "," === opts.radixPoint && (processValue = processValue.replace(opts.radixPoint, ".")); - var isNegative = processValue.match(new RegExp("[-" + Inputmask.escapeRegex(opts.negationSymbol.front) + "]", "g")); - if (isNegative = null !== isNegative && 1 === isNegative.length, processValue = processValue.replace(new RegExp("[-" + Inputmask.escapeRegex(opts.negationSymbol.front) + "]", "g"), ""), - processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), ""), - isNaN(opts.placeholder) && (processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.placeholder), "g"), "")), - processValue = processValue === opts.negationSymbol.front ? processValue + "0" : processValue, - "" !== processValue && isFinite(processValue)) { - var floatValue = parseFloat(processValue), signedFloatValue = isNegative ? floatValue * -1 : floatValue; - if ("blur" === e.type && (null !== opts.min && isFinite(opts.min) && signedFloatValue < parseFloat(opts.min) ? (floatValue = Math.abs(opts.min), - isNegative = opts.min < 0, maskedValue = void 0) : null !== opts.max && isFinite(opts.max) && signedFloatValue > parseFloat(opts.max) && (floatValue = Math.abs(opts.max), - isNegative = opts.max < 0, maskedValue = void 0)), processValue = floatValue.toString().replace(".", opts.radixPoint).split(""), - isFinite(opts.digits)) { - var radixPosition = $.inArray(opts.radixPoint, processValue), rpb = $.inArray(opts.radixPoint, maskedValue); - radixPosition === -1 && (processValue.push(opts.radixPoint), radixPosition = processValue.length - 1); - for (var i = 1; i <= opts.digits; i++) opts.digitsOptional || void 0 !== processValue[radixPosition + i] && processValue[radixPosition + i] !== opts.placeholder.charAt(0) ? rpb !== -1 && void 0 !== maskedValue[rpb + i] && (processValue[radixPosition + i] = processValue[radixPosition + i] || maskedValue[rpb + i]) : processValue[radixPosition + i] = "0"; - processValue[processValue.length - 1] === opts.radixPoint && delete processValue[processValue.length - 1]; - } - if (floatValue.toString() !== processValue && floatValue.toString() + "." !== processValue || isNegative) return processValue = (opts.prefix + processValue.join("")).split(""), - !isNegative || 0 === floatValue && "blur" === e.type || (processValue.unshift(opts.negationSymbol.front), - processValue.push(opts.negationSymbol.back)), opts.numericInput && (processValue = processValue.reverse()), - rslt = opts.postFormat(processValue, opts.numericInput ? caretPos : caretPos - 1, opts), - rslt.buffer && (rslt.refreshFromBuffer = rslt.buffer.join("") !== buffer.join("")), - rslt; - } - } - if (opts.autoGroup) return rslt = opts.postFormat(buffer, opts.numericInput ? caretPos : caretPos - 1, opts), - rslt.caret = caretPos < (rslt.isNegative ? opts.negationSymbol.front.length : 0) + opts.prefix.length || caretPos > rslt.buffer.length - (rslt.isNegative ? opts.negationSymbol.back.length : 0) ? rslt.pos : rslt.pos + 1, - rslt; - }, - regex: { - integerPart: function(opts) { - return new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "+]?\\d+"); - }, - integerNPart: function(opts) { - return new RegExp("[\\d" + Inputmask.escapeRegex(opts.groupSeparator) + Inputmask.escapeRegex(opts.placeholder.charAt(0)) + "]+"); - } - }, - signHandler: function(chrs, maskset, pos, strict, opts) { - if (!strict && opts.allowMinus && "-" === chrs || opts.allowPlus && "+" === chrs) { - var matchRslt = maskset.buffer.join("").match(opts.regex.integerPart(opts)); - if (matchRslt && matchRslt[0].length > 0) return maskset.buffer[matchRslt.index] === ("-" === chrs ? "+" : opts.negationSymbol.front) ? "-" === chrs ? "" !== opts.negationSymbol.back ? { - pos: 0, - c: opts.negationSymbol.front, - remove: 0, - caret: pos, - insert: { - pos: maskset.buffer.length - 1, - c: opts.negationSymbol.back - } - } : { - pos: 0, - c: opts.negationSymbol.front, - remove: 0, - caret: pos - } : "" !== opts.negationSymbol.back ? { - pos: 0, - c: "+", - remove: [ 0, maskset.buffer.length - 1 ], - caret: pos - } : { - pos: 0, - c: "+", - remove: 0, - caret: pos - } : maskset.buffer[0] === ("-" === chrs ? opts.negationSymbol.front : "+") ? "-" === chrs && "" !== opts.negationSymbol.back ? { - remove: [ 0, maskset.buffer.length - 1 ], - caret: pos - 1 - } : { - remove: 0, - caret: pos - 1 - } : "-" === chrs ? "" !== opts.negationSymbol.back ? { - pos: 0, - c: opts.negationSymbol.front, - caret: pos + 1, - insert: { - pos: maskset.buffer.length, - c: opts.negationSymbol.back - } - } : { - pos: 0, - c: opts.negationSymbol.front, - caret: pos + 1 - } : { - pos: 0, - c: chrs, - caret: pos + 1 - }; - } - return !1; - }, - radixHandler: function(chrs, maskset, pos, strict, opts) { - if (!strict && opts.numericInput !== !0 && chrs === opts.radixPoint && void 0 !== opts.digits && (isNaN(opts.digits) || parseInt(opts.digits) > 0)) { - var radixPos = $.inArray(opts.radixPoint, maskset.buffer), integerValue = maskset.buffer.join("").match(opts.regex.integerPart(opts)); - if (radixPos !== -1 && maskset.validPositions[radixPos]) return maskset.validPositions[radixPos - 1] ? { - caret: radixPos + 1 - } : { - pos: integerValue.index, - c: integerValue[0], - caret: radixPos + 1 - }; - if (!integerValue || "0" === integerValue[0] && integerValue.index + 1 !== pos) return maskset.buffer[integerValue ? integerValue.index : pos] = "0", - { - pos: (integerValue ? integerValue.index : pos) + 1, - c: opts.radixPoint - }; - } - return !1; - }, - leadingZeroHandler: function(chrs, maskset, pos, strict, opts, isSelection) { - if (!strict) { - var initialPos = pos, buffer = opts.numericInput === !0 ? maskset.buffer.slice("").reverse() : maskset.buffer.slice(""); - opts.numericInput && (pos = buffer.join("").length - pos - 1), buffer.splice(0, opts.prefix.length), - buffer.splice(buffer.length - opts.suffix.length, opts.suffix.length), pos -= opts.prefix.length; - var radixPosition = $.inArray(opts.radixPoint, buffer), matchRslt = buffer.slice(0, radixPosition !== -1 ? radixPosition : void 0).join("").match(opts.regex.integerNPart(opts)); - if (matchRslt && (radixPosition === -1 || pos <= radixPosition || opts.numericInput)) { - var decimalPart = radixPosition === -1 ? 0 : parseInt(buffer.slice(radixPosition + 1).join("")), leadingZero = 0 === matchRslt[0].indexOf("" !== opts.placeholder ? opts.placeholder.charAt(0) : "0"); - if (opts.numericInput) { - if (leadingZero && 0 !== decimalPart && isSelection !== !0) return maskset.buffer.splice(buffer.length - matchRslt.index - 1 + opts.suffix.length, 1), - { - pos: initialPos, - remove: buffer.length - matchRslt.index - 1 + opts.suffix.length - }; - } else { - if (leadingZero && (matchRslt.index + 1 === pos || isSelection !== !0 && 0 === decimalPart)) return maskset.buffer.splice(matchRslt.index + opts.prefix.length, 1), - { - pos: matchRslt.index + opts.prefix.length, - remove: matchRslt.index + opts.prefix.length - }; - if ("0" === chrs && pos <= matchRslt.index && matchRslt[0] !== opts.groupSeparator) return !1; - } - } - } - return !0; - }, - definitions: { - "~": { - validator: function(chrs, maskset, pos, strict, opts, isSelection) { - var isValid = opts.signHandler(chrs, maskset, pos, strict, opts); - if (!isValid && (isValid = opts.radixHandler(chrs, maskset, pos, strict, opts), - !isValid && (isValid = strict ? new RegExp("[0-9" + Inputmask.escapeRegex(opts.groupSeparator) + "]").test(chrs) : new RegExp("[0-9]").test(chrs), - isValid === !0 && (isValid = opts.leadingZeroHandler(chrs, maskset, pos, strict, opts, isSelection), - isValid === !0 && opts.numericInput !== !0)))) { - var radixPosition = $.inArray(opts.radixPoint, maskset.buffer); - isValid = radixPosition !== -1 && (opts.digitsOptional === !1 || maskset.validPositions[pos]) && opts.numericInput !== !0 && pos > radixPosition && !strict ? { - pos: pos, - remove: pos - } : { - pos: pos - }; - } - return isValid; - }, - cardinality: 1 - }, - "+": { - validator: function(chrs, maskset, pos, strict, opts) { - var isValid = opts.signHandler(chrs, maskset, pos, strict, opts); - return !isValid && (strict && opts.allowMinus && chrs === opts.negationSymbol.front || opts.allowMinus && "-" === chrs || opts.allowPlus && "+" === chrs) && (isValid = !(!strict && "-" === chrs) || ("" !== opts.negationSymbol.back ? { - pos: pos, - c: "-" === chrs ? opts.negationSymbol.front : "+", - caret: pos + 1, - insert: { - pos: maskset.buffer.length, - c: opts.negationSymbol.back - } - } : { - pos: pos, - c: "-" === chrs ? opts.negationSymbol.front : "+", - caret: pos + 1 - })), isValid; - }, - cardinality: 1, - placeholder: "" - }, - "-": { - validator: function(chrs, maskset, pos, strict, opts) { - var isValid = opts.signHandler(chrs, maskset, pos, strict, opts); - return !isValid && strict && opts.allowMinus && chrs === opts.negationSymbol.back && (isValid = !0), - isValid; - }, - cardinality: 1, - placeholder: "" - }, - ":": { - validator: function(chrs, maskset, pos, strict, opts) { - var isValid = opts.signHandler(chrs, maskset, pos, strict, opts); - if (!isValid) { - var radix = "[" + Inputmask.escapeRegex(opts.radixPoint) + "]"; - isValid = new RegExp(radix).test(chrs), isValid && maskset.validPositions[pos] && maskset.validPositions[pos].match.placeholder === opts.radixPoint && (isValid = { - caret: pos + 1 - }); - } - return isValid; - }, - cardinality: 1, - placeholder: function(opts) { - return opts.radixPoint; - } - } - }, - onUnMask: function(maskedValue, unmaskedValue, opts) { - if ("" === unmaskedValue && opts.nullable === !0) return unmaskedValue; - var processValue = maskedValue.replace(opts.prefix, ""); - return processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), - opts.unmaskAsNumber ? ("" !== opts.radixPoint && processValue.indexOf(opts.radixPoint) !== -1 && (processValue = processValue.replace(Inputmask.escapeRegex.call(this, opts.radixPoint), ".")), - Number(processValue)) : processValue; - }, - isComplete: function(buffer, opts) { - var maskedValue = buffer.join(""), bufClone = buffer.slice(); - if (opts.postFormat(bufClone, 0, opts), bufClone.join("") !== maskedValue) return !1; - var processValue = maskedValue.replace(opts.prefix, ""); - return processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), - "," === opts.radixPoint && (processValue = processValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".")), - isFinite(processValue); - }, - onBeforeMask: function(initialValue, opts) { - if (initialValue = initialValue.toString(), opts.numericInput === !0 && (initialValue = initialValue.split("").reverse().join("")), - "" !== opts.radixPoint && isFinite(initialValue)) { - var vs = initialValue.split("."), groupSize = "" !== opts.groupSeparator ? parseInt(opts.groupSize) : 0; - 2 === vs.length && (vs[0].length > groupSize || vs[1].length > groupSize) && (initialValue = initialValue.replace(".", opts.radixPoint)); - } - var kommaMatches = initialValue.match(/,/g), dotMatches = initialValue.match(/\./g); - if (dotMatches && kommaMatches ? dotMatches.length > kommaMatches.length ? (initialValue = initialValue.replace(/\./g, ""), - initialValue = initialValue.replace(",", opts.radixPoint)) : kommaMatches.length > dotMatches.length ? (initialValue = initialValue.replace(/,/g, ""), - initialValue = initialValue.replace(".", opts.radixPoint)) : initialValue = initialValue.indexOf(".") < initialValue.indexOf(",") ? initialValue.replace(/\./g, "") : initialValue = initialValue.replace(/,/g, "") : initialValue = initialValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), - 0 === opts.digits && (initialValue.indexOf(".") !== -1 ? initialValue = initialValue.substring(0, initialValue.indexOf(".")) : initialValue.indexOf(",") !== -1 && (initialValue = initialValue.substring(0, initialValue.indexOf(",")))), - "" !== opts.radixPoint && isFinite(opts.digits) && initialValue.indexOf(opts.radixPoint) !== -1) { - var valueParts = initialValue.split(opts.radixPoint), decPart = valueParts[1].match(new RegExp("\\d*"))[0]; - if (parseInt(opts.digits) < decPart.toString().length) { - var digitsFactor = Math.pow(10, parseInt(opts.digits)); - initialValue = initialValue.replace(Inputmask.escapeRegex(opts.radixPoint), "."), - initialValue = Math.round(parseFloat(initialValue) * digitsFactor) / digitsFactor, - initialValue = initialValue.toString().replace(".", opts.radixPoint); - } - } - return opts.numericInput === !0 && (initialValue = initialValue.split("").reverse().join("")), - initialValue; - }, - canClearPosition: function(maskset, position, lvp, strict, opts) { - var positionInput = maskset.validPositions[position].input, canClear = positionInput !== opts.radixPoint || null !== maskset.validPositions[position].match.fn && opts.decimalProtect === !1 || isFinite(positionInput) || position === lvp || positionInput === opts.groupSeparator || positionInput === opts.negationSymbol.front || positionInput === opts.negationSymbol.back; - return canClear; - }, - onKeyDown: function(e, buffer, caretPos, opts) { - var $input = $(this); - if (e.ctrlKey) switch (e.keyCode) { - case Inputmask.keyCode.UP: - $input.val(parseFloat(this.inputmask.unmaskedvalue()) + parseInt(opts.step)), $input.trigger("setvalue"); - break; - - case Inputmask.keyCode.DOWN: - $input.val(parseFloat(this.inputmask.unmaskedvalue()) - parseInt(opts.step)), $input.trigger("setvalue"); - } - } - }, - currency: { - prefix: "$ ", - groupSeparator: ",", - alias: "numeric", - placeholder: "0", - autoGroup: !0, - digits: 2, - digitsOptional: !1, - clearMaskOnLostFocus: !1 - }, - decimal: { - alias: "numeric" - }, - integer: { - alias: "numeric", - digits: 0, - radixPoint: "" - }, - percentage: { - alias: "numeric", - digits: 2, - radixPoint: ".", - placeholder: "0", - autoGroup: !1, - min: 0, - max: 100, - suffix: " %", - allowPlus: !1, - allowMinus: !1 - } - }), Inputmask; -}(jQuery, Inputmask), function($, Inputmask) { - function maskSort(a, b) { - var maska = (a.mask || a).replace(/#/g, "9").replace(/\)/, "9").replace(/[+()#-]/g, ""), maskb = (b.mask || b).replace(/#/g, "9").replace(/\)/, "9").replace(/[+()#-]/g, ""), maskas = (a.mask || a).split("#")[0], maskbs = (b.mask || b).split("#")[0]; - return 0 === maskbs.indexOf(maskas) ? -1 : 0 === maskas.indexOf(maskbs) ? 1 : maska.localeCompare(maskb); - } - var analyseMaskBase = Inputmask.prototype.analyseMask; - return Inputmask.prototype.analyseMask = function(mask, opts) { - function reduceVariations(masks, previousVariation, previousmaskGroup) { - previousVariation = previousVariation || "", previousmaskGroup = previousmaskGroup || maskGroups, - "" !== previousVariation && (previousmaskGroup[previousVariation] = {}); - for (var variation = "", maskGroup = previousmaskGroup[previousVariation] || previousmaskGroup, i = masks.length - 1; i >= 0; i--) mask = masks[i].mask || masks[i], - variation = mask.substr(0, 1), maskGroup[variation] = maskGroup[variation] || [], - maskGroup[variation].unshift(mask.substr(1)), masks.splice(i, 1); - for (var ndx in maskGroup) maskGroup[ndx].length > 500 && reduceVariations(maskGroup[ndx].slice(), ndx, maskGroup); - } - function rebuild(maskGroup) { - var mask = "", submasks = []; - for (var ndx in maskGroup) $.isArray(maskGroup[ndx]) ? 1 === maskGroup[ndx].length ? submasks.push(ndx + maskGroup[ndx]) : submasks.push(ndx + opts.groupmarker.start + maskGroup[ndx].join(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start) + opts.groupmarker.end) : submasks.push(ndx + rebuild(maskGroup[ndx])); - return mask += 1 === submasks.length ? submasks[0] : opts.groupmarker.start + submasks.join(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start) + opts.groupmarker.end; - } - var maskGroups = {}; - opts.phoneCodes && (opts.phoneCodes && opts.phoneCodes.length > 1e3 && (mask = mask.substr(1, mask.length - 2), - reduceVariations(mask.split(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start)), - mask = rebuild(maskGroups)), mask = mask.replace(/9/g, "\\9")); - var mt = analyseMaskBase.call(this, mask, opts); - return mt; - }, Inputmask.extendAliases({ - abstractphone: { - groupmarker: { - start: "<", - end: ">" - }, - countrycode: "", - phoneCodes: [], - mask: function(opts) { - return opts.definitions = { - "#": Inputmask.prototype.definitions[9] - }, opts.phoneCodes.sort(maskSort); - }, - keepStatic: !0, - onBeforeMask: function(value, opts) { - var processedValue = value.replace(/^0{1,2}/, "").replace(/[\s]/g, ""); - return (processedValue.indexOf(opts.countrycode) > 1 || processedValue.indexOf(opts.countrycode) === -1) && (processedValue = "+" + opts.countrycode + processedValue), - processedValue; - }, - onUnMask: function(maskedValue, unmaskedValue, opts) { - return unmaskedValue; - }, - inputmode: "tel" - } - }), Inputmask; -}(jQuery, Inputmask), function($, Inputmask) { - return Inputmask.extendAliases({ - Regex: { - mask: "r", - greedy: !1, - repeat: "*", - regex: null, - regexTokens: null, - tokenizer: /\[\^?]?(?:[^\\\]]+|\\[\S\s]?)*]?|\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9][0-9]*|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\S\s]?)|\((?:\?[:=!]?)?|(?:[?*+]|\{[0-9]+(?:,[0-9]*)?\})\??|[^.?*+^${[()|\\]+|./g, - quantifierFilter: /[0-9]+[^,]/, - isComplete: function(buffer, opts) { - return new RegExp(opts.regex, opts.casing ? "i" : "").test(buffer.join("")); - }, - definitions: { - r: { - validator: function(chrs, maskset, pos, strict, opts) { - function RegexToken(isGroup, isQuantifier) { - this.matches = [], this.isGroup = isGroup || !1, this.isQuantifier = isQuantifier || !1, - this.quantifier = { - min: 1, - max: 1 - }, this.repeaterPart = void 0; - } - function analyseRegex() { - var match, m, currentToken = new RegexToken(), opengroups = []; - for (opts.regexTokens = []; match = opts.tokenizer.exec(opts.regex); ) switch (m = match[0], - m.charAt(0)) { - case "(": - opengroups.push(new RegexToken((!0))); - break; - - case ")": - groupToken = opengroups.pop(), opengroups.length > 0 ? opengroups[opengroups.length - 1].matches.push(groupToken) : currentToken.matches.push(groupToken); - break; - - case "{": - case "+": - case "*": - var quantifierToken = new RegexToken((!1), (!0)); - m = m.replace(/[{}]/g, ""); - var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]); - if (quantifierToken.quantifier = { - min: mq0, - max: mq1 - }, opengroups.length > 0) { - var matches = opengroups[opengroups.length - 1].matches; - match = matches.pop(), match.isGroup || (groupToken = new RegexToken((!0)), groupToken.matches.push(match), - match = groupToken), matches.push(match), matches.push(quantifierToken); - } else match = currentToken.matches.pop(), match.isGroup || (groupToken = new RegexToken((!0)), - groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), - currentToken.matches.push(quantifierToken); - break; - - default: - opengroups.length > 0 ? opengroups[opengroups.length - 1].matches.push(m) : currentToken.matches.push(m); - } - currentToken.matches.length > 0 && opts.regexTokens.push(currentToken); - } - function validateRegexToken(token, fromGroup) { - var isvalid = !1; - fromGroup && (regexPart += "(", openGroupCount++); - for (var mndx = 0; mndx < token.matches.length; mndx++) { - var matchToken = token.matches[mndx]; - if (matchToken.isGroup === !0) isvalid = validateRegexToken(matchToken, !0); else if (matchToken.isQuantifier === !0) { - var crrntndx = $.inArray(matchToken, token.matches), matchGroup = token.matches[crrntndx - 1], regexPartBak = regexPart; - if (isNaN(matchToken.quantifier.max)) { - for (;matchToken.repeaterPart && matchToken.repeaterPart !== regexPart && matchToken.repeaterPart.length > regexPart.length && !(isvalid = validateRegexToken(matchGroup, !0)); ) ; - isvalid = isvalid || validateRegexToken(matchGroup, !0), isvalid && (matchToken.repeaterPart = regexPart), - regexPart = regexPartBak + matchToken.quantifier.max; - } else { - for (var i = 0, qm = matchToken.quantifier.max - 1; i < qm && !(isvalid = validateRegexToken(matchGroup, !0)); i++) ; - regexPart = regexPartBak + "{" + matchToken.quantifier.min + "," + matchToken.quantifier.max + "}"; - } - } else if (void 0 !== matchToken.matches) for (var k = 0; k < matchToken.length && !(isvalid = validateRegexToken(matchToken[k], fromGroup)); k++) ; else { - var testExp; - if ("[" == matchToken.charAt(0)) { - testExp = regexPart, testExp += matchToken; - for (var j = 0; j < openGroupCount; j++) testExp += ")"; - var exp = new RegExp("^(" + testExp + ")$", opts.casing ? "i" : ""); - isvalid = exp.test(bufferStr); - } else for (var l = 0, tl = matchToken.length; l < tl; l++) if ("\\" !== matchToken.charAt(l)) { - testExp = regexPart, testExp += matchToken.substr(0, l + 1), testExp = testExp.replace(/\|$/, ""); - for (var j = 0; j < openGroupCount; j++) testExp += ")"; - var exp = new RegExp("^(" + testExp + ")$", opts.casing ? "i" : ""); - if (isvalid = exp.test(bufferStr)) break; - } - regexPart += matchToken; - } - if (isvalid) break; - } - return fromGroup && (regexPart += ")", openGroupCount--), isvalid; - } - var bufferStr, groupToken, cbuffer = maskset.buffer.slice(), regexPart = "", isValid = !1, openGroupCount = 0; - null === opts.regexTokens && analyseRegex(), cbuffer.splice(pos, 0, chrs), bufferStr = cbuffer.join(""); - for (var i = 0; i < opts.regexTokens.length; i++) { - var regexToken = opts.regexTokens[i]; - if (isValid = validateRegexToken(regexToken, regexToken.isGroup)) break; - } - return isValid; - }, - cardinality: 1 - } - } - } - }), Inputmask; -}(jQuery, Inputmask); \ No newline at end of file diff --git a/app_widget_extra/static/src/js/inputmask_widget.js b/app_widget_extra/static/src/js/inputmask_widget.js deleted file mode 100644 index 36d4ee49..00000000 --- a/app_widget_extra/static/src/js/inputmask_widget.js +++ /dev/null @@ -1,119 +0,0 @@ -odoo.define('web.inputmask_widget', function (require) { - "use strict"; - var core = require('web.core'); - var formats = require('web.formats'); - var form_widgets = require('web.form_widgets'); - var kanban_widgets = require('web_kanban.widgets'); - var utils = require('web.utils'); - var list_widget_registry = core.list_widget_registry; - var QWeb = core.qweb; - - function mask_attrs(attrs) { - var keyMask = 'data-inputmask'; - var attributes = {}; - if (keyMask in attrs) - attributes[keyMask] = attrs[keyMask]; - else - attributes = Object.keys(attrs).reduce(function (filtered, key) { - if (key.indexOf(keyMask) !== -1) - filtered[key] = attrs[key]; - return filtered; - }, {}); - if (!attributes) - console.warn("The widget Mask expects the 'data-inputmask[-attribute]' attributes!") - return attributes; - } - - var FieldMask = form_widgets.FieldChar.extend({ - template: "FieldMask", - attributes: {}, - init: function (field_manager, node) { - this._super(field_manager, node) - this.attributes = mask_attrs(node.attrs); - }, - render_value: function (mask) { - this._super(); - if (this.attributes) { - if (this.$input !== undefined) - this.$input.inputmask(mask); - else if ('contenteditable' in this.node.attrs) - this.$el.inputmask(mask); - } - }, - //在前端验证输入值是否符合inputmask - is_valid: function () { - var musk = this.attributes['data-inputmask-regex'] ? this.attributes['data-inputmask-regex'] : this.attributes['data-inputmask'] ; - var reg = new RegExp (musk,"g"); - //当状态变化成只读时,则默认全部通过 - try { - var value = this.$input.val(); - } catch(err) { - return true; - } - - if (!this.get('required') && this.is_false()) { - return true; - } else if (reg.test(value)) { - return true; - } else { - return false; - } - }, - }); - - var FieldMaskRegex = FieldMask.extend({ - render_value: function () { - this._super("Regex"); - } - }); - - var ColumnMask = list_widget_registry.get('field.char').extend({ - attributes: {}, - $mask: undefined, - init: function (id, tag, attrs) { - this._super(id, tag, attrs); - this.attributes = mask_attrs(attrs); - if (this.attributes) - this.$mask = $(jQuery.parseHTML(QWeb.render('Widget.mask', {widget: this}))).inputmask(undefined, { - placeholder: '', - greedy: false - }); - }, - format: function (row_data, options) { - var value = this._super(row_data, options); - if (this.$mask) { - this.$mask.val(value); - value = this.$mask.val(); - } - return value; - } - }); - - var MaskWidget = kanban_widgets.AbstractField.extend({ - tagName: 'span', - attributes: {}, - init: function (parent, field, $node) { - this._super(parent, field, $node); - this.attributes = mask_attrs(field.__attrs); - if (this.attributes) - this.$mask = $(jQuery.parseHTML(QWeb.render('Widget.mask', {widget: this}))).inputmask(undefined, { - placeholder: '', - greedy: false - }); - }, - renderElement: function () { - var value = this.field.raw_value; - if (this.$mask) - this.$mask.val(value); - value = this.$mask.val(); - this.$el.text(value); - } - }); - - core.form_widget_registry.add('mask', FieldMask); - core.form_widget_registry.add('mask_regex', FieldMaskRegex); - list_widget_registry.add('field.mask', ColumnMask); - kanban_widgets.registry.add("mask", MaskWidget); - - return {FieldMask: FieldMask, FieldMaskRegex: FieldMaskRegex, MaskWidget: MaskWidget}; -}); diff --git a/app_widget_extra/static/src/xml/inputmask_widget.xml b/app_widget_extra/static/src/xml/inputmask_widget.xml deleted file mode 100644 index aeb0d6c8..00000000 --- a/app_widget_extra/static/src/xml/inputmask_widget.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app_widget_extra/views/inputmask_templates.xml b/app_widget_extra/views/inputmask_templates.xml deleted file mode 100644 index b2a0aca9..00000000 --- a/app_widget_extra/views/inputmask_templates.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - -